show benchmark table -ok
authorSam Mirazi <sasan345@gmail.com>
Sun, 1 Jun 2025 18:36:09 +0000 (11:36 -0700)
committerSam Mirazi <sasan345@gmail.com>
Sun, 1 Jun 2025 18:36:09 +0000 (11:36 -0700)
1012 files changed:
.venv/Lib/site-packages/markdown_it/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/_compat.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/_punycode.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/main.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/parser_block.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/parser_core.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/parser_inline.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/renderer.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/ruler.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/token.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/tree.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/__pycache__/utils.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/_compat.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/_punycode.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/cli/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/cli/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/cli/__pycache__/parse.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/cli/parse.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/__pycache__/entities.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/__pycache__/html_blocks.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/__pycache__/html_re.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/__pycache__/normalize_url.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/__pycache__/utils.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/entities.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/html_blocks.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/html_re.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/normalize_url.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/common/utils.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/helpers/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/helpers/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_destination.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_label.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_title.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/helpers/parse_link_destination.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/helpers/parse_link_label.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/helpers/parse_link_title.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/main.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/parser_block.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/parser_core.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/parser_inline.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/port.yaml [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/presets/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/presets/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/presets/__pycache__/commonmark.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/presets/__pycache__/default.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/presets/__pycache__/zero.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/presets/commonmark.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/presets/default.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/presets/zero.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/py.typed [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/renderer.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/ruler.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/blockquote.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/code.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/fence.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/heading.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/hr.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/html_block.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/lheading.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/list.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/paragraph.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/reference.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/state_block.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/table.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/blockquote.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/code.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/fence.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/heading.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/hr.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/html_block.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/lheading.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/list.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/paragraph.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/reference.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/state_block.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_block/table.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/block.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/inline.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/linkify.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/normalize.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/replacements.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/smartquotes.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/state_core.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/text_join.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/block.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/inline.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/linkify.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/normalize.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/replacements.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/smartquotes.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/state_core.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_core/text_join.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/autolink.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/backticks.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/balance_pairs.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/emphasis.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/entity.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/escape.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/fragments_join.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/html_inline.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/image.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/link.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/linkify.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/newline.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/state_inline.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/strikethrough.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/text.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/autolink.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/backticks.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/balance_pairs.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/emphasis.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/entity.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/escape.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/fragments_join.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/html_inline.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/image.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/link.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/linkify.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/newline.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/state_inline.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/strikethrough.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/rules_inline/text.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/token.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/tree.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it/utils.py [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/INSTALLER [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE.markdown-it [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/METADATA [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/RECORD [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/WHEEL [new file with mode: 0644]
.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/entry_points.txt [new file with mode: 0644]
.venv/Lib/site-packages/mdurl-0.1.2.dist-info/INSTALLER [new file with mode: 0644]
.venv/Lib/site-packages/mdurl-0.1.2.dist-info/LICENSE [new file with mode: 0644]
.venv/Lib/site-packages/mdurl-0.1.2.dist-info/METADATA [new file with mode: 0644]
.venv/Lib/site-packages/mdurl-0.1.2.dist-info/RECORD [new file with mode: 0644]
.venv/Lib/site-packages/mdurl-0.1.2.dist-info/WHEEL [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/__pycache__/_decode.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/__pycache__/_encode.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/__pycache__/_format.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/__pycache__/_parse.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/__pycache__/_url.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/_decode.py [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/_encode.py [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/_format.py [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/_parse.py [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/_url.py [new file with mode: 0644]
.venv/Lib/site-packages/mdurl/py.typed [new file with mode: 0644]
.venv/Lib/site-packages/pygments-2.19.1.dist-info/INSTALLER [new file with mode: 0644]
.venv/Lib/site-packages/pygments-2.19.1.dist-info/METADATA [new file with mode: 0644]
.venv/Lib/site-packages/pygments-2.19.1.dist-info/RECORD [new file with mode: 0644]
.venv/Lib/site-packages/pygments-2.19.1.dist-info/WHEEL [new file with mode: 0644]
.venv/Lib/site-packages/pygments-2.19.1.dist-info/entry_points.txt [new file with mode: 0644]
.venv/Lib/site-packages/pygments-2.19.1.dist-info/licenses/AUTHORS [new file with mode: 0644]
.venv/Lib/site-packages/pygments-2.19.1.dist-info/licenses/LICENSE [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__main__.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/__main__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/cmdline.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/console.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/filter.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/formatter.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/lexer.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/modeline.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/plugin.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/regexopt.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/scanner.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/sphinxext.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/style.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/token.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/unistring.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/__pycache__/util.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/cmdline.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/console.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/filter.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/filters/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatter.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/_mapping.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/bbcode.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/groff.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/img.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/irc.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/latex.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/other.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/rtf.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/svg.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/terminal.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/__pycache__/terminal256.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/_mapping.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/bbcode.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/groff.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/html.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/img.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/irc.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/latex.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/other.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/pangomarkup.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/rtf.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/svg.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/terminal.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/formatters/terminal256.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexer.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_ada_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_asy_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_cl_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_cocoa_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_csound_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_googlesql_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_julia_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_lasso_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_lilypond_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_luau_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_mql_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_mysql_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_openedge_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_php_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_postgres_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_qlik_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_scheme_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_scilab_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_sourcemod_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_stan_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_stata_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_tsql_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_usd_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_vbscript_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/_vim_builtins.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/actionscript.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ada.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/agile.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/algebra.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ambient.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/amdgpu.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ampl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/apdlexer.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/apl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/archetype.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/arrow.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/arturo.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/asc.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/asm.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/asn1.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/automation.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/bare.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/basic.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/bdd.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/berry.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/bibtex.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/blueprint.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/boa.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/bqn.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/business.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/c_cpp.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/c_like.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/capnproto.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/carbon.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/cddl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/chapel.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/clean.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/codeql.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/comal.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/compiled.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/configs.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/console.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/cplint.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/crystal.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/csound.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/css.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/d.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/dalvik.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/data.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/dax.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/devicetree.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/diff.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/dns.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/dotnet.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/dsls.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/dylan.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ecl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/eiffel.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/elm.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/elpi.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/email.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/erlang.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/esoteric.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ezhil.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/factor.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/fantom.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/felix.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/fift.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/floscript.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/forth.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/fortran.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/foxpro.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/freefem.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/func.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/functional.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/futhark.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/gcodelexer.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/gdscript.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/gleam.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/go.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/grammar_notation.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/graph.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/graphics.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/graphql.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/graphviz.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/gsql.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/hare.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/haskell.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/haxe.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/hdl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/hexdump.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/html.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/idl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/igor.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/inferno.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/installers.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/int_fiction.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/iolang.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/j.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/javascript.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/jmespath.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/jslt.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/json5.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/jsonnet.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/jsx.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/julia.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/jvm.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/kuin.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/kusto.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ldap.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/lean.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/lilypond.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/lisp.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/macaulay2.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/make.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/maple.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/markup.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/math.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/matlab.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/maxima.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/meson.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/mime.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/minecraft.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/mips.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ml.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/modeling.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/modula2.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/mojo.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/monte.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/mosel.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ncl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/nimrod.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/nit.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/nix.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/numbair.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/oberon.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/objective.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ooc.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/openscad.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/other.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/parasail.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/parsers.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/pascal.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/pawn.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/pddl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/perl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/phix.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/php.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/pointless.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/pony.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/praat.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/procfile.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/prolog.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/promql.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/prql.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ptx.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/python.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/q.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/qlik.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/qvt.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/r.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/rdf.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/rebol.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/rego.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/resource.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ride.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/rita.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/rnc.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/roboconf.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/robotframework.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ruby.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/rust.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/sas.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/savi.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/scdoc.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/scripting.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/sgf.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/shell.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/sieve.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/slash.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/smalltalk.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/smithy.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/smv.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/snobol.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/solidity.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/soong.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/sophia.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/special.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/spice.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/sql.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/srcinfo.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/stata.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/supercollider.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/tablegen.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/tact.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/tal.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/tcl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/teal.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/templates.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/teraterm.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/testing.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/text.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/textedit.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/textfmts.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/theorem.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/thingsdb.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/tlb.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/tls.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/tnt.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/trafficscript.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/typoscript.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/typst.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/ul4.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/unicon.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/urbi.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/usd.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/varnish.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/verification.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/verifpal.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/vip.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/vyper.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/web.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/webassembly.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/webidl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/webmisc.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/wgsl.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/whiley.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/wowtoc.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/wren.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/x10.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/xorg.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/yang.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/yara.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/__pycache__/zig.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_ada_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_asy_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_cl_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_cocoa_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_csound_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_css_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_googlesql_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_julia_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_lasso_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_lilypond_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_lua_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_luau_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_mapping.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_mql_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_mysql_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_openedge_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_php_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_postgres_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_qlik_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_scheme_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_scilab_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_sourcemod_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_stan_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_stata_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_tsql_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_usd_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_vbscript_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/_vim_builtins.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/actionscript.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ada.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/agile.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/algebra.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ambient.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/amdgpu.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ampl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/apdlexer.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/apl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/archetype.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/arrow.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/arturo.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/asc.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/asm.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/asn1.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/automation.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/bare.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/basic.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/bdd.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/berry.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/bibtex.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/blueprint.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/boa.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/bqn.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/business.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/c_cpp.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/c_like.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/capnproto.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/carbon.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/cddl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/chapel.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/clean.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/codeql.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/comal.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/compiled.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/configs.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/console.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/cplint.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/crystal.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/csound.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/css.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/d.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/dalvik.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/data.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/dax.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/devicetree.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/diff.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/dns.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/dotnet.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/dsls.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/dylan.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ecl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/eiffel.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/elm.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/elpi.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/email.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/erlang.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/esoteric.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ezhil.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/factor.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/fantom.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/felix.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/fift.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/floscript.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/forth.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/fortran.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/foxpro.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/freefem.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/func.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/functional.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/futhark.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/gcodelexer.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/gdscript.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/gleam.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/go.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/grammar_notation.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/graph.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/graphics.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/graphql.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/graphviz.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/gsql.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/hare.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/haskell.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/haxe.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/hdl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/hexdump.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/html.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/idl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/igor.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/inferno.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/installers.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/int_fiction.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/iolang.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/j.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/javascript.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/jmespath.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/jslt.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/json5.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/jsonnet.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/jsx.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/julia.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/jvm.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/kuin.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/kusto.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ldap.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/lean.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/lilypond.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/lisp.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/macaulay2.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/make.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/maple.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/markup.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/math.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/matlab.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/maxima.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/meson.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/mime.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/minecraft.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/mips.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ml.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/modeling.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/modula2.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/mojo.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/monte.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/mosel.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ncl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/nimrod.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/nit.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/nix.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/numbair.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/oberon.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/objective.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ooc.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/openscad.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/other.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/parasail.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/parsers.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/pascal.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/pawn.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/pddl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/perl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/phix.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/php.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/pointless.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/pony.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/praat.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/procfile.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/prolog.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/promql.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/prql.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ptx.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/python.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/q.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/qlik.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/qvt.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/r.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/rdf.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/rebol.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/rego.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/resource.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ride.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/rita.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/rnc.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/roboconf.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/robotframework.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ruby.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/rust.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/sas.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/savi.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/scdoc.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/scripting.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/sgf.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/shell.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/sieve.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/slash.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/smalltalk.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/smithy.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/smv.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/snobol.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/solidity.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/soong.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/sophia.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/special.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/spice.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/sql.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/srcinfo.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/stata.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/supercollider.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/tablegen.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/tact.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/tal.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/tcl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/teal.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/templates.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/teraterm.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/testing.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/text.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/textedit.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/textfmts.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/theorem.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/thingsdb.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/tlb.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/tls.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/tnt.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/trafficscript.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/typoscript.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/typst.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/ul4.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/unicon.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/urbi.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/usd.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/varnish.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/verification.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/verifpal.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/vip.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/vyper.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/web.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/webassembly.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/webidl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/webmisc.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/wgsl.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/whiley.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/wowtoc.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/wren.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/x10.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/xorg.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/yang.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/yara.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/lexers/zig.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/modeline.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/plugin.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/regexopt.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/scanner.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/sphinxext.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/style.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/_mapping.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/abap.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/algol.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/algol_nu.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/arduino.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/autumn.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/borland.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/bw.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/coffee.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/colorful.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/default.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/dracula.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/emacs.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/friendly.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/friendly_grayscale.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/fruity.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/gh_dark.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/gruvbox.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/igor.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/inkpot.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/lightbulb.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/lilypond.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/lovelace.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/manni.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/material.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/monokai.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/murphy.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/native.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/nord.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/onedark.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/paraiso_dark.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/paraiso_light.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/pastie.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/perldoc.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/rainbow_dash.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/rrt.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/sas.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/solarized.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/staroffice.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/stata_dark.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/stata_light.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/tango.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/trac.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/vim.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/vs.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/xcode.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/__pycache__/zenburn.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/_mapping.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/abap.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/algol.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/algol_nu.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/arduino.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/autumn.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/borland.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/bw.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/coffee.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/colorful.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/default.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/dracula.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/emacs.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/friendly.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/friendly_grayscale.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/fruity.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/gh_dark.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/gruvbox.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/igor.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/inkpot.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/lightbulb.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/lilypond.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/lovelace.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/manni.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/material.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/monokai.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/murphy.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/native.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/nord.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/onedark.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/paraiso_dark.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/paraiso_light.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/pastie.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/perldoc.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/rainbow_dash.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/rrt.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/sas.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/solarized.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/staroffice.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/stata_dark.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/stata_light.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/tango.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/trac.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/vim.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/vs.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/xcode.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/styles/zenburn.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/token.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/unistring.py [new file with mode: 0644]
.venv/Lib/site-packages/pygments/util.py [new file with mode: 0644]
.venv/Lib/site-packages/rich-14.0.0.dist-info/INSTALLER [new file with mode: 0644]
.venv/Lib/site-packages/rich-14.0.0.dist-info/LICENSE [new file with mode: 0644]
.venv/Lib/site-packages/rich-14.0.0.dist-info/METADATA [new file with mode: 0644]
.venv/Lib/site-packages/rich-14.0.0.dist-info/RECORD [new file with mode: 0644]
.venv/Lib/site-packages/rich-14.0.0.dist-info/REQUESTED [new file with mode: 0644]
.venv/Lib/site-packages/rich-14.0.0.dist-info/WHEEL [new file with mode: 0644]
.venv/Lib/site-packages/rich/__init__.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/__main__.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/__init__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/__main__.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_cell_widths.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_emoji_codes.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_emoji_replace.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_export_format.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_extension.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_fileno.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_inspect.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_log_render.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_loop.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_null_file.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_palettes.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_pick.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_ratio.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_spinners.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_stack.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_timer.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_win32_console.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_windows.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_windows_renderer.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/_wrap.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/abc.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/align.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/ansi.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/bar.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/box.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/cells.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/color.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/color_triplet.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/columns.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/console.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/constrain.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/containers.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/control.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/default_styles.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/diagnose.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/emoji.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/errors.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/file_proxy.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/filesize.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/highlighter.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/json.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/jupyter.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/layout.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/live.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/live_render.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/logging.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/markdown.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/markup.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/measure.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/padding.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/pager.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/palette.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/panel.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/pretty.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/progress.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/progress_bar.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/prompt.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/protocol.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/region.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/repr.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/rule.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/scope.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/screen.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/segment.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/spinner.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/status.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/style.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/styled.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/syntax.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/table.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/terminal_theme.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/text.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/theme.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/themes.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/traceback.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/__pycache__/tree.cpython-312.pyc [new file with mode: 0644]
.venv/Lib/site-packages/rich/_cell_widths.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_emoji_codes.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_emoji_replace.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_export_format.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_extension.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_fileno.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_inspect.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_log_render.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_loop.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_null_file.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_palettes.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_pick.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_ratio.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_spinners.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_stack.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_timer.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_win32_console.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_windows.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_windows_renderer.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/_wrap.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/abc.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/align.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/ansi.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/bar.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/box.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/cells.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/color.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/color_triplet.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/columns.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/console.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/constrain.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/containers.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/control.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/default_styles.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/diagnose.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/emoji.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/errors.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/file_proxy.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/filesize.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/highlighter.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/json.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/jupyter.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/layout.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/live.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/live_render.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/logging.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/markdown.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/markup.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/measure.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/padding.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/pager.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/palette.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/panel.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/pretty.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/progress.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/progress_bar.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/prompt.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/protocol.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/py.typed [new file with mode: 0644]
.venv/Lib/site-packages/rich/region.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/repr.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/rule.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/scope.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/screen.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/segment.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/spinner.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/status.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/style.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/styled.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/syntax.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/table.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/terminal_theme.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/text.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/theme.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/themes.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/traceback.py [new file with mode: 0644]
.venv/Lib/site-packages/rich/tree.py [new file with mode: 0644]
.venv/Scripts/markdown-it.exe [new file with mode: 0644]
.venv/Scripts/pygmentize.exe [new file with mode: 0644]
SOP/Handoff-FlaskBenchmarkStall.md [new file with mode: 0644]
app_fastapi/__pycache__/app.cpython-312.pyc
app_fastapi/app.py
app_flask/flask_application.py
benchmark/run_benchmark.py
o3.txt [new file with mode: 0644]
show_benchmark_table.py [new file with mode: 0644]

diff --git a/.venv/Lib/site-packages/markdown_it/__init__.py b/.venv/Lib/site-packages/markdown_it/__init__.py
new file mode 100644 (file)
index 0000000..6606868
--- /dev/null
@@ -0,0 +1,5 @@
+"""A Python port of Markdown-It"""
+__all__ = ("MarkdownIt",)
+__version__ = "3.0.0"
+
+from .main import MarkdownIt
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..74feb25
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/_compat.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/_compat.cpython-312.pyc
new file mode 100644 (file)
index 0000000..655f04e
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/_compat.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/_punycode.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/_punycode.cpython-312.pyc
new file mode 100644 (file)
index 0000000..25990e1
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/_punycode.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/main.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/main.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8f7e243
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/main.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/parser_block.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/parser_block.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8f00f09
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/parser_block.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/parser_core.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/parser_core.cpython-312.pyc
new file mode 100644 (file)
index 0000000..62fc6e3
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/parser_core.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/parser_inline.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/parser_inline.cpython-312.pyc
new file mode 100644 (file)
index 0000000..09a6031
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/parser_inline.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/renderer.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/renderer.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b1c64c5
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/renderer.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/ruler.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/ruler.cpython-312.pyc
new file mode 100644 (file)
index 0000000..dca12a9
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/ruler.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/token.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/token.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8a08165
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/token.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/tree.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/tree.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3207a5d
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/tree.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/__pycache__/utils.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/__pycache__/utils.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d91c53b
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/__pycache__/utils.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/_compat.py b/.venv/Lib/site-packages/markdown_it/_compat.py
new file mode 100644 (file)
index 0000000..974d431
--- /dev/null
@@ -0,0 +1,11 @@
+from __future__ import annotations
+
+from collections.abc import Mapping
+import sys
+from typing import Any
+
+DATACLASS_KWARGS: Mapping[str, Any]
+if sys.version_info >= (3, 10):
+    DATACLASS_KWARGS = {"slots": True}
+else:
+    DATACLASS_KWARGS = {}
diff --git a/.venv/Lib/site-packages/markdown_it/_punycode.py b/.venv/Lib/site-packages/markdown_it/_punycode.py
new file mode 100644 (file)
index 0000000..f9baad2
--- /dev/null
@@ -0,0 +1,67 @@
+# Copyright 2014 Mathias Bynens <https://mathiasbynens.be/>
+# Copyright 2021 Taneli Hukkinen
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+import codecs
+import re
+from typing import Callable
+
+REGEX_SEPARATORS = re.compile(r"[\x2E\u3002\uFF0E\uFF61]")
+REGEX_NON_ASCII = re.compile(r"[^\0-\x7E]")
+
+
+def encode(uni: str) -> str:
+    return codecs.encode(uni, encoding="punycode").decode()
+
+
+def decode(ascii: str) -> str:
+    return codecs.decode(ascii, encoding="punycode")  # type: ignore
+
+
+def map_domain(string: str, fn: Callable[[str], str]) -> str:
+    parts = string.split("@")
+    result = ""
+    if len(parts) > 1:
+        # In email addresses, only the domain name should be punycoded. Leave
+        # the local part (i.e. everything up to `@`) intact.
+        result = parts[0] + "@"
+        string = parts[1]
+    labels = REGEX_SEPARATORS.split(string)
+    encoded = ".".join(fn(label) for label in labels)
+    return result + encoded
+
+
+def to_unicode(obj: str) -> str:
+    def mapping(obj: str) -> str:
+        if obj.startswith("xn--"):
+            return decode(obj[4:].lower())
+        return obj
+
+    return map_domain(obj, mapping)
+
+
+def to_ascii(obj: str) -> str:
+    def mapping(obj: str) -> str:
+        if REGEX_NON_ASCII.search(obj):
+            return "xn--" + encode(obj)
+        return obj
+
+    return map_domain(obj, mapping)
diff --git a/.venv/Lib/site-packages/markdown_it/cli/__init__.py b/.venv/Lib/site-packages/markdown_it/cli/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/.venv/Lib/site-packages/markdown_it/cli/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/cli/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..94bc781
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/cli/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/cli/__pycache__/parse.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/cli/__pycache__/parse.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0609566
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/cli/__pycache__/parse.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/cli/parse.py b/.venv/Lib/site-packages/markdown_it/cli/parse.py
new file mode 100644 (file)
index 0000000..890d5de
--- /dev/null
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+"""
+CLI interface to markdown-it-py
+
+Parse one or more markdown files, convert each to HTML, and print to stdout.
+"""
+from __future__ import annotations
+
+import argparse
+from collections.abc import Iterable, Sequence
+import sys
+
+from markdown_it import __version__
+from markdown_it.main import MarkdownIt
+
+version_str = "markdown-it-py [version {}]".format(__version__)
+
+
+def main(args: Sequence[str] | None = None) -> int:
+    namespace = parse_args(args)
+    if namespace.filenames:
+        convert(namespace.filenames)
+    else:
+        interactive()
+    return 0
+
+
+def convert(filenames: Iterable[str]) -> None:
+    for filename in filenames:
+        convert_file(filename)
+
+
+def convert_file(filename: str) -> None:
+    """
+    Parse a Markdown file and dump the output to stdout.
+    """
+    try:
+        with open(filename, "r", encoding="utf8", errors="ignore") as fin:
+            rendered = MarkdownIt().render(fin.read())
+            print(rendered, end="")
+    except OSError:
+        sys.stderr.write(f'Cannot open file "{filename}".\n')
+        sys.exit(1)
+
+
+def interactive() -> None:
+    """
+    Parse user input, dump to stdout, rinse and repeat.
+    Python REPL style.
+    """
+    print_heading()
+    contents = []
+    more = False
+    while True:
+        try:
+            prompt, more = ("... ", True) if more else (">>> ", True)
+            contents.append(input(prompt) + "\n")
+        except EOFError:
+            print("\n" + MarkdownIt().render("\n".join(contents)), end="")
+            more = False
+            contents = []
+        except KeyboardInterrupt:
+            print("\nExiting.")
+            break
+
+
+def parse_args(args: Sequence[str] | None) -> argparse.Namespace:
+    """Parse input CLI arguments."""
+    parser = argparse.ArgumentParser(
+        description="Parse one or more markdown files, "
+        "convert each to HTML, and print to stdout",
+        # NOTE: Remember to update README.md w/ the output of `markdown-it -h`
+        epilog=(
+            f"""
+Interactive:
+
+  $ markdown-it
+  markdown-it-py [version {__version__}] (interactive)
+  Type Ctrl-D to complete input, or Ctrl-C to exit.
+  >>> # Example
+  ... > markdown *input*
+  ...
+  <h1>Example</h1>
+  <blockquote>
+  <p>markdown <em>input</em></p>
+  </blockquote>
+
+Batch:
+
+  $ markdown-it README.md README.footer.md > index.html
+"""
+        ),
+        formatter_class=argparse.RawDescriptionHelpFormatter,
+    )
+    parser.add_argument("-v", "--version", action="version", version=version_str)
+    parser.add_argument(
+        "filenames", nargs="*", help="specify an optional list of files to convert"
+    )
+    return parser.parse_args(args)
+
+
+def print_heading() -> None:
+    print("{} (interactive)".format(version_str))
+    print("Type Ctrl-D to complete input, or Ctrl-C to exit.")
+
+
+if __name__ == "__main__":
+    exit_code = main(sys.argv[1:])
+    sys.exit(exit_code)
diff --git a/.venv/Lib/site-packages/markdown_it/common/__init__.py b/.venv/Lib/site-packages/markdown_it/common/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/.venv/Lib/site-packages/markdown_it/common/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/common/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4198e9b
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/common/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/common/__pycache__/entities.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/common/__pycache__/entities.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7399722
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/common/__pycache__/entities.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/common/__pycache__/html_blocks.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/common/__pycache__/html_blocks.cpython-312.pyc
new file mode 100644 (file)
index 0000000..eb49476
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/common/__pycache__/html_blocks.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/common/__pycache__/html_re.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/common/__pycache__/html_re.cpython-312.pyc
new file mode 100644 (file)
index 0000000..220a5f8
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/common/__pycache__/html_re.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/common/__pycache__/normalize_url.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/common/__pycache__/normalize_url.cpython-312.pyc
new file mode 100644 (file)
index 0000000..03a1d59
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/common/__pycache__/normalize_url.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/common/__pycache__/utils.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/common/__pycache__/utils.cpython-312.pyc
new file mode 100644 (file)
index 0000000..425530b
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/common/__pycache__/utils.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/common/entities.py b/.venv/Lib/site-packages/markdown_it/common/entities.py
new file mode 100644 (file)
index 0000000..6bb2d34
--- /dev/null
@@ -0,0 +1,4 @@
+"""HTML5 entities map: { name -> characters }."""
+import html.entities
+
+entities = {name.rstrip(";"): chars for name, chars in html.entities.html5.items()}
diff --git a/.venv/Lib/site-packages/markdown_it/common/html_blocks.py b/.venv/Lib/site-packages/markdown_it/common/html_blocks.py
new file mode 100644 (file)
index 0000000..8b199af
--- /dev/null
@@ -0,0 +1,68 @@
+"""List of valid html blocks names, according to commonmark spec
+http://jgm.github.io/CommonMark/spec.html#html-blocks
+"""
+
+block_names = [
+    "address",
+    "article",
+    "aside",
+    "base",
+    "basefont",
+    "blockquote",
+    "body",
+    "caption",
+    "center",
+    "col",
+    "colgroup",
+    "dd",
+    "details",
+    "dialog",
+    "dir",
+    "div",
+    "dl",
+    "dt",
+    "fieldset",
+    "figcaption",
+    "figure",
+    "footer",
+    "form",
+    "frame",
+    "frameset",
+    "h1",
+    "h2",
+    "h3",
+    "h4",
+    "h5",
+    "h6",
+    "head",
+    "header",
+    "hr",
+    "html",
+    "iframe",
+    "legend",
+    "li",
+    "link",
+    "main",
+    "menu",
+    "menuitem",
+    "nav",
+    "noframes",
+    "ol",
+    "optgroup",
+    "option",
+    "p",
+    "param",
+    "section",
+    "source",
+    "summary",
+    "table",
+    "tbody",
+    "td",
+    "tfoot",
+    "th",
+    "thead",
+    "title",
+    "tr",
+    "track",
+    "ul",
+]
diff --git a/.venv/Lib/site-packages/markdown_it/common/html_re.py b/.venv/Lib/site-packages/markdown_it/common/html_re.py
new file mode 100644 (file)
index 0000000..f0c336d
--- /dev/null
@@ -0,0 +1,40 @@
+"""Regexps to match html elements
+"""
+
+import re
+
+attr_name = "[a-zA-Z_:][a-zA-Z0-9:._-]*"
+
+unquoted = "[^\"'=<>`\\x00-\\x20]+"
+single_quoted = "'[^']*'"
+double_quoted = '"[^"]*"'
+
+attr_value = "(?:" + unquoted + "|" + single_quoted + "|" + double_quoted + ")"
+
+attribute = "(?:\\s+" + attr_name + "(?:\\s*=\\s*" + attr_value + ")?)"
+
+open_tag = "<[A-Za-z][A-Za-z0-9\\-]*" + attribute + "*\\s*\\/?>"
+
+close_tag = "<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>"
+comment = "<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->"
+processing = "<[?][\\s\\S]*?[?]>"
+declaration = "<![A-Z]+\\s+[^>]*>"
+cdata = "<!\\[CDATA\\[[\\s\\S]*?\\]\\]>"
+
+HTML_TAG_RE = re.compile(
+    "^(?:"
+    + open_tag
+    + "|"
+    + close_tag
+    + "|"
+    + comment
+    + "|"
+    + processing
+    + "|"
+    + declaration
+    + "|"
+    + cdata
+    + ")"
+)
+HTML_OPEN_CLOSE_TAG_STR = "^(?:" + open_tag + "|" + close_tag + ")"
+HTML_OPEN_CLOSE_TAG_RE = re.compile(HTML_OPEN_CLOSE_TAG_STR)
diff --git a/.venv/Lib/site-packages/markdown_it/common/normalize_url.py b/.venv/Lib/site-packages/markdown_it/common/normalize_url.py
new file mode 100644 (file)
index 0000000..92720b3
--- /dev/null
@@ -0,0 +1,81 @@
+from __future__ import annotations
+
+from collections.abc import Callable
+from contextlib import suppress
+import re
+from urllib.parse import quote, unquote, urlparse, urlunparse  # noqa: F401
+
+import mdurl
+
+from .. import _punycode
+
+RECODE_HOSTNAME_FOR = ("http:", "https:", "mailto:")
+
+
+def normalizeLink(url: str) -> str:
+    """Normalize destination URLs in links
+
+    ::
+
+        [label]:   destination   'title'
+                ^^^^^^^^^^^
+    """
+    parsed = mdurl.parse(url, slashes_denote_host=True)
+
+    # Encode hostnames in urls like:
+    # `http://host/`, `https://host/`, `mailto:user@host`, `//host/`
+    #
+    # We don't encode unknown schemas, because it's likely that we encode
+    # something we shouldn't (e.g. `skype:name` treated as `skype:host`)
+    #
+    if parsed.hostname and (
+        not parsed.protocol or parsed.protocol in RECODE_HOSTNAME_FOR
+    ):
+        with suppress(Exception):
+            parsed = parsed._replace(hostname=_punycode.to_ascii(parsed.hostname))
+
+    return mdurl.encode(mdurl.format(parsed))
+
+
+def normalizeLinkText(url: str) -> str:
+    """Normalize autolink content
+
+    ::
+
+        <destination>
+         ~~~~~~~~~~~
+    """
+    parsed = mdurl.parse(url, slashes_denote_host=True)
+
+    # Encode hostnames in urls like:
+    # `http://host/`, `https://host/`, `mailto:user@host`, `//host/`
+    #
+    # We don't encode unknown schemas, because it's likely that we encode
+    # something we shouldn't (e.g. `skype:name` treated as `skype:host`)
+    #
+    if parsed.hostname and (
+        not parsed.protocol or parsed.protocol in RECODE_HOSTNAME_FOR
+    ):
+        with suppress(Exception):
+            parsed = parsed._replace(hostname=_punycode.to_unicode(parsed.hostname))
+
+    # add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720
+    return mdurl.decode(mdurl.format(parsed), mdurl.DECODE_DEFAULT_CHARS + "%")
+
+
+BAD_PROTO_RE = re.compile(r"^(vbscript|javascript|file|data):")
+GOOD_DATA_RE = re.compile(r"^data:image\/(gif|png|jpeg|webp);")
+
+
+def validateLink(url: str, validator: Callable[[str], bool] | None = None) -> bool:
+    """Validate URL link is allowed in output.
+
+    This validator can prohibit more than really needed to prevent XSS.
+    It's a tradeoff to keep code simple and to be secure by default.
+
+    Note: url should be normalized at this point, and existing entities decoded.
+    """
+    if validator is not None:
+        return validator(url)
+    url = url.strip().lower()
+    return bool(GOOD_DATA_RE.search(url)) if BAD_PROTO_RE.search(url) else True
diff --git a/.venv/Lib/site-packages/markdown_it/common/utils.py b/.venv/Lib/site-packages/markdown_it/common/utils.py
new file mode 100644 (file)
index 0000000..0d11e3e
--- /dev/null
@@ -0,0 +1,318 @@
+"""Utilities for parsing source text
+"""
+from __future__ import annotations
+
+import re
+from typing import Match, TypeVar
+
+from .entities import entities
+
+
+def charCodeAt(src: str, pos: int) -> int | None:
+    """
+    Returns the Unicode value of the character at the specified location.
+
+    @param - index The zero-based index of the desired character.
+    If there is no character at the specified index, NaN is returned.
+
+    This was added for compatibility with python
+    """
+    try:
+        return ord(src[pos])
+    except IndexError:
+        return None
+
+
+def charStrAt(src: str, pos: int) -> str | None:
+    """
+    Returns the Unicode value of the character at the specified location.
+
+    @param - index The zero-based index of the desired character.
+    If there is no character at the specified index, NaN is returned.
+
+    This was added for compatibility with python
+    """
+    try:
+        return src[pos]
+    except IndexError:
+        return None
+
+
+_ItemTV = TypeVar("_ItemTV")
+
+
+def arrayReplaceAt(
+    src: list[_ItemTV], pos: int, newElements: list[_ItemTV]
+) -> list[_ItemTV]:
+    """
+    Remove element from array and put another array at those position.
+    Useful for some operations with tokens
+    """
+    return src[:pos] + newElements + src[pos + 1 :]
+
+
+def isValidEntityCode(c: int) -> bool:
+    # broken sequence
+    if c >= 0xD800 and c <= 0xDFFF:
+        return False
+    # never used
+    if c >= 0xFDD0 and c <= 0xFDEF:
+        return False
+    if ((c & 0xFFFF) == 0xFFFF) or ((c & 0xFFFF) == 0xFFFE):
+        return False
+    # control codes
+    if c >= 0x00 and c <= 0x08:
+        return False
+    if c == 0x0B:
+        return False
+    if c >= 0x0E and c <= 0x1F:
+        return False
+    if c >= 0x7F and c <= 0x9F:
+        return False
+    # out of range
+    if c > 0x10FFFF:
+        return False
+    return True
+
+
+def fromCodePoint(c: int) -> str:
+    """Convert ordinal to unicode.
+
+    Note, in the original Javascript two string characters were required,
+    for codepoints larger than `0xFFFF`.
+    But Python 3 can represent any unicode codepoint in one character.
+    """
+    return chr(c)
+
+
+# UNESCAPE_MD_RE = re.compile(r'\\([!"#$%&\'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])')
+# ENTITY_RE_g       = re.compile(r'&([a-z#][a-z0-9]{1,31})', re.IGNORECASE)
+UNESCAPE_ALL_RE = re.compile(
+    r'\\([!"#$%&\'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])' + "|" + r"&([a-z#][a-z0-9]{1,31});",
+    re.IGNORECASE,
+)
+DIGITAL_ENTITY_BASE10_RE = re.compile(r"#([0-9]{1,8})")
+DIGITAL_ENTITY_BASE16_RE = re.compile(r"#x([a-f0-9]{1,8})", re.IGNORECASE)
+
+
+def replaceEntityPattern(match: str, name: str) -> str:
+    """Convert HTML entity patterns,
+    see https://spec.commonmark.org/0.30/#entity-references
+    """
+    if name in entities:
+        return entities[name]
+
+    code: None | int = None
+    if pat := DIGITAL_ENTITY_BASE10_RE.fullmatch(name):
+        code = int(pat.group(1), 10)
+    elif pat := DIGITAL_ENTITY_BASE16_RE.fullmatch(name):
+        code = int(pat.group(1), 16)
+
+    if code is not None and isValidEntityCode(code):
+        return fromCodePoint(code)
+
+    return match
+
+
+def unescapeAll(string: str) -> str:
+    def replacer_func(match: Match[str]) -> str:
+        escaped = match.group(1)
+        if escaped:
+            return escaped
+        entity = match.group(2)
+        return replaceEntityPattern(match.group(), entity)
+
+    if "\\" not in string and "&" not in string:
+        return string
+    return UNESCAPE_ALL_RE.sub(replacer_func, string)
+
+
+ESCAPABLE = r"""\\!"#$%&'()*+,./:;<=>?@\[\]^`{}|_~-"""
+ESCAPE_CHAR = re.compile(r"\\([" + ESCAPABLE + r"])")
+
+
+def stripEscape(string: str) -> str:
+    """Strip escape \\ characters"""
+    return ESCAPE_CHAR.sub(r"\1", string)
+
+
+def escapeHtml(raw: str) -> str:
+    """Replace special characters "&", "<", ">" and '"' to HTML-safe sequences."""
+    # like html.escape, but without escaping single quotes
+    raw = raw.replace("&", "&amp;")  # Must be done first!
+    raw = raw.replace("<", "&lt;")
+    raw = raw.replace(">", "&gt;")
+    raw = raw.replace('"', "&quot;")
+    return raw
+
+
+# //////////////////////////////////////////////////////////////////////////////
+
+REGEXP_ESCAPE_RE = re.compile(r"[.?*+^$[\]\\(){}|-]")
+
+
+def escapeRE(string: str) -> str:
+    string = REGEXP_ESCAPE_RE.sub("\\$&", string)
+    return string
+
+
+# //////////////////////////////////////////////////////////////////////////////
+
+
+def isSpace(code: int | None) -> bool:
+    """Check if character code is a whitespace."""
+    return code in (0x09, 0x20)
+
+
+def isStrSpace(ch: str | None) -> bool:
+    """Check if character is a whitespace."""
+    return ch in ("\t", " ")
+
+
+MD_WHITESPACE = {
+    0x09,  # \t
+    0x0A,  # \n
+    0x0B,  # \v
+    0x0C,  # \f
+    0x0D,  # \r
+    0x20,  # space
+    0xA0,
+    0x1680,
+    0x202F,
+    0x205F,
+    0x3000,
+}
+
+
+def isWhiteSpace(code: int) -> bool:
+    r"""Zs (unicode class) || [\t\f\v\r\n]"""
+    if code >= 0x2000 and code <= 0x200A:
+        return True
+    return code in MD_WHITESPACE
+
+
+# //////////////////////////////////////////////////////////////////////////////
+
+UNICODE_PUNCT_RE = re.compile(
+    r"[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]"  # noqa: E501
+)
+
+
+# Currently without astral characters support.
+def isPunctChar(ch: str) -> bool:
+    """Check if character is a punctuation character."""
+    return UNICODE_PUNCT_RE.search(ch) is not None
+
+
+MD_ASCII_PUNCT = {
+    0x21,  # /* ! */
+    0x22,  # /* " */
+    0x23,  # /* # */
+    0x24,  # /* $ */
+    0x25,  # /* % */
+    0x26,  # /* & */
+    0x27,  # /* ' */
+    0x28,  # /* ( */
+    0x29,  # /* ) */
+    0x2A,  # /* * */
+    0x2B,  # /* + */
+    0x2C,  # /* , */
+    0x2D,  # /* - */
+    0x2E,  # /* . */
+    0x2F,  # /* / */
+    0x3A,  # /* : */
+    0x3B,  # /* ; */
+    0x3C,  # /* < */
+    0x3D,  # /* = */
+    0x3E,  # /* > */
+    0x3F,  # /* ? */
+    0x40,  # /* @ */
+    0x5B,  # /* [ */
+    0x5C,  # /* \ */
+    0x5D,  # /* ] */
+    0x5E,  # /* ^ */
+    0x5F,  # /* _ */
+    0x60,  # /* ` */
+    0x7B,  # /* { */
+    0x7C,  # /* | */
+    0x7D,  # /* } */
+    0x7E,  # /* ~ */
+}
+
+
+def isMdAsciiPunct(ch: int) -> bool:
+    """Markdown ASCII punctuation characters.
+
+    ::
+
+        !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~
+
+    See http://spec.commonmark.org/0.15/#ascii-punctuation-character
+
+    Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.
+
+    """  # noqa: E501
+    return ch in MD_ASCII_PUNCT
+
+
+def normalizeReference(string: str) -> str:
+    """Helper to unify [reference labels]."""
+    # Trim and collapse whitespace
+    #
+    string = re.sub(r"\s+", " ", string.strip())
+
+    # In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug
+    # fixed in v12 (couldn't find any details).
+    #
+    # So treat this one as a special case
+    # (remove this when node v10 is no longer supported).
+    #
+    # if ('ẞ'.toLowerCase() === 'Ṿ') {
+    #   str = str.replace(/ẞ/g, 'ß')
+    # }
+
+    # .toLowerCase().toUpperCase() should get rid of all differences
+    # between letter variants.
+    #
+    # Simple .toLowerCase() doesn't normalize 125 code points correctly,
+    # and .toUpperCase doesn't normalize 6 of them (list of exceptions:
+    # İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently
+    # uppercased versions).
+    #
+    # Here's an example showing how it happens. Lets take greek letter omega:
+    # uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)
+    #
+    # Unicode entries:
+    # 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8
+    # 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398
+    # 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
+    # 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8
+    #
+    # Case-insensitive comparison should treat all of them as equivalent.
+    #
+    # But .toLowerCase() doesn't change ϑ (it's already lowercase),
+    # and .toUpperCase() doesn't change ϴ (already uppercase).
+    #
+    # Applying first lower then upper case normalizes any character:
+    # '\u0398\u03f4\u03b8\u03d1'.toLowerCase().toUpperCase() === '\u0398\u0398\u0398\u0398'
+    #
+    # Note: this is equivalent to unicode case folding; unicode normalization
+    # is a different step that is not required here.
+    #
+    # Final result should be uppercased, because it's later stored in an object
+    # (this avoid a conflict with Object.prototype members,
+    # most notably, `__proto__`)
+    #
+    return string.lower().upper()
+
+
+LINK_OPEN_RE = re.compile(r"^<a[>\s]", flags=re.IGNORECASE)
+LINK_CLOSE_RE = re.compile(r"^</a\s*>", flags=re.IGNORECASE)
+
+
+def isLinkOpen(string: str) -> bool:
+    return bool(LINK_OPEN_RE.search(string))
+
+
+def isLinkClose(string: str) -> bool:
+    return bool(LINK_CLOSE_RE.search(string))
diff --git a/.venv/Lib/site-packages/markdown_it/helpers/__init__.py b/.venv/Lib/site-packages/markdown_it/helpers/__init__.py
new file mode 100644 (file)
index 0000000..3dbbdd1
--- /dev/null
@@ -0,0 +1,6 @@
+"""Functions for parsing Links
+"""
+__all__ = ("parseLinkLabel", "parseLinkDestination", "parseLinkTitle")
+from .parse_link_destination import parseLinkDestination
+from .parse_link_label import parseLinkLabel
+from .parse_link_title import parseLinkTitle
diff --git a/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ed2a8ce
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_destination.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_destination.cpython-312.pyc
new file mode 100644 (file)
index 0000000..25dcd43
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_destination.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_label.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_label.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e79cbbe
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_label.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_title.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_title.cpython-312.pyc
new file mode 100644 (file)
index 0000000..cd3c17d
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/helpers/__pycache__/parse_link_title.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/helpers/parse_link_destination.py b/.venv/Lib/site-packages/markdown_it/helpers/parse_link_destination.py
new file mode 100644 (file)
index 0000000..f42b224
--- /dev/null
@@ -0,0 +1,86 @@
+"""
+Parse link destination
+"""
+
+from ..common.utils import charCodeAt, unescapeAll
+
+
+class _Result:
+    __slots__ = ("ok", "pos", "lines", "str")
+
+    def __init__(self) -> None:
+        self.ok = False
+        self.pos = 0
+        self.lines = 0
+        self.str = ""
+
+
+def parseLinkDestination(string: str, pos: int, maximum: int) -> _Result:
+    lines = 0
+    start = pos
+    result = _Result()
+
+    if charCodeAt(string, pos) == 0x3C:  # /* < */
+        pos += 1
+        while pos < maximum:
+            code = charCodeAt(string, pos)
+            if code == 0x0A:  # /* \n */)
+                return result
+            if code == 0x3C:  # / * < * /
+                return result
+            if code == 0x3E:  # /* > */) {
+                result.pos = pos + 1
+                result.str = unescapeAll(string[start + 1 : pos])
+                result.ok = True
+                return result
+
+            if code == 0x5C and pos + 1 < maximum:  # \
+                pos += 2
+                continue
+
+            pos += 1
+
+        # no closing '>'
+        return result
+
+    # this should be ... } else { ... branch
+
+    level = 0
+    while pos < maximum:
+        code = charCodeAt(string, pos)
+
+        if code is None or code == 0x20:
+            break
+
+        # ascii control characters
+        if code < 0x20 or code == 0x7F:
+            break
+
+        if code == 0x5C and pos + 1 < maximum:
+            if charCodeAt(string, pos + 1) == 0x20:
+                break
+            pos += 2
+            continue
+
+        if code == 0x28:  # /* ( */)
+            level += 1
+            if level > 32:
+                return result
+
+        if code == 0x29:  # /* ) */)
+            if level == 0:
+                break
+            level -= 1
+
+        pos += 1
+
+    if start == pos:
+        return result
+    if level != 0:
+        return result
+
+    result.str = unescapeAll(string[start:pos])
+    result.lines = lines
+    result.pos = pos
+    result.ok = True
+    return result
diff --git a/.venv/Lib/site-packages/markdown_it/helpers/parse_link_label.py b/.venv/Lib/site-packages/markdown_it/helpers/parse_link_label.py
new file mode 100644 (file)
index 0000000..01c653c
--- /dev/null
@@ -0,0 +1,43 @@
+"""
+Parse link label
+
+this function assumes that first character ("[") already matches
+returns the end of the label
+
+"""
+from markdown_it.rules_inline import StateInline
+
+
+def parseLinkLabel(state: StateInline, start: int, disableNested: bool = False) -> int:
+    labelEnd = -1
+    oldPos = state.pos
+    found = False
+
+    state.pos = start + 1
+    level = 1
+
+    while state.pos < state.posMax:
+        marker = state.src[state.pos]
+        if marker == "]":
+            level -= 1
+            if level == 0:
+                found = True
+                break
+
+        prevPos = state.pos
+        state.md.inline.skipToken(state)
+        if marker == "[":
+            if prevPos == state.pos - 1:
+                # increase level if we find text `[`,
+                # which is not a part of any token
+                level += 1
+            elif disableNested:
+                state.pos = oldPos
+                return -1
+    if found:
+        labelEnd = state.pos
+
+    # restore old state
+    state.pos = oldPos
+
+    return labelEnd
diff --git a/.venv/Lib/site-packages/markdown_it/helpers/parse_link_title.py b/.venv/Lib/site-packages/markdown_it/helpers/parse_link_title.py
new file mode 100644 (file)
index 0000000..8f58933
--- /dev/null
@@ -0,0 +1,60 @@
+"""Parse link title
+"""
+from ..common.utils import charCodeAt, unescapeAll
+
+
+class _Result:
+    __slots__ = ("ok", "pos", "lines", "str")
+
+    def __init__(self) -> None:
+        self.ok = False
+        self.pos = 0
+        self.lines = 0
+        self.str = ""
+
+    def __str__(self) -> str:
+        return self.str
+
+
+def parseLinkTitle(string: str, pos: int, maximum: int) -> _Result:
+    lines = 0
+    start = pos
+    result = _Result()
+
+    if pos >= maximum:
+        return result
+
+    marker = charCodeAt(string, pos)
+
+    # /* " */  /* ' */  /* ( */
+    if marker != 0x22 and marker != 0x27 and marker != 0x28:
+        return result
+
+    pos += 1
+
+    # if opening marker is "(", switch it to closing marker ")"
+    if marker == 0x28:
+        marker = 0x29
+
+    while pos < maximum:
+        code = charCodeAt(string, pos)
+        if code == marker:
+            title = string[start + 1 : pos]
+            title = unescapeAll(title)
+            result.pos = pos + 1
+            result.lines = lines
+            result.str = title
+            result.ok = True
+            return result
+        elif code == 0x28 and marker == 0x29:  # /* ( */  /* ) */
+            return result
+        elif code == 0x0A:
+            lines += 1
+        elif code == 0x5C and pos + 1 < maximum:  # /* \ */
+            pos += 1
+            if charCodeAt(string, pos) == 0x0A:
+                lines += 1
+
+        pos += 1
+
+    return result
diff --git a/.venv/Lib/site-packages/markdown_it/main.py b/.venv/Lib/site-packages/markdown_it/main.py
new file mode 100644 (file)
index 0000000..bb294a9
--- /dev/null
@@ -0,0 +1,355 @@
+from __future__ import annotations
+
+from collections.abc import Callable, Generator, Iterable, Mapping, MutableMapping
+from contextlib import contextmanager
+from typing import Any, Literal, overload
+
+from . import helpers, presets
+from .common import normalize_url, utils
+from .parser_block import ParserBlock
+from .parser_core import ParserCore
+from .parser_inline import ParserInline
+from .renderer import RendererHTML, RendererProtocol
+from .rules_core.state_core import StateCore
+from .token import Token
+from .utils import EnvType, OptionsDict, OptionsType, PresetType
+
+try:
+    import linkify_it
+except ModuleNotFoundError:
+    linkify_it = None
+
+
+_PRESETS: dict[str, PresetType] = {
+    "default": presets.default.make(),
+    "js-default": presets.js_default.make(),
+    "zero": presets.zero.make(),
+    "commonmark": presets.commonmark.make(),
+    "gfm-like": presets.gfm_like.make(),
+}
+
+
+class MarkdownIt:
+    def __init__(
+        self,
+        config: str | PresetType = "commonmark",
+        options_update: Mapping[str, Any] | None = None,
+        *,
+        renderer_cls: Callable[[MarkdownIt], RendererProtocol] = RendererHTML,
+    ):
+        """Main parser class
+
+        :param config: name of configuration to load or a pre-defined dictionary
+        :param options_update: dictionary that will be merged into ``config["options"]``
+        :param renderer_cls: the class to load as the renderer:
+            ``self.renderer = renderer_cls(self)
+        """
+        # add modules
+        self.utils = utils
+        self.helpers = helpers
+
+        # initialise classes
+        self.inline = ParserInline()
+        self.block = ParserBlock()
+        self.core = ParserCore()
+        self.renderer = renderer_cls(self)
+        self.linkify = linkify_it.LinkifyIt() if linkify_it else None
+
+        # set the configuration
+        if options_update and not isinstance(options_update, Mapping):
+            # catch signature change where renderer_cls was not used as a key-word
+            raise TypeError(
+                f"options_update should be a mapping: {options_update}"
+                "\n(Perhaps you intended this to be the renderer_cls?)"
+            )
+        self.configure(config, options_update=options_update)
+
+    def __repr__(self) -> str:
+        return f"{self.__class__.__module__}.{self.__class__.__name__}()"
+
+    @overload
+    def __getitem__(self, name: Literal["inline"]) -> ParserInline:
+        ...
+
+    @overload
+    def __getitem__(self, name: Literal["block"]) -> ParserBlock:
+        ...
+
+    @overload
+    def __getitem__(self, name: Literal["core"]) -> ParserCore:
+        ...
+
+    @overload
+    def __getitem__(self, name: Literal["renderer"]) -> RendererProtocol:
+        ...
+
+    @overload
+    def __getitem__(self, name: str) -> Any:
+        ...
+
+    def __getitem__(self, name: str) -> Any:
+        return {
+            "inline": self.inline,
+            "block": self.block,
+            "core": self.core,
+            "renderer": self.renderer,
+        }[name]
+
+    def set(self, options: OptionsType) -> None:
+        """Set parser options (in the same format as in constructor).
+        Probably, you will never need it, but you can change options after constructor call.
+
+        __Note:__ To achieve the best possible performance, don't modify a
+        `markdown-it` instance options on the fly. If you need multiple configurations
+        it's best to create multiple instances and initialize each with separate config.
+        """
+        self.options = OptionsDict(options)
+
+    def configure(
+        self, presets: str | PresetType, options_update: Mapping[str, Any] | None = None
+    ) -> MarkdownIt:
+        """Batch load of all options and component settings.
+        This is an internal method, and you probably will not need it.
+        But if you will - see available presets and data structure
+        [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)
+
+        We strongly recommend to use presets instead of direct config loads.
+        That will give better compatibility with next versions.
+        """
+        if isinstance(presets, str):
+            if presets not in _PRESETS:
+                raise KeyError(f"Wrong `markdown-it` preset '{presets}', check name")
+            config = _PRESETS[presets]
+        else:
+            config = presets
+
+        if not config:
+            raise ValueError("Wrong `markdown-it` config, can't be empty")
+
+        options = config.get("options", {}) or {}
+        if options_update:
+            options = {**options, **options_update}  # type: ignore
+
+        self.set(options)  # type: ignore
+
+        if "components" in config:
+            for name, component in config["components"].items():
+                rules = component.get("rules", None)
+                if rules:
+                    self[name].ruler.enableOnly(rules)
+                rules2 = component.get("rules2", None)
+                if rules2:
+                    self[name].ruler2.enableOnly(rules2)
+
+        return self
+
+    def get_all_rules(self) -> dict[str, list[str]]:
+        """Return the names of all active rules."""
+        rules = {
+            chain: self[chain].ruler.get_all_rules()
+            for chain in ["core", "block", "inline"]
+        }
+        rules["inline2"] = self.inline.ruler2.get_all_rules()
+        return rules
+
+    def get_active_rules(self) -> dict[str, list[str]]:
+        """Return the names of all active rules."""
+        rules = {
+            chain: self[chain].ruler.get_active_rules()
+            for chain in ["core", "block", "inline"]
+        }
+        rules["inline2"] = self.inline.ruler2.get_active_rules()
+        return rules
+
+    def enable(
+        self, names: str | Iterable[str], ignoreInvalid: bool = False
+    ) -> MarkdownIt:
+        """Enable list or rules. (chainable)
+
+        :param names: rule name or list of rule names to enable.
+        :param ignoreInvalid: set `true` to ignore errors when rule not found.
+
+        It will automatically find appropriate components,
+        containing rules with given names. If rule not found, and `ignoreInvalid`
+        not set - throws exception.
+
+        Example::
+
+            md = MarkdownIt().enable(['sub', 'sup']).disable('smartquotes')
+
+        """
+        result = []
+
+        if isinstance(names, str):
+            names = [names]
+
+        for chain in ["core", "block", "inline"]:
+            result.extend(self[chain].ruler.enable(names, True))
+        result.extend(self.inline.ruler2.enable(names, True))
+
+        missed = [name for name in names if name not in result]
+        if missed and not ignoreInvalid:
+            raise ValueError(f"MarkdownIt. Failed to enable unknown rule(s): {missed}")
+
+        return self
+
+    def disable(
+        self, names: str | Iterable[str], ignoreInvalid: bool = False
+    ) -> MarkdownIt:
+        """The same as [[MarkdownIt.enable]], but turn specified rules off. (chainable)
+
+        :param names: rule name or list of rule names to disable.
+        :param ignoreInvalid: set `true` to ignore errors when rule not found.
+
+        """
+        result = []
+
+        if isinstance(names, str):
+            names = [names]
+
+        for chain in ["core", "block", "inline"]:
+            result.extend(self[chain].ruler.disable(names, True))
+        result.extend(self.inline.ruler2.disable(names, True))
+
+        missed = [name for name in names if name not in result]
+        if missed and not ignoreInvalid:
+            raise ValueError(f"MarkdownIt. Failed to disable unknown rule(s): {missed}")
+        return self
+
+    @contextmanager
+    def reset_rules(self) -> Generator[None, None, None]:
+        """A context manager, that will reset the current enabled rules on exit."""
+        chain_rules = self.get_active_rules()
+        yield
+        for chain, rules in chain_rules.items():
+            if chain != "inline2":
+                self[chain].ruler.enableOnly(rules)
+        self.inline.ruler2.enableOnly(chain_rules["inline2"])
+
+    def add_render_rule(
+        self, name: str, function: Callable[..., Any], fmt: str = "html"
+    ) -> None:
+        """Add a rule for rendering a particular Token type.
+
+        Only applied when ``renderer.__output__ == fmt``
+        """
+        if self.renderer.__output__ == fmt:
+            self.renderer.rules[name] = function.__get__(self.renderer)  # type: ignore
+
+    def use(
+        self, plugin: Callable[..., None], *params: Any, **options: Any
+    ) -> MarkdownIt:
+        """Load specified plugin with given params into current parser instance. (chainable)
+
+        It's just a sugar to call `plugin(md, params)` with curring.
+
+        Example::
+
+            def func(tokens, idx):
+                tokens[idx].content = tokens[idx].content.replace('foo', 'bar')
+            md = MarkdownIt().use(plugin, 'foo_replace', 'text', func)
+
+        """
+        plugin(self, *params, **options)
+        return self
+
+    def parse(self, src: str, env: EnvType | None = None) -> list[Token]:
+        """Parse the source string to a token stream
+
+        :param src: source string
+        :param env: environment sandbox
+
+        Parse input string and return list of block tokens (special token type
+        "inline" will contain list of inline tokens).
+
+        `env` is used to pass data between "distributed" rules and return additional
+        metadata like reference info, needed for the renderer. It also can be used to
+        inject data in specific cases. Usually, you will be ok to pass `{}`,
+        and then pass updated object to renderer.
+        """
+        env = {} if env is None else env
+        if not isinstance(env, MutableMapping):
+            raise TypeError(f"Input data should be a MutableMapping, not {type(env)}")
+        if not isinstance(src, str):
+            raise TypeError(f"Input data should be a string, not {type(src)}")
+        state = StateCore(src, self, env)
+        self.core.process(state)
+        return state.tokens
+
+    def render(self, src: str, env: EnvType | None = None) -> Any:
+        """Render markdown string into html. It does all magic for you :).
+
+        :param src: source string
+        :param env: environment sandbox
+        :returns: The output of the loaded renderer
+
+        `env` can be used to inject additional metadata (`{}` by default).
+        But you will not need it with high probability. See also comment
+        in [[MarkdownIt.parse]].
+        """
+        env = {} if env is None else env
+        return self.renderer.render(self.parse(src, env), self.options, env)
+
+    def parseInline(self, src: str, env: EnvType | None = None) -> list[Token]:
+        """The same as [[MarkdownIt.parse]] but skip all block rules.
+
+        :param src: source string
+        :param env: environment sandbox
+
+        It returns the
+        block tokens list with the single `inline` element, containing parsed inline
+        tokens in `children` property. Also updates `env` object.
+        """
+        env = {} if env is None else env
+        if not isinstance(env, MutableMapping):
+            raise TypeError(f"Input data should be an MutableMapping, not {type(env)}")
+        if not isinstance(src, str):
+            raise TypeError(f"Input data should be a string, not {type(src)}")
+        state = StateCore(src, self, env)
+        state.inlineMode = True
+        self.core.process(state)
+        return state.tokens
+
+    def renderInline(self, src: str, env: EnvType | None = None) -> Any:
+        """Similar to [[MarkdownIt.render]] but for single paragraph content.
+
+        :param src: source string
+        :param env: environment sandbox
+
+        Similar to [[MarkdownIt.render]] but for single paragraph content. Result
+        will NOT be wrapped into `<p>` tags.
+        """
+        env = {} if env is None else env
+        return self.renderer.render(self.parseInline(src, env), self.options, env)
+
+    # link methods
+
+    def validateLink(self, url: str) -> bool:
+        """Validate if the URL link is allowed in output.
+
+        This validator can prohibit more than really needed to prevent XSS.
+        It's a tradeoff to keep code simple and to be secure by default.
+
+        Note: the url should be normalized at this point, and existing entities decoded.
+        """
+        return normalize_url.validateLink(url)
+
+    def normalizeLink(self, url: str) -> str:
+        """Normalize destination URLs in links
+
+        ::
+
+            [label]:   destination   'title'
+                    ^^^^^^^^^^^
+        """
+        return normalize_url.normalizeLink(url)
+
+    def normalizeLinkText(self, link: str) -> str:
+        """Normalize autolink content
+
+        ::
+
+            <destination>
+            ~~~~~~~~~~~
+        """
+        return normalize_url.normalizeLinkText(link)
diff --git a/.venv/Lib/site-packages/markdown_it/parser_block.py b/.venv/Lib/site-packages/markdown_it/parser_block.py
new file mode 100644 (file)
index 0000000..72360f9
--- /dev/null
@@ -0,0 +1,111 @@
+"""Block-level tokenizer."""
+from __future__ import annotations
+
+import logging
+from typing import TYPE_CHECKING, Callable
+
+from . import rules_block
+from .ruler import Ruler
+from .rules_block.state_block import StateBlock
+from .token import Token
+from .utils import EnvType
+
+if TYPE_CHECKING:
+    from markdown_it import MarkdownIt
+
+LOGGER = logging.getLogger(__name__)
+
+
+RuleFuncBlockType = Callable[[StateBlock, int, int, bool], bool]
+"""(state: StateBlock, startLine: int, endLine: int, silent: bool) -> matched: bool)
+
+`silent` disables token generation, useful for lookahead.
+"""
+
+_rules: list[tuple[str, RuleFuncBlockType, list[str]]] = [
+    # First 2 params - rule name & source. Secondary array - list of rules,
+    # which can be terminated by this one.
+    ("table", rules_block.table, ["paragraph", "reference"]),
+    ("code", rules_block.code, []),
+    ("fence", rules_block.fence, ["paragraph", "reference", "blockquote", "list"]),
+    (
+        "blockquote",
+        rules_block.blockquote,
+        ["paragraph", "reference", "blockquote", "list"],
+    ),
+    ("hr", rules_block.hr, ["paragraph", "reference", "blockquote", "list"]),
+    ("list", rules_block.list_block, ["paragraph", "reference", "blockquote"]),
+    ("reference", rules_block.reference, []),
+    ("html_block", rules_block.html_block, ["paragraph", "reference", "blockquote"]),
+    ("heading", rules_block.heading, ["paragraph", "reference", "blockquote"]),
+    ("lheading", rules_block.lheading, []),
+    ("paragraph", rules_block.paragraph, []),
+]
+
+
+class ParserBlock:
+    """
+    ParserBlock#ruler -> Ruler
+
+    [[Ruler]] instance. Keep configuration of block rules.
+    """
+
+    def __init__(self) -> None:
+        self.ruler = Ruler[RuleFuncBlockType]()
+        for name, rule, alt in _rules:
+            self.ruler.push(name, rule, {"alt": alt})
+
+    def tokenize(self, state: StateBlock, startLine: int, endLine: int) -> None:
+        """Generate tokens for input range."""
+        rules = self.ruler.getRules("")
+        line = startLine
+        maxNesting = state.md.options.maxNesting
+        hasEmptyLines = False
+
+        while line < endLine:
+            state.line = line = state.skipEmptyLines(line)
+            if line >= endLine:
+                break
+            if state.sCount[line] < state.blkIndent:
+                # Termination condition for nested calls.
+                # Nested calls currently used for blockquotes & lists
+                break
+            if state.level >= maxNesting:
+                # If nesting level exceeded - skip tail to the end.
+                # That's not ordinary situation and we should not care about content.
+                state.line = endLine
+                break
+
+            # Try all possible rules.
+            # On success, rule should:
+            # - update `state.line`
+            # - update `state.tokens`
+            # - return True
+            for rule in rules:
+                if rule(state, line, endLine, False):
+                    break
+
+            # set state.tight if we had an empty line before current tag
+            # i.e. latest empty line should not count
+            state.tight = not hasEmptyLines
+
+            line = state.line
+
+            # paragraph might "eat" one newline after it in nested lists
+            if (line - 1) < endLine and state.isEmpty(line - 1):
+                hasEmptyLines = True
+
+            if line < endLine and state.isEmpty(line):
+                hasEmptyLines = True
+                line += 1
+                state.line = line
+
+    def parse(
+        self, src: str, md: MarkdownIt, env: EnvType, outTokens: list[Token]
+    ) -> list[Token] | None:
+        """Process input string and push block tokens into `outTokens`."""
+        if not src:
+            return None
+        state = StateBlock(src, md, env, outTokens)
+        self.tokenize(state, state.line, state.lineMax)
+        return state.tokens
diff --git a/.venv/Lib/site-packages/markdown_it/parser_core.py b/.venv/Lib/site-packages/markdown_it/parser_core.py
new file mode 100644 (file)
index 0000000..ca5ab25
--- /dev/null
@@ -0,0 +1,45 @@
+"""
+ * class Core
+ *
+ * Top-level rules executor. Glues block/inline parsers and does intermediate
+ * transformations.
+"""
+from __future__ import annotations
+
+from typing import Callable
+
+from .ruler import Ruler
+from .rules_core import (
+    block,
+    inline,
+    linkify,
+    normalize,
+    replace,
+    smartquotes,
+    text_join,
+)
+from .rules_core.state_core import StateCore
+
+RuleFuncCoreType = Callable[[StateCore], None]
+
+_rules: list[tuple[str, RuleFuncCoreType]] = [
+    ("normalize", normalize),
+    ("block", block),
+    ("inline", inline),
+    ("linkify", linkify),
+    ("replacements", replace),
+    ("smartquotes", smartquotes),
+    ("text_join", text_join),
+]
+
+
+class ParserCore:
+    def __init__(self) -> None:
+        self.ruler = Ruler[RuleFuncCoreType]()
+        for name, rule in _rules:
+            self.ruler.push(name, rule)
+
+    def process(self, state: StateCore) -> None:
+        """Executes core chain rules."""
+        for rule in self.ruler.getRules(""):
+            rule(state)
diff --git a/.venv/Lib/site-packages/markdown_it/parser_inline.py b/.venv/Lib/site-packages/markdown_it/parser_inline.py
new file mode 100644 (file)
index 0000000..0026c38
--- /dev/null
@@ -0,0 +1,147 @@
+"""Tokenizes paragraph content.
+"""
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Callable
+
+from . import rules_inline
+from .ruler import Ruler
+from .rules_inline.state_inline import StateInline
+from .token import Token
+from .utils import EnvType
+
+if TYPE_CHECKING:
+    from markdown_it import MarkdownIt
+
+
+# Parser rules
+RuleFuncInlineType = Callable[[StateInline, bool], bool]
+"""(state: StateInline, silent: bool) -> matched: bool)
+
+`silent` disables token generation, useful for lookahead.
+"""
+_rules: list[tuple[str, RuleFuncInlineType]] = [
+    ("text", rules_inline.text),
+    ("linkify", rules_inline.linkify),
+    ("newline", rules_inline.newline),
+    ("escape", rules_inline.escape),
+    ("backticks", rules_inline.backtick),
+    ("strikethrough", rules_inline.strikethrough.tokenize),
+    ("emphasis", rules_inline.emphasis.tokenize),
+    ("link", rules_inline.link),
+    ("image", rules_inline.image),
+    ("autolink", rules_inline.autolink),
+    ("html_inline", rules_inline.html_inline),
+    ("entity", rules_inline.entity),
+]
+
+# Note `rule2` ruleset was created specifically for emphasis/strikethrough
+# post-processing and may be changed in the future.
+#
+# Don't use this for anything except pairs (plugins working with `balance_pairs`).
+#
+RuleFuncInline2Type = Callable[[StateInline], None]
+_rules2: list[tuple[str, RuleFuncInline2Type]] = [
+    ("balance_pairs", rules_inline.link_pairs),
+    ("strikethrough", rules_inline.strikethrough.postProcess),
+    ("emphasis", rules_inline.emphasis.postProcess),
+    # rules for pairs separate '**' into its own text tokens, which may be left unused,
+    # rule below merges unused segments back with the rest of the text
+    ("fragments_join", rules_inline.fragments_join),
+]
+
+
+class ParserInline:
+    def __init__(self) -> None:
+        self.ruler = Ruler[RuleFuncInlineType]()
+        for name, rule in _rules:
+            self.ruler.push(name, rule)
+        # Second ruler used for post-processing (e.g. in emphasis-like rules)
+        self.ruler2 = Ruler[RuleFuncInline2Type]()
+        for name, rule2 in _rules2:
+            self.ruler2.push(name, rule2)
+
+    def skipToken(self, state: StateInline) -> None:
+        """Skip single token by running all rules in validation mode;
+        returns `True` if any rule reported success
+        """
+        ok = False
+        pos = state.pos
+        rules = self.ruler.getRules("")
+        maxNesting = state.md.options["maxNesting"]
+        cache = state.cache
+
+        if pos in cache:
+            state.pos = cache[pos]
+            return
+
+        if state.level < maxNesting:
+            for rule in rules:
+                #  Increment state.level and decrement it later to limit recursion.
+                # It's harmless to do here, because no tokens are created.
+                # But ideally, we'd need a separate private state variable for this purpose.
+                state.level += 1
+                ok = rule(state, True)
+                state.level -= 1
+                if ok:
+                    break
+        else:
+            # Too much nesting, just skip until the end of the paragraph.
+            #
+            # NOTE: this will cause links to behave incorrectly in the following case,
+            #       when an amount of `[` is exactly equal to `maxNesting + 1`:
+            #
+            #       [[[[[[[[[[[[[[[[[[[[[foo]()
+            #
+            # TODO: remove this workaround when CM standard will allow nested links
+            #       (we can replace it by preventing links from being parsed in
+            #       validation mode)
+            #
+            state.pos = state.posMax
+
+        if not ok:
+            state.pos += 1
+        cache[pos] = state.pos
+
+    def tokenize(self, state: StateInline) -> None:
+        """Generate tokens for input range."""
+        ok = False
+        rules = self.ruler.getRules("")
+        end = state.posMax
+        maxNesting = state.md.options["maxNesting"]
+
+        while state.pos < end:
+            # Try all possible rules.
+            # On success, rule should:
+            #
+            # - update `state.pos`
+            # - update `state.tokens`
+            # - return true
+
+            if state.level < maxNesting:
+                for rule in rules:
+                    ok = rule(state, False)
+                    if ok:
+                        break
+
+            if ok:
+                if state.pos >= end:
+                    break
+                continue
+
+            state.pending += state.src[state.pos]
+            state.pos += 1
+
+        if state.pending:
+            state.pushPending()
+
+    def parse(
+        self, src: str, md: MarkdownIt, env: EnvType, tokens: list[Token]
+    ) -> list[Token]:
+        """Process input string and push inline tokens into `tokens`"""
+        state = StateInline(src, md, env, tokens)
+        self.tokenize(state)
+        rules2 = self.ruler2.getRules("")
+        for rule in rules2:
+            rule(state)
+        return state.tokens
diff --git a/.venv/Lib/site-packages/markdown_it/port.yaml b/.venv/Lib/site-packages/markdown_it/port.yaml
new file mode 100644 (file)
index 0000000..3e289e9
--- /dev/null
@@ -0,0 +1,48 @@
+- package: markdown-it/markdown-it
+  version: 13.0.1
+  commit: e843acc9edad115cbf8cf85e676443f01658be08
+  date: May 3, 2022
+  notes:
+    - Rename variables that use python built-in names, e.g.
+      - `max` -> `maximum`
+      - `len` -> `length`
+      - `str` -> `string`
+    - |
+      Convert JS `for` loops to `while` loops
+      this is generally the main difference between the codes,
+      because in python you can't do e.g. `for {i=1;i<x;i++} {}`
+    - |
+      `env` is a common Python dictionary, and so does not have attribute access to keys,
+      as with JavaScript dictionaries.
+      `options` have attribute access only to core markdownit configuration options
+    - |
+      `Token.attrs` is a dictionary, instead of a list of lists.
+      Upstream the list format is only used to guarantee order: https://github.com/markdown-it/markdown-it/issues/142,
+      but in Python 3.7+ order of dictionaries is guaranteed.
+      One should anyhow use the `attrGet`, `attrSet`, `attrPush` and `attrJoin` methods
+      to manipulate `Token.attrs`, which have an identical signature to those upstream.
+    - Use python version of `charCodeAt`
+    - |
+      Use `str` units instead of `int`s to represent Unicode codepoints.
+      This provides a significant performance boost
+    - |
+      In markdown_it/rules_block/reference.py,
+      record line range in state.env["references"] and add state.env["duplicate_refs"]
+      This is to allow renderers to report on issues regarding references
+    - |
+      The `MarkdownIt.__init__` signature is slightly different for updating options,
+      since you must always specify the config first, e.g.
+      use `MarkdownIt("commonmark", {"html": False})` instead of `MarkdownIt({"html": False})`
+    - The default configuration preset for `MarkdownIt` is "commonmark" not "default"
+    - Allow custom renderer to be passed to `MarkdownIt`
+    - |
+      change render method signatures
+      `func(tokens, idx, options, env, slf)` to
+      `func(self, tokens, idx, options, env)`
+    - |
+      Extensions add render methods by format
+      `MarkdownIt.add_render_rule(name, function, fmt="html")`,
+      rather than `MarkdownIt.renderer.rules[name] = function`
+      and renderers should declare a class property `__output__ = "html"`.
+      This allows for extensibility to more than just HTML renderers
+    - inline tokens in tables are assigned a map (this is helpful for propagation to children)
diff --git a/.venv/Lib/site-packages/markdown_it/presets/__init__.py b/.venv/Lib/site-packages/markdown_it/presets/__init__.py
new file mode 100644 (file)
index 0000000..1e6796a
--- /dev/null
@@ -0,0 +1,28 @@
+__all__ = ("commonmark", "default", "zero", "js_default", "gfm_like")
+
+from . import commonmark, default, zero
+from ..utils import PresetType
+
+js_default = default
+
+
+class gfm_like:  # noqa: N801
+    """GitHub Flavoured Markdown (GFM) like.
+
+    This adds the linkify, table and strikethrough components to CommmonMark.
+
+    Note, it lacks task-list items and raw HTML filtering,
+    to meet the the full GFM specification
+    (see https://github.github.com/gfm/#autolinks-extension-).
+    """
+
+    @staticmethod
+    def make() -> PresetType:
+        config = commonmark.make()
+        config["components"]["core"]["rules"].append("linkify")
+        config["components"]["block"]["rules"].append("table")
+        config["components"]["inline"]["rules"].extend(["strikethrough", "linkify"])
+        config["components"]["inline"]["rules2"].append("strikethrough")
+        config["options"]["linkify"] = True
+        config["options"]["html"] = True
+        return config
diff --git a/.venv/Lib/site-packages/markdown_it/presets/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/presets/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d89e5a5
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/presets/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/presets/__pycache__/commonmark.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/presets/__pycache__/commonmark.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ca42b76
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/presets/__pycache__/commonmark.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/presets/__pycache__/default.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/presets/__pycache__/default.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5401899
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/presets/__pycache__/default.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/presets/__pycache__/zero.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/presets/__pycache__/zero.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8ba89e6
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/presets/__pycache__/zero.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/presets/commonmark.py b/.venv/Lib/site-packages/markdown_it/presets/commonmark.py
new file mode 100644 (file)
index 0000000..3990d43
--- /dev/null
@@ -0,0 +1,74 @@
+"""Commonmark default options.
+
+This differs to presets.default,
+primarily in that it allows HTML and does not enable components:
+
+- block: table
+- inline: strikethrough
+"""
+from ..utils import PresetType
+
+
+def make() -> PresetType:
+    return {
+        "options": {
+            "maxNesting": 20,  # Internal protection, recursion limit
+            "html": True,  # Enable HTML tags in source,
+            # this is just a shorthand for .enable(["html_inline", "html_block"])
+            # used by the linkify rule:
+            "linkify": False,  # autoconvert URL-like texts to links
+            # used by the replacements and smartquotes rules
+            # Enable some language-neutral replacements + quotes beautification
+            "typographer": False,
+            # used by the smartquotes rule:
+            # Double + single quotes replacement pairs, when typographer enabled,
+            # and smartquotes on. Could be either a String or an Array.
+            #
+            # For example, you can use '«»„“' for Russian, '„“‚‘' for German,
+            # and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
+            "quotes": "\u201c\u201d\u2018\u2019",  # /* “”‘’ */
+            # Renderer specific; these options are used directly in the HTML renderer
+            "xhtmlOut": True,  # Use '/' to close single tags (<br />)
+            "breaks": False,  # Convert '\n' in paragraphs into <br>
+            "langPrefix": "language-",  # CSS language prefix for fenced blocks
+            # Highlighter function. Should return escaped HTML,
+            # or '' if the source string is not changed and should be escaped externally.
+            # If result starts with <pre... internal wrapper is skipped.
+            #
+            # function (/*str, lang, attrs*/) { return ''; }
+            #
+            "highlight": None,
+        },
+        "components": {
+            "core": {"rules": ["normalize", "block", "inline", "text_join"]},
+            "block": {
+                "rules": [
+                    "blockquote",
+                    "code",
+                    "fence",
+                    "heading",
+                    "hr",
+                    "html_block",
+                    "lheading",
+                    "list",
+                    "reference",
+                    "paragraph",
+                ]
+            },
+            "inline": {
+                "rules": [
+                    "autolink",
+                    "backticks",
+                    "emphasis",
+                    "entity",
+                    "escape",
+                    "html_inline",
+                    "image",
+                    "link",
+                    "newline",
+                    "text",
+                ],
+                "rules2": ["balance_pairs", "emphasis", "fragments_join"],
+            },
+        },
+    }
diff --git a/.venv/Lib/site-packages/markdown_it/presets/default.py b/.venv/Lib/site-packages/markdown_it/presets/default.py
new file mode 100644 (file)
index 0000000..c9ab902
--- /dev/null
@@ -0,0 +1,35 @@
+"""markdown-it default options."""
+from ..utils import PresetType
+
+
+def make() -> PresetType:
+    return {
+        "options": {
+            "maxNesting": 100,  # Internal protection, recursion limit
+            "html": False,  # Enable HTML tags in source
+            # this is just a shorthand for .disable(["html_inline", "html_block"])
+            # used by the linkify rule:
+            "linkify": False,  # autoconvert URL-like texts to links
+            # used by the replacements and smartquotes rules:
+            # Enable some language-neutral replacements + quotes beautification
+            "typographer": False,
+            # used by the smartquotes rule:
+            # Double + single quotes replacement pairs, when typographer enabled,
+            # and smartquotes on. Could be either a String or an Array.
+            # For example, you can use '«»„“' for Russian, '„“‚‘' for German,
+            # and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
+            "quotes": "\u201c\u201d\u2018\u2019",  # /* “”‘’ */
+            # Renderer specific; these options are used directly in the HTML renderer
+            "xhtmlOut": False,  # Use '/' to close single tags (<br />)
+            "breaks": False,  # Convert '\n' in paragraphs into <br>
+            "langPrefix": "language-",  # CSS language prefix for fenced blocks
+            # Highlighter function. Should return escaped HTML,
+            # or '' if the source string is not changed and should be escaped externally.
+            # If result starts with <pre... internal wrapper is skipped.
+            #
+            # function (/*str, lang, attrs*/) { return ''; }
+            #
+            "highlight": None,
+        },
+        "components": {"core": {}, "block": {}, "inline": {}},
+    }
diff --git a/.venv/Lib/site-packages/markdown_it/presets/zero.py b/.venv/Lib/site-packages/markdown_it/presets/zero.py
new file mode 100644 (file)
index 0000000..2f69a58
--- /dev/null
@@ -0,0 +1,43 @@
+"""
+"Zero" preset, with nothing enabled. Useful for manual configuring of simple
+modes. For example, to parse bold/italic only.
+"""
+from ..utils import PresetType
+
+
+def make() -> PresetType:
+    return {
+        "options": {
+            "maxNesting": 20,  # Internal protection, recursion limit
+            "html": False,  # Enable HTML tags in source
+            # this is just a shorthand for .disable(["html_inline", "html_block"])
+            # used by the linkify rule:
+            "linkify": False,  # autoconvert URL-like texts to links
+            # used by the replacements and smartquotes rules:
+            # Enable some language-neutral replacements + quotes beautification
+            "typographer": False,
+            # used by the smartquotes rule:
+            # Double + single quotes replacement pairs, when typographer enabled,
+            # and smartquotes on. Could be either a String or an Array.
+            # For example, you can use '«»„“' for Russian, '„“‚‘' for German,
+            # and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
+            "quotes": "\u201c\u201d\u2018\u2019",  # /* “”‘’ */
+            # Renderer specific; these options are used directly in the HTML renderer
+            "xhtmlOut": False,  # Use '/' to close single tags (<br />)
+            "breaks": False,  # Convert '\n' in paragraphs into <br>
+            "langPrefix": "language-",  # CSS language prefix for fenced blocks
+            # Highlighter function. Should return escaped HTML,
+            # or '' if the source string is not changed and should be escaped externally.
+            # If result starts with <pre... internal wrapper is skipped.
+            # function (/*str, lang, attrs*/) { return ''; }
+            "highlight": None,
+        },
+        "components": {
+            "core": {"rules": ["normalize", "block", "inline", "text_join"]},
+            "block": {"rules": ["paragraph"]},
+            "inline": {
+                "rules": ["text"],
+                "rules2": ["balance_pairs", "fragments_join"],
+            },
+        },
+    }
diff --git a/.venv/Lib/site-packages/markdown_it/py.typed b/.venv/Lib/site-packages/markdown_it/py.typed
new file mode 100644 (file)
index 0000000..7632ecf
--- /dev/null
@@ -0,0 +1 @@
+# Marker file for PEP 561
diff --git a/.venv/Lib/site-packages/markdown_it/renderer.py b/.venv/Lib/site-packages/markdown_it/renderer.py
new file mode 100644 (file)
index 0000000..7fee9ff
--- /dev/null
@@ -0,0 +1,336 @@
+"""
+class Renderer
+
+Generates HTML from parsed token stream. Each instance has independent
+copy of rules. Those can be rewritten with ease. Also, you can add new
+rules if you create plugin and adds new token types.
+"""
+from __future__ import annotations
+
+from collections.abc import Sequence
+import inspect
+from typing import Any, ClassVar, Protocol
+
+from .common.utils import escapeHtml, unescapeAll
+from .token import Token
+from .utils import EnvType, OptionsDict
+
+
+class RendererProtocol(Protocol):
+    __output__: ClassVar[str]
+
+    def render(
+        self, tokens: Sequence[Token], options: OptionsDict, env: EnvType
+    ) -> Any:
+        ...
+
+
+class RendererHTML(RendererProtocol):
+    """Contains render rules for tokens. Can be updated and extended.
+
+    Example:
+
+    Each rule is called as independent static function with fixed signature:
+
+    ::
+
+        class Renderer:
+            def token_type_name(self, tokens, idx, options, env) {
+                # ...
+                return renderedHTML
+
+    ::
+
+        class CustomRenderer(RendererHTML):
+            def strong_open(self, tokens, idx, options, env):
+                return '<b>'
+            def strong_close(self, tokens, idx, options, env):
+                return '</b>'
+
+        md = MarkdownIt(renderer_cls=CustomRenderer)
+
+        result = md.render(...)
+
+    See https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js
+    for more details and examples.
+    """
+
+    __output__ = "html"
+
+    def __init__(self, parser: Any = None):
+        self.rules = {
+            k: v
+            for k, v in inspect.getmembers(self, predicate=inspect.ismethod)
+            if not (k.startswith("render") or k.startswith("_"))
+        }
+
+    def render(
+        self, tokens: Sequence[Token], options: OptionsDict, env: EnvType
+    ) -> str:
+        """Takes token stream and generates HTML.
+
+        :param tokens: list on block tokens to render
+        :param options: params of parser instance
+        :param env: additional data from parsed input
+
+        """
+        result = ""
+
+        for i, token in enumerate(tokens):
+            if token.type == "inline":
+                if token.children:
+                    result += self.renderInline(token.children, options, env)
+            elif token.type in self.rules:
+                result += self.rules[token.type](tokens, i, options, env)
+            else:
+                result += self.renderToken(tokens, i, options, env)
+
+        return result
+
+    def renderInline(
+        self, tokens: Sequence[Token], options: OptionsDict, env: EnvType
+    ) -> str:
+        """The same as ``render``, but for single token of `inline` type.
+
+        :param tokens: list on block tokens to render
+        :param options: params of parser instance
+        :param env: additional data from parsed input (references, for example)
+        """
+        result = ""
+
+        for i, token in enumerate(tokens):
+            if token.type in self.rules:
+                result += self.rules[token.type](tokens, i, options, env)
+            else:
+                result += self.renderToken(tokens, i, options, env)
+
+        return result
+
+    def renderToken(
+        self,
+        tokens: Sequence[Token],
+        idx: int,
+        options: OptionsDict,
+        env: EnvType,
+    ) -> str:
+        """Default token renderer.
+
+        Can be overridden by custom function
+
+        :param idx: token index to render
+        :param options: params of parser instance
+        """
+        result = ""
+        needLf = False
+        token = tokens[idx]
+
+        # Tight list paragraphs
+        if token.hidden:
+            return ""
+
+        # Insert a newline between hidden paragraph and subsequent opening
+        # block-level tag.
+        #
+        # For example, here we should insert a newline before blockquote:
+        #  - a
+        #    >
+        #
+        if token.block and token.nesting != -1 and idx and tokens[idx - 1].hidden:
+            result += "\n"
+
+        # Add token name, e.g. `<img`
+        result += ("</" if token.nesting == -1 else "<") + token.tag
+
+        # Encode attributes, e.g. `<img src="foo"`
+        result += self.renderAttrs(token)
+
+        # Add a slash for self-closing tags, e.g. `<img src="foo" /`
+        if token.nesting == 0 and options["xhtmlOut"]:
+            result += " /"
+
+        # Check if we need to add a newline after this tag
+        if token.block:
+            needLf = True
+
+            if token.nesting == 1 and (idx + 1 < len(tokens)):
+                nextToken = tokens[idx + 1]
+
+                if nextToken.type == "inline" or nextToken.hidden:  # noqa: SIM114
+                    # Block-level tag containing an inline tag.
+                    #
+                    needLf = False
+
+                elif nextToken.nesting == -1 and nextToken.tag == token.tag:
+                    # Opening tag + closing tag of the same type. E.g. `<li></li>`.
+                    #
+                    needLf = False
+
+        result += ">\n" if needLf else ">"
+
+        return result
+
+    @staticmethod
+    def renderAttrs(token: Token) -> str:
+        """Render token attributes to string."""
+        result = ""
+
+        for key, value in token.attrItems():
+            result += " " + escapeHtml(key) + '="' + escapeHtml(str(value)) + '"'
+
+        return result
+
+    def renderInlineAsText(
+        self,
+        tokens: Sequence[Token] | None,
+        options: OptionsDict,
+        env: EnvType,
+    ) -> str:
+        """Special kludge for image `alt` attributes to conform CommonMark spec.
+
+        Don't try to use it! Spec requires to show `alt` content with stripped markup,
+        instead of simple escaping.
+
+        :param tokens: list on block tokens to render
+        :param options: params of parser instance
+        :param env: additional data from parsed input
+        """
+        result = ""
+
+        for token in tokens or []:
+            if token.type == "text":
+                result += token.content
+            elif token.type == "image":
+                if token.children:
+                    result += self.renderInlineAsText(token.children, options, env)
+            elif token.type == "softbreak":
+                result += "\n"
+
+        return result
+
+    ###################################################
+
+    def code_inline(
+        self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+    ) -> str:
+        token = tokens[idx]
+        return (
+            "<code"
+            + self.renderAttrs(token)
+            + ">"
+            + escapeHtml(tokens[idx].content)
+            + "</code>"
+        )
+
+    def code_block(
+        self,
+        tokens: Sequence[Token],
+        idx: int,
+        options: OptionsDict,
+        env: EnvType,
+    ) -> str:
+        token = tokens[idx]
+
+        return (
+            "<pre"
+            + self.renderAttrs(token)
+            + "><code>"
+            + escapeHtml(tokens[idx].content)
+            + "</code></pre>\n"
+        )
+
+    def fence(
+        self,
+        tokens: Sequence[Token],
+        idx: int,
+        options: OptionsDict,
+        env: EnvType,
+    ) -> str:
+        token = tokens[idx]
+        info = unescapeAll(token.info).strip() if token.info else ""
+        langName = ""
+        langAttrs = ""
+
+        if info:
+            arr = info.split(maxsplit=1)
+            langName = arr[0]
+            if len(arr) == 2:
+                langAttrs = arr[1]
+
+        if options.highlight:
+            highlighted = options.highlight(
+                token.content, langName, langAttrs
+            ) or escapeHtml(token.content)
+        else:
+            highlighted = escapeHtml(token.content)
+
+        if highlighted.startswith("<pre"):
+            return highlighted + "\n"
+
+        # If language exists, inject class gently, without modifying original token.
+        # May be, one day we will add .deepClone() for token and simplify this part, but
+        # now we prefer to keep things local.
+        if info:
+            # Fake token just to render attributes
+            tmpToken = Token(type="", tag="", nesting=0, attrs=token.attrs.copy())
+            tmpToken.attrJoin("class", options.langPrefix + langName)
+
+            return (
+                "<pre><code"
+                + self.renderAttrs(tmpToken)
+                + ">"
+                + highlighted
+                + "</code></pre>\n"
+            )
+
+        return (
+            "<pre><code"
+            + self.renderAttrs(token)
+            + ">"
+            + highlighted
+            + "</code></pre>\n"
+        )
+
+    def image(
+        self,
+        tokens: Sequence[Token],
+        idx: int,
+        options: OptionsDict,
+        env: EnvType,
+    ) -> str:
+        token = tokens[idx]
+
+        # "alt" attr MUST be set, even if empty. Because it's mandatory and
+        # should be placed on proper position for tests.
+        if token.children:
+            token.attrSet("alt", self.renderInlineAsText(token.children, options, env))
+        else:
+            token.attrSet("alt", "")
+
+        return self.renderToken(tokens, idx, options, env)
+
+    def hardbreak(
+        self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+    ) -> str:
+        return "<br />\n" if options.xhtmlOut else "<br>\n"
+
+    def softbreak(
+        self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+    ) -> str:
+        return (
+            ("<br />\n" if options.xhtmlOut else "<br>\n") if options.breaks else "\n"
+        )
+
+    def text(
+        self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+    ) -> str:
+        return escapeHtml(tokens[idx].content)
+
+    def html_block(
+        self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+    ) -> str:
+        return tokens[idx].content
+
+    def html_inline(
+        self, tokens: Sequence[Token], idx: int, options: OptionsDict, env: EnvType
+    ) -> str:
+        return tokens[idx].content
diff --git a/.venv/Lib/site-packages/markdown_it/ruler.py b/.venv/Lib/site-packages/markdown_it/ruler.py
new file mode 100644 (file)
index 0000000..bd8baba
--- /dev/null
@@ -0,0 +1,276 @@
+"""
+class Ruler
+
+Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and
+[[MarkdownIt#inline]] to manage sequences of functions (rules):
+
+- keep rules in defined order
+- assign the name to each rule
+- enable/disable rules
+- add/replace rules
+- allow assign rules to additional named chains (in the same)
+- caching lists of active rules
+
+You will not need use this class directly until write plugins. For simple
+rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and
+[[MarkdownIt.use]].
+"""
+from __future__ import annotations
+
+from collections.abc import Iterable
+from dataclasses import dataclass, field
+from typing import TYPE_CHECKING, Generic, TypedDict, TypeVar
+import warnings
+
+from markdown_it._compat import DATACLASS_KWARGS
+
+from .utils import EnvType
+
+if TYPE_CHECKING:
+    from markdown_it import MarkdownIt
+
+
+class StateBase:
+    def __init__(self, src: str, md: MarkdownIt, env: EnvType):
+        self.src = src
+        self.env = env
+        self.md = md
+
+    @property
+    def src(self) -> str:
+        return self._src
+
+    @src.setter
+    def src(self, value: str) -> None:
+        self._src = value
+        self._srcCharCode: tuple[int, ...] | None = None
+
+    @property
+    def srcCharCode(self) -> tuple[int, ...]:
+        warnings.warn(
+            "StateBase.srcCharCode is deprecated. Use StateBase.src instead.",
+            DeprecationWarning,
+            stacklevel=2,
+        )
+        if self._srcCharCode is None:
+            self._srcCharCode = tuple(ord(c) for c in self._src)
+        return self._srcCharCode
+
+
+class RuleOptionsType(TypedDict, total=False):
+    alt: list[str]
+
+
+RuleFuncTv = TypeVar("RuleFuncTv")
+"""A rule function, whose signature is dependent on the state type."""
+
+
+@dataclass(**DATACLASS_KWARGS)
+class Rule(Generic[RuleFuncTv]):
+    name: str
+    enabled: bool
+    fn: RuleFuncTv = field(repr=False)
+    alt: list[str]
+
+
+class Ruler(Generic[RuleFuncTv]):
+    def __init__(self) -> None:
+        # List of added rules.
+        self.__rules__: list[Rule[RuleFuncTv]] = []
+        # Cached rule chains.
+        # First level - chain name, '' for default.
+        # Second level - diginal anchor for fast filtering by charcodes.
+        self.__cache__: dict[str, list[RuleFuncTv]] | None = None
+
+    def __find__(self, name: str) -> int:
+        """Find rule index by name"""
+        for i, rule in enumerate(self.__rules__):
+            if rule.name == name:
+                return i
+        return -1
+
+    def __compile__(self) -> None:
+        """Build rules lookup cache"""
+        chains = {""}
+        # collect unique names
+        for rule in self.__rules__:
+            if not rule.enabled:
+                continue
+            for name in rule.alt:
+                chains.add(name)
+        self.__cache__ = {}
+        for chain in chains:
+            self.__cache__[chain] = []
+            for rule in self.__rules__:
+                if not rule.enabled:
+                    continue
+                if chain and (chain not in rule.alt):
+                    continue
+                self.__cache__[chain].append(rule.fn)
+
+    def at(
+        self, ruleName: str, fn: RuleFuncTv, options: RuleOptionsType | None = None
+    ) -> None:
+        """Replace rule by name with new function & options.
+
+        :param ruleName: rule name to replace.
+        :param fn: new rule function.
+        :param options: new rule options (not mandatory).
+        :raises: KeyError if name not found
+        """
+        index = self.__find__(ruleName)
+        options = options or {}
+        if index == -1:
+            raise KeyError(f"Parser rule not found: {ruleName}")
+        self.__rules__[index].fn = fn
+        self.__rules__[index].alt = options.get("alt", [])
+        self.__cache__ = None
+
+    def before(
+        self,
+        beforeName: str,
+        ruleName: str,
+        fn: RuleFuncTv,
+        options: RuleOptionsType | None = None,
+    ) -> None:
+        """Add new rule to chain before one with given name.
+
+        :param beforeName: new rule will be added before this one.
+        :param ruleName: new rule will be added before this one.
+        :param fn: new rule function.
+        :param options: new rule options (not mandatory).
+        :raises: KeyError if name not found
+        """
+        index = self.__find__(beforeName)
+        options = options or {}
+        if index == -1:
+            raise KeyError(f"Parser rule not found: {beforeName}")
+        self.__rules__.insert(
+            index, Rule[RuleFuncTv](ruleName, True, fn, options.get("alt", []))
+        )
+        self.__cache__ = None
+
+    def after(
+        self,
+        afterName: str,
+        ruleName: str,
+        fn: RuleFuncTv,
+        options: RuleOptionsType | None = None,
+    ) -> None:
+        """Add new rule to chain after one with given name.
+
+        :param afterName: new rule will be added after this one.
+        :param ruleName: new rule will be added after this one.
+        :param fn: new rule function.
+        :param options: new rule options (not mandatory).
+        :raises: KeyError if name not found
+        """
+        index = self.__find__(afterName)
+        options = options or {}
+        if index == -1:
+            raise KeyError(f"Parser rule not found: {afterName}")
+        self.__rules__.insert(
+            index + 1, Rule[RuleFuncTv](ruleName, True, fn, options.get("alt", []))
+        )
+        self.__cache__ = None
+
+    def push(
+        self, ruleName: str, fn: RuleFuncTv, options: RuleOptionsType | None = None
+    ) -> None:
+        """Push new rule to the end of chain.
+
+        :param ruleName: new rule will be added to the end of chain.
+        :param fn: new rule function.
+        :param options: new rule options (not mandatory).
+
+        """
+        self.__rules__.append(
+            Rule[RuleFuncTv](ruleName, True, fn, (options or {}).get("alt", []))
+        )
+        self.__cache__ = None
+
+    def enable(
+        self, names: str | Iterable[str], ignoreInvalid: bool = False
+    ) -> list[str]:
+        """Enable rules with given names.
+
+        :param names: name or list of rule names to enable.
+        :param ignoreInvalid: ignore errors when rule not found
+        :raises: KeyError if name not found and not ignoreInvalid
+        :return: list of found rule names
+        """
+        if isinstance(names, str):
+            names = [names]
+        result: list[str] = []
+        for name in names:
+            idx = self.__find__(name)
+            if (idx < 0) and ignoreInvalid:
+                continue
+            if (idx < 0) and not ignoreInvalid:
+                raise KeyError(f"Rules manager: invalid rule name {name}")
+            self.__rules__[idx].enabled = True
+            result.append(name)
+        self.__cache__ = None
+        return result
+
+    def enableOnly(
+        self, names: str | Iterable[str], ignoreInvalid: bool = False
+    ) -> list[str]:
+        """Enable rules with given names, and disable everything else.
+
+        :param names: name or list of rule names to enable.
+        :param ignoreInvalid: ignore errors when rule not found
+        :raises: KeyError if name not found and not ignoreInvalid
+        :return: list of found rule names
+        """
+        if isinstance(names, str):
+            names = [names]
+        for rule in self.__rules__:
+            rule.enabled = False
+        return self.enable(names, ignoreInvalid)
+
+    def disable(
+        self, names: str | Iterable[str], ignoreInvalid: bool = False
+    ) -> list[str]:
+        """Disable rules with given names.
+
+        :param names: name or list of rule names to enable.
+        :param ignoreInvalid: ignore errors when rule not found
+        :raises: KeyError if name not found and not ignoreInvalid
+        :return: list of found rule names
+        """
+        if isinstance(names, str):
+            names = [names]
+        result = []
+        for name in names:
+            idx = self.__find__(name)
+            if (idx < 0) and ignoreInvalid:
+                continue
+            if (idx < 0) and not ignoreInvalid:
+                raise KeyError(f"Rules manager: invalid rule name {name}")
+            self.__rules__[idx].enabled = False
+            result.append(name)
+        self.__cache__ = None
+        return result
+
+    def getRules(self, chainName: str = "") -> list[RuleFuncTv]:
+        """Return array of active functions (rules) for given chain name.
+        It analyzes rules configuration, compiles caches if not exists and returns result.
+
+        Default chain name is `''` (empty string). It can't be skipped.
+        That's done intentionally, to keep signature monomorphic for high speed.
+
+        """
+        if self.__cache__ is None:
+            self.__compile__()
+            assert self.__cache__ is not None
+        # Chain can be empty, if rules disabled. But we still have to return Array.
+        return self.__cache__.get(chainName, []) or []
+
+    def get_all_rules(self) -> list[str]:
+        """Return all available rule names."""
+        return [r.name for r in self.__rules__]
+
+    def get_active_rules(self) -> list[str]:
+        """Return the active rule names."""
+        return [r.name for r in self.__rules__ if r.enabled]
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__init__.py b/.venv/Lib/site-packages/markdown_it/rules_block/__init__.py
new file mode 100644 (file)
index 0000000..bcf138d
--- /dev/null
@@ -0,0 +1,27 @@
+__all__ = (
+    "StateBlock",
+    "paragraph",
+    "heading",
+    "lheading",
+    "code",
+    "fence",
+    "hr",
+    "list_block",
+    "reference",
+    "blockquote",
+    "html_block",
+    "table",
+)
+
+from .blockquote import blockquote
+from .code import code
+from .fence import fence
+from .heading import heading
+from .hr import hr
+from .html_block import html_block
+from .lheading import lheading
+from .list import list_block
+from .paragraph import paragraph
+from .reference import reference
+from .state_block import StateBlock
+from .table import table
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4193919
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/blockquote.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/blockquote.cpython-312.pyc
new file mode 100644 (file)
index 0000000..38d1c39
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/blockquote.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/code.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/code.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9a48cde
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/code.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/fence.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/fence.cpython-312.pyc
new file mode 100644 (file)
index 0000000..cf2b907
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/fence.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/heading.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/heading.cpython-312.pyc
new file mode 100644 (file)
index 0000000..41e98e7
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/heading.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/hr.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/hr.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a59ca1a
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/hr.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/html_block.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/html_block.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1819fe3
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/html_block.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/lheading.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/lheading.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d1ea314
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/lheading.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/list.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/list.cpython-312.pyc
new file mode 100644 (file)
index 0000000..37c37de
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/list.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/paragraph.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/paragraph.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6d062ee
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/paragraph.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/reference.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/reference.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b112ae9
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/reference.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/state_block.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/state_block.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9ec0d65
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/state_block.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/table.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/table.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3372142
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_block/__pycache__/table.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/blockquote.py b/.venv/Lib/site-packages/markdown_it/rules_block/blockquote.py
new file mode 100644 (file)
index 0000000..0c9081b
--- /dev/null
@@ -0,0 +1,299 @@
+# Block quotes
+from __future__ import annotations
+
+import logging
+
+from ..common.utils import isStrSpace
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def blockquote(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+    LOGGER.debug(
+        "entering blockquote: %s, %s, %s, %s", state, startLine, endLine, silent
+    )
+
+    oldLineMax = state.lineMax
+    pos = state.bMarks[startLine] + state.tShift[startLine]
+    max = state.eMarks[startLine]
+
+    if state.is_code_block(startLine):
+        return False
+
+    # check the block quote marker
+    try:
+        if state.src[pos] != ">":
+            return False
+    except IndexError:
+        return False
+    pos += 1
+
+    # we know that it's going to be a valid blockquote,
+    # so no point trying to find the end of it in silent mode
+    if silent:
+        return True
+
+    # set offset past spaces and ">"
+    initial = offset = state.sCount[startLine] + 1
+
+    try:
+        second_char: str | None = state.src[pos]
+    except IndexError:
+        second_char = None
+
+    # skip one optional space after '>'
+    if second_char == " ":
+        # ' >   test '
+        #     ^ -- position start of line here:
+        pos += 1
+        initial += 1
+        offset += 1
+        adjustTab = False
+        spaceAfterMarker = True
+    elif second_char == "\t":
+        spaceAfterMarker = True
+
+        if (state.bsCount[startLine] + offset) % 4 == 3:
+            # '  >\t  test '
+            #       ^ -- position start of line here (tab has width==1)
+            pos += 1
+            initial += 1
+            offset += 1
+            adjustTab = False
+        else:
+            # ' >\t  test '
+            #    ^ -- position start of line here + shift bsCount slightly
+            #         to make extra space appear
+            adjustTab = True
+
+    else:
+        spaceAfterMarker = False
+
+    oldBMarks = [state.bMarks[startLine]]
+    state.bMarks[startLine] = pos
+
+    while pos < max:
+        ch = state.src[pos]
+
+        if isStrSpace(ch):
+            if ch == "\t":
+                offset += (
+                    4
+                    - (offset + state.bsCount[startLine] + (1 if adjustTab else 0)) % 4
+                )
+            else:
+                offset += 1
+
+        else:
+            break
+
+        pos += 1
+
+    oldBSCount = [state.bsCount[startLine]]
+    state.bsCount[startLine] = (
+        state.sCount[startLine] + 1 + (1 if spaceAfterMarker else 0)
+    )
+
+    lastLineEmpty = pos >= max
+
+    oldSCount = [state.sCount[startLine]]
+    state.sCount[startLine] = offset - initial
+
+    oldTShift = [state.tShift[startLine]]
+    state.tShift[startLine] = pos - state.bMarks[startLine]
+
+    terminatorRules = state.md.block.ruler.getRules("blockquote")
+
+    oldParentType = state.parentType
+    state.parentType = "blockquote"
+
+    # Search the end of the block
+    #
+    # Block ends with either:
+    #  1. an empty line outside:
+    #     ```
+    #     > test
+    #
+    #     ```
+    #  2. an empty line inside:
+    #     ```
+    #     >
+    #     test
+    #     ```
+    #  3. another tag:
+    #     ```
+    #     > test
+    #      - - -
+    #     ```
+
+    # for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {
+    nextLine = startLine + 1
+    while nextLine < endLine:
+        # check if it's outdented, i.e. it's inside list item and indented
+        # less than said list item:
+        #
+        # ```
+        # 1. anything
+        #    > current blockquote
+        # 2. checking this line
+        # ```
+        isOutdented = state.sCount[nextLine] < state.blkIndent
+
+        pos = state.bMarks[nextLine] + state.tShift[nextLine]
+        max = state.eMarks[nextLine]
+
+        if pos >= max:
+            # Case 1: line is not inside the blockquote, and this line is empty.
+            break
+
+        evaluatesTrue = state.src[pos] == ">" and not isOutdented
+        pos += 1
+        if evaluatesTrue:
+            # This line is inside the blockquote.
+
+            # set offset past spaces and ">"
+            initial = offset = state.sCount[nextLine] + 1
+
+            try:
+                next_char: str | None = state.src[pos]
+            except IndexError:
+                next_char = None
+
+            # skip one optional space after '>'
+            if next_char == " ":
+                # ' >   test '
+                #     ^ -- position start of line here:
+                pos += 1
+                initial += 1
+                offset += 1
+                adjustTab = False
+                spaceAfterMarker = True
+            elif next_char == "\t":
+                spaceAfterMarker = True
+
+                if (state.bsCount[nextLine] + offset) % 4 == 3:
+                    # '  >\t  test '
+                    #       ^ -- position start of line here (tab has width==1)
+                    pos += 1
+                    initial += 1
+                    offset += 1
+                    adjustTab = False
+                else:
+                    # ' >\t  test '
+                    #    ^ -- position start of line here + shift bsCount slightly
+                    #         to make extra space appear
+                    adjustTab = True
+
+            else:
+                spaceAfterMarker = False
+
+            oldBMarks.append(state.bMarks[nextLine])
+            state.bMarks[nextLine] = pos
+
+            while pos < max:
+                ch = state.src[pos]
+
+                if isStrSpace(ch):
+                    if ch == "\t":
+                        offset += (
+                            4
+                            - (
+                                offset
+                                + state.bsCount[nextLine]
+                                + (1 if adjustTab else 0)
+                            )
+                            % 4
+                        )
+                    else:
+                        offset += 1
+                else:
+                    break
+
+                pos += 1
+
+            lastLineEmpty = pos >= max
+
+            oldBSCount.append(state.bsCount[nextLine])
+            state.bsCount[nextLine] = (
+                state.sCount[nextLine] + 1 + (1 if spaceAfterMarker else 0)
+            )
+
+            oldSCount.append(state.sCount[nextLine])
+            state.sCount[nextLine] = offset - initial
+
+            oldTShift.append(state.tShift[nextLine])
+            state.tShift[nextLine] = pos - state.bMarks[nextLine]
+
+            nextLine += 1
+            continue
+
+        # Case 2: line is not inside the blockquote, and the last line was empty.
+        if lastLineEmpty:
+            break
+
+        # Case 3: another tag found.
+        terminate = False
+
+        for terminatorRule in terminatorRules:
+            if terminatorRule(state, nextLine, endLine, True):
+                terminate = True
+                break
+
+        if terminate:
+            # Quirk to enforce "hard termination mode" for paragraphs;
+            # normally if you call `tokenize(state, startLine, nextLine)`,
+            # paragraphs will look below nextLine for paragraph continuation,
+            # but if blockquote is terminated by another tag, they shouldn't
+            state.lineMax = nextLine
+
+            if state.blkIndent != 0:
+                # state.blkIndent was non-zero, we now set it to zero,
+                # so we need to re-calculate all offsets to appear as
+                # if indent wasn't changed
+                oldBMarks.append(state.bMarks[nextLine])
+                oldBSCount.append(state.bsCount[nextLine])
+                oldTShift.append(state.tShift[nextLine])
+                oldSCount.append(state.sCount[nextLine])
+                state.sCount[nextLine] -= state.blkIndent
+
+            break
+
+        oldBMarks.append(state.bMarks[nextLine])
+        oldBSCount.append(state.bsCount[nextLine])
+        oldTShift.append(state.tShift[nextLine])
+        oldSCount.append(state.sCount[nextLine])
+
+        # A negative indentation means that this is a paragraph continuation
+        #
+        state.sCount[nextLine] = -1
+
+        nextLine += 1
+
+    oldIndent = state.blkIndent
+    state.blkIndent = 0
+
+    token = state.push("blockquote_open", "blockquote", 1)
+    token.markup = ">"
+    token.map = lines = [startLine, 0]
+
+    state.md.block.tokenize(state, startLine, nextLine)
+
+    token = state.push("blockquote_close", "blockquote", -1)
+    token.markup = ">"
+
+    state.lineMax = oldLineMax
+    state.parentType = oldParentType
+    lines[1] = state.line
+
+    # Restore original tShift; this might not be necessary since the parser
+    # has already been here, but just to make sure we can do that.
+    for i, item in enumerate(oldTShift):
+        state.bMarks[i + startLine] = oldBMarks[i]
+        state.tShift[i + startLine] = item
+        state.sCount[i + startLine] = oldSCount[i]
+        state.bsCount[i + startLine] = oldBSCount[i]
+
+    state.blkIndent = oldIndent
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/code.py b/.venv/Lib/site-packages/markdown_it/rules_block/code.py
new file mode 100644 (file)
index 0000000..89db9ce
--- /dev/null
@@ -0,0 +1,35 @@
+"""Code block (4 spaces padded)."""
+import logging
+
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def code(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+    LOGGER.debug("entering code: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+    if not state.is_code_block(startLine):
+        return False
+
+    last = nextLine = startLine + 1
+
+    while nextLine < endLine:
+        if state.isEmpty(nextLine):
+            nextLine += 1
+            continue
+
+        if state.is_code_block(nextLine):
+            nextLine += 1
+            last = nextLine
+            continue
+
+        break
+
+    state.line = last
+
+    token = state.push("code_block", "code", 0)
+    token.content = state.getLines(startLine, last, 4 + state.blkIndent, False) + "\n"
+    token.map = [startLine, state.line]
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/fence.py b/.venv/Lib/site-packages/markdown_it/rules_block/fence.py
new file mode 100644 (file)
index 0000000..263f1b8
--- /dev/null
@@ -0,0 +1,101 @@
+# fences (``` lang, ~~~ lang)
+import logging
+
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def fence(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+    LOGGER.debug("entering fence: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+    haveEndMarker = False
+    pos = state.bMarks[startLine] + state.tShift[startLine]
+    maximum = state.eMarks[startLine]
+
+    if state.is_code_block(startLine):
+        return False
+
+    if pos + 3 > maximum:
+        return False
+
+    marker = state.src[pos]
+
+    if marker not in ("~", "`"):
+        return False
+
+    # scan marker length
+    mem = pos
+    pos = state.skipCharsStr(pos, marker)
+
+    length = pos - mem
+
+    if length < 3:
+        return False
+
+    markup = state.src[mem:pos]
+    params = state.src[pos:maximum]
+
+    if marker == "`" and marker in params:
+        return False
+
+    # Since start is found, we can report success here in validation mode
+    if silent:
+        return True
+
+    # search end of block
+    nextLine = startLine
+
+    while True:
+        nextLine += 1
+        if nextLine >= endLine:
+            # unclosed block should be autoclosed by end of document.
+            # also block seems to be autoclosed by end of parent
+            break
+
+        pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]
+        maximum = state.eMarks[nextLine]
+
+        if pos < maximum and state.sCount[nextLine] < state.blkIndent:
+            # non-empty line with negative indent should stop the list:
+            # - ```
+            #  test
+            break
+
+        try:
+            if state.src[pos] != marker:
+                continue
+        except IndexError:
+            break
+
+        if state.is_code_block(nextLine):
+            continue
+
+        pos = state.skipCharsStr(pos, marker)
+
+        # closing code fence must be at least as long as the opening one
+        if pos - mem < length:
+            continue
+
+        # make sure tail has spaces only
+        pos = state.skipSpaces(pos)
+
+        if pos < maximum:
+            continue
+
+        haveEndMarker = True
+        # found!
+        break
+
+    # If a fence has heading spaces, they should be removed from its inner block
+    length = state.sCount[startLine]
+
+    state.line = nextLine + (1 if haveEndMarker else 0)
+
+    token = state.push("fence", "code", 0)
+    token.info = params
+    token.content = state.getLines(startLine + 1, nextLine, length, True)
+    token.markup = markup
+    token.map = [startLine, state.line]
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/heading.py b/.venv/Lib/site-packages/markdown_it/rules_block/heading.py
new file mode 100644 (file)
index 0000000..850ffb5
--- /dev/null
@@ -0,0 +1,68 @@
+""" Atex heading (#, ##, ...) """
+from __future__ import annotations
+
+import logging
+
+from ..common.utils import isStrSpace
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def heading(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+    LOGGER.debug("entering heading: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+    pos = state.bMarks[startLine] + state.tShift[startLine]
+    maximum = state.eMarks[startLine]
+
+    if state.is_code_block(startLine):
+        return False
+
+    ch: str | None = state.src[pos]
+
+    if ch != "#" or pos >= maximum:
+        return False
+
+    # count heading level
+    level = 1
+    pos += 1
+    try:
+        ch = state.src[pos]
+    except IndexError:
+        ch = None
+    while ch == "#" and pos < maximum and level <= 6:
+        level += 1
+        pos += 1
+        try:
+            ch = state.src[pos]
+        except IndexError:
+            ch = None
+
+    if level > 6 or (pos < maximum and not isStrSpace(ch)):
+        return False
+
+    if silent:
+        return True
+
+    # Let's cut tails like '    ###  ' from the end of string
+
+    maximum = state.skipSpacesBack(maximum, pos)
+    tmp = state.skipCharsStrBack(maximum, "#", pos)
+    if tmp > pos and isStrSpace(state.src[tmp - 1]):
+        maximum = tmp
+
+    state.line = startLine + 1
+
+    token = state.push("heading_open", "h" + str(level), 1)
+    token.markup = "########"[:level]
+    token.map = [startLine, state.line]
+
+    token = state.push("inline", "", 0)
+    token.content = state.src[pos:maximum].strip()
+    token.map = [startLine, state.line]
+    token.children = []
+
+    token = state.push("heading_close", "h" + str(level), -1)
+    token.markup = "########"[:level]
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/hr.py b/.venv/Lib/site-packages/markdown_it/rules_block/hr.py
new file mode 100644 (file)
index 0000000..16df05f
--- /dev/null
@@ -0,0 +1,55 @@
+"""Horizontal rule
+
+At least 3 of these characters on a line * - _
+"""
+import logging
+
+from ..common.utils import isStrSpace
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def hr(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+    LOGGER.debug("entering hr: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+    pos = state.bMarks[startLine] + state.tShift[startLine]
+    maximum = state.eMarks[startLine]
+
+    if state.is_code_block(startLine):
+        return False
+
+    try:
+        marker = state.src[pos]
+    except IndexError:
+        return False
+    pos += 1
+
+    # Check hr marker
+    if marker not in ("*", "-", "_"):
+        return False
+
+    # markers can be mixed with spaces, but there should be at least 3 of them
+
+    cnt = 1
+    while pos < maximum:
+        ch = state.src[pos]
+        pos += 1
+        if ch != marker and not isStrSpace(ch):
+            return False
+        if ch == marker:
+            cnt += 1
+
+    if cnt < 3:
+        return False
+
+    if silent:
+        return True
+
+    state.line = startLine + 1
+
+    token = state.push("hr", "hr", 0)
+    token.map = [startLine, state.line]
+    token.markup = marker * (cnt + 1)
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/html_block.py b/.venv/Lib/site-packages/markdown_it/rules_block/html_block.py
new file mode 100644 (file)
index 0000000..3d43f6e
--- /dev/null
@@ -0,0 +1,90 @@
+# HTML block
+from __future__ import annotations
+
+import logging
+import re
+
+from ..common.html_blocks import block_names
+from ..common.html_re import HTML_OPEN_CLOSE_TAG_STR
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+# An array of opening and corresponding closing sequences for html tags,
+# last argument defines whether it can terminate a paragraph or not
+HTML_SEQUENCES: list[tuple[re.Pattern[str], re.Pattern[str], bool]] = [
+    (
+        re.compile(r"^<(script|pre|style|textarea)(?=(\s|>|$))", re.IGNORECASE),
+        re.compile(r"<\/(script|pre|style|textarea)>", re.IGNORECASE),
+        True,
+    ),
+    (re.compile(r"^<!--"), re.compile(r"-->"), True),
+    (re.compile(r"^<\?"), re.compile(r"\?>"), True),
+    (re.compile(r"^<![A-Z]"), re.compile(r">"), True),
+    (re.compile(r"^<!\[CDATA\["), re.compile(r"\]\]>"), True),
+    (
+        re.compile("^</?(" + "|".join(block_names) + ")(?=(\\s|/?>|$))", re.IGNORECASE),
+        re.compile(r"^$"),
+        True,
+    ),
+    (re.compile(HTML_OPEN_CLOSE_TAG_STR + "\\s*$"), re.compile(r"^$"), False),
+]
+
+
+def html_block(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+    LOGGER.debug(
+        "entering html_block: %s, %s, %s, %s", state, startLine, endLine, silent
+    )
+    pos = state.bMarks[startLine] + state.tShift[startLine]
+    maximum = state.eMarks[startLine]
+
+    if state.is_code_block(startLine):
+        return False
+
+    if not state.md.options.get("html", None):
+        return False
+
+    if state.src[pos] != "<":
+        return False
+
+    lineText = state.src[pos:maximum]
+
+    html_seq = None
+    for HTML_SEQUENCE in HTML_SEQUENCES:
+        if HTML_SEQUENCE[0].search(lineText):
+            html_seq = HTML_SEQUENCE
+            break
+
+    if not html_seq:
+        return False
+
+    if silent:
+        # true if this sequence can be a terminator, false otherwise
+        return html_seq[2]
+
+    nextLine = startLine + 1
+
+    # If we are here - we detected HTML block.
+    # Let's roll down till block end.
+    if not html_seq[1].search(lineText):
+        while nextLine < endLine:
+            if state.sCount[nextLine] < state.blkIndent:
+                break
+
+            pos = state.bMarks[nextLine] + state.tShift[nextLine]
+            maximum = state.eMarks[nextLine]
+            lineText = state.src[pos:maximum]
+
+            if html_seq[1].search(lineText):
+                if len(lineText) != 0:
+                    nextLine += 1
+                break
+            nextLine += 1
+
+    state.line = nextLine
+
+    token = state.push("html_block", "", 0)
+    token.map = [startLine, nextLine]
+    token.content = state.getLines(startLine, nextLine, state.blkIndent, True)
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/lheading.py b/.venv/Lib/site-packages/markdown_it/rules_block/lheading.py
new file mode 100644 (file)
index 0000000..3522207
--- /dev/null
@@ -0,0 +1,86 @@
+# lheading (---, ==)
+import logging
+
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def lheading(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+    LOGGER.debug("entering lheading: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+    level = None
+    nextLine = startLine + 1
+    ruler = state.md.block.ruler
+    terminatorRules = ruler.getRules("paragraph")
+
+    if state.is_code_block(startLine):
+        return False
+
+    oldParentType = state.parentType
+    state.parentType = "paragraph"  # use paragraph to match terminatorRules
+
+    # jump line-by-line until empty one or EOF
+    while nextLine < endLine and not state.isEmpty(nextLine):
+        # this would be a code block normally, but after paragraph
+        # it's considered a lazy continuation regardless of what's there
+        if state.sCount[nextLine] - state.blkIndent > 3:
+            nextLine += 1
+            continue
+
+        # Check for underline in setext header
+        if state.sCount[nextLine] >= state.blkIndent:
+            pos = state.bMarks[nextLine] + state.tShift[nextLine]
+            maximum = state.eMarks[nextLine]
+
+            if pos < maximum:
+                marker = state.src[pos]
+
+                if marker in ("-", "="):
+                    pos = state.skipCharsStr(pos, marker)
+                    pos = state.skipSpaces(pos)
+
+                    # /* = */
+                    if pos >= maximum:
+                        level = 1 if marker == "=" else 2
+                        break
+
+        # quirk for blockquotes, this line should already be checked by that rule
+        if state.sCount[nextLine] < 0:
+            nextLine += 1
+            continue
+
+        # Some tags can terminate paragraph without empty line.
+        terminate = False
+        for terminatorRule in terminatorRules:
+            if terminatorRule(state, nextLine, endLine, True):
+                terminate = True
+                break
+        if terminate:
+            break
+
+        nextLine += 1
+
+    if not level:
+        # Didn't find valid underline
+        return False
+
+    content = state.getLines(startLine, nextLine, state.blkIndent, False).strip()
+
+    state.line = nextLine + 1
+
+    token = state.push("heading_open", "h" + str(level), 1)
+    token.markup = marker
+    token.map = [startLine, state.line]
+
+    token = state.push("inline", "", 0)
+    token.content = content
+    token.map = [startLine, state.line - 1]
+    token.children = []
+
+    token = state.push("heading_close", "h" + str(level), -1)
+    token.markup = marker
+
+    state.parentType = oldParentType
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/list.py b/.venv/Lib/site-packages/markdown_it/rules_block/list.py
new file mode 100644 (file)
index 0000000..d8070d7
--- /dev/null
@@ -0,0 +1,345 @@
+# Lists
+import logging
+
+from ..common.utils import isStrSpace
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+# Search `[-+*][\n ]`, returns next pos after marker on success
+# or -1 on fail.
+def skipBulletListMarker(state: StateBlock, startLine: int) -> int:
+    pos = state.bMarks[startLine] + state.tShift[startLine]
+    maximum = state.eMarks[startLine]
+
+    try:
+        marker = state.src[pos]
+    except IndexError:
+        return -1
+    pos += 1
+
+    if marker not in ("*", "-", "+"):
+        return -1
+
+    if pos < maximum:
+        ch = state.src[pos]
+
+        if not isStrSpace(ch):
+            # " -test " - is not a list item
+            return -1
+
+    return pos
+
+
+# Search `\d+[.)][\n ]`, returns next pos after marker on success
+# or -1 on fail.
+def skipOrderedListMarker(state: StateBlock, startLine: int) -> int:
+    start = state.bMarks[startLine] + state.tShift[startLine]
+    pos = start
+    maximum = state.eMarks[startLine]
+
+    # List marker should have at least 2 chars (digit + dot)
+    if pos + 1 >= maximum:
+        return -1
+
+    ch = state.src[pos]
+    pos += 1
+
+    ch_ord = ord(ch)
+    # /* 0 */  /* 9 */
+    if ch_ord < 0x30 or ch_ord > 0x39:
+        return -1
+
+    while True:
+        # EOL -> fail
+        if pos >= maximum:
+            return -1
+
+        ch = state.src[pos]
+        pos += 1
+
+        # /* 0 */  /* 9 */
+        ch_ord = ord(ch)
+        if ch_ord >= 0x30 and ch_ord <= 0x39:
+            # List marker should have no more than 9 digits
+            # (prevents integer overflow in browsers)
+            if pos - start >= 10:
+                return -1
+
+            continue
+
+        # found valid marker
+        if ch in (")", "."):
+            break
+
+        return -1
+
+    if pos < maximum:
+        ch = state.src[pos]
+
+        if not isStrSpace(ch):
+            # " 1.test " - is not a list item
+            return -1
+
+    return pos
+
+
+def markTightParagraphs(state: StateBlock, idx: int) -> None:
+    level = state.level + 2
+
+    i = idx + 2
+    length = len(state.tokens) - 2
+    while i < length:
+        if state.tokens[i].level == level and state.tokens[i].type == "paragraph_open":
+            state.tokens[i + 2].hidden = True
+            state.tokens[i].hidden = True
+            i += 2
+        i += 1
+
+
+def list_block(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+    LOGGER.debug("entering list: %s, %s, %s, %s", state, startLine, endLine, silent)
+
+    isTerminatingParagraph = False
+    tight = True
+
+    if state.is_code_block(startLine):
+        return False
+
+    # Special case:
+    #  - item 1
+    #   - item 2
+    #    - item 3
+    #     - item 4
+    #      - this one is a paragraph continuation
+    if (
+        state.listIndent >= 0
+        and state.sCount[startLine] - state.listIndent >= 4
+        and state.sCount[startLine] < state.blkIndent
+    ):
+        return False
+
+    # limit conditions when list can interrupt
+    # a paragraph (validation mode only)
+    # Next list item should still terminate previous list item
+    #
+    # This code can fail if plugins use blkIndent as well as lists,
+    # but I hope the spec gets fixed long before that happens.
+    #
+    if (
+        silent
+        and state.parentType == "paragraph"
+        and state.sCount[startLine] >= state.blkIndent
+    ):
+        isTerminatingParagraph = True
+
+    # Detect list type and position after marker
+    posAfterMarker = skipOrderedListMarker(state, startLine)
+    if posAfterMarker >= 0:
+        isOrdered = True
+        start = state.bMarks[startLine] + state.tShift[startLine]
+        markerValue = int(state.src[start : posAfterMarker - 1])
+
+        # If we're starting a new ordered list right after
+        # a paragraph, it should start with 1.
+        if isTerminatingParagraph and markerValue != 1:
+            return False
+    else:
+        posAfterMarker = skipBulletListMarker(state, startLine)
+        if posAfterMarker >= 0:
+            isOrdered = False
+        else:
+            return False
+
+    # If we're starting a new unordered list right after
+    # a paragraph, first line should not be empty.
+    if (
+        isTerminatingParagraph
+        and state.skipSpaces(posAfterMarker) >= state.eMarks[startLine]
+    ):
+        return False
+
+    # We should terminate list on style change. Remember first one to compare.
+    markerChar = state.src[posAfterMarker - 1]
+
+    # For validation mode we can terminate immediately
+    if silent:
+        return True
+
+    # Start list
+    listTokIdx = len(state.tokens)
+
+    if isOrdered:
+        token = state.push("ordered_list_open", "ol", 1)
+        if markerValue != 1:
+            token.attrs = {"start": markerValue}
+
+    else:
+        token = state.push("bullet_list_open", "ul", 1)
+
+    token.map = listLines = [startLine, 0]
+    token.markup = markerChar
+
+    #
+    # Iterate list items
+    #
+
+    nextLine = startLine
+    prevEmptyEnd = False
+    terminatorRules = state.md.block.ruler.getRules("list")
+
+    oldParentType = state.parentType
+    state.parentType = "list"
+
+    while nextLine < endLine:
+        pos = posAfterMarker
+        maximum = state.eMarks[nextLine]
+
+        initial = offset = (
+            state.sCount[nextLine]
+            + posAfterMarker
+            - (state.bMarks[startLine] + state.tShift[startLine])
+        )
+
+        while pos < maximum:
+            ch = state.src[pos]
+
+            if ch == "\t":
+                offset += 4 - (offset + state.bsCount[nextLine]) % 4
+            elif ch == " ":
+                offset += 1
+            else:
+                break
+
+            pos += 1
+
+        contentStart = pos
+
+        # trimming space in "-    \n  3" case, indent is 1 here
+        indentAfterMarker = 1 if contentStart >= maximum else offset - initial
+
+        # If we have more than 4 spaces, the indent is 1
+        # (the rest is just indented code block)
+        if indentAfterMarker > 4:
+            indentAfterMarker = 1
+
+        # "  -  test"
+        #  ^^^^^ - calculating total length of this thing
+        indent = initial + indentAfterMarker
+
+        # Run subparser & write tokens
+        token = state.push("list_item_open", "li", 1)
+        token.markup = markerChar
+        token.map = itemLines = [startLine, 0]
+        if isOrdered:
+            token.info = state.src[start : posAfterMarker - 1]
+
+        # change current state, then restore it after parser subcall
+        oldTight = state.tight
+        oldTShift = state.tShift[startLine]
+        oldSCount = state.sCount[startLine]
+
+        #  - example list
+        # ^ listIndent position will be here
+        #   ^ blkIndent position will be here
+        #
+        oldListIndent = state.listIndent
+        state.listIndent = state.blkIndent
+        state.blkIndent = indent
+
+        state.tight = True
+        state.tShift[startLine] = contentStart - state.bMarks[startLine]
+        state.sCount[startLine] = offset
+
+        if contentStart >= maximum and state.isEmpty(startLine + 1):
+            # workaround for this case
+            # (list item is empty, list terminates before "foo"):
+            # ~~~~~~~~
+            #   -
+            #
+            #     foo
+            # ~~~~~~~~
+            state.line = min(state.line + 2, endLine)
+        else:
+            # NOTE in list.js this was:
+            # state.md.block.tokenize(state, startLine, endLine, True)
+            # but  tokeniz does not take the final parameter
+            state.md.block.tokenize(state, startLine, endLine)
+
+        # If any of list item is tight, mark list as tight
+        if (not state.tight) or prevEmptyEnd:
+            tight = False
+
+        # Item become loose if finish with empty line,
+        # but we should filter last element, because it means list finish
+        prevEmptyEnd = (state.line - startLine) > 1 and state.isEmpty(state.line - 1)
+
+        state.blkIndent = state.listIndent
+        state.listIndent = oldListIndent
+        state.tShift[startLine] = oldTShift
+        state.sCount[startLine] = oldSCount
+        state.tight = oldTight
+
+        token = state.push("list_item_close", "li", -1)
+        token.markup = markerChar
+
+        nextLine = startLine = state.line
+        itemLines[1] = nextLine
+
+        if nextLine >= endLine:
+            break
+
+        contentStart = state.bMarks[startLine]
+
+        #
+        # Try to check if list is terminated or continued.
+        #
+        if state.sCount[nextLine] < state.blkIndent:
+            break
+
+        if state.is_code_block(startLine):
+            break
+
+        # fail if terminating block found
+        terminate = False
+        for terminatorRule in terminatorRules:
+            if terminatorRule(state, nextLine, endLine, True):
+                terminate = True
+                break
+
+        if terminate:
+            break
+
+        # fail if list has another type
+        if isOrdered:
+            posAfterMarker = skipOrderedListMarker(state, nextLine)
+            if posAfterMarker < 0:
+                break
+            start = state.bMarks[nextLine] + state.tShift[nextLine]
+        else:
+            posAfterMarker = skipBulletListMarker(state, nextLine)
+            if posAfterMarker < 0:
+                break
+
+        if markerChar != state.src[posAfterMarker - 1]:
+            break
+
+    # Finalize list
+    if isOrdered:
+        token = state.push("ordered_list_close", "ol", -1)
+    else:
+        token = state.push("bullet_list_close", "ul", -1)
+
+    token.markup = markerChar
+
+    listLines[1] = nextLine
+    state.line = nextLine
+
+    state.parentType = oldParentType
+
+    # mark paragraphs tight if needed
+    if tight:
+        markTightParagraphs(state, listTokIdx)
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/paragraph.py b/.venv/Lib/site-packages/markdown_it/rules_block/paragraph.py
new file mode 100644 (file)
index 0000000..5388a4b
--- /dev/null
@@ -0,0 +1,65 @@
+"""Paragraph."""
+import logging
+
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def paragraph(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+    LOGGER.debug(
+        "entering paragraph: %s, %s, %s, %s", state, startLine, endLine, silent
+    )
+
+    nextLine = startLine + 1
+    ruler = state.md.block.ruler
+    terminatorRules = ruler.getRules("paragraph")
+    endLine = state.lineMax
+
+    oldParentType = state.parentType
+    state.parentType = "paragraph"
+
+    # jump line-by-line until empty one or EOF
+    while nextLine < endLine:
+        if state.isEmpty(nextLine):
+            break
+        # this would be a code block normally, but after paragraph
+        # it's considered a lazy continuation regardless of what's there
+        if state.sCount[nextLine] - state.blkIndent > 3:
+            nextLine += 1
+            continue
+
+        # quirk for blockquotes, this line should already be checked by that rule
+        if state.sCount[nextLine] < 0:
+            nextLine += 1
+            continue
+
+        # Some tags can terminate paragraph without empty line.
+        terminate = False
+        for terminatorRule in terminatorRules:
+            if terminatorRule(state, nextLine, endLine, True):
+                terminate = True
+                break
+
+        if terminate:
+            break
+
+        nextLine += 1
+
+    content = state.getLines(startLine, nextLine, state.blkIndent, False).strip()
+
+    state.line = nextLine
+
+    token = state.push("paragraph_open", "p", 1)
+    token.map = [startLine, state.line]
+
+    token = state.push("inline", "", 0)
+    token.content = content
+    token.map = [startLine, state.line]
+    token.children = []
+
+    token = state.push("paragraph_close", "p", -1)
+
+    state.parentType = oldParentType
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/reference.py b/.venv/Lib/site-packages/markdown_it/rules_block/reference.py
new file mode 100644 (file)
index 0000000..b77944b
--- /dev/null
@@ -0,0 +1,215 @@
+import logging
+
+from ..common.utils import charCodeAt, isSpace, normalizeReference
+from .state_block import StateBlock
+
+LOGGER = logging.getLogger(__name__)
+
+
+def reference(state: StateBlock, startLine: int, _endLine: int, silent: bool) -> bool:
+    LOGGER.debug(
+        "entering reference: %s, %s, %s, %s", state, startLine, _endLine, silent
+    )
+
+    lines = 0
+    pos = state.bMarks[startLine] + state.tShift[startLine]
+    maximum = state.eMarks[startLine]
+    nextLine = startLine + 1
+
+    if state.is_code_block(startLine):
+        return False
+
+    if state.src[pos] != "[":
+        return False
+
+    # Simple check to quickly interrupt scan on [link](url) at the start of line.
+    # Can be useful on practice: https:#github.com/markdown-it/markdown-it/issues/54
+    while pos < maximum:
+        # /* ] */  /* \ */  /* : */
+        if state.src[pos] == "]" and state.src[pos - 1] != "\\":
+            if pos + 1 == maximum:
+                return False
+            if state.src[pos + 1] != ":":
+                return False
+            break
+        pos += 1
+
+    endLine = state.lineMax
+
+    # jump line-by-line until empty one or EOF
+    terminatorRules = state.md.block.ruler.getRules("reference")
+
+    oldParentType = state.parentType
+    state.parentType = "reference"
+
+    while nextLine < endLine and not state.isEmpty(nextLine):
+        # this would be a code block normally, but after paragraph
+        # it's considered a lazy continuation regardless of what's there
+        if state.sCount[nextLine] - state.blkIndent > 3:
+            nextLine += 1
+            continue
+
+        # quirk for blockquotes, this line should already be checked by that rule
+        if state.sCount[nextLine] < 0:
+            nextLine += 1
+            continue
+
+        # Some tags can terminate paragraph without empty line.
+        terminate = False
+        for terminatorRule in terminatorRules:
+            if terminatorRule(state, nextLine, endLine, True):
+                terminate = True
+                break
+
+        if terminate:
+            break
+
+        nextLine += 1
+
+    string = state.getLines(startLine, nextLine, state.blkIndent, False).strip()
+    maximum = len(string)
+
+    labelEnd = None
+    pos = 1
+    while pos < maximum:
+        ch = charCodeAt(string, pos)
+        if ch == 0x5B:  # /* [ */
+            return False
+        elif ch == 0x5D:  # /* ] */
+            labelEnd = pos
+            break
+        elif ch == 0x0A:  # /* \n */
+            lines += 1
+        elif ch == 0x5C:  # /* \ */
+            pos += 1
+            if pos < maximum and charCodeAt(string, pos) == 0x0A:
+                lines += 1
+        pos += 1
+
+    if (
+        labelEnd is None or labelEnd < 0 or charCodeAt(string, labelEnd + 1) != 0x3A
+    ):  # /* : */
+        return False
+
+    # [label]:   destination   'title'
+    #         ^^^ skip optional whitespace here
+    pos = labelEnd + 2
+    while pos < maximum:
+        ch = charCodeAt(string, pos)
+        if ch == 0x0A:
+            lines += 1
+        elif isSpace(ch):
+            pass
+        else:
+            break
+        pos += 1
+
+    # [label]:   destination   'title'
+    #            ^^^^^^^^^^^ parse this
+    res = state.md.helpers.parseLinkDestination(string, pos, maximum)
+    if not res.ok:
+        return False
+
+    href = state.md.normalizeLink(res.str)
+    if not state.md.validateLink(href):
+        return False
+
+    pos = res.pos
+    lines += res.lines
+
+    # save cursor state, we could require to rollback later
+    destEndPos = pos
+    destEndLineNo = lines
+
+    # [label]:   destination   'title'
+    #                       ^^^ skipping those spaces
+    start = pos
+    while pos < maximum:
+        ch = charCodeAt(string, pos)
+        if ch == 0x0A:
+            lines += 1
+        elif isSpace(ch):
+            pass
+        else:
+            break
+        pos += 1
+
+    # [label]:   destination   'title'
+    #                          ^^^^^^^ parse this
+    res = state.md.helpers.parseLinkTitle(string, pos, maximum)
+    if pos < maximum and start != pos and res.ok:
+        title = res.str
+        pos = res.pos
+        lines += res.lines
+    else:
+        title = ""
+        pos = destEndPos
+        lines = destEndLineNo
+
+    # skip trailing spaces until the rest of the line
+    while pos < maximum:
+        ch = charCodeAt(string, pos)
+        if not isSpace(ch):
+            break
+        pos += 1
+
+    if pos < maximum and charCodeAt(string, pos) != 0x0A and title:
+        # garbage at the end of the line after title,
+        # but it could still be a valid reference if we roll back
+        title = ""
+        pos = destEndPos
+        lines = destEndLineNo
+        while pos < maximum:
+            ch = charCodeAt(string, pos)
+            if not isSpace(ch):
+                break
+            pos += 1
+
+    if pos < maximum and charCodeAt(string, pos) != 0x0A:
+        # garbage at the end of the line
+        return False
+
+    label = normalizeReference(string[1:labelEnd])
+    if not label:
+        # CommonMark 0.20 disallows empty labels
+        return False
+
+    # Reference can not terminate anything. This check is for safety only.
+    if silent:
+        return True
+
+    if "references" not in state.env:
+        state.env["references"] = {}
+
+    state.line = startLine + lines + 1
+
+    # note, this is not part of markdown-it JS, but is useful for renderers
+    if state.md.options.get("inline_definitions", False):
+        token = state.push("definition", "", 0)
+        token.meta = {
+            "id": label,
+            "title": title,
+            "url": href,
+            "label": string[1:labelEnd],
+        }
+        token.map = [startLine, state.line]
+
+    if label not in state.env["references"]:
+        state.env["references"][label] = {
+            "title": title,
+            "href": href,
+            "map": [startLine, state.line],
+        }
+    else:
+        state.env.setdefault("duplicate_refs", []).append(
+            {
+                "title": title,
+                "href": href,
+                "label": label,
+                "map": [startLine, state.line],
+            }
+        )
+
+    state.parentType = oldParentType
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/state_block.py b/.venv/Lib/site-packages/markdown_it/rules_block/state_block.py
new file mode 100644 (file)
index 0000000..445ad26
--- /dev/null
@@ -0,0 +1,261 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Literal
+
+from ..common.utils import isStrSpace
+from ..ruler import StateBase
+from ..token import Token
+from ..utils import EnvType
+
+if TYPE_CHECKING:
+    from markdown_it.main import MarkdownIt
+
+
+class StateBlock(StateBase):
+    def __init__(
+        self, src: str, md: MarkdownIt, env: EnvType, tokens: list[Token]
+    ) -> None:
+        self.src = src
+
+        # link to parser instance
+        self.md = md
+
+        self.env = env
+
+        #
+        # Internal state variables
+        #
+
+        self.tokens = tokens
+
+        self.bMarks: list[int] = []  # line begin offsets for fast jumps
+        self.eMarks: list[int] = []  # line end offsets for fast jumps
+        # offsets of the first non-space characters (tabs not expanded)
+        self.tShift: list[int] = []
+        self.sCount: list[int] = []  # indents for each line (tabs expanded)
+
+        # An amount of virtual spaces (tabs expanded) between beginning
+        # of each line (bMarks) and real beginning of that line.
+        #
+        # It exists only as a hack because blockquotes override bMarks
+        # losing information in the process.
+        #
+        # It's used only when expanding tabs, you can think about it as
+        # an initial tab length, e.g. bsCount=21 applied to string `\t123`
+        # means first tab should be expanded to 4-21%4 === 3 spaces.
+        #
+        self.bsCount: list[int] = []
+
+        # block parser variables
+        self.blkIndent = 0  # required block content indent (for example, if we are
+        # inside a list, it would be positioned after list marker)
+        self.line = 0  # line index in src
+        self.lineMax = 0  # lines count
+        self.tight = False  # loose/tight mode for lists
+        self.ddIndent = -1  # indent of the current dd block (-1 if there isn't any)
+        self.listIndent = -1  # indent of the current list block (-1 if there isn't any)
+
+        # can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'
+        # used in lists to determine if they interrupt a paragraph
+        self.parentType = "root"
+
+        self.level = 0
+
+        # renderer
+        self.result = ""
+
+        # Create caches
+        # Generate markers.
+        indent_found = False
+
+        start = pos = indent = offset = 0
+        length = len(self.src)
+
+        for pos, character in enumerate(self.src):
+            if not indent_found:
+                if isStrSpace(character):
+                    indent += 1
+
+                    if character == "\t":
+                        offset += 4 - offset % 4
+                    else:
+                        offset += 1
+                    continue
+                else:
+                    indent_found = True
+
+            if character == "\n" or pos == length - 1:
+                if character != "\n":
+                    pos += 1
+                self.bMarks.append(start)
+                self.eMarks.append(pos)
+                self.tShift.append(indent)
+                self.sCount.append(offset)
+                self.bsCount.append(0)
+
+                indent_found = False
+                indent = 0
+                offset = 0
+                start = pos + 1
+
+        # Push fake entry to simplify cache bounds checks
+        self.bMarks.append(length)
+        self.eMarks.append(length)
+        self.tShift.append(0)
+        self.sCount.append(0)
+        self.bsCount.append(0)
+
+        self.lineMax = len(self.bMarks) - 1  # don't count last fake line
+
+        # pre-check if code blocks are enabled, to speed up is_code_block method
+        self._code_enabled = "code" in self.md["block"].ruler.get_active_rules()
+
+    def __repr__(self) -> str:
+        return (
+            f"{self.__class__.__name__}"
+            f"(line={self.line},level={self.level},tokens={len(self.tokens)})"
+        )
+
+    def push(self, ttype: str, tag: str, nesting: Literal[-1, 0, 1]) -> Token:
+        """Push new token to "stream"."""
+        token = Token(ttype, tag, nesting)
+        token.block = True
+        if nesting < 0:
+            self.level -= 1  # closing tag
+        token.level = self.level
+        if nesting > 0:
+            self.level += 1  # opening tag
+        self.tokens.append(token)
+        return token
+
+    def isEmpty(self, line: int) -> bool:
+        """."""
+        return (self.bMarks[line] + self.tShift[line]) >= self.eMarks[line]
+
+    def skipEmptyLines(self, from_pos: int) -> int:
+        """."""
+        while from_pos < self.lineMax:
+            try:
+                if (self.bMarks[from_pos] + self.tShift[from_pos]) < self.eMarks[
+                    from_pos
+                ]:
+                    break
+            except IndexError:
+                pass
+            from_pos += 1
+        return from_pos
+
+    def skipSpaces(self, pos: int) -> int:
+        """Skip spaces from given position."""
+        while True:
+            try:
+                current = self.src[pos]
+            except IndexError:
+                break
+            if not isStrSpace(current):
+                break
+            pos += 1
+        return pos
+
+    def skipSpacesBack(self, pos: int, minimum: int) -> int:
+        """Skip spaces from given position in reverse."""
+        if pos <= minimum:
+            return pos
+        while pos > minimum:
+            pos -= 1
+            if not isStrSpace(self.src[pos]):
+                return pos + 1
+        return pos
+
+    def skipChars(self, pos: int, code: int) -> int:
+        """Skip character code from given position."""
+        while True:
+            try:
+                current = self.srcCharCode[pos]
+            except IndexError:
+                break
+            if current != code:
+                break
+            pos += 1
+        return pos
+
+    def skipCharsStr(self, pos: int, ch: str) -> int:
+        """Skip character string from given position."""
+        while True:
+            try:
+                current = self.src[pos]
+            except IndexError:
+                break
+            if current != ch:
+                break
+            pos += 1
+        return pos
+
+    def skipCharsBack(self, pos: int, code: int, minimum: int) -> int:
+        """Skip character code reverse from given position - 1."""
+        if pos <= minimum:
+            return pos
+        while pos > minimum:
+            pos -= 1
+            if code != self.srcCharCode[pos]:
+                return pos + 1
+        return pos
+
+    def skipCharsStrBack(self, pos: int, ch: str, minimum: int) -> int:
+        """Skip character string reverse from given position - 1."""
+        if pos <= minimum:
+            return pos
+        while pos > minimum:
+            pos -= 1
+            if ch != self.src[pos]:
+                return pos + 1
+        return pos
+
+    def getLines(self, begin: int, end: int, indent: int, keepLastLF: bool) -> str:
+        """Cut lines range from source."""
+        line = begin
+        if begin >= end:
+            return ""
+
+        queue = [""] * (end - begin)
+
+        i = 1
+        while line < end:
+            lineIndent = 0
+            lineStart = first = self.bMarks[line]
+            last = (
+                self.eMarks[line] + 1
+                if line + 1 < end or keepLastLF
+                else self.eMarks[line]
+            )
+
+            while (first < last) and (lineIndent < indent):
+                ch = self.src[first]
+                if isStrSpace(ch):
+                    if ch == "\t":
+                        lineIndent += 4 - (lineIndent + self.bsCount[line]) % 4
+                    else:
+                        lineIndent += 1
+                elif first - lineStart < self.tShift[line]:
+                    lineIndent += 1
+                else:
+                    break
+                first += 1
+
+            if lineIndent > indent:
+                # partially expanding tabs in code blocks, e.g '\t\tfoobar'
+                # with indent=2 becomes '  \tfoobar'
+                queue[i - 1] = (" " * (lineIndent - indent)) + self.src[first:last]
+            else:
+                queue[i - 1] = self.src[first:last]
+
+            line += 1
+            i += 1
+
+        return "".join(queue)
+
+    def is_code_block(self, line: int) -> bool:
+        """Check if line is a code block,
+        i.e. the code block rule is enabled and text is indented by more than 3 spaces.
+        """
+        return self._code_enabled and (self.sCount[line] - self.blkIndent) >= 4
diff --git a/.venv/Lib/site-packages/markdown_it/rules_block/table.py b/.venv/Lib/site-packages/markdown_it/rules_block/table.py
new file mode 100644 (file)
index 0000000..4b666c1
--- /dev/null
@@ -0,0 +1,236 @@
+# GFM table, https://github.github.com/gfm/#tables-extension-
+from __future__ import annotations
+
+import re
+
+from ..common.utils import charStrAt, isStrSpace
+from .state_block import StateBlock
+
+headerLineRe = re.compile(r"^:?-+:?$")
+enclosingPipesRe = re.compile(r"^\||\|$")
+
+
+def getLine(state: StateBlock, line: int) -> str:
+    pos = state.bMarks[line] + state.tShift[line]
+    maximum = state.eMarks[line]
+
+    # return state.src.substr(pos, max - pos)
+    return state.src[pos:maximum]
+
+
+def escapedSplit(string: str) -> list[str]:
+    result: list[str] = []
+    pos = 0
+    max = len(string)
+    isEscaped = False
+    lastPos = 0
+    current = ""
+    ch = charStrAt(string, pos)
+
+    while pos < max:
+        if ch == "|":
+            if not isEscaped:
+                # pipe separating cells, '|'
+                result.append(current + string[lastPos:pos])
+                current = ""
+                lastPos = pos + 1
+            else:
+                # escaped pipe, '\|'
+                current += string[lastPos : pos - 1]
+                lastPos = pos
+
+        isEscaped = ch == "\\"
+        pos += 1
+
+        ch = charStrAt(string, pos)
+
+    result.append(current + string[lastPos:])
+
+    return result
+
+
+def table(state: StateBlock, startLine: int, endLine: int, silent: bool) -> bool:
+    tbodyLines = None
+
+    # should have at least two lines
+    if startLine + 2 > endLine:
+        return False
+
+    nextLine = startLine + 1
+
+    if state.sCount[nextLine] < state.blkIndent:
+        return False
+
+    if state.is_code_block(nextLine):
+        return False
+
+    # first character of the second line should be '|', '-', ':',
+    # and no other characters are allowed but spaces;
+    # basically, this is the equivalent of /^[-:|][-:|\s]*$/ regexp
+
+    pos = state.bMarks[nextLine] + state.tShift[nextLine]
+    if pos >= state.eMarks[nextLine]:
+        return False
+    first_ch = state.src[pos]
+    pos += 1
+    if first_ch not in ("|", "-", ":"):
+        return False
+
+    if pos >= state.eMarks[nextLine]:
+        return False
+    second_ch = state.src[pos]
+    pos += 1
+    if second_ch not in ("|", "-", ":") and not isStrSpace(second_ch):
+        return False
+
+    # if first character is '-', then second character must not be a space
+    # (due to parsing ambiguity with list)
+    if first_ch == "-" and isStrSpace(second_ch):
+        return False
+
+    while pos < state.eMarks[nextLine]:
+        ch = state.src[pos]
+
+        if ch not in ("|", "-", ":") and not isStrSpace(ch):
+            return False
+
+        pos += 1
+
+    lineText = getLine(state, startLine + 1)
+
+    columns = lineText.split("|")
+    aligns = []
+    for i in range(len(columns)):
+        t = columns[i].strip()
+        if not t:
+            # allow empty columns before and after table, but not in between columns;
+            # e.g. allow ` |---| `, disallow ` ---||--- `
+            if i == 0 or i == len(columns) - 1:
+                continue
+            else:
+                return False
+
+        if not headerLineRe.search(t):
+            return False
+        if charStrAt(t, len(t) - 1) == ":":
+            aligns.append("center" if charStrAt(t, 0) == ":" else "right")
+        elif charStrAt(t, 0) == ":":
+            aligns.append("left")
+        else:
+            aligns.append("")
+
+    lineText = getLine(state, startLine).strip()
+    if "|" not in lineText:
+        return False
+    if state.is_code_block(startLine):
+        return False
+    columns = escapedSplit(lineText)
+    if columns and columns[0] == "":
+        columns.pop(0)
+    if columns and columns[-1] == "":
+        columns.pop()
+
+    # header row will define an amount of columns in the entire table,
+    # and align row should be exactly the same (the rest of the rows can differ)
+    columnCount = len(columns)
+    if columnCount == 0 or columnCount != len(aligns):
+        return False
+
+    if silent:
+        return True
+
+    oldParentType = state.parentType
+    state.parentType = "table"
+
+    # use 'blockquote' lists for termination because it's
+    # the most similar to tables
+    terminatorRules = state.md.block.ruler.getRules("blockquote")
+
+    token = state.push("table_open", "table", 1)
+    token.map = tableLines = [startLine, 0]
+
+    token = state.push("thead_open", "thead", 1)
+    token.map = [startLine, startLine + 1]
+
+    token = state.push("tr_open", "tr", 1)
+    token.map = [startLine, startLine + 1]
+
+    for i in range(len(columns)):
+        token = state.push("th_open", "th", 1)
+        if aligns[i]:
+            token.attrs = {"style": "text-align:" + aligns[i]}
+
+        token = state.push("inline", "", 0)
+        # note in markdown-it this map was removed in v12.0.0 however, we keep it,
+        # since it is helpful to propagate to children tokens
+        token.map = [startLine, startLine + 1]
+        token.content = columns[i].strip()
+        token.children = []
+
+        token = state.push("th_close", "th", -1)
+
+    token = state.push("tr_close", "tr", -1)
+    token = state.push("thead_close", "thead", -1)
+
+    nextLine = startLine + 2
+    while nextLine < endLine:
+        if state.sCount[nextLine] < state.blkIndent:
+            break
+
+        terminate = False
+        for i in range(len(terminatorRules)):
+            if terminatorRules[i](state, nextLine, endLine, True):
+                terminate = True
+                break
+
+        if terminate:
+            break
+        lineText = getLine(state, nextLine).strip()
+        if not lineText:
+            break
+        if state.is_code_block(nextLine):
+            break
+        columns = escapedSplit(lineText)
+        if columns and columns[0] == "":
+            columns.pop(0)
+        if columns and columns[-1] == "":
+            columns.pop()
+
+        if nextLine == startLine + 2:
+            token = state.push("tbody_open", "tbody", 1)
+            token.map = tbodyLines = [startLine + 2, 0]
+
+        token = state.push("tr_open", "tr", 1)
+        token.map = [nextLine, nextLine + 1]
+
+        for i in range(columnCount):
+            token = state.push("td_open", "td", 1)
+            if aligns[i]:
+                token.attrs = {"style": "text-align:" + aligns[i]}
+
+            token = state.push("inline", "", 0)
+            # note in markdown-it this map was removed in v12.0.0 however, we keep it,
+            # since it is helpful to propagate to children tokens
+            token.map = [nextLine, nextLine + 1]
+            try:
+                token.content = columns[i].strip() if columns[i] else ""
+            except IndexError:
+                token.content = ""
+            token.children = []
+
+            token = state.push("td_close", "td", -1)
+
+        token = state.push("tr_close", "tr", -1)
+
+        nextLine += 1
+
+    if tbodyLines:
+        token = state.push("tbody_close", "tbody", -1)
+        tbodyLines[1] = nextLine
+
+    token = state.push("table_close", "table", -1)
+
+    tableLines[1] = nextLine
+    state.parentType = oldParentType
+    state.line = nextLine
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/__init__.py b/.venv/Lib/site-packages/markdown_it/rules_core/__init__.py
new file mode 100644 (file)
index 0000000..c9c5368
--- /dev/null
@@ -0,0 +1,19 @@
+__all__ = (
+    "StateCore",
+    "normalize",
+    "block",
+    "inline",
+    "replace",
+    "smartquotes",
+    "linkify",
+    "text_join",
+)
+
+from .block import block
+from .inline import inline
+from .linkify import linkify
+from .normalize import normalize
+from .replacements import replace
+from .smartquotes import smartquotes
+from .state_core import StateCore
+from .text_join import text_join
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..58b5c6a
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/block.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/block.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1185d8b
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/block.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/inline.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/inline.cpython-312.pyc
new file mode 100644 (file)
index 0000000..be41465
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/inline.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/linkify.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/linkify.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8090a2d
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/linkify.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/normalize.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/normalize.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2f0bf77
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/normalize.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/replacements.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/replacements.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2da7801
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/replacements.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/smartquotes.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/smartquotes.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2cc3fbb
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/smartquotes.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/state_core.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/state_core.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9c3adbd
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/state_core.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/text_join.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/text_join.cpython-312.pyc
new file mode 100644 (file)
index 0000000..fed288c
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_core/__pycache__/text_join.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/block.py b/.venv/Lib/site-packages/markdown_it/rules_core/block.py
new file mode 100644 (file)
index 0000000..a6c3bb8
--- /dev/null
@@ -0,0 +1,13 @@
+from ..token import Token
+from .state_core import StateCore
+
+
+def block(state: StateCore) -> None:
+    if state.inlineMode:
+        token = Token("inline", "", 0)
+        token.content = state.src
+        token.map = [0, 1]
+        token.children = []
+        state.tokens.append(token)
+    else:
+        state.md.block.parse(state.src, state.md, state.env, state.tokens)
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/inline.py b/.venv/Lib/site-packages/markdown_it/rules_core/inline.py
new file mode 100644 (file)
index 0000000..c3fd0b5
--- /dev/null
@@ -0,0 +1,10 @@
+from .state_core import StateCore
+
+
+def inline(state: StateCore) -> None:
+    """Parse inlines"""
+    for token in state.tokens:
+        if token.type == "inline":
+            if token.children is None:
+                token.children = []
+            state.md.inline.parse(token.content, state.md, state.env, token.children)
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/linkify.py b/.venv/Lib/site-packages/markdown_it/rules_core/linkify.py
new file mode 100644 (file)
index 0000000..efbc9d4
--- /dev/null
@@ -0,0 +1,149 @@
+from __future__ import annotations
+
+import re
+from typing import Protocol
+
+from ..common.utils import arrayReplaceAt, isLinkClose, isLinkOpen
+from ..token import Token
+from .state_core import StateCore
+
+HTTP_RE = re.compile(r"^http://")
+MAILTO_RE = re.compile(r"^mailto:")
+TEST_MAILTO_RE = re.compile(r"^mailto:", flags=re.IGNORECASE)
+
+
+def linkify(state: StateCore) -> None:
+    """Rule for identifying plain-text links."""
+    if not state.md.options.linkify:
+        return
+
+    if not state.md.linkify:
+        raise ModuleNotFoundError("Linkify enabled but not installed.")
+
+    for inline_token in state.tokens:
+        if inline_token.type != "inline" or not state.md.linkify.pretest(
+            inline_token.content
+        ):
+            continue
+
+        tokens = inline_token.children
+
+        htmlLinkLevel = 0
+
+        # We scan from the end, to keep position when new tags added.
+        # Use reversed logic in links start/end match
+        assert tokens is not None
+        i = len(tokens)
+        while i >= 1:
+            i -= 1
+            assert isinstance(tokens, list)
+            currentToken = tokens[i]
+
+            # Skip content of markdown links
+            if currentToken.type == "link_close":
+                i -= 1
+                while (
+                    tokens[i].level != currentToken.level
+                    and tokens[i].type != "link_open"
+                ):
+                    i -= 1
+                continue
+
+            # Skip content of html tag links
+            if currentToken.type == "html_inline":
+                if isLinkOpen(currentToken.content) and htmlLinkLevel > 0:
+                    htmlLinkLevel -= 1
+                if isLinkClose(currentToken.content):
+                    htmlLinkLevel += 1
+            if htmlLinkLevel > 0:
+                continue
+
+            if currentToken.type == "text" and state.md.linkify.test(
+                currentToken.content
+            ):
+                text = currentToken.content
+                links: list[_LinkType] = state.md.linkify.match(text) or []
+
+                # Now split string to nodes
+                nodes = []
+                level = currentToken.level
+                lastPos = 0
+
+                # forbid escape sequence at the start of the string,
+                # this avoids http\://example.com/ from being linkified as
+                # http:<a href="//example.com/">//example.com/</a>
+                if (
+                    links
+                    and links[0].index == 0
+                    and i > 0
+                    and tokens[i - 1].type == "text_special"
+                ):
+                    links = links[1:]
+
+                for link in links:
+                    url = link.url
+                    fullUrl = state.md.normalizeLink(url)
+                    if not state.md.validateLink(fullUrl):
+                        continue
+
+                    urlText = link.text
+
+                    # Linkifier might send raw hostnames like "example.com", where url
+                    # starts with domain name. So we prepend http:// in those cases,
+                    # and remove it afterwards.
+                    if not link.schema:
+                        urlText = HTTP_RE.sub(
+                            "", state.md.normalizeLinkText("http://" + urlText)
+                        )
+                    elif link.schema == "mailto:" and TEST_MAILTO_RE.search(urlText):
+                        urlText = MAILTO_RE.sub(
+                            "", state.md.normalizeLinkText("mailto:" + urlText)
+                        )
+                    else:
+                        urlText = state.md.normalizeLinkText(urlText)
+
+                    pos = link.index
+
+                    if pos > lastPos:
+                        token = Token("text", "", 0)
+                        token.content = text[lastPos:pos]
+                        token.level = level
+                        nodes.append(token)
+
+                    token = Token("link_open", "a", 1)
+                    token.attrs = {"href": fullUrl}
+                    token.level = level
+                    level += 1
+                    token.markup = "linkify"
+                    token.info = "auto"
+                    nodes.append(token)
+
+                    token = Token("text", "", 0)
+                    token.content = urlText
+                    token.level = level
+                    nodes.append(token)
+
+                    token = Token("link_close", "a", -1)
+                    level -= 1
+                    token.level = level
+                    token.markup = "linkify"
+                    token.info = "auto"
+                    nodes.append(token)
+
+                    lastPos = link.last_index
+
+                if lastPos < len(text):
+                    token = Token("text", "", 0)
+                    token.content = text[lastPos:]
+                    token.level = level
+                    nodes.append(token)
+
+                inline_token.children = tokens = arrayReplaceAt(tokens, i, nodes)
+
+
+class _LinkType(Protocol):
+    url: str
+    text: str
+    index: int
+    last_index: int
+    schema: str | None
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/normalize.py b/.venv/Lib/site-packages/markdown_it/rules_core/normalize.py
new file mode 100644 (file)
index 0000000..c9f8d0d
--- /dev/null
@@ -0,0 +1,18 @@
+"""Normalize input string."""
+import re
+
+from .state_core import StateCore
+
+# https://spec.commonmark.org/0.29/#line-ending
+NEWLINES_RE = re.compile(r"\r\n?|\n")
+NULL_RE = re.compile(r"\0")
+
+
+def normalize(state: StateCore) -> None:
+    # Normalize newlines
+    string = NEWLINES_RE.sub("\n", state.src)
+
+    # Replace NULL characters
+    string = NULL_RE.sub("\uFFFD", string)
+
+    state.src = string
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/replacements.py b/.venv/Lib/site-packages/markdown_it/rules_core/replacements.py
new file mode 100644 (file)
index 0000000..14912e1
--- /dev/null
@@ -0,0 +1,126 @@
+"""Simple typographic replacements
+
+* ``(c)``, ``(C)`` → ©
+* ``(tm)``, ``(TM)`` → ™
+* ``(r)``, ``(R)`` → ®
+* ``+-`` → ±
+* ``...`` → …
+* ``?....`` → ?..
+* ``!....`` → !..
+* ``????????`` → ???
+* ``!!!!!`` → !!!
+* ``,,,`` → ,
+* ``--`` → &ndash
+* ``---`` → &mdash
+"""
+from __future__ import annotations
+
+import logging
+import re
+
+from ..token import Token
+from .state_core import StateCore
+
+LOGGER = logging.getLogger(__name__)
+
+# TODO:
+# - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾
+# - multiplication 2 x 4 -> 2 × 4
+
+RARE_RE = re.compile(r"\+-|\.\.|\?\?\?\?|!!!!|,,|--")
+
+# Workaround for phantomjs - need regex without /g flag,
+# or root check will fail every second time
+# SCOPED_ABBR_TEST_RE = r"\((c|tm|r)\)"
+
+SCOPED_ABBR_RE = re.compile(r"\((c|tm|r)\)", flags=re.IGNORECASE)
+
+PLUS_MINUS_RE = re.compile(r"\+-")
+
+ELLIPSIS_RE = re.compile(r"\.{2,}")
+
+ELLIPSIS_QUESTION_EXCLAMATION_RE = re.compile(r"([?!])…")
+
+QUESTION_EXCLAMATION_RE = re.compile(r"([?!]){4,}")
+
+COMMA_RE = re.compile(r",{2,}")
+
+EM_DASH_RE = re.compile(r"(^|[^-])---(?=[^-]|$)", flags=re.MULTILINE)
+
+EN_DASH_RE = re.compile(r"(^|\s)--(?=\s|$)", flags=re.MULTILINE)
+
+EN_DASH_INDENT_RE = re.compile(r"(^|[^-\s])--(?=[^-\s]|$)", flags=re.MULTILINE)
+
+
+SCOPED_ABBR = {"c": "©", "r": "®", "tm": "™"}
+
+
+def replaceFn(match: re.Match[str]) -> str:
+    return SCOPED_ABBR[match.group(1).lower()]
+
+
+def replace_scoped(inlineTokens: list[Token]) -> None:
+    inside_autolink = 0
+
+    for token in inlineTokens:
+        if token.type == "text" and not inside_autolink:
+            token.content = SCOPED_ABBR_RE.sub(replaceFn, token.content)
+
+        if token.type == "link_open" and token.info == "auto":
+            inside_autolink -= 1
+
+        if token.type == "link_close" and token.info == "auto":
+            inside_autolink += 1
+
+
+def replace_rare(inlineTokens: list[Token]) -> None:
+    inside_autolink = 0
+
+    for token in inlineTokens:
+        if (
+            token.type == "text"
+            and (not inside_autolink)
+            and RARE_RE.search(token.content)
+        ):
+            # +- -> ±
+            token.content = PLUS_MINUS_RE.sub("±", token.content)
+
+            # .., ..., ....... -> …
+            token.content = ELLIPSIS_RE.sub("…", token.content)
+
+            # but ?..... & !..... -> ?.. & !..
+            token.content = ELLIPSIS_QUESTION_EXCLAMATION_RE.sub("\\1..", token.content)
+            token.content = QUESTION_EXCLAMATION_RE.sub("\\1\\1\\1", token.content)
+
+            # ,,  ,,,  ,,,, -> ,
+            token.content = COMMA_RE.sub(",", token.content)
+
+            # em-dash
+            token.content = EM_DASH_RE.sub("\\1\u2014", token.content)
+
+            # en-dash
+            token.content = EN_DASH_RE.sub("\\1\u2013", token.content)
+            token.content = EN_DASH_INDENT_RE.sub("\\1\u2013", token.content)
+
+        if token.type == "link_open" and token.info == "auto":
+            inside_autolink -= 1
+
+        if token.type == "link_close" and token.info == "auto":
+            inside_autolink += 1
+
+
+def replace(state: StateCore) -> None:
+    if not state.md.options.typographer:
+        return
+
+    for token in state.tokens:
+        if token.type != "inline":
+            continue
+        if token.children is None:
+            continue
+
+        if SCOPED_ABBR_RE.search(token.content):
+            replace_scoped(token.children)
+
+        if RARE_RE.search(token.content):
+            replace_rare(token.children)
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/smartquotes.py b/.venv/Lib/site-packages/markdown_it/rules_core/smartquotes.py
new file mode 100644 (file)
index 0000000..c98fbd7
--- /dev/null
@@ -0,0 +1,202 @@
+"""Convert straight quotation marks to typographic ones
+"""
+from __future__ import annotations
+
+import re
+from typing import Any
+
+from ..common.utils import charCodeAt, isMdAsciiPunct, isPunctChar, isWhiteSpace
+from ..token import Token
+from .state_core import StateCore
+
+QUOTE_TEST_RE = re.compile(r"['\"]")
+QUOTE_RE = re.compile(r"['\"]")
+APOSTROPHE = "\u2019"  # ’
+
+
+def replaceAt(string: str, index: int, ch: str) -> str:
+    # When the index is negative, the behavior is different from the js version.
+    # But basically, the index will not be negative.
+    assert index >= 0
+    return string[:index] + ch + string[index + 1 :]
+
+
+def process_inlines(tokens: list[Token], state: StateCore) -> None:
+    stack: list[dict[str, Any]] = []
+
+    for i, token in enumerate(tokens):
+        thisLevel = token.level
+
+        j = 0
+        for j in range(len(stack))[::-1]:
+            if stack[j]["level"] <= thisLevel:
+                break
+        else:
+            # When the loop is terminated without a "break".
+            # Subtract 1 to get the same index as the js version.
+            j -= 1
+
+        stack = stack[: j + 1]
+
+        if token.type != "text":
+            continue
+
+        text = token.content
+        pos = 0
+        maximum = len(text)
+
+        while pos < maximum:
+            goto_outer = False
+            lastIndex = pos
+            t = QUOTE_RE.search(text[lastIndex:])
+            if not t:
+                break
+
+            canOpen = canClose = True
+            pos = t.start(0) + lastIndex + 1
+            isSingle = t.group(0) == "'"
+
+            # Find previous character,
+            # default to space if it's the beginning of the line
+            lastChar: None | int = 0x20
+
+            if t.start(0) + lastIndex - 1 >= 0:
+                lastChar = charCodeAt(text, t.start(0) + lastIndex - 1)
+            else:
+                for j in range(i)[::-1]:
+                    if tokens[j].type == "softbreak" or tokens[j].type == "hardbreak":
+                        break
+                    # should skip all tokens except 'text', 'html_inline' or 'code_inline'
+                    if not tokens[j].content:
+                        continue
+
+                    lastChar = charCodeAt(tokens[j].content, len(tokens[j].content) - 1)
+                    break
+
+            # Find next character,
+            # default to space if it's the end of the line
+            nextChar: None | int = 0x20
+
+            if pos < maximum:
+                nextChar = charCodeAt(text, pos)
+            else:
+                for j in range(i + 1, len(tokens)):
+                    # nextChar defaults to 0x20
+                    if tokens[j].type == "softbreak" or tokens[j].type == "hardbreak":
+                        break
+                    # should skip all tokens except 'text', 'html_inline' or 'code_inline'
+                    if not tokens[j].content:
+                        continue
+
+                    nextChar = charCodeAt(tokens[j].content, 0)
+                    break
+
+            isLastPunctChar = lastChar is not None and (
+                isMdAsciiPunct(lastChar) or isPunctChar(chr(lastChar))
+            )
+            isNextPunctChar = nextChar is not None and (
+                isMdAsciiPunct(nextChar) or isPunctChar(chr(nextChar))
+            )
+
+            isLastWhiteSpace = lastChar is not None and isWhiteSpace(lastChar)
+            isNextWhiteSpace = nextChar is not None and isWhiteSpace(nextChar)
+
+            if isNextWhiteSpace:  # noqa: SIM114
+                canOpen = False
+            elif isNextPunctChar and not (isLastWhiteSpace or isLastPunctChar):
+                canOpen = False
+
+            if isLastWhiteSpace:  # noqa: SIM114
+                canClose = False
+            elif isLastPunctChar and not (isNextWhiteSpace or isNextPunctChar):
+                canClose = False
+
+            if nextChar == 0x22 and t.group(0) == '"':  # 0x22: "  # noqa: SIM102
+                if (
+                    lastChar is not None and lastChar >= 0x30 and lastChar <= 0x39
+                ):  # 0x30: 0, 0x39: 9
+                    # special case: 1"" - count first quote as an inch
+                    canClose = canOpen = False
+
+            if canOpen and canClose:
+                # Replace quotes in the middle of punctuation sequence, but not
+                # in the middle of the words, i.e.:
+                #
+                # 1. foo " bar " baz - not replaced
+                # 2. foo-"-bar-"-baz - replaced
+                # 3. foo"bar"baz     - not replaced
+                canOpen = isLastPunctChar
+                canClose = isNextPunctChar
+
+            if not canOpen and not canClose:
+                # middle of word
+                if isSingle:
+                    token.content = replaceAt(
+                        token.content, t.start(0) + lastIndex, APOSTROPHE
+                    )
+                continue
+
+            if canClose:
+                # this could be a closing quote, rewind the stack to get a match
+                for j in range(len(stack))[::-1]:
+                    item = stack[j]
+                    if stack[j]["level"] < thisLevel:
+                        break
+                    if item["single"] == isSingle and stack[j]["level"] == thisLevel:
+                        item = stack[j]
+
+                        if isSingle:
+                            openQuote = state.md.options.quotes[2]
+                            closeQuote = state.md.options.quotes[3]
+                        else:
+                            openQuote = state.md.options.quotes[0]
+                            closeQuote = state.md.options.quotes[1]
+
+                        # replace token.content *before* tokens[item.token].content,
+                        # because, if they are pointing at the same token, replaceAt
+                        # could mess up indices when quote length != 1
+                        token.content = replaceAt(
+                            token.content, t.start(0) + lastIndex, closeQuote
+                        )
+                        tokens[item["token"]].content = replaceAt(
+                            tokens[item["token"]].content, item["pos"], openQuote
+                        )
+
+                        pos += len(closeQuote) - 1
+                        if item["token"] == i:
+                            pos += len(openQuote) - 1
+
+                        text = token.content
+                        maximum = len(text)
+
+                        stack = stack[:j]
+                        goto_outer = True
+                        break
+                if goto_outer:
+                    goto_outer = False
+                    continue
+
+            if canOpen:
+                stack.append(
+                    {
+                        "token": i,
+                        "pos": t.start(0) + lastIndex,
+                        "single": isSingle,
+                        "level": thisLevel,
+                    }
+                )
+            elif canClose and isSingle:
+                token.content = replaceAt(
+                    token.content, t.start(0) + lastIndex, APOSTROPHE
+                )
+
+
+def smartquotes(state: StateCore) -> None:
+    if not state.md.options.typographer:
+        return
+
+    for token in state.tokens:
+        if token.type != "inline" or not QUOTE_RE.search(token.content):
+            continue
+        if token.children is not None:
+            process_inlines(token.children, state)
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/state_core.py b/.venv/Lib/site-packages/markdown_it/rules_core/state_core.py
new file mode 100644 (file)
index 0000000..a938041
--- /dev/null
@@ -0,0 +1,25 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from ..ruler import StateBase
+from ..token import Token
+from ..utils import EnvType
+
+if TYPE_CHECKING:
+    from markdown_it import MarkdownIt
+
+
+class StateCore(StateBase):
+    def __init__(
+        self,
+        src: str,
+        md: MarkdownIt,
+        env: EnvType,
+        tokens: list[Token] | None = None,
+    ) -> None:
+        self.src = src
+        self.md = md  # link to parser instance
+        self.env = env
+        self.tokens: list[Token] = tokens or []
+        self.inlineMode = False
diff --git a/.venv/Lib/site-packages/markdown_it/rules_core/text_join.py b/.venv/Lib/site-packages/markdown_it/rules_core/text_join.py
new file mode 100644 (file)
index 0000000..d54ccbb
--- /dev/null
@@ -0,0 +1,34 @@
+"""Join raw text tokens with the rest of the text
+
+This is set as a separate rule to provide an opportunity for plugins
+to run text replacements after text join, but before escape join.
+
+For example, `\\:)` shouldn't be replaced with an emoji.
+"""
+from __future__ import annotations
+
+from ..token import Token
+from .state_core import StateCore
+
+
+def text_join(state: StateCore) -> None:
+    """Join raw text for escape sequences (`text_special`) tokens with the rest of the text"""
+
+    for inline_token in state.tokens[:]:
+        if inline_token.type != "inline":
+            continue
+
+        # convert text_special to text and join all adjacent text nodes
+        new_tokens: list[Token] = []
+        for child_token in inline_token.children or []:
+            if child_token.type == "text_special":
+                child_token.type = "text"
+            if (
+                child_token.type == "text"
+                and new_tokens
+                and new_tokens[-1].type == "text"
+            ):
+                new_tokens[-1].content += child_token.content
+            else:
+                new_tokens.append(child_token)
+        inline_token.children = new_tokens
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__init__.py b/.venv/Lib/site-packages/markdown_it/rules_inline/__init__.py
new file mode 100644 (file)
index 0000000..3a8026e
--- /dev/null
@@ -0,0 +1,31 @@
+__all__ = (
+    "StateInline",
+    "text",
+    "fragments_join",
+    "link_pairs",
+    "linkify",
+    "escape",
+    "newline",
+    "backtick",
+    "emphasis",
+    "image",
+    "link",
+    "autolink",
+    "entity",
+    "html_inline",
+    "strikethrough",
+)
+from . import emphasis, strikethrough
+from .autolink import autolink
+from .backticks import backtick
+from .balance_pairs import link_pairs
+from .entity import entity
+from .escape import escape
+from .fragments_join import fragments_join
+from .html_inline import html_inline
+from .image import image
+from .link import link
+from .linkify import linkify
+from .newline import newline
+from .state_inline import StateInline
+from .text import text
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..127f993
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/autolink.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/autolink.cpython-312.pyc
new file mode 100644 (file)
index 0000000..213eeaf
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/autolink.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/backticks.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/backticks.cpython-312.pyc
new file mode 100644 (file)
index 0000000..92b3cf5
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/backticks.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/balance_pairs.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/balance_pairs.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b0549f7
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/balance_pairs.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/emphasis.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/emphasis.cpython-312.pyc
new file mode 100644 (file)
index 0000000..57b46bb
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/emphasis.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/entity.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/entity.cpython-312.pyc
new file mode 100644 (file)
index 0000000..76336eb
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/entity.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/escape.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/escape.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e565639
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/escape.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/fragments_join.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/fragments_join.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7e581c8
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/fragments_join.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/html_inline.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/html_inline.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6aa5586
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/html_inline.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/image.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/image.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7e97b1f
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/image.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/link.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/link.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0293cc9
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/link.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/linkify.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/linkify.cpython-312.pyc
new file mode 100644 (file)
index 0000000..aedaaa9
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/linkify.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/newline.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/newline.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2015cd3
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/newline.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/state_inline.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/state_inline.cpython-312.pyc
new file mode 100644 (file)
index 0000000..60f2f01
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/state_inline.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/strikethrough.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/strikethrough.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2439e13
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/strikethrough.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/text.cpython-312.pyc b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/text.cpython-312.pyc
new file mode 100644 (file)
index 0000000..15c07f7
Binary files /dev/null and b/.venv/Lib/site-packages/markdown_it/rules_inline/__pycache__/text.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/autolink.py b/.venv/Lib/site-packages/markdown_it/rules_inline/autolink.py
new file mode 100644 (file)
index 0000000..295d963
--- /dev/null
@@ -0,0 +1,77 @@
+# Process autolinks '<protocol:...>'
+import re
+
+from .state_inline import StateInline
+
+EMAIL_RE = re.compile(
+    r"^([a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$"  # noqa: E501
+)
+AUTOLINK_RE = re.compile(r"^([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)$")
+
+
+def autolink(state: StateInline, silent: bool) -> bool:
+    pos = state.pos
+
+    if state.src[pos] != "<":
+        return False
+
+    start = state.pos
+    maximum = state.posMax
+
+    while True:
+        pos += 1
+        if pos >= maximum:
+            return False
+
+        ch = state.src[pos]
+
+        if ch == "<":
+            return False
+        if ch == ">":
+            break
+
+    url = state.src[start + 1 : pos]
+
+    if AUTOLINK_RE.search(url) is not None:
+        fullUrl = state.md.normalizeLink(url)
+        if not state.md.validateLink(fullUrl):
+            return False
+
+        if not silent:
+            token = state.push("link_open", "a", 1)
+            token.attrs = {"href": fullUrl}
+            token.markup = "autolink"
+            token.info = "auto"
+
+            token = state.push("text", "", 0)
+            token.content = state.md.normalizeLinkText(url)
+
+            token = state.push("link_close", "a", -1)
+            token.markup = "autolink"
+            token.info = "auto"
+
+        state.pos += len(url) + 2
+        return True
+
+    if EMAIL_RE.search(url) is not None:
+        fullUrl = state.md.normalizeLink("mailto:" + url)
+        if not state.md.validateLink(fullUrl):
+            return False
+
+        if not silent:
+            token = state.push("link_open", "a", 1)
+            token.attrs = {"href": fullUrl}
+            token.markup = "autolink"
+            token.info = "auto"
+
+            token = state.push("text", "", 0)
+            token.content = state.md.normalizeLinkText(url)
+
+            token = state.push("link_close", "a", -1)
+            token.markup = "autolink"
+            token.info = "auto"
+
+        state.pos += len(url) + 2
+        return True
+
+    return False
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/backticks.py b/.venv/Lib/site-packages/markdown_it/rules_inline/backticks.py
new file mode 100644 (file)
index 0000000..fc60d6b
--- /dev/null
@@ -0,0 +1,72 @@
+# Parse backticks
+import re
+
+from .state_inline import StateInline
+
+regex = re.compile("^ (.+) $")
+
+
+def backtick(state: StateInline, silent: bool) -> bool:
+    pos = state.pos
+
+    if state.src[pos] != "`":
+        return False
+
+    start = pos
+    pos += 1
+    maximum = state.posMax
+
+    # scan marker length
+    while pos < maximum and (state.src[pos] == "`"):
+        pos += 1
+
+    marker = state.src[start:pos]
+    openerLength = len(marker)
+
+    if state.backticksScanned and state.backticks.get(openerLength, 0) <= start:
+        if not silent:
+            state.pending += marker
+        state.pos += openerLength
+        return True
+
+    matchStart = matchEnd = pos
+
+    # Nothing found in the cache, scan until the end of the line (or until marker is found)
+    while True:
+        try:
+            matchStart = state.src.index("`", matchEnd)
+        except ValueError:
+            break
+        matchEnd = matchStart + 1
+
+        # scan marker length
+        while matchEnd < maximum and (state.src[matchEnd] == "`"):
+            matchEnd += 1
+
+        closerLength = matchEnd - matchStart
+
+        if closerLength == openerLength:
+            # Found matching closer length.
+            if not silent:
+                token = state.push("code_inline", "code", 0)
+                token.markup = marker
+                token.content = state.src[pos:matchStart].replace("\n", " ")
+                if (
+                    token.content.startswith(" ")
+                    and token.content.endswith(" ")
+                    and len(token.content.strip()) > 0
+                ):
+                    token.content = token.content[1:-1]
+            state.pos = matchEnd
+            return True
+
+        # Some different length found, put it in cache as upper limit of where closer can be found
+        state.backticks[closerLength] = matchStart
+
+    # Scanned through the end, didn't find anything
+    state.backticksScanned = True
+
+    if not silent:
+        state.pending += marker
+    state.pos += openerLength
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/balance_pairs.py b/.venv/Lib/site-packages/markdown_it/rules_inline/balance_pairs.py
new file mode 100644 (file)
index 0000000..bbb2101
--- /dev/null
@@ -0,0 +1,137 @@
+"""Balance paired characters (*, _, etc) in inline tokens."""
+from __future__ import annotations
+
+from .state_inline import Delimiter, StateInline
+
+
+def processDelimiters(state: StateInline, delimiters: list[Delimiter]) -> None:
+    """For each opening emphasis-like marker find a matching closing one."""
+    if not delimiters:
+        return
+
+    openersBottom = {}
+    maximum = len(delimiters)
+
+    # headerIdx is the first delimiter of the current (where closer is) delimiter run
+    headerIdx = 0
+    lastTokenIdx = -2  # needs any value lower than -1
+    jumps: list[int] = []
+    closerIdx = 0
+    while closerIdx < maximum:
+        closer = delimiters[closerIdx]
+
+        jumps.append(0)
+
+        # markers belong to same delimiter run if:
+        #  - they have adjacent tokens
+        #  - AND markers are the same
+        #
+        if (
+            delimiters[headerIdx].marker != closer.marker
+            or lastTokenIdx != closer.token - 1
+        ):
+            headerIdx = closerIdx
+        lastTokenIdx = closer.token
+
+        # Length is only used for emphasis-specific "rule of 3",
+        # if it's not defined (in strikethrough or 3rd party plugins),
+        # we can default it to 0 to disable those checks.
+        #
+        closer.length = closer.length or 0
+
+        if not closer.close:
+            closerIdx += 1
+            continue
+
+        # Previously calculated lower bounds (previous fails)
+        # for each marker, each delimiter length modulo 3,
+        # and for whether this closer can be an opener;
+        # https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460
+        if closer.marker not in openersBottom:
+            openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1]
+
+        minOpenerIdx = openersBottom[closer.marker][
+            (3 if closer.open else 0) + (closer.length % 3)
+        ]
+
+        openerIdx = headerIdx - jumps[headerIdx] - 1
+
+        newMinOpenerIdx = openerIdx
+
+        while openerIdx > minOpenerIdx:
+            opener = delimiters[openerIdx]
+
+            if opener.marker != closer.marker:
+                openerIdx -= jumps[openerIdx] + 1
+                continue
+
+            if opener.open and opener.end < 0:
+                isOddMatch = False
+
+                # from spec:
+                #
+                # If one of the delimiters can both open and close emphasis, then the
+                # sum of the lengths of the delimiter runs containing the opening and
+                # closing delimiters must not be a multiple of 3 unless both lengths
+                # are multiples of 3.
+                #
+                if (
+                    (opener.close or closer.open)
+                    and ((opener.length + closer.length) % 3 == 0)
+                    and (opener.length % 3 != 0 or closer.length % 3 != 0)
+                ):
+                    isOddMatch = True
+
+                if not isOddMatch:
+                    # If previous delimiter cannot be an opener, we can safely skip
+                    # the entire sequence in future checks. This is required to make
+                    # sure algorithm has linear complexity (see *_*_*_*_*_... case).
+                    #
+                    if openerIdx > 0 and not delimiters[openerIdx - 1].open:
+                        lastJump = jumps[openerIdx - 1] + 1
+                    else:
+                        lastJump = 0
+
+                    jumps[closerIdx] = closerIdx - openerIdx + lastJump
+                    jumps[openerIdx] = lastJump
+
+                    closer.open = False
+                    opener.end = closerIdx
+                    opener.close = False
+                    newMinOpenerIdx = -1
+
+                    # treat next token as start of run,
+                    # it optimizes skips in **<...>**a**<...>** pathological case
+                    lastTokenIdx = -2
+
+                    break
+
+            openerIdx -= jumps[openerIdx] + 1
+
+        if newMinOpenerIdx != -1:
+            # If match for this delimiter run failed, we want to set lower bound for
+            # future lookups. This is required to make sure algorithm has linear
+            # complexity.
+            #
+            # See details here:
+            # https:#github.com/commonmark/cmark/issues/178#issuecomment-270417442
+            #
+            openersBottom[closer.marker][
+                (3 if closer.open else 0) + ((closer.length or 0) % 3)
+            ] = newMinOpenerIdx
+
+        closerIdx += 1
+
+
+def link_pairs(state: StateInline) -> None:
+    tokens_meta = state.tokens_meta
+    maximum = len(state.tokens_meta)
+
+    processDelimiters(state, state.delimiters)
+
+    curr = 0
+    while curr < maximum:
+        curr_meta = tokens_meta[curr]
+        if curr_meta and "delimiters" in curr_meta:
+            processDelimiters(state, curr_meta["delimiters"])
+        curr += 1
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/emphasis.py b/.venv/Lib/site-packages/markdown_it/rules_inline/emphasis.py
new file mode 100644 (file)
index 0000000..9a98f9e
--- /dev/null
@@ -0,0 +1,102 @@
+# Process *this* and _that_
+#
+from __future__ import annotations
+
+from .state_inline import Delimiter, StateInline
+
+
+def tokenize(state: StateInline, silent: bool) -> bool:
+    """Insert each marker as a separate text token, and add it to delimiter list"""
+    start = state.pos
+    marker = state.src[start]
+
+    if silent:
+        return False
+
+    if marker not in ("_", "*"):
+        return False
+
+    scanned = state.scanDelims(state.pos, marker == "*")
+
+    for _ in range(scanned.length):
+        token = state.push("text", "", 0)
+        token.content = marker
+        state.delimiters.append(
+            Delimiter(
+                marker=ord(marker),
+                length=scanned.length,
+                token=len(state.tokens) - 1,
+                end=-1,
+                open=scanned.can_open,
+                close=scanned.can_close,
+            )
+        )
+
+    state.pos += scanned.length
+
+    return True
+
+
+def _postProcess(state: StateInline, delimiters: list[Delimiter]) -> None:
+    i = len(delimiters) - 1
+    while i >= 0:
+        startDelim = delimiters[i]
+
+        # /* _ */  /* * */
+        if startDelim.marker != 0x5F and startDelim.marker != 0x2A:
+            i -= 1
+            continue
+
+        # Process only opening markers
+        if startDelim.end == -1:
+            i -= 1
+            continue
+
+        endDelim = delimiters[startDelim.end]
+
+        # If the previous delimiter has the same marker and is adjacent to this one,
+        # merge those into one strong delimiter.
+        #
+        # `<em><em>whatever</em></em>` -> `<strong>whatever</strong>`
+        #
+        isStrong = (
+            i > 0
+            and delimiters[i - 1].end == startDelim.end + 1
+            # check that first two markers match and adjacent
+            and delimiters[i - 1].marker == startDelim.marker
+            and delimiters[i - 1].token == startDelim.token - 1
+            # check that last two markers are adjacent (we can safely assume they match)
+            and delimiters[startDelim.end + 1].token == endDelim.token + 1
+        )
+
+        ch = chr(startDelim.marker)
+
+        token = state.tokens[startDelim.token]
+        token.type = "strong_open" if isStrong else "em_open"
+        token.tag = "strong" if isStrong else "em"
+        token.nesting = 1
+        token.markup = ch + ch if isStrong else ch
+        token.content = ""
+
+        token = state.tokens[endDelim.token]
+        token.type = "strong_close" if isStrong else "em_close"
+        token.tag = "strong" if isStrong else "em"
+        token.nesting = -1
+        token.markup = ch + ch if isStrong else ch
+        token.content = ""
+
+        if isStrong:
+            state.tokens[delimiters[i - 1].token].content = ""
+            state.tokens[delimiters[startDelim.end + 1].token].content = ""
+            i -= 1
+
+        i -= 1
+
+
+def postProcess(state: StateInline) -> None:
+    """Walk through delimiter list and replace text tokens with tags."""
+    _postProcess(state, state.delimiters)
+
+    for token in state.tokens_meta:
+        if token and "delimiters" in token:
+            _postProcess(state, token["delimiters"])
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/entity.py b/.venv/Lib/site-packages/markdown_it/rules_inline/entity.py
new file mode 100644 (file)
index 0000000..ec9d396
--- /dev/null
@@ -0,0 +1,53 @@
+# Process html entity - &#123;, &#xAF;, &quot;, ...
+import re
+
+from ..common.entities import entities
+from ..common.utils import fromCodePoint, isValidEntityCode
+from .state_inline import StateInline
+
+DIGITAL_RE = re.compile(r"^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));", re.IGNORECASE)
+NAMED_RE = re.compile(r"^&([a-z][a-z0-9]{1,31});", re.IGNORECASE)
+
+
+def entity(state: StateInline, silent: bool) -> bool:
+    pos = state.pos
+    maximum = state.posMax
+
+    if state.src[pos] != "&":
+        return False
+
+    if pos + 1 >= maximum:
+        return False
+
+    if state.src[pos + 1] == "#":
+        if match := DIGITAL_RE.search(state.src[pos:]):
+            if not silent:
+                match1 = match.group(1)
+                code = (
+                    int(match1[1:], 16) if match1[0].lower() == "x" else int(match1, 10)
+                )
+
+                token = state.push("text_special", "", 0)
+                token.content = (
+                    fromCodePoint(code)
+                    if isValidEntityCode(code)
+                    else fromCodePoint(0xFFFD)
+                )
+                token.markup = match.group(0)
+                token.info = "entity"
+
+            state.pos += len(match.group(0))
+            return True
+
+    else:
+        if (match := NAMED_RE.search(state.src[pos:])) and match.group(1) in entities:
+            if not silent:
+                token = state.push("text_special", "", 0)
+                token.content = entities[match.group(1)]
+                token.markup = match.group(0)
+                token.info = "entity"
+
+            state.pos += len(match.group(0))
+            return True
+
+    return False
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/escape.py b/.venv/Lib/site-packages/markdown_it/rules_inline/escape.py
new file mode 100644 (file)
index 0000000..9f68b5d
--- /dev/null
@@ -0,0 +1,92 @@
+"""
+Process escaped chars and hardbreaks
+"""
+from ..common.utils import isStrSpace
+from .state_inline import StateInline
+
+
+def escape(state: StateInline, silent: bool) -> bool:
+    """Process escaped chars and hardbreaks."""
+    pos = state.pos
+    maximum = state.posMax
+
+    if state.src[pos] != "\\":
+        return False
+
+    pos += 1
+
+    # '\' at the end of the inline block
+    if pos >= maximum:
+        return False
+
+    ch1 = state.src[pos]
+    ch1_ord = ord(ch1)
+    if ch1 == "\n":
+        if not silent:
+            state.push("hardbreak", "br", 0)
+        pos += 1
+        # skip leading whitespaces from next line
+        while pos < maximum:
+            ch = state.src[pos]
+            if not isStrSpace(ch):
+                break
+            pos += 1
+
+        state.pos = pos
+        return True
+
+    escapedStr = state.src[pos]
+
+    if ch1_ord >= 0xD800 and ch1_ord <= 0xDBFF and pos + 1 < maximum:
+        ch2 = state.src[pos + 1]
+        ch2_ord = ord(ch2)
+        if ch2_ord >= 0xDC00 and ch2_ord <= 0xDFFF:
+            escapedStr += ch2
+            pos += 1
+
+    origStr = "\\" + escapedStr
+
+    if not silent:
+        token = state.push("text_special", "", 0)
+        token.content = escapedStr if ch1 in _ESCAPED else origStr
+        token.markup = origStr
+        token.info = "escape"
+
+    state.pos = pos + 1
+    return True
+
+
+_ESCAPED = {
+    "!",
+    '"',
+    "#",
+    "$",
+    "%",
+    "&",
+    "'",
+    "(",
+    ")",
+    "*",
+    "+",
+    ",",
+    "-",
+    ".",
+    "/",
+    ":",
+    ";",
+    "<",
+    "=",
+    ">",
+    "?",
+    "@",
+    "[",
+    "\\",
+    "]",
+    "^",
+    "_",
+    "`",
+    "{",
+    "|",
+    "}",
+    "~",
+}
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/fragments_join.py b/.venv/Lib/site-packages/markdown_it/rules_inline/fragments_join.py
new file mode 100644 (file)
index 0000000..f795c13
--- /dev/null
@@ -0,0 +1,43 @@
+from .state_inline import StateInline
+
+
+def fragments_join(state: StateInline) -> None:
+    """
+    Clean up tokens after emphasis and strikethrough postprocessing:
+    merge adjacent text nodes into one and re-calculate all token levels
+
+    This is necessary because initially emphasis delimiter markers (``*, _, ~``)
+    are treated as their own separate text tokens. Then emphasis rule either
+    leaves them as text (needed to merge with adjacent text) or turns them
+    into opening/closing tags (which messes up levels inside).
+    """
+    level = 0
+    maximum = len(state.tokens)
+
+    curr = last = 0
+    while curr < maximum:
+        # re-calculate levels after emphasis/strikethrough turns some text nodes
+        # into opening/closing tags
+        if state.tokens[curr].nesting < 0:
+            level -= 1  # closing tag
+        state.tokens[curr].level = level
+        if state.tokens[curr].nesting > 0:
+            level += 1  # opening tag
+
+        if (
+            state.tokens[curr].type == "text"
+            and curr + 1 < maximum
+            and state.tokens[curr + 1].type == "text"
+        ):
+            # collapse two adjacent text nodes
+            state.tokens[curr + 1].content = (
+                state.tokens[curr].content + state.tokens[curr + 1].content
+            )
+        else:
+            if curr != last:
+                state.tokens[last] = state.tokens[curr]
+            last += 1
+        curr += 1
+
+    if curr != last:
+        del state.tokens[last:]
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/html_inline.py b/.venv/Lib/site-packages/markdown_it/rules_inline/html_inline.py
new file mode 100644 (file)
index 0000000..9065e1d
--- /dev/null
@@ -0,0 +1,43 @@
+# Process html tags
+from ..common.html_re import HTML_TAG_RE
+from ..common.utils import isLinkClose, isLinkOpen
+from .state_inline import StateInline
+
+
+def isLetter(ch: int) -> bool:
+    lc = ch | 0x20  # to lower case
+    # /* a */ and /* z */
+    return (lc >= 0x61) and (lc <= 0x7A)
+
+
+def html_inline(state: StateInline, silent: bool) -> bool:
+    pos = state.pos
+
+    if not state.md.options.get("html", None):
+        return False
+
+    # Check start
+    maximum = state.posMax
+    if state.src[pos] != "<" or pos + 2 >= maximum:
+        return False
+
+    # Quick fail on second char
+    ch = state.src[pos + 1]
+    if ch not in ("!", "?", "/") and not isLetter(ord(ch)):  # /* / */
+        return False
+
+    match = HTML_TAG_RE.search(state.src[pos:])
+    if not match:
+        return False
+
+    if not silent:
+        token = state.push("html_inline", "", 0)
+        token.content = state.src[pos : pos + len(match.group(0))]
+
+        if isLinkOpen(token.content):
+            state.linkLevel += 1
+        if isLinkClose(token.content):
+            state.linkLevel -= 1
+
+    state.pos += len(match.group(0))
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/image.py b/.venv/Lib/site-packages/markdown_it/rules_inline/image.py
new file mode 100644 (file)
index 0000000..b4a32a9
--- /dev/null
@@ -0,0 +1,148 @@
+# Process ![image](<src> "title")
+from __future__ import annotations
+
+from ..common.utils import isStrSpace, normalizeReference
+from ..token import Token
+from .state_inline import StateInline
+
+
+def image(state: StateInline, silent: bool) -> bool:
+    label = None
+    href = ""
+    oldPos = state.pos
+    max = state.posMax
+
+    if state.src[state.pos] != "!":
+        return False
+
+    if state.pos + 1 < state.posMax and state.src[state.pos + 1] != "[":
+        return False
+
+    labelStart = state.pos + 2
+    labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, False)
+
+    # parser failed to find ']', so it's not a valid link
+    if labelEnd < 0:
+        return False
+
+    pos = labelEnd + 1
+
+    if pos < max and state.src[pos] == "(":
+        #
+        # Inline link
+        #
+
+        # [link](  <href>  "title"  )
+        #        ^^ skipping these spaces
+        pos += 1
+        while pos < max:
+            ch = state.src[pos]
+            if not isStrSpace(ch) and ch != "\n":
+                break
+            pos += 1
+
+        if pos >= max:
+            return False
+
+        # [link](  <href>  "title"  )
+        #          ^^^^^^ parsing link destination
+        start = pos
+        res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)
+        if res.ok:
+            href = state.md.normalizeLink(res.str)
+            if state.md.validateLink(href):
+                pos = res.pos
+            else:
+                href = ""
+
+        # [link](  <href>  "title"  )
+        #                ^^ skipping these spaces
+        start = pos
+        while pos < max:
+            ch = state.src[pos]
+            if not isStrSpace(ch) and ch != "\n":
+                break
+            pos += 1
+
+        # [link](  <href>  "title"  )
+        #                  ^^^^^^^ parsing link title
+        res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)
+        if pos < max and start != pos and res.ok:
+            title = res.str
+            pos = res.pos
+
+            # [link](  <href>  "title"  )
+            #                         ^^ skipping these spaces
+            while pos < max:
+                ch = state.src[pos]
+                if not isStrSpace(ch) and ch != "\n":
+                    break
+                pos += 1
+        else:
+            title = ""
+
+        if pos >= max or state.src[pos] != ")":
+            state.pos = oldPos
+            return False
+
+        pos += 1
+
+    else:
+        #
+        # Link reference
+        #
+        if "references" not in state.env:
+            return False
+
+        # /* [ */
+        if pos < max and state.src[pos] == "[":
+            start = pos + 1
+            pos = state.md.helpers.parseLinkLabel(state, pos)
+            if pos >= 0:
+                label = state.src[start:pos]
+                pos += 1
+            else:
+                pos = labelEnd + 1
+        else:
+            pos = labelEnd + 1
+
+        # covers label == '' and label == undefined
+        # (collapsed reference link and shortcut reference link respectively)
+        if not label:
+            label = state.src[labelStart:labelEnd]
+
+        label = normalizeReference(label)
+
+        ref = state.env["references"].get(label, None)
+        if not ref:
+            state.pos = oldPos
+            return False
+
+        href = ref["href"]
+        title = ref["title"]
+
+    #
+    # We found the end of the link, and know for a fact it's a valid link
+    # so all that's left to do is to call tokenizer.
+    #
+    if not silent:
+        content = state.src[labelStart:labelEnd]
+
+        tokens: list[Token] = []
+        state.md.inline.parse(content, state.md, state.env, tokens)
+
+        token = state.push("image", "img", 0)
+        token.attrs = {"src": href, "alt": ""}
+        token.children = tokens or None
+        token.content = content
+
+        if title:
+            token.attrSet("title", title)
+
+        # note, this is not part of markdown-it JS, but is useful for renderers
+        if label and state.md.options.get("store_labels", False):
+            token.meta["label"] = label
+
+    state.pos = pos
+    state.posMax = max
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/link.py b/.venv/Lib/site-packages/markdown_it/rules_inline/link.py
new file mode 100644 (file)
index 0000000..78cf912
--- /dev/null
@@ -0,0 +1,151 @@
+# Process [link](<to> "stuff")
+
+from ..common.utils import isStrSpace, normalizeReference
+from .state_inline import StateInline
+
+
+def link(state: StateInline, silent: bool) -> bool:
+    href = ""
+    title = ""
+    label = None
+    oldPos = state.pos
+    maximum = state.posMax
+    start = state.pos
+    parseReference = True
+
+    if state.src[state.pos] != "[":
+        return False
+
+    labelStart = state.pos + 1
+    labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, True)
+
+    # parser failed to find ']', so it's not a valid link
+    if labelEnd < 0:
+        return False
+
+    pos = labelEnd + 1
+
+    if pos < maximum and state.src[pos] == "(":
+        #
+        # Inline link
+        #
+
+        # might have found a valid shortcut link, disable reference parsing
+        parseReference = False
+
+        # [link](  <href>  "title"  )
+        #        ^^ skipping these spaces
+        pos += 1
+        while pos < maximum:
+            ch = state.src[pos]
+            if not isStrSpace(ch) and ch != "\n":
+                break
+            pos += 1
+
+        if pos >= maximum:
+            return False
+
+        # [link](  <href>  "title"  )
+        #          ^^^^^^ parsing link destination
+        start = pos
+        res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax)
+        if res.ok:
+            href = state.md.normalizeLink(res.str)
+            if state.md.validateLink(href):
+                pos = res.pos
+            else:
+                href = ""
+
+            # [link](  <href>  "title"  )
+            #                ^^ skipping these spaces
+            start = pos
+            while pos < maximum:
+                ch = state.src[pos]
+                if not isStrSpace(ch) and ch != "\n":
+                    break
+                pos += 1
+
+            # [link](  <href>  "title"  )
+            #                  ^^^^^^^ parsing link title
+            res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax)
+            if pos < maximum and start != pos and res.ok:
+                title = res.str
+                pos = res.pos
+
+                # [link](  <href>  "title"  )
+                #                         ^^ skipping these spaces
+                while pos < maximum:
+                    ch = state.src[pos]
+                    if not isStrSpace(ch) and ch != "\n":
+                        break
+                    pos += 1
+
+        if pos >= maximum or state.src[pos] != ")":
+            # parsing a valid shortcut link failed, fallback to reference
+            parseReference = True
+
+        pos += 1
+
+    if parseReference:
+        #
+        # Link reference
+        #
+        if "references" not in state.env:
+            return False
+
+        if pos < maximum and state.src[pos] == "[":
+            start = pos + 1
+            pos = state.md.helpers.parseLinkLabel(state, pos)
+            if pos >= 0:
+                label = state.src[start:pos]
+                pos += 1
+            else:
+                pos = labelEnd + 1
+
+        else:
+            pos = labelEnd + 1
+
+        # covers label == '' and label == undefined
+        # (collapsed reference link and shortcut reference link respectively)
+        if not label:
+            label = state.src[labelStart:labelEnd]
+
+        label = normalizeReference(label)
+
+        ref = (
+            state.env["references"][label] if label in state.env["references"] else None
+        )
+        if not ref:
+            state.pos = oldPos
+            return False
+
+        href = ref["href"]
+        title = ref["title"]
+
+    #
+    # We found the end of the link, and know for a fact it's a valid link
+    # so all that's left to do is to call tokenizer.
+    #
+    if not silent:
+        state.pos = labelStart
+        state.posMax = labelEnd
+
+        token = state.push("link_open", "a", 1)
+        token.attrs = {"href": href}
+
+        if title:
+            token.attrSet("title", title)
+
+        # note, this is not part of markdown-it JS, but is useful for renderers
+        if label and state.md.options.get("store_labels", False):
+            token.meta["label"] = label
+
+        state.linkLevel += 1
+        state.md.inline.tokenize(state)
+        state.linkLevel -= 1
+
+        token = state.push("link_close", "a", -1)
+
+    state.pos = pos
+    state.posMax = maximum
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/linkify.py b/.venv/Lib/site-packages/markdown_it/rules_inline/linkify.py
new file mode 100644 (file)
index 0000000..a8a1815
--- /dev/null
@@ -0,0 +1,61 @@
+"""Process links like https://example.org/"""
+import re
+
+from .state_inline import StateInline
+
+# RFC3986: scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+SCHEME_RE = re.compile(r"(?:^|[^a-z0-9.+-])([a-z][a-z0-9.+-]*)$", re.IGNORECASE)
+
+
+def linkify(state: StateInline, silent: bool) -> bool:
+    """Rule for identifying plain-text links."""
+    if not state.md.options.linkify:
+        return False
+    if state.linkLevel > 0:
+        return False
+    if not state.md.linkify:
+        raise ModuleNotFoundError("Linkify enabled but not installed.")
+
+    pos = state.pos
+    maximum = state.posMax
+
+    if (
+        (pos + 3) > maximum
+        or state.src[pos] != ":"
+        or state.src[pos + 1] != "/"
+        or state.src[pos + 2] != "/"
+    ):
+        return False
+
+    if not (match := SCHEME_RE.match(state.pending)):
+        return False
+
+    proto = match.group(1)
+    if not (link := state.md.linkify.match_at_start(state.src[pos - len(proto) :])):
+        return False
+    url: str = link.url
+
+    # disallow '*' at the end of the link (conflicts with emphasis)
+    url = url.rstrip("*")
+
+    full_url = state.md.normalizeLink(url)
+    if not state.md.validateLink(full_url):
+        return False
+
+    if not silent:
+        state.pending = state.pending[: -len(proto)]
+
+        token = state.push("link_open", "a", 1)
+        token.attrs = {"href": full_url}
+        token.markup = "linkify"
+        token.info = "auto"
+
+        token = state.push("text", "", 0)
+        token.content = state.md.normalizeLinkText(url)
+
+        token = state.push("link_close", "a", -1)
+        token.markup = "linkify"
+        token.info = "auto"
+
+    state.pos += len(url) - len(proto)
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/newline.py b/.venv/Lib/site-packages/markdown_it/rules_inline/newline.py
new file mode 100644 (file)
index 0000000..ca8f1db
--- /dev/null
@@ -0,0 +1,43 @@
+"""Proceess '\n'."""
+from ..common.utils import charStrAt, isStrSpace
+from .state_inline import StateInline
+
+
+def newline(state: StateInline, silent: bool) -> bool:
+    pos = state.pos
+
+    if state.src[pos] != "\n":
+        return False
+
+    pmax = len(state.pending) - 1
+    maximum = state.posMax
+
+    # '  \n' -> hardbreak
+    # Lookup in pending chars is bad practice! Don't copy to other rules!
+    # Pending string is stored in concat mode, indexed lookups will cause
+    # conversion to flat mode.
+    if not silent:
+        if pmax >= 0 and charStrAt(state.pending, pmax) == " ":
+            if pmax >= 1 and charStrAt(state.pending, pmax - 1) == " ":
+                # Find whitespaces tail of pending chars.
+                ws = pmax - 1
+                while ws >= 1 and charStrAt(state.pending, ws - 1) == " ":
+                    ws -= 1
+                state.pending = state.pending[:ws]
+
+                state.push("hardbreak", "br", 0)
+            else:
+                state.pending = state.pending[:-1]
+                state.push("softbreak", "br", 0)
+
+        else:
+            state.push("softbreak", "br", 0)
+
+    pos += 1
+
+    # skip heading spaces for next line
+    while pos < maximum and isStrSpace(state.src[pos]):
+        pos += 1
+
+    state.pos = pos
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/state_inline.py b/.venv/Lib/site-packages/markdown_it/rules_inline/state_inline.py
new file mode 100644 (file)
index 0000000..c0c491c
--- /dev/null
@@ -0,0 +1,166 @@
+from __future__ import annotations
+
+from collections import namedtuple
+from dataclasses import dataclass
+from typing import TYPE_CHECKING, Any, Literal
+
+from .._compat import DATACLASS_KWARGS
+from ..common.utils import isMdAsciiPunct, isPunctChar, isWhiteSpace
+from ..ruler import StateBase
+from ..token import Token
+from ..utils import EnvType
+
+if TYPE_CHECKING:
+    from markdown_it import MarkdownIt
+
+
+@dataclass(**DATACLASS_KWARGS)
+class Delimiter:
+    # Char code of the starting marker (number).
+    marker: int
+
+    # Total length of these series of delimiters.
+    length: int
+
+    # A position of the token this delimiter corresponds to.
+    token: int
+
+    # If this delimiter is matched as a valid opener, `end` will be
+    # equal to its position, otherwise it's `-1`.
+    end: int
+
+    # Boolean flags that determine if this delimiter could open or close
+    # an emphasis.
+    open: bool
+    close: bool
+
+    level: bool | None = None
+
+
+Scanned = namedtuple("Scanned", ["can_open", "can_close", "length"])
+
+
+class StateInline(StateBase):
+    def __init__(
+        self, src: str, md: MarkdownIt, env: EnvType, outTokens: list[Token]
+    ) -> None:
+        self.src = src
+        self.env = env
+        self.md = md
+        self.tokens = outTokens
+        self.tokens_meta: list[dict[str, Any] | None] = [None] * len(outTokens)
+
+        self.pos = 0
+        self.posMax = len(self.src)
+        self.level = 0
+        self.pending = ""
+        self.pendingLevel = 0
+
+        # Stores { start: end } pairs. Useful for backtrack
+        # optimization of pairs parse (emphasis, strikes).
+        self.cache: dict[int, int] = {}
+
+        # List of emphasis-like delimiters for current tag
+        self.delimiters: list[Delimiter] = []
+
+        # Stack of delimiter lists for upper level tags
+        self._prev_delimiters: list[list[Delimiter]] = []
+
+        # backticklength => last seen position
+        self.backticks: dict[int, int] = {}
+        self.backticksScanned = False
+
+        # Counter used to disable inline linkify-it execution
+        # inside <a> and markdown links
+        self.linkLevel = 0
+
+    def __repr__(self) -> str:
+        return (
+            f"{self.__class__.__name__}"
+            f"(pos=[{self.pos} of {self.posMax}], token={len(self.tokens)})"
+        )
+
+    def pushPending(self) -> Token:
+        token = Token("text", "", 0)
+        token.content = self.pending
+        token.level = self.pendingLevel
+        self.tokens.append(token)
+        self.pending = ""
+        return token
+
+    def push(self, ttype: str, tag: str, nesting: Literal[-1, 0, 1]) -> Token:
+        """Push new token to "stream".
+        If pending text exists - flush it as text token
+        """
+        if self.pending:
+            self.pushPending()
+
+        token = Token(ttype, tag, nesting)
+        token_meta = None
+
+        if nesting < 0:
+            # closing tag
+            self.level -= 1
+            self.delimiters = self._prev_delimiters.pop()
+
+        token.level = self.level
+
+        if nesting > 0:
+            # opening tag
+            self.level += 1
+            self._prev_delimiters.append(self.delimiters)
+            self.delimiters = []
+            token_meta = {"delimiters": self.delimiters}
+
+        self.pendingLevel = self.level
+        self.tokens.append(token)
+        self.tokens_meta.append(token_meta)
+        return token
+
+    def scanDelims(self, start: int, canSplitWord: bool) -> Scanned:
+        """
+        Scan a sequence of emphasis-like markers, and determine whether
+        it can start an emphasis sequence or end an emphasis sequence.
+
+         - start - position to scan from (it should point at a valid marker);
+         - canSplitWord - determine if these markers can be found inside a word
+
+        """
+        pos = start
+        maximum = self.posMax
+        marker = self.src[start]
+
+        # treat beginning of the line as a whitespace
+        lastChar = self.src[start - 1] if start > 0 else " "
+
+        while pos < maximum and self.src[pos] == marker:
+            pos += 1
+
+        count = pos - start
+
+        # treat end of the line as a whitespace
+        nextChar = self.src[pos] if pos < maximum else " "
+
+        isLastPunctChar = isMdAsciiPunct(ord(lastChar)) or isPunctChar(lastChar)
+        isNextPunctChar = isMdAsciiPunct(ord(nextChar)) or isPunctChar(nextChar)
+
+        isLastWhiteSpace = isWhiteSpace(ord(lastChar))
+        isNextWhiteSpace = isWhiteSpace(ord(nextChar))
+
+        left_flanking = not (
+            isNextWhiteSpace
+            or (isNextPunctChar and not (isLastWhiteSpace or isLastPunctChar))
+        )
+        right_flanking = not (
+            isLastWhiteSpace
+            or (isLastPunctChar and not (isNextWhiteSpace or isNextPunctChar))
+        )
+
+        if not canSplitWord:
+            can_open = left_flanking and ((not right_flanking) or isLastPunctChar)
+            can_close = right_flanking and ((not left_flanking) or isNextPunctChar)
+        else:
+            can_open = left_flanking
+            can_close = right_flanking
+
+        return Scanned(can_open, can_close, count)
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/strikethrough.py b/.venv/Lib/site-packages/markdown_it/rules_inline/strikethrough.py
new file mode 100644 (file)
index 0000000..ec81628
--- /dev/null
@@ -0,0 +1,127 @@
+# ~~strike through~~
+from __future__ import annotations
+
+from .state_inline import Delimiter, StateInline
+
+
+def tokenize(state: StateInline, silent: bool) -> bool:
+    """Insert each marker as a separate text token, and add it to delimiter list"""
+    start = state.pos
+    ch = state.src[start]
+
+    if silent:
+        return False
+
+    if ch != "~":
+        return False
+
+    scanned = state.scanDelims(state.pos, True)
+    length = scanned.length
+
+    if length < 2:
+        return False
+
+    if length % 2:
+        token = state.push("text", "", 0)
+        token.content = ch
+        length -= 1
+
+    i = 0
+    while i < length:
+        token = state.push("text", "", 0)
+        token.content = ch + ch
+        state.delimiters.append(
+            Delimiter(
+                marker=ord(ch),
+                length=0,  # disable "rule of 3" length checks meant for emphasis
+                token=len(state.tokens) - 1,
+                end=-1,
+                open=scanned.can_open,
+                close=scanned.can_close,
+            )
+        )
+
+        i += 2
+
+    state.pos += scanned.length
+
+    return True
+
+
+def _postProcess(state: StateInline, delimiters: list[Delimiter]) -> None:
+    loneMarkers = []
+    maximum = len(delimiters)
+
+    i = 0
+    while i < maximum:
+        startDelim = delimiters[i]
+
+        if startDelim.marker != 0x7E:  # /* ~ */
+            i += 1
+            continue
+
+        if startDelim.end == -1:
+            i += 1
+            continue
+
+        endDelim = delimiters[startDelim.end]
+
+        token = state.tokens[startDelim.token]
+        token.type = "s_open"
+        token.tag = "s"
+        token.nesting = 1
+        token.markup = "~~"
+        token.content = ""
+
+        token = state.tokens[endDelim.token]
+        token.type = "s_close"
+        token.tag = "s"
+        token.nesting = -1
+        token.markup = "~~"
+        token.content = ""
+
+        if (
+            state.tokens[endDelim.token - 1].type == "text"
+            and state.tokens[endDelim.token - 1].content == "~"
+        ):
+            loneMarkers.append(endDelim.token - 1)
+
+        i += 1
+
+    # If a marker sequence has an odd number of characters, it's split
+    # like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the
+    # start of the sequence.
+    #
+    # So, we have to move all those markers after subsequent s_close tags.
+    #
+    while loneMarkers:
+        i = loneMarkers.pop()
+        j = i + 1
+
+        while (j < len(state.tokens)) and (state.tokens[j].type == "s_close"):
+            j += 1
+
+        j -= 1
+
+        if i != j:
+            token = state.tokens[j]
+            state.tokens[j] = state.tokens[i]
+            state.tokens[i] = token
+
+
+def postProcess(state: StateInline) -> None:
+    """Walk through delimiter list and replace text tokens with tags."""
+    tokens_meta = state.tokens_meta
+    maximum = len(state.tokens_meta)
+    _postProcess(state, state.delimiters)
+
+    curr = 0
+    while curr < maximum:
+        try:
+            curr_meta = tokens_meta[curr]
+        except IndexError:
+            pass
+        else:
+            if curr_meta and "delimiters" in curr_meta:
+                _postProcess(state, curr_meta["delimiters"])
+        curr += 1
diff --git a/.venv/Lib/site-packages/markdown_it/rules_inline/text.py b/.venv/Lib/site-packages/markdown_it/rules_inline/text.py
new file mode 100644 (file)
index 0000000..f306b2e
--- /dev/null
@@ -0,0 +1,53 @@
+# Skip text characters for text token, place those to pending buffer
+# and increment current pos
+from .state_inline import StateInline
+
+# Rule to skip pure text
+# '{}$%@~+=:' reserved for extensions
+
+# !!!! Don't confuse with "Markdown ASCII Punctuation" chars
+# http://spec.commonmark.org/0.15/#ascii-punctuation-character
+
+
+_TerminatorChars = {
+    "\n",
+    "!",
+    "#",
+    "$",
+    "%",
+    "&",
+    "*",
+    "+",
+    "-",
+    ":",
+    "<",
+    "=",
+    ">",
+    "@",
+    "[",
+    "\\",
+    "]",
+    "^",
+    "_",
+    "`",
+    "{",
+    "}",
+    "~",
+}
+
+
+def text(state: StateInline, silent: bool) -> bool:
+    pos = state.pos
+    posMax = state.posMax
+    while (pos < posMax) and state.src[pos] not in _TerminatorChars:
+        pos += 1
+
+    if pos == state.pos:
+        return False
+
+    if not silent:
+        state.pending += state.src[state.pos : pos]
+
+    state.pos = pos
+
+    return True
diff --git a/.venv/Lib/site-packages/markdown_it/token.py b/.venv/Lib/site-packages/markdown_it/token.py
new file mode 100644 (file)
index 0000000..90008b7
--- /dev/null
@@ -0,0 +1,180 @@
+from __future__ import annotations
+
+from collections.abc import Callable, MutableMapping
+import dataclasses as dc
+from typing import Any, Literal
+import warnings
+
+from markdown_it._compat import DATACLASS_KWARGS
+
+
+def convert_attrs(value: Any) -> Any:
+    """Convert Token.attrs set as ``None`` or ``[[key, value], ...]`` to a dict.
+
+    This improves compatibility with upstream markdown-it.
+    """
+    if not value:
+        return {}
+    if isinstance(value, list):
+        return dict(value)
+    return value
+
+
+@dc.dataclass(**DATACLASS_KWARGS)
+class Token:
+    type: str
+    """Type of the token (string, e.g. "paragraph_open")"""
+
+    tag: str
+    """HTML tag name, e.g. 'p'"""
+
+    nesting: Literal[-1, 0, 1]
+    """Level change (number in {-1, 0, 1} set), where:
+    -  `1` means the tag is opening
+    -  `0` means the tag is self-closing
+    - `-1` means the tag is closing
+    """
+
+    attrs: dict[str, str | int | float] = dc.field(default_factory=dict)
+    """HTML attributes.
+    Note this differs from the upstream "list of lists" format,
+    although than an instance can still be initialised with this format.
+    """
+
+    map: list[int] | None = None
+    """Source map info. Format: `[ line_begin, line_end ]`"""
+
+    level: int = 0
+    """Nesting level, the same as `state.level`"""
+
+    children: list[Token] | None = None
+    """Array of child nodes (inline and img tokens)."""
+
+    content: str = ""
+    """Inner content, in the case of a self-closing tag (code, html, fence, etc.),"""
+
+    markup: str = ""
+    """'*' or '_' for emphasis, fence string for fence, etc."""
+
+    info: str = ""
+    """Additional information:
+    - Info string for "fence" tokens
+    - The value "auto" for autolink "link_open" and "link_close" tokens
+    - The string value of the item marker for ordered-list "list_item_open" tokens
+    """
+
+    meta: dict[Any, Any] = dc.field(default_factory=dict)
+    """A place for plugins to store any arbitrary data"""
+
+    block: bool = False
+    """True for block-level tokens, false for inline tokens.
+    Used in renderer to calculate line breaks
+    """
+
+    hidden: bool = False
+    """If true, ignore this element when rendering.
+    Used for tight lists to hide paragraphs.
+    """
+
+    def __post_init__(self) -> None:
+        self.attrs = convert_attrs(self.attrs)
+
+    def attrIndex(self, name: str) -> int:
+        warnings.warn(  # noqa: B028
+            "Token.attrIndex should not be used, since Token.attrs is a dictionary",
+            UserWarning,
+        )
+        if name not in self.attrs:
+            return -1
+        return list(self.attrs.keys()).index(name)
+
+    def attrItems(self) -> list[tuple[str, str | int | float]]:
+        """Get (key, value) list of attrs."""
+        return list(self.attrs.items())
+
+    def attrPush(self, attrData: tuple[str, str | int | float]) -> None:
+        """Add `[ name, value ]` attribute to list. Init attrs if necessary."""
+        name, value = attrData
+        self.attrSet(name, value)
+
+    def attrSet(self, name: str, value: str | int | float) -> None:
+        """Set `name` attribute to `value`. Override old value if exists."""
+        self.attrs[name] = value
+
+    def attrGet(self, name: str) -> None | str | int | float:
+        """Get the value of attribute `name`, or null if it does not exist."""
+        return self.attrs.get(name, None)
+
+    def attrJoin(self, name: str, value: str) -> None:
+        """Join value to existing attribute via space.
+        Or create new attribute if not exists.
+        Useful to operate with token classes.
+        """
+        if name in self.attrs:
+            current = self.attrs[name]
+            if not isinstance(current, str):
+                raise TypeError(
+                    f"existing attr 'name' is not a str: {self.attrs[name]}"
+                )
+            self.attrs[name] = f"{current} {value}"
+        else:
+            self.attrs[name] = value
+
+    def copy(self, **changes: Any) -> Token:
+        """Return a shallow copy of the instance."""
+        return dc.replace(self, **changes)
+
+    def as_dict(
+        self,
+        *,
+        children: bool = True,
+        as_upstream: bool = True,
+        meta_serializer: Callable[[dict[Any, Any]], Any] | None = None,
+        filter: Callable[[str, Any], bool] | None = None,
+        dict_factory: Callable[..., MutableMapping[str, Any]] = dict,
+    ) -> MutableMapping[str, Any]:
+        """Return the token as a dictionary.
+
+        :param children: Also convert children to dicts
+        :param as_upstream: Ensure the output dictionary is equal to that created by markdown-it
+            For example, attrs are converted to null or lists
+        :param meta_serializer: hook for serializing ``Token.meta``
+        :param filter: A callable whose return code determines whether an
+            attribute or element is included (``True``) or dropped (``False``).
+            Is called with the (key, value) pair.
+        :param dict_factory: A callable to produce dictionaries from.
+            For example, to produce ordered dictionaries instead of normal Python
+            dictionaries, pass in ``collections.OrderedDict``.
+
+        """
+        mapping = dict_factory((f.name, getattr(self, f.name)) for f in dc.fields(self))
+        if filter:
+            mapping = dict_factory((k, v) for k, v in mapping.items() if filter(k, v))
+        if as_upstream and "attrs" in mapping:
+            mapping["attrs"] = (
+                None
+                if not mapping["attrs"]
+                else [[k, v] for k, v in mapping["attrs"].items()]
+            )
+        if meta_serializer and "meta" in mapping:
+            mapping["meta"] = meta_serializer(mapping["meta"])
+        if children and mapping.get("children", None):
+            mapping["children"] = [
+                child.as_dict(
+                    children=children,
+                    filter=filter,
+                    dict_factory=dict_factory,
+                    as_upstream=as_upstream,
+                    meta_serializer=meta_serializer,
+                )
+                for child in mapping["children"]
+            ]
+        return mapping
+
+    @classmethod
+    def from_dict(cls, dct: MutableMapping[str, Any]) -> Token:
+        """Convert a dict to a Token."""
+        token = cls(**dct)
+        if token.children:
+            token.children = [cls.from_dict(c) for c in token.children]  # type: ignore[arg-type]
+        return token
diff --git a/.venv/Lib/site-packages/markdown_it/tree.py b/.venv/Lib/site-packages/markdown_it/tree.py
new file mode 100644 (file)
index 0000000..6641e5a
--- /dev/null
@@ -0,0 +1,345 @@
+"""A tree representation of a linear markdown-it token stream.
+
+This module is not part of upstream JavaScript markdown-it.
+"""
+from __future__ import annotations
+
+from collections.abc import Generator, Sequence
+import textwrap
+from typing import Any, NamedTuple, TypeVar, overload
+
+from .token import Token
+
+
+class _NesterTokens(NamedTuple):
+    opening: Token
+    closing: Token
+
+
+_NodeType = TypeVar("_NodeType", bound="SyntaxTreeNode")
+
+
+class SyntaxTreeNode:
+    """A Markdown syntax tree node.
+
+    A class that can be used to construct a tree representation of a linear
+    `markdown-it-py` token stream.
+
+    Each node in the tree represents either:
+      - root of the Markdown document
+      - a single unnested `Token`
+      - a `Token` "_open" and "_close" token pair, and the tokens nested in
+          between
+    """
+
+    def __init__(
+        self, tokens: Sequence[Token] = (), *, create_root: bool = True
+    ) -> None:
+        """Initialize a `SyntaxTreeNode` from a token stream.
+
+        If `create_root` is True, create a root node for the document.
+        """
+        # Only nodes representing an unnested token have self.token
+        self.token: Token | None = None
+
+        # Only containers have nester tokens
+        self.nester_tokens: _NesterTokens | None = None
+
+        # Root node does not have self.parent
+        self._parent: Any = None
+
+        # Empty list unless a non-empty container, or unnested token that has
+        # children (i.e. inline or img)
+        self._children: list[Any] = []
+
+        if create_root:
+            self._set_children_from_tokens(tokens)
+            return
+
+        if not tokens:
+            raise ValueError(
+                "Can only create root from empty token sequence."
+                " Set `create_root=True`."
+            )
+        elif len(tokens) == 1:
+            inline_token = tokens[0]
+            if inline_token.nesting:
+                raise ValueError(
+                    "Unequal nesting level at the start and end of token stream."
+                )
+            self.token = inline_token
+            if inline_token.children:
+                self._set_children_from_tokens(inline_token.children)
+        else:
+            self.nester_tokens = _NesterTokens(tokens[0], tokens[-1])
+            self._set_children_from_tokens(tokens[1:-1])
+
+    def __repr__(self) -> str:
+        return f"{type(self).__name__}({self.type})"
+
+    @overload
+    def __getitem__(self: _NodeType, item: int) -> _NodeType:
+        ...
+
+    @overload
+    def __getitem__(self: _NodeType, item: slice) -> list[_NodeType]:
+        ...
+
+    def __getitem__(self: _NodeType, item: int | slice) -> _NodeType | list[_NodeType]:
+        return self.children[item]
+
+    def to_tokens(self: _NodeType) -> list[Token]:
+        """Recover the linear token stream."""
+
+        def recursive_collect_tokens(node: _NodeType, token_list: list[Token]) -> None:
+            if node.type == "root":
+                for child in node.children:
+                    recursive_collect_tokens(child, token_list)
+            elif node.token:
+                token_list.append(node.token)
+            else:
+                assert node.nester_tokens
+                token_list.append(node.nester_tokens.opening)
+                for child in node.children:
+                    recursive_collect_tokens(child, token_list)
+                token_list.append(node.nester_tokens.closing)
+
+        tokens: list[Token] = []
+        recursive_collect_tokens(self, tokens)
+        return tokens
+
+    @property
+    def children(self: _NodeType) -> list[_NodeType]:
+        return self._children
+
+    @children.setter
+    def children(self: _NodeType, value: list[_NodeType]) -> None:
+        self._children = value
+
+    @property
+    def parent(self: _NodeType) -> _NodeType | None:
+        return self._parent  # type: ignore
+
+    @parent.setter
+    def parent(self: _NodeType, value: _NodeType | None) -> None:
+        self._parent = value
+
+    @property
+    def is_root(self) -> bool:
+        """Is the node a special root node?"""
+        return not (self.token or self.nester_tokens)
+
+    @property
+    def is_nested(self) -> bool:
+        """Is this node nested?.
+
+        Returns `True` if the node represents a `Token` pair and tokens in the
+        sequence between them, where `Token.nesting` of the first `Token` in
+        the pair is 1 and nesting of the other `Token` is -1.
+        """
+        return bool(self.nester_tokens)
+
+    @property
+    def siblings(self: _NodeType) -> Sequence[_NodeType]:
+        """Get siblings of the node.
+
+        Gets the whole group of siblings, including self.
+        """
+        if not self.parent:
+            return [self]
+        return self.parent.children
+
+    @property
+    def type(self) -> str:
+        """Get a string type of the represented syntax.
+
+        - "root" for root nodes
+        - `Token.type` if the node represents an unnested token
+        - `Token.type` of the opening token, with "_open" suffix stripped, if
+            the node represents a nester token pair
+        """
+        if self.is_root:
+            return "root"
+        if self.token:
+            return self.token.type
+        assert self.nester_tokens
+        return _removesuffix(self.nester_tokens.opening.type, "_open")
+
+    @property
+    def next_sibling(self: _NodeType) -> _NodeType | None:
+        """Get the next node in the sequence of siblings.
+
+        Returns `None` if this is the last sibling.
+        """
+        self_index = self.siblings.index(self)
+        if self_index + 1 < len(self.siblings):
+            return self.siblings[self_index + 1]
+        return None
+
+    @property
+    def previous_sibling(self: _NodeType) -> _NodeType | None:
+        """Get the previous node in the sequence of siblings.
+
+        Returns `None` if this is the first sibling.
+        """
+        self_index = self.siblings.index(self)
+        if self_index - 1 >= 0:
+            return self.siblings[self_index - 1]
+        return None
+
+    def _add_child(
+        self,
+        tokens: Sequence[Token],
+    ) -> None:
+        """Make a child node for `self`."""
+        child = type(self)(tokens, create_root=False)
+        child.parent = self
+        self.children.append(child)
+
+    def _set_children_from_tokens(self, tokens: Sequence[Token]) -> None:
+        """Convert the token stream to a tree structure and set the resulting
+        nodes as children of `self`."""
+        reversed_tokens = list(reversed(tokens))
+        while reversed_tokens:
+            token = reversed_tokens.pop()
+
+            if not token.nesting:
+                self._add_child([token])
+                continue
+            if token.nesting != 1:
+                raise ValueError("Invalid token nesting")
+
+            nested_tokens = [token]
+            nesting = 1
+            while reversed_tokens and nesting:
+                token = reversed_tokens.pop()
+                nested_tokens.append(token)
+                nesting += token.nesting
+            if nesting:
+                raise ValueError(f"unclosed tokens starting {nested_tokens[0]}")
+
+            self._add_child(nested_tokens)
+
+    def pretty(
+        self, *, indent: int = 2, show_text: bool = False, _current: int = 0
+    ) -> str:
+        """Create an XML style string of the tree."""
+        prefix = " " * _current
+        text = prefix + f"<{self.type}"
+        if not self.is_root and self.attrs:
+            text += " " + " ".join(f"{k}={v!r}" for k, v in self.attrs.items())
+        text += ">"
+        if (
+            show_text
+            and not self.is_root
+            and self.type in ("text", "text_special")
+            and self.content
+        ):
+            text += "\n" + textwrap.indent(self.content, prefix + " " * indent)
+        for child in self.children:
+            text += "\n" + child.pretty(
+                indent=indent, show_text=show_text, _current=_current + indent
+            )
+        return text
+
+    def walk(
+        self: _NodeType, *, include_self: bool = True
+    ) -> Generator[_NodeType, None, None]:
+        """Recursively yield all descendant nodes in the tree starting at self.
+
+        The order mimics the order of the underlying linear token
+        stream (i.e. depth first).
+        """
+        if include_self:
+            yield self
+        for child in self.children:
+            yield from child.walk(include_self=True)
+
+    # NOTE:
+    # The values of the properties defined below directly map to properties
+    # of the underlying `Token`s. A root node does not translate to a `Token`
+    # object, so calling these property getters on a root node will raise an
+    # `AttributeError`.
+    #
+    # There is no mapping for `Token.nesting` because the `is_nested` property
+    # provides that data, and can be called on any node type, including root.
+
+    def _attribute_token(self) -> Token:
+        """Return the `Token` that is used as the data source for the
+        properties defined below."""
+        if self.token:
+            return self.token
+        if self.nester_tokens:
+            return self.nester_tokens.opening
+        raise AttributeError("Root node does not have the accessed attribute")
+
+    @property
+    def tag(self) -> str:
+        """html tag name, e.g. \"p\" """
+        return self._attribute_token().tag
+
+    @property
+    def attrs(self) -> dict[str, str | int | float]:
+        """Html attributes."""
+        return self._attribute_token().attrs
+
+    def attrGet(self, name: str) -> None | str | int | float:
+        """Get the value of attribute `name`, or null if it does not exist."""
+        return self._attribute_token().attrGet(name)
+
+    @property
+    def map(self) -> tuple[int, int] | None:
+        """Source map info. Format: `tuple[ line_begin, line_end ]`"""
+        map_ = self._attribute_token().map
+        if map_:
+            # Type ignore because `Token`s attribute types are not perfect
+            return tuple(map_)  # type: ignore
+        return None
+
+    @property
+    def level(self) -> int:
+        """nesting level, the same as `state.level`"""
+        return self._attribute_token().level
+
+    @property
+    def content(self) -> str:
+        """In a case of self-closing tag (code, html, fence, etc.), it
+        has contents of this tag."""
+        return self._attribute_token().content
+
+    @property
+    def markup(self) -> str:
+        """'*' or '_' for emphasis, fence string for fence, etc."""
+        return self._attribute_token().markup
+
+    @property
+    def info(self) -> str:
+        """fence infostring"""
+        return self._attribute_token().info
+
+    @property
+    def meta(self) -> dict[Any, Any]:
+        """A place for plugins to store an arbitrary data."""
+        return self._attribute_token().meta
+
+    @property
+    def block(self) -> bool:
+        """True for block-level tokens, false for inline tokens."""
+        return self._attribute_token().block
+
+    @property
+    def hidden(self) -> bool:
+        """If it's true, ignore this element when rendering.
+        Used for tight lists to hide paragraphs."""
+        return self._attribute_token().hidden
+
+
+def _removesuffix(string: str, suffix: str) -> str:
+    """Remove a suffix from a string.
+
+    Replace this with str.removesuffix() from stdlib when minimum Python
+    version is 3.9.
+    """
+    if suffix and string.endswith(suffix):
+        return string[: -len(suffix)]
+    return string
diff --git a/.venv/Lib/site-packages/markdown_it/utils.py b/.venv/Lib/site-packages/markdown_it/utils.py
new file mode 100644 (file)
index 0000000..a979372
--- /dev/null
@@ -0,0 +1,176 @@
+from __future__ import annotations
+
+from collections.abc import MutableMapping as MutableMappingABC
+from pathlib import Path
+from typing import Any, Callable, Iterable, MutableMapping, TypedDict, cast
+
+EnvType = MutableMapping[str, Any]  # note: could use TypeAlias in python 3.10
+"""Type for the environment sandbox used in parsing and rendering,
+which stores mutable variables for use by plugins and rules.
+"""
+
+
+class OptionsType(TypedDict):
+    """Options for parsing."""
+
+    maxNesting: int
+    """Internal protection, recursion limit."""
+    html: bool
+    """Enable HTML tags in source."""
+    linkify: bool
+    """Enable autoconversion of URL-like texts to links."""
+    typographer: bool
+    """Enable smartquotes and replacements."""
+    quotes: str
+    """Quote characters."""
+    xhtmlOut: bool
+    """Use '/' to close single tags (<br />)."""
+    breaks: bool
+    """Convert newlines in paragraphs into <br>."""
+    langPrefix: str
+    """CSS language prefix for fenced blocks."""
+    highlight: Callable[[str, str, str], str] | None
+    """Highlighter function: (content, lang, attrs) -> str."""
+
+
+class PresetType(TypedDict):
+    """Preset configuration for markdown-it."""
+
+    options: OptionsType
+    """Options for parsing."""
+    components: MutableMapping[str, MutableMapping[str, list[str]]]
+    """Components for parsing and rendering."""
+
+
+class OptionsDict(MutableMappingABC):  # type: ignore
+    """A dictionary, with attribute access to core markdownit configuration options."""
+
+    # Note: ideally we would probably just remove attribute access entirely,
+    # but we keep it for backwards compatibility.
+
+    def __init__(self, options: OptionsType) -> None:
+        self._options = cast(OptionsType, dict(options))
+
+    def __getitem__(self, key: str) -> Any:
+        return self._options[key]  # type: ignore[literal-required]
+
+    def __setitem__(self, key: str, value: Any) -> None:
+        self._options[key] = value  # type: ignore[literal-required]
+
+    def __delitem__(self, key: str) -> None:
+        del self._options[key]  # type: ignore
+
+    def __iter__(self) -> Iterable[str]:  # type: ignore
+        return iter(self._options)
+
+    def __len__(self) -> int:
+        return len(self._options)
+
+    def __repr__(self) -> str:
+        return repr(self._options)
+
+    def __str__(self) -> str:
+        return str(self._options)
+
+    @property
+    def maxNesting(self) -> int:
+        """Internal protection, recursion limit."""
+        return self._options["maxNesting"]
+
+    @maxNesting.setter
+    def maxNesting(self, value: int) -> None:
+        self._options["maxNesting"] = value
+
+    @property
+    def html(self) -> bool:
+        """Enable HTML tags in source."""
+        return self._options["html"]
+
+    @html.setter
+    def html(self, value: bool) -> None:
+        self._options["html"] = value
+
+    @property
+    def linkify(self) -> bool:
+        """Enable autoconversion of URL-like texts to links."""
+        return self._options["linkify"]
+
+    @linkify.setter
+    def linkify(self, value: bool) -> None:
+        self._options["linkify"] = value
+
+    @property
+    def typographer(self) -> bool:
+        """Enable smartquotes and replacements."""
+        return self._options["typographer"]
+
+    @typographer.setter
+    def typographer(self, value: bool) -> None:
+        self._options["typographer"] = value
+
+    @property
+    def quotes(self) -> str:
+        """Quote characters."""
+        return self._options["quotes"]
+
+    @quotes.setter
+    def quotes(self, value: str) -> None:
+        self._options["quotes"] = value
+
+    @property
+    def xhtmlOut(self) -> bool:
+        """Use '/' to close single tags (<br />)."""
+        return self._options["xhtmlOut"]
+
+    @xhtmlOut.setter
+    def xhtmlOut(self, value: bool) -> None:
+        self._options["xhtmlOut"] = value
+
+    @property
+    def breaks(self) -> bool:
+        """Convert newlines in paragraphs into <br>."""
+        return self._options["breaks"]
+
+    @breaks.setter
+    def breaks(self, value: bool) -> None:
+        self._options["breaks"] = value
+
+    @property
+    def langPrefix(self) -> str:
+        """CSS language prefix for fenced blocks."""
+        return self._options["langPrefix"]
+
+    @langPrefix.setter
+    def langPrefix(self, value: str) -> None:
+        self._options["langPrefix"] = value
+
+    @property
+    def highlight(self) -> Callable[[str, str, str], str] | None:
+        """Highlighter function: (content, langName, langAttrs) -> escaped HTML."""
+        return self._options["highlight"]
+
+    @highlight.setter
+    def highlight(self, value: Callable[[str, str, str], str] | None) -> None:
+        self._options["highlight"] = value
+
+
+def read_fixture_file(path: str | Path) -> list[list[Any]]:
+    text = Path(path).read_text(encoding="utf-8")
+    tests = []
+    section = 0
+    last_pos = 0
+    lines = text.splitlines(keepends=True)
+    for i in range(len(lines)):
+        if lines[i].rstrip() == ".":
+            if section == 0:
+                tests.append([i, lines[i - 1].strip()])
+                section = 1
+            elif section == 1:
+                tests[-1].append("".join(lines[last_pos + 1 : i]))
+                section = 2
+            elif section == 2:
+                tests[-1].append("".join(lines[last_pos + 1 : i]))
+                section = 0
+
+            last_pos = i
+    return tests
diff --git a/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/INSTALLER b/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/INSTALLER
new file mode 100644 (file)
index 0000000..a1b589e
--- /dev/null
@@ -0,0 +1 @@
+pip
diff --git a/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE b/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE
new file mode 100644 (file)
index 0000000..582ddf5
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 ExecutableBookProject
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE.markdown-it b/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE.markdown-it
new file mode 100644 (file)
index 0000000..7ffa058
--- /dev/null
@@ -0,0 +1,22 @@
+Copyright (c) 2014 Vitaly Puzrin, Alex Kocharin.
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/METADATA b/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/METADATA
new file mode 100644 (file)
index 0000000..8a2978b
--- /dev/null
@@ -0,0 +1,205 @@
+Metadata-Version: 2.1
+Name: markdown-it-py
+Version: 3.0.0
+Summary: Python port of markdown-it. Markdown parsing, done right!
+Keywords: markdown,lexer,parser,commonmark,markdown-it
+Author-email: Chris Sewell <chrisj_sewell@hotmail.com>
+Requires-Python: >=3.8
+Description-Content-Type: text/markdown
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Text Processing :: Markup
+Requires-Dist: mdurl~=0.1
+Requires-Dist: psutil ; extra == "benchmarking"
+Requires-Dist: pytest ; extra == "benchmarking"
+Requires-Dist: pytest-benchmark ; extra == "benchmarking"
+Requires-Dist: pre-commit~=3.0 ; extra == "code_style"
+Requires-Dist: commonmark~=0.9 ; extra == "compare"
+Requires-Dist: markdown~=3.4 ; extra == "compare"
+Requires-Dist: mistletoe~=1.0 ; extra == "compare"
+Requires-Dist: mistune~=2.0 ; extra == "compare"
+Requires-Dist: panflute~=2.3 ; extra == "compare"
+Requires-Dist: linkify-it-py>=1,<3 ; extra == "linkify"
+Requires-Dist: mdit-py-plugins ; extra == "plugins"
+Requires-Dist: gprof2dot ; extra == "profiling"
+Requires-Dist: mdit-py-plugins ; extra == "rtd"
+Requires-Dist: myst-parser ; extra == "rtd"
+Requires-Dist: pyyaml ; extra == "rtd"
+Requires-Dist: sphinx ; extra == "rtd"
+Requires-Dist: sphinx-copybutton ; extra == "rtd"
+Requires-Dist: sphinx-design ; extra == "rtd"
+Requires-Dist: sphinx_book_theme ; extra == "rtd"
+Requires-Dist: jupyter_sphinx ; extra == "rtd"
+Requires-Dist: coverage ; extra == "testing"
+Requires-Dist: pytest ; extra == "testing"
+Requires-Dist: pytest-cov ; extra == "testing"
+Requires-Dist: pytest-regressions ; extra == "testing"
+Project-URL: Documentation, https://markdown-it-py.readthedocs.io
+Project-URL: Homepage, https://github.com/executablebooks/markdown-it-py
+Provides-Extra: benchmarking
+Provides-Extra: code_style
+Provides-Extra: compare
+Provides-Extra: linkify
+Provides-Extra: plugins
+Provides-Extra: profiling
+Provides-Extra: rtd
+Provides-Extra: testing
+
+# markdown-it-py
+
+[![Github-CI][github-ci]][github-link]
+[![Coverage Status][codecov-badge]][codecov-link]
+[![PyPI][pypi-badge]][pypi-link]
+[![Conda][conda-badge]][conda-link]
+[![Code style: black][black-badge]][black-link]
+[![PyPI - Downloads][install-badge]][install-link]
+
+> Markdown parser done right.
+
+- Follows the __[CommonMark spec](http://spec.commonmark.org/)__ for baseline parsing
+- Configurable syntax: you can add new rules and even replace existing ones.
+- Pluggable: Adds syntax extensions to extend the parser (see the [plugin list][md-plugins]).
+- High speed (see our [benchmarking tests][md-performance])
+- [Safe by default][md-security]
+- Member of [Google's Assured Open Source Software](https://cloud.google.com/assured-open-source-software/docs/supported-packages)
+
+This is a Python port of [markdown-it], and some of its associated plugins.
+For more details see: <https://markdown-it-py.readthedocs.io>.
+
+For details on [markdown-it] itself, see:
+
+- The __[Live demo](https://markdown-it.github.io)__
+- [The markdown-it README][markdown-it-readme]
+
+## Installation
+
+```bash
+conda install -c conda-forge markdown-it-py
+```
+
+or
+
+```bash
+pip install markdown-it-py[plugins]
+```
+
+or with extras
+
+```bash
+conda install -c conda-forge markdown-it-py linkify-it-py mdit-py-plugins
+pip install markdown-it-py[linkify,plugins]
+```
+
+## Usage
+
+### Python API Usage
+
+Render markdown to HTML with markdown-it-py and a custom configuration
+with and without plugins and features:
+
+```python
+from markdown_it import MarkdownIt
+from mdit_py_plugins.front_matter import front_matter_plugin
+from mdit_py_plugins.footnote import footnote_plugin
+
+md = (
+    MarkdownIt('commonmark' ,{'breaks':True,'html':True})
+    .use(front_matter_plugin)
+    .use(footnote_plugin)
+    .enable('table')
+)
+text = ("""
+---
+a: 1
+---
+
+a | b
+- | -
+1 | 2
+
+A footnote [^1]
+
+[^1]: some details
+""")
+tokens = md.parse(text)
+html_text = md.render(text)
+
+## To export the html to a file, uncomment the lines below:
+# from pathlib import Path
+# Path("output.html").write_text(html_text)
+```
+
+### Command-line Usage
+
+Render markdown to HTML with markdown-it-py from the
+command-line:
+
+```console
+usage: markdown-it [-h] [-v] [filenames [filenames ...]]
+
+Parse one or more markdown files, convert each to HTML, and print to stdout
+
+positional arguments:
+  filenames      specify an optional list of files to convert
+
+optional arguments:
+  -h, --help     show this help message and exit
+  -v, --version  show program's version number and exit
+
+Interactive:
+
+  $ markdown-it
+  markdown-it-py [version 0.0.0] (interactive)
+  Type Ctrl-D to complete input, or Ctrl-C to exit.
+  >>> # Example
+  ... > markdown *input*
+  ...
+  <h1>Example</h1>
+  <blockquote>
+  <p>markdown <em>input</em></p>
+  </blockquote>
+
+Batch:
+
+  $ markdown-it README.md README.footer.md > index.html
+
+```
+
+## References / Thanks
+
+Big thanks to the authors of [markdown-it]:
+
+- Alex Kocharin [github/rlidwka](https://github.com/rlidwka)
+- Vitaly Puzrin [github/puzrin](https://github.com/puzrin)
+
+Also [John MacFarlane](https://github.com/jgm) for his work on the CommonMark spec and reference implementations.
+
+[github-ci]: https://github.com/executablebooks/markdown-it-py/workflows/Python%20package/badge.svg?branch=master
+[github-link]: https://github.com/executablebooks/markdown-it-py
+[pypi-badge]: https://img.shields.io/pypi/v/markdown-it-py.svg
+[pypi-link]: https://pypi.org/project/markdown-it-py
+[conda-badge]: https://anaconda.org/conda-forge/markdown-it-py/badges/version.svg
+[conda-link]: https://anaconda.org/conda-forge/markdown-it-py
+[codecov-badge]: https://codecov.io/gh/executablebooks/markdown-it-py/branch/master/graph/badge.svg
+[codecov-link]: https://codecov.io/gh/executablebooks/markdown-it-py
+[black-badge]: https://img.shields.io/badge/code%20style-black-000000.svg
+[black-link]: https://github.com/ambv/black
+[install-badge]: https://img.shields.io/pypi/dw/markdown-it-py?label=pypi%20installs
+[install-link]: https://pypistats.org/packages/markdown-it-py
+
+[CommonMark spec]: http://spec.commonmark.org/
+[markdown-it]: https://github.com/markdown-it/markdown-it
+[markdown-it-readme]: https://github.com/markdown-it/markdown-it/blob/master/README.md
+[md-security]: https://markdown-it-py.readthedocs.io/en/latest/other.html
+[md-performance]: https://markdown-it-py.readthedocs.io/en/latest/other.html
+[md-plugins]: https://markdown-it-py.readthedocs.io/en/latest/plugins.html
+
diff --git a/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/RECORD b/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/RECORD
new file mode 100644 (file)
index 0000000..936f27d
--- /dev/null
@@ -0,0 +1,142 @@
+../../Scripts/markdown-it.exe,sha256=VPSFTImOyPpwTwVmz7HGJOJDEu5qebqkM8F9__gw5uA,108446
+markdown_it/__init__.py,sha256=9v3vCD7XQJujcZLU2F14T8O88JJO93rZaUoKu7cocH8,113
+markdown_it/__pycache__/__init__.cpython-312.pyc,,
+markdown_it/__pycache__/_compat.cpython-312.pyc,,
+markdown_it/__pycache__/_punycode.cpython-312.pyc,,
+markdown_it/__pycache__/main.cpython-312.pyc,,
+markdown_it/__pycache__/parser_block.cpython-312.pyc,,
+markdown_it/__pycache__/parser_core.cpython-312.pyc,,
+markdown_it/__pycache__/parser_inline.cpython-312.pyc,,
+markdown_it/__pycache__/renderer.cpython-312.pyc,,
+markdown_it/__pycache__/ruler.cpython-312.pyc,,
+markdown_it/__pycache__/token.cpython-312.pyc,,
+markdown_it/__pycache__/tree.cpython-312.pyc,,
+markdown_it/__pycache__/utils.cpython-312.pyc,,
+markdown_it/_compat.py,sha256=mfhalPobHpl8uYt2V6SCOZq3HqaGlWP8MjICwDvS_xE,246
+markdown_it/_punycode.py,sha256=Y_m-fzc5Ey_Kw09MPNN5TUMnPXm2cACUZE_qwUkfFrM,2364
+markdown_it/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+markdown_it/cli/__pycache__/__init__.cpython-312.pyc,,
+markdown_it/cli/__pycache__/parse.cpython-312.pyc,,
+markdown_it/cli/parse.py,sha256=ZiTSx6t7nLk7rGAtIi0a02EB9sDGJn7YLjKKtufdwNA,2901
+markdown_it/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+markdown_it/common/__pycache__/__init__.cpython-312.pyc,,
+markdown_it/common/__pycache__/entities.cpython-312.pyc,,
+markdown_it/common/__pycache__/html_blocks.cpython-312.pyc,,
+markdown_it/common/__pycache__/html_re.cpython-312.pyc,,
+markdown_it/common/__pycache__/normalize_url.cpython-312.pyc,,
+markdown_it/common/__pycache__/utils.cpython-312.pyc,,
+markdown_it/common/entities.py,sha256=6ulEjBAWYH5lVobgpn5lChPYhPKkdPyVHpNT7O1_x90,156
+markdown_it/common/html_blocks.py,sha256=1cMBp6jIdXqCHvEs2mpJqVGqTuFi6ExL4VO754yksgU,932
+markdown_it/common/html_re.py,sha256=0q5QFkSnX_l7Ob37MDSj2UYT0onCPz_07hUod2K-a6A,929
+markdown_it/common/normalize_url.py,sha256=avOXnLd9xw5jU1q5PLftjAM9pvGx8l9QDEkmZSyrMgg,2568
+markdown_it/common/utils.py,sha256=l2ypUup7jVBwGZJb8M2lxllmTWq8wN5TMV40Mndqu1A,10728
+markdown_it/helpers/__init__.py,sha256=9W7GycpZcq2up1CdVcUpdN77i9Vl4N0CT3y3qMkTjY4,253
+markdown_it/helpers/__pycache__/__init__.cpython-312.pyc,,
+markdown_it/helpers/__pycache__/parse_link_destination.cpython-312.pyc,,
+markdown_it/helpers/__pycache__/parse_link_label.cpython-312.pyc,,
+markdown_it/helpers/__pycache__/parse_link_title.cpython-312.pyc,,
+markdown_it/helpers/parse_link_destination.py,sha256=whJoEo42RmgiVpyc2TmTb73nPK3L-DZuZqfE2f8B20Q,1977
+markdown_it/helpers/parse_link_label.py,sha256=HXAnGlAL-2Op6I-lfeuzBIJBjESCRZws6xKKS3lKFSg,1036
+markdown_it/helpers/parse_link_title.py,sha256=5h5YctAUPmaeBqAlCDzzB220-i64HxYyJ27ui-xMBn0,1425
+markdown_it/main.py,sha256=7BYAkBbDmgbdVGNrpAaWZ_-u2-DoYsOCtXWg5uv3Gvg,12772
+markdown_it/parser_block.py,sha256=1bvZMDIdfBYrRNHpZPzmX6W4GXXaFUDqq2iaxDWP-BM,3911
+markdown_it/parser_core.py,sha256=asPHnvL0sk2oqWC69VM8OAqKs-Dk--GRHhGwZonLm6s,1010
+markdown_it/parser_inline.py,sha256=0ZAiRx2GkQ35va1QRxDeDZvpa44wZBNnVFsGzCyj_Po,4997
+markdown_it/port.yaml,sha256=F6WvtDFxjuZ5o0NtmJO0P8SkG6OfONCj_ggKgx4iYWU,2446
+markdown_it/presets/__init__.py,sha256=tLc9od5iXBEkKR6wbXOVPC5S5vkGYK-67tQslhWu7LY,970
+markdown_it/presets/__pycache__/__init__.cpython-312.pyc,,
+markdown_it/presets/__pycache__/commonmark.cpython-312.pyc,,
+markdown_it/presets/__pycache__/default.cpython-312.pyc,,
+markdown_it/presets/__pycache__/zero.cpython-312.pyc,,
+markdown_it/presets/commonmark.py,sha256=pqVnOnMmCmiZWHvNnXx4E1FS8VV07jcqUW1EsHuv9rE,2868
+markdown_it/presets/default.py,sha256=TgqnjjHX6SWcElk5yjW1hoP8t2-ESZ0QyrmHprmIL18,1810
+markdown_it/presets/zero.py,sha256=2vETQRRW1v9Ug3TsdRhM9r6wgZRuTcvojwcqDcsZfkI,2112
+markdown_it/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
+markdown_it/renderer.py,sha256=jZ62oK-y-qaz8o8TDxCUMvS5OavraJ2-1uaWVqrUCv0,9970
+markdown_it/ruler.py,sha256=J18Pru7u77kqJfnMC5oiFWgnw_58vkbfk5hWQBgED7s,9199
+markdown_it/rules_block/__init__.py,sha256=8su1tOxDw_IR9JSdgqfkGZSNdYpZZCBC9MMmFODdbmE,553
+markdown_it/rules_block/__pycache__/__init__.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/blockquote.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/code.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/fence.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/heading.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/hr.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/html_block.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/lheading.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/list.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/paragraph.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/reference.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/state_block.cpython-312.pyc,,
+markdown_it/rules_block/__pycache__/table.cpython-312.pyc,,
+markdown_it/rules_block/blockquote.py,sha256=7uymS36dcrned3DsIaRcqcbFU1NlymhvsZpEXTD3_n8,8887
+markdown_it/rules_block/code.py,sha256=ASAnisg4hS2RhnP_7_1_pjx4NbFSYmrs6lHDgtHPXIo,859
+markdown_it/rules_block/fence.py,sha256=BJgU-PqZ4vAlCqGcrc8UtdLpJJyMeRWN-G-Op-zxrMc,2537
+markdown_it/rules_block/heading.py,sha256=e9NnvXLbY1bvowq_Pd4S-g6LbVg3iCx26qzwv3jLUyE,1746
+markdown_it/rules_block/hr.py,sha256=fPJ-tubFKjxJxhKPiTAxVP-_LHYbAq32iZ52J5sFxOU,1226
+markdown_it/rules_block/html_block.py,sha256=wA8pb34LtZr1BkIATgGKQBIGX5jQNOkwZl9UGEqvb5M,2721
+markdown_it/rules_block/lheading.py,sha256=fWoEuUo7S2svr5UMKmyQMkh0hheYAHg2gMM266Mogs4,2625
+markdown_it/rules_block/list.py,sha256=gIodkAJFyOIyKCZCj5lAlL7jIj5kAzrDb-K-2MFNplY,9668
+markdown_it/rules_block/paragraph.py,sha256=pQqTn8yYDI6_mWX-_m6PXY4wvDQB1nZ4dVUp3gKu1GA,1818
+markdown_it/rules_block/reference.py,sha256=qzR-KJ_60W8ZzuwYGLlO1bgHHVQP4qlYG4yFpOpNlsA,6168
+markdown_it/rules_block/state_block.py,sha256=HowsQyy5hGUibH4HRZWKfLIlXeDUnuWL7kpF0-rSwoM,8422
+markdown_it/rules_block/table.py,sha256=Zjkc0378QtfQzrhrNWC2kVYsGnOLaZyD3dXG1ugfX-s,6987
+markdown_it/rules_core/__init__.py,sha256=JZNOpLZ4i1vR56StidUa-A_As1XtbDwQR0iEErOXyOI,394
+markdown_it/rules_core/__pycache__/__init__.cpython-312.pyc,,
+markdown_it/rules_core/__pycache__/block.cpython-312.pyc,,
+markdown_it/rules_core/__pycache__/inline.cpython-312.pyc,,
+markdown_it/rules_core/__pycache__/linkify.cpython-312.pyc,,
+markdown_it/rules_core/__pycache__/normalize.cpython-312.pyc,,
+markdown_it/rules_core/__pycache__/replacements.cpython-312.pyc,,
+markdown_it/rules_core/__pycache__/smartquotes.cpython-312.pyc,,
+markdown_it/rules_core/__pycache__/state_core.cpython-312.pyc,,
+markdown_it/rules_core/__pycache__/text_join.cpython-312.pyc,,
+markdown_it/rules_core/block.py,sha256=0_JY1CUy-H2OooFtIEZAACtuoGUMohgxo4Z6A_UinSg,372
+markdown_it/rules_core/inline.py,sha256=9oWmeBhJHE7x47oJcN9yp6UsAZtrEY_A-VmfoMvKld4,325
+markdown_it/rules_core/linkify.py,sha256=mjQqpk_lHLh2Nxw4UFaLxa47Fgi-OHnmDamlgXnhmv0,5141
+markdown_it/rules_core/normalize.py,sha256=qVkBO4elitPzyP_sQENho-ycUl8s4eNZ1zZrsR2AAgk,402
+markdown_it/rules_core/replacements.py,sha256=NHL9MOuEnPuMFPLDtTYDK9yj7F2FSleMr6bPro-ciaQ,3470
+markdown_it/rules_core/smartquotes.py,sha256=CtawEcTHYgzIWZwxIGs8e8oSKhm0B7th2305I3FNEc0,7443
+markdown_it/rules_core/state_core.py,sha256=HqWZCUr5fW7xG6jeQZDdO0hE9hxxyl3_-bawgOy57HY,570
+markdown_it/rules_core/text_join.py,sha256=JVuq_27LoI0IjJDmCXOuRiTs1rmSFhFUUjh6MdF_YCk,1172
+markdown_it/rules_inline/__init__.py,sha256=Zvl8P8V830vDhcQKEleLKZ_paC-ypTn7eWpmFa9yySQ,696
+markdown_it/rules_inline/__pycache__/__init__.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/autolink.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/backticks.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/balance_pairs.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/emphasis.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/entity.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/escape.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/fragments_join.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/html_inline.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/image.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/link.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/linkify.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/newline.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/state_inline.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/strikethrough.cpython-312.pyc,,
+markdown_it/rules_inline/__pycache__/text.cpython-312.pyc,,
+markdown_it/rules_inline/autolink.py,sha256=l4EY7OLzuda350cT6Du_dggEwcb96TvD7YPXf2H6P1M,2079
+markdown_it/rules_inline/backticks.py,sha256=J7bezjjNxiXlKqvHc0fJkHZwH7-2nBsXVjcKydk8E4M,2037
+markdown_it/rules_inline/balance_pairs.py,sha256=vifasmne02sNaBBwuZsA4yI02vmv1gvVN4qR-b9m62E,4851
+markdown_it/rules_inline/emphasis.py,sha256=7aDLZx0Jlekuvbu3uEUTDhJp00Z0Pj6g4C3-VLhI8Co,3123
+markdown_it/rules_inline/entity.py,sha256=CE8AIGMi5isEa24RNseo0wRmTTaj5YLbgTFdDmBesAU,1651
+markdown_it/rules_inline/escape.py,sha256=5DEa7O6ByUfXdXZudcF7JZwLxXG1njAuXIOUsNDPPqU,1658
+markdown_it/rules_inline/fragments_join.py,sha256=_3JbwWYJz74gRHeZk6T8edVJT2IVSsi7FfmJJlieQlA,1493
+markdown_it/rules_inline/html_inline.py,sha256=SBg6HR0HRqCdrkkec0dfOYuQdAqyfeLRFLeQggtgjvg,1130
+markdown_it/rules_inline/image.py,sha256=AMO7kls5c-C4A_S2rBiIlKD8BQ8vIgyWUX7vCpXy_Qs,4135
+markdown_it/rules_inline/link.py,sha256=wRdTMxjNYFiV6uouZMML3fIPvyFrPtMHWzJNBQcQLV0,4318
+markdown_it/rules_inline/linkify.py,sha256=gmHw59SsMQLImv6v1RkDY9lcQAmTN-UZ4GwRFiR8jlg,1704
+markdown_it/rules_inline/newline.py,sha256=LEIhBB_3PPLeCAgaC2naheMjW5N6b9UaAB6sh47Ckz8,1296
+markdown_it/rules_inline/state_inline.py,sha256=rXmMX0P0pCf-v-013YB24MBQxMn2dJhoSZQMNYAZ8HQ,5101
+markdown_it/rules_inline/strikethrough.py,sha256=pwcPlyhkh5pqFVxRCSrdW5dNCIOtU4eDit7TVDTPIVA,3214
+markdown_it/rules_inline/text.py,sha256=GwmMVZziAmhj48l9VaXAXwzzUKDkhaA14thv-TCaS2M,901
+markdown_it/token.py,sha256=NEvuoYAeDh8_6zT6fukzdoncusVOjyUKw2zjsNgZmp4,6439
+markdown_it/tree.py,sha256=YxSqq3qSuhHHm1nQpPUhyDA4VIWHu_G_92bKdUcXXGM,11421
+markdown_it/utils.py,sha256=zPoQ8lhvxtJfg6iNSim0LcnAL0Y4XnV3G4DIIKmL8OU,5365
+markdown_it_py-3.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+markdown_it_py-3.0.0.dist-info/LICENSE,sha256=SiJg1uLND1oVGh6G2_59PtVSseK-q_mUHBulxJy85IQ,1078
+markdown_it_py-3.0.0.dist-info/LICENSE.markdown-it,sha256=eSxIxahJoV_fnjfovPnm0d0TsytGxkKnSKCkapkZ1HM,1073
+markdown_it_py-3.0.0.dist-info/METADATA,sha256=0-kME4KQNSCGPzfSEFgQc8MhUd5cmG-LO007BFk3_fw,6940
+markdown_it_py-3.0.0.dist-info/RECORD,,
+markdown_it_py-3.0.0.dist-info/WHEEL,sha256=4TfKIB_xu-04bc2iKz6_zFt-gEFEEDU_31HGhqzOCE8,81
+markdown_it_py-3.0.0.dist-info/entry_points.txt,sha256=T81l7fHQ3pllpQ4wUtQK6a8g_p6wxQbnjKVHCk2WMG4,58
diff --git a/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/WHEEL b/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/WHEEL
new file mode 100644 (file)
index 0000000..668ba4d
--- /dev/null
@@ -0,0 +1,4 @@
+Wheel-Version: 1.0
+Generator: flit 3.7.1
+Root-Is-Purelib: true
+Tag: py3-none-any
diff --git a/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/entry_points.txt b/.venv/Lib/site-packages/markdown_it_py-3.0.0.dist-info/entry_points.txt
new file mode 100644 (file)
index 0000000..7d829cd
--- /dev/null
@@ -0,0 +1,3 @@
+[console_scripts]
+markdown-it=markdown_it.cli.parse:main
+
diff --git a/.venv/Lib/site-packages/mdurl-0.1.2.dist-info/INSTALLER b/.venv/Lib/site-packages/mdurl-0.1.2.dist-info/INSTALLER
new file mode 100644 (file)
index 0000000..a1b589e
--- /dev/null
@@ -0,0 +1 @@
+pip
diff --git a/.venv/Lib/site-packages/mdurl-0.1.2.dist-info/LICENSE b/.venv/Lib/site-packages/mdurl-0.1.2.dist-info/LICENSE
new file mode 100644 (file)
index 0000000..2a920c5
--- /dev/null
@@ -0,0 +1,46 @@
+Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin.
+Copyright (c) 2021 Taneli Hukkinen
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+--------------------------------------------------------------------------------
+
+.parse() is based on Joyent's node.js `url` code:
+
+Copyright Joyent, Inc. and other Node contributors. All rights reserved.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
diff --git a/.venv/Lib/site-packages/mdurl-0.1.2.dist-info/METADATA b/.venv/Lib/site-packages/mdurl-0.1.2.dist-info/METADATA
new file mode 100644 (file)
index 0000000..b4670e8
--- /dev/null
@@ -0,0 +1,32 @@
+Metadata-Version: 2.1
+Name: mdurl
+Version: 0.1.2
+Summary: Markdown URL utilities
+Keywords: markdown,commonmark
+Author-email: Taneli Hukkinen <hukkin@users.noreply.github.com>
+Requires-Python: >=3.7
+Description-Content-Type: text/markdown
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: MacOS
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Typing :: Typed
+Project-URL: Homepage, https://github.com/executablebooks/mdurl
+
+# mdurl
+
+[![Build Status](https://github.com/executablebooks/mdurl/workflows/Tests/badge.svg?branch=master)](https://github.com/executablebooks/mdurl/actions?query=workflow%3ATests+branch%3Amaster+event%3Apush)
+[![codecov.io](https://codecov.io/gh/executablebooks/mdurl/branch/master/graph/badge.svg)](https://codecov.io/gh/executablebooks/mdurl)
+[![PyPI version](https://img.shields.io/pypi/v/mdurl)](https://pypi.org/project/mdurl)
+
+This is a Python port of the JavaScript [mdurl](https://www.npmjs.com/package/mdurl) package.
+See the [upstream README.md file](https://github.com/markdown-it/mdurl/blob/master/README.md) for API documentation.
+
diff --git a/.venv/Lib/site-packages/mdurl-0.1.2.dist-info/RECORD b/.venv/Lib/site-packages/mdurl-0.1.2.dist-info/RECORD
new file mode 100644 (file)
index 0000000..0e7b30f
--- /dev/null
@@ -0,0 +1,18 @@
+mdurl-0.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+mdurl-0.1.2.dist-info/LICENSE,sha256=fGBd9uKGZ6lgMRjpgnT2SknOPu0NJvzM6VNKNF4O-VU,2338
+mdurl-0.1.2.dist-info/METADATA,sha256=tTsp1I9Jk2cFP9o8gefOJ9JVg4Drv4PmYCOwLrfd0l0,1638
+mdurl-0.1.2.dist-info/RECORD,,
+mdurl-0.1.2.dist-info/WHEEL,sha256=4TfKIB_xu-04bc2iKz6_zFt-gEFEEDU_31HGhqzOCE8,81
+mdurl/__init__.py,sha256=1vpE89NyXniIRZNC_4f6BPm3Ub4bPntjfyyhLRR7opU,547
+mdurl/__pycache__/__init__.cpython-312.pyc,,
+mdurl/__pycache__/_decode.cpython-312.pyc,,
+mdurl/__pycache__/_encode.cpython-312.pyc,,
+mdurl/__pycache__/_format.cpython-312.pyc,,
+mdurl/__pycache__/_parse.cpython-312.pyc,,
+mdurl/__pycache__/_url.cpython-312.pyc,,
+mdurl/_decode.py,sha256=3Q_gDQqU__TvDbu7x-b9LjbVl4QWy5g_qFwljcuvN_Y,3004
+mdurl/_encode.py,sha256=goJLUFt1h4rVZNqqm9t15Nw2W-bFXYQEy3aR01ImWvs,2602
+mdurl/_format.py,sha256=xZct0mdePXA0H3kAqxjGtlB5O86G35DAYMGkA44CmB4,626
+mdurl/_parse.py,sha256=ezZSkM2_4NQ2Zx047sEdcJG7NYQRFHiZK7Y8INHFzwY,11374
+mdurl/_url.py,sha256=5kQnRQN2A_G4svLnRzZcG0bfoD9AbBrYDXousDHZ3z0,284
+mdurl/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
diff --git a/.venv/Lib/site-packages/mdurl-0.1.2.dist-info/WHEEL b/.venv/Lib/site-packages/mdurl-0.1.2.dist-info/WHEEL
new file mode 100644 (file)
index 0000000..668ba4d
--- /dev/null
@@ -0,0 +1,4 @@
+Wheel-Version: 1.0
+Generator: flit 3.7.1
+Root-Is-Purelib: true
+Tag: py3-none-any
diff --git a/.venv/Lib/site-packages/mdurl/__init__.py b/.venv/Lib/site-packages/mdurl/__init__.py
new file mode 100644 (file)
index 0000000..cdbb640
--- /dev/null
@@ -0,0 +1,18 @@
+__all__ = (
+    "decode",
+    "DECODE_DEFAULT_CHARS",
+    "DECODE_COMPONENT_CHARS",
+    "encode",
+    "ENCODE_DEFAULT_CHARS",
+    "ENCODE_COMPONENT_CHARS",
+    "format",
+    "parse",
+    "URL",
+)
+__version__ = "0.1.2"  # DO NOT EDIT THIS LINE MANUALLY. LET bump2version UTILITY DO IT
+
+from mdurl._decode import DECODE_COMPONENT_CHARS, DECODE_DEFAULT_CHARS, decode
+from mdurl._encode import ENCODE_COMPONENT_CHARS, ENCODE_DEFAULT_CHARS, encode
+from mdurl._format import format
+from mdurl._parse import url_parse as parse
+from mdurl._url import URL
diff --git a/.venv/Lib/site-packages/mdurl/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/mdurl/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f5b96d4
Binary files /dev/null and b/.venv/Lib/site-packages/mdurl/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/mdurl/__pycache__/_decode.cpython-312.pyc b/.venv/Lib/site-packages/mdurl/__pycache__/_decode.cpython-312.pyc
new file mode 100644 (file)
index 0000000..df544ac
Binary files /dev/null and b/.venv/Lib/site-packages/mdurl/__pycache__/_decode.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/mdurl/__pycache__/_encode.cpython-312.pyc b/.venv/Lib/site-packages/mdurl/__pycache__/_encode.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1822e9e
Binary files /dev/null and b/.venv/Lib/site-packages/mdurl/__pycache__/_encode.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/mdurl/__pycache__/_format.cpython-312.pyc b/.venv/Lib/site-packages/mdurl/__pycache__/_format.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8e8fb4a
Binary files /dev/null and b/.venv/Lib/site-packages/mdurl/__pycache__/_format.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/mdurl/__pycache__/_parse.cpython-312.pyc b/.venv/Lib/site-packages/mdurl/__pycache__/_parse.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7e4ad4e
Binary files /dev/null and b/.venv/Lib/site-packages/mdurl/__pycache__/_parse.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/mdurl/__pycache__/_url.cpython-312.pyc b/.venv/Lib/site-packages/mdurl/__pycache__/_url.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b7238b6
Binary files /dev/null and b/.venv/Lib/site-packages/mdurl/__pycache__/_url.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/mdurl/_decode.py b/.venv/Lib/site-packages/mdurl/_decode.py
new file mode 100644 (file)
index 0000000..9b50a2d
--- /dev/null
@@ -0,0 +1,104 @@
+from __future__ import annotations
+
+from collections.abc import Sequence
+import functools
+import re
+
+DECODE_DEFAULT_CHARS = ";/?:@&=+$,#"
+DECODE_COMPONENT_CHARS = ""
+
+decode_cache: dict[str, list[str]] = {}
+
+
+def get_decode_cache(exclude: str) -> Sequence[str]:
+    if exclude in decode_cache:
+        return decode_cache[exclude]
+
+    cache: list[str] = []
+    decode_cache[exclude] = cache
+
+    for i in range(128):
+        ch = chr(i)
+        cache.append(ch)
+
+    for i in range(len(exclude)):
+        ch_code = ord(exclude[i])
+        cache[ch_code] = "%" + ("0" + hex(ch_code)[2:].upper())[-2:]
+
+    return cache
+
+
+# Decode percent-encoded string.
+#
+def decode(string: str, exclude: str = DECODE_DEFAULT_CHARS) -> str:
+    cache = get_decode_cache(exclude)
+    repl_func = functools.partial(repl_func_with_cache, cache=cache)
+    return re.sub(r"(%[a-f0-9]{2})+", repl_func, string, flags=re.IGNORECASE)
+
+
+def repl_func_with_cache(match: re.Match, cache: Sequence[str]) -> str:
+    seq = match.group()
+    result = ""
+
+    i = 0
+    l = len(seq)  # noqa: E741
+    while i < l:
+        b1 = int(seq[i + 1 : i + 3], 16)
+
+        if b1 < 0x80:
+            result += cache[b1]
+            i += 3  # emulate JS for loop statement3
+            continue
+
+        if (b1 & 0xE0) == 0xC0 and (i + 3 < l):
+            # 110xxxxx 10xxxxxx
+            b2 = int(seq[i + 4 : i + 6], 16)
+
+            if (b2 & 0xC0) == 0x80:
+                all_bytes = bytes((b1, b2))
+                try:
+                    result += all_bytes.decode()
+                except UnicodeDecodeError:
+                    result += "\ufffd" * 2
+
+                i += 3
+                i += 3  # emulate JS for loop statement3
+                continue
+
+        if (b1 & 0xF0) == 0xE0 and (i + 6 < l):
+            # 1110xxxx 10xxxxxx 10xxxxxx
+            b2 = int(seq[i + 4 : i + 6], 16)
+            b3 = int(seq[i + 7 : i + 9], 16)
+
+            if (b2 & 0xC0) == 0x80 and (b3 & 0xC0) == 0x80:
+                all_bytes = bytes((b1, b2, b3))
+                try:
+                    result += all_bytes.decode()
+                except UnicodeDecodeError:
+                    result += "\ufffd" * 3
+
+                i += 6
+                i += 3  # emulate JS for loop statement3
+                continue
+
+        if (b1 & 0xF8) == 0xF0 and (i + 9 < l):
+            # 111110xx 10xxxxxx 10xxxxxx 10xxxxxx
+            b2 = int(seq[i + 4 : i + 6], 16)
+            b3 = int(seq[i + 7 : i + 9], 16)
+            b4 = int(seq[i + 10 : i + 12], 16)
+
+            if (b2 & 0xC0) == 0x80 and (b3 & 0xC0) == 0x80 and (b4 & 0xC0) == 0x80:
+                all_bytes = bytes((b1, b2, b3, b4))
+                try:
+                    result += all_bytes.decode()
+                except UnicodeDecodeError:
+                    result += "\ufffd" * 4
+
+                i += 9
+                i += 3  # emulate JS for loop statement3
+                continue
+
+        result += "\ufffd"
+        i += 3  # emulate JS for loop statement3
+
+    return result
diff --git a/.venv/Lib/site-packages/mdurl/_encode.py b/.venv/Lib/site-packages/mdurl/_encode.py
new file mode 100644 (file)
index 0000000..bc2e5b9
--- /dev/null
@@ -0,0 +1,85 @@
+from __future__ import annotations
+
+from collections.abc import Sequence
+from string import ascii_letters, digits, hexdigits
+from urllib.parse import quote as encode_uri_component
+
+ASCII_LETTERS_AND_DIGITS = ascii_letters + digits
+
+ENCODE_DEFAULT_CHARS = ";/?:@&=+$,-_.!~*'()#"
+ENCODE_COMPONENT_CHARS = "-_.!~*'()"
+
+encode_cache: dict[str, list[str]] = {}
+
+
+# Create a lookup array where anything but characters in `chars` string
+# and alphanumeric chars is percent-encoded.
+def get_encode_cache(exclude: str) -> Sequence[str]:
+    if exclude in encode_cache:
+        return encode_cache[exclude]
+
+    cache: list[str] = []
+    encode_cache[exclude] = cache
+
+    for i in range(128):
+        ch = chr(i)
+
+        if ch in ASCII_LETTERS_AND_DIGITS:
+            # always allow unencoded alphanumeric characters
+            cache.append(ch)
+        else:
+            cache.append("%" + ("0" + hex(i)[2:].upper())[-2:])
+
+    for i in range(len(exclude)):
+        cache[ord(exclude[i])] = exclude[i]
+
+    return cache
+
+
+# Encode unsafe characters with percent-encoding, skipping already
+# encoded sequences.
+#
+#  - string       - string to encode
+#  - exclude      - list of characters to ignore (in addition to a-zA-Z0-9)
+#  - keepEscaped  - don't encode '%' in a correct escape sequence (default: true)
+def encode(
+    string: str, exclude: str = ENCODE_DEFAULT_CHARS, *, keep_escaped: bool = True
+) -> str:
+    result = ""
+
+    cache = get_encode_cache(exclude)
+
+    l = len(string)  # noqa: E741
+    i = 0
+    while i < l:
+        code = ord(string[i])
+
+        #                              %
+        if keep_escaped and code == 0x25 and i + 2 < l:
+            if all(c in hexdigits for c in string[i + 1 : i + 3]):
+                result += string[i : i + 3]
+                i += 2
+                i += 1  # JS for loop statement3
+                continue
+
+        if code < 128:
+            result += cache[code]
+            i += 1  # JS for loop statement3
+            continue
+
+        if code >= 0xD800 and code <= 0xDFFF:
+            if code >= 0xD800 and code <= 0xDBFF and i + 1 < l:
+                next_code = ord(string[i + 1])
+                if next_code >= 0xDC00 and next_code <= 0xDFFF:
+                    result += encode_uri_component(string[i] + string[i + 1])
+                    i += 1
+                    i += 1  # JS for loop statement3
+                    continue
+            result += "%EF%BF%BD"
+            i += 1  # JS for loop statement3
+            continue
+
+        result += encode_uri_component(string[i])
+        i += 1  # JS for loop statement3
+
+    return result
diff --git a/.venv/Lib/site-packages/mdurl/_format.py b/.venv/Lib/site-packages/mdurl/_format.py
new file mode 100644 (file)
index 0000000..12524ca
--- /dev/null
@@ -0,0 +1,27 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from mdurl._url import URL
+
+
+def format(url: URL) -> str:  # noqa: A001
+    result = ""
+
+    result += url.protocol or ""
+    result += "//" if url.slashes else ""
+    result += url.auth + "@" if url.auth else ""
+
+    if url.hostname and ":" in url.hostname:
+        # ipv6 address
+        result += "[" + url.hostname + "]"
+    else:
+        result += url.hostname or ""
+
+    result += ":" + url.port if url.port else ""
+    result += url.pathname or ""
+    result += url.search or ""
+    result += url.hash or ""
+
+    return result
diff --git a/.venv/Lib/site-packages/mdurl/_parse.py b/.venv/Lib/site-packages/mdurl/_parse.py
new file mode 100644 (file)
index 0000000..ffeeac7
--- /dev/null
@@ -0,0 +1,304 @@
+# Copyright Joyent, Inc. and other Node contributors.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject to the
+# following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+# USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+# Changes from joyent/node:
+#
+# 1. No leading slash in paths,
+#    e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`
+#
+# 2. Backslashes are not replaced with slashes,
+#    so `http:\\example.org\` is treated like a relative path
+#
+# 3. Trailing colon is treated like a part of the path,
+#    i.e. in `http://example.org:foo` pathname is `:foo`
+#
+# 4. Nothing is URL-encoded in the resulting object,
+#    (in joyent/node some chars in auth and paths are encoded)
+#
+# 5. `url.parse()` does not have `parseQueryString` argument
+#
+# 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,
+#    which can be constructed using other parts of the url.
+
+from __future__ import annotations
+
+from collections import defaultdict
+import re
+
+from mdurl._url import URL
+
+# Reference: RFC 3986, RFC 1808, RFC 2396
+
+# define these here so at least they only have to be
+# compiled once on the first module load.
+PROTOCOL_PATTERN = re.compile(r"^([a-z0-9.+-]+:)", flags=re.IGNORECASE)
+PORT_PATTERN = re.compile(r":[0-9]*$")
+
+# Special case for a simple path URL
+SIMPLE_PATH_PATTERN = re.compile(r"^(//?(?!/)[^?\s]*)(\?[^\s]*)?$")
+
+# RFC 2396: characters reserved for delimiting URLs.
+# We actually just auto-escape these.
+DELIMS = ("<", ">", '"', "`", " ", "\r", "\n", "\t")
+
+# RFC 2396: characters not allowed for various reasons.
+UNWISE = ("{", "}", "|", "\\", "^", "`") + DELIMS
+
+# Allowed by RFCs, but cause of XSS attacks.  Always escape these.
+AUTO_ESCAPE = ("'",) + UNWISE
+# Characters that are never ever allowed in a hostname.
+# Note that any invalid chars are also handled, but these
+# are the ones that are *expected* to be seen, so we fast-path
+# them.
+NON_HOST_CHARS = ("%", "/", "?", ";", "#") + AUTO_ESCAPE
+HOST_ENDING_CHARS = ("/", "?", "#")
+HOSTNAME_MAX_LEN = 255
+HOSTNAME_PART_PATTERN = re.compile(r"^[+a-z0-9A-Z_-]{0,63}$")
+HOSTNAME_PART_START = re.compile(r"^([+a-z0-9A-Z_-]{0,63})(.*)$")
+# protocols that can allow "unsafe" and "unwise" chars.
+
+# protocols that never have a hostname.
+HOSTLESS_PROTOCOL = defaultdict(
+    bool,
+    {
+        "javascript": True,
+        "javascript:": True,
+    },
+)
+# protocols that always contain a // bit.
+SLASHED_PROTOCOL = defaultdict(
+    bool,
+    {
+        "http": True,
+        "https": True,
+        "ftp": True,
+        "gopher": True,
+        "file": True,
+        "http:": True,
+        "https:": True,
+        "ftp:": True,
+        "gopher:": True,
+        "file:": True,
+    },
+)
+
+
+class MutableURL:
+    def __init__(self) -> None:
+        self.protocol: str | None = None
+        self.slashes: bool = False
+        self.auth: str | None = None
+        self.port: str | None = None
+        self.hostname: str | None = None
+        self.hash: str | None = None
+        self.search: str | None = None
+        self.pathname: str | None = None
+
+    def parse(self, url: str, slashes_denote_host: bool) -> "MutableURL":
+        lower_proto = ""
+        slashes = False
+        rest = url
+
+        # trim before proceeding.
+        # This is to support parse stuff like "  http://foo.com  \n"
+        rest = rest.strip()
+
+        if not slashes_denote_host and len(url.split("#")) == 1:
+            # Try fast path regexp
+            simple_path = SIMPLE_PATH_PATTERN.match(rest)
+            if simple_path:
+                self.pathname = simple_path.group(1)
+                if simple_path.group(2):
+                    self.search = simple_path.group(2)
+                return self
+
+        proto = ""
+        proto_match = PROTOCOL_PATTERN.match(rest)
+        if proto_match:
+            proto = proto_match.group()
+            lower_proto = proto.lower()
+            self.protocol = proto
+            rest = rest[len(proto) :]
+
+        # figure out if it's got a host
+        # user@server is *always* interpreted as a hostname, and url
+        # resolution will treat //foo/bar as host=foo,path=bar because that's
+        # how the browser resolves relative URLs.
+        if slashes_denote_host or proto or re.search(r"^//[^@/]+@[^@/]+", rest):
+            slashes = rest.startswith("//")
+            if slashes and not (proto and HOSTLESS_PROTOCOL[proto]):
+                rest = rest[2:]
+                self.slashes = True
+
+        if not HOSTLESS_PROTOCOL[proto] and (
+            slashes or (proto and not SLASHED_PROTOCOL[proto])
+        ):
+
+            # there's a hostname.
+            # the first instance of /, ?, ;, or # ends the host.
+            #
+            # If there is an @ in the hostname, then non-host chars *are* allowed
+            # to the left of the last @ sign, unless some host-ending character
+            # comes *before* the @-sign.
+            # URLs are obnoxious.
+            #
+            # ex:
+            # http://a@b@c/ => user:a@b host:c
+            # http://a@b?@c => user:a host:c path:/?@c
+
+            # v0.12 TODO(isaacs): This is not quite how Chrome does things.
+            # Review our test case against browsers more comprehensively.
+
+            # find the first instance of any hostEndingChars
+            host_end = -1
+            for i in range(len(HOST_ENDING_CHARS)):
+                hec = rest.find(HOST_ENDING_CHARS[i])
+                if hec != -1 and (host_end == -1 or hec < host_end):
+                    host_end = hec
+
+            # at this point, either we have an explicit point where the
+            # auth portion cannot go past, or the last @ char is the decider.
+            if host_end == -1:
+                # atSign can be anywhere.
+                at_sign = rest.rfind("@")
+            else:
+                # atSign must be in auth portion.
+                # http://a@b/c@d => host:b auth:a path:/c@d
+                at_sign = rest.rfind("@", 0, host_end + 1)
+
+            # Now we have a portion which is definitely the auth.
+            # Pull that off.
+            if at_sign != -1:
+                auth = rest[:at_sign]
+                rest = rest[at_sign + 1 :]
+                self.auth = auth
+
+            # the host is the remaining to the left of the first non-host char
+            host_end = -1
+            for i in range(len(NON_HOST_CHARS)):
+                hec = rest.find(NON_HOST_CHARS[i])
+                if hec != -1 and (host_end == -1 or hec < host_end):
+                    host_end = hec
+            # if we still have not hit it, then the entire thing is a host.
+            if host_end == -1:
+                host_end = len(rest)
+
+            if host_end > 0 and rest[host_end - 1] == ":":
+                host_end -= 1
+            host = rest[:host_end]
+            rest = rest[host_end:]
+
+            # pull out port.
+            self.parse_host(host)
+
+            # we've indicated that there is a hostname,
+            # so even if it's empty, it has to be present.
+            self.hostname = self.hostname or ""
+
+            # if hostname begins with [ and ends with ]
+            # assume that it's an IPv6 address.
+            ipv6_hostname = self.hostname.startswith("[") and self.hostname.endswith(
+                "]"
+            )
+
+            # validate a little.
+            if not ipv6_hostname:
+                hostparts = self.hostname.split(".")
+                l = len(hostparts)  # noqa: E741
+                i = 0
+                while i < l:
+                    part = hostparts[i]
+                    if not part:
+                        i += 1  # emulate statement3 in JS for loop
+                        continue
+                    if not HOSTNAME_PART_PATTERN.search(part):
+                        newpart = ""
+                        k = len(part)
+                        j = 0
+                        while j < k:
+                            if ord(part[j]) > 127:
+                                # we replace non-ASCII char with a temporary placeholder
+                                # we need this to make sure size of hostname is not
+                                # broken by replacing non-ASCII by nothing
+                                newpart += "x"
+                            else:
+                                newpart += part[j]
+                            j += 1  # emulate statement3 in JS for loop
+
+                        # we test again with ASCII char only
+                        if not HOSTNAME_PART_PATTERN.search(newpart):
+                            valid_parts = hostparts[:i]
+                            not_host = hostparts[i + 1 :]
+                            bit = HOSTNAME_PART_START.search(part)
+                            if bit:
+                                valid_parts.append(bit.group(1))
+                                not_host.insert(0, bit.group(2))
+                            if not_host:
+                                rest = ".".join(not_host) + rest
+                            self.hostname = ".".join(valid_parts)
+                            break
+                    i += 1  # emulate statement3 in JS for loop
+
+            if len(self.hostname) > HOSTNAME_MAX_LEN:
+                self.hostname = ""
+
+            # strip [ and ] from the hostname
+            # the host field still retains them, though
+            if ipv6_hostname:
+                self.hostname = self.hostname[1:-1]
+
+        # chop off from the tail first.
+        hash = rest.find("#")  # noqa: A001
+        if hash != -1:
+            # got a fragment string.
+            self.hash = rest[hash:]
+            rest = rest[:hash]
+        qm = rest.find("?")
+        if qm != -1:
+            self.search = rest[qm:]
+            rest = rest[:qm]
+        if rest:
+            self.pathname = rest
+        if SLASHED_PROTOCOL[lower_proto] and self.hostname and not self.pathname:
+            self.pathname = ""
+
+        return self
+
+    def parse_host(self, host: str) -> None:
+        port_match = PORT_PATTERN.search(host)
+        if port_match:
+            port = port_match.group()
+            if port != ":":
+                self.port = port[1:]
+            host = host[: -len(port)]
+        if host:
+            self.hostname = host
+
+
+def url_parse(url: URL | str, *, slashes_denote_host: bool = False) -> URL:
+    if isinstance(url, URL):
+        return url
+    u = MutableURL()
+    u.parse(url, slashes_denote_host)
+    return URL(
+        u.protocol, u.slashes, u.auth, u.port, u.hostname, u.hash, u.search, u.pathname
+    )
diff --git a/.venv/Lib/site-packages/mdurl/_url.py b/.venv/Lib/site-packages/mdurl/_url.py
new file mode 100644 (file)
index 0000000..f866e7a
--- /dev/null
@@ -0,0 +1,14 @@
+from __future__ import annotations
+
+from typing import NamedTuple
+
+
+class URL(NamedTuple):
+    protocol: str | None
+    slashes: bool
+    auth: str | None
+    port: str | None
+    hostname: str | None
+    hash: str | None  # noqa: A003
+    search: str | None
+    pathname: str | None
diff --git a/.venv/Lib/site-packages/mdurl/py.typed b/.venv/Lib/site-packages/mdurl/py.typed
new file mode 100644 (file)
index 0000000..7632ecf
--- /dev/null
@@ -0,0 +1 @@
+# Marker file for PEP 561
diff --git a/.venv/Lib/site-packages/pygments-2.19.1.dist-info/INSTALLER b/.venv/Lib/site-packages/pygments-2.19.1.dist-info/INSTALLER
new file mode 100644 (file)
index 0000000..a1b589e
--- /dev/null
@@ -0,0 +1 @@
+pip
diff --git a/.venv/Lib/site-packages/pygments-2.19.1.dist-info/METADATA b/.venv/Lib/site-packages/pygments-2.19.1.dist-info/METADATA
new file mode 100644 (file)
index 0000000..8671c6d
--- /dev/null
@@ -0,0 +1,58 @@
+Metadata-Version: 2.4
+Name: Pygments
+Version: 2.19.1
+Summary: Pygments is a syntax highlighting package written in Python.
+Project-URL: Homepage, https://pygments.org
+Project-URL: Documentation, https://pygments.org/docs
+Project-URL: Source, https://github.com/pygments/pygments
+Project-URL: Bug Tracker, https://github.com/pygments/pygments/issues
+Project-URL: Changelog, https://github.com/pygments/pygments/blob/master/CHANGES
+Author-email: Georg Brandl <georg@python.org>
+Maintainer: Matthäus G. Chajdas
+Maintainer-email: Georg Brandl <georg@python.org>, Jean Abou Samra <jean@abou-samra.fr>
+License: BSD-2-Clause
+License-File: AUTHORS
+License-File: LICENSE
+Keywords: syntax highlighting
+Classifier: Development Status :: 6 - Mature
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Text Processing :: Filters
+Classifier: Topic :: Utilities
+Requires-Python: >=3.8
+Provides-Extra: plugins
+Provides-Extra: windows-terminal
+Requires-Dist: colorama>=0.4.6; extra == 'windows-terminal'
+Description-Content-Type: text/x-rst
+
+Pygments
+~~~~~~~~
+
+Pygments is a syntax highlighting package written in Python.
+
+It is a generic syntax highlighter suitable for use in code hosting, forums,
+wikis or other applications that need to prettify source code.  Highlights
+are:
+
+* a wide range of over 500 languages and other text formats is supported
+* special attention is paid to details, increasing quality by a fair amount
+* support for new languages and formats are added easily
+* a number of output formats, presently HTML, LaTeX, RTF, SVG, all image
+  formats that PIL supports and ANSI sequences
+* it is usable as a command-line tool and as a library
+
+Copyright 2006-2025 by the Pygments team, see ``AUTHORS``.
+Licensed under the BSD, see ``LICENSE`` for details.
diff --git a/.venv/Lib/site-packages/pygments-2.19.1.dist-info/RECORD b/.venv/Lib/site-packages/pygments-2.19.1.dist-info/RECORD
new file mode 100644 (file)
index 0000000..9992a4a
--- /dev/null
@@ -0,0 +1,682 @@
+../../Scripts/pygmentize.exe,sha256=c42tTGZ1TWYnMWdLzNMAMNw8YMW-AAm0yHmriBJSBFs,108441
+pygments-2.19.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pygments-2.19.1.dist-info/METADATA,sha256=QGjhRksrfp_I-eQNvdNKViqR538H_0l-x473HqO-rxM,2512
+pygments-2.19.1.dist-info/RECORD,,
+pygments-2.19.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
+pygments-2.19.1.dist-info/entry_points.txt,sha256=uUXw-XhMKBEX4pWcCtpuTTnPhL3h7OEE2jWi51VQsa8,53
+pygments-2.19.1.dist-info/licenses/AUTHORS,sha256=BmDjGKbyFYAq3Icxq4XQxl_yfPzKP10oWX8wZHYZW9k,10824
+pygments-2.19.1.dist-info/licenses/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331
+pygments/__init__.py,sha256=H0XmVJ1Fe9qSEDBU1j1wZLT-Tfu7blFbDiFSfpwU63c,2959
+pygments/__main__.py,sha256=p8AJyoyCOMYGvzWHdnq0_A9qaaVqaj02nIu3xhJp1_4,348
+pygments/__pycache__/__init__.cpython-312.pyc,,
+pygments/__pycache__/__main__.cpython-312.pyc,,
+pygments/__pycache__/cmdline.cpython-312.pyc,,
+pygments/__pycache__/console.cpython-312.pyc,,
+pygments/__pycache__/filter.cpython-312.pyc,,
+pygments/__pycache__/formatter.cpython-312.pyc,,
+pygments/__pycache__/lexer.cpython-312.pyc,,
+pygments/__pycache__/modeline.cpython-312.pyc,,
+pygments/__pycache__/plugin.cpython-312.pyc,,
+pygments/__pycache__/regexopt.cpython-312.pyc,,
+pygments/__pycache__/scanner.cpython-312.pyc,,
+pygments/__pycache__/sphinxext.cpython-312.pyc,,
+pygments/__pycache__/style.cpython-312.pyc,,
+pygments/__pycache__/token.cpython-312.pyc,,
+pygments/__pycache__/unistring.cpython-312.pyc,,
+pygments/__pycache__/util.cpython-312.pyc,,
+pygments/cmdline.py,sha256=4pL9Kpn2PUEKPobgrsQgg-vCx2NjsrapKzQ6LxQR7Q0,23536
+pygments/console.py,sha256=AagDWqwea2yBWf10KC9ptBgMpMjxKp8yABAmh-NQOVk,1718
+pygments/filter.py,sha256=YLtpTnZiu07nY3oK9nfR6E9Y1FBHhP5PX8gvkJWcfag,1910
+pygments/filters/__init__.py,sha256=B00KqPCQh5E0XhzaDK74Qa1E4fDSTlD6b0Pvr1v-vEQ,40344
+pygments/filters/__pycache__/__init__.cpython-312.pyc,,
+pygments/formatter.py,sha256=H_4J-moKkKfRWUOW9J0u7hhw6n1LiO-2Xu1q2B0sE5w,4366
+pygments/formatters/__init__.py,sha256=7OuvmoYLyoPzoOQV_brHG8GSKYB_wjFSkAQng6x2y9g,5349
+pygments/formatters/__pycache__/__init__.cpython-312.pyc,,
+pygments/formatters/__pycache__/_mapping.cpython-312.pyc,,
+pygments/formatters/__pycache__/bbcode.cpython-312.pyc,,
+pygments/formatters/__pycache__/groff.cpython-312.pyc,,
+pygments/formatters/__pycache__/html.cpython-312.pyc,,
+pygments/formatters/__pycache__/img.cpython-312.pyc,,
+pygments/formatters/__pycache__/irc.cpython-312.pyc,,
+pygments/formatters/__pycache__/latex.cpython-312.pyc,,
+pygments/formatters/__pycache__/other.cpython-312.pyc,,
+pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc,,
+pygments/formatters/__pycache__/rtf.cpython-312.pyc,,
+pygments/formatters/__pycache__/svg.cpython-312.pyc,,
+pygments/formatters/__pycache__/terminal.cpython-312.pyc,,
+pygments/formatters/__pycache__/terminal256.cpython-312.pyc,,
+pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
+pygments/formatters/bbcode.py,sha256=s0Ka35OKuIchoSgEAGf6rj0rl2a9ym9L31JVNSRbZFQ,3296
+pygments/formatters/groff.py,sha256=pLcIHj4jJS_lRAVFnyJODKDu1Xlyl9_AEIdOtbl3DT0,5082
+pygments/formatters/html.py,sha256=FrHJ69FUliEyPY0zTfab0C1gPf7LXsKgeRlhwkniqIs,35953
+pygments/formatters/img.py,sha256=aRpFo8mBmWTL3sBUjRCWkeS3rc6FZrSFC4EksDrl53g,23301
+pygments/formatters/irc.py,sha256=R0Js0TYWySlI2yE9sW6tN4d4X-x3k9ZmudsijGPnLmU,4945
+pygments/formatters/latex.py,sha256=BRYtbLeW_YD1kwhhnFInhJIKylurnri8CF1lP069KWE,19258
+pygments/formatters/other.py,sha256=8pYW27sU_7XicLUqOEt2yWSO0h1IEUM3TIv34KODLwo,4986
+pygments/formatters/pangomarkup.py,sha256=pcFvEC7K1Me0EjGeOZth4oCnEY85bfqc77XzZASEPpY,2206
+pygments/formatters/rtf.py,sha256=kcKMCxTXu-2-hpgEftlGJRm7Ss-yA_Sy8OsHH_qzykA,11921
+pygments/formatters/svg.py,sha256=R6A2ME6JsMQWFiyn8wcKwFUOD6vsu-HLwiIztLu-77E,7138
+pygments/formatters/terminal.py,sha256=J_F_dFXwR9LHWvatIDnwqRYJyjVmSo1Zx8K_XDh6SyM,4626
+pygments/formatters/terminal256.py,sha256=7GQFLE5cfmeu53CAzANO74-kBk2BFkXfn5phmZjYkhM,11717
+pygments/lexer.py,sha256=ib-F_0GxHkwGpb6vWP0DeLMLc7EYgjo3hWFKN5IgOq0,35109
+pygments/lexers/__init__.py,sha256=6YhzxGKlWk38P6JpIJUQ1rVvV0DEZjEmdYsdMQ58hSk,12067
+pygments/lexers/__pycache__/__init__.cpython-312.pyc,,
+pygments/lexers/__pycache__/_ada_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_asy_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_cl_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_cocoa_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_csound_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_googlesql_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_julia_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_lasso_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_lilypond_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_luau_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_mapping.cpython-312.pyc,,
+pygments/lexers/__pycache__/_mql_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_mysql_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_openedge_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_php_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_postgres_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_qlik_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_scheme_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_scilab_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_sourcemod_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_stan_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_stata_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_tsql_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_usd_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_vbscript_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/_vim_builtins.cpython-312.pyc,,
+pygments/lexers/__pycache__/actionscript.cpython-312.pyc,,
+pygments/lexers/__pycache__/ada.cpython-312.pyc,,
+pygments/lexers/__pycache__/agile.cpython-312.pyc,,
+pygments/lexers/__pycache__/algebra.cpython-312.pyc,,
+pygments/lexers/__pycache__/ambient.cpython-312.pyc,,
+pygments/lexers/__pycache__/amdgpu.cpython-312.pyc,,
+pygments/lexers/__pycache__/ampl.cpython-312.pyc,,
+pygments/lexers/__pycache__/apdlexer.cpython-312.pyc,,
+pygments/lexers/__pycache__/apl.cpython-312.pyc,,
+pygments/lexers/__pycache__/archetype.cpython-312.pyc,,
+pygments/lexers/__pycache__/arrow.cpython-312.pyc,,
+pygments/lexers/__pycache__/arturo.cpython-312.pyc,,
+pygments/lexers/__pycache__/asc.cpython-312.pyc,,
+pygments/lexers/__pycache__/asm.cpython-312.pyc,,
+pygments/lexers/__pycache__/asn1.cpython-312.pyc,,
+pygments/lexers/__pycache__/automation.cpython-312.pyc,,
+pygments/lexers/__pycache__/bare.cpython-312.pyc,,
+pygments/lexers/__pycache__/basic.cpython-312.pyc,,
+pygments/lexers/__pycache__/bdd.cpython-312.pyc,,
+pygments/lexers/__pycache__/berry.cpython-312.pyc,,
+pygments/lexers/__pycache__/bibtex.cpython-312.pyc,,
+pygments/lexers/__pycache__/blueprint.cpython-312.pyc,,
+pygments/lexers/__pycache__/boa.cpython-312.pyc,,
+pygments/lexers/__pycache__/bqn.cpython-312.pyc,,
+pygments/lexers/__pycache__/business.cpython-312.pyc,,
+pygments/lexers/__pycache__/c_cpp.cpython-312.pyc,,
+pygments/lexers/__pycache__/c_like.cpython-312.pyc,,
+pygments/lexers/__pycache__/capnproto.cpython-312.pyc,,
+pygments/lexers/__pycache__/carbon.cpython-312.pyc,,
+pygments/lexers/__pycache__/cddl.cpython-312.pyc,,
+pygments/lexers/__pycache__/chapel.cpython-312.pyc,,
+pygments/lexers/__pycache__/clean.cpython-312.pyc,,
+pygments/lexers/__pycache__/codeql.cpython-312.pyc,,
+pygments/lexers/__pycache__/comal.cpython-312.pyc,,
+pygments/lexers/__pycache__/compiled.cpython-312.pyc,,
+pygments/lexers/__pycache__/configs.cpython-312.pyc,,
+pygments/lexers/__pycache__/console.cpython-312.pyc,,
+pygments/lexers/__pycache__/cplint.cpython-312.pyc,,
+pygments/lexers/__pycache__/crystal.cpython-312.pyc,,
+pygments/lexers/__pycache__/csound.cpython-312.pyc,,
+pygments/lexers/__pycache__/css.cpython-312.pyc,,
+pygments/lexers/__pycache__/d.cpython-312.pyc,,
+pygments/lexers/__pycache__/dalvik.cpython-312.pyc,,
+pygments/lexers/__pycache__/data.cpython-312.pyc,,
+pygments/lexers/__pycache__/dax.cpython-312.pyc,,
+pygments/lexers/__pycache__/devicetree.cpython-312.pyc,,
+pygments/lexers/__pycache__/diff.cpython-312.pyc,,
+pygments/lexers/__pycache__/dns.cpython-312.pyc,,
+pygments/lexers/__pycache__/dotnet.cpython-312.pyc,,
+pygments/lexers/__pycache__/dsls.cpython-312.pyc,,
+pygments/lexers/__pycache__/dylan.cpython-312.pyc,,
+pygments/lexers/__pycache__/ecl.cpython-312.pyc,,
+pygments/lexers/__pycache__/eiffel.cpython-312.pyc,,
+pygments/lexers/__pycache__/elm.cpython-312.pyc,,
+pygments/lexers/__pycache__/elpi.cpython-312.pyc,,
+pygments/lexers/__pycache__/email.cpython-312.pyc,,
+pygments/lexers/__pycache__/erlang.cpython-312.pyc,,
+pygments/lexers/__pycache__/esoteric.cpython-312.pyc,,
+pygments/lexers/__pycache__/ezhil.cpython-312.pyc,,
+pygments/lexers/__pycache__/factor.cpython-312.pyc,,
+pygments/lexers/__pycache__/fantom.cpython-312.pyc,,
+pygments/lexers/__pycache__/felix.cpython-312.pyc,,
+pygments/lexers/__pycache__/fift.cpython-312.pyc,,
+pygments/lexers/__pycache__/floscript.cpython-312.pyc,,
+pygments/lexers/__pycache__/forth.cpython-312.pyc,,
+pygments/lexers/__pycache__/fortran.cpython-312.pyc,,
+pygments/lexers/__pycache__/foxpro.cpython-312.pyc,,
+pygments/lexers/__pycache__/freefem.cpython-312.pyc,,
+pygments/lexers/__pycache__/func.cpython-312.pyc,,
+pygments/lexers/__pycache__/functional.cpython-312.pyc,,
+pygments/lexers/__pycache__/futhark.cpython-312.pyc,,
+pygments/lexers/__pycache__/gcodelexer.cpython-312.pyc,,
+pygments/lexers/__pycache__/gdscript.cpython-312.pyc,,
+pygments/lexers/__pycache__/gleam.cpython-312.pyc,,
+pygments/lexers/__pycache__/go.cpython-312.pyc,,
+pygments/lexers/__pycache__/grammar_notation.cpython-312.pyc,,
+pygments/lexers/__pycache__/graph.cpython-312.pyc,,
+pygments/lexers/__pycache__/graphics.cpython-312.pyc,,
+pygments/lexers/__pycache__/graphql.cpython-312.pyc,,
+pygments/lexers/__pycache__/graphviz.cpython-312.pyc,,
+pygments/lexers/__pycache__/gsql.cpython-312.pyc,,
+pygments/lexers/__pycache__/hare.cpython-312.pyc,,
+pygments/lexers/__pycache__/haskell.cpython-312.pyc,,
+pygments/lexers/__pycache__/haxe.cpython-312.pyc,,
+pygments/lexers/__pycache__/hdl.cpython-312.pyc,,
+pygments/lexers/__pycache__/hexdump.cpython-312.pyc,,
+pygments/lexers/__pycache__/html.cpython-312.pyc,,
+pygments/lexers/__pycache__/idl.cpython-312.pyc,,
+pygments/lexers/__pycache__/igor.cpython-312.pyc,,
+pygments/lexers/__pycache__/inferno.cpython-312.pyc,,
+pygments/lexers/__pycache__/installers.cpython-312.pyc,,
+pygments/lexers/__pycache__/int_fiction.cpython-312.pyc,,
+pygments/lexers/__pycache__/iolang.cpython-312.pyc,,
+pygments/lexers/__pycache__/j.cpython-312.pyc,,
+pygments/lexers/__pycache__/javascript.cpython-312.pyc,,
+pygments/lexers/__pycache__/jmespath.cpython-312.pyc,,
+pygments/lexers/__pycache__/jslt.cpython-312.pyc,,
+pygments/lexers/__pycache__/json5.cpython-312.pyc,,
+pygments/lexers/__pycache__/jsonnet.cpython-312.pyc,,
+pygments/lexers/__pycache__/jsx.cpython-312.pyc,,
+pygments/lexers/__pycache__/julia.cpython-312.pyc,,
+pygments/lexers/__pycache__/jvm.cpython-312.pyc,,
+pygments/lexers/__pycache__/kuin.cpython-312.pyc,,
+pygments/lexers/__pycache__/kusto.cpython-312.pyc,,
+pygments/lexers/__pycache__/ldap.cpython-312.pyc,,
+pygments/lexers/__pycache__/lean.cpython-312.pyc,,
+pygments/lexers/__pycache__/lilypond.cpython-312.pyc,,
+pygments/lexers/__pycache__/lisp.cpython-312.pyc,,
+pygments/lexers/__pycache__/macaulay2.cpython-312.pyc,,
+pygments/lexers/__pycache__/make.cpython-312.pyc,,
+pygments/lexers/__pycache__/maple.cpython-312.pyc,,
+pygments/lexers/__pycache__/markup.cpython-312.pyc,,
+pygments/lexers/__pycache__/math.cpython-312.pyc,,
+pygments/lexers/__pycache__/matlab.cpython-312.pyc,,
+pygments/lexers/__pycache__/maxima.cpython-312.pyc,,
+pygments/lexers/__pycache__/meson.cpython-312.pyc,,
+pygments/lexers/__pycache__/mime.cpython-312.pyc,,
+pygments/lexers/__pycache__/minecraft.cpython-312.pyc,,
+pygments/lexers/__pycache__/mips.cpython-312.pyc,,
+pygments/lexers/__pycache__/ml.cpython-312.pyc,,
+pygments/lexers/__pycache__/modeling.cpython-312.pyc,,
+pygments/lexers/__pycache__/modula2.cpython-312.pyc,,
+pygments/lexers/__pycache__/mojo.cpython-312.pyc,,
+pygments/lexers/__pycache__/monte.cpython-312.pyc,,
+pygments/lexers/__pycache__/mosel.cpython-312.pyc,,
+pygments/lexers/__pycache__/ncl.cpython-312.pyc,,
+pygments/lexers/__pycache__/nimrod.cpython-312.pyc,,
+pygments/lexers/__pycache__/nit.cpython-312.pyc,,
+pygments/lexers/__pycache__/nix.cpython-312.pyc,,
+pygments/lexers/__pycache__/numbair.cpython-312.pyc,,
+pygments/lexers/__pycache__/oberon.cpython-312.pyc,,
+pygments/lexers/__pycache__/objective.cpython-312.pyc,,
+pygments/lexers/__pycache__/ooc.cpython-312.pyc,,
+pygments/lexers/__pycache__/openscad.cpython-312.pyc,,
+pygments/lexers/__pycache__/other.cpython-312.pyc,,
+pygments/lexers/__pycache__/parasail.cpython-312.pyc,,
+pygments/lexers/__pycache__/parsers.cpython-312.pyc,,
+pygments/lexers/__pycache__/pascal.cpython-312.pyc,,
+pygments/lexers/__pycache__/pawn.cpython-312.pyc,,
+pygments/lexers/__pycache__/pddl.cpython-312.pyc,,
+pygments/lexers/__pycache__/perl.cpython-312.pyc,,
+pygments/lexers/__pycache__/phix.cpython-312.pyc,,
+pygments/lexers/__pycache__/php.cpython-312.pyc,,
+pygments/lexers/__pycache__/pointless.cpython-312.pyc,,
+pygments/lexers/__pycache__/pony.cpython-312.pyc,,
+pygments/lexers/__pycache__/praat.cpython-312.pyc,,
+pygments/lexers/__pycache__/procfile.cpython-312.pyc,,
+pygments/lexers/__pycache__/prolog.cpython-312.pyc,,
+pygments/lexers/__pycache__/promql.cpython-312.pyc,,
+pygments/lexers/__pycache__/prql.cpython-312.pyc,,
+pygments/lexers/__pycache__/ptx.cpython-312.pyc,,
+pygments/lexers/__pycache__/python.cpython-312.pyc,,
+pygments/lexers/__pycache__/q.cpython-312.pyc,,
+pygments/lexers/__pycache__/qlik.cpython-312.pyc,,
+pygments/lexers/__pycache__/qvt.cpython-312.pyc,,
+pygments/lexers/__pycache__/r.cpython-312.pyc,,
+pygments/lexers/__pycache__/rdf.cpython-312.pyc,,
+pygments/lexers/__pycache__/rebol.cpython-312.pyc,,
+pygments/lexers/__pycache__/rego.cpython-312.pyc,,
+pygments/lexers/__pycache__/resource.cpython-312.pyc,,
+pygments/lexers/__pycache__/ride.cpython-312.pyc,,
+pygments/lexers/__pycache__/rita.cpython-312.pyc,,
+pygments/lexers/__pycache__/rnc.cpython-312.pyc,,
+pygments/lexers/__pycache__/roboconf.cpython-312.pyc,,
+pygments/lexers/__pycache__/robotframework.cpython-312.pyc,,
+pygments/lexers/__pycache__/ruby.cpython-312.pyc,,
+pygments/lexers/__pycache__/rust.cpython-312.pyc,,
+pygments/lexers/__pycache__/sas.cpython-312.pyc,,
+pygments/lexers/__pycache__/savi.cpython-312.pyc,,
+pygments/lexers/__pycache__/scdoc.cpython-312.pyc,,
+pygments/lexers/__pycache__/scripting.cpython-312.pyc,,
+pygments/lexers/__pycache__/sgf.cpython-312.pyc,,
+pygments/lexers/__pycache__/shell.cpython-312.pyc,,
+pygments/lexers/__pycache__/sieve.cpython-312.pyc,,
+pygments/lexers/__pycache__/slash.cpython-312.pyc,,
+pygments/lexers/__pycache__/smalltalk.cpython-312.pyc,,
+pygments/lexers/__pycache__/smithy.cpython-312.pyc,,
+pygments/lexers/__pycache__/smv.cpython-312.pyc,,
+pygments/lexers/__pycache__/snobol.cpython-312.pyc,,
+pygments/lexers/__pycache__/solidity.cpython-312.pyc,,
+pygments/lexers/__pycache__/soong.cpython-312.pyc,,
+pygments/lexers/__pycache__/sophia.cpython-312.pyc,,
+pygments/lexers/__pycache__/special.cpython-312.pyc,,
+pygments/lexers/__pycache__/spice.cpython-312.pyc,,
+pygments/lexers/__pycache__/sql.cpython-312.pyc,,
+pygments/lexers/__pycache__/srcinfo.cpython-312.pyc,,
+pygments/lexers/__pycache__/stata.cpython-312.pyc,,
+pygments/lexers/__pycache__/supercollider.cpython-312.pyc,,
+pygments/lexers/__pycache__/tablegen.cpython-312.pyc,,
+pygments/lexers/__pycache__/tact.cpython-312.pyc,,
+pygments/lexers/__pycache__/tal.cpython-312.pyc,,
+pygments/lexers/__pycache__/tcl.cpython-312.pyc,,
+pygments/lexers/__pycache__/teal.cpython-312.pyc,,
+pygments/lexers/__pycache__/templates.cpython-312.pyc,,
+pygments/lexers/__pycache__/teraterm.cpython-312.pyc,,
+pygments/lexers/__pycache__/testing.cpython-312.pyc,,
+pygments/lexers/__pycache__/text.cpython-312.pyc,,
+pygments/lexers/__pycache__/textedit.cpython-312.pyc,,
+pygments/lexers/__pycache__/textfmts.cpython-312.pyc,,
+pygments/lexers/__pycache__/theorem.cpython-312.pyc,,
+pygments/lexers/__pycache__/thingsdb.cpython-312.pyc,,
+pygments/lexers/__pycache__/tlb.cpython-312.pyc,,
+pygments/lexers/__pycache__/tls.cpython-312.pyc,,
+pygments/lexers/__pycache__/tnt.cpython-312.pyc,,
+pygments/lexers/__pycache__/trafficscript.cpython-312.pyc,,
+pygments/lexers/__pycache__/typoscript.cpython-312.pyc,,
+pygments/lexers/__pycache__/typst.cpython-312.pyc,,
+pygments/lexers/__pycache__/ul4.cpython-312.pyc,,
+pygments/lexers/__pycache__/unicon.cpython-312.pyc,,
+pygments/lexers/__pycache__/urbi.cpython-312.pyc,,
+pygments/lexers/__pycache__/usd.cpython-312.pyc,,
+pygments/lexers/__pycache__/varnish.cpython-312.pyc,,
+pygments/lexers/__pycache__/verification.cpython-312.pyc,,
+pygments/lexers/__pycache__/verifpal.cpython-312.pyc,,
+pygments/lexers/__pycache__/vip.cpython-312.pyc,,
+pygments/lexers/__pycache__/vyper.cpython-312.pyc,,
+pygments/lexers/__pycache__/web.cpython-312.pyc,,
+pygments/lexers/__pycache__/webassembly.cpython-312.pyc,,
+pygments/lexers/__pycache__/webidl.cpython-312.pyc,,
+pygments/lexers/__pycache__/webmisc.cpython-312.pyc,,
+pygments/lexers/__pycache__/wgsl.cpython-312.pyc,,
+pygments/lexers/__pycache__/whiley.cpython-312.pyc,,
+pygments/lexers/__pycache__/wowtoc.cpython-312.pyc,,
+pygments/lexers/__pycache__/wren.cpython-312.pyc,,
+pygments/lexers/__pycache__/x10.cpython-312.pyc,,
+pygments/lexers/__pycache__/xorg.cpython-312.pyc,,
+pygments/lexers/__pycache__/yang.cpython-312.pyc,,
+pygments/lexers/__pycache__/yara.cpython-312.pyc,,
+pygments/lexers/__pycache__/zig.cpython-312.pyc,,
+pygments/lexers/_ada_builtins.py,sha256=CA_OnShtdc7wWh9oYcRlcrkDAQwYUKl6w7tdSbALQd4,1543
+pygments/lexers/_asy_builtins.py,sha256=cd9M00YH19w5ZL7aqucmC3nwpJGTS04U-01NLy5E2_4,27287
+pygments/lexers/_cl_builtins.py,sha256=kQeUIyZjP4kX0frkICDcKxBYQCLqzIDXa5WV5cevhDo,13994
+pygments/lexers/_cocoa_builtins.py,sha256=Ka1lLJe7JfWtdho4IFIB82X9yBvrbfHCCmEG-peXXhQ,105173
+pygments/lexers/_csound_builtins.py,sha256=qnQYKeI26ZHim316uqy_hDiRiCoHo2RHjD3sYBALyXs,18414
+pygments/lexers/_css_builtins.py,sha256=aD-dhLFXVd1Atn_bZd7gEdQn7Mhe60_VHpvZ340WzDI,12446
+pygments/lexers/_googlesql_builtins.py,sha256=IkrOk-T2v1yzbGzUEEQh5_Cf4uC_cmL_uuhwDpZlTug,16132
+pygments/lexers/_julia_builtins.py,sha256=N2WdSw5zgI2fhDat_i4YeVqurRTC_P8x71ez00SCN6U,11883
+pygments/lexers/_lasso_builtins.py,sha256=8q1gbsrMJeaeUhxIYKhaOxC9j_B-NBpq_XFj2Ze41X0,134510
+pygments/lexers/_lilypond_builtins.py,sha256=XTbGL1z1oKMoqWLEktG33jx5GdGTI9CpeO5NheEi4Y0,108094
+pygments/lexers/_lua_builtins.py,sha256=PhFdZV5-Tzz2j_q4lvG9lr84ELGfL41BhnrSDNNTaG4,8108
+pygments/lexers/_luau_builtins.py,sha256=-IDrU04kUVfjXwSQzMMpXmMYhNsQxZVVZk8cuAA0Lo0,955
+pygments/lexers/_mapping.py,sha256=9fv7xYOUAOr6LzfdFS4MDbPu78o4OQQH-2nsI1bNZf4,70438
+pygments/lexers/_mql_builtins.py,sha256=ybRQjlb7Cul0sDstnzxJl3h0qS6Ieqsr811fqrxyumU,24713
+pygments/lexers/_mysql_builtins.py,sha256=y0kAWZVAs0z2dTFJJV42OZpILgRnd8T3zSlBFv-g_oA,25838
+pygments/lexers/_openedge_builtins.py,sha256=Sz4j9-CPWIaxMa-2fZgY66j7igcu1ob1GR2UtI8zAkg,49398
+pygments/lexers/_php_builtins.py,sha256=Jd4BZpjMDELPi4EVoSxK1-8BFTc63HUwYfm1rLrGj0M,107922
+pygments/lexers/_postgres_builtins.py,sha256=Pqh4z0RBRbnW6rCQtWUdzWCJxNyqpJ7_0HOktxHDxk4,13343
+pygments/lexers/_qlik_builtins.py,sha256=xuJy9c9uZDXv6h8z582P5PrxqkxTZ_nS8gPl9OD9VN8,12595
+pygments/lexers/_scheme_builtins.py,sha256=2hNtJOJmP21lUsikpqMJ2gAmLT3Rwn_KEeqhXwCjgfk,32564
+pygments/lexers/_scilab_builtins.py,sha256=oZYPB1XPdIEz3pII11pFDe6extRRyWGA7pY06X8KZ8w,52411
+pygments/lexers/_sourcemod_builtins.py,sha256=H8AFLsNDdEpymIWOpDwbDJGCP1w-x-1gSlzPDioMF4o,26777
+pygments/lexers/_stan_builtins.py,sha256=dwi1hllM_NsaCv-aXJy7lEi57X5Hh5gSD97aCQyT9KM,13445
+pygments/lexers/_stata_builtins.py,sha256=Hqrr6j77zWU3cGGpBPohwexZci43YA4_sVYE4E1sNow,27227
+pygments/lexers/_tsql_builtins.py,sha256=Pi2RhTXcLE3glI9oxNhyVsOMn-fK_1TRxJ-EsYP5LcI,15460
+pygments/lexers/_usd_builtins.py,sha256=c9hbU1cwqBUCFIhNfu_Dob8ywv1rlPhi9w2OTj3kR8s,1658
+pygments/lexers/_vbscript_builtins.py,sha256=MqJ2ABywD21aSRtWYZRG64CCbGstC1kfsiHGJmZzxiw,4225
+pygments/lexers/_vim_builtins.py,sha256=bA4mH8t1mPPQfEiUCKEqRO1O0rL2DUG0Ux1Bt8ZSu0E,57066
+pygments/lexers/actionscript.py,sha256=JBngCe5UhYT_0dLD2j7PnPO0xRRJhmypEuQ-C5in8pY,11727
+pygments/lexers/ada.py,sha256=58k5ra1vGS4iLpW3h1ItY9ftzF3WevaeAAXzAYTiYkQ,5353
+pygments/lexers/agile.py,sha256=DN-7AVIqtG1MshA94rtSGYI_884hVHgzq405wD0_dl8,896
+pygments/lexers/algebra.py,sha256=yGTu9Tt-cQzAISQYIC5MS5a3z4QmL-tGcXnd_pkWGbk,9952
+pygments/lexers/ambient.py,sha256=UnzKpIlfSm3iitHvMd7XTMSY8TjZYYhKOC3AiARS_cE,2605
+pygments/lexers/amdgpu.py,sha256=S8qjn2UMLhBFm3Yn_c06XAGf8cl5x_ZeluelWG_-JAw,1723
+pygments/lexers/ampl.py,sha256=ZBRfDXm760gR1a1gqItnsHuoO3JdUcTBjJ5tFY9UtPA,4176
+pygments/lexers/apdlexer.py,sha256=Zr5-jgjxC8PKzRlEeclakZXPHci7FHBZghQ6wwiuT7A,30800
+pygments/lexers/apl.py,sha256=PTQMp-bxT5P-DbrEvFha10HBTcsDJ5srL3I1s9ljz58,3404
+pygments/lexers/archetype.py,sha256=pQVlP1Fb5OA8nn7QwmFaaaOSvvpoIsQVw43FVCQCve4,11538
+pygments/lexers/arrow.py,sha256=2PKdbWq3xQLF1KoDbWvSxpjwKRrznnDiArTflRGZzBo,3564
+pygments/lexers/arturo.py,sha256=U5MtRNHJtnBn4ZOeWmW6MKlVRG7SX6KhTRamDqzn9tA,11414
+pygments/lexers/asc.py,sha256=-DgZl9jccBDHPlDmjCsrEqx0-Q7ap7XVdNKtxLNWG1w,1693
+pygments/lexers/asm.py,sha256=xm2Y5mcT-sF3oQvair4SWs9EWTyndoaUoSsDy5v6shI,41967
+pygments/lexers/asn1.py,sha256=BlcloIX2bu6Q7BxGcksuhYFHGsXLVKyB4B9mFd4Pj6E,4262
+pygments/lexers/automation.py,sha256=Q61qon8EwpfakMh_2MS2E2zUUT16rG3UNIKPYjITeTs,19831
+pygments/lexers/bare.py,sha256=tWoei86JJX1k-ADhaXd5TgX6ItDTici9yFWpkTPhnfM,3020
+pygments/lexers/basic.py,sha256=qpVe5h8Fa7NJo1EihN-4R_UZpHO6my2Ssgkb-BktkKs,27989
+pygments/lexers/bdd.py,sha256=yysefcOFAEyk9kJ2y4EXmzJTecgLYUHlWixt_3YzPMU,1641
+pygments/lexers/berry.py,sha256=zxGowFb8HMIyN15-m8nmWnW6bPRR4esKtSEVugc9uXM,3209
+pygments/lexers/bibtex.py,sha256=yuNoPxwrJf9DCGUT17hxfDzbq_HtCLkQkRbBtiTVmeQ,4811
+pygments/lexers/blueprint.py,sha256=NzvWHMxCLDWt8hc6gB5jokltxVJgNa7Jwh4c61ng388,6188
+pygments/lexers/boa.py,sha256=dOot1XWNZThPIio2UyAX67K6EpISjSRCFjotD7dcnwE,3921
+pygments/lexers/bqn.py,sha256=nJiwrPKKbRF-qdai5tfqipwBkkko2P3weiZAjHUMimY,3671
+pygments/lexers/business.py,sha256=lRtekOJfsDkb12AGbuz10-G67OJrVJgCBtihTQ8_aoY,28345
+pygments/lexers/c_cpp.py,sha256=D7ZIswaHASlGBgoTlwnSqTQHf8_JyvvSt2L2q1W-F6g,18059
+pygments/lexers/c_like.py,sha256=FTGp17ds6X2rDZOHup2hH6BEn3gKK4nLm9pydNEhm0E,32021
+pygments/lexers/capnproto.py,sha256=XQJAh1WS-0ulqbTn9TdzR6gEgWLcuBqb4sj3jNsrhsY,2174
+pygments/lexers/carbon.py,sha256=av12YuTGZGpOa1Cmxp3lppx3LfSJUWbvOu0ixmUVll0,3211
+pygments/lexers/cddl.py,sha256=MKa70IwABgjBjYu15_Q9v8rsu2sr1a-i2jkiaPTI6sM,5076
+pygments/lexers/chapel.py,sha256=0n_fL3ehLC4pw4YKnmq9jxIXOJcxGPka1Wr1t1zsXPc,5156
+pygments/lexers/clean.py,sha256=dkDPAwF5BTALPeuKFoRKOSD3RfsKcGWbaRo6_G8LHng,6418
+pygments/lexers/codeql.py,sha256=ebvghn2zbrnETV4buVozMDmRCVKSdGiIN8ycLlHpGsE,2576
+pygments/lexers/comal.py,sha256=TC3NzcJ58ew5jw7qwK0kJ-okTA47psZje0yAIS39HR4,3179
+pygments/lexers/compiled.py,sha256=Slfo1sjWqcPawUwf0dIIZLBCL5pkOIoAX2S8Lxs02Mc,1426
+pygments/lexers/configs.py,sha256=wW8pY0Sa5a10pnAeTLGf48HhixQTVageIyHEf1aYMCc,50913
+pygments/lexers/console.py,sha256=-jAG120dupvV3kG3zC70brLJvSLwTFqMubBQuj_GVnU,4180
+pygments/lexers/cplint.py,sha256=DkbyE5EKydLgf6BRr1FhQrK-IeQPL7Zmjk0DVdlRFnQ,1389
+pygments/lexers/crystal.py,sha256=xU-RnpIkpjrquoxtOuOcP8fcesSJl4xhU7kO9m42LZY,15754
+pygments/lexers/csound.py,sha256=ioSw4Q04wdwjUAbnTZ1qLhUq1vxdWFxhh3QtEl5RAJc,16998
+pygments/lexers/css.py,sha256=JN1RBYsee-jrpHWrSmhN3TKc4TkOBn-_BEGpgTCzcqE,25376
+pygments/lexers/d.py,sha256=piOy0EJeiAwPHugiM3gVv0z7HNh3u2gZQoCUSASRbY4,9920
+pygments/lexers/dalvik.py,sha256=deFg2JPBktJ9mEGb9EgxNkmd6vaMjJFQVzUHo8NKIa8,4606
+pygments/lexers/data.py,sha256=o0x0SmB5ms_CPUPljEEEenOON4IQWn86DkwFjkJYCOg,27026
+pygments/lexers/dax.py,sha256=ASi73qmr7OA7cVZXF2GTYGt01Ly1vY8CgD_Pnpm8k-4,8098
+pygments/lexers/devicetree.py,sha256=RecSQCidt8DRE1QFCPUbwwR0hiRlNtsFihdGldeUn3k,4019
+pygments/lexers/diff.py,sha256=F6vxZ64wm5Nag_97de1H_3F700ZwCVnYjKvtT5jilww,5382
+pygments/lexers/dns.py,sha256=Hh5hJ7MXfrq36KgfyIRwK3X8o1LdR98IKERcV4eZ7HY,3891
+pygments/lexers/dotnet.py,sha256=NDE0kOmpe96GLO-zwNLazmj77E9ORGmKpa4ZMCXDXxQ,39441
+pygments/lexers/dsls.py,sha256=GnHKhGL5GxsRFnqC7-65NTPZLOZdmnllNrGP86x_fQE,36746
+pygments/lexers/dylan.py,sha256=7zZ1EbHWXeVHqTD36AqykKqo3fhuIh4sM-whcxUaH_Y,10409
+pygments/lexers/ecl.py,sha256=vhmpa2LBrHxsPkYcf3kPZ1ItVaLRDTebi186wY0xGZA,6371
+pygments/lexers/eiffel.py,sha256=5ydYIEFcgcMoEj4BlK31hZ0aJb8OX0RdAvuCNdlxwqw,2690
+pygments/lexers/elm.py,sha256=uRCddU8jK5vVkH6Y66y8KOsDJprIfrOgeYq3hv1PxAM,3152
+pygments/lexers/elpi.py,sha256=O9j_WKBPyvNFjCRuPciVpW4etVSnILm_T79BhCPZYmo,6877
+pygments/lexers/email.py,sha256=ZZL6yvwCRl1CEQyysuOu0lbabp5tjMutS7f3efFKGR4,4804
+pygments/lexers/erlang.py,sha256=bU11eVHvooLwmVknzN6Xkb2DMk7HbenqdNlYSzhThDM,19147
+pygments/lexers/esoteric.py,sha256=Jfp8UUKyKYsqLaqXRZT3GSM9dzkF65zduwfnH1GoGhU,10500
+pygments/lexers/ezhil.py,sha256=22r-xjvvBVpExTqCI-HycAwunDb1p5gY4tIfDmM0vDw,3272
+pygments/lexers/factor.py,sha256=urZ4En4uKFCLXdEkXLWg9EYUFGHQTTDCwNXtyq-ngok,19530
+pygments/lexers/fantom.py,sha256=JJ13-NwykD-iIESnuzCefCYeQDO95cHMJA8TasF4gHA,10231
+pygments/lexers/felix.py,sha256=F-v0si4zPtRelqzDQWXI1-tarCE-BvawziODxRU7378,9655
+pygments/lexers/fift.py,sha256=rOCwp3v5ocK5YOWvt7Td3Md--97_8e-7Sonx52uS8mA,1644
+pygments/lexers/floscript.py,sha256=aHh82k52jMuDuzl9LatrcSANJiXTCyjGU3SO53bwbb0,2667
+pygments/lexers/forth.py,sha256=ZMtsHdNbnS_0IdSYlfAlfTSPEr0MEsRo-YZriQNueTQ,7193
+pygments/lexers/fortran.py,sha256=1PE5dTxf4Df6LUeXFcmNtyeXWsC8tSiK5dYwPHIJeeQ,10382
+pygments/lexers/foxpro.py,sha256=CBkW62Fuibz3yfyelZCaEO8GGdFJWsuRhqwtsSeBwLM,26295
+pygments/lexers/freefem.py,sha256=LFBQk-m1-nNCgrl-VDH3QwnVWurvb7W29i06LoT207A,26913
+pygments/lexers/func.py,sha256=OR2rkM7gf9fKvad5WcFQln-_U_pb-RUCM9eQatToF4A,3700
+pygments/lexers/functional.py,sha256=fYT2AGZ642cRkIAId0rnXFBsx1c8LLEDRN_VuCEkUyM,693
+pygments/lexers/futhark.py,sha256=Vf1i4t-tR3zqaktVjhTzFNg_ts_9CcyA4ZDfDizbCmk,3743
+pygments/lexers/gcodelexer.py,sha256=4Xs9ax4-JZGupW_qSnHon39wQGpb-tNA3xorMKg841E,874
+pygments/lexers/gdscript.py,sha256=Ws7JKxy0M0IyZ_1iMfRvJPrizEwmeCNLDoeMIFaM-CU,7566
+pygments/lexers/gleam.py,sha256=XIlTcq6cB743pCqbNYo8PocSkjZyDPR6hHgdaJNJ1Vc,2392
+pygments/lexers/go.py,sha256=4LezefgyuqZWHzLZHieUkKTi-ssY6aHJxx7Z-LFaLK0,3783
+pygments/lexers/grammar_notation.py,sha256=LvzhRQHgwZzq9oceukZS_hwnKK58ee7Z5d0cwXOR734,8043
+pygments/lexers/graph.py,sha256=WFqoPA1c_hHYrV0i_F7-eUw3Co4_HmZY3GJ-TyDr670,4108
+pygments/lexers/graphics.py,sha256=tmF9NNALnvPnax8ywYC3pLOla45YXtp9UA0H-5EiTQY,39145
+pygments/lexers/graphql.py,sha256=O_zcrGrBaDaKTlUoJGRruxqk7CJi-NR92Y0Cs-KkCvw,5601
+pygments/lexers/graphviz.py,sha256=mzdXOMpwz9_V-be1eTAMyhkKCBl6UxCIXuq6C2yrtsw,1934
+pygments/lexers/gsql.py,sha256=VPZk9sb26-DumRkWfEaSTeoc0lx5xt5n-6eDDLezMtc,3990
+pygments/lexers/hare.py,sha256=PGCOuILktJsmtTpCZZKkMFtObfJuBpei8HM8HHuq1Tw,2649
+pygments/lexers/haskell.py,sha256=MYr74-PAC8kGJRX-dZmvZsHTc7a2u6yFS2B19LfDD7g,33262
+pygments/lexers/haxe.py,sha256=WHCy_nrXHnfLITfbdp3Ji3lqQU4HAsTUpXsLCp2_4sk,30974
+pygments/lexers/hdl.py,sha256=MOWxhmAuE4Ei0CKDqqaON7T8tl43geancrNYM136Z0U,22738
+pygments/lexers/hexdump.py,sha256=1lj9oJ-KiZXSVYvTMfGmEAQzNEW08WlMcC2I5aYvHK4,3653
+pygments/lexers/html.py,sha256=MxYTI4EeT7QxoGleCAyQq-8n_Sgly6tD95H5zanCNmk,21977
+pygments/lexers/idl.py,sha256=rcihUAGhfuGEaSW6pgFq6NzplT_pv0DagUoefg4zAmk,15449
+pygments/lexers/igor.py,sha256=wVefbUjb3ftaW3LCKGtX1JgLgiY4EmRor5gVOn8vQA8,31633
+pygments/lexers/inferno.py,sha256=ChE_5y5SLH_75Uv7D2dKWQMk2dlN6z1gY1IDjlJZ8rU,3135
+pygments/lexers/installers.py,sha256=ZHliit4Pxz1tYKOIjKkDXI5djTkpzYUMVIPR1xvUrL8,14435
+pygments/lexers/int_fiction.py,sha256=0ZzIa1sZDUQsltd1oHuS-BoNiOF8zKQfcVuDyK1Ttv8,56544
+pygments/lexers/iolang.py,sha256=L6dNDCLH0kxkIUi00fI4Z14QnRu79UcNDrgv02c5Zw8,1905
+pygments/lexers/j.py,sha256=DqNdwQGFLiZW3mCNLRg81gpmsy4Hgcai_9NP3LbWhNU,4853
+pygments/lexers/javascript.py,sha256=TGKQLSrCprCKfhLLGAq_0EOdvqvJKX9pOdKo7tCRurQ,63243
+pygments/lexers/jmespath.py,sha256=R5yA5LJ2nTIaDwnFIpSNGAThd0sAYFccwawA9xBptlg,2082
+pygments/lexers/jslt.py,sha256=OeYQf8O2_9FCaf9W6Q3a7rPdAFLthePCtVSgCrOTcl8,3700
+pygments/lexers/json5.py,sha256=8JZbc8EiTEZdKaIdQg3hXEh0mHWSzPlwd473a0nUuT0,2502
+pygments/lexers/jsonnet.py,sha256=bx2G6J4tJqGrJV1PyZrIWzWHXcoefCX-4lIxxtbn2gw,5636
+pygments/lexers/jsx.py,sha256=wGsoGSB40qAJrVfXwRPtan7OcK0O87RVsHHk0m6gogk,2693
+pygments/lexers/julia.py,sha256=0ZDJ9X83V5GqJzA6T6p0TTN8WHy2JAjvu-FSBXvfXdc,11710
+pygments/lexers/jvm.py,sha256=Yt1iQ3QodXRY-x_HUOGedhyuBBHn5jYH-I8NzOzHTlE,72667
+pygments/lexers/kuin.py,sha256=3dKKJVJlskgrvMKv2tY9NOsFfDjyo-3MLcJ1lFKdXSg,11405
+pygments/lexers/kusto.py,sha256=kaxkoPpEBDsBTCvCOkZZx7oGfv0jk_UNIRIRbfVAsBE,3477
+pygments/lexers/ldap.py,sha256=77vF4t_19x9V522cxRCM5d3HW8Ne3giYsFsMPVYYBw4,6551
+pygments/lexers/lean.py,sha256=7HWRgxFsxS1N9XKqw0vfKwaxl27s5YiVYtZeRUoTHFo,8570
+pygments/lexers/lilypond.py,sha256=yd2Tuv67um6EyCIr-VwBnlPhTHxMaQsBJ4nGgO5fjIk,9752
+pygments/lexers/lisp.py,sha256=EHUy1g4pzEsYPE-zGj2rAXm3YATE1j9dCQOr5-JPSkU,157668
+pygments/lexers/macaulay2.py,sha256=zkV-vxjQYa0Jj9TGfFP1iMgpTZ4ApQuAAIdJVGWb2is,33366
+pygments/lexers/make.py,sha256=YMI5DBCrxWca-pz9cVXcyfuHLcikPx9R_3pW_98Myqo,7831
+pygments/lexers/maple.py,sha256=Rs0dEmOMD3C1YQPd0mntN-vzReq4XfHegH6xV4lvJWo,7960
+pygments/lexers/markup.py,sha256=zWtxsyIx_1OxQzS6wLe8bEqglePv4RqvJjbia8AvV5c,65088
+pygments/lexers/math.py,sha256=P3ZK1ePd8ZnLdlmHezo2irCA8T2-nlHBoSaBoT5mEVI,695
+pygments/lexers/matlab.py,sha256=F9KO4qowIhfP8oVhCRRzE_1sqg4zmQbsB2NZH193PiM,133027
+pygments/lexers/maxima.py,sha256=a0h9Ggs9JEovTrzbJT-BLVbOqI29yPnaMZlkU5f_FeY,2715
+pygments/lexers/meson.py,sha256=BMrsDo6BH2lzTFw7JDwQ9SDNMTrRkXCNRDVf4aFHdsI,4336
+pygments/lexers/mime.py,sha256=yGrf3h37LK4b6ERBpFiL_qzn3JgOfGR5KLagnbWFl6c,7582
+pygments/lexers/minecraft.py,sha256=Nu88snDDPzM0D-742fFdUriczL-EE911pAd4_I4-pAw,13696
+pygments/lexers/mips.py,sha256=STKiZT67b3QERXXn7XKVxlPBu7vwbPC5EyCpuf3Jfbw,4656
+pygments/lexers/ml.py,sha256=t8sCv4BjvuBq6AihKKUwStEONIgdXCC2RMtO0RopNbM,35390
+pygments/lexers/modeling.py,sha256=M7B58bGB-Zwd1EmPxKqtRvg7TgNCyem3MVUHv0_H2SQ,13683
+pygments/lexers/modula2.py,sha256=NtpXBRoUCeHfflgB39LknSkCwhBHBKv2Er_pinjVsNE,53072
+pygments/lexers/mojo.py,sha256=8JRVoftN1E-W2woG0K-4n8PQXTUM9iY6Sl5sWb2uGNg,24233
+pygments/lexers/monte.py,sha256=baWU6zlXloenw9MO1MtEVGE9i3CfiXAYhqU621MIjRk,6289
+pygments/lexers/mosel.py,sha256=gjRdedhA1jTjoYoM1Gpaoog_I9o7TRbYMHk97N1TXwg,9297
+pygments/lexers/ncl.py,sha256=zJ6ahlitit4S0pBXc7Wu96PB7xOn59MwfR2HdY5_C60,63999
+pygments/lexers/nimrod.py,sha256=Q1NSqEkLC5wWt7xJyKC-vzWw_Iw2SfDNP_pyMFBuIfA,6413
+pygments/lexers/nit.py,sha256=p_hVD8GzMRl3CABVKHtYgnXFUQk0i5F2FbWFA6WXm6s,2725
+pygments/lexers/nix.py,sha256=NOrv20gdq-2A7eZ6c2gElPHv1Xx2pvv20-qOymL9GMg,4421
+pygments/lexers/numbair.py,sha256=fxkp2CXeXWKBMewfi1H4JSYkmm4kU58wZ2Sh9BDYAWQ,1758
+pygments/lexers/oberon.py,sha256=jw403qUUs7zpTHAs5CbLjb8qiuwtxLk0spDIYqGZwAw,4210
+pygments/lexers/objective.py,sha256=Fo1WB3JMj8sNeYnvB84H4_qwhOt4WNJtJWjVEOwrJGk,23297
+pygments/lexers/ooc.py,sha256=kD1XaJZaihDF_s-Vyu1Bx68S_9zFt2rhox7NF8LpOZM,3002
+pygments/lexers/openscad.py,sha256=h9I1k8kiuQmhX5vZm6VDSr2fa5Finy0sN8ZDIE-jx1c,3700
+pygments/lexers/other.py,sha256=WLVyqPsvm9oSXIbZwbfyJloS6HGgoFW5nVTaU1uQpTw,1763
+pygments/lexers/parasail.py,sha256=DWMGhtyQgGTXbIgQl_mID6CKqi-Dhbvs_dTkmvrZXfE,2719
+pygments/lexers/parsers.py,sha256=feNgxroPoWRf0NEsON2mtmKDUfslIQppukw6ndEsQ3M,26596
+pygments/lexers/pascal.py,sha256=N2tRAjlXnTxggAzzk2tOOAVzeC2MBzrXy97_HQl5n44,30989
+pygments/lexers/pawn.py,sha256=LWUYQYsebMMt2d5oxX1HYWvBqbakR1h7Av_z8Vw94Wg,8253
+pygments/lexers/pddl.py,sha256=Mk4_BzlROJCd0xR4KKRRSrbj0F7LLQcBRjmsmtWmrCg,2989
+pygments/lexers/perl.py,sha256=9BXn3tyHMA49NvzbM9E2czSCHjeU7bvaPLUcoZrhz-4,39192
+pygments/lexers/phix.py,sha256=hZqychqo5sFMBDESzDPXg1DYHQe_9sn294UfbjihaFk,23249
+pygments/lexers/php.py,sha256=l4hzQrlm0525i5dSw9Vmjcai3TzbPT6DkjzxPg9l6Zc,13061
+pygments/lexers/pointless.py,sha256=WSDjqQyGrNIGmTCdaMxl4zk7OZTlJAMzeUZ02kfgcTI,1974
+pygments/lexers/pony.py,sha256=EXrMkacqMZblI7v4AvBRQe-3Py8__bx5FOgjCLdfXxQ,3279
+pygments/lexers/praat.py,sha256=4UFK-nbC6WkZBhJgcQqEGqq9CocJkW7AmT_OJQbjWzk,12676
+pygments/lexers/procfile.py,sha256=05W2fyofLTP-FbEdSXD1eles-PPqVNfF6RWXjQdW2us,1155
+pygments/lexers/prolog.py,sha256=9Kc5YNUFqkfWu2sYoyzC3RX65abf1bm7oHr86z1s4kQ,12866
+pygments/lexers/promql.py,sha256=n-0vo-o8-ZasqP3Va4ujs562UfZSLfZF-RzT71yL0Tk,4738
+pygments/lexers/prql.py,sha256=PFReuvhbv4K5aeu6lvDfw4m-3hULkB3r43bKAy948os,8747
+pygments/lexers/ptx.py,sha256=KSHAvbiNVUntKilQ6EPYoLFocmJpRsBy_7fW6_Nrs1Y,4501
+pygments/lexers/python.py,sha256=WZe7fBAHKZ_BxPg8qIU26UGhk8qwUYyENJ3IyPW64mc,53805
+pygments/lexers/q.py,sha256=WQFUh3JrpK2j-VGW_Ytn3uJ5frUNmQIFnLtMVGRA9DI,6936
+pygments/lexers/qlik.py,sha256=2wqwdfIjrAz6RNBsP4MyeLX8Z7QpIGzxtf1CvaOlr_g,3693
+pygments/lexers/qvt.py,sha256=XMBnsWRrvCDf989OuDeb-KpszAkeETiACyaghZeL1ns,6103
+pygments/lexers/r.py,sha256=B6WgrD9SY1UTCV1fQBSlZbezPfpYsARn3FQIHcFYOiM,6474
+pygments/lexers/rdf.py,sha256=qUzxLna9v071bHhZAjdsBi8dKaJNk_h9g1ZRUAYCfoo,16056
+pygments/lexers/rebol.py,sha256=4u3N4kzui55HapopXDu3Kt0jczxDZ4buzwR7Mt4tQiM,18259
+pygments/lexers/rego.py,sha256=Rx5Gphbktr9ojg5DbqlyxHeQqqtF7g8W-oF0rmloDNY,1748
+pygments/lexers/resource.py,sha256=ioEzgWksB5HCjoz85XNkQPSd7n5kL0SZiuPkJP1hunQ,2927
+pygments/lexers/ride.py,sha256=kCWdxuR3PclVi4wiA0uUx4CYEFwuTqoMsKjhSW4X3yg,5035
+pygments/lexers/rita.py,sha256=Mj1QNxx1sWAZYC02kw8piVckaiw9B0MqQtiIiDFH0pA,1127
+pygments/lexers/rnc.py,sha256=g7ZD334PMGUqy_Ij64laSN1vJerwHqVkegfMCa3E-y8,1972
+pygments/lexers/roboconf.py,sha256=HbYuK5CqmQdd63SRY2nle01r7-p7mil0SnoauYDmEOY,2074
+pygments/lexers/robotframework.py,sha256=c4U1B9Q9ITBCTohqJTZOvkfyeVbenN4xhzSWIoZh5eU,18448
+pygments/lexers/ruby.py,sha256=uG617E5abBZcECRCqkhIfc-IbZcRb5cGuUZq_xpax90,22753
+pygments/lexers/rust.py,sha256=ZY-9vtsreBP0NfDd0WCouLSp_9MChAL8U8Abe-m9PB8,8260
+pygments/lexers/sas.py,sha256=C1Uz2s9DU6_s2kL-cB_PAGPtpyK5THlmhNmCumC1l48,9456
+pygments/lexers/savi.py,sha256=jrmruK0GnXktgBTWXW3oN3TXtofn3HBbkMlHnR84cko,4878
+pygments/lexers/scdoc.py,sha256=DXRmFDmYuc7h3gPAAVhfcL1OEbNBK5RdPpJqQzF3ZTk,2524
+pygments/lexers/scripting.py,sha256=jnJv_AFDyDrpzEPGNat5K6xzUBsEAiBr6N2_yLMt8LQ,81724
+pygments/lexers/sgf.py,sha256=w6C513ENaO2YCnqrduK7k03NaMDf-pgygvfzq2NaSRk,1985
+pygments/lexers/shell.py,sha256=dCS1zwkf5KwTog4__MnMC7h3Xmwv4_d3fnEV29tSwXI,36381
+pygments/lexers/sieve.py,sha256=eob-L84yf2jmhdNyYZUlbUJozdcd6GXcHW68lmAe8WE,2514
+pygments/lexers/slash.py,sha256=I-cRepmaxhL1SgYvD1hHX3gNBFI8NPszdU7hn1o5JlA,8484
+pygments/lexers/smalltalk.py,sha256=ue2PmqDK2sw0j75WdseiiENJBdZ1OwysH2Op1QN1r24,7204
+pygments/lexers/smithy.py,sha256=VREWoeuz7ANap_Uiopn7rs0Tnsfc-xBisDJKRGQY_y8,2659
+pygments/lexers/smv.py,sha256=He_VBSMbWONMWZmkrB5RYR0cfHVnMyKIXz68IFYl-a8,2805
+pygments/lexers/snobol.py,sha256=qDzb41xQQWMNmjB2MtZs23pFoFgZ2gbRZhK_Ir03r7I,2778
+pygments/lexers/solidity.py,sha256=Tixfnwku4Yezj6nNm8xVaw7EdV1qgAgdwahdTFP0St8,3163
+pygments/lexers/soong.py,sha256=Vm18vV4g6T8UPgjjY2yTRlSXGDpZowmuqQUBFfm4A9A,2339
+pygments/lexers/sophia.py,sha256=2YtYIT8iwAoW0B7TZuuoG_ZILhJV-2A7oBGat-98naE,3376
+pygments/lexers/special.py,sha256=8JuR2Vex8X-RWnC36S0HXTHWp2qmZclc90-TrLUWyaY,3585
+pygments/lexers/spice.py,sha256=m4nK0q4Sq_OFQez7kGWfki0No4ZV24YrONfHVj1Piqs,2790
+pygments/lexers/sql.py,sha256=2QvawM04xY96nvWadmHgHPDhOFbHGaFAQ_01rbNX_mc,48919
+pygments/lexers/srcinfo.py,sha256=B8vDs-sJogG3mWa5Hp_7JfHHUMyYRwGvKv6cKbFQXLM,1746
+pygments/lexers/stata.py,sha256=Zr9BC52D5O_3BbdW0N-tzoUmy0NTguL2sC-saXRVM-c,6415
+pygments/lexers/supercollider.py,sha256=_H5wDrn0DiGnlhB_cz6Rt_lo2TvqjSm0o6NPTd9R4Ko,3697
+pygments/lexers/tablegen.py,sha256=1JjedXYY18BNiY9JtNGLOtGfiwduNDZpQLBGTeQ6jAw,3987
+pygments/lexers/tact.py,sha256=X_lsxjFUMaC1TmYysXJq9tmAGifRnil83Bt1zA86Xdo,10809
+pygments/lexers/tal.py,sha256=xS9PlaWQOPj8MVr56fUNq31vUQKRWoLTlyWj9ZHm8AM,2904
+pygments/lexers/tcl.py,sha256=lK97ju4nikkt-oGOzIeyFEM98yq4dZSI8uEmYsq0R6c,5512
+pygments/lexers/teal.py,sha256=t3dqy_Arwv8_yExbX_xiFxv1TqJLPv4vh1MVKjKwS4Y,3522
+pygments/lexers/templates.py,sha256=BVdjYeoacIUuFyHTG39j4PxeNCe5E1oUURjH1rITrI4,75731
+pygments/lexers/teraterm.py,sha256=ciwztagW5Drg2gr17Qykrh6GwMsKy7e4xdQshX95GyQ,9718
+pygments/lexers/testing.py,sha256=YZgDgUEaLEYKSKEqpDsUi3Bn-Db_D42IlyiSsr1oX8U,10810
+pygments/lexers/text.py,sha256=nOCQPssIlKdVWU3PKxZiBPkf_KFM2V48IOssSyqhFY8,1068
+pygments/lexers/textedit.py,sha256=ttT4Ph-hIdgFLG6maRy_GskkziTFK0Wcg28yU0s6lek,7760
+pygments/lexers/textfmts.py,sha256=mi9KLEq4mrzDJbEc8G3VM-mSki_Tylkzodu47yH6z84,15524
+pygments/lexers/theorem.py,sha256=51ppBAEdhJmwU_lC916zMyjEoKLXqf89VAE_Lr0PNCc,17855
+pygments/lexers/thingsdb.py,sha256=x_fHNkLA-hIJyeIs6rg_X8n5OLYvFqaSu1FhI3apI5Y,6017
+pygments/lexers/tlb.py,sha256=ue2gqm45BI512lM13O8skAky9zAb7pLMrxZ8pbt5zRU,1450
+pygments/lexers/tls.py,sha256=_uQUVuMRDOhN-XUyGR5DIlVCk1CUZ1fIOSN4_WQYPKk,1540
+pygments/lexers/tnt.py,sha256=pK4LgoKON7u1xF66JYFncAPSbD8DZaeI_WTZ9HqEFlY,10456
+pygments/lexers/trafficscript.py,sha256=X3B8kgxS54ecuok9ic6Hkp-UMn5DvOmCK0p70Tz27Cw,1506
+pygments/lexers/typoscript.py,sha256=mBuePiVZUoAORPKsHwrx6fBWiy3fAIqG-2O67QmMiFI,8332
+pygments/lexers/typst.py,sha256=zIJBEhUXtWp5OiyAmvFA5m8d1EQG-ocwrJ677dvTUAk,7167
+pygments/lexers/ul4.py,sha256=rCaw0J9j3cdql9lX_HTilg65k9-9S118zOA6TAYfxaM,10499
+pygments/lexers/unicon.py,sha256=RAqoCnAAJBYOAGdR8ng0g6FtB39bGemLRlIqv5mcg9E,18625
+pygments/lexers/urbi.py,sha256=ajNP70NJg32jNnFDZsLvr_-4TToSGqRGkFyAPIJLfCU,6082
+pygments/lexers/usd.py,sha256=2eEGouolodYS402P_gtBrn4lLzpg1z8uHwPCKqjUb_k,3304
+pygments/lexers/varnish.py,sha256=dSh0Ku9SrjmlB29Fi_mWdWavN7M0cMKeepR4a34sOyI,7473
+pygments/lexers/verification.py,sha256=Qu433Q_h3EK3uS4bJoLRFZK0kIVwzX5AFKsa4Z-qnxA,3934
+pygments/lexers/verifpal.py,sha256=buyOOzCo_dGnoC40h0tthylHVVpgDt8qXu4olLvYy_4,2661
+pygments/lexers/vip.py,sha256=2lEV4cLV9p4E37wctBL7zkZ4ZU4p3HVsiLJFzB1bie0,5711
+pygments/lexers/vyper.py,sha256=Zq6sQIUBk6mBdpgOVgu3A6swGoBne0kDlRyjZznm2BY,5615
+pygments/lexers/web.py,sha256=4W9a7vcskrGJnxt4KmoE3SZydWB1qLq7lP2XS85J_m8,913
+pygments/lexers/webassembly.py,sha256=zgcMouzLawcbeFr6w_SOvGoUR68ZtqnnsbOcWEVleLk,5698
+pygments/lexers/webidl.py,sha256=ODtVmw4gVzI8HQWxuEckP6KMwm8WP2G2lSZEjagDXts,10516
+pygments/lexers/webmisc.py,sha256=-_-INDVdk47e2jlj-9bFcuLtntqVorBqIjlnwPfZFdI,40564
+pygments/lexers/wgsl.py,sha256=9igd9dzixGIgNewruv9mPnFms-c9BahkZcCCrZygv84,11880
+pygments/lexers/whiley.py,sha256=lMr750lA4MZsB4xqzVsIRtVMJIC3_dArhFYTHvOPwvA,4017
+pygments/lexers/wowtoc.py,sha256=8xxvf0xGeYtf4PE7KtkHZ_ly9xY_XXHrpCitdKE42Ro,4076
+pygments/lexers/wren.py,sha256=goGXnAMKKa13LLL40ybT3aMGPrk3gCRwZQFYAkKB_w0,3229
+pygments/lexers/x10.py,sha256=Q-AmgdF2E-N7mtOPpZ07CsxrTVnikyqC4uRRv6H75sk,1943
+pygments/lexers/xorg.py,sha256=9ttrBd3_Y2nXANsqtMposSgblYmMYqWXQ-Iz5RH9RsU,925
+pygments/lexers/yang.py,sha256=13CWbSaNr9giOHz4o0SXSklh0bfWt0ah14jJGpTvcn0,4499
+pygments/lexers/yara.py,sha256=jUSv78KTDfguCoAoAZKbYzQERkkyxBBWv5dInVrkDxo,2427
+pygments/lexers/zig.py,sha256=f-80MVOSp1KnczAMokQLVM-_wAEOD16EcGFnaCNlsN0,3976
+pygments/modeline.py,sha256=K5eSkR8GS1r5OkXXTHOcV0aM_6xpk9eWNEIAW-OOJ2g,1005
+pygments/plugin.py,sha256=tPx0rJCTIZ9ioRgLNYG4pifCbAwTRUZddvLw-NfAk2w,1891
+pygments/regexopt.py,sha256=wXaP9Gjp_hKAdnICqoDkRxAOQJSc4v3X6mcxx3z-TNs,3072
+pygments/scanner.py,sha256=nNcETRR1tRuiTaHmHSTTECVYFPcLf6mDZu1e4u91A9E,3092
+pygments/sphinxext.py,sha256=VEe_oHNgLoEGMHc2ROfbee2mF2PPREFyE6_m_JN5FvQ,7898
+pygments/style.py,sha256=Cpw9dCAyW3_JAwFRXOJXmtKb5ZwO2_5KSmlq6q4fZw4,6408
+pygments/styles/__init__.py,sha256=f9KCQXN4uKbe8aI8-L3qTC-_XPfT563FwTg6VTGVfwI,2006
+pygments/styles/__pycache__/__init__.cpython-312.pyc,,
+pygments/styles/__pycache__/_mapping.cpython-312.pyc,,
+pygments/styles/__pycache__/abap.cpython-312.pyc,,
+pygments/styles/__pycache__/algol.cpython-312.pyc,,
+pygments/styles/__pycache__/algol_nu.cpython-312.pyc,,
+pygments/styles/__pycache__/arduino.cpython-312.pyc,,
+pygments/styles/__pycache__/autumn.cpython-312.pyc,,
+pygments/styles/__pycache__/borland.cpython-312.pyc,,
+pygments/styles/__pycache__/bw.cpython-312.pyc,,
+pygments/styles/__pycache__/coffee.cpython-312.pyc,,
+pygments/styles/__pycache__/colorful.cpython-312.pyc,,
+pygments/styles/__pycache__/default.cpython-312.pyc,,
+pygments/styles/__pycache__/dracula.cpython-312.pyc,,
+pygments/styles/__pycache__/emacs.cpython-312.pyc,,
+pygments/styles/__pycache__/friendly.cpython-312.pyc,,
+pygments/styles/__pycache__/friendly_grayscale.cpython-312.pyc,,
+pygments/styles/__pycache__/fruity.cpython-312.pyc,,
+pygments/styles/__pycache__/gh_dark.cpython-312.pyc,,
+pygments/styles/__pycache__/gruvbox.cpython-312.pyc,,
+pygments/styles/__pycache__/igor.cpython-312.pyc,,
+pygments/styles/__pycache__/inkpot.cpython-312.pyc,,
+pygments/styles/__pycache__/lightbulb.cpython-312.pyc,,
+pygments/styles/__pycache__/lilypond.cpython-312.pyc,,
+pygments/styles/__pycache__/lovelace.cpython-312.pyc,,
+pygments/styles/__pycache__/manni.cpython-312.pyc,,
+pygments/styles/__pycache__/material.cpython-312.pyc,,
+pygments/styles/__pycache__/monokai.cpython-312.pyc,,
+pygments/styles/__pycache__/murphy.cpython-312.pyc,,
+pygments/styles/__pycache__/native.cpython-312.pyc,,
+pygments/styles/__pycache__/nord.cpython-312.pyc,,
+pygments/styles/__pycache__/onedark.cpython-312.pyc,,
+pygments/styles/__pycache__/paraiso_dark.cpython-312.pyc,,
+pygments/styles/__pycache__/paraiso_light.cpython-312.pyc,,
+pygments/styles/__pycache__/pastie.cpython-312.pyc,,
+pygments/styles/__pycache__/perldoc.cpython-312.pyc,,
+pygments/styles/__pycache__/rainbow_dash.cpython-312.pyc,,
+pygments/styles/__pycache__/rrt.cpython-312.pyc,,
+pygments/styles/__pycache__/sas.cpython-312.pyc,,
+pygments/styles/__pycache__/solarized.cpython-312.pyc,,
+pygments/styles/__pycache__/staroffice.cpython-312.pyc,,
+pygments/styles/__pycache__/stata_dark.cpython-312.pyc,,
+pygments/styles/__pycache__/stata_light.cpython-312.pyc,,
+pygments/styles/__pycache__/tango.cpython-312.pyc,,
+pygments/styles/__pycache__/trac.cpython-312.pyc,,
+pygments/styles/__pycache__/vim.cpython-312.pyc,,
+pygments/styles/__pycache__/vs.cpython-312.pyc,,
+pygments/styles/__pycache__/xcode.cpython-312.pyc,,
+pygments/styles/__pycache__/zenburn.cpython-312.pyc,,
+pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
+pygments/styles/abap.py,sha256=64Uwr8uPdEdcT-tE-Y2VveTXfH3SkqH9qdMgY49YHQI,749
+pygments/styles/algol.py,sha256=fCuk8ITTehvbJSufiaKlgnFsKbl-xFxxR82xhltc-cQ,2262
+pygments/styles/algol_nu.py,sha256=Gv9WfHJvYegGcUk1zcufQgsdXPNjCUNk8sAHyrSGGh4,2283
+pygments/styles/arduino.py,sha256=NoUB8xk7M1HGPoLfuySOLU0sVwoTuLcZqllXl2EO_iE,4557
+pygments/styles/autumn.py,sha256=fLLfjHXjxCl6crBAxEsBLH372ALMkFacA2bG6KFbJi4,2195
+pygments/styles/borland.py,sha256=_0ySKp4KGCSgtYjPe8uzD6gQhlmAIR4T43i-FoRYNOM,1611
+pygments/styles/bw.py,sha256=vhk8Xoj64fLPdA9IQU6mUVsYMel255jR-FDU7BjIHtI,1406
+pygments/styles/coffee.py,sha256=NqLt-fc7LONma1BGggbceVRY9uDE70WBuZXqK4zwaco,2308
+pygments/styles/colorful.py,sha256=mYcSbehtH7itH_QV9NqJp4Wna1X4lrwl2wkVXS2u-5A,2832
+pygments/styles/default.py,sha256=RTgG2zKWWUxPTDCFxhTnyZI_WZBIVgu5XsUpNvFisCA,2588
+pygments/styles/dracula.py,sha256=vRJmixBoSKV9o8NVQhXGViQqchhIYugfikLmvX0DoBw,2182
+pygments/styles/emacs.py,sha256=TiOG9oc83qToMCRMnJrXtWYqnzAqYycRz_50OoCKtxc,2535
+pygments/styles/friendly.py,sha256=oAi-l9anQTs9STDmUzXGDlOegatEOH4hpD0j6o6dZGM,2604
+pygments/styles/friendly_grayscale.py,sha256=a7Cqkzt6-uTiXvj6GoYBXzRvX5_zviCjjRB04Kf_-Q0,2828
+pygments/styles/fruity.py,sha256=GfSUTG0stlJr5Ow_saCaxbI2IB4-34Dp2TuRTpfUJBs,1324
+pygments/styles/gh_dark.py,sha256=ruNX3d4rf22rx-8HnwvGbNbXRQpXCNcHU1HNq6N4uNg,3590
+pygments/styles/gruvbox.py,sha256=KrFoHEoVnZW6XM9udyXncPomeGyZgIDsNWOH3kCrxFQ,3387
+pygments/styles/igor.py,sha256=fYYPhM0dRCvcDTMVrMVO5oFKnYm-8YVlsuVBoczFLtY,737
+pygments/styles/inkpot.py,sha256=jggSeX9NV15eOL2oJaVmZ6vmV7LWRzXJQRUqcWEqGRs,2404
+pygments/styles/lightbulb.py,sha256=Y8u1qdvlHfBqI2jJex55SkvVatVo_FjEUzE6h-X7m-0,3172
+pygments/styles/lilypond.py,sha256=Y6fp_sEL-zESmxAaMxzjtrKk90cuDC_DalNdC8wj0nw,2066
+pygments/styles/lovelace.py,sha256=cA9uhmbnzY04MccsiYSgMY7fvb4WMRbegWBUrGvXh1M,3178
+pygments/styles/manni.py,sha256=g9FyO7plTwfMm2cU4iiKgdlkMlvQLG6l2Lwkgz5ITS4,2443
+pygments/styles/material.py,sha256=LDmgomAbgtJDZhbv446_zIwgYh50UAqEEtgYNUns1rQ,4201
+pygments/styles/monokai.py,sha256=lrxTJpkBarV9gTLkBQryZ6oNSjekAVheJueKJP5iEYA,5184
+pygments/styles/murphy.py,sha256=-AKZiLkpiWej-otjHMsYCE-I-_IzCOLJY-_GBdKRZRw,2805
+pygments/styles/native.py,sha256=l6tezGSQTB8p_SyOXJ0PWI7KzCeEdtsPmVc4Yn4_CwU,2043
+pygments/styles/nord.py,sha256=GDt3WAaqaWsiCeqpIBPxd8TEUX708fGfwaA7S0w0oy0,5391
+pygments/styles/onedark.py,sha256=k80cZEppCEF-HLoxy_FEA0QmQDZze68nHVMNGyUVa28,1719
+pygments/styles/paraiso_dark.py,sha256=Jkrg4nUKIVNF8U4fPNV_Smq_g9NFbb9eiUrjYpVgQZg,5662
+pygments/styles/paraiso_light.py,sha256=MxN964ZEpze3wF0ss-igaa2I7E684MHe-Zq0rWPH3wo,5668
+pygments/styles/pastie.py,sha256=ZvAs9UpBNYFC-5PFrCRGYnm3FoPKb-eKR-ozbWZP-4g,2525
+pygments/styles/perldoc.py,sha256=HSxB93e4UpQkZspReQ34FeJbZ-59ksGvdaH-hToehi8,2230
+pygments/styles/rainbow_dash.py,sha256=4ugL18Or7aNtaLfPfCLFRiFy0Gu2RA4a9G2LQUE9SrM,2390
+pygments/styles/rrt.py,sha256=fgzfpC0PC_SCcLOMCNEIQTjPUMOncRe7SR10GfSRbXY,1006
+pygments/styles/sas.py,sha256=yzoXmbfQ2ND1WWq93b4vVGYkQSZHPqb4ymes9YYRT3w,1440
+pygments/styles/solarized.py,sha256=qupILFZn02WspnAF5SPYb-W8guo9xnUtjb1HeLw3XgE,4247
+pygments/styles/staroffice.py,sha256=CLbBeMoxay21Xyu3Af2p4xUXyG1_6ydCbvs5RJKYe5w,831
+pygments/styles/stata_dark.py,sha256=vX8SwHV__sG92F4CKribG08MJfSVq98dgs7gEA_n9yc,1257
+pygments/styles/stata_light.py,sha256=uV3GE-ylvffQ0yN3py1YAVqBB5wflIKZbceyK1Lqvrc,1289
+pygments/styles/tango.py,sha256=O2wcM4hHuU1Yt071M9CK7JPtiiSCqyxtT9tbiQICV28,7137
+pygments/styles/trac.py,sha256=9kMv1ZZyMKACWlx2fQVjRP0I2pgcRYCNrd7iGGZg9qk,1981
+pygments/styles/vim.py,sha256=J7_TqvrGkTX_XuTHW0In5wqPLAUPRWyr1122XueZWmM,2019
+pygments/styles/vs.py,sha256=s7YnzbIPuFU3LIke27mc4lAQSn2R3vbbHc1baMGSU_U,1130
+pygments/styles/xcode.py,sha256=PbQdzgGaA4a9LAU1i58alY9kM4IFlQX5jHQwOYmf_Rk,1504
+pygments/styles/zenburn.py,sha256=suZEKzBTCYdhf2cxNwcY7UATJK1tq5eYhGdBcXdf6MU,2203
+pygments/token.py,sha256=WbdWGhYm_Vosb0DDxW9lHNPgITXfWTsQmHt6cy9RbcM,6226
+pygments/unistring.py,sha256=al-_rBemRuGvinsrM6atNsHTmJ6DUbw24q2O2Ru1cBc,63208
+pygments/util.py,sha256=oRtSpiAo5jM9ulntkvVbgXUdiAW57jnuYGB7t9fYuhc,10031
diff --git a/.venv/Lib/site-packages/pygments-2.19.1.dist-info/WHEEL b/.venv/Lib/site-packages/pygments-2.19.1.dist-info/WHEEL
new file mode 100644 (file)
index 0000000..12228d4
--- /dev/null
@@ -0,0 +1,4 @@
+Wheel-Version: 1.0
+Generator: hatchling 1.27.0
+Root-Is-Purelib: true
+Tag: py3-none-any
diff --git a/.venv/Lib/site-packages/pygments-2.19.1.dist-info/entry_points.txt b/.venv/Lib/site-packages/pygments-2.19.1.dist-info/entry_points.txt
new file mode 100644 (file)
index 0000000..15498e3
--- /dev/null
@@ -0,0 +1,2 @@
+[console_scripts]
+pygmentize = pygments.cmdline:main
diff --git a/.venv/Lib/site-packages/pygments-2.19.1.dist-info/licenses/AUTHORS b/.venv/Lib/site-packages/pygments-2.19.1.dist-info/licenses/AUTHORS
new file mode 100644 (file)
index 0000000..811c66a
--- /dev/null
@@ -0,0 +1,291 @@
+Pygments is written and maintained by Georg Brandl <georg@python.org>.
+
+Major developers are Tim Hatch <tim@timhatch.com> and Armin Ronacher
+<armin.ronacher@active-4.com>.
+
+Other contributors, listed alphabetically, are:
+
+* Sam Aaron -- Ioke lexer
+* Jean Abou Samra -- LilyPond lexer
+* João Abecasis -- JSLT lexer
+* Ali Afshar -- image formatter
+* Thomas Aglassinger -- Easytrieve, JCL, Rexx, Transact-SQL and VBScript
+  lexers
+* Maxence Ahlouche -- PostgreSQL Explain lexer
+* Muthiah Annamalai -- Ezhil lexer
+* Nikolay Antipov -- OpenSCAD lexer
+* Kumar Appaiah -- Debian control lexer
+* Andreas Amann -- AppleScript lexer
+* Timothy Armstrong -- Dart lexer fixes
+* Jeffrey Arnold -- R/S, Rd, BUGS, Jags, and Stan lexers
+* Eiríkr Åsheim -- Uxntal lexer
+* Jeremy Ashkenas -- CoffeeScript lexer
+* José Joaquín Atria -- Praat lexer
+* Stefan Matthias Aust -- Smalltalk lexer
+* Lucas Bajolet -- Nit lexer
+* Ben Bangert -- Mako lexers
+* Max Battcher -- Darcs patch lexer
+* Thomas Baruchel -- APL lexer
+* Tim Baumann -- (Literate) Agda lexer
+* Paul Baumgart, 280 North, Inc. -- Objective-J lexer
+* Michael Bayer -- Myghty lexers
+* Thomas Beale -- Archetype lexers
+* John Benediktsson -- Factor lexer
+* David Benjamin, Google LLC -- TLS lexer
+* Trevor Bergeron -- mIRC formatter
+* Vincent Bernat -- LessCSS lexer
+* Christopher Bertels -- Fancy lexer
+* Sébastien Bigaret -- QVT Operational lexer
+* Jarrett Billingsley -- MiniD lexer
+* Adam Blinkinsop -- Haskell, Redcode lexers
+* Stéphane Blondon -- Procfile, SGF and Sieve lexers
+* Frits van Bommel -- assembler lexers
+* Pierre Bourdon -- bugfixes
+* Martijn Braam -- Kernel log lexer, BARE lexer
+* JD Browne, Google LLC -- GoogleSQL lexer
+* Matthias Bussonnier -- ANSI style handling for terminal-256 formatter
+* chebee7i -- Python traceback lexer improvements
+* Hiram Chirino -- Scaml and Jade lexers
+* Mauricio Caceres -- SAS and Stata lexers.
+* Michael Camilleri, John Gabriele, sogaiu -- Janet lexer
+* Daren Chandisingh -- Gleam lexer
+* Ian Cooper -- VGL lexer
+* David Corbett -- Inform, Jasmin, JSGF, Snowball, and TADS 3 lexers
+* Leaf Corcoran -- MoonScript lexer
+* Fraser Cormack -- TableGen lexer
+* Gabriel Corona -- ASN.1 lexer
+* Christopher Creutzig -- MuPAD lexer
+* Daniël W. Crompton -- Pike lexer
+* Pete Curry -- bugfixes
+* Bryan Davis -- EBNF lexer
+* Bruno Deferrari -- Shen lexer
+* Walter Dörwald -- UL4 lexer
+* Luke Drummond -- Meson lexer
+* Giedrius Dubinskas -- HTML formatter improvements
+* Owen Durni -- Haxe lexer
+* Alexander Dutton, Oxford University Computing Services -- SPARQL lexer
+* James Edwards -- Terraform lexer
+* Nick Efford -- Python 3 lexer
+* Sven Efftinge -- Xtend lexer
+* Artem Egorkine -- terminal256 formatter
+* Matthew Fernandez -- CAmkES lexer
+* Paweł Fertyk -- GDScript lexer, HTML formatter improvements
+* Michael Ficarra -- CPSA lexer
+* James H. Fisher -- PostScript lexer
+* Amanda Fitch, Google LLC -- GoogleSQL lexer
+* William S. Fulton -- SWIG lexer
+* Carlos Galdino -- Elixir and Elixir Console lexers
+* Michael Galloy -- IDL lexer
+* Naveen Garg -- Autohotkey lexer
+* Simon Garnotel -- FreeFem++ lexer
+* Laurent Gautier -- R/S lexer
+* Alex Gaynor -- PyPy log lexer
+* Richard Gerkin -- Igor Pro lexer
+* Alain Gilbert -- TypeScript lexer
+* Alex Gilding -- BlitzBasic lexer
+* GitHub, Inc -- DASM16, Augeas, TOML, and Slash lexers
+* Bertrand Goetzmann -- Groovy lexer
+* Krzysiek Goj -- Scala lexer
+* Rostyslav Golda -- FloScript lexer
+* Andrey Golovizin -- BibTeX lexers
+* Matt Good -- Genshi, Cheetah lexers
+* Michał Górny -- vim modeline support
+* Alex Gosse -- TrafficScript lexer
+* Patrick Gotthardt -- PHP namespaces support
+* Hubert Gruniaux -- C and C++ lexer improvements
+* Olivier Guibe -- Asymptote lexer
+* Phil Hagelberg -- Fennel lexer
+* Florian Hahn -- Boogie lexer
+* Martin Harriman -- SNOBOL lexer
+* Matthew Harrison -- SVG formatter
+* Steven Hazel -- Tcl lexer
+* Dan Michael Heggø -- Turtle lexer
+* Aslak Hellesøy -- Gherkin lexer
+* Greg Hendershott -- Racket lexer
+* Justin Hendrick -- ParaSail lexer
+* Jordi Gutiérrez Hermoso -- Octave lexer
+* David Hess, Fish Software, Inc. -- Objective-J lexer
+* Ken Hilton -- Typographic Number Theory and Arrow lexers
+* Varun Hiremath -- Debian control lexer
+* Rob Hoelz -- Perl 6 lexer
+* Doug Hogan -- Mscgen lexer
+* Ben Hollis -- Mason lexer
+* Max Horn -- GAP lexer
+* Fred Hornsey -- OMG IDL Lexer
+* Alastair Houghton -- Lexer inheritance facility
+* Tim Howard -- BlitzMax lexer
+* Dustin Howett -- Logos lexer
+* Ivan Inozemtsev -- Fantom lexer
+* Hiroaki Itoh -- Shell console rewrite, Lexers for PowerShell session,
+  MSDOS session, BC, WDiff
+* Brian R. Jackson -- Tea lexer
+* Christian Jann -- ShellSession lexer
+* Jonas Camillus Jeppesen -- Line numbers and line highlighting for 
+  RTF-formatter
+* Dennis Kaarsemaker -- sources.list lexer
+* Dmitri Kabak -- Inferno Limbo lexer
+* Igor Kalnitsky -- vhdl lexer
+* Colin Kennedy - USD lexer
+* Alexander Kit -- MaskJS lexer
+* Pekka Klärck -- Robot Framework lexer
+* Gerwin Klein -- Isabelle lexer
+* Eric Knibbe -- Lasso lexer
+* Stepan Koltsov -- Clay lexer
+* Oliver Kopp - Friendly grayscale style
+* Adam Koprowski -- Opa lexer
+* Benjamin Kowarsch -- Modula-2 lexer
+* Domen Kožar -- Nix lexer
+* Oleh Krekel -- Emacs Lisp lexer
+* Alexander Kriegisch -- Kconfig and AspectJ lexers
+* Marek Kubica -- Scheme lexer
+* Jochen Kupperschmidt -- Markdown processor
+* Gerd Kurzbach -- Modelica lexer
+* Jon Larimer, Google Inc. -- Smali lexer
+* Olov Lassus -- Dart lexer
+* Matt Layman -- TAP lexer
+* Dan Lazin, Google LLC -- GoogleSQL lexer
+* Kristian Lyngstøl -- Varnish lexers
+* Sylvestre Ledru -- Scilab lexer
+* Chee Sing Lee -- Flatline lexer
+* Mark Lee -- Vala lexer
+* Thomas Linder Puls -- Visual Prolog lexer
+* Pete Lomax -- Phix lexer
+* Valentin Lorentz -- C++ lexer improvements
+* Ben Mabey -- Gherkin lexer
+* Angus MacArthur -- QML lexer
+* Louis Mandel -- X10 lexer
+* Louis Marchand -- Eiffel lexer
+* Simone Margaritelli -- Hybris lexer
+* Tim Martin - World of Warcraft TOC lexer
+* Kirk McDonald -- D lexer
+* Gordon McGregor -- SystemVerilog lexer
+* Stephen McKamey -- Duel/JBST lexer
+* Brian McKenna -- F# lexer
+* Charles McLaughlin -- Puppet lexer
+* Kurt McKee -- Tera Term macro lexer, PostgreSQL updates, MySQL overhaul, JSON lexer
+* Joe Eli McIlvain -- Savi lexer
+* Lukas Meuser -- BBCode formatter, Lua lexer
+* Cat Miller -- Pig lexer
+* Paul Miller -- LiveScript lexer
+* Hong Minhee -- HTTP lexer
+* Michael Mior -- Awk lexer
+* Bruce Mitchener -- Dylan lexer rewrite
+* Reuben Morais -- SourcePawn lexer
+* Jon Morton -- Rust lexer
+* Paulo Moura -- Logtalk lexer
+* Mher Movsisyan -- DTD lexer
+* Dejan Muhamedagic -- Crmsh lexer
+* Adrien Nayrat -- PostgreSQL Explain lexer
+* Ana Nelson -- Ragel, ANTLR, R console lexers
+* David Neto, Google LLC -- WebGPU Shading Language lexer
+* Kurt Neufeld -- Markdown lexer
+* Nam T. Nguyen -- Monokai style
+* Jesper Noehr -- HTML formatter "anchorlinenos"
+* Mike Nolta -- Julia lexer
+* Avery Nortonsmith -- Pointless lexer
+* Jonas Obrist -- BBCode lexer
+* Edward O'Callaghan -- Cryptol lexer
+* David Oliva -- Rebol lexer
+* Pat Pannuto -- nesC lexer
+* Jon Parise -- Protocol buffers and Thrift lexers
+* Benjamin Peterson -- Test suite refactoring
+* Ronny Pfannschmidt -- BBCode lexer
+* Dominik Picheta -- Nimrod lexer
+* Andrew Pinkham -- RTF Formatter Refactoring
+* Clément Prévost -- UrbiScript lexer
+* Tanner Prynn -- cmdline -x option and loading lexers from files
+* Oleh Prypin -- Crystal lexer (based on Ruby lexer)
+* Nick Psaris -- K and Q lexers
+* Xidorn Quan -- Web IDL lexer
+* Elias Rabel -- Fortran fixed form lexer
+* raichoo -- Idris lexer
+* Daniel Ramirez -- GDScript lexer
+* Kashif Rasul -- CUDA lexer
+* Nathan Reed -- HLSL lexer
+* Justin Reidy -- MXML lexer
+* Jonathon Reinhart, Google LLC -- Soong lexer
+* Norman Richards -- JSON lexer
+* Corey Richardson -- Rust lexer updates
+* Fabrizio Riguzzi -- cplint leder
+* Lubomir Rintel -- GoodData MAQL and CL lexers
+* Andre Roberge -- Tango style
+* Georg Rollinger -- HSAIL lexer
+* Michiel Roos -- TypoScript lexer
+* Konrad Rudolph -- LaTeX formatter enhancements
+* Mario Ruggier -- Evoque lexers
+* Miikka Salminen -- Lovelace style, Hexdump lexer, lexer enhancements
+* Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers
+* Matteo Sasso -- Common Lisp lexer
+* Joe Schafer -- Ada lexer
+* Max Schillinger -- TiddlyWiki5 lexer
+* Andrew Schmidt -- X++ lexer
+* Ken Schutte -- Matlab lexers
+* René Schwaiger -- Rainbow Dash style
+* Sebastian Schweizer -- Whiley lexer
+* Tassilo Schweyer -- Io, MOOCode lexers
+* Pablo Seminario -- PromQL lexer
+* Ted Shaw -- AutoIt lexer
+* Joerg Sieker -- ABAP lexer
+* Robert Simmons -- Standard ML lexer
+* Kirill Simonov -- YAML lexer
+* Corbin Simpson -- Monte lexer
+* Ville Skyttä -- ASCII armored lexer
+* Alexander Smishlajev -- Visual FoxPro lexer
+* Steve Spigarelli -- XQuery lexer
+* Jerome St-Louis -- eC lexer
+* Camil Staps -- Clean and NuSMV lexers; Solarized style
+* James Strachan -- Kotlin lexer
+* Tom Stuart -- Treetop lexer
+* Colin Sullivan -- SuperCollider lexer
+* Ben Swift -- Extempore lexer
+* tatt61880 -- Kuin lexer
+* Edoardo Tenani -- Arduino lexer
+* Tiberius Teng -- default style overhaul
+* Jeremy Thurgood -- Erlang, Squid config lexers
+* Brian Tiffin -- OpenCOBOL lexer
+* Bob Tolbert -- Hy lexer
+* Doug Torrance -- Macaulay2 lexer
+* Matthias Trute -- Forth lexer
+* Tuoa Spi T4 -- Bdd lexer
+* Erick Tryzelaar -- Felix lexer
+* Alexander Udalov -- Kotlin lexer improvements
+* Thomas Van Doren -- Chapel lexer
+* Dave Van Ee -- Uxntal lexer updates
+* Daniele Varrazzo -- PostgreSQL lexers
+* Abe Voelker -- OpenEdge ABL lexer
+* Pepijn de Vos -- HTML formatter CTags support
+* Matthias Vallentin -- Bro lexer
+* Benoît Vinot -- AMPL lexer
+* Linh Vu Hong -- RSL lexer
+* Taavi Väänänen -- Debian control lexer
+* Immanuel Washington -- Smithy lexer
+* Nathan Weizenbaum -- Haml and Sass lexers
+* Nathan Whetsell -- Csound lexers
+* Dietmar Winkler -- Modelica lexer
+* Nils Winter -- Smalltalk lexer
+* Davy Wybiral -- Clojure lexer
+* Whitney Young -- ObjectiveC lexer
+* Diego Zamboni -- CFengine3 lexer
+* Enrique Zamudio -- Ceylon lexer
+* Alex Zimin -- Nemerle lexer
+* Rob Zimmerman -- Kal lexer
+* Evgenii Zheltonozhskii -- Maple lexer
+* Vincent Zurczak -- Roboconf lexer
+* Hubert Gruniaux -- C and C++ lexer improvements
+* Thomas Symalla -- AMDGPU Lexer
+* 15b3 -- Image Formatter improvements
+* Fabian Neumann -- CDDL lexer
+* Thomas Duboucher -- CDDL lexer
+* Philipp Imhof -- Pango Markup formatter
+* Thomas Voss -- Sed lexer
+* Martin Fischer -- WCAG contrast testing
+* Marc Auberer -- Spice lexer
+* Amr Hesham -- Carbon lexer
+* diskdance -- Wikitext lexer
+* vanillajonathan -- PRQL lexer
+* Nikolay Antipov -- OpenSCAD lexer
+* Markus Meyer, Nextron Systems -- YARA lexer
+* Hannes Römer -- Mojo lexer
+* Jan Frederik Schaefer -- PDDL lexer
+
+Many thanks for all contributions!
diff --git a/.venv/Lib/site-packages/pygments-2.19.1.dist-info/licenses/LICENSE b/.venv/Lib/site-packages/pygments-2.19.1.dist-info/licenses/LICENSE
new file mode 100644 (file)
index 0000000..446a1a8
--- /dev/null
@@ -0,0 +1,25 @@
+Copyright (c) 2006-2022 by the respective authors (see AUTHORS file).
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/.venv/Lib/site-packages/pygments/__init__.py b/.venv/Lib/site-packages/pygments/__init__.py
new file mode 100644 (file)
index 0000000..d33a156
--- /dev/null
@@ -0,0 +1,82 @@
+"""
+    Pygments
+    ~~~~~~~~
+
+    Pygments is a syntax highlighting package written in Python.
+
+    It is a generic syntax highlighter for general use in all kinds of software
+    such as forum systems, wikis or other applications that need to prettify
+    source code. Highlights are:
+
+    * a wide range of common languages and markup formats is supported
+    * special attention is paid to details, increasing quality by a fair amount
+    * support for new languages and formats are added easily
+    * a number of output formats, presently HTML, LaTeX, RTF, SVG, all image
+      formats that PIL supports, and ANSI sequences
+    * it is usable as a command-line tool and as a library
+    * ... and it highlights even Brainfuck!
+
+    The `Pygments master branch`_ is installable with ``easy_install Pygments==dev``.
+
+    .. _Pygments master branch:
+       https://github.com/pygments/pygments/archive/master.zip#egg=Pygments-dev
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+from io import StringIO, BytesIO
+
+__version__ = '2.19.1'
+__docformat__ = 'restructuredtext'
+
+__all__ = ['lex', 'format', 'highlight']
+
+
+def lex(code, lexer):
+    """
+    Lex `code` with the `lexer` (must be a `Lexer` instance)
+    and return an iterable of tokens. Currently, this only calls
+    `lexer.get_tokens()`.
+    """
+    try:
+        return lexer.get_tokens(code)
+    except TypeError:
+        # Heuristic to catch a common mistake.
+        from pygments.lexer import RegexLexer
+        if isinstance(lexer, type) and issubclass(lexer, RegexLexer):
+            raise TypeError('lex() argument must be a lexer instance, '
+                            'not a class')
+        raise
+
+
+def format(tokens, formatter, outfile=None):  # pylint: disable=redefined-builtin
+    """
+    Format ``tokens`` (an iterable of tokens) with the formatter ``formatter``
+    (a `Formatter` instance).
+
+    If ``outfile`` is given and a valid file object (an object with a
+    ``write`` method), the result will be written to it, otherwise it
+    is returned as a string.
+    """
+    try:
+        if not outfile:
+            realoutfile = getattr(formatter, 'encoding', None) and BytesIO() or StringIO()
+            formatter.format(tokens, realoutfile)
+            return realoutfile.getvalue()
+        else:
+            formatter.format(tokens, outfile)
+    except TypeError:
+        # Heuristic to catch a common mistake.
+        from pygments.formatter import Formatter
+        if isinstance(formatter, type) and issubclass(formatter, Formatter):
+            raise TypeError('format() argument must be a formatter instance, '
+                            'not a class')
+        raise
+
+
+def highlight(code, lexer, formatter, outfile=None):
+    """
+    This is the most high-level highlighting function. It combines `lex` and
+    `format` in one function.
+    """
+    return format(lex(code, lexer), formatter, outfile)
diff --git a/.venv/Lib/site-packages/pygments/__main__.py b/.venv/Lib/site-packages/pygments/__main__.py
new file mode 100644 (file)
index 0000000..4890a6c
--- /dev/null
@@ -0,0 +1,17 @@
+"""
+    pygments.__main__
+    ~~~~~~~~~~~~~~~~~
+
+    Main entry point for ``python -m pygments``.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import sys
+import pygments.cmdline
+
+try:
+    sys.exit(pygments.cmdline.main(sys.argv))
+except KeyboardInterrupt:
+    sys.exit(1)
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0a7301d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/__main__.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/__main__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2489b18
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/__main__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/cmdline.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/cmdline.cpython-312.pyc
new file mode 100644 (file)
index 0000000..aea8459
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/cmdline.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/console.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/console.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b1bcfd4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/console.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/filter.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/filter.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1aed678
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/filter.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/formatter.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/formatter.cpython-312.pyc
new file mode 100644 (file)
index 0000000..639ba96
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/formatter.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/lexer.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/lexer.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8075ecc
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/lexer.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/modeline.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/modeline.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f7ab818
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/modeline.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/plugin.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/plugin.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c932e38
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/plugin.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/regexopt.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/regexopt.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f6f5aa5
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/regexopt.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/scanner.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/scanner.cpython-312.pyc
new file mode 100644 (file)
index 0000000..432b27b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/scanner.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/sphinxext.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/sphinxext.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d41e2ad
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/sphinxext.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/style.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/style.cpython-312.pyc
new file mode 100644 (file)
index 0000000..355a729
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/style.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/token.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/token.cpython-312.pyc
new file mode 100644 (file)
index 0000000..24fb281
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/token.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/unistring.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/unistring.cpython-312.pyc
new file mode 100644 (file)
index 0000000..cf51b90
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/unistring.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/__pycache__/util.cpython-312.pyc b/.venv/Lib/site-packages/pygments/__pycache__/util.cpython-312.pyc
new file mode 100644 (file)
index 0000000..69b0c54
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/__pycache__/util.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/cmdline.py b/.venv/Lib/site-packages/pygments/cmdline.py
new file mode 100644 (file)
index 0000000..2878fd5
--- /dev/null
@@ -0,0 +1,668 @@
+"""
+    pygments.cmdline
+    ~~~~~~~~~~~~~~~~
+
+    Command line interface.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import os
+import sys
+import shutil
+import argparse
+from textwrap import dedent
+
+from pygments import __version__, highlight
+from pygments.util import ClassNotFound, OptionError, docstring_headline, \
+    guess_decode, guess_decode_from_terminal, terminal_encoding, \
+    UnclosingTextIOWrapper
+from pygments.lexers import get_all_lexers, get_lexer_by_name, guess_lexer, \
+    load_lexer_from_file, get_lexer_for_filename, find_lexer_class_for_filename
+from pygments.lexers.special import TextLexer
+from pygments.formatters.latex import LatexEmbeddedLexer, LatexFormatter
+from pygments.formatters import get_all_formatters, get_formatter_by_name, \
+    load_formatter_from_file, get_formatter_for_filename, find_formatter_class
+from pygments.formatters.terminal import TerminalFormatter
+from pygments.formatters.terminal256 import Terminal256Formatter, TerminalTrueColorFormatter
+from pygments.filters import get_all_filters, find_filter_class
+from pygments.styles import get_all_styles, get_style_by_name
+
+
+def _parse_options(o_strs):
+    opts = {}
+    if not o_strs:
+        return opts
+    for o_str in o_strs:
+        if not o_str.strip():
+            continue
+        o_args = o_str.split(',')
+        for o_arg in o_args:
+            o_arg = o_arg.strip()
+            try:
+                o_key, o_val = o_arg.split('=', 1)
+                o_key = o_key.strip()
+                o_val = o_val.strip()
+            except ValueError:
+                opts[o_arg] = True
+            else:
+                opts[o_key] = o_val
+    return opts
+
+
+def _parse_filters(f_strs):
+    filters = []
+    if not f_strs:
+        return filters
+    for f_str in f_strs:
+        if ':' in f_str:
+            fname, fopts = f_str.split(':', 1)
+            filters.append((fname, _parse_options([fopts])))
+        else:
+            filters.append((f_str, {}))
+    return filters
+
+
+def _print_help(what, name):
+    try:
+        if what == 'lexer':
+            cls = get_lexer_by_name(name)
+            print(f"Help on the {cls.name} lexer:")
+            print(dedent(cls.__doc__))
+        elif what == 'formatter':
+            cls = find_formatter_class(name)
+            print(f"Help on the {cls.name} formatter:")
+            print(dedent(cls.__doc__))
+        elif what == 'filter':
+            cls = find_filter_class(name)
+            print(f"Help on the {name} filter:")
+            print(dedent(cls.__doc__))
+        return 0
+    except (AttributeError, ValueError):
+        print(f"{what} not found!", file=sys.stderr)
+        return 1
+
+
+def _print_list(what):
+    if what == 'lexer':
+        print()
+        print("Lexers:")
+        print("~~~~~~~")
+
+        info = []
+        for fullname, names, exts, _ in get_all_lexers():
+            tup = (', '.join(names)+':', fullname,
+                   exts and '(filenames ' + ', '.join(exts) + ')' or '')
+            info.append(tup)
+        info.sort()
+        for i in info:
+            print(('* {}\n    {} {}').format(*i))
+
+    elif what == 'formatter':
+        print()
+        print("Formatters:")
+        print("~~~~~~~~~~~")
+
+        info = []
+        for cls in get_all_formatters():
+            doc = docstring_headline(cls)
+            tup = (', '.join(cls.aliases) + ':', doc, cls.filenames and
+                   '(filenames ' + ', '.join(cls.filenames) + ')' or '')
+            info.append(tup)
+        info.sort()
+        for i in info:
+            print(('* {}\n    {} {}').format(*i))
+
+    elif what == 'filter':
+        print()
+        print("Filters:")
+        print("~~~~~~~~")
+
+        for name in get_all_filters():
+            cls = find_filter_class(name)
+            print("* " + name + ':')
+            print(f"    {docstring_headline(cls)}")
+
+    elif what == 'style':
+        print()
+        print("Styles:")
+        print("~~~~~~~")
+
+        for name in get_all_styles():
+            cls = get_style_by_name(name)
+            print("* " + name + ':')
+            print(f"    {docstring_headline(cls)}")
+
+
+def _print_list_as_json(requested_items):
+    import json
+    result = {}
+    if 'lexer' in requested_items:
+        info = {}
+        for fullname, names, filenames, mimetypes in get_all_lexers():
+            info[fullname] = {
+                'aliases': names,
+                'filenames': filenames,
+                'mimetypes': mimetypes
+            }
+        result['lexers'] = info
+
+    if 'formatter' in requested_items:
+        info = {}
+        for cls in get_all_formatters():
+            doc = docstring_headline(cls)
+            info[cls.name] = {
+                'aliases': cls.aliases,
+                'filenames': cls.filenames,
+                'doc': doc
+            }
+        result['formatters'] = info
+
+    if 'filter' in requested_items:
+        info = {}
+        for name in get_all_filters():
+            cls = find_filter_class(name)
+            info[name] = {
+                'doc': docstring_headline(cls)
+            }
+        result['filters'] = info
+
+    if 'style' in requested_items:
+        info = {}
+        for name in get_all_styles():
+            cls = get_style_by_name(name)
+            info[name] = {
+                'doc': docstring_headline(cls)
+            }
+        result['styles'] = info
+
+    json.dump(result, sys.stdout)
+
+def main_inner(parser, argns):
+    if argns.help:
+        parser.print_help()
+        return 0
+
+    if argns.V:
+        print(f'Pygments version {__version__}, (c) 2006-2024 by Georg Brandl, Matthäus '
+              'Chajdas and contributors.')
+        return 0
+
+    def is_only_option(opt):
+        return not any(v for (k, v) in vars(argns).items() if k != opt)
+
+    # handle ``pygmentize -L``
+    if argns.L is not None:
+        arg_set = set()
+        for k, v in vars(argns).items():
+            if v:
+                arg_set.add(k)
+
+        arg_set.discard('L')
+        arg_set.discard('json')
+
+        if arg_set:
+            parser.print_help(sys.stderr)
+            return 2
+
+        # print version
+        if not argns.json:
+            main(['', '-V'])
+        allowed_types = {'lexer', 'formatter', 'filter', 'style'}
+        largs = [arg.rstrip('s') for arg in argns.L]
+        if any(arg not in allowed_types for arg in largs):
+            parser.print_help(sys.stderr)
+            return 0
+        if not largs:
+            largs = allowed_types
+        if not argns.json:
+            for arg in largs:
+                _print_list(arg)
+        else:
+            _print_list_as_json(largs)
+        return 0
+
+    # handle ``pygmentize -H``
+    if argns.H:
+        if not is_only_option('H'):
+            parser.print_help(sys.stderr)
+            return 2
+        what, name = argns.H
+        if what not in ('lexer', 'formatter', 'filter'):
+            parser.print_help(sys.stderr)
+            return 2
+        return _print_help(what, name)
+
+    # parse -O options
+    parsed_opts = _parse_options(argns.O or [])
+
+    # parse -P options
+    for p_opt in argns.P or []:
+        try:
+            name, value = p_opt.split('=', 1)
+        except ValueError:
+            parsed_opts[p_opt] = True
+        else:
+            parsed_opts[name] = value
+
+    # encodings
+    inencoding = parsed_opts.get('inencoding', parsed_opts.get('encoding'))
+    outencoding = parsed_opts.get('outencoding', parsed_opts.get('encoding'))
+
+    # handle ``pygmentize -N``
+    if argns.N:
+        lexer = find_lexer_class_for_filename(argns.N)
+        if lexer is None:
+            lexer = TextLexer
+
+        print(lexer.aliases[0])
+        return 0
+
+    # handle ``pygmentize -C``
+    if argns.C:
+        inp = sys.stdin.buffer.read()
+        try:
+            lexer = guess_lexer(inp, inencoding=inencoding)
+        except ClassNotFound:
+            lexer = TextLexer
+
+        print(lexer.aliases[0])
+        return 0
+
+    # handle ``pygmentize -S``
+    S_opt = argns.S
+    a_opt = argns.a
+    if S_opt is not None:
+        f_opt = argns.f
+        if not f_opt:
+            parser.print_help(sys.stderr)
+            return 2
+        if argns.l or argns.INPUTFILE:
+            parser.print_help(sys.stderr)
+            return 2
+
+        try:
+            parsed_opts['style'] = S_opt
+            fmter = get_formatter_by_name(f_opt, **parsed_opts)
+        except ClassNotFound as err:
+            print(err, file=sys.stderr)
+            return 1
+
+        print(fmter.get_style_defs(a_opt or ''))
+        return 0
+
+    # if no -S is given, -a is not allowed
+    if argns.a is not None:
+        parser.print_help(sys.stderr)
+        return 2
+
+    # parse -F options
+    F_opts = _parse_filters(argns.F or [])
+
+    # -x: allow custom (eXternal) lexers and formatters
+    allow_custom_lexer_formatter = bool(argns.x)
+
+    # select lexer
+    lexer = None
+
+    # given by name?
+    lexername = argns.l
+    if lexername:
+        # custom lexer, located relative to user's cwd
+        if allow_custom_lexer_formatter and '.py' in lexername:
+            try:
+                filename = None
+                name = None
+                if ':' in lexername:
+                    filename, name = lexername.rsplit(':', 1)
+
+                    if '.py' in name:
+                        # This can happen on Windows: If the lexername is
+                        # C:\lexer.py -- return to normal load path in that case
+                        name = None
+
+                if filename and name:
+                    lexer = load_lexer_from_file(filename, name,
+                                                 **parsed_opts)
+                else:
+                    lexer = load_lexer_from_file(lexername, **parsed_opts)
+            except ClassNotFound as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+        else:
+            try:
+                lexer = get_lexer_by_name(lexername, **parsed_opts)
+            except (OptionError, ClassNotFound) as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+
+    # read input code
+    code = None
+
+    if argns.INPUTFILE:
+        if argns.s:
+            print('Error: -s option not usable when input file specified',
+                  file=sys.stderr)
+            return 2
+
+        infn = argns.INPUTFILE
+        try:
+            with open(infn, 'rb') as infp:
+                code = infp.read()
+        except Exception as err:
+            print('Error: cannot read infile:', err, file=sys.stderr)
+            return 1
+        if not inencoding:
+            code, inencoding = guess_decode(code)
+
+        # do we have to guess the lexer?
+        if not lexer:
+            try:
+                lexer = get_lexer_for_filename(infn, code, **parsed_opts)
+            except ClassNotFound as err:
+                if argns.g:
+                    try:
+                        lexer = guess_lexer(code, **parsed_opts)
+                    except ClassNotFound:
+                        lexer = TextLexer(**parsed_opts)
+                else:
+                    print('Error:', err, file=sys.stderr)
+                    return 1
+            except OptionError as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+
+    elif not argns.s:  # treat stdin as full file (-s support is later)
+        # read code from terminal, always in binary mode since we want to
+        # decode ourselves and be tolerant with it
+        code = sys.stdin.buffer.read()  # use .buffer to get a binary stream
+        if not inencoding:
+            code, inencoding = guess_decode_from_terminal(code, sys.stdin)
+            # else the lexer will do the decoding
+        if not lexer:
+            try:
+                lexer = guess_lexer(code, **parsed_opts)
+            except ClassNotFound:
+                lexer = TextLexer(**parsed_opts)
+
+    else:  # -s option needs a lexer with -l
+        if not lexer:
+            print('Error: when using -s a lexer has to be selected with -l',
+                  file=sys.stderr)
+            return 2
+
+    # process filters
+    for fname, fopts in F_opts:
+        try:
+            lexer.add_filter(fname, **fopts)
+        except ClassNotFound as err:
+            print('Error:', err, file=sys.stderr)
+            return 1
+
+    # select formatter
+    outfn = argns.o
+    fmter = argns.f
+    if fmter:
+        # custom formatter, located relative to user's cwd
+        if allow_custom_lexer_formatter and '.py' in fmter:
+            try:
+                filename = None
+                name = None
+                if ':' in fmter:
+                    # Same logic as above for custom lexer
+                    filename, name = fmter.rsplit(':', 1)
+
+                    if '.py' in name:
+                        name = None
+
+                if filename and name:
+                    fmter = load_formatter_from_file(filename, name,
+                                                     **parsed_opts)
+                else:
+                    fmter = load_formatter_from_file(fmter, **parsed_opts)
+            except ClassNotFound as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+        else:
+            try:
+                fmter = get_formatter_by_name(fmter, **parsed_opts)
+            except (OptionError, ClassNotFound) as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+
+    if outfn:
+        if not fmter:
+            try:
+                fmter = get_formatter_for_filename(outfn, **parsed_opts)
+            except (OptionError, ClassNotFound) as err:
+                print('Error:', err, file=sys.stderr)
+                return 1
+        try:
+            outfile = open(outfn, 'wb')
+        except Exception as err:
+            print('Error: cannot open outfile:', err, file=sys.stderr)
+            return 1
+    else:
+        if not fmter:
+            if os.environ.get('COLORTERM','') in ('truecolor', '24bit'):
+                fmter = TerminalTrueColorFormatter(**parsed_opts)
+            elif '256' in os.environ.get('TERM', ''):
+                fmter = Terminal256Formatter(**parsed_opts)
+            else:
+                fmter = TerminalFormatter(**parsed_opts)
+        outfile = sys.stdout.buffer
+
+    # determine output encoding if not explicitly selected
+    if not outencoding:
+        if outfn:
+            # output file? use lexer encoding for now (can still be None)
+            fmter.encoding = inencoding
+        else:
+            # else use terminal encoding
+            fmter.encoding = terminal_encoding(sys.stdout)
+
+    # provide coloring under Windows, if possible
+    if not outfn and sys.platform in ('win32', 'cygwin') and \
+       fmter.name in ('Terminal', 'Terminal256'):  # pragma: no cover
+        # unfortunately colorama doesn't support binary streams on Py3
+        outfile = UnclosingTextIOWrapper(outfile, encoding=fmter.encoding)
+        fmter.encoding = None
+        try:
+            import colorama.initialise
+        except ImportError:
+            pass
+        else:
+            outfile = colorama.initialise.wrap_stream(
+                outfile, convert=None, strip=None, autoreset=False, wrap=True)
+
+    # When using the LaTeX formatter and the option `escapeinside` is
+    # specified, we need a special lexer which collects escaped text
+    # before running the chosen language lexer.
+    escapeinside = parsed_opts.get('escapeinside', '')
+    if len(escapeinside) == 2 and isinstance(fmter, LatexFormatter):
+        left = escapeinside[0]
+        right = escapeinside[1]
+        lexer = LatexEmbeddedLexer(left, right, lexer)
+
+    # ... and do it!
+    if not argns.s:
+        # process whole input as per normal...
+        try:
+            highlight(code, lexer, fmter, outfile)
+        finally:
+            if outfn:
+                outfile.close()
+        return 0
+    else:
+        # line by line processing of stdin (eg: for 'tail -f')...
+        try:
+            while 1:
+                line = sys.stdin.buffer.readline()
+                if not line:
+                    break
+                if not inencoding:
+                    line = guess_decode_from_terminal(line, sys.stdin)[0]
+                highlight(line, lexer, fmter, outfile)
+                if hasattr(outfile, 'flush'):
+                    outfile.flush()
+            return 0
+        except KeyboardInterrupt:  # pragma: no cover
+            return 0
+        finally:
+            if outfn:
+                outfile.close()
+
+
+class HelpFormatter(argparse.HelpFormatter):
+    def __init__(self, prog, indent_increment=2, max_help_position=16, width=None):
+        if width is None:
+            try:
+                width = shutil.get_terminal_size().columns - 2
+            except Exception:
+                pass
+        argparse.HelpFormatter.__init__(self, prog, indent_increment,
+                                        max_help_position, width)
+
+
+def main(args=sys.argv):
+    """
+    Main command line entry point.
+    """
+    desc = "Highlight an input file and write the result to an output file."
+    parser = argparse.ArgumentParser(description=desc, add_help=False,
+                                     formatter_class=HelpFormatter)
+
+    operation = parser.add_argument_group('Main operation')
+    lexersel = operation.add_mutually_exclusive_group()
+    lexersel.add_argument(
+        '-l', metavar='LEXER',
+        help='Specify the lexer to use.  (Query names with -L.)  If not '
+        'given and -g is not present, the lexer is guessed from the filename.')
+    lexersel.add_argument(
+        '-g', action='store_true',
+        help='Guess the lexer from the file contents, or pass through '
+        'as plain text if nothing can be guessed.')
+    operation.add_argument(
+        '-F', metavar='FILTER[:options]', action='append',
+        help='Add a filter to the token stream.  (Query names with -L.) '
+        'Filter options are given after a colon if necessary.')
+    operation.add_argument(
+        '-f', metavar='FORMATTER',
+        help='Specify the formatter to use.  (Query names with -L.) '
+        'If not given, the formatter is guessed from the output filename, '
+        'and defaults to the terminal formatter if the output is to the '
+        'terminal or an unknown file extension.')
+    operation.add_argument(
+        '-O', metavar='OPTION=value[,OPTION=value,...]', action='append',
+        help='Give options to the lexer and formatter as a comma-separated '
+        'list of key-value pairs. '
+        'Example: `-O bg=light,python=cool`.')
+    operation.add_argument(
+        '-P', metavar='OPTION=value', action='append',
+        help='Give a single option to the lexer and formatter - with this '
+        'you can pass options whose value contains commas and equal signs. '
+        'Example: `-P "heading=Pygments, the Python highlighter"`.')
+    operation.add_argument(
+        '-o', metavar='OUTPUTFILE',
+        help='Where to write the output.  Defaults to standard output.')
+
+    operation.add_argument(
+        'INPUTFILE', nargs='?',
+        help='Where to read the input.  Defaults to standard input.')
+
+    flags = parser.add_argument_group('Operation flags')
+    flags.add_argument(
+        '-v', action='store_true',
+        help='Print a detailed traceback on unhandled exceptions, which '
+        'is useful for debugging and bug reports.')
+    flags.add_argument(
+        '-s', action='store_true',
+        help='Process lines one at a time until EOF, rather than waiting to '
+        'process the entire file.  This only works for stdin, only for lexers '
+        'with no line-spanning constructs, and is intended for streaming '
+        'input such as you get from `tail -f`. '
+        'Example usage: `tail -f sql.log | pygmentize -s -l sql`.')
+    flags.add_argument(
+        '-x', action='store_true',
+        help='Allow custom lexers and formatters to be loaded from a .py file '
+        'relative to the current working directory. For example, '
+        '`-l ./customlexer.py -x`. By default, this option expects a file '
+        'with a class named CustomLexer or CustomFormatter; you can also '
+        'specify your own class name with a colon (`-l ./lexer.py:MyLexer`). '
+        'Users should be very careful not to use this option with untrusted '
+        'files, because it will import and run them.')
+    flags.add_argument('--json', help='Output as JSON. This can '
+        'be only used in conjunction with -L.',
+        default=False,
+        action='store_true')
+
+    special_modes_group = parser.add_argument_group(
+        'Special modes - do not do any highlighting')
+    special_modes = special_modes_group.add_mutually_exclusive_group()
+    special_modes.add_argument(
+        '-S', metavar='STYLE -f formatter',
+        help='Print style definitions for STYLE for a formatter '
+        'given with -f. The argument given by -a is formatter '
+        'dependent.')
+    special_modes.add_argument(
+        '-L', nargs='*', metavar='WHAT',
+        help='List lexers, formatters, styles or filters -- '
+        'give additional arguments for the thing(s) you want to list '
+        '(e.g. "styles"), or omit them to list everything.')
+    special_modes.add_argument(
+        '-N', metavar='FILENAME',
+        help='Guess and print out a lexer name based solely on the given '
+        'filename. Does not take input or highlight anything. If no specific '
+        'lexer can be determined, "text" is printed.')
+    special_modes.add_argument(
+        '-C', action='store_true',
+        help='Like -N, but print out a lexer name based solely on '
+        'a given content from standard input.')
+    special_modes.add_argument(
+        '-H', action='store', nargs=2, metavar=('NAME', 'TYPE'),
+        help='Print detailed help for the object <name> of type <type>, '
+        'where <type> is one of "lexer", "formatter" or "filter".')
+    special_modes.add_argument(
+        '-V', action='store_true',
+        help='Print the package version.')
+    special_modes.add_argument(
+        '-h', '--help', action='store_true',
+        help='Print this help.')
+    special_modes_group.add_argument(
+        '-a', metavar='ARG',
+        help='Formatter-specific additional argument for the -S (print '
+        'style sheet) mode.')
+
+    argns = parser.parse_args(args[1:])
+
+    try:
+        return main_inner(parser, argns)
+    except BrokenPipeError:
+        # someone closed our stdout, e.g. by quitting a pager.
+        return 0
+    except Exception:
+        if argns.v:
+            print(file=sys.stderr)
+            print('*' * 65, file=sys.stderr)
+            print('An unhandled exception occurred while highlighting.',
+                  file=sys.stderr)
+            print('Please report the whole traceback to the issue tracker at',
+                  file=sys.stderr)
+            print('<https://github.com/pygments/pygments/issues>.',
+                  file=sys.stderr)
+            print('*' * 65, file=sys.stderr)
+            print(file=sys.stderr)
+            raise
+        import traceback
+        info = traceback.format_exception(*sys.exc_info())
+        msg = info[-1].strip()
+        if len(info) >= 3:
+            # extract relevant file and position info
+            msg += '\n   (f{})'.format(info[-2].split('\n')[0].strip()[1:])
+        print(file=sys.stderr)
+        print('*** Error while highlighting:', file=sys.stderr)
+        print(msg, file=sys.stderr)
+        print('*** If this is a bug you want to report, please rerun with -v.',
+              file=sys.stderr)
+        return 1
diff --git a/.venv/Lib/site-packages/pygments/console.py b/.venv/Lib/site-packages/pygments/console.py
new file mode 100644 (file)
index 0000000..ee1ac27
--- /dev/null
@@ -0,0 +1,70 @@
+"""
+    pygments.console
+    ~~~~~~~~~~~~~~~~
+
+    Format colored console output.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+esc = "\x1b["
+
+codes = {}
+codes[""] = ""
+codes["reset"] = esc + "39;49;00m"
+
+codes["bold"] = esc + "01m"
+codes["faint"] = esc + "02m"
+codes["standout"] = esc + "03m"
+codes["underline"] = esc + "04m"
+codes["blink"] = esc + "05m"
+codes["overline"] = esc + "06m"
+
+dark_colors = ["black", "red", "green", "yellow", "blue",
+               "magenta", "cyan", "gray"]
+light_colors = ["brightblack", "brightred", "brightgreen", "brightyellow", "brightblue",
+                "brightmagenta", "brightcyan", "white"]
+
+x = 30
+for dark, light in zip(dark_colors, light_colors):
+    codes[dark] = esc + "%im" % x
+    codes[light] = esc + "%im" % (60 + x)
+    x += 1
+
+del dark, light, x
+
+codes["white"] = codes["bold"]
+
+
+def reset_color():
+    return codes["reset"]
+
+
+def colorize(color_key, text):
+    return codes[color_key] + text + codes["reset"]
+
+
+def ansiformat(attr, text):
+    """
+    Format ``text`` with a color and/or some attributes::
+
+        color       normal color
+        *color*     bold color
+        _color_     underlined color
+        +color+     blinking color
+    """
+    result = []
+    if attr[:1] == attr[-1:] == '+':
+        result.append(codes['blink'])
+        attr = attr[1:-1]
+    if attr[:1] == attr[-1:] == '*':
+        result.append(codes['bold'])
+        attr = attr[1:-1]
+    if attr[:1] == attr[-1:] == '_':
+        result.append(codes['underline'])
+        attr = attr[1:-1]
+    result.append(codes[attr])
+    result.append(text)
+    result.append(codes['reset'])
+    return ''.join(result)
diff --git a/.venv/Lib/site-packages/pygments/filter.py b/.venv/Lib/site-packages/pygments/filter.py
new file mode 100644 (file)
index 0000000..5efff43
--- /dev/null
@@ -0,0 +1,70 @@
+"""
+    pygments.filter
+    ~~~~~~~~~~~~~~~
+
+    Module that implements the default filter.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+def apply_filters(stream, filters, lexer=None):
+    """
+    Use this method to apply an iterable of filters to
+    a stream. If lexer is given it's forwarded to the
+    filter, otherwise the filter receives `None`.
+    """
+    def _apply(filter_, stream):
+        yield from filter_.filter(lexer, stream)
+    for filter_ in filters:
+        stream = _apply(filter_, stream)
+    return stream
+
+
+def simplefilter(f):
+    """
+    Decorator that converts a function into a filter::
+
+        @simplefilter
+        def lowercase(self, lexer, stream, options):
+            for ttype, value in stream:
+                yield ttype, value.lower()
+    """
+    return type(f.__name__, (FunctionFilter,), {
+        '__module__': getattr(f, '__module__'),
+        '__doc__': f.__doc__,
+        'function': f,
+    })
+
+
+class Filter:
+    """
+    Default filter. Subclass this class or use the `simplefilter`
+    decorator to create own filters.
+    """
+
+    def __init__(self, **options):
+        self.options = options
+
+    def filter(self, lexer, stream):
+        raise NotImplementedError()
+
+
+class FunctionFilter(Filter):
+    """
+    Abstract class used by `simplefilter` to create simple
+    function filters on the fly. The `simplefilter` decorator
+    automatically creates subclasses of this class for
+    functions passed to it.
+    """
+    function = None
+
+    def __init__(self, **options):
+        if not hasattr(self, 'function'):
+            raise TypeError(f'{self.__class__.__name__!r} used without bound function')
+        Filter.__init__(self, **options)
+
+    def filter(self, lexer, stream):
+        # pylint: disable=not-callable
+        yield from self.function(lexer, stream, self.options)
diff --git a/.venv/Lib/site-packages/pygments/filters/__init__.py b/.venv/Lib/site-packages/pygments/filters/__init__.py
new file mode 100644 (file)
index 0000000..2fed761
--- /dev/null
@@ -0,0 +1,940 @@
+"""
+    pygments.filters
+    ~~~~~~~~~~~~~~~~
+
+    Module containing filter lookup functions and default
+    filters.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.token import String, Comment, Keyword, Name, Error, Whitespace, \
+    string_to_tokentype
+from pygments.filter import Filter
+from pygments.util import get_list_opt, get_int_opt, get_bool_opt, \
+    get_choice_opt, ClassNotFound, OptionError
+from pygments.plugin import find_plugin_filters
+
+
+def find_filter_class(filtername):
+    """Lookup a filter by name. Return None if not found."""
+    if filtername in FILTERS:
+        return FILTERS[filtername]
+    for name, cls in find_plugin_filters():
+        if name == filtername:
+            return cls
+    return None
+
+
+def get_filter_by_name(filtername, **options):
+    """Return an instantiated filter.
+
+    Options are passed to the filter initializer if wanted.
+    Raise a ClassNotFound if not found.
+    """
+    cls = find_filter_class(filtername)
+    if cls:
+        return cls(**options)
+    else:
+        raise ClassNotFound(f'filter {filtername!r} not found')
+
+
+def get_all_filters():
+    """Return a generator of all filter names."""
+    yield from FILTERS
+    for name, _ in find_plugin_filters():
+        yield name
+
+
+def _replace_special(ttype, value, regex, specialttype,
+                     replacefunc=lambda x: x):
+    last = 0
+    for match in regex.finditer(value):
+        start, end = match.start(), match.end()
+        if start != last:
+            yield ttype, value[last:start]
+        yield specialttype, replacefunc(value[start:end])
+        last = end
+    if last != len(value):
+        yield ttype, value[last:]
+
+
+class CodeTagFilter(Filter):
+    """Highlight special code tags in comments and docstrings.
+
+    Options accepted:
+
+    `codetags` : list of strings
+       A list of strings that are flagged as code tags.  The default is to
+       highlight ``XXX``, ``TODO``, ``FIXME``, ``BUG`` and ``NOTE``.
+
+    .. versionchanged:: 2.13
+       Now recognizes ``FIXME`` by default.
+    """
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        tags = get_list_opt(options, 'codetags',
+                            ['XXX', 'TODO', 'FIXME', 'BUG', 'NOTE'])
+        self.tag_re = re.compile(r'\b({})\b'.format('|'.join([
+            re.escape(tag) for tag in tags if tag
+        ])))
+
+    def filter(self, lexer, stream):
+        regex = self.tag_re
+        for ttype, value in stream:
+            if ttype in String.Doc or \
+               ttype in Comment and \
+               ttype not in Comment.Preproc:
+                yield from _replace_special(ttype, value, regex, Comment.Special)
+            else:
+                yield ttype, value
+
+
+class SymbolFilter(Filter):
+    """Convert mathematical symbols such as \\<longrightarrow> in Isabelle
+    or \\longrightarrow in LaTeX into Unicode characters.
+
+    This is mostly useful for HTML or console output when you want to
+    approximate the source rendering you'd see in an IDE.
+
+    Options accepted:
+
+    `lang` : string
+       The symbol language. Must be one of ``'isabelle'`` or
+       ``'latex'``.  The default is ``'isabelle'``.
+    """
+
+    latex_symbols = {
+        '\\alpha'                : '\U000003b1',
+        '\\beta'                 : '\U000003b2',
+        '\\gamma'                : '\U000003b3',
+        '\\delta'                : '\U000003b4',
+        '\\varepsilon'           : '\U000003b5',
+        '\\zeta'                 : '\U000003b6',
+        '\\eta'                  : '\U000003b7',
+        '\\vartheta'             : '\U000003b8',
+        '\\iota'                 : '\U000003b9',
+        '\\kappa'                : '\U000003ba',
+        '\\lambda'               : '\U000003bb',
+        '\\mu'                   : '\U000003bc',
+        '\\nu'                   : '\U000003bd',
+        '\\xi'                   : '\U000003be',
+        '\\pi'                   : '\U000003c0',
+        '\\varrho'               : '\U000003c1',
+        '\\sigma'                : '\U000003c3',
+        '\\tau'                  : '\U000003c4',
+        '\\upsilon'              : '\U000003c5',
+        '\\varphi'               : '\U000003c6',
+        '\\chi'                  : '\U000003c7',
+        '\\psi'                  : '\U000003c8',
+        '\\omega'                : '\U000003c9',
+        '\\Gamma'                : '\U00000393',
+        '\\Delta'                : '\U00000394',
+        '\\Theta'                : '\U00000398',
+        '\\Lambda'               : '\U0000039b',
+        '\\Xi'                   : '\U0000039e',
+        '\\Pi'                   : '\U000003a0',
+        '\\Sigma'                : '\U000003a3',
+        '\\Upsilon'              : '\U000003a5',
+        '\\Phi'                  : '\U000003a6',
+        '\\Psi'                  : '\U000003a8',
+        '\\Omega'                : '\U000003a9',
+        '\\leftarrow'            : '\U00002190',
+        '\\longleftarrow'        : '\U000027f5',
+        '\\rightarrow'           : '\U00002192',
+        '\\longrightarrow'       : '\U000027f6',
+        '\\Leftarrow'            : '\U000021d0',
+        '\\Longleftarrow'        : '\U000027f8',
+        '\\Rightarrow'           : '\U000021d2',
+        '\\Longrightarrow'       : '\U000027f9',
+        '\\leftrightarrow'       : '\U00002194',
+        '\\longleftrightarrow'   : '\U000027f7',
+        '\\Leftrightarrow'       : '\U000021d4',
+        '\\Longleftrightarrow'   : '\U000027fa',
+        '\\mapsto'               : '\U000021a6',
+        '\\longmapsto'           : '\U000027fc',
+        '\\relbar'               : '\U00002500',
+        '\\Relbar'               : '\U00002550',
+        '\\hookleftarrow'        : '\U000021a9',
+        '\\hookrightarrow'       : '\U000021aa',
+        '\\leftharpoondown'      : '\U000021bd',
+        '\\rightharpoondown'     : '\U000021c1',
+        '\\leftharpoonup'        : '\U000021bc',
+        '\\rightharpoonup'       : '\U000021c0',
+        '\\rightleftharpoons'    : '\U000021cc',
+        '\\leadsto'              : '\U0000219d',
+        '\\downharpoonleft'      : '\U000021c3',
+        '\\downharpoonright'     : '\U000021c2',
+        '\\upharpoonleft'        : '\U000021bf',
+        '\\upharpoonright'       : '\U000021be',
+        '\\restriction'          : '\U000021be',
+        '\\uparrow'              : '\U00002191',
+        '\\Uparrow'              : '\U000021d1',
+        '\\downarrow'            : '\U00002193',
+        '\\Downarrow'            : '\U000021d3',
+        '\\updownarrow'          : '\U00002195',
+        '\\Updownarrow'          : '\U000021d5',
+        '\\langle'               : '\U000027e8',
+        '\\rangle'               : '\U000027e9',
+        '\\lceil'                : '\U00002308',
+        '\\rceil'                : '\U00002309',
+        '\\lfloor'               : '\U0000230a',
+        '\\rfloor'               : '\U0000230b',
+        '\\flqq'                 : '\U000000ab',
+        '\\frqq'                 : '\U000000bb',
+        '\\bot'                  : '\U000022a5',
+        '\\top'                  : '\U000022a4',
+        '\\wedge'                : '\U00002227',
+        '\\bigwedge'             : '\U000022c0',
+        '\\vee'                  : '\U00002228',
+        '\\bigvee'               : '\U000022c1',
+        '\\forall'               : '\U00002200',
+        '\\exists'               : '\U00002203',
+        '\\nexists'              : '\U00002204',
+        '\\neg'                  : '\U000000ac',
+        '\\Box'                  : '\U000025a1',
+        '\\Diamond'              : '\U000025c7',
+        '\\vdash'                : '\U000022a2',
+        '\\models'               : '\U000022a8',
+        '\\dashv'                : '\U000022a3',
+        '\\surd'                 : '\U0000221a',
+        '\\le'                   : '\U00002264',
+        '\\ge'                   : '\U00002265',
+        '\\ll'                   : '\U0000226a',
+        '\\gg'                   : '\U0000226b',
+        '\\lesssim'              : '\U00002272',
+        '\\gtrsim'               : '\U00002273',
+        '\\lessapprox'           : '\U00002a85',
+        '\\gtrapprox'            : '\U00002a86',
+        '\\in'                   : '\U00002208',
+        '\\notin'                : '\U00002209',
+        '\\subset'               : '\U00002282',
+        '\\supset'               : '\U00002283',
+        '\\subseteq'             : '\U00002286',
+        '\\supseteq'             : '\U00002287',
+        '\\sqsubset'             : '\U0000228f',
+        '\\sqsupset'             : '\U00002290',
+        '\\sqsubseteq'           : '\U00002291',
+        '\\sqsupseteq'           : '\U00002292',
+        '\\cap'                  : '\U00002229',
+        '\\bigcap'               : '\U000022c2',
+        '\\cup'                  : '\U0000222a',
+        '\\bigcup'               : '\U000022c3',
+        '\\sqcup'                : '\U00002294',
+        '\\bigsqcup'             : '\U00002a06',
+        '\\sqcap'                : '\U00002293',
+        '\\Bigsqcap'             : '\U00002a05',
+        '\\setminus'             : '\U00002216',
+        '\\propto'               : '\U0000221d',
+        '\\uplus'                : '\U0000228e',
+        '\\bigplus'              : '\U00002a04',
+        '\\sim'                  : '\U0000223c',
+        '\\doteq'                : '\U00002250',
+        '\\simeq'                : '\U00002243',
+        '\\approx'               : '\U00002248',
+        '\\asymp'                : '\U0000224d',
+        '\\cong'                 : '\U00002245',
+        '\\equiv'                : '\U00002261',
+        '\\Join'                 : '\U000022c8',
+        '\\bowtie'               : '\U00002a1d',
+        '\\prec'                 : '\U0000227a',
+        '\\succ'                 : '\U0000227b',
+        '\\preceq'               : '\U0000227c',
+        '\\succeq'               : '\U0000227d',
+        '\\parallel'             : '\U00002225',
+        '\\mid'                  : '\U000000a6',
+        '\\pm'                   : '\U000000b1',
+        '\\mp'                   : '\U00002213',
+        '\\times'                : '\U000000d7',
+        '\\div'                  : '\U000000f7',
+        '\\cdot'                 : '\U000022c5',
+        '\\star'                 : '\U000022c6',
+        '\\circ'                 : '\U00002218',
+        '\\dagger'               : '\U00002020',
+        '\\ddagger'              : '\U00002021',
+        '\\lhd'                  : '\U000022b2',
+        '\\rhd'                  : '\U000022b3',
+        '\\unlhd'                : '\U000022b4',
+        '\\unrhd'                : '\U000022b5',
+        '\\triangleleft'         : '\U000025c3',
+        '\\triangleright'        : '\U000025b9',
+        '\\triangle'             : '\U000025b3',
+        '\\triangleq'            : '\U0000225c',
+        '\\oplus'                : '\U00002295',
+        '\\bigoplus'             : '\U00002a01',
+        '\\otimes'               : '\U00002297',
+        '\\bigotimes'            : '\U00002a02',
+        '\\odot'                 : '\U00002299',
+        '\\bigodot'              : '\U00002a00',
+        '\\ominus'               : '\U00002296',
+        '\\oslash'               : '\U00002298',
+        '\\dots'                 : '\U00002026',
+        '\\cdots'                : '\U000022ef',
+        '\\sum'                  : '\U00002211',
+        '\\prod'                 : '\U0000220f',
+        '\\coprod'               : '\U00002210',
+        '\\infty'                : '\U0000221e',
+        '\\int'                  : '\U0000222b',
+        '\\oint'                 : '\U0000222e',
+        '\\clubsuit'             : '\U00002663',
+        '\\diamondsuit'          : '\U00002662',
+        '\\heartsuit'            : '\U00002661',
+        '\\spadesuit'            : '\U00002660',
+        '\\aleph'                : '\U00002135',
+        '\\emptyset'             : '\U00002205',
+        '\\nabla'                : '\U00002207',
+        '\\partial'              : '\U00002202',
+        '\\flat'                 : '\U0000266d',
+        '\\natural'              : '\U0000266e',
+        '\\sharp'                : '\U0000266f',
+        '\\angle'                : '\U00002220',
+        '\\copyright'            : '\U000000a9',
+        '\\textregistered'       : '\U000000ae',
+        '\\textonequarter'       : '\U000000bc',
+        '\\textonehalf'          : '\U000000bd',
+        '\\textthreequarters'    : '\U000000be',
+        '\\textordfeminine'      : '\U000000aa',
+        '\\textordmasculine'     : '\U000000ba',
+        '\\euro'                 : '\U000020ac',
+        '\\pounds'               : '\U000000a3',
+        '\\yen'                  : '\U000000a5',
+        '\\textcent'             : '\U000000a2',
+        '\\textcurrency'         : '\U000000a4',
+        '\\textdegree'           : '\U000000b0',
+    }
+
+    isabelle_symbols = {
+        '\\<zero>'                 : '\U0001d7ec',
+        '\\<one>'                  : '\U0001d7ed',
+        '\\<two>'                  : '\U0001d7ee',
+        '\\<three>'                : '\U0001d7ef',
+        '\\<four>'                 : '\U0001d7f0',
+        '\\<five>'                 : '\U0001d7f1',
+        '\\<six>'                  : '\U0001d7f2',
+        '\\<seven>'                : '\U0001d7f3',
+        '\\<eight>'                : '\U0001d7f4',
+        '\\<nine>'                 : '\U0001d7f5',
+        '\\<A>'                    : '\U0001d49c',
+        '\\<B>'                    : '\U0000212c',
+        '\\<C>'                    : '\U0001d49e',
+        '\\<D>'                    : '\U0001d49f',
+        '\\<E>'                    : '\U00002130',
+        '\\<F>'                    : '\U00002131',
+        '\\<G>'                    : '\U0001d4a2',
+        '\\<H>'                    : '\U0000210b',
+        '\\<I>'                    : '\U00002110',
+        '\\<J>'                    : '\U0001d4a5',
+        '\\<K>'                    : '\U0001d4a6',
+        '\\<L>'                    : '\U00002112',
+        '\\<M>'                    : '\U00002133',
+        '\\<N>'                    : '\U0001d4a9',
+        '\\<O>'                    : '\U0001d4aa',
+        '\\<P>'                    : '\U0001d4ab',
+        '\\<Q>'                    : '\U0001d4ac',
+        '\\<R>'                    : '\U0000211b',
+        '\\<S>'                    : '\U0001d4ae',
+        '\\<T>'                    : '\U0001d4af',
+        '\\<U>'                    : '\U0001d4b0',
+        '\\<V>'                    : '\U0001d4b1',
+        '\\<W>'                    : '\U0001d4b2',
+        '\\<X>'                    : '\U0001d4b3',
+        '\\<Y>'                    : '\U0001d4b4',
+        '\\<Z>'                    : '\U0001d4b5',
+        '\\<a>'                    : '\U0001d5ba',
+        '\\<b>'                    : '\U0001d5bb',
+        '\\<c>'                    : '\U0001d5bc',
+        '\\<d>'                    : '\U0001d5bd',
+        '\\<e>'                    : '\U0001d5be',
+        '\\<f>'                    : '\U0001d5bf',
+        '\\<g>'                    : '\U0001d5c0',
+        '\\<h>'                    : '\U0001d5c1',
+        '\\<i>'                    : '\U0001d5c2',
+        '\\<j>'                    : '\U0001d5c3',
+        '\\<k>'                    : '\U0001d5c4',
+        '\\<l>'                    : '\U0001d5c5',
+        '\\<m>'                    : '\U0001d5c6',
+        '\\<n>'                    : '\U0001d5c7',
+        '\\<o>'                    : '\U0001d5c8',
+        '\\<p>'                    : '\U0001d5c9',
+        '\\<q>'                    : '\U0001d5ca',
+        '\\<r>'                    : '\U0001d5cb',
+        '\\<s>'                    : '\U0001d5cc',
+        '\\<t>'                    : '\U0001d5cd',
+        '\\<u>'                    : '\U0001d5ce',
+        '\\<v>'                    : '\U0001d5cf',
+        '\\<w>'                    : '\U0001d5d0',
+        '\\<x>'                    : '\U0001d5d1',
+        '\\<y>'                    : '\U0001d5d2',
+        '\\<z>'                    : '\U0001d5d3',
+        '\\<AA>'                   : '\U0001d504',
+        '\\<BB>'                   : '\U0001d505',
+        '\\<CC>'                   : '\U0000212d',
+        '\\<DD>'                   : '\U0001d507',
+        '\\<EE>'                   : '\U0001d508',
+        '\\<FF>'                   : '\U0001d509',
+        '\\<GG>'                   : '\U0001d50a',
+        '\\<HH>'                   : '\U0000210c',
+        '\\<II>'                   : '\U00002111',
+        '\\<JJ>'                   : '\U0001d50d',
+        '\\<KK>'                   : '\U0001d50e',
+        '\\<LL>'                   : '\U0001d50f',
+        '\\<MM>'                   : '\U0001d510',
+        '\\<NN>'                   : '\U0001d511',
+        '\\<OO>'                   : '\U0001d512',
+        '\\<PP>'                   : '\U0001d513',
+        '\\<QQ>'                   : '\U0001d514',
+        '\\<RR>'                   : '\U0000211c',
+        '\\<SS>'                   : '\U0001d516',
+        '\\<TT>'                   : '\U0001d517',
+        '\\<UU>'                   : '\U0001d518',
+        '\\<VV>'                   : '\U0001d519',
+        '\\<WW>'                   : '\U0001d51a',
+        '\\<XX>'                   : '\U0001d51b',
+        '\\<YY>'                   : '\U0001d51c',
+        '\\<ZZ>'                   : '\U00002128',
+        '\\<aa>'                   : '\U0001d51e',
+        '\\<bb>'                   : '\U0001d51f',
+        '\\<cc>'                   : '\U0001d520',
+        '\\<dd>'                   : '\U0001d521',
+        '\\<ee>'                   : '\U0001d522',
+        '\\<ff>'                   : '\U0001d523',
+        '\\<gg>'                   : '\U0001d524',
+        '\\<hh>'                   : '\U0001d525',
+        '\\<ii>'                   : '\U0001d526',
+        '\\<jj>'                   : '\U0001d527',
+        '\\<kk>'                   : '\U0001d528',
+        '\\<ll>'                   : '\U0001d529',
+        '\\<mm>'                   : '\U0001d52a',
+        '\\<nn>'                   : '\U0001d52b',
+        '\\<oo>'                   : '\U0001d52c',
+        '\\<pp>'                   : '\U0001d52d',
+        '\\<qq>'                   : '\U0001d52e',
+        '\\<rr>'                   : '\U0001d52f',
+        '\\<ss>'                   : '\U0001d530',
+        '\\<tt>'                   : '\U0001d531',
+        '\\<uu>'                   : '\U0001d532',
+        '\\<vv>'                   : '\U0001d533',
+        '\\<ww>'                   : '\U0001d534',
+        '\\<xx>'                   : '\U0001d535',
+        '\\<yy>'                   : '\U0001d536',
+        '\\<zz>'                   : '\U0001d537',
+        '\\<alpha>'                : '\U000003b1',
+        '\\<beta>'                 : '\U000003b2',
+        '\\<gamma>'                : '\U000003b3',
+        '\\<delta>'                : '\U000003b4',
+        '\\<epsilon>'              : '\U000003b5',
+        '\\<zeta>'                 : '\U000003b6',
+        '\\<eta>'                  : '\U000003b7',
+        '\\<theta>'                : '\U000003b8',
+        '\\<iota>'                 : '\U000003b9',
+        '\\<kappa>'                : '\U000003ba',
+        '\\<lambda>'               : '\U000003bb',
+        '\\<mu>'                   : '\U000003bc',
+        '\\<nu>'                   : '\U000003bd',
+        '\\<xi>'                   : '\U000003be',
+        '\\<pi>'                   : '\U000003c0',
+        '\\<rho>'                  : '\U000003c1',
+        '\\<sigma>'                : '\U000003c3',
+        '\\<tau>'                  : '\U000003c4',
+        '\\<upsilon>'              : '\U000003c5',
+        '\\<phi>'                  : '\U000003c6',
+        '\\<chi>'                  : '\U000003c7',
+        '\\<psi>'                  : '\U000003c8',
+        '\\<omega>'                : '\U000003c9',
+        '\\<Gamma>'                : '\U00000393',
+        '\\<Delta>'                : '\U00000394',
+        '\\<Theta>'                : '\U00000398',
+        '\\<Lambda>'               : '\U0000039b',
+        '\\<Xi>'                   : '\U0000039e',
+        '\\<Pi>'                   : '\U000003a0',
+        '\\<Sigma>'                : '\U000003a3',
+        '\\<Upsilon>'              : '\U000003a5',
+        '\\<Phi>'                  : '\U000003a6',
+        '\\<Psi>'                  : '\U000003a8',
+        '\\<Omega>'                : '\U000003a9',
+        '\\<bool>'                 : '\U0001d539',
+        '\\<complex>'              : '\U00002102',
+        '\\<nat>'                  : '\U00002115',
+        '\\<rat>'                  : '\U0000211a',
+        '\\<real>'                 : '\U0000211d',
+        '\\<int>'                  : '\U00002124',
+        '\\<leftarrow>'            : '\U00002190',
+        '\\<longleftarrow>'        : '\U000027f5',
+        '\\<rightarrow>'           : '\U00002192',
+        '\\<longrightarrow>'       : '\U000027f6',
+        '\\<Leftarrow>'            : '\U000021d0',
+        '\\<Longleftarrow>'        : '\U000027f8',
+        '\\<Rightarrow>'           : '\U000021d2',
+        '\\<Longrightarrow>'       : '\U000027f9',
+        '\\<leftrightarrow>'       : '\U00002194',
+        '\\<longleftrightarrow>'   : '\U000027f7',
+        '\\<Leftrightarrow>'       : '\U000021d4',
+        '\\<Longleftrightarrow>'   : '\U000027fa',
+        '\\<mapsto>'               : '\U000021a6',
+        '\\<longmapsto>'           : '\U000027fc',
+        '\\<midarrow>'             : '\U00002500',
+        '\\<Midarrow>'             : '\U00002550',
+        '\\<hookleftarrow>'        : '\U000021a9',
+        '\\<hookrightarrow>'       : '\U000021aa',
+        '\\<leftharpoondown>'      : '\U000021bd',
+        '\\<rightharpoondown>'     : '\U000021c1',
+        '\\<leftharpoonup>'        : '\U000021bc',
+        '\\<rightharpoonup>'       : '\U000021c0',
+        '\\<rightleftharpoons>'    : '\U000021cc',
+        '\\<leadsto>'              : '\U0000219d',
+        '\\<downharpoonleft>'      : '\U000021c3',
+        '\\<downharpoonright>'     : '\U000021c2',
+        '\\<upharpoonleft>'        : '\U000021bf',
+        '\\<upharpoonright>'       : '\U000021be',
+        '\\<restriction>'          : '\U000021be',
+        '\\<Colon>'                : '\U00002237',
+        '\\<up>'                   : '\U00002191',
+        '\\<Up>'                   : '\U000021d1',
+        '\\<down>'                 : '\U00002193',
+        '\\<Down>'                 : '\U000021d3',
+        '\\<updown>'               : '\U00002195',
+        '\\<Updown>'               : '\U000021d5',
+        '\\<langle>'               : '\U000027e8',
+        '\\<rangle>'               : '\U000027e9',
+        '\\<lceil>'                : '\U00002308',
+        '\\<rceil>'                : '\U00002309',
+        '\\<lfloor>'               : '\U0000230a',
+        '\\<rfloor>'               : '\U0000230b',
+        '\\<lparr>'                : '\U00002987',
+        '\\<rparr>'                : '\U00002988',
+        '\\<lbrakk>'               : '\U000027e6',
+        '\\<rbrakk>'               : '\U000027e7',
+        '\\<lbrace>'               : '\U00002983',
+        '\\<rbrace>'               : '\U00002984',
+        '\\<guillemotleft>'        : '\U000000ab',
+        '\\<guillemotright>'       : '\U000000bb',
+        '\\<bottom>'               : '\U000022a5',
+        '\\<top>'                  : '\U000022a4',
+        '\\<and>'                  : '\U00002227',
+        '\\<And>'                  : '\U000022c0',
+        '\\<or>'                   : '\U00002228',
+        '\\<Or>'                   : '\U000022c1',
+        '\\<forall>'               : '\U00002200',
+        '\\<exists>'               : '\U00002203',
+        '\\<nexists>'              : '\U00002204',
+        '\\<not>'                  : '\U000000ac',
+        '\\<box>'                  : '\U000025a1',
+        '\\<diamond>'              : '\U000025c7',
+        '\\<turnstile>'            : '\U000022a2',
+        '\\<Turnstile>'            : '\U000022a8',
+        '\\<tturnstile>'           : '\U000022a9',
+        '\\<TTurnstile>'           : '\U000022ab',
+        '\\<stileturn>'            : '\U000022a3',
+        '\\<surd>'                 : '\U0000221a',
+        '\\<le>'                   : '\U00002264',
+        '\\<ge>'                   : '\U00002265',
+        '\\<lless>'                : '\U0000226a',
+        '\\<ggreater>'             : '\U0000226b',
+        '\\<lesssim>'              : '\U00002272',
+        '\\<greatersim>'           : '\U00002273',
+        '\\<lessapprox>'           : '\U00002a85',
+        '\\<greaterapprox>'        : '\U00002a86',
+        '\\<in>'                   : '\U00002208',
+        '\\<notin>'                : '\U00002209',
+        '\\<subset>'               : '\U00002282',
+        '\\<supset>'               : '\U00002283',
+        '\\<subseteq>'             : '\U00002286',
+        '\\<supseteq>'             : '\U00002287',
+        '\\<sqsubset>'             : '\U0000228f',
+        '\\<sqsupset>'             : '\U00002290',
+        '\\<sqsubseteq>'           : '\U00002291',
+        '\\<sqsupseteq>'           : '\U00002292',
+        '\\<inter>'                : '\U00002229',
+        '\\<Inter>'                : '\U000022c2',
+        '\\<union>'                : '\U0000222a',
+        '\\<Union>'                : '\U000022c3',
+        '\\<squnion>'              : '\U00002294',
+        '\\<Squnion>'              : '\U00002a06',
+        '\\<sqinter>'              : '\U00002293',
+        '\\<Sqinter>'              : '\U00002a05',
+        '\\<setminus>'             : '\U00002216',
+        '\\<propto>'               : '\U0000221d',
+        '\\<uplus>'                : '\U0000228e',
+        '\\<Uplus>'                : '\U00002a04',
+        '\\<noteq>'                : '\U00002260',
+        '\\<sim>'                  : '\U0000223c',
+        '\\<doteq>'                : '\U00002250',
+        '\\<simeq>'                : '\U00002243',
+        '\\<approx>'               : '\U00002248',
+        '\\<asymp>'                : '\U0000224d',
+        '\\<cong>'                 : '\U00002245',
+        '\\<smile>'                : '\U00002323',
+        '\\<equiv>'                : '\U00002261',
+        '\\<frown>'                : '\U00002322',
+        '\\<Join>'                 : '\U000022c8',
+        '\\<bowtie>'               : '\U00002a1d',
+        '\\<prec>'                 : '\U0000227a',
+        '\\<succ>'                 : '\U0000227b',
+        '\\<preceq>'               : '\U0000227c',
+        '\\<succeq>'               : '\U0000227d',
+        '\\<parallel>'             : '\U00002225',
+        '\\<bar>'                  : '\U000000a6',
+        '\\<plusminus>'            : '\U000000b1',
+        '\\<minusplus>'            : '\U00002213',
+        '\\<times>'                : '\U000000d7',
+        '\\<div>'                  : '\U000000f7',
+        '\\<cdot>'                 : '\U000022c5',
+        '\\<star>'                 : '\U000022c6',
+        '\\<bullet>'               : '\U00002219',
+        '\\<circ>'                 : '\U00002218',
+        '\\<dagger>'               : '\U00002020',
+        '\\<ddagger>'              : '\U00002021',
+        '\\<lhd>'                  : '\U000022b2',
+        '\\<rhd>'                  : '\U000022b3',
+        '\\<unlhd>'                : '\U000022b4',
+        '\\<unrhd>'                : '\U000022b5',
+        '\\<triangleleft>'         : '\U000025c3',
+        '\\<triangleright>'        : '\U000025b9',
+        '\\<triangle>'             : '\U000025b3',
+        '\\<triangleq>'            : '\U0000225c',
+        '\\<oplus>'                : '\U00002295',
+        '\\<Oplus>'                : '\U00002a01',
+        '\\<otimes>'               : '\U00002297',
+        '\\<Otimes>'               : '\U00002a02',
+        '\\<odot>'                 : '\U00002299',
+        '\\<Odot>'                 : '\U00002a00',
+        '\\<ominus>'               : '\U00002296',
+        '\\<oslash>'               : '\U00002298',
+        '\\<dots>'                 : '\U00002026',
+        '\\<cdots>'                : '\U000022ef',
+        '\\<Sum>'                  : '\U00002211',
+        '\\<Prod>'                 : '\U0000220f',
+        '\\<Coprod>'               : '\U00002210',
+        '\\<infinity>'             : '\U0000221e',
+        '\\<integral>'             : '\U0000222b',
+        '\\<ointegral>'            : '\U0000222e',
+        '\\<clubsuit>'             : '\U00002663',
+        '\\<diamondsuit>'          : '\U00002662',
+        '\\<heartsuit>'            : '\U00002661',
+        '\\<spadesuit>'            : '\U00002660',
+        '\\<aleph>'                : '\U00002135',
+        '\\<emptyset>'             : '\U00002205',
+        '\\<nabla>'                : '\U00002207',
+        '\\<partial>'              : '\U00002202',
+        '\\<flat>'                 : '\U0000266d',
+        '\\<natural>'              : '\U0000266e',
+        '\\<sharp>'                : '\U0000266f',
+        '\\<angle>'                : '\U00002220',
+        '\\<copyright>'            : '\U000000a9',
+        '\\<registered>'           : '\U000000ae',
+        '\\<hyphen>'               : '\U000000ad',
+        '\\<inverse>'              : '\U000000af',
+        '\\<onequarter>'           : '\U000000bc',
+        '\\<onehalf>'              : '\U000000bd',
+        '\\<threequarters>'        : '\U000000be',
+        '\\<ordfeminine>'          : '\U000000aa',
+        '\\<ordmasculine>'         : '\U000000ba',
+        '\\<section>'              : '\U000000a7',
+        '\\<paragraph>'            : '\U000000b6',
+        '\\<exclamdown>'           : '\U000000a1',
+        '\\<questiondown>'         : '\U000000bf',
+        '\\<euro>'                 : '\U000020ac',
+        '\\<pounds>'               : '\U000000a3',
+        '\\<yen>'                  : '\U000000a5',
+        '\\<cent>'                 : '\U000000a2',
+        '\\<currency>'             : '\U000000a4',
+        '\\<degree>'               : '\U000000b0',
+        '\\<amalg>'                : '\U00002a3f',
+        '\\<mho>'                  : '\U00002127',
+        '\\<lozenge>'              : '\U000025ca',
+        '\\<wp>'                   : '\U00002118',
+        '\\<wrong>'                : '\U00002240',
+        '\\<struct>'               : '\U000022c4',
+        '\\<acute>'                : '\U000000b4',
+        '\\<index>'                : '\U00000131',
+        '\\<dieresis>'             : '\U000000a8',
+        '\\<cedilla>'              : '\U000000b8',
+        '\\<hungarumlaut>'         : '\U000002dd',
+        '\\<some>'                 : '\U000003f5',
+        '\\<newline>'              : '\U000023ce',
+        '\\<open>'                 : '\U00002039',
+        '\\<close>'                : '\U0000203a',
+        '\\<here>'                 : '\U00002302',
+        '\\<^sub>'                 : '\U000021e9',
+        '\\<^sup>'                 : '\U000021e7',
+        '\\<^bold>'                : '\U00002759',
+        '\\<^bsub>'                : '\U000021d8',
+        '\\<^esub>'                : '\U000021d9',
+        '\\<^bsup>'                : '\U000021d7',
+        '\\<^esup>'                : '\U000021d6',
+    }
+
+    lang_map = {'isabelle' : isabelle_symbols, 'latex' : latex_symbols}
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        lang = get_choice_opt(options, 'lang',
+                              ['isabelle', 'latex'], 'isabelle')
+        self.symbols = self.lang_map[lang]
+
+    def filter(self, lexer, stream):
+        for ttype, value in stream:
+            if value in self.symbols:
+                yield ttype, self.symbols[value]
+            else:
+                yield ttype, value
+
+
+class KeywordCaseFilter(Filter):
+    """Convert keywords to lowercase or uppercase or capitalize them, which
+    means first letter uppercase, rest lowercase.
+
+    This can be useful e.g. if you highlight Pascal code and want to adapt the
+    code to your styleguide.
+
+    Options accepted:
+
+    `case` : string
+       The casing to convert keywords to. Must be one of ``'lower'``,
+       ``'upper'`` or ``'capitalize'``.  The default is ``'lower'``.
+    """
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        case = get_choice_opt(options, 'case',
+                              ['lower', 'upper', 'capitalize'], 'lower')
+        self.convert = getattr(str, case)
+
+    def filter(self, lexer, stream):
+        for ttype, value in stream:
+            if ttype in Keyword:
+                yield ttype, self.convert(value)
+            else:
+                yield ttype, value
+
+
+class NameHighlightFilter(Filter):
+    """Highlight a normal Name (and Name.*) token with a different token type.
+
+    Example::
+
+        filter = NameHighlightFilter(
+            names=['foo', 'bar', 'baz'],
+            tokentype=Name.Function,
+        )
+
+    This would highlight the names "foo", "bar" and "baz"
+    as functions. `Name.Function` is the default token type.
+
+    Options accepted:
+
+    `names` : list of strings
+      A list of names that should be given the different token type.
+      There is no default.
+    `tokentype` : TokenType or string
+      A token type or a string containing a token type name that is
+      used for highlighting the strings in `names`.  The default is
+      `Name.Function`.
+    """
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        self.names = set(get_list_opt(options, 'names', []))
+        tokentype = options.get('tokentype')
+        if tokentype:
+            self.tokentype = string_to_tokentype(tokentype)
+        else:
+            self.tokentype = Name.Function
+
+    def filter(self, lexer, stream):
+        for ttype, value in stream:
+            if ttype in Name and value in self.names:
+                yield self.tokentype, value
+            else:
+                yield ttype, value
+
+
+class ErrorToken(Exception):
+    pass
+
+
+class RaiseOnErrorTokenFilter(Filter):
+    """Raise an exception when the lexer generates an error token.
+
+    Options accepted:
+
+    `excclass` : Exception class
+      The exception class to raise.
+      The default is `pygments.filters.ErrorToken`.
+
+    .. versionadded:: 0.8
+    """
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        self.exception = options.get('excclass', ErrorToken)
+        try:
+            # issubclass() will raise TypeError if first argument is not a class
+            if not issubclass(self.exception, Exception):
+                raise TypeError
+        except TypeError:
+            raise OptionError('excclass option is not an exception class')
+
+    def filter(self, lexer, stream):
+        for ttype, value in stream:
+            if ttype is Error:
+                raise self.exception(value)
+            yield ttype, value
+
+
+class VisibleWhitespaceFilter(Filter):
+    """Convert tabs, newlines and/or spaces to visible characters.
+
+    Options accepted:
+
+    `spaces` : string or bool
+      If this is a one-character string, spaces will be replaces by this string.
+      If it is another true value, spaces will be replaced by ``·`` (unicode
+      MIDDLE DOT).  If it is a false value, spaces will not be replaced.  The
+      default is ``False``.
+    `tabs` : string or bool
+      The same as for `spaces`, but the default replacement character is ``»``
+      (unicode RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK).  The default value
+      is ``False``.  Note: this will not work if the `tabsize` option for the
+      lexer is nonzero, as tabs will already have been expanded then.
+    `tabsize` : int
+      If tabs are to be replaced by this filter (see the `tabs` option), this
+      is the total number of characters that a tab should be expanded to.
+      The default is ``8``.
+    `newlines` : string or bool
+      The same as for `spaces`, but the default replacement character is ``¶``
+      (unicode PILCROW SIGN).  The default value is ``False``.
+    `wstokentype` : bool
+      If true, give whitespace the special `Whitespace` token type.  This allows
+      styling the visible whitespace differently (e.g. greyed out), but it can
+      disrupt background colors.  The default is ``True``.
+
+    .. versionadded:: 0.8
+    """
+
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        for name, default in [('spaces',   '·'),
+                              ('tabs',     '»'),
+                              ('newlines', '¶')]:
+            opt = options.get(name, False)
+            if isinstance(opt, str) and len(opt) == 1:
+                setattr(self, name, opt)
+            else:
+                setattr(self, name, (opt and default or ''))
+        tabsize = get_int_opt(options, 'tabsize', 8)
+        if self.tabs:
+            self.tabs += ' ' * (tabsize - 1)
+        if self.newlines:
+            self.newlines += '\n'
+        self.wstt = get_bool_opt(options, 'wstokentype', True)
+
+    def filter(self, lexer, stream):
+        if self.wstt:
+            spaces = self.spaces or ' '
+            tabs = self.tabs or '\t'
+            newlines = self.newlines or '\n'
+            regex = re.compile(r'\s')
+
+            def replacefunc(wschar):
+                if wschar == ' ':
+                    return spaces
+                elif wschar == '\t':
+                    return tabs
+                elif wschar == '\n':
+                    return newlines
+                return wschar
+
+            for ttype, value in stream:
+                yield from _replace_special(ttype, value, regex, Whitespace,
+                                            replacefunc)
+        else:
+            spaces, tabs, newlines = self.spaces, self.tabs, self.newlines
+            # simpler processing
+            for ttype, value in stream:
+                if spaces:
+                    value = value.replace(' ', spaces)
+                if tabs:
+                    value = value.replace('\t', tabs)
+                if newlines:
+                    value = value.replace('\n', newlines)
+                yield ttype, value
+
+
+class GobbleFilter(Filter):
+    """Gobbles source code lines (eats initial characters).
+
+    This filter drops the first ``n`` characters off every line of code.  This
+    may be useful when the source code fed to the lexer is indented by a fixed
+    amount of space that isn't desired in the output.
+
+    Options accepted:
+
+    `n` : int
+       The number of characters to gobble.
+
+    .. versionadded:: 1.2
+    """
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+        self.n = get_int_opt(options, 'n', 0)
+
+    def gobble(self, value, left):
+        if left < len(value):
+            return value[left:], 0
+        else:
+            return '', left - len(value)
+
+    def filter(self, lexer, stream):
+        n = self.n
+        left = n  # How many characters left to gobble.
+        for ttype, value in stream:
+            # Remove ``left`` tokens from first line, ``n`` from all others.
+            parts = value.split('\n')
+            (parts[0], left) = self.gobble(parts[0], left)
+            for i in range(1, len(parts)):
+                (parts[i], left) = self.gobble(parts[i], n)
+            value = '\n'.join(parts)
+
+            if value != '':
+                yield ttype, value
+
+
+class TokenMergeFilter(Filter):
+    """Merges consecutive tokens with the same token type in the output
+    stream of a lexer.
+
+    .. versionadded:: 1.2
+    """
+    def __init__(self, **options):
+        Filter.__init__(self, **options)
+
+    def filter(self, lexer, stream):
+        current_type = None
+        current_value = None
+        for ttype, value in stream:
+            if ttype is current_type:
+                current_value += value
+            else:
+                if current_type is not None:
+                    yield current_type, current_value
+                current_type = ttype
+                current_value = value
+        if current_type is not None:
+            yield current_type, current_value
+
+
+FILTERS = {
+    'codetagify':     CodeTagFilter,
+    'keywordcase':    KeywordCaseFilter,
+    'highlight':      NameHighlightFilter,
+    'raiseonerror':   RaiseOnErrorTokenFilter,
+    'whitespace':     VisibleWhitespaceFilter,
+    'gobble':         GobbleFilter,
+    'tokenmerge':     TokenMergeFilter,
+    'symbols':        SymbolFilter,
+}
diff --git a/.venv/Lib/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..286ef93
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatter.py b/.venv/Lib/site-packages/pygments/formatter.py
new file mode 100644 (file)
index 0000000..a20d303
--- /dev/null
@@ -0,0 +1,129 @@
+"""
+    pygments.formatter
+    ~~~~~~~~~~~~~~~~~~
+
+    Base formatter class.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import codecs
+
+from pygments.util import get_bool_opt
+from pygments.styles import get_style_by_name
+
+__all__ = ['Formatter']
+
+
+def _lookup_style(style):
+    if isinstance(style, str):
+        return get_style_by_name(style)
+    return style
+
+
+class Formatter:
+    """
+    Converts a token stream to text.
+
+    Formatters should have attributes to help selecting them. These
+    are similar to the corresponding :class:`~pygments.lexer.Lexer`
+    attributes.
+
+    .. autoattribute:: name
+       :no-value:
+
+    .. autoattribute:: aliases
+       :no-value:
+
+    .. autoattribute:: filenames
+       :no-value:
+
+    You can pass options as keyword arguments to the constructor.
+    All formatters accept these basic options:
+
+    ``style``
+        The style to use, can be a string or a Style subclass
+        (default: "default"). Not used by e.g. the
+        TerminalFormatter.
+    ``full``
+        Tells the formatter to output a "full" document, i.e.
+        a complete self-contained document. This doesn't have
+        any effect for some formatters (default: false).
+    ``title``
+        If ``full`` is true, the title that should be used to
+        caption the document (default: '').
+    ``encoding``
+        If given, must be an encoding name. This will be used to
+        convert the Unicode token strings to byte strings in the
+        output. If it is "" or None, Unicode strings will be written
+        to the output file, which most file-like objects do not
+        support (default: None).
+    ``outencoding``
+        Overrides ``encoding`` if given.
+
+    """
+
+    #: Full name for the formatter, in human-readable form.
+    name = None
+
+    #: A list of short, unique identifiers that can be used to lookup
+    #: the formatter from a list, e.g. using :func:`.get_formatter_by_name()`.
+    aliases = []
+
+    #: A list of fnmatch patterns that match filenames for which this
+    #: formatter can produce output. The patterns in this list should be unique
+    #: among all formatters.
+    filenames = []
+
+    #: If True, this formatter outputs Unicode strings when no encoding
+    #: option is given.
+    unicodeoutput = True
+
+    def __init__(self, **options):
+        """
+        As with lexers, this constructor takes arbitrary optional arguments,
+        and if you override it, you should first process your own options, then
+        call the base class implementation.
+        """
+        self.style = _lookup_style(options.get('style', 'default'))
+        self.full = get_bool_opt(options, 'full', False)
+        self.title = options.get('title', '')
+        self.encoding = options.get('encoding', None) or None
+        if self.encoding in ('guess', 'chardet'):
+            # can happen for e.g. pygmentize -O encoding=guess
+            self.encoding = 'utf-8'
+        self.encoding = options.get('outencoding') or self.encoding
+        self.options = options
+
+    def get_style_defs(self, arg=''):
+        """
+        This method must return statements or declarations suitable to define
+        the current style for subsequent highlighted text (e.g. CSS classes
+        in the `HTMLFormatter`).
+
+        The optional argument `arg` can be used to modify the generation and
+        is formatter dependent (it is standardized because it can be given on
+        the command line).
+
+        This method is called by the ``-S`` :doc:`command-line option <cmdline>`,
+        the `arg` is then given by the ``-a`` option.
+        """
+        return ''
+
+    def format(self, tokensource, outfile):
+        """
+        This method must format the tokens from the `tokensource` iterable and
+        write the formatted version to the file object `outfile`.
+
+        Formatter options can control how exactly the tokens are converted.
+        """
+        if self.encoding:
+            # wrap the outfile in a StreamWriter
+            outfile = codecs.lookup(self.encoding)[3](outfile)
+        return self.format_unencoded(tokensource, outfile)
+
+    # Allow writing Formatter[str] or Formatter[bytes]. That's equivalent to
+    # Formatter. This helps when using third-party type stubs from typeshed.
+    def __class_getitem__(cls, name):
+        return cls
diff --git a/.venv/Lib/site-packages/pygments/formatters/__init__.py b/.venv/Lib/site-packages/pygments/formatters/__init__.py
new file mode 100644 (file)
index 0000000..b24931c
--- /dev/null
@@ -0,0 +1,157 @@
+"""
+    pygments.formatters
+    ~~~~~~~~~~~~~~~~~~~
+
+    Pygments formatters.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+import sys
+import types
+import fnmatch
+from os.path import basename
+
+from pygments.formatters._mapping import FORMATTERS
+from pygments.plugin import find_plugin_formatters
+from pygments.util import ClassNotFound
+
+__all__ = ['get_formatter_by_name', 'get_formatter_for_filename',
+           'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS)
+
+_formatter_cache = {}  # classes by name
+_pattern_cache = {}
+
+
+def _fn_matches(fn, glob):
+    """Return whether the supplied file name fn matches pattern filename."""
+    if glob not in _pattern_cache:
+        pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob))
+        return pattern.match(fn)
+    return _pattern_cache[glob].match(fn)
+
+
+def _load_formatters(module_name):
+    """Load a formatter (and all others in the module too)."""
+    mod = __import__(module_name, None, None, ['__all__'])
+    for formatter_name in mod.__all__:
+        cls = getattr(mod, formatter_name)
+        _formatter_cache[cls.name] = cls
+
+
+def get_all_formatters():
+    """Return a generator for all formatter classes."""
+    # NB: this returns formatter classes, not info like get_all_lexers().
+    for info in FORMATTERS.values():
+        if info[1] not in _formatter_cache:
+            _load_formatters(info[0])
+        yield _formatter_cache[info[1]]
+    for _, formatter in find_plugin_formatters():
+        yield formatter
+
+
+def find_formatter_class(alias):
+    """Lookup a formatter by alias.
+
+    Returns None if not found.
+    """
+    for module_name, name, aliases, _, _ in FORMATTERS.values():
+        if alias in aliases:
+            if name not in _formatter_cache:
+                _load_formatters(module_name)
+            return _formatter_cache[name]
+    for _, cls in find_plugin_formatters():
+        if alias in cls.aliases:
+            return cls
+
+
+def get_formatter_by_name(_alias, **options):
+    """
+    Return an instance of a :class:`.Formatter` subclass that has `alias` in its
+    aliases list. The formatter is given the `options` at its instantiation.
+
+    Will raise :exc:`pygments.util.ClassNotFound` if no formatter with that
+    alias is found.
+    """
+    cls = find_formatter_class(_alias)
+    if cls is None:
+        raise ClassNotFound(f"no formatter found for name {_alias!r}")
+    return cls(**options)
+
+
+def load_formatter_from_file(filename, formattername="CustomFormatter", **options):
+    """
+    Return a `Formatter` subclass instance loaded from the provided file, relative
+    to the current directory.
+
+    The file is expected to contain a Formatter class named ``formattername``
+    (by default, CustomFormatter). Users should be very careful with the input, because
+    this method is equivalent to running ``eval()`` on the input file. The formatter is
+    given the `options` at its instantiation.
+
+    :exc:`pygments.util.ClassNotFound` is raised if there are any errors loading
+    the formatter.
+
+    .. versionadded:: 2.2
+    """
+    try:
+        # This empty dict will contain the namespace for the exec'd file
+        custom_namespace = {}
+        with open(filename, 'rb') as f:
+            exec(f.read(), custom_namespace)
+        # Retrieve the class `formattername` from that namespace
+        if formattername not in custom_namespace:
+            raise ClassNotFound(f'no valid {formattername} class found in {filename}')
+        formatter_class = custom_namespace[formattername]
+        # And finally instantiate it with the options
+        return formatter_class(**options)
+    except OSError as err:
+        raise ClassNotFound(f'cannot read {filename}: {err}')
+    except ClassNotFound:
+        raise
+    except Exception as err:
+        raise ClassNotFound(f'error when loading custom formatter: {err}')
+
+
+def get_formatter_for_filename(fn, **options):
+    """
+    Return a :class:`.Formatter` subclass instance that has a filename pattern
+    matching `fn`. The formatter is given the `options` at its instantiation.
+
+    Will raise :exc:`pygments.util.ClassNotFound` if no formatter for that filename
+    is found.
+    """
+    fn = basename(fn)
+    for modname, name, _, filenames, _ in FORMATTERS.values():
+        for filename in filenames:
+            if _fn_matches(fn, filename):
+                if name not in _formatter_cache:
+                    _load_formatters(modname)
+                return _formatter_cache[name](**options)
+    for _name, cls in find_plugin_formatters():
+        for filename in cls.filenames:
+            if _fn_matches(fn, filename):
+                return cls(**options)
+    raise ClassNotFound(f"no formatter found for file name {fn!r}")
+
+
+class _automodule(types.ModuleType):
+    """Automatically import formatters."""
+
+    def __getattr__(self, name):
+        info = FORMATTERS.get(name)
+        if info:
+            _load_formatters(info[0])
+            cls = _formatter_cache[info[1]]
+            setattr(self, name, cls)
+            return cls
+        raise AttributeError(name)
+
+
+oldmod = sys.modules[__name__]
+newmod = _automodule(__name__)
+newmod.__dict__.update(oldmod.__dict__)
+sys.modules[__name__] = newmod
+del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4efb411
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/_mapping.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/_mapping.cpython-312.pyc
new file mode 100644 (file)
index 0000000..fb31946
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/_mapping.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/bbcode.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/bbcode.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c33f75d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/bbcode.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/groff.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/groff.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6667df0
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/groff.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4897d0a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/img.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/img.cpython-312.pyc
new file mode 100644 (file)
index 0000000..235d4ee
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/img.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/irc.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/irc.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e5d3124
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/irc.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/latex.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/latex.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3b71fa8
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/latex.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/other.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/other.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0ea5dde
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/other.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5b8997e
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/rtf.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/rtf.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ca29373
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/rtf.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/svg.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/svg.cpython-312.pyc
new file mode 100644 (file)
index 0000000..792aa66
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/svg.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/terminal.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/terminal.cpython-312.pyc
new file mode 100644 (file)
index 0000000..95a26c5
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/terminal.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/__pycache__/terminal256.cpython-312.pyc b/.venv/Lib/site-packages/pygments/formatters/__pycache__/terminal256.cpython-312.pyc
new file mode 100644 (file)
index 0000000..97fef08
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/formatters/__pycache__/terminal256.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/formatters/_mapping.py b/.venv/Lib/site-packages/pygments/formatters/_mapping.py
new file mode 100644 (file)
index 0000000..72ca840
--- /dev/null
@@ -0,0 +1,23 @@
+# Automatically generated by scripts/gen_mapfiles.py.
+# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead.
+
+FORMATTERS = {
+    'BBCodeFormatter': ('pygments.formatters.bbcode', 'BBCode', ('bbcode', 'bb'), (), 'Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there.'),
+    'BmpImageFormatter': ('pygments.formatters.img', 'img_bmp', ('bmp', 'bitmap'), ('*.bmp',), 'Create a bitmap image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'),
+    'GifImageFormatter': ('pygments.formatters.img', 'img_gif', ('gif',), ('*.gif',), 'Create a GIF image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'),
+    'GroffFormatter': ('pygments.formatters.groff', 'groff', ('groff', 'troff', 'roff'), (), 'Format tokens with groff escapes to change their color and font style.'),
+    'HtmlFormatter': ('pygments.formatters.html', 'HTML', ('html',), ('*.html', '*.htm'), "Format tokens as HTML 4 ``<span>`` tags. By default, the content is enclosed in a ``<pre>`` tag, itself wrapped in a ``<div>`` tag (but see the `nowrap` option). The ``<div>``'s CSS class can be set by the `cssclass` option."),
+    'IRCFormatter': ('pygments.formatters.irc', 'IRC', ('irc', 'IRC'), (), 'Format tokens with IRC color sequences'),
+    'ImageFormatter': ('pygments.formatters.img', 'img', ('img', 'IMG', 'png'), ('*.png',), 'Create a PNG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'),
+    'JpgImageFormatter': ('pygments.formatters.img', 'img_jpg', ('jpg', 'jpeg'), ('*.jpg',), 'Create a JPEG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'),
+    'LatexFormatter': ('pygments.formatters.latex', 'LaTeX', ('latex', 'tex'), ('*.tex',), 'Format tokens as LaTeX code. This needs the `fancyvrb` and `color` standard packages.'),
+    'NullFormatter': ('pygments.formatters.other', 'Text only', ('text', 'null'), ('*.txt',), 'Output the text unchanged without any formatting.'),
+    'PangoMarkupFormatter': ('pygments.formatters.pangomarkup', 'Pango Markup', ('pango', 'pangomarkup'), (), 'Format tokens as Pango Markup code. It can then be rendered to an SVG.'),
+    'RawTokenFormatter': ('pygments.formatters.other', 'Raw tokens', ('raw', 'tokens'), ('*.raw',), 'Format tokens as a raw representation for storing token streams.'),
+    'RtfFormatter': ('pygments.formatters.rtf', 'RTF', ('rtf',), ('*.rtf',), 'Format tokens as RTF markup. This formatter automatically outputs full RTF documents with color information and other useful stuff. Perfect for Copy and Paste into Microsoft(R) Word(R) documents.'),
+    'SvgFormatter': ('pygments.formatters.svg', 'SVG', ('svg',), ('*.svg',), 'Format tokens as an SVG graphics file.  This formatter is still experimental. Each line of code is a ``<text>`` element with explicit ``x`` and ``y`` coordinates containing ``<tspan>`` elements with the individual token styles.'),
+    'Terminal256Formatter': ('pygments.formatters.terminal256', 'Terminal256', ('terminal256', 'console256', '256'), (), 'Format tokens with ANSI color sequences, for output in a 256-color terminal or console.  Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'),
+    'TerminalFormatter': ('pygments.formatters.terminal', 'Terminal', ('terminal', 'console'), (), 'Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly.'),
+    'TerminalTrueColorFormatter': ('pygments.formatters.terminal256', 'TerminalTrueColor', ('terminal16m', 'console16m', '16m'), (), 'Format tokens with ANSI color sequences, for output in a true-color terminal or console.  Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'),
+    'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.'),
+}
diff --git a/.venv/Lib/site-packages/pygments/formatters/bbcode.py b/.venv/Lib/site-packages/pygments/formatters/bbcode.py
new file mode 100644 (file)
index 0000000..339edf9
--- /dev/null
@@ -0,0 +1,108 @@
+"""
+    pygments.formatters.bbcode
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    BBcode formatter.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+from pygments.formatter import Formatter
+from pygments.util import get_bool_opt
+
+__all__ = ['BBCodeFormatter']
+
+
+class BBCodeFormatter(Formatter):
+    """
+    Format tokens with BBcodes. These formatting codes are used by many
+    bulletin boards, so you can highlight your sourcecode with pygments before
+    posting it there.
+
+    This formatter has no support for background colors and borders, as there
+    are no common BBcode tags for that.
+
+    Some board systems (e.g. phpBB) don't support colors in their [code] tag,
+    so you can't use the highlighting together with that tag.
+    Text in a [code] tag usually is shown with a monospace font (which this
+    formatter can do with the ``monofont`` option) and no spaces (which you
+    need for indentation) are removed.
+
+    Additional options accepted:
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+
+    `codetag`
+        If set to true, put the output into ``[code]`` tags (default:
+        ``false``)
+
+    `monofont`
+        If set to true, add a tag to show the code with a monospace font
+        (default: ``false``).
+    """
+    name = 'BBCode'
+    aliases = ['bbcode', 'bb']
+    filenames = []
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self._code = get_bool_opt(options, 'codetag', False)
+        self._mono = get_bool_opt(options, 'monofont', False)
+
+        self.styles = {}
+        self._make_styles()
+
+    def _make_styles(self):
+        for ttype, ndef in self.style:
+            start = end = ''
+            if ndef['color']:
+                start += '[color=#{}]'.format(ndef['color'])
+                end = '[/color]' + end
+            if ndef['bold']:
+                start += '[b]'
+                end = '[/b]' + end
+            if ndef['italic']:
+                start += '[i]'
+                end = '[/i]' + end
+            if ndef['underline']:
+                start += '[u]'
+                end = '[/u]' + end
+            # there are no common BBcodes for background-color and border
+
+            self.styles[ttype] = start, end
+
+    def format_unencoded(self, tokensource, outfile):
+        if self._code:
+            outfile.write('[code]')
+        if self._mono:
+            outfile.write('[font=monospace]')
+
+        lastval = ''
+        lasttype = None
+
+        for ttype, value in tokensource:
+            while ttype not in self.styles:
+                ttype = ttype.parent
+            if ttype == lasttype:
+                lastval += value
+            else:
+                if lastval:
+                    start, end = self.styles[lasttype]
+                    outfile.write(''.join((start, lastval, end)))
+                lastval = value
+                lasttype = ttype
+
+        if lastval:
+            start, end = self.styles[lasttype]
+            outfile.write(''.join((start, lastval, end)))
+
+        if self._mono:
+            outfile.write('[/font]')
+        if self._code:
+            outfile.write('[/code]')
+        if self._code or self._mono:
+            outfile.write('\n')
diff --git a/.venv/Lib/site-packages/pygments/formatters/groff.py b/.venv/Lib/site-packages/pygments/formatters/groff.py
new file mode 100644 (file)
index 0000000..028fec4
--- /dev/null
@@ -0,0 +1,170 @@
+"""
+    pygments.formatters.groff
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for groff output.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import math
+from pygments.formatter import Formatter
+from pygments.util import get_bool_opt, get_int_opt
+
+__all__ = ['GroffFormatter']
+
+
+class GroffFormatter(Formatter):
+    """
+    Format tokens with groff escapes to change their color and font style.
+
+    .. versionadded:: 2.11
+
+    Additional options accepted:
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+
+    `monospaced`
+        If set to true, monospace font will be used (default: ``true``).
+
+    `linenos`
+        If set to true, print the line numbers (default: ``false``).
+
+    `wrap`
+        Wrap lines to the specified number of characters. Disabled if set to 0
+        (default: ``0``).
+    """
+
+    name = 'groff'
+    aliases = ['groff','troff','roff']
+    filenames = []
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+
+        self.monospaced = get_bool_opt(options, 'monospaced', True)
+        self.linenos = get_bool_opt(options, 'linenos', False)
+        self._lineno = 0
+        self.wrap = get_int_opt(options, 'wrap', 0)
+        self._linelen = 0
+
+        self.styles = {}
+        self._make_styles()
+
+
+    def _make_styles(self):
+        regular = '\\f[CR]' if self.monospaced else '\\f[R]'
+        bold = '\\f[CB]' if self.monospaced else '\\f[B]'
+        italic = '\\f[CI]' if self.monospaced else '\\f[I]'
+
+        for ttype, ndef in self.style:
+            start = end = ''
+            if ndef['color']:
+                start += '\\m[{}]'.format(ndef['color'])
+                end = '\\m[]' + end
+            if ndef['bold']:
+                start += bold
+                end = regular + end
+            if ndef['italic']:
+                start += italic
+                end = regular + end
+            if ndef['bgcolor']:
+                start += '\\M[{}]'.format(ndef['bgcolor'])
+                end = '\\M[]' + end
+
+            self.styles[ttype] = start, end
+
+
+    def _define_colors(self, outfile):
+        colors = set()
+        for _, ndef in self.style:
+            if ndef['color'] is not None:
+                colors.add(ndef['color'])
+
+        for color in sorted(colors):
+            outfile.write('.defcolor ' + color + ' rgb #' + color + '\n')
+
+
+    def _write_lineno(self, outfile):
+        self._lineno += 1
+        outfile.write("%s% 4d " % (self._lineno != 1 and '\n' or '', self._lineno))
+
+
+    def _wrap_line(self, line):
+        length = len(line.rstrip('\n'))
+        space = '     ' if self.linenos else ''
+        newline = ''
+
+        if length > self.wrap:
+            for i in range(0, math.floor(length / self.wrap)):
+                chunk = line[i*self.wrap:i*self.wrap+self.wrap]
+                newline += (chunk + '\n' + space)
+            remainder = length % self.wrap
+            if remainder > 0:
+                newline += line[-remainder-1:]
+                self._linelen = remainder
+        elif self._linelen + length > self.wrap:
+            newline = ('\n' + space) + line
+            self._linelen = length
+        else:
+            newline = line
+            self._linelen += length
+
+        return newline
+
+
+    def _escape_chars(self, text):
+        text = text.replace('\\', '\\[u005C]'). \
+                    replace('.', '\\[char46]'). \
+                    replace('\'', '\\[u0027]'). \
+                    replace('`', '\\[u0060]'). \
+                    replace('~', '\\[u007E]')
+        copy = text
+
+        for char in copy:
+            if len(char) != len(char.encode()):
+                uni = char.encode('unicode_escape') \
+                    .decode()[1:] \
+                    .replace('x', 'u00') \
+                    .upper()
+                text = text.replace(char, '\\[u' + uni[1:] + ']')
+
+        return text
+
+
+    def format_unencoded(self, tokensource, outfile):
+        self._define_colors(outfile)
+
+        outfile.write('.nf\n\\f[CR]\n')
+
+        if self.linenos:
+            self._write_lineno(outfile)
+
+        for ttype, value in tokensource:
+            while ttype not in self.styles:
+                ttype = ttype.parent
+            start, end = self.styles[ttype]
+
+            for line in value.splitlines(True):
+                if self.wrap > 0:
+                    line = self._wrap_line(line)
+
+                if start and end:
+                    text = self._escape_chars(line.rstrip('\n'))
+                    if text != '':
+                        outfile.write(''.join((start, text, end)))
+                else:
+                    outfile.write(self._escape_chars(line.rstrip('\n')))
+
+                if line.endswith('\n'):
+                    if self.linenos:
+                        self._write_lineno(outfile)
+                        self._linelen = 0
+                    else:
+                        outfile.write('\n')
+                        self._linelen = 0
+
+        outfile.write('\n.fi')
diff --git a/.venv/Lib/site-packages/pygments/formatters/html.py b/.venv/Lib/site-packages/pygments/formatters/html.py
new file mode 100644 (file)
index 0000000..4ef1836
--- /dev/null
@@ -0,0 +1,995 @@
+"""
+    pygments.formatters.html
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for HTML output.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import functools
+import os
+import sys
+import os.path
+from io import StringIO
+
+from pygments.formatter import Formatter
+from pygments.token import Token, Text, STANDARD_TYPES
+from pygments.util import get_bool_opt, get_int_opt, get_list_opt
+
+try:
+    import ctags
+except ImportError:
+    ctags = None
+
+__all__ = ['HtmlFormatter']
+
+
+_escape_html_table = {
+    ord('&'): '&amp;',
+    ord('<'): '&lt;',
+    ord('>'): '&gt;',
+    ord('"'): '&quot;',
+    ord("'"): '&#39;',
+}
+
+
+def escape_html(text, table=_escape_html_table):
+    """Escape &, <, > as well as single and double quotes for HTML."""
+    return text.translate(table)
+
+
+def webify(color):
+    if color.startswith('calc') or color.startswith('var'):
+        return color
+    else:
+        # Check if the color can be shortened from 6 to 3 characters
+        color = color.upper()
+        if (len(color) == 6 and
+            (    color[0] == color[1]
+             and color[2] == color[3]
+             and color[4] == color[5])):
+            return f'#{color[0]}{color[2]}{color[4]}'
+        else:
+            return f'#{color}'
+
+
+def _get_ttype_class(ttype):
+    fname = STANDARD_TYPES.get(ttype)
+    if fname:
+        return fname
+    aname = ''
+    while fname is None:
+        aname = '-' + ttype[-1] + aname
+        ttype = ttype.parent
+        fname = STANDARD_TYPES.get(ttype)
+    return fname + aname
+
+
+CSSFILE_TEMPLATE = '''\
+/*
+generated by Pygments <https://pygments.org/>
+Copyright 2006-2025 by the Pygments team.
+Licensed under the BSD license, see LICENSE for details.
+*/
+%(styledefs)s
+'''
+
+DOC_HEADER = '''\
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+<!--
+generated by Pygments <https://pygments.org/>
+Copyright 2006-2025 by the Pygments team.
+Licensed under the BSD license, see LICENSE for details.
+-->
+<html>
+<head>
+  <title>%(title)s</title>
+  <meta http-equiv="content-type" content="text/html; charset=%(encoding)s">
+  <style type="text/css">
+''' + CSSFILE_TEMPLATE + '''
+  </style>
+</head>
+<body>
+<h2>%(title)s</h2>
+
+'''
+
+DOC_HEADER_EXTERNALCSS = '''\
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+
+<html>
+<head>
+  <title>%(title)s</title>
+  <meta http-equiv="content-type" content="text/html; charset=%(encoding)s">
+  <link rel="stylesheet" href="%(cssfile)s" type="text/css">
+</head>
+<body>
+<h2>%(title)s</h2>
+
+'''
+
+DOC_FOOTER = '''\
+</body>
+</html>
+'''
+
+
+class HtmlFormatter(Formatter):
+    r"""
+    Format tokens as HTML 4 ``<span>`` tags. By default, the content is enclosed
+    in a ``<pre>`` tag, itself wrapped in a ``<div>`` tag (but see the `nowrap` option).
+    The ``<div>``'s CSS class can be set by the `cssclass` option.
+
+    If the `linenos` option is set to ``"table"``, the ``<pre>`` is
+    additionally wrapped inside a ``<table>`` which has one row and two
+    cells: one containing the line numbers and one containing the code.
+    Example:
+
+    .. sourcecode:: html
+
+        <div class="highlight" >
+        <table><tr>
+          <td class="linenos" title="click to toggle"
+            onclick="with (this.firstChild.style)
+                     { display = (display == '') ? 'none' : '' }">
+            <pre>1
+            2</pre>
+          </td>
+          <td class="code">
+            <pre><span class="Ke">def </span><span class="NaFu">foo</span>(bar):
+              <span class="Ke">pass</span>
+            </pre>
+          </td>
+        </tr></table></div>
+
+    (whitespace added to improve clarity).
+
+    A list of lines can be specified using the `hl_lines` option to make these
+    lines highlighted (as of Pygments 0.11).
+
+    With the `full` option, a complete HTML 4 document is output, including
+    the style definitions inside a ``<style>`` tag, or in a separate file if
+    the `cssfile` option is given.
+
+    When `tagsfile` is set to the path of a ctags index file, it is used to
+    generate hyperlinks from names to their definition.  You must enable
+    `lineanchors` and run ctags with the `-n` option for this to work.  The
+    `python-ctags` module from PyPI must be installed to use this feature;
+    otherwise a `RuntimeError` will be raised.
+
+    The `get_style_defs(arg='')` method of a `HtmlFormatter` returns a string
+    containing CSS rules for the CSS classes used by the formatter. The
+    argument `arg` can be used to specify additional CSS selectors that
+    are prepended to the classes. A call `fmter.get_style_defs('td .code')`
+    would result in the following CSS classes:
+
+    .. sourcecode:: css
+
+        td .code .kw { font-weight: bold; color: #00FF00 }
+        td .code .cm { color: #999999 }
+        ...
+
+    If you have Pygments 0.6 or higher, you can also pass a list or tuple to the
+    `get_style_defs()` method to request multiple prefixes for the tokens:
+
+    .. sourcecode:: python
+
+        formatter.get_style_defs(['div.syntax pre', 'pre.syntax'])
+
+    The output would then look like this:
+
+    .. sourcecode:: css
+
+        div.syntax pre .kw,
+        pre.syntax .kw { font-weight: bold; color: #00FF00 }
+        div.syntax pre .cm,
+        pre.syntax .cm { color: #999999 }
+        ...
+
+    Additional options accepted:
+
+    `nowrap`
+        If set to ``True``, don't add a ``<pre>`` and a ``<div>`` tag
+        around the tokens. This disables most other options (default: ``False``).
+
+    `full`
+        Tells the formatter to output a "full" document, i.e. a complete
+        self-contained document (default: ``False``).
+
+    `title`
+        If `full` is true, the title that should be used to caption the
+        document (default: ``''``).
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``). This option has no effect if the `cssfile`
+        and `noclobber_cssfile` option are given and the file specified in
+        `cssfile` exists.
+
+    `noclasses`
+        If set to true, token ``<span>`` tags (as well as line number elements)
+        will not use CSS classes, but inline styles. This is not recommended
+        for larger pieces of code since it increases output size by quite a bit
+        (default: ``False``).
+
+    `classprefix`
+        Since the token types use relatively short class names, they may clash
+        with some of your own class names. In this case you can use the
+        `classprefix` option to give a string to prepend to all Pygments-generated
+        CSS class names for token types.
+        Note that this option also affects the output of `get_style_defs()`.
+
+    `cssclass`
+        CSS class for the wrapping ``<div>`` tag (default: ``'highlight'``).
+        If you set this option, the default selector for `get_style_defs()`
+        will be this class.
+
+        .. versionadded:: 0.9
+           If you select the ``'table'`` line numbers, the wrapping table will
+           have a CSS class of this string plus ``'table'``, the default is
+           accordingly ``'highlighttable'``.
+
+    `cssstyles`
+        Inline CSS styles for the wrapping ``<div>`` tag (default: ``''``).
+
+    `prestyles`
+        Inline CSS styles for the ``<pre>`` tag (default: ``''``).
+
+        .. versionadded:: 0.11
+
+    `cssfile`
+        If the `full` option is true and this option is given, it must be the
+        name of an external file. If the filename does not include an absolute
+        path, the file's path will be assumed to be relative to the main output
+        file's path, if the latter can be found. The stylesheet is then written
+        to this file instead of the HTML file.
+
+        .. versionadded:: 0.6
+
+    `noclobber_cssfile`
+        If `cssfile` is given and the specified file exists, the css file will
+        not be overwritten. This allows the use of the `full` option in
+        combination with a user specified css file. Default is ``False``.
+
+        .. versionadded:: 1.1
+
+    `linenos`
+        If set to ``'table'``, output line numbers as a table with two cells,
+        one containing the line numbers, the other the whole code.  This is
+        copy-and-paste-friendly, but may cause alignment problems with some
+        browsers or fonts.  If set to ``'inline'``, the line numbers will be
+        integrated in the ``<pre>`` tag that contains the code (that setting
+        is *new in Pygments 0.8*).
+
+        For compatibility with Pygments 0.7 and earlier, every true value
+        except ``'inline'`` means the same as ``'table'`` (in particular, that
+        means also ``True``).
+
+        The default value is ``False``, which means no line numbers at all.
+
+        **Note:** with the default ("table") line number mechanism, the line
+        numbers and code can have different line heights in Internet Explorer
+        unless you give the enclosing ``<pre>`` tags an explicit ``line-height``
+        CSS property (you get the default line spacing with ``line-height:
+        125%``).
+
+    `hl_lines`
+        Specify a list of lines to be highlighted. The line numbers are always
+        relative to the input (i.e. the first line is line 1) and are
+        independent of `linenostart`.
+
+        .. versionadded:: 0.11
+
+    `linenostart`
+        The line number for the first line (default: ``1``).
+
+    `linenostep`
+        If set to a number n > 1, only every nth line number is printed.
+
+    `linenospecial`
+        If set to a number n > 0, every nth line number is given the CSS
+        class ``"special"`` (default: ``0``).
+
+    `nobackground`
+        If set to ``True``, the formatter won't output the background color
+        for the wrapping element (this automatically defaults to ``False``
+        when there is no wrapping element [eg: no argument for the
+        `get_syntax_defs` method given]) (default: ``False``).
+
+        .. versionadded:: 0.6
+
+    `lineseparator`
+        This string is output between lines of code. It defaults to ``"\n"``,
+        which is enough to break a line inside ``<pre>`` tags, but you can
+        e.g. set it to ``"<br>"`` to get HTML line breaks.
+
+        .. versionadded:: 0.7
+
+    `lineanchors`
+        If set to a nonempty string, e.g. ``foo``, the formatter will wrap each
+        output line in an anchor tag with an ``id`` (and `name`) of ``foo-linenumber``.
+        This allows easy linking to certain lines.
+
+        .. versionadded:: 0.9
+
+    `linespans`
+        If set to a nonempty string, e.g. ``foo``, the formatter will wrap each
+        output line in a span tag with an ``id`` of ``foo-linenumber``.
+        This allows easy access to lines via javascript.
+
+        .. versionadded:: 1.6
+
+    `anchorlinenos`
+        If set to `True`, will wrap line numbers in <a> tags. Used in
+        combination with `linenos` and `lineanchors`.
+
+    `tagsfile`
+        If set to the path of a ctags file, wrap names in anchor tags that
+        link to their definitions. `lineanchors` should be used, and the
+        tags file should specify line numbers (see the `-n` option to ctags).
+        The tags file is assumed to be encoded in UTF-8.
+
+        .. versionadded:: 1.6
+
+    `tagurlformat`
+        A string formatting pattern used to generate links to ctags definitions.
+        Available variables are `%(path)s`, `%(fname)s` and `%(fext)s`.
+        Defaults to an empty string, resulting in just `#prefix-number` links.
+
+        .. versionadded:: 1.6
+
+    `filename`
+        A string used to generate a filename when rendering ``<pre>`` blocks,
+        for example if displaying source code. If `linenos` is set to
+        ``'table'`` then the filename will be rendered in an initial row
+        containing a single `<th>` which spans both columns.
+
+        .. versionadded:: 2.1
+
+    `wrapcode`
+        Wrap the code inside ``<pre>`` blocks using ``<code>``, as recommended
+        by the HTML5 specification.
+
+        .. versionadded:: 2.4
+
+    `debug_token_types`
+        Add ``title`` attributes to all token ``<span>`` tags that show the
+        name of the token.
+
+        .. versionadded:: 2.10
+
+
+    **Subclassing the HTML formatter**
+
+    .. versionadded:: 0.7
+
+    The HTML formatter is now built in a way that allows easy subclassing, thus
+    customizing the output HTML code. The `format()` method calls
+    `self._format_lines()` which returns a generator that yields tuples of ``(1,
+    line)``, where the ``1`` indicates that the ``line`` is a line of the
+    formatted source code.
+
+    If the `nowrap` option is set, the generator is the iterated over and the
+    resulting HTML is output.
+
+    Otherwise, `format()` calls `self.wrap()`, which wraps the generator with
+    other generators. These may add some HTML code to the one generated by
+    `_format_lines()`, either by modifying the lines generated by the latter,
+    then yielding them again with ``(1, line)``, and/or by yielding other HTML
+    code before or after the lines, with ``(0, html)``. The distinction between
+    source lines and other code makes it possible to wrap the generator multiple
+    times.
+
+    The default `wrap()` implementation adds a ``<div>`` and a ``<pre>`` tag.
+
+    A custom `HtmlFormatter` subclass could look like this:
+
+    .. sourcecode:: python
+
+        class CodeHtmlFormatter(HtmlFormatter):
+
+            def wrap(self, source, *, include_div):
+                return self._wrap_code(source)
+
+            def _wrap_code(self, source):
+                yield 0, '<code>'
+                for i, t in source:
+                    if i == 1:
+                        # it's a line of formatted code
+                        t += '<br>'
+                    yield i, t
+                yield 0, '</code>'
+
+    This results in wrapping the formatted lines with a ``<code>`` tag, where the
+    source lines are broken using ``<br>`` tags.
+
+    After calling `wrap()`, the `format()` method also adds the "line numbers"
+    and/or "full document" wrappers if the respective options are set. Then, all
+    HTML yielded by the wrapped generator is output.
+    """
+
+    name = 'HTML'
+    aliases = ['html']
+    filenames = ['*.html', '*.htm']
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.title = self._decodeifneeded(self.title)
+        self.nowrap = get_bool_opt(options, 'nowrap', False)
+        self.noclasses = get_bool_opt(options, 'noclasses', False)
+        self.classprefix = options.get('classprefix', '')
+        self.cssclass = self._decodeifneeded(options.get('cssclass', 'highlight'))
+        self.cssstyles = self._decodeifneeded(options.get('cssstyles', ''))
+        self.prestyles = self._decodeifneeded(options.get('prestyles', ''))
+        self.cssfile = self._decodeifneeded(options.get('cssfile', ''))
+        self.noclobber_cssfile = get_bool_opt(options, 'noclobber_cssfile', False)
+        self.tagsfile = self._decodeifneeded(options.get('tagsfile', ''))
+        self.tagurlformat = self._decodeifneeded(options.get('tagurlformat', ''))
+        self.filename = self._decodeifneeded(options.get('filename', ''))
+        self.wrapcode = get_bool_opt(options, 'wrapcode', False)
+        self.span_element_openers = {}
+        self.debug_token_types = get_bool_opt(options, 'debug_token_types', False)
+
+        if self.tagsfile:
+            if not ctags:
+                raise RuntimeError('The "ctags" package must to be installed '
+                                   'to be able to use the "tagsfile" feature.')
+            self._ctags = ctags.CTags(self.tagsfile)
+
+        linenos = options.get('linenos', False)
+        if linenos == 'inline':
+            self.linenos = 2
+        elif linenos:
+            # compatibility with <= 0.7
+            self.linenos = 1
+        else:
+            self.linenos = 0
+        self.linenostart = abs(get_int_opt(options, 'linenostart', 1))
+        self.linenostep = abs(get_int_opt(options, 'linenostep', 1))
+        self.linenospecial = abs(get_int_opt(options, 'linenospecial', 0))
+        self.nobackground = get_bool_opt(options, 'nobackground', False)
+        self.lineseparator = options.get('lineseparator', '\n')
+        self.lineanchors = options.get('lineanchors', '')
+        self.linespans = options.get('linespans', '')
+        self.anchorlinenos = get_bool_opt(options, 'anchorlinenos', False)
+        self.hl_lines = set()
+        for lineno in get_list_opt(options, 'hl_lines', []):
+            try:
+                self.hl_lines.add(int(lineno))
+            except ValueError:
+                pass
+
+        self._create_stylesheet()
+
+    def _get_css_class(self, ttype):
+        """Return the css class of this token type prefixed with
+        the classprefix option."""
+        ttypeclass = _get_ttype_class(ttype)
+        if ttypeclass:
+            return self.classprefix + ttypeclass
+        return ''
+
+    def _get_css_classes(self, ttype):
+        """Return the CSS classes of this token type prefixed with the classprefix option."""
+        cls = self._get_css_class(ttype)
+        while ttype not in STANDARD_TYPES:
+            ttype = ttype.parent
+            cls = self._get_css_class(ttype) + ' ' + cls
+        return cls or ''
+
+    def _get_css_inline_styles(self, ttype):
+        """Return the inline CSS styles for this token type."""
+        cclass = self.ttype2class.get(ttype)
+        while cclass is None:
+            ttype = ttype.parent
+            cclass = self.ttype2class.get(ttype)
+        return cclass or ''
+
+    def _create_stylesheet(self):
+        t2c = self.ttype2class = {Token: ''}
+        c2s = self.class2style = {}
+        for ttype, ndef in self.style:
+            name = self._get_css_class(ttype)
+            style = ''
+            if ndef['color']:
+                style += 'color: {}; '.format(webify(ndef['color']))
+            if ndef['bold']:
+                style += 'font-weight: bold; '
+            if ndef['italic']:
+                style += 'font-style: italic; '
+            if ndef['underline']:
+                style += 'text-decoration: underline; '
+            if ndef['bgcolor']:
+                style += 'background-color: {}; '.format(webify(ndef['bgcolor']))
+            if ndef['border']:
+                style += 'border: 1px solid {}; '.format(webify(ndef['border']))
+            if style:
+                t2c[ttype] = name
+                # save len(ttype) to enable ordering the styles by
+                # hierarchy (necessary for CSS cascading rules!)
+                c2s[name] = (style[:-2], ttype, len(ttype))
+
+    def get_style_defs(self, arg=None):
+        """
+        Return CSS style definitions for the classes produced by the current
+        highlighting style. ``arg`` can be a string or list of selectors to
+        insert before the token type classes.
+        """
+        style_lines = []
+
+        style_lines.extend(self.get_linenos_style_defs())
+        style_lines.extend(self.get_background_style_defs(arg))
+        style_lines.extend(self.get_token_style_defs(arg))
+
+        return '\n'.join(style_lines)
+
+    def get_token_style_defs(self, arg=None):
+        prefix = self.get_css_prefix(arg)
+
+        styles = [
+            (level, ttype, cls, style)
+            for cls, (style, ttype, level) in self.class2style.items()
+            if cls and style
+        ]
+        styles.sort()
+
+        lines = [
+            f'{prefix(cls)} {{ {style} }} /* {repr(ttype)[6:]} */'
+            for (level, ttype, cls, style) in styles
+        ]
+
+        return lines
+
+    def get_background_style_defs(self, arg=None):
+        prefix = self.get_css_prefix(arg)
+        bg_color = self.style.background_color
+        hl_color = self.style.highlight_color
+
+        lines = []
+
+        if arg and not self.nobackground and bg_color is not None:
+            text_style = ''
+            if Text in self.ttype2class:
+                text_style = ' ' + self.class2style[self.ttype2class[Text]][0]
+            lines.insert(
+                0, '{}{{ background: {};{} }}'.format(
+                    prefix(''), bg_color, text_style
+                )
+            )
+        if hl_color is not None:
+            lines.insert(
+                0, '{} {{ background-color: {} }}'.format(prefix('hll'), hl_color)
+            )
+
+        return lines
+
+    def get_linenos_style_defs(self):
+        lines = [
+            f'pre {{ {self._pre_style} }}',
+            f'td.linenos .normal {{ {self._linenos_style} }}',
+            f'span.linenos {{ {self._linenos_style} }}',
+            f'td.linenos .special {{ {self._linenos_special_style} }}',
+            f'span.linenos.special {{ {self._linenos_special_style} }}',
+        ]
+
+        return lines
+
+    def get_css_prefix(self, arg):
+        if arg is None:
+            arg = ('cssclass' in self.options and '.'+self.cssclass or '')
+        if isinstance(arg, str):
+            args = [arg]
+        else:
+            args = list(arg)
+
+        def prefix(cls):
+            if cls:
+                cls = '.' + cls
+            tmp = []
+            for arg in args:
+                tmp.append((arg and arg + ' ' or '') + cls)
+            return ', '.join(tmp)
+
+        return prefix
+
+    @property
+    def _pre_style(self):
+        return 'line-height: 125%;'
+
+    @property
+    def _linenos_style(self):
+        color = self.style.line_number_color
+        background_color = self.style.line_number_background_color
+        return f'color: {color}; background-color: {background_color}; padding-left: 5px; padding-right: 5px;'
+
+    @property
+    def _linenos_special_style(self):
+        color = self.style.line_number_special_color
+        background_color = self.style.line_number_special_background_color
+        return f'color: {color}; background-color: {background_color}; padding-left: 5px; padding-right: 5px;'
+
+    def _decodeifneeded(self, value):
+        if isinstance(value, bytes):
+            if self.encoding:
+                return value.decode(self.encoding)
+            return value.decode()
+        return value
+
+    def _wrap_full(self, inner, outfile):
+        if self.cssfile:
+            if os.path.isabs(self.cssfile):
+                # it's an absolute filename
+                cssfilename = self.cssfile
+            else:
+                try:
+                    filename = outfile.name
+                    if not filename or filename[0] == '<':
+                        # pseudo files, e.g. name == '<fdopen>'
+                        raise AttributeError
+                    cssfilename = os.path.join(os.path.dirname(filename),
+                                               self.cssfile)
+                except AttributeError:
+                    print('Note: Cannot determine output file name, '
+                          'using current directory as base for the CSS file name',
+                          file=sys.stderr)
+                    cssfilename = self.cssfile
+            # write CSS file only if noclobber_cssfile isn't given as an option.
+            try:
+                if not os.path.exists(cssfilename) or not self.noclobber_cssfile:
+                    with open(cssfilename, "w", encoding="utf-8") as cf:
+                        cf.write(CSSFILE_TEMPLATE %
+                                 {'styledefs': self.get_style_defs('body')})
+            except OSError as err:
+                err.strerror = 'Error writing CSS file: ' + err.strerror
+                raise
+
+            yield 0, (DOC_HEADER_EXTERNALCSS %
+                      dict(title=self.title,
+                           cssfile=self.cssfile,
+                           encoding=self.encoding))
+        else:
+            yield 0, (DOC_HEADER %
+                      dict(title=self.title,
+                           styledefs=self.get_style_defs('body'),
+                           encoding=self.encoding))
+
+        yield from inner
+        yield 0, DOC_FOOTER
+
+    def _wrap_tablelinenos(self, inner):
+        dummyoutfile = StringIO()
+        lncount = 0
+        for t, line in inner:
+            if t:
+                lncount += 1
+            dummyoutfile.write(line)
+
+        fl = self.linenostart
+        mw = len(str(lncount + fl - 1))
+        sp = self.linenospecial
+        st = self.linenostep
+        anchor_name = self.lineanchors or self.linespans
+        aln = self.anchorlinenos
+        nocls = self.noclasses
+
+        lines = []
+
+        for i in range(fl, fl+lncount):
+            print_line = i % st == 0
+            special_line = sp and i % sp == 0
+
+            if print_line:
+                line = '%*d' % (mw, i)
+                if aln:
+                    line = '<a href="#%s-%d">%s</a>' % (anchor_name, i, line)
+            else:
+                line = ' ' * mw
+
+            if nocls:
+                if special_line:
+                    style = f' style="{self._linenos_special_style}"'
+                else:
+                    style = f' style="{self._linenos_style}"'
+            else:
+                if special_line:
+                    style = ' class="special"'
+                else:
+                    style = ' class="normal"'
+
+            if style:
+                line = f'<span{style}>{line}</span>'
+
+            lines.append(line)
+
+        ls = '\n'.join(lines)
+
+        # If a filename was specified, we can't put it into the code table as it
+        # would misalign the line numbers. Hence we emit a separate row for it.
+        filename_tr = ""
+        if self.filename:
+            filename_tr = (
+                '<tr><th colspan="2" class="filename">'
+                '<span class="filename">' + self.filename + '</span>'
+                '</th></tr>')
+
+        # in case you wonder about the seemingly redundant <div> here: since the
+        # content in the other cell also is wrapped in a div, some browsers in
+        # some configurations seem to mess up the formatting...
+        yield 0, (f'<table class="{self.cssclass}table">' + filename_tr +
+            '<tr><td class="linenos"><div class="linenodiv"><pre>' +
+            ls + '</pre></div></td><td class="code">')
+        yield 0, '<div>'
+        yield 0, dummyoutfile.getvalue()
+        yield 0, '</div>'
+        yield 0, '</td></tr></table>'
+
+
+    def _wrap_inlinelinenos(self, inner):
+        # need a list of lines since we need the width of a single number :(
+        inner_lines = list(inner)
+        sp = self.linenospecial
+        st = self.linenostep
+        num = self.linenostart
+        mw = len(str(len(inner_lines) + num - 1))
+        anchor_name = self.lineanchors or self.linespans
+        aln = self.anchorlinenos
+        nocls = self.noclasses
+
+        for _, inner_line in inner_lines:
+            print_line = num % st == 0
+            special_line = sp and num % sp == 0
+
+            if print_line:
+                line = '%*d' % (mw, num)
+            else:
+                line = ' ' * mw
+
+            if nocls:
+                if special_line:
+                    style = f' style="{self._linenos_special_style}"'
+                else:
+                    style = f' style="{self._linenos_style}"'
+            else:
+                if special_line:
+                    style = ' class="linenos special"'
+                else:
+                    style = ' class="linenos"'
+
+            if style:
+                linenos = f'<span{style}>{line}</span>'
+            else:
+                linenos = line
+
+            if aln:
+                yield 1, ('<a href="#%s-%d">%s</a>' % (anchor_name, num, linenos) +
+                          inner_line)
+            else:
+                yield 1, linenos + inner_line
+            num += 1
+
+    def _wrap_lineanchors(self, inner):
+        s = self.lineanchors
+        # subtract 1 since we have to increment i *before* yielding
+        i = self.linenostart - 1
+        for t, line in inner:
+            if t:
+                i += 1
+                href = "" if self.linenos else ' href="#%s-%d"' % (s, i)
+                yield 1, '<a id="%s-%d" name="%s-%d"%s></a>' % (s, i, s, i, href) + line
+            else:
+                yield 0, line
+
+    def _wrap_linespans(self, inner):
+        s = self.linespans
+        i = self.linenostart - 1
+        for t, line in inner:
+            if t:
+                i += 1
+                yield 1, '<span id="%s-%d">%s</span>' % (s, i, line)
+            else:
+                yield 0, line
+
+    def _wrap_div(self, inner):
+        style = []
+        if (self.noclasses and not self.nobackground and
+                self.style.background_color is not None):
+            style.append(f'background: {self.style.background_color}')
+        if self.cssstyles:
+            style.append(self.cssstyles)
+        style = '; '.join(style)
+
+        yield 0, ('<div' + (self.cssclass and f' class="{self.cssclass}"') +
+                  (style and (f' style="{style}"')) + '>')
+        yield from inner
+        yield 0, '</div>\n'
+
+    def _wrap_pre(self, inner):
+        style = []
+        if self.prestyles:
+            style.append(self.prestyles)
+        if self.noclasses:
+            style.append(self._pre_style)
+        style = '; '.join(style)
+
+        if self.filename and self.linenos != 1:
+            yield 0, ('<span class="filename">' + self.filename + '</span>')
+
+        # the empty span here is to keep leading empty lines from being
+        # ignored by HTML parsers
+        yield 0, ('<pre' + (style and f' style="{style}"') + '><span></span>')
+        yield from inner
+        yield 0, '</pre>'
+
+    def _wrap_code(self, inner):
+        yield 0, '<code>'
+        yield from inner
+        yield 0, '</code>'
+
+    @functools.lru_cache(maxsize=100)
+    def _translate_parts(self, value):
+        """HTML-escape a value and split it by newlines."""
+        return value.translate(_escape_html_table).split('\n')
+
+    def _format_lines(self, tokensource):
+        """
+        Just format the tokens, without any wrapping tags.
+        Yield individual lines.
+        """
+        nocls = self.noclasses
+        lsep = self.lineseparator
+        tagsfile = self.tagsfile
+
+        lspan = ''
+        line = []
+        for ttype, value in tokensource:
+            try:
+                cspan = self.span_element_openers[ttype]
+            except KeyError:
+                title = ' title="{}"'.format('.'.join(ttype)) if self.debug_token_types else ''
+                if nocls:
+                    css_style = self._get_css_inline_styles(ttype)
+                    if css_style:
+                        css_style = self.class2style[css_style][0]
+                        cspan = f'<span style="{css_style}"{title}>'
+                    else:
+                        cspan = ''
+                else:
+                    css_class = self._get_css_classes(ttype)
+                    if css_class:
+                        cspan = f'<span class="{css_class}"{title}>'
+                    else:
+                        cspan = ''
+                self.span_element_openers[ttype] = cspan
+
+            parts = self._translate_parts(value)
+
+            if tagsfile and ttype in Token.Name:
+                filename, linenumber = self._lookup_ctag(value)
+                if linenumber:
+                    base, filename = os.path.split(filename)
+                    if base:
+                        base += '/'
+                    filename, extension = os.path.splitext(filename)
+                    url = self.tagurlformat % {'path': base, 'fname': filename,
+                                               'fext': extension}
+                    parts[0] = "<a href=\"%s#%s-%d\">%s" % \
+                        (url, self.lineanchors, linenumber, parts[0])
+                    parts[-1] = parts[-1] + "</a>"
+
+            # for all but the last line
+            for part in parts[:-1]:
+                if line:
+                    # Also check for part being non-empty, so we avoid creating
+                    # empty <span> tags
+                    if lspan != cspan and part:
+                        line.extend(((lspan and '</span>'), cspan, part,
+                                     (cspan and '</span>'), lsep))
+                    else:  # both are the same, or the current part was empty
+                        line.extend((part, (lspan and '</span>'), lsep))
+                    yield 1, ''.join(line)
+                    line = []
+                elif part:
+                    yield 1, ''.join((cspan, part, (cspan and '</span>'), lsep))
+                else:
+                    yield 1, lsep
+            # for the last line
+            if line and parts[-1]:
+                if lspan != cspan:
+                    line.extend(((lspan and '</span>'), cspan, parts[-1]))
+                    lspan = cspan
+                else:
+                    line.append(parts[-1])
+            elif parts[-1]:
+                line = [cspan, parts[-1]]
+                lspan = cspan
+            # else we neither have to open a new span nor set lspan
+
+        if line:
+            line.extend(((lspan and '</span>'), lsep))
+            yield 1, ''.join(line)
+
+    def _lookup_ctag(self, token):
+        entry = ctags.TagEntry()
+        if self._ctags.find(entry, token.encode(), 0):
+            return entry['file'].decode(), entry['lineNumber']
+        else:
+            return None, None
+
+    def _highlight_lines(self, tokensource):
+        """
+        Highlighted the lines specified in the `hl_lines` option by
+        post-processing the token stream coming from `_format_lines`.
+        """
+        hls = self.hl_lines
+
+        for i, (t, value) in enumerate(tokensource):
+            if t != 1:
+                yield t, value
+            if i + 1 in hls:  # i + 1 because Python indexes start at 0
+                if self.noclasses:
+                    style = ''
+                    if self.style.highlight_color is not None:
+                        style = (f' style="background-color: {self.style.highlight_color}"')
+                    yield 1, f'<span{style}>{value}</span>'
+                else:
+                    yield 1, f'<span class="hll">{value}</span>'
+            else:
+                yield 1, value
+
+    def wrap(self, source):
+        """
+        Wrap the ``source``, which is a generator yielding
+        individual lines, in custom generators. See docstring
+        for `format`. Can be overridden.
+        """
+
+        output = source
+        if self.wrapcode:
+            output = self._wrap_code(output)
+
+        output = self._wrap_pre(output)
+
+        return output
+
+    def format_unencoded(self, tokensource, outfile):
+        """
+        The formatting process uses several nested generators; which of
+        them are used is determined by the user's options.
+
+        Each generator should take at least one argument, ``inner``,
+        and wrap the pieces of text generated by this.
+
+        Always yield 2-tuples: (code, text). If "code" is 1, the text
+        is part of the original tokensource being highlighted, if it's
+        0, the text is some piece of wrapping. This makes it possible to
+        use several different wrappers that process the original source
+        linewise, e.g. line number generators.
+        """
+        source = self._format_lines(tokensource)
+
+        # As a special case, we wrap line numbers before line highlighting
+        # so the line numbers get wrapped in the highlighting tag.
+        if not self.nowrap and self.linenos == 2:
+            source = self._wrap_inlinelinenos(source)
+
+        if self.hl_lines:
+            source = self._highlight_lines(source)
+
+        if not self.nowrap:
+            if self.lineanchors:
+                source = self._wrap_lineanchors(source)
+            if self.linespans:
+                source = self._wrap_linespans(source)
+            source = self.wrap(source)
+            if self.linenos == 1:
+                source = self._wrap_tablelinenos(source)
+            source = self._wrap_div(source)
+            if self.full:
+                source = self._wrap_full(source, outfile)
+
+        for t, piece in source:
+            outfile.write(piece)
diff --git a/.venv/Lib/site-packages/pygments/formatters/img.py b/.venv/Lib/site-packages/pygments/formatters/img.py
new file mode 100644 (file)
index 0000000..de4e9ff
--- /dev/null
@@ -0,0 +1,686 @@
+"""
+    pygments.formatters.img
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for Pixmap output.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+import os
+import sys
+
+from pygments.formatter import Formatter
+from pygments.util import get_bool_opt, get_int_opt, get_list_opt, \
+    get_choice_opt
+
+import subprocess
+
+# Import this carefully
+try:
+    from PIL import Image, ImageDraw, ImageFont
+    pil_available = True
+except ImportError:
+    pil_available = False
+
+try:
+    import _winreg
+except ImportError:
+    try:
+        import winreg as _winreg
+    except ImportError:
+        _winreg = None
+
+__all__ = ['ImageFormatter', 'GifImageFormatter', 'JpgImageFormatter',
+           'BmpImageFormatter']
+
+
+# For some unknown reason every font calls it something different
+STYLES = {
+    'NORMAL':     ['', 'Roman', 'Book', 'Normal', 'Regular', 'Medium'],
+    'ITALIC':     ['Oblique', 'Italic'],
+    'BOLD':       ['Bold'],
+    'BOLDITALIC': ['Bold Oblique', 'Bold Italic'],
+}
+
+# A sane default for modern systems
+DEFAULT_FONT_NAME_NIX = 'DejaVu Sans Mono'
+DEFAULT_FONT_NAME_WIN = 'Courier New'
+DEFAULT_FONT_NAME_MAC = 'Menlo'
+
+
+class PilNotAvailable(ImportError):
+    """When Python imaging library is not available"""
+
+
+class FontNotFound(Exception):
+    """When there are no usable fonts specified"""
+
+
+class FontManager:
+    """
+    Manages a set of fonts: normal, italic, bold, etc...
+    """
+
+    def __init__(self, font_name, font_size=14):
+        self.font_name = font_name
+        self.font_size = font_size
+        self.fonts = {}
+        self.encoding = None
+        self.variable = False
+        if hasattr(font_name, 'read') or os.path.isfile(font_name):
+            font = ImageFont.truetype(font_name, self.font_size)
+            self.variable = True
+            for style in STYLES:
+                self.fonts[style] = font
+
+            return
+
+        if sys.platform.startswith('win'):
+            if not font_name:
+                self.font_name = DEFAULT_FONT_NAME_WIN
+            self._create_win()
+        elif sys.platform.startswith('darwin'):
+            if not font_name:
+                self.font_name = DEFAULT_FONT_NAME_MAC
+            self._create_mac()
+        else:
+            if not font_name:
+                self.font_name = DEFAULT_FONT_NAME_NIX
+            self._create_nix()
+
+    def _get_nix_font_path(self, name, style):
+        proc = subprocess.Popen(['fc-list', f"{name}:style={style}", 'file'],
+                                stdout=subprocess.PIPE, stderr=None)
+        stdout, _ = proc.communicate()
+        if proc.returncode == 0:
+            lines = stdout.splitlines()
+            for line in lines:
+                if line.startswith(b'Fontconfig warning:'):
+                    continue
+                path = line.decode().strip().strip(':')
+                if path:
+                    return path
+            return None
+
+    def _create_nix(self):
+        for name in STYLES['NORMAL']:
+            path = self._get_nix_font_path(self.font_name, name)
+            if path is not None:
+                self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size)
+                break
+        else:
+            raise FontNotFound(f'No usable fonts named: "{self.font_name}"')
+        for style in ('ITALIC', 'BOLD', 'BOLDITALIC'):
+            for stylename in STYLES[style]:
+                path = self._get_nix_font_path(self.font_name, stylename)
+                if path is not None:
+                    self.fonts[style] = ImageFont.truetype(path, self.font_size)
+                    break
+            else:
+                if style == 'BOLDITALIC':
+                    self.fonts[style] = self.fonts['BOLD']
+                else:
+                    self.fonts[style] = self.fonts['NORMAL']
+
+    def _get_mac_font_path(self, font_map, name, style):
+        return font_map.get((name + ' ' + style).strip().lower())
+
+    def _create_mac(self):
+        font_map = {}
+        for font_dir in (os.path.join(os.getenv("HOME"), 'Library/Fonts/'),
+                         '/Library/Fonts/', '/System/Library/Fonts/'):
+            font_map.update(
+                (os.path.splitext(f)[0].lower(), os.path.join(font_dir, f))
+                for _, _, files in os.walk(font_dir)
+                for f in files
+                if f.lower().endswith(('ttf', 'ttc')))
+
+        for name in STYLES['NORMAL']:
+            path = self._get_mac_font_path(font_map, self.font_name, name)
+            if path is not None:
+                self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size)
+                break
+        else:
+            raise FontNotFound(f'No usable fonts named: "{self.font_name}"')
+        for style in ('ITALIC', 'BOLD', 'BOLDITALIC'):
+            for stylename in STYLES[style]:
+                path = self._get_mac_font_path(font_map, self.font_name, stylename)
+                if path is not None:
+                    self.fonts[style] = ImageFont.truetype(path, self.font_size)
+                    break
+            else:
+                if style == 'BOLDITALIC':
+                    self.fonts[style] = self.fonts['BOLD']
+                else:
+                    self.fonts[style] = self.fonts['NORMAL']
+
+    def _lookup_win(self, key, basename, styles, fail=False):
+        for suffix in ('', ' (TrueType)'):
+            for style in styles:
+                try:
+                    valname = '{}{}{}'.format(basename, style and ' '+style, suffix)
+                    val, _ = _winreg.QueryValueEx(key, valname)
+                    return val
+                except OSError:
+                    continue
+        else:
+            if fail:
+                raise FontNotFound(f'Font {basename} ({styles[0]}) not found in registry')
+            return None
+
+    def _create_win(self):
+        lookuperror = None
+        keynames = [ (_winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows NT\CurrentVersion\Fonts'),
+                     (_winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Fonts'),
+                     (_winreg.HKEY_LOCAL_MACHINE, r'Software\Microsoft\Windows NT\CurrentVersion\Fonts'),
+                     (_winreg.HKEY_LOCAL_MACHINE, r'Software\Microsoft\Windows\CurrentVersion\Fonts') ]
+        for keyname in keynames:
+            try:
+                key = _winreg.OpenKey(*keyname)
+                try:
+                    path = self._lookup_win(key, self.font_name, STYLES['NORMAL'], True)
+                    self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size)
+                    for style in ('ITALIC', 'BOLD', 'BOLDITALIC'):
+                        path = self._lookup_win(key, self.font_name, STYLES[style])
+                        if path:
+                            self.fonts[style] = ImageFont.truetype(path, self.font_size)
+                        else:
+                            if style == 'BOLDITALIC':
+                                self.fonts[style] = self.fonts['BOLD']
+                            else:
+                                self.fonts[style] = self.fonts['NORMAL']
+                    return
+                except FontNotFound as err:
+                    lookuperror = err
+                finally:
+                    _winreg.CloseKey(key)
+            except OSError:
+                pass
+        else:
+            # If we get here, we checked all registry keys and had no luck
+            # We can be in one of two situations now:
+            # * All key lookups failed. In this case lookuperror is None and we
+            #   will raise a generic error
+            # * At least one lookup failed with a FontNotFound error. In this
+            #   case, we will raise that as a more specific error
+            if lookuperror:
+                raise lookuperror
+            raise FontNotFound('Can\'t open Windows font registry key')
+
+    def get_char_size(self):
+        """
+        Get the character size.
+        """
+        return self.get_text_size('M')
+
+    def get_text_size(self, text):
+        """
+        Get the text size (width, height).
+        """
+        font = self.fonts['NORMAL']
+        if hasattr(font, 'getbbox'):  # Pillow >= 9.2.0
+            return font.getbbox(text)[2:4]
+        else:
+            return font.getsize(text)
+
+    def get_font(self, bold, oblique):
+        """
+        Get the font based on bold and italic flags.
+        """
+        if bold and oblique:
+            if self.variable:
+                return self.get_style('BOLDITALIC')
+
+            return self.fonts['BOLDITALIC']
+        elif bold:
+            if self.variable:
+                return self.get_style('BOLD')
+
+            return self.fonts['BOLD']
+        elif oblique:
+            if self.variable:
+                return self.get_style('ITALIC')
+
+            return self.fonts['ITALIC']
+        else:
+            if self.variable:
+                return self.get_style('NORMAL')
+
+            return self.fonts['NORMAL']
+
+    def get_style(self, style):
+        """
+        Get the specified style of the font if it is a variable font.
+        If not found, return the normal font.
+        """
+        font = self.fonts[style]
+        for style_name in STYLES[style]:
+            try:
+                font.set_variation_by_name(style_name)
+                return font
+            except ValueError:
+                pass
+            except OSError:
+                return font
+
+        return font
+
+
+class ImageFormatter(Formatter):
+    """
+    Create a PNG image from source code. This uses the Python Imaging Library to
+    generate a pixmap from the source code.
+
+    .. versionadded:: 0.10
+
+    Additional options accepted:
+
+    `image_format`
+        An image format to output to that is recognised by PIL, these include:
+
+        * "PNG" (default)
+        * "JPEG"
+        * "BMP"
+        * "GIF"
+
+    `line_pad`
+        The extra spacing (in pixels) between each line of text.
+
+        Default: 2
+
+    `font_name`
+        The font name to be used as the base font from which others, such as
+        bold and italic fonts will be generated.  This really should be a
+        monospace font to look sane.
+        If a filename or a file-like object is specified, the user must
+        provide different styles of the font.
+
+        Default: "Courier New" on Windows, "Menlo" on Mac OS, and
+                 "DejaVu Sans Mono" on \\*nix
+
+    `font_size`
+        The font size in points to be used.
+
+        Default: 14
+
+    `image_pad`
+        The padding, in pixels to be used at each edge of the resulting image.
+
+        Default: 10
+
+    `line_numbers`
+        Whether line numbers should be shown: True/False
+
+        Default: True
+
+    `line_number_start`
+        The line number of the first line.
+
+        Default: 1
+
+    `line_number_step`
+        The step used when printing line numbers.
+
+        Default: 1
+
+    `line_number_bg`
+        The background colour (in "#123456" format) of the line number bar, or
+        None to use the style background color.
+
+        Default: "#eed"
+
+    `line_number_fg`
+        The text color of the line numbers (in "#123456"-like format).
+
+        Default: "#886"
+
+    `line_number_chars`
+        The number of columns of line numbers allowable in the line number
+        margin.
+
+        Default: 2
+
+    `line_number_bold`
+        Whether line numbers will be bold: True/False
+
+        Default: False
+
+    `line_number_italic`
+        Whether line numbers will be italicized: True/False
+
+        Default: False
+
+    `line_number_separator`
+        Whether a line will be drawn between the line number area and the
+        source code area: True/False
+
+        Default: True
+
+    `line_number_pad`
+        The horizontal padding (in pixels) between the line number margin, and
+        the source code area.
+
+        Default: 6
+
+    `hl_lines`
+        Specify a list of lines to be highlighted.
+
+        .. versionadded:: 1.2
+
+        Default: empty list
+
+    `hl_color`
+        Specify the color for highlighting lines.
+
+        .. versionadded:: 1.2
+
+        Default: highlight color of the selected style
+    """
+
+    # Required by the pygments mapper
+    name = 'img'
+    aliases = ['img', 'IMG', 'png']
+    filenames = ['*.png']
+
+    unicodeoutput = False
+
+    default_image_format = 'png'
+
+    def __init__(self, **options):
+        """
+        See the class docstring for explanation of options.
+        """
+        if not pil_available:
+            raise PilNotAvailable(
+                'Python Imaging Library is required for this formatter')
+        Formatter.__init__(self, **options)
+        self.encoding = 'latin1'  # let pygments.format() do the right thing
+        # Read the style
+        self.styles = dict(self.style)
+        if self.style.background_color is None:
+            self.background_color = '#fff'
+        else:
+            self.background_color = self.style.background_color
+        # Image options
+        self.image_format = get_choice_opt(
+            options, 'image_format', ['png', 'jpeg', 'gif', 'bmp'],
+            self.default_image_format, normcase=True)
+        self.image_pad = get_int_opt(options, 'image_pad', 10)
+        self.line_pad = get_int_opt(options, 'line_pad', 2)
+        # The fonts
+        fontsize = get_int_opt(options, 'font_size', 14)
+        self.fonts = FontManager(options.get('font_name', ''), fontsize)
+        self.fontw, self.fonth = self.fonts.get_char_size()
+        # Line number options
+        self.line_number_fg = options.get('line_number_fg', '#886')
+        self.line_number_bg = options.get('line_number_bg', '#eed')
+        self.line_number_chars = get_int_opt(options,
+                                             'line_number_chars', 2)
+        self.line_number_bold = get_bool_opt(options,
+                                             'line_number_bold', False)
+        self.line_number_italic = get_bool_opt(options,
+                                               'line_number_italic', False)
+        self.line_number_pad = get_int_opt(options, 'line_number_pad', 6)
+        self.line_numbers = get_bool_opt(options, 'line_numbers', True)
+        self.line_number_separator = get_bool_opt(options,
+                                                  'line_number_separator', True)
+        self.line_number_step = get_int_opt(options, 'line_number_step', 1)
+        self.line_number_start = get_int_opt(options, 'line_number_start', 1)
+        if self.line_numbers:
+            self.line_number_width = (self.fontw * self.line_number_chars +
+                                      self.line_number_pad * 2)
+        else:
+            self.line_number_width = 0
+        self.hl_lines = []
+        hl_lines_str = get_list_opt(options, 'hl_lines', [])
+        for line in hl_lines_str:
+            try:
+                self.hl_lines.append(int(line))
+            except ValueError:
+                pass
+        self.hl_color = options.get('hl_color',
+                                    self.style.highlight_color) or '#f90'
+        self.drawables = []
+
+    def get_style_defs(self, arg=''):
+        raise NotImplementedError('The -S option is meaningless for the image '
+                                  'formatter. Use -O style=<stylename> instead.')
+
+    def _get_line_height(self):
+        """
+        Get the height of a line.
+        """
+        return self.fonth + self.line_pad
+
+    def _get_line_y(self, lineno):
+        """
+        Get the Y coordinate of a line number.
+        """
+        return lineno * self._get_line_height() + self.image_pad
+
+    def _get_char_width(self):
+        """
+        Get the width of a character.
+        """
+        return self.fontw
+
+    def _get_char_x(self, linelength):
+        """
+        Get the X coordinate of a character position.
+        """
+        return linelength + self.image_pad + self.line_number_width
+
+    def _get_text_pos(self, linelength, lineno):
+        """
+        Get the actual position for a character and line position.
+        """
+        return self._get_char_x(linelength), self._get_line_y(lineno)
+
+    def _get_linenumber_pos(self, lineno):
+        """
+        Get the actual position for the start of a line number.
+        """
+        return (self.image_pad, self._get_line_y(lineno))
+
+    def _get_text_color(self, style):
+        """
+        Get the correct color for the token from the style.
+        """
+        if style['color'] is not None:
+            fill = '#' + style['color']
+        else:
+            fill = '#000'
+        return fill
+
+    def _get_text_bg_color(self, style):
+        """
+        Get the correct background color for the token from the style.
+        """
+        if style['bgcolor'] is not None:
+            bg_color = '#' + style['bgcolor']
+        else:
+            bg_color = None
+        return bg_color
+
+    def _get_style_font(self, style):
+        """
+        Get the correct font for the style.
+        """
+        return self.fonts.get_font(style['bold'], style['italic'])
+
+    def _get_image_size(self, maxlinelength, maxlineno):
+        """
+        Get the required image size.
+        """
+        return (self._get_char_x(maxlinelength) + self.image_pad,
+                self._get_line_y(maxlineno + 0) + self.image_pad)
+
+    def _draw_linenumber(self, posno, lineno):
+        """
+        Remember a line number drawable to paint later.
+        """
+        self._draw_text(
+            self._get_linenumber_pos(posno),
+            str(lineno).rjust(self.line_number_chars),
+            font=self.fonts.get_font(self.line_number_bold,
+                                     self.line_number_italic),
+            text_fg=self.line_number_fg,
+            text_bg=None,
+        )
+
+    def _draw_text(self, pos, text, font, text_fg, text_bg):
+        """
+        Remember a single drawable tuple to paint later.
+        """
+        self.drawables.append((pos, text, font, text_fg, text_bg))
+
+    def _create_drawables(self, tokensource):
+        """
+        Create drawables for the token content.
+        """
+        lineno = charno = maxcharno = 0
+        maxlinelength = linelength = 0
+        for ttype, value in tokensource:
+            while ttype not in self.styles:
+                ttype = ttype.parent
+            style = self.styles[ttype]
+            # TODO: make sure tab expansion happens earlier in the chain.  It
+            # really ought to be done on the input, as to do it right here is
+            # quite complex.
+            value = value.expandtabs(4)
+            lines = value.splitlines(True)
+            # print lines
+            for i, line in enumerate(lines):
+                temp = line.rstrip('\n')
+                if temp:
+                    self._draw_text(
+                        self._get_text_pos(linelength, lineno),
+                        temp,
+                        font = self._get_style_font(style),
+                        text_fg = self._get_text_color(style),
+                        text_bg = self._get_text_bg_color(style),
+                    )
+                    temp_width, _ = self.fonts.get_text_size(temp)
+                    linelength += temp_width
+                    maxlinelength = max(maxlinelength, linelength)
+                    charno += len(temp)
+                    maxcharno = max(maxcharno, charno)
+                if line.endswith('\n'):
+                    # add a line for each extra line in the value
+                    linelength = 0
+                    charno = 0
+                    lineno += 1
+        self.maxlinelength = maxlinelength
+        self.maxcharno = maxcharno
+        self.maxlineno = lineno
+
+    def _draw_line_numbers(self):
+        """
+        Create drawables for the line numbers.
+        """
+        if not self.line_numbers:
+            return
+        for p in range(self.maxlineno):
+            n = p + self.line_number_start
+            if (n % self.line_number_step) == 0:
+                self._draw_linenumber(p, n)
+
+    def _paint_line_number_bg(self, im):
+        """
+        Paint the line number background on the image.
+        """
+        if not self.line_numbers:
+            return
+        if self.line_number_fg is None:
+            return
+        draw = ImageDraw.Draw(im)
+        recth = im.size[-1]
+        rectw = self.image_pad + self.line_number_width - self.line_number_pad
+        draw.rectangle([(0, 0), (rectw, recth)],
+                       fill=self.line_number_bg)
+        if self.line_number_separator:
+            draw.line([(rectw, 0), (rectw, recth)], fill=self.line_number_fg)
+        del draw
+
+    def format(self, tokensource, outfile):
+        """
+        Format ``tokensource``, an iterable of ``(tokentype, tokenstring)``
+        tuples and write it into ``outfile``.
+
+        This implementation calculates where it should draw each token on the
+        pixmap, then calculates the required pixmap size and draws the items.
+        """
+        self._create_drawables(tokensource)
+        self._draw_line_numbers()
+        im = Image.new(
+            'RGB',
+            self._get_image_size(self.maxlinelength, self.maxlineno),
+            self.background_color
+        )
+        self._paint_line_number_bg(im)
+        draw = ImageDraw.Draw(im)
+        # Highlight
+        if self.hl_lines:
+            x = self.image_pad + self.line_number_width - self.line_number_pad + 1
+            recth = self._get_line_height()
+            rectw = im.size[0] - x
+            for linenumber in self.hl_lines:
+                y = self._get_line_y(linenumber - 1)
+                draw.rectangle([(x, y), (x + rectw, y + recth)],
+                               fill=self.hl_color)
+        for pos, value, font, text_fg, text_bg in self.drawables:
+            if text_bg:
+                # see deprecations https://pillow.readthedocs.io/en/stable/releasenotes/9.2.0.html#font-size-and-offset-methods
+                if hasattr(draw, 'textsize'):
+                    text_size = draw.textsize(text=value, font=font)
+                else:
+                    text_size = font.getbbox(value)[2:]
+                draw.rectangle([pos[0], pos[1], pos[0] + text_size[0], pos[1] + text_size[1]], fill=text_bg)
+            draw.text(pos, value, font=font, fill=text_fg)
+        im.save(outfile, self.image_format.upper())
+
+
+# Add one formatter per format, so that the "-f gif" option gives the correct result
+# when used in pygmentize.
+
+class GifImageFormatter(ImageFormatter):
+    """
+    Create a GIF image from source code. This uses the Python Imaging Library to
+    generate a pixmap from the source code.
+
+    .. versionadded:: 1.0
+    """
+
+    name = 'img_gif'
+    aliases = ['gif']
+    filenames = ['*.gif']
+    default_image_format = 'gif'
+
+
+class JpgImageFormatter(ImageFormatter):
+    """
+    Create a JPEG image from source code. This uses the Python Imaging Library to
+    generate a pixmap from the source code.
+
+    .. versionadded:: 1.0
+    """
+
+    name = 'img_jpg'
+    aliases = ['jpg', 'jpeg']
+    filenames = ['*.jpg']
+    default_image_format = 'jpeg'
+
+
+class BmpImageFormatter(ImageFormatter):
+    """
+    Create a bitmap image from source code. This uses the Python Imaging Library to
+    generate a pixmap from the source code.
+
+    .. versionadded:: 1.0
+    """
+
+    name = 'img_bmp'
+    aliases = ['bmp', 'bitmap']
+    filenames = ['*.bmp']
+    default_image_format = 'bmp'
diff --git a/.venv/Lib/site-packages/pygments/formatters/irc.py b/.venv/Lib/site-packages/pygments/formatters/irc.py
new file mode 100644 (file)
index 0000000..d6ca069
--- /dev/null
@@ -0,0 +1,154 @@
+"""
+    pygments.formatters.irc
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for IRC output
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.formatter import Formatter
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator, Generic, Token, Whitespace
+from pygments.util import get_choice_opt
+
+
+__all__ = ['IRCFormatter']
+
+
+#: Map token types to a tuple of color values for light and dark
+#: backgrounds.
+IRC_COLORS = {
+    Token:              ('',            ''),
+
+    Whitespace:         ('gray',   'brightblack'),
+    Comment:            ('gray',   'brightblack'),
+    Comment.Preproc:    ('cyan',        'brightcyan'),
+    Keyword:            ('blue',    'brightblue'),
+    Keyword.Type:       ('cyan',        'brightcyan'),
+    Operator.Word:      ('magenta',      'brightcyan'),
+    Name.Builtin:       ('cyan',        'brightcyan'),
+    Name.Function:      ('green',   'brightgreen'),
+    Name.Namespace:     ('_cyan_',      '_brightcyan_'),
+    Name.Class:         ('_green_', '_brightgreen_'),
+    Name.Exception:     ('cyan',        'brightcyan'),
+    Name.Decorator:     ('brightblack',    'gray'),
+    Name.Variable:      ('red',     'brightred'),
+    Name.Constant:      ('red',     'brightred'),
+    Name.Attribute:     ('cyan',        'brightcyan'),
+    Name.Tag:           ('brightblue',        'brightblue'),
+    String:             ('yellow',       'yellow'),
+    Number:             ('blue',    'brightblue'),
+
+    Generic.Deleted:    ('brightred',        'brightred'),
+    Generic.Inserted:   ('green',  'brightgreen'),
+    Generic.Heading:    ('**',         '**'),
+    Generic.Subheading: ('*magenta*',   '*brightmagenta*'),
+    Generic.Error:      ('brightred',        'brightred'),
+
+    Error:              ('_brightred_',      '_brightred_'),
+}
+
+
+IRC_COLOR_MAP = {
+    'white': 0,
+    'black': 1,
+    'blue': 2,
+    'brightgreen': 3,
+    'brightred': 4,
+    'yellow': 5,
+    'magenta': 6,
+    'orange': 7,
+    'green': 7, #compat w/ ansi
+    'brightyellow': 8,
+    'lightgreen': 9,
+    'brightcyan': 9, # compat w/ ansi
+    'cyan': 10,
+    'lightblue': 11,
+    'red': 11, # compat w/ ansi
+    'brightblue': 12,
+    'brightmagenta': 13,
+    'brightblack': 14,
+    'gray': 15,
+}
+
+def ircformat(color, text):
+    if len(color) < 1:
+        return text
+    add = sub = ''
+    if '_' in color: # italic
+        add += '\x1D'
+        sub = '\x1D' + sub
+        color = color.strip('_')
+    if '*' in color: # bold
+        add += '\x02'
+        sub = '\x02' + sub
+        color = color.strip('*')
+    # underline (\x1F) not supported
+    # backgrounds (\x03FF,BB) not supported
+    if len(color) > 0: # actual color - may have issues with ircformat("red", "blah")+"10" type stuff
+        add += '\x03' + str(IRC_COLOR_MAP[color]).zfill(2)
+        sub = '\x03' + sub
+    return add + text + sub
+    return '<'+add+'>'+text+'</'+sub+'>'
+
+
+class IRCFormatter(Formatter):
+    r"""
+    Format tokens with IRC color sequences
+
+    The `get_style_defs()` method doesn't do anything special since there is
+    no support for common styles.
+
+    Options accepted:
+
+    `bg`
+        Set to ``"light"`` or ``"dark"`` depending on the terminal's background
+        (default: ``"light"``).
+
+    `colorscheme`
+        A dictionary mapping token types to (lightbg, darkbg) color names or
+        ``None`` (default: ``None`` = use builtin colorscheme).
+
+    `linenos`
+        Set to ``True`` to have line numbers in the output as well
+        (default: ``False`` = no line numbers).
+    """
+    name = 'IRC'
+    aliases = ['irc', 'IRC']
+    filenames = []
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.darkbg = get_choice_opt(options, 'bg',
+                                     ['light', 'dark'], 'light') == 'dark'
+        self.colorscheme = options.get('colorscheme', None) or IRC_COLORS
+        self.linenos = options.get('linenos', False)
+        self._lineno = 0
+
+    def _write_lineno(self, outfile):
+        if self.linenos:
+            self._lineno += 1
+            outfile.write("%04d: " % self._lineno)
+
+    def format_unencoded(self, tokensource, outfile):
+        self._write_lineno(outfile)
+
+        for ttype, value in tokensource:
+            color = self.colorscheme.get(ttype)
+            while color is None:
+                ttype = ttype[:-1]
+                color = self.colorscheme.get(ttype)
+            if color:
+                color = color[self.darkbg]
+                spl = value.split('\n')
+                for line in spl[:-1]:
+                    if line:
+                        outfile.write(ircformat(color, line))
+                    outfile.write('\n')
+                    self._write_lineno(outfile)
+                if spl[-1]:
+                    outfile.write(ircformat(color, spl[-1]))
+            else:
+                outfile.write(value)
diff --git a/.venv/Lib/site-packages/pygments/formatters/latex.py b/.venv/Lib/site-packages/pygments/formatters/latex.py
new file mode 100644 (file)
index 0000000..f14234a
--- /dev/null
@@ -0,0 +1,518 @@
+"""
+    pygments.formatters.latex
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for LaTeX fancyvrb output.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from io import StringIO
+
+from pygments.formatter import Formatter
+from pygments.lexer import Lexer, do_insertions
+from pygments.token import Token, STANDARD_TYPES
+from pygments.util import get_bool_opt, get_int_opt
+
+
+__all__ = ['LatexFormatter']
+
+
+def escape_tex(text, commandprefix):
+    return text.replace('\\', '\x00'). \
+                replace('{', '\x01'). \
+                replace('}', '\x02'). \
+                replace('\x00', rf'\{commandprefix}Zbs{{}}'). \
+                replace('\x01', rf'\{commandprefix}Zob{{}}'). \
+                replace('\x02', rf'\{commandprefix}Zcb{{}}'). \
+                replace('^', rf'\{commandprefix}Zca{{}}'). \
+                replace('_', rf'\{commandprefix}Zus{{}}'). \
+                replace('&', rf'\{commandprefix}Zam{{}}'). \
+                replace('<', rf'\{commandprefix}Zlt{{}}'). \
+                replace('>', rf'\{commandprefix}Zgt{{}}'). \
+                replace('#', rf'\{commandprefix}Zsh{{}}'). \
+                replace('%', rf'\{commandprefix}Zpc{{}}'). \
+                replace('$', rf'\{commandprefix}Zdl{{}}'). \
+                replace('-', rf'\{commandprefix}Zhy{{}}'). \
+                replace("'", rf'\{commandprefix}Zsq{{}}'). \
+                replace('"', rf'\{commandprefix}Zdq{{}}'). \
+                replace('~', rf'\{commandprefix}Zti{{}}')
+
+
+DOC_TEMPLATE = r'''
+\documentclass{%(docclass)s}
+\usepackage{fancyvrb}
+\usepackage{color}
+\usepackage[%(encoding)s]{inputenc}
+%(preamble)s
+
+%(styledefs)s
+
+\begin{document}
+
+\section*{%(title)s}
+
+%(code)s
+\end{document}
+'''
+
+## Small explanation of the mess below :)
+#
+# The previous version of the LaTeX formatter just assigned a command to
+# each token type defined in the current style.  That obviously is
+# problematic if the highlighted code is produced for a different style
+# than the style commands themselves.
+#
+# This version works much like the HTML formatter which assigns multiple
+# CSS classes to each <span> tag, from the most specific to the least
+# specific token type, thus falling back to the parent token type if one
+# is not defined.  Here, the classes are there too and use the same short
+# forms given in token.STANDARD_TYPES.
+#
+# Highlighted code now only uses one custom command, which by default is
+# \PY and selectable by the commandprefix option (and in addition the
+# escapes \PYZat, \PYZlb and \PYZrb which haven't been renamed for
+# backwards compatibility purposes).
+#
+# \PY has two arguments: the classes, separated by +, and the text to
+# render in that style.  The classes are resolved into the respective
+# style commands by magic, which serves to ignore unknown classes.
+#
+# The magic macros are:
+# * \PY@it, \PY@bf, etc. are unconditionally wrapped around the text
+#   to render in \PY@do.  Their definition determines the style.
+# * \PY@reset resets \PY@it etc. to do nothing.
+# * \PY@toks parses the list of classes, using magic inspired by the
+#   keyval package (but modified to use plusses instead of commas
+#   because fancyvrb redefines commas inside its environments).
+# * \PY@tok processes one class, calling the \PY@tok@classname command
+#   if it exists.
+# * \PY@tok@classname sets the \PY@it etc. to reflect the chosen style
+#   for its class.
+# * \PY resets the style, parses the classnames and then calls \PY@do.
+#
+# Tip: to read this code, print it out in substituted form using e.g.
+# >>> print STYLE_TEMPLATE % {'cp': 'PY'}
+
+STYLE_TEMPLATE = r'''
+\makeatletter
+\def\%(cp)s@reset{\let\%(cp)s@it=\relax \let\%(cp)s@bf=\relax%%
+    \let\%(cp)s@ul=\relax \let\%(cp)s@tc=\relax%%
+    \let\%(cp)s@bc=\relax \let\%(cp)s@ff=\relax}
+\def\%(cp)s@tok#1{\csname %(cp)s@tok@#1\endcsname}
+\def\%(cp)s@toks#1+{\ifx\relax#1\empty\else%%
+    \%(cp)s@tok{#1}\expandafter\%(cp)s@toks\fi}
+\def\%(cp)s@do#1{\%(cp)s@bc{\%(cp)s@tc{\%(cp)s@ul{%%
+    \%(cp)s@it{\%(cp)s@bf{\%(cp)s@ff{#1}}}}}}}
+\def\%(cp)s#1#2{\%(cp)s@reset\%(cp)s@toks#1+\relax+\%(cp)s@do{#2}}
+
+%(styles)s
+
+\def\%(cp)sZbs{\char`\\}
+\def\%(cp)sZus{\char`\_}
+\def\%(cp)sZob{\char`\{}
+\def\%(cp)sZcb{\char`\}}
+\def\%(cp)sZca{\char`\^}
+\def\%(cp)sZam{\char`\&}
+\def\%(cp)sZlt{\char`\<}
+\def\%(cp)sZgt{\char`\>}
+\def\%(cp)sZsh{\char`\#}
+\def\%(cp)sZpc{\char`\%%}
+\def\%(cp)sZdl{\char`\$}
+\def\%(cp)sZhy{\char`\-}
+\def\%(cp)sZsq{\char`\'}
+\def\%(cp)sZdq{\char`\"}
+\def\%(cp)sZti{\char`\~}
+%% for compatibility with earlier versions
+\def\%(cp)sZat{@}
+\def\%(cp)sZlb{[}
+\def\%(cp)sZrb{]}
+\makeatother
+'''
+
+
+def _get_ttype_name(ttype):
+    fname = STANDARD_TYPES.get(ttype)
+    if fname:
+        return fname
+    aname = ''
+    while fname is None:
+        aname = ttype[-1] + aname
+        ttype = ttype.parent
+        fname = STANDARD_TYPES.get(ttype)
+    return fname + aname
+
+
+class LatexFormatter(Formatter):
+    r"""
+    Format tokens as LaTeX code. This needs the `fancyvrb` and `color`
+    standard packages.
+
+    Without the `full` option, code is formatted as one ``Verbatim``
+    environment, like this:
+
+    .. sourcecode:: latex
+
+        \begin{Verbatim}[commandchars=\\\{\}]
+        \PY{k}{def }\PY{n+nf}{foo}(\PY{n}{bar}):
+            \PY{k}{pass}
+        \end{Verbatim}
+
+    Wrapping can be disabled using the `nowrap` option.
+
+    The special command used here (``\PY``) and all the other macros it needs
+    are output by the `get_style_defs` method.
+
+    With the `full` option, a complete LaTeX document is output, including
+    the command definitions in the preamble.
+
+    The `get_style_defs()` method of a `LatexFormatter` returns a string
+    containing ``\def`` commands defining the macros needed inside the
+    ``Verbatim`` environments.
+
+    Additional options accepted:
+
+    `nowrap`
+        If set to ``True``, don't wrap the tokens at all, not even inside a
+        ``\begin{Verbatim}`` environment. This disables most other options
+        (default: ``False``).
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+
+    `full`
+        Tells the formatter to output a "full" document, i.e. a complete
+        self-contained document (default: ``False``).
+
+    `title`
+        If `full` is true, the title that should be used to caption the
+        document (default: ``''``).
+
+    `docclass`
+        If the `full` option is enabled, this is the document class to use
+        (default: ``'article'``).
+
+    `preamble`
+        If the `full` option is enabled, this can be further preamble commands,
+        e.g. ``\usepackage`` (default: ``''``).
+
+    `linenos`
+        If set to ``True``, output line numbers (default: ``False``).
+
+    `linenostart`
+        The line number for the first line (default: ``1``).
+
+    `linenostep`
+        If set to a number n > 1, only every nth line number is printed.
+
+    `verboptions`
+        Additional options given to the Verbatim environment (see the *fancyvrb*
+        docs for possible values) (default: ``''``).
+
+    `commandprefix`
+        The LaTeX commands used to produce colored output are constructed
+        using this prefix and some letters (default: ``'PY'``).
+
+        .. versionadded:: 0.7
+        .. versionchanged:: 0.10
+           The default is now ``'PY'`` instead of ``'C'``.
+
+    `texcomments`
+        If set to ``True``, enables LaTeX comment lines.  That is, LaTex markup
+        in comment tokens is not escaped so that LaTeX can render it (default:
+        ``False``).
+
+        .. versionadded:: 1.2
+
+    `mathescape`
+        If set to ``True``, enables LaTeX math mode escape in comments. That
+        is, ``'$...$'`` inside a comment will trigger math mode (default:
+        ``False``).
+
+        .. versionadded:: 1.2
+
+    `escapeinside`
+        If set to a string of length 2, enables escaping to LaTeX. Text
+        delimited by these 2 characters is read as LaTeX code and
+        typeset accordingly. It has no effect in string literals. It has
+        no effect in comments if `texcomments` or `mathescape` is
+        set. (default: ``''``).
+
+        .. versionadded:: 2.0
+
+    `envname`
+        Allows you to pick an alternative environment name replacing Verbatim.
+        The alternate environment still has to support Verbatim's option syntax.
+        (default: ``'Verbatim'``).
+
+        .. versionadded:: 2.0
+    """
+    name = 'LaTeX'
+    aliases = ['latex', 'tex']
+    filenames = ['*.tex']
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.nowrap = get_bool_opt(options, 'nowrap', False)
+        self.docclass = options.get('docclass', 'article')
+        self.preamble = options.get('preamble', '')
+        self.linenos = get_bool_opt(options, 'linenos', False)
+        self.linenostart = abs(get_int_opt(options, 'linenostart', 1))
+        self.linenostep = abs(get_int_opt(options, 'linenostep', 1))
+        self.verboptions = options.get('verboptions', '')
+        self.nobackground = get_bool_opt(options, 'nobackground', False)
+        self.commandprefix = options.get('commandprefix', 'PY')
+        self.texcomments = get_bool_opt(options, 'texcomments', False)
+        self.mathescape = get_bool_opt(options, 'mathescape', False)
+        self.escapeinside = options.get('escapeinside', '')
+        if len(self.escapeinside) == 2:
+            self.left = self.escapeinside[0]
+            self.right = self.escapeinside[1]
+        else:
+            self.escapeinside = ''
+        self.envname = options.get('envname', 'Verbatim')
+
+        self._create_stylesheet()
+
+    def _create_stylesheet(self):
+        t2n = self.ttype2name = {Token: ''}
+        c2d = self.cmd2def = {}
+        cp = self.commandprefix
+
+        def rgbcolor(col):
+            if col:
+                return ','.join(['%.2f' % (int(col[i] + col[i + 1], 16) / 255.0)
+                                 for i in (0, 2, 4)])
+            else:
+                return '1,1,1'
+
+        for ttype, ndef in self.style:
+            name = _get_ttype_name(ttype)
+            cmndef = ''
+            if ndef['bold']:
+                cmndef += r'\let\$$@bf=\textbf'
+            if ndef['italic']:
+                cmndef += r'\let\$$@it=\textit'
+            if ndef['underline']:
+                cmndef += r'\let\$$@ul=\underline'
+            if ndef['roman']:
+                cmndef += r'\let\$$@ff=\textrm'
+            if ndef['sans']:
+                cmndef += r'\let\$$@ff=\textsf'
+            if ndef['mono']:
+                cmndef += r'\let\$$@ff=\textsf'
+            if ndef['color']:
+                cmndef += (r'\def\$$@tc##1{{\textcolor[rgb]{{{}}}{{##1}}}}'.format(rgbcolor(ndef['color'])))
+            if ndef['border']:
+                cmndef += (r'\def\$$@bc##1{{{{\setlength{{\fboxsep}}{{\string -\fboxrule}}'
+                           r'\fcolorbox[rgb]{{{}}}{{{}}}{{\strut ##1}}}}}}'.format(rgbcolor(ndef['border']),
+                            rgbcolor(ndef['bgcolor'])))
+            elif ndef['bgcolor']:
+                cmndef += (r'\def\$$@bc##1{{{{\setlength{{\fboxsep}}{{0pt}}'
+                           r'\colorbox[rgb]{{{}}}{{\strut ##1}}}}}}'.format(rgbcolor(ndef['bgcolor'])))
+            if cmndef == '':
+                continue
+            cmndef = cmndef.replace('$$', cp)
+            t2n[ttype] = name
+            c2d[name] = cmndef
+
+    def get_style_defs(self, arg=''):
+        """
+        Return the command sequences needed to define the commands
+        used to format text in the verbatim environment. ``arg`` is ignored.
+        """
+        cp = self.commandprefix
+        styles = []
+        for name, definition in self.cmd2def.items():
+            styles.append(rf'\@namedef{{{cp}@tok@{name}}}{{{definition}}}')
+        return STYLE_TEMPLATE % {'cp': self.commandprefix,
+                                 'styles': '\n'.join(styles)}
+
+    def format_unencoded(self, tokensource, outfile):
+        # TODO: add support for background colors
+        t2n = self.ttype2name
+        cp = self.commandprefix
+
+        if self.full:
+            realoutfile = outfile
+            outfile = StringIO()
+
+        if not self.nowrap:
+            outfile.write('\\begin{' + self.envname + '}[commandchars=\\\\\\{\\}')
+            if self.linenos:
+                start, step = self.linenostart, self.linenostep
+                outfile.write(',numbers=left' +
+                              (start and ',firstnumber=%d' % start or '') +
+                              (step and ',stepnumber=%d' % step or ''))
+            if self.mathescape or self.texcomments or self.escapeinside:
+                outfile.write(',codes={\\catcode`\\$=3\\catcode`\\^=7'
+                              '\\catcode`\\_=8\\relax}')
+            if self.verboptions:
+                outfile.write(',' + self.verboptions)
+            outfile.write(']\n')
+
+        for ttype, value in tokensource:
+            if ttype in Token.Comment:
+                if self.texcomments:
+                    # Try to guess comment starting lexeme and escape it ...
+                    start = value[0:1]
+                    for i in range(1, len(value)):
+                        if start[0] != value[i]:
+                            break
+                        start += value[i]
+
+                    value = value[len(start):]
+                    start = escape_tex(start, cp)
+
+                    # ... but do not escape inside comment.
+                    value = start + value
+                elif self.mathescape:
+                    # Only escape parts not inside a math environment.
+                    parts = value.split('$')
+                    in_math = False
+                    for i, part in enumerate(parts):
+                        if not in_math:
+                            parts[i] = escape_tex(part, cp)
+                        in_math = not in_math
+                    value = '$'.join(parts)
+                elif self.escapeinside:
+                    text = value
+                    value = ''
+                    while text:
+                        a, sep1, text = text.partition(self.left)
+                        if sep1:
+                            b, sep2, text = text.partition(self.right)
+                            if sep2:
+                                value += escape_tex(a, cp) + b
+                            else:
+                                value += escape_tex(a + sep1 + b, cp)
+                        else:
+                            value += escape_tex(a, cp)
+                else:
+                    value = escape_tex(value, cp)
+            elif ttype not in Token.Escape:
+                value = escape_tex(value, cp)
+            styles = []
+            while ttype is not Token:
+                try:
+                    styles.append(t2n[ttype])
+                except KeyError:
+                    # not in current style
+                    styles.append(_get_ttype_name(ttype))
+                ttype = ttype.parent
+            styleval = '+'.join(reversed(styles))
+            if styleval:
+                spl = value.split('\n')
+                for line in spl[:-1]:
+                    if line:
+                        outfile.write(f"\\{cp}{{{styleval}}}{{{line}}}")
+                    outfile.write('\n')
+                if spl[-1]:
+                    outfile.write(f"\\{cp}{{{styleval}}}{{{spl[-1]}}}")
+            else:
+                outfile.write(value)
+
+        if not self.nowrap:
+            outfile.write('\\end{' + self.envname + '}\n')
+
+        if self.full:
+            encoding = self.encoding or 'utf8'
+            # map known existings encodings from LaTeX distribution
+            encoding = {
+                'utf_8': 'utf8',
+                'latin_1': 'latin1',
+                'iso_8859_1': 'latin1',
+            }.get(encoding.replace('-', '_'), encoding)
+            realoutfile.write(DOC_TEMPLATE %
+                dict(docclass  = self.docclass,
+                     preamble  = self.preamble,
+                     title     = self.title,
+                     encoding  = encoding,
+                     styledefs = self.get_style_defs(),
+                     code      = outfile.getvalue()))
+
+
+class LatexEmbeddedLexer(Lexer):
+    """
+    This lexer takes one lexer as argument, the lexer for the language
+    being formatted, and the left and right delimiters for escaped text.
+
+    First everything is scanned using the language lexer to obtain
+    strings and comments. All other consecutive tokens are merged and
+    the resulting text is scanned for escaped segments, which are given
+    the Token.Escape type. Finally text that is not escaped is scanned
+    again with the language lexer.
+    """
+    def __init__(self, left, right, lang, **options):
+        self.left = left
+        self.right = right
+        self.lang = lang
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        # find and remove all the escape tokens (replace with an empty string)
+        # this is very similar to DelegatingLexer.get_tokens_unprocessed.
+        buffered = ''
+        insertions = []
+        insertion_buf = []
+        for i, t, v in self._find_safe_escape_tokens(text):
+            if t is None:
+                if insertion_buf:
+                    insertions.append((len(buffered), insertion_buf))
+                    insertion_buf = []
+                buffered += v
+            else:
+                insertion_buf.append((i, t, v))
+        if insertion_buf:
+            insertions.append((len(buffered), insertion_buf))
+        return do_insertions(insertions,
+                             self.lang.get_tokens_unprocessed(buffered))
+
+    def _find_safe_escape_tokens(self, text):
+        """ find escape tokens that are not in strings or comments """
+        for i, t, v in self._filter_to(
+            self.lang.get_tokens_unprocessed(text),
+            lambda t: t in Token.Comment or t in Token.String
+        ):
+            if t is None:
+                for i2, t2, v2 in self._find_escape_tokens(v):
+                    yield i + i2, t2, v2
+            else:
+                yield i, None, v
+
+    def _filter_to(self, it, pred):
+        """ Keep only the tokens that match `pred`, merge the others together """
+        buf = ''
+        idx = 0
+        for i, t, v in it:
+            if pred(t):
+                if buf:
+                    yield idx, None, buf
+                    buf = ''
+                yield i, t, v
+            else:
+                if not buf:
+                    idx = i
+                buf += v
+        if buf:
+            yield idx, None, buf
+
+    def _find_escape_tokens(self, text):
+        """ Find escape tokens within text, give token=None otherwise """
+        index = 0
+        while text:
+            a, sep1, text = text.partition(self.left)
+            if a:
+                yield index, None, a
+                index += len(a)
+            if sep1:
+                b, sep2, text = text.partition(self.right)
+                if sep2:
+                    yield index + len(sep1), Token.Escape, b
+                    index += len(sep1) + len(b) + len(sep2)
+                else:
+                    yield index, Token.Error, sep1
+                    index += len(sep1)
+                    text = b
diff --git a/.venv/Lib/site-packages/pygments/formatters/other.py b/.venv/Lib/site-packages/pygments/formatters/other.py
new file mode 100644 (file)
index 0000000..6b0eeca
--- /dev/null
@@ -0,0 +1,160 @@
+"""
+    pygments.formatters.other
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Other formatters: NullFormatter, RawTokenFormatter.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.formatter import Formatter
+from pygments.util import get_choice_opt
+from pygments.token import Token
+from pygments.console import colorize
+
+__all__ = ['NullFormatter', 'RawTokenFormatter', 'TestcaseFormatter']
+
+
+class NullFormatter(Formatter):
+    """
+    Output the text unchanged without any formatting.
+    """
+    name = 'Text only'
+    aliases = ['text', 'null']
+    filenames = ['*.txt']
+
+    def format(self, tokensource, outfile):
+        enc = self.encoding
+        for ttype, value in tokensource:
+            if enc:
+                outfile.write(value.encode(enc))
+            else:
+                outfile.write(value)
+
+
+class RawTokenFormatter(Formatter):
+    r"""
+    Format tokens as a raw representation for storing token streams.
+
+    The format is ``tokentype<TAB>repr(tokenstring)\n``. The output can later
+    be converted to a token stream with the `RawTokenLexer`, described in the
+    :doc:`lexer list <lexers>`.
+
+    Only two options are accepted:
+
+    `compress`
+        If set to ``'gz'`` or ``'bz2'``, compress the output with the given
+        compression algorithm after encoding (default: ``''``).
+    `error_color`
+        If set to a color name, highlight error tokens using that color.  If
+        set but with no value, defaults to ``'red'``.
+
+        .. versionadded:: 0.11
+
+    """
+    name = 'Raw tokens'
+    aliases = ['raw', 'tokens']
+    filenames = ['*.raw']
+
+    unicodeoutput = False
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        # We ignore self.encoding if it is set, since it gets set for lexer
+        # and formatter if given with -Oencoding on the command line.
+        # The RawTokenFormatter outputs only ASCII. Override here.
+        self.encoding = 'ascii'  # let pygments.format() do the right thing
+        self.compress = get_choice_opt(options, 'compress',
+                                       ['', 'none', 'gz', 'bz2'], '')
+        self.error_color = options.get('error_color', None)
+        if self.error_color is True:
+            self.error_color = 'red'
+        if self.error_color is not None:
+            try:
+                colorize(self.error_color, '')
+            except KeyError:
+                raise ValueError(f"Invalid color {self.error_color!r} specified")
+
+    def format(self, tokensource, outfile):
+        try:
+            outfile.write(b'')
+        except TypeError:
+            raise TypeError('The raw tokens formatter needs a binary '
+                            'output file')
+        if self.compress == 'gz':
+            import gzip
+            outfile = gzip.GzipFile('', 'wb', 9, outfile)
+
+            write = outfile.write
+            flush = outfile.close
+        elif self.compress == 'bz2':
+            import bz2
+            compressor = bz2.BZ2Compressor(9)
+
+            def write(text):
+                outfile.write(compressor.compress(text))
+
+            def flush():
+                outfile.write(compressor.flush())
+                outfile.flush()
+        else:
+            write = outfile.write
+            flush = outfile.flush
+
+        if self.error_color:
+            for ttype, value in tokensource:
+                line = b"%r\t%r\n" % (ttype, value)
+                if ttype is Token.Error:
+                    write(colorize(self.error_color, line))
+                else:
+                    write(line)
+        else:
+            for ttype, value in tokensource:
+                write(b"%r\t%r\n" % (ttype, value))
+        flush()
+
+
+TESTCASE_BEFORE = '''\
+    def testNeedsName(lexer):
+        fragment = %r
+        tokens = [
+'''
+TESTCASE_AFTER = '''\
+        ]
+        assert list(lexer.get_tokens(fragment)) == tokens
+'''
+
+
+class TestcaseFormatter(Formatter):
+    """
+    Format tokens as appropriate for a new testcase.
+
+    .. versionadded:: 2.0
+    """
+    name = 'Testcase'
+    aliases = ['testcase']
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        if self.encoding is not None and self.encoding != 'utf-8':
+            raise ValueError("Only None and utf-8 are allowed encodings.")
+
+    def format(self, tokensource, outfile):
+        indentation = ' ' * 12
+        rawbuf = []
+        outbuf = []
+        for ttype, value in tokensource:
+            rawbuf.append(value)
+            outbuf.append(f'{indentation}({ttype}, {value!r}),\n')
+
+        before = TESTCASE_BEFORE % (''.join(rawbuf),)
+        during = ''.join(outbuf)
+        after = TESTCASE_AFTER
+        if self.encoding is None:
+            outfile.write(before + during + after)
+        else:
+            outfile.write(before.encode('utf-8'))
+            outfile.write(during.encode('utf-8'))
+            outfile.write(after.encode('utf-8'))
+        outfile.flush()
diff --git a/.venv/Lib/site-packages/pygments/formatters/pangomarkup.py b/.venv/Lib/site-packages/pygments/formatters/pangomarkup.py
new file mode 100644 (file)
index 0000000..8125209
--- /dev/null
@@ -0,0 +1,83 @@
+"""
+    pygments.formatters.pangomarkup
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for Pango markup output.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.formatter import Formatter
+
+
+__all__ = ['PangoMarkupFormatter']
+
+
+_escape_table = {
+    ord('&'): '&amp;',
+    ord('<'): '&lt;',
+}
+
+
+def escape_special_chars(text, table=_escape_table):
+    """Escape & and < for Pango Markup."""
+    return text.translate(table)
+
+
+class PangoMarkupFormatter(Formatter):
+    """
+    Format tokens as Pango Markup code. It can then be rendered to an SVG.
+
+    .. versionadded:: 2.9
+    """
+
+    name = 'Pango Markup'
+    aliases = ['pango', 'pangomarkup']
+    filenames = []
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+
+        self.styles = {}
+
+        for token, style in self.style:
+            start = ''
+            end = ''
+            if style['color']:
+                start += '<span fgcolor="#{}">'.format(style['color'])
+                end = '</span>' + end
+            if style['bold']:
+                start += '<b>'
+                end = '</b>' + end
+            if style['italic']:
+                start += '<i>'
+                end = '</i>' + end
+            if style['underline']:
+                start += '<u>'
+                end = '</u>' + end
+            self.styles[token] = (start, end)
+
+    def format_unencoded(self, tokensource, outfile):
+        lastval = ''
+        lasttype = None
+
+        outfile.write('<tt>')
+
+        for ttype, value in tokensource:
+            while ttype not in self.styles:
+                ttype = ttype.parent
+            if ttype == lasttype:
+                lastval += escape_special_chars(value)
+            else:
+                if lastval:
+                    stylebegin, styleend = self.styles[lasttype]
+                    outfile.write(stylebegin + lastval + styleend)
+                lastval = escape_special_chars(value)
+                lasttype = ttype
+
+        if lastval:
+            stylebegin, styleend = self.styles[lasttype]
+            outfile.write(stylebegin + lastval + styleend)
+
+        outfile.write('</tt>')
diff --git a/.venv/Lib/site-packages/pygments/formatters/rtf.py b/.venv/Lib/site-packages/pygments/formatters/rtf.py
new file mode 100644 (file)
index 0000000..fe0968d
--- /dev/null
@@ -0,0 +1,349 @@
+"""
+    pygments.formatters.rtf
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    A formatter that generates RTF files.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from collections import OrderedDict
+from pygments.formatter import Formatter
+from pygments.style import _ansimap
+from pygments.util import get_bool_opt, get_int_opt, get_list_opt, surrogatepair
+
+
+__all__ = ['RtfFormatter']
+
+
+class RtfFormatter(Formatter):
+    """
+    Format tokens as RTF markup. This formatter automatically outputs full RTF
+    documents with color information and other useful stuff. Perfect for Copy and
+    Paste into Microsoft(R) Word(R) documents.
+
+    Please note that ``encoding`` and ``outencoding`` options are ignored.
+    The RTF format is ASCII natively, but handles unicode characters correctly
+    thanks to escape sequences.
+
+    .. versionadded:: 0.6
+
+    Additional options accepted:
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+
+    `fontface`
+        The used font family, for example ``Bitstream Vera Sans``. Defaults to
+        some generic font which is supposed to have fixed width.
+
+    `fontsize`
+        Size of the font used. Size is specified in half points. The
+        default is 24 half-points, giving a size 12 font.
+
+        .. versionadded:: 2.0
+
+    `linenos`
+        Turn on line numbering (default: ``False``).
+
+        .. versionadded:: 2.18
+
+    `lineno_fontsize`
+        Font size for line numbers. Size is specified in half points
+        (default: `fontsize`). 
+
+        .. versionadded:: 2.18
+
+    `lineno_padding`
+        Number of spaces between the (inline) line numbers and the
+        source code (default: ``2``).
+
+        .. versionadded:: 2.18
+
+    `linenostart`
+        The line number for the first line (default: ``1``).
+
+        .. versionadded:: 2.18
+
+    `linenostep`
+        If set to a number n > 1, only every nth line number is printed.
+
+        .. versionadded:: 2.18
+
+    `lineno_color`
+        Color for line numbers specified as a hex triplet, e.g. ``'5e5e5e'``. 
+        Defaults to the style's line number color if it is a hex triplet, 
+        otherwise ansi bright black.
+
+        .. versionadded:: 2.18
+
+    `hl_lines`
+        Specify a list of lines to be highlighted, as line numbers separated by
+        spaces, e.g. ``'3 7 8'``. The line numbers are relative to the input 
+        (i.e. the first line is line 1) unless `hl_linenostart` is set.
+
+        .. versionadded:: 2.18
+
+    `hl_color`
+        Color for highlighting the lines specified in `hl_lines`, specified as 
+        a hex triplet (default: style's `highlight_color`).
+
+        .. versionadded:: 2.18
+
+    `hl_linenostart`
+        If set to ``True`` line numbers in `hl_lines` are specified
+        relative to `linenostart` (default ``False``).
+
+        .. versionadded:: 2.18
+    """
+    name = 'RTF'
+    aliases = ['rtf']
+    filenames = ['*.rtf']
+
+    def __init__(self, **options):
+        r"""
+        Additional options accepted:
+
+        ``fontface``
+            Name of the font used. Could for example be ``'Courier New'``
+            to further specify the default which is ``'\fmodern'``. The RTF
+            specification claims that ``\fmodern`` are "Fixed-pitch serif
+            and sans serif fonts". Hope every RTF implementation thinks
+            the same about modern...
+
+        """
+        Formatter.__init__(self, **options)
+        self.fontface = options.get('fontface') or ''
+        self.fontsize = get_int_opt(options, 'fontsize', 0)
+        self.linenos = get_bool_opt(options, 'linenos', False)
+        self.lineno_fontsize = get_int_opt(options, 'lineno_fontsize',
+                                           self.fontsize)
+        self.lineno_padding = get_int_opt(options, 'lineno_padding', 2)
+        self.linenostart = abs(get_int_opt(options, 'linenostart', 1))
+        self.linenostep = abs(get_int_opt(options, 'linenostep', 1))
+        self.hl_linenostart = get_bool_opt(options, 'hl_linenostart', False)
+
+        self.hl_color = options.get('hl_color', '')
+        if not self.hl_color:
+            self.hl_color = self.style.highlight_color
+
+        self.hl_lines = []
+        for lineno in get_list_opt(options, 'hl_lines', []):
+            try:
+                lineno = int(lineno)
+                if self.hl_linenostart:
+                    lineno = lineno - self.linenostart + 1
+                self.hl_lines.append(lineno)
+            except ValueError:
+                pass
+
+        self.lineno_color = options.get('lineno_color', '')
+        if not self.lineno_color:
+            if  self.style.line_number_color == 'inherit':
+                # style color is the css value 'inherit'
+                # default to ansi bright-black
+                self.lineno_color = _ansimap['ansibrightblack']
+            else:
+                # style color is assumed to be a hex triplet as other
+                # colors in pygments/style.py
+                self.lineno_color = self.style.line_number_color
+
+        self.color_mapping = self._create_color_mapping()
+
+    def _escape(self, text):
+        return text.replace('\\', '\\\\') \
+                   .replace('{', '\\{') \
+                   .replace('}', '\\}')
+
+    def _escape_text(self, text):
+        # empty strings, should give a small performance improvement
+        if not text:
+            return ''
+
+        # escape text
+        text = self._escape(text)
+
+        buf = []
+        for c in text:
+            cn = ord(c)
+            if cn < (2**7):
+                # ASCII character
+                buf.append(str(c))
+            elif (2**7) <= cn < (2**16):
+                # single unicode escape sequence
+                buf.append('{\\u%d}' % cn)
+            elif (2**16) <= cn:
+                # RTF limits unicode to 16 bits.
+                # Force surrogate pairs
+                buf.append('{\\u%d}{\\u%d}' % surrogatepair(cn))
+
+        return ''.join(buf).replace('\n', '\\par')
+
+    @staticmethod
+    def hex_to_rtf_color(hex_color):
+        if hex_color[0] == "#":
+            hex_color = hex_color[1:]
+
+        return '\\red%d\\green%d\\blue%d;' % (
+                        int(hex_color[0:2], 16),
+                        int(hex_color[2:4], 16),
+                        int(hex_color[4:6], 16)
+                    )
+
+    def _split_tokens_on_newlines(self, tokensource):
+        """
+        Split tokens containing newline characters into multiple token
+        each representing a line of the input file. Needed for numbering
+        lines of e.g. multiline comments.
+        """
+        for ttype, value in tokensource:
+            if value == '\n':
+                yield (ttype, value)
+            elif "\n" in value:
+                lines = value.split("\n")
+                for line in lines[:-1]:
+                    yield (ttype, line+"\n")
+                if lines[-1]:
+                    yield (ttype, lines[-1])
+            else:
+                yield (ttype, value)
+
+    def _create_color_mapping(self):
+        """
+        Create a mapping of style hex colors to index/offset in
+        the RTF color table.
+        """
+        color_mapping = OrderedDict()
+        offset = 1
+
+        if self.linenos:
+            color_mapping[self.lineno_color] = offset
+            offset += 1
+
+        if self.hl_lines:
+            color_mapping[self.hl_color] = offset
+            offset += 1
+
+        for _, style in self.style:
+            for color in style['color'], style['bgcolor'], style['border']:
+                if color and color not in color_mapping:
+                    color_mapping[color] = offset
+                    offset += 1
+
+        return color_mapping
+
+    @property
+    def _lineno_template(self):
+        if self.lineno_fontsize != self.fontsize:
+            return '{{\\fs{} \\cf{} %s{}}}'.format(self.lineno_fontsize,
+                          self.color_mapping[self.lineno_color],
+                          " " * self.lineno_padding)
+
+        return '{{\\cf{} %s{}}}'.format(self.color_mapping[self.lineno_color],
+                      " " * self.lineno_padding)
+
+    @property
+    def _hl_open_str(self):
+        return rf'{{\highlight{self.color_mapping[self.hl_color]} '
+
+    @property
+    def _rtf_header(self):
+        lines = []
+        # rtf 1.8 header
+        lines.append('{\\rtf1\\ansi\\uc0\\deff0'
+                     '{\\fonttbl{\\f0\\fmodern\\fprq1\\fcharset0%s;}}'
+                     % (self.fontface and ' '
+                        + self._escape(self.fontface) or ''))
+
+        # color table
+        lines.append('{\\colortbl;')
+        for color, _ in self.color_mapping.items():
+            lines.append(self.hex_to_rtf_color(color))
+        lines.append('}')
+
+        # font and fontsize
+        lines.append('\\f0\\sa0')
+        if self.fontsize:
+            lines.append('\\fs%d' % self.fontsize)
+
+        # ensure Libre Office Writer imports and renders consecutive
+        # space characters the same width, needed for line numbering.
+        # https://bugs.documentfoundation.org/show_bug.cgi?id=144050
+        lines.append('\\dntblnsbdb')
+
+        return lines
+
+    def format_unencoded(self, tokensource, outfile):
+        for line in self._rtf_header:
+            outfile.write(line + "\n")
+
+        tokensource = self._split_tokens_on_newlines(tokensource)
+
+        # first pass of tokens to count lines, needed for line numbering
+        if self.linenos:
+            line_count = 0
+            tokens = [] # for copying the token source generator
+            for ttype, value in tokensource:
+                tokens.append((ttype, value))
+                if value.endswith("\n"):
+                    line_count += 1
+
+            # width of line number strings (for padding with spaces)
+            linenos_width = len(str(line_count+self.linenostart-1))
+
+            tokensource = tokens
+
+        # highlight stream
+        lineno = 1
+        start_new_line = True
+        for ttype, value in tokensource:
+            if start_new_line and lineno in self.hl_lines:
+                outfile.write(self._hl_open_str)
+
+            if start_new_line and self.linenos:
+                if (lineno-self.linenostart+1)%self.linenostep == 0:
+                    current_lineno = lineno + self.linenostart - 1
+                    lineno_str = str(current_lineno).rjust(linenos_width)
+                else:
+                    lineno_str = "".rjust(linenos_width)
+                outfile.write(self._lineno_template % lineno_str)
+
+            while not self.style.styles_token(ttype) and ttype.parent:
+                ttype = ttype.parent
+            style = self.style.style_for_token(ttype)
+            buf = []
+            if style['bgcolor']:
+                buf.append('\\cb%d' % self.color_mapping[style['bgcolor']])
+            if style['color']:
+                buf.append('\\cf%d' % self.color_mapping[style['color']])
+            if style['bold']:
+                buf.append('\\b')
+            if style['italic']:
+                buf.append('\\i')
+            if style['underline']:
+                buf.append('\\ul')
+            if style['border']:
+                buf.append('\\chbrdr\\chcfpat%d' %
+                           self.color_mapping[style['border']])
+            start = ''.join(buf)
+            if start:
+                outfile.write(f'{{{start} ')
+            outfile.write(self._escape_text(value))
+            if start:
+                outfile.write('}')
+            start_new_line = False
+
+            # complete line of input
+            if value.endswith("\n"):
+                # close line highlighting
+                if lineno in self.hl_lines:
+                    outfile.write('}')
+                # newline in RTF file after closing }
+                outfile.write("\n")
+
+                start_new_line = True
+                lineno += 1
+
+        outfile.write('}\n')
diff --git a/.venv/Lib/site-packages/pygments/formatters/svg.py b/.venv/Lib/site-packages/pygments/formatters/svg.py
new file mode 100644 (file)
index 0000000..7a8ec9a
--- /dev/null
@@ -0,0 +1,185 @@
+"""
+    pygments.formatters.svg
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for SVG output.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.formatter import Formatter
+from pygments.token import Comment
+from pygments.util import get_bool_opt, get_int_opt
+
+__all__ = ['SvgFormatter']
+
+
+def escape_html(text):
+    """Escape &, <, > as well as single and double quotes for HTML."""
+    return text.replace('&', '&amp;').  \
+                replace('<', '&lt;').   \
+                replace('>', '&gt;').   \
+                replace('"', '&quot;'). \
+                replace("'", '&#39;')
+
+
+class2style = {}
+
+class SvgFormatter(Formatter):
+    """
+    Format tokens as an SVG graphics file.  This formatter is still experimental.
+    Each line of code is a ``<text>`` element with explicit ``x`` and ``y``
+    coordinates containing ``<tspan>`` elements with the individual token styles.
+
+    By default, this formatter outputs a full SVG document including doctype
+    declaration and the ``<svg>`` root element.
+
+    .. versionadded:: 0.9
+
+    Additional options accepted:
+
+    `nowrap`
+        Don't wrap the SVG ``<text>`` elements in ``<svg><g>`` elements and
+        don't add a XML declaration and a doctype.  If true, the `fontfamily`
+        and `fontsize` options are ignored.  Defaults to ``False``.
+
+    `fontfamily`
+        The value to give the wrapping ``<g>`` element's ``font-family``
+        attribute, defaults to ``"monospace"``.
+
+    `fontsize`
+        The value to give the wrapping ``<g>`` element's ``font-size``
+        attribute, defaults to ``"14px"``.
+
+    `linenos`
+        If ``True``, add line numbers (default: ``False``).
+
+    `linenostart`
+        The line number for the first line (default: ``1``).
+
+    `linenostep`
+        If set to a number n > 1, only every nth line number is printed.
+
+    `linenowidth`
+        Maximum width devoted to line numbers (default: ``3*ystep``, sufficient
+        for up to 4-digit line numbers. Increase width for longer code blocks).
+
+    `xoffset`
+        Starting offset in X direction, defaults to ``0``.
+
+    `yoffset`
+        Starting offset in Y direction, defaults to the font size if it is given
+        in pixels, or ``20`` else.  (This is necessary since text coordinates
+        refer to the text baseline, not the top edge.)
+
+    `ystep`
+        Offset to add to the Y coordinate for each subsequent line.  This should
+        roughly be the text size plus 5.  It defaults to that value if the text
+        size is given in pixels, or ``25`` else.
+
+    `spacehack`
+        Convert spaces in the source to ``&#160;``, which are non-breaking
+        spaces.  SVG provides the ``xml:space`` attribute to control how
+        whitespace inside tags is handled, in theory, the ``preserve`` value
+        could be used to keep all whitespace as-is.  However, many current SVG
+        viewers don't obey that rule, so this option is provided as a workaround
+        and defaults to ``True``.
+    """
+    name = 'SVG'
+    aliases = ['svg']
+    filenames = ['*.svg']
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.nowrap = get_bool_opt(options, 'nowrap', False)
+        self.fontfamily = options.get('fontfamily', 'monospace')
+        self.fontsize = options.get('fontsize', '14px')
+        self.xoffset = get_int_opt(options, 'xoffset', 0)
+        fs = self.fontsize.strip()
+        if fs.endswith('px'):
+            fs = fs[:-2].strip()
+        try:
+            int_fs = int(fs)
+        except ValueError:
+            int_fs = 20
+        self.yoffset = get_int_opt(options, 'yoffset', int_fs)
+        self.ystep = get_int_opt(options, 'ystep', int_fs + 5)
+        self.spacehack = get_bool_opt(options, 'spacehack', True)
+        self.linenos = get_bool_opt(options,'linenos',False)
+        self.linenostart = get_int_opt(options,'linenostart',1)
+        self.linenostep = get_int_opt(options,'linenostep',1)
+        self.linenowidth = get_int_opt(options,'linenowidth', 3*self.ystep)
+        self._stylecache = {}
+
+    def format_unencoded(self, tokensource, outfile):
+        """
+        Format ``tokensource``, an iterable of ``(tokentype, tokenstring)``
+        tuples and write it into ``outfile``.
+
+        For our implementation we put all lines in their own 'line group'.
+        """
+        x = self.xoffset
+        y = self.yoffset
+        if not self.nowrap:
+            if self.encoding:
+                outfile.write(f'<?xml version="1.0" encoding="{self.encoding}"?>\n')
+            else:
+                outfile.write('<?xml version="1.0"?>\n')
+            outfile.write('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" '
+                          '"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/'
+                          'svg10.dtd">\n')
+            outfile.write('<svg xmlns="http://www.w3.org/2000/svg">\n')
+            outfile.write(f'<g font-family="{self.fontfamily}" font-size="{self.fontsize}">\n')
+
+        counter = self.linenostart
+        counter_step = self.linenostep
+        counter_style = self._get_style(Comment)
+        line_x = x
+
+        if self.linenos:
+            if counter % counter_step == 0:
+                outfile.write(f'<text x="{x+self.linenowidth}" y="{y}" {counter_style} text-anchor="end">{counter}</text>')
+            line_x += self.linenowidth + self.ystep
+            counter += 1
+
+        outfile.write(f'<text x="{line_x}" y="{y}" xml:space="preserve">')
+        for ttype, value in tokensource:
+            style = self._get_style(ttype)
+            tspan = style and '<tspan' + style + '>' or ''
+            tspanend = tspan and '</tspan>' or ''
+            value = escape_html(value)
+            if self.spacehack:
+                value = value.expandtabs().replace(' ', '&#160;')
+            parts = value.split('\n')
+            for part in parts[:-1]:
+                outfile.write(tspan + part + tspanend)
+                y += self.ystep
+                outfile.write('</text>\n')
+                if self.linenos and counter % counter_step == 0:
+                    outfile.write(f'<text x="{x+self.linenowidth}" y="{y}" text-anchor="end" {counter_style}>{counter}</text>')
+
+                counter += 1
+                outfile.write(f'<text x="{line_x}" y="{y}" ' 'xml:space="preserve">')
+            outfile.write(tspan + parts[-1] + tspanend)
+        outfile.write('</text>')
+
+        if not self.nowrap:
+            outfile.write('</g></svg>\n')
+
+    def _get_style(self, tokentype):
+        if tokentype in self._stylecache:
+            return self._stylecache[tokentype]
+        otokentype = tokentype
+        while not self.style.styles_token(tokentype):
+            tokentype = tokentype.parent
+        value = self.style.style_for_token(tokentype)
+        result = ''
+        if value['color']:
+            result = ' fill="#' + value['color'] + '"'
+        if value['bold']:
+            result += ' font-weight="bold"'
+        if value['italic']:
+            result += ' font-style="italic"'
+        self._stylecache[otokentype] = result
+        return result
diff --git a/.venv/Lib/site-packages/pygments/formatters/terminal.py b/.venv/Lib/site-packages/pygments/formatters/terminal.py
new file mode 100644 (file)
index 0000000..511c200
--- /dev/null
@@ -0,0 +1,127 @@
+"""
+    pygments.formatters.terminal
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for terminal output with ANSI sequences.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.formatter import Formatter
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator, Generic, Token, Whitespace
+from pygments.console import ansiformat
+from pygments.util import get_choice_opt
+
+
+__all__ = ['TerminalFormatter']
+
+
+#: Map token types to a tuple of color values for light and dark
+#: backgrounds.
+TERMINAL_COLORS = {
+    Token:              ('',            ''),
+
+    Whitespace:         ('gray',   'brightblack'),
+    Comment:            ('gray',   'brightblack'),
+    Comment.Preproc:    ('cyan',        'brightcyan'),
+    Keyword:            ('blue',    'brightblue'),
+    Keyword.Type:       ('cyan',        'brightcyan'),
+    Operator.Word:      ('magenta',      'brightmagenta'),
+    Name.Builtin:       ('cyan',        'brightcyan'),
+    Name.Function:      ('green',   'brightgreen'),
+    Name.Namespace:     ('_cyan_',      '_brightcyan_'),
+    Name.Class:         ('_green_', '_brightgreen_'),
+    Name.Exception:     ('cyan',        'brightcyan'),
+    Name.Decorator:     ('brightblack',    'gray'),
+    Name.Variable:      ('red',     'brightred'),
+    Name.Constant:      ('red',     'brightred'),
+    Name.Attribute:     ('cyan',        'brightcyan'),
+    Name.Tag:           ('brightblue',        'brightblue'),
+    String:             ('yellow',       'yellow'),
+    Number:             ('blue',    'brightblue'),
+
+    Generic.Deleted:    ('brightred',        'brightred'),
+    Generic.Inserted:   ('green',  'brightgreen'),
+    Generic.Heading:    ('**',         '**'),
+    Generic.Subheading: ('*magenta*',   '*brightmagenta*'),
+    Generic.Prompt:     ('**',         '**'),
+    Generic.Error:      ('brightred',        'brightred'),
+
+    Error:              ('_brightred_',      '_brightred_'),
+}
+
+
+class TerminalFormatter(Formatter):
+    r"""
+    Format tokens with ANSI color sequences, for output in a text console.
+    Color sequences are terminated at newlines, so that paging the output
+    works correctly.
+
+    The `get_style_defs()` method doesn't do anything special since there is
+    no support for common styles.
+
+    Options accepted:
+
+    `bg`
+        Set to ``"light"`` or ``"dark"`` depending on the terminal's background
+        (default: ``"light"``).
+
+    `colorscheme`
+        A dictionary mapping token types to (lightbg, darkbg) color names or
+        ``None`` (default: ``None`` = use builtin colorscheme).
+
+    `linenos`
+        Set to ``True`` to have line numbers on the terminal output as well
+        (default: ``False`` = no line numbers).
+    """
+    name = 'Terminal'
+    aliases = ['terminal', 'console']
+    filenames = []
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+        self.darkbg = get_choice_opt(options, 'bg',
+                                     ['light', 'dark'], 'light') == 'dark'
+        self.colorscheme = options.get('colorscheme', None) or TERMINAL_COLORS
+        self.linenos = options.get('linenos', False)
+        self._lineno = 0
+
+    def format(self, tokensource, outfile):
+        return Formatter.format(self, tokensource, outfile)
+
+    def _write_lineno(self, outfile):
+        self._lineno += 1
+        outfile.write("%s%04d: " % (self._lineno != 1 and '\n' or '', self._lineno))
+
+    def _get_color(self, ttype):
+        # self.colorscheme is a dict containing usually generic types, so we
+        # have to walk the tree of dots.  The base Token type must be a key,
+        # even if it's empty string, as in the default above.
+        colors = self.colorscheme.get(ttype)
+        while colors is None:
+            ttype = ttype.parent
+            colors = self.colorscheme.get(ttype)
+        return colors[self.darkbg]
+
+    def format_unencoded(self, tokensource, outfile):
+        if self.linenos:
+            self._write_lineno(outfile)
+
+        for ttype, value in tokensource:
+            color = self._get_color(ttype)
+
+            for line in value.splitlines(True):
+                if color:
+                    outfile.write(ansiformat(color, line.rstrip('\n')))
+                else:
+                    outfile.write(line.rstrip('\n'))
+                if line.endswith('\n'):
+                    if self.linenos:
+                        self._write_lineno(outfile)
+                    else:
+                        outfile.write('\n')
+
+        if self.linenos:
+            outfile.write("\n")
diff --git a/.venv/Lib/site-packages/pygments/formatters/terminal256.py b/.venv/Lib/site-packages/pygments/formatters/terminal256.py
new file mode 100644 (file)
index 0000000..2504b4a
--- /dev/null
@@ -0,0 +1,338 @@
+"""
+    pygments.formatters.terminal256
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Formatter for 256-color terminal output with ANSI sequences.
+
+    RGB-to-XTERM color conversion routines adapted from xterm256-conv
+    tool (http://frexx.de/xterm-256-notes/data/xterm256-conv2.tar.bz2)
+    by Wolfgang Frisch.
+
+    Formatter version 1.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# TODO:
+#  - Options to map style's bold/underline/italic/border attributes
+#    to some ANSI attrbutes (something like 'italic=underline')
+#  - An option to output "style RGB to xterm RGB/index" conversion table
+#  - An option to indicate that we are running in "reverse background"
+#    xterm. This means that default colors are white-on-black, not
+#    black-on-while, so colors like "white background" need to be converted
+#    to "white background, black foreground", etc...
+
+from pygments.formatter import Formatter
+from pygments.console import codes
+from pygments.style import ansicolors
+
+
+__all__ = ['Terminal256Formatter', 'TerminalTrueColorFormatter']
+
+
+class EscapeSequence:
+    def __init__(self, fg=None, bg=None, bold=False, underline=False, italic=False):
+        self.fg = fg
+        self.bg = bg
+        self.bold = bold
+        self.underline = underline
+        self.italic = italic
+
+    def escape(self, attrs):
+        if len(attrs):
+            return "\x1b[" + ";".join(attrs) + "m"
+        return ""
+
+    def color_string(self):
+        attrs = []
+        if self.fg is not None:
+            if self.fg in ansicolors:
+                esc = codes[self.fg.replace('ansi','')]
+                if ';01m' in esc:
+                    self.bold = True
+                # extract fg color code.
+                attrs.append(esc[2:4])
+            else:
+                attrs.extend(("38", "5", "%i" % self.fg))
+        if self.bg is not None:
+            if self.bg in ansicolors:
+                esc = codes[self.bg.replace('ansi','')]
+                # extract fg color code, add 10 for bg.
+                attrs.append(str(int(esc[2:4])+10))
+            else:
+                attrs.extend(("48", "5", "%i" % self.bg))
+        if self.bold:
+            attrs.append("01")
+        if self.underline:
+            attrs.append("04")
+        if self.italic:
+            attrs.append("03")
+        return self.escape(attrs)
+
+    def true_color_string(self):
+        attrs = []
+        if self.fg:
+            attrs.extend(("38", "2", str(self.fg[0]), str(self.fg[1]), str(self.fg[2])))
+        if self.bg:
+            attrs.extend(("48", "2", str(self.bg[0]), str(self.bg[1]), str(self.bg[2])))
+        if self.bold:
+            attrs.append("01")
+        if self.underline:
+            attrs.append("04")
+        if self.italic:
+            attrs.append("03")
+        return self.escape(attrs)
+
+    def reset_string(self):
+        attrs = []
+        if self.fg is not None:
+            attrs.append("39")
+        if self.bg is not None:
+            attrs.append("49")
+        if self.bold or self.underline or self.italic:
+            attrs.append("00")
+        return self.escape(attrs)
+
+
+class Terminal256Formatter(Formatter):
+    """
+    Format tokens with ANSI color sequences, for output in a 256-color
+    terminal or console.  Like in `TerminalFormatter` color sequences
+    are terminated at newlines, so that paging the output works correctly.
+
+    The formatter takes colors from a style defined by the `style` option
+    and converts them to nearest ANSI 256-color escape sequences. Bold and
+    underline attributes from the style are preserved (and displayed).
+
+    .. versionadded:: 0.9
+
+    .. versionchanged:: 2.2
+       If the used style defines foreground colors in the form ``#ansi*``, then
+       `Terminal256Formatter` will map these to non extended foreground color.
+       See :ref:`AnsiTerminalStyle` for more information.
+
+    .. versionchanged:: 2.4
+       The ANSI color names have been updated with names that are easier to
+       understand and align with colornames of other projects and terminals.
+       See :ref:`this table <new-ansi-color-names>` for more information.
+
+
+    Options accepted:
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+
+    `linenos`
+        Set to ``True`` to have line numbers on the terminal output as well
+        (default: ``False`` = no line numbers).
+    """
+    name = 'Terminal256'
+    aliases = ['terminal256', 'console256', '256']
+    filenames = []
+
+    def __init__(self, **options):
+        Formatter.__init__(self, **options)
+
+        self.xterm_colors = []
+        self.best_match = {}
+        self.style_string = {}
+
+        self.usebold = 'nobold' not in options
+        self.useunderline = 'nounderline' not in options
+        self.useitalic = 'noitalic' not in options
+
+        self._build_color_table()  # build an RGB-to-256 color conversion table
+        self._setup_styles()  # convert selected style's colors to term. colors
+
+        self.linenos = options.get('linenos', False)
+        self._lineno = 0
+
+    def _build_color_table(self):
+        # colors 0..15: 16 basic colors
+
+        self.xterm_colors.append((0x00, 0x00, 0x00))  # 0
+        self.xterm_colors.append((0xcd, 0x00, 0x00))  # 1
+        self.xterm_colors.append((0x00, 0xcd, 0x00))  # 2
+        self.xterm_colors.append((0xcd, 0xcd, 0x00))  # 3
+        self.xterm_colors.append((0x00, 0x00, 0xee))  # 4
+        self.xterm_colors.append((0xcd, 0x00, 0xcd))  # 5
+        self.xterm_colors.append((0x00, 0xcd, 0xcd))  # 6
+        self.xterm_colors.append((0xe5, 0xe5, 0xe5))  # 7
+        self.xterm_colors.append((0x7f, 0x7f, 0x7f))  # 8
+        self.xterm_colors.append((0xff, 0x00, 0x00))  # 9
+        self.xterm_colors.append((0x00, 0xff, 0x00))  # 10
+        self.xterm_colors.append((0xff, 0xff, 0x00))  # 11
+        self.xterm_colors.append((0x5c, 0x5c, 0xff))  # 12
+        self.xterm_colors.append((0xff, 0x00, 0xff))  # 13
+        self.xterm_colors.append((0x00, 0xff, 0xff))  # 14
+        self.xterm_colors.append((0xff, 0xff, 0xff))  # 15
+
+        # colors 16..232: the 6x6x6 color cube
+
+        valuerange = (0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff)
+
+        for i in range(217):
+            r = valuerange[(i // 36) % 6]
+            g = valuerange[(i // 6) % 6]
+            b = valuerange[i % 6]
+            self.xterm_colors.append((r, g, b))
+
+        # colors 233..253: grayscale
+
+        for i in range(1, 22):
+            v = 8 + i * 10
+            self.xterm_colors.append((v, v, v))
+
+    def _closest_color(self, r, g, b):
+        distance = 257*257*3  # "infinity" (>distance from #000000 to #ffffff)
+        match = 0
+
+        for i in range(0, 254):
+            values = self.xterm_colors[i]
+
+            rd = r - values[0]
+            gd = g - values[1]
+            bd = b - values[2]
+            d = rd*rd + gd*gd + bd*bd
+
+            if d < distance:
+                match = i
+                distance = d
+        return match
+
+    def _color_index(self, color):
+        index = self.best_match.get(color, None)
+        if color in ansicolors:
+            # strip the `ansi/#ansi` part and look up code
+            index = color
+            self.best_match[color] = index
+        if index is None:
+            try:
+                rgb = int(str(color), 16)
+            except ValueError:
+                rgb = 0
+
+            r = (rgb >> 16) & 0xff
+            g = (rgb >> 8) & 0xff
+            b = rgb & 0xff
+            index = self._closest_color(r, g, b)
+            self.best_match[color] = index
+        return index
+
+    def _setup_styles(self):
+        for ttype, ndef in self.style:
+            escape = EscapeSequence()
+            # get foreground from ansicolor if set
+            if ndef['ansicolor']:
+                escape.fg = self._color_index(ndef['ansicolor'])
+            elif ndef['color']:
+                escape.fg = self._color_index(ndef['color'])
+            if ndef['bgansicolor']:
+                escape.bg = self._color_index(ndef['bgansicolor'])
+            elif ndef['bgcolor']:
+                escape.bg = self._color_index(ndef['bgcolor'])
+            if self.usebold and ndef['bold']:
+                escape.bold = True
+            if self.useunderline and ndef['underline']:
+                escape.underline = True
+            if self.useitalic and ndef['italic']:
+                escape.italic = True
+            self.style_string[str(ttype)] = (escape.color_string(),
+                                             escape.reset_string())
+
+    def _write_lineno(self, outfile):
+        self._lineno += 1
+        outfile.write("%s%04d: " % (self._lineno != 1 and '\n' or '', self._lineno))
+
+    def format(self, tokensource, outfile):
+        return Formatter.format(self, tokensource, outfile)
+
+    def format_unencoded(self, tokensource, outfile):
+        if self.linenos:
+            self._write_lineno(outfile)
+
+        for ttype, value in tokensource:
+            not_found = True
+            while ttype and not_found:
+                try:
+                    # outfile.write( "<" + str(ttype) + ">" )
+                    on, off = self.style_string[str(ttype)]
+
+                    # Like TerminalFormatter, add "reset colors" escape sequence
+                    # on newline.
+                    spl = value.split('\n')
+                    for line in spl[:-1]:
+                        if line:
+                            outfile.write(on + line + off)
+                        if self.linenos:
+                            self._write_lineno(outfile)
+                        else:
+                            outfile.write('\n')
+
+                    if spl[-1]:
+                        outfile.write(on + spl[-1] + off)
+
+                    not_found = False
+                    # outfile.write( '#' + str(ttype) + '#' )
+
+                except KeyError:
+                    # ottype = ttype
+                    ttype = ttype.parent
+                    # outfile.write( '!' + str(ottype) + '->' + str(ttype) + '!' )
+
+            if not_found:
+                outfile.write(value)
+
+        if self.linenos:
+            outfile.write("\n")
+
+
+
+class TerminalTrueColorFormatter(Terminal256Formatter):
+    r"""
+    Format tokens with ANSI color sequences, for output in a true-color
+    terminal or console.  Like in `TerminalFormatter` color sequences
+    are terminated at newlines, so that paging the output works correctly.
+
+    .. versionadded:: 2.1
+
+    Options accepted:
+
+    `style`
+        The style to use, can be a string or a Style subclass (default:
+        ``'default'``).
+    """
+    name = 'TerminalTrueColor'
+    aliases = ['terminal16m', 'console16m', '16m']
+    filenames = []
+
+    def _build_color_table(self):
+        pass
+
+    def _color_tuple(self, color):
+        try:
+            rgb = int(str(color), 16)
+        except ValueError:
+            return None
+        r = (rgb >> 16) & 0xff
+        g = (rgb >> 8) & 0xff
+        b = rgb & 0xff
+        return (r, g, b)
+
+    def _setup_styles(self):
+        for ttype, ndef in self.style:
+            escape = EscapeSequence()
+            if ndef['color']:
+                escape.fg = self._color_tuple(ndef['color'])
+            if ndef['bgcolor']:
+                escape.bg = self._color_tuple(ndef['bgcolor'])
+            if self.usebold and ndef['bold']:
+                escape.bold = True
+            if self.useunderline and ndef['underline']:
+                escape.underline = True
+            if self.useitalic and ndef['italic']:
+                escape.italic = True
+            self.style_string[str(ttype)] = (escape.true_color_string(),
+                                             escape.reset_string())
diff --git a/.venv/Lib/site-packages/pygments/lexer.py b/.venv/Lib/site-packages/pygments/lexer.py
new file mode 100644 (file)
index 0000000..453d675
--- /dev/null
@@ -0,0 +1,961 @@
+"""
+    pygments.lexer
+    ~~~~~~~~~~~~~~
+
+    Base lexer classes.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+import sys
+import time
+
+from pygments.filter import apply_filters, Filter
+from pygments.filters import get_filter_by_name
+from pygments.token import Error, Text, Other, Whitespace, _TokenType
+from pygments.util import get_bool_opt, get_int_opt, get_list_opt, \
+    make_analysator, Future, guess_decode
+from pygments.regexopt import regex_opt
+
+__all__ = ['Lexer', 'RegexLexer', 'ExtendedRegexLexer', 'DelegatingLexer',
+           'LexerContext', 'include', 'inherit', 'bygroups', 'using', 'this',
+           'default', 'words', 'line_re']
+
+line_re = re.compile('.*?\n')
+
+_encoding_map = [(b'\xef\xbb\xbf', 'utf-8'),
+                 (b'\xff\xfe\0\0', 'utf-32'),
+                 (b'\0\0\xfe\xff', 'utf-32be'),
+                 (b'\xff\xfe', 'utf-16'),
+                 (b'\xfe\xff', 'utf-16be')]
+
+_default_analyse = staticmethod(lambda x: 0.0)
+
+
+class LexerMeta(type):
+    """
+    This metaclass automagically converts ``analyse_text`` methods into
+    static methods which always return float values.
+    """
+
+    def __new__(mcs, name, bases, d):
+        if 'analyse_text' in d:
+            d['analyse_text'] = make_analysator(d['analyse_text'])
+        return type.__new__(mcs, name, bases, d)
+
+
+class Lexer(metaclass=LexerMeta):
+    """
+    Lexer for a specific language.
+
+    See also :doc:`lexerdevelopment`, a high-level guide to writing
+    lexers.
+
+    Lexer classes have attributes used for choosing the most appropriate
+    lexer based on various criteria.
+
+    .. autoattribute:: name
+       :no-value:
+    .. autoattribute:: aliases
+       :no-value:
+    .. autoattribute:: filenames
+       :no-value:
+    .. autoattribute:: alias_filenames
+    .. autoattribute:: mimetypes
+       :no-value:
+    .. autoattribute:: priority
+
+    Lexers included in Pygments should have two additional attributes:
+
+    .. autoattribute:: url
+       :no-value:
+    .. autoattribute:: version_added
+       :no-value:
+
+    Lexers included in Pygments may have additional attributes:
+
+    .. autoattribute:: _example
+       :no-value:
+
+    You can pass options to the constructor. The basic options recognized
+    by all lexers and processed by the base `Lexer` class are:
+
+    ``stripnl``
+        Strip leading and trailing newlines from the input (default: True).
+    ``stripall``
+        Strip all leading and trailing whitespace from the input
+        (default: False).
+    ``ensurenl``
+        Make sure that the input ends with a newline (default: True).  This
+        is required for some lexers that consume input linewise.
+
+        .. versionadded:: 1.3
+
+    ``tabsize``
+        If given and greater than 0, expand tabs in the input (default: 0).
+    ``encoding``
+        If given, must be an encoding name. This encoding will be used to
+        convert the input string to Unicode, if it is not already a Unicode
+        string (default: ``'guess'``, which uses a simple UTF-8 / Locale /
+        Latin1 detection.  Can also be ``'chardet'`` to use the chardet
+        library, if it is installed.
+    ``inencoding``
+        Overrides the ``encoding`` if given.
+    """
+
+    #: Full name of the lexer, in human-readable form
+    name = None
+
+    #: A list of short, unique identifiers that can be used to look
+    #: up the lexer from a list, e.g., using `get_lexer_by_name()`.
+    aliases = []
+
+    #: A list of `fnmatch` patterns that match filenames which contain
+    #: content for this lexer. The patterns in this list should be unique among
+    #: all lexers.
+    filenames = []
+
+    #: A list of `fnmatch` patterns that match filenames which may or may not
+    #: contain content for this lexer. This list is used by the
+    #: :func:`.guess_lexer_for_filename()` function, to determine which lexers
+    #: are then included in guessing the correct one. That means that
+    #: e.g. every lexer for HTML and a template language should include
+    #: ``\*.html`` in this list.
+    alias_filenames = []
+
+    #: A list of MIME types for content that can be lexed with this lexer.
+    mimetypes = []
+
+    #: Priority, should multiple lexers match and no content is provided
+    priority = 0
+
+    #: URL of the language specification/definition. Used in the Pygments
+    #: documentation. Set to an empty string to disable.
+    url = None
+
+    #: Version of Pygments in which the lexer was added.
+    version_added = None
+
+    #: Example file name. Relative to the ``tests/examplefiles`` directory.
+    #: This is used by the documentation generator to show an example.
+    _example = None
+
+    def __init__(self, **options):
+        """
+        This constructor takes arbitrary options as keyword arguments.
+        Every subclass must first process its own options and then call
+        the `Lexer` constructor, since it processes the basic
+        options like `stripnl`.
+
+        An example looks like this:
+
+        .. sourcecode:: python
+
+           def __init__(self, **options):
+               self.compress = options.get('compress', '')
+               Lexer.__init__(self, **options)
+
+        As these options must all be specifiable as strings (due to the
+        command line usage), there are various utility functions
+        available to help with that, see `Utilities`_.
+        """
+        self.options = options
+        self.stripnl = get_bool_opt(options, 'stripnl', True)
+        self.stripall = get_bool_opt(options, 'stripall', False)
+        self.ensurenl = get_bool_opt(options, 'ensurenl', True)
+        self.tabsize = get_int_opt(options, 'tabsize', 0)
+        self.encoding = options.get('encoding', 'guess')
+        self.encoding = options.get('inencoding') or self.encoding
+        self.filters = []
+        for filter_ in get_list_opt(options, 'filters', ()):
+            self.add_filter(filter_)
+
+    def __repr__(self):
+        if self.options:
+            return f'<pygments.lexers.{self.__class__.__name__} with {self.options!r}>'
+        else:
+            return f'<pygments.lexers.{self.__class__.__name__}>'
+
+    def add_filter(self, filter_, **options):
+        """
+        Add a new stream filter to this lexer.
+        """
+        if not isinstance(filter_, Filter):
+            filter_ = get_filter_by_name(filter_, **options)
+        self.filters.append(filter_)
+
+    def analyse_text(text):
+        """
+        A static method which is called for lexer guessing.
+
+        It should analyse the text and return a float in the range
+        from ``0.0`` to ``1.0``.  If it returns ``0.0``, the lexer
+        will not be selected as the most probable one, if it returns
+        ``1.0``, it will be selected immediately.  This is used by
+        `guess_lexer`.
+
+        The `LexerMeta` metaclass automatically wraps this function so
+        that it works like a static method (no ``self`` or ``cls``
+        parameter) and the return value is automatically converted to
+        `float`. If the return value is an object that is boolean `False`
+        it's the same as if the return values was ``0.0``.
+        """
+
+    def _preprocess_lexer_input(self, text):
+        """Apply preprocessing such as decoding the input, removing BOM and normalizing newlines."""
+
+        if not isinstance(text, str):
+            if self.encoding == 'guess':
+                text, _ = guess_decode(text)
+            elif self.encoding == 'chardet':
+                try:
+                    import chardet
+                except ImportError as e:
+                    raise ImportError('To enable chardet encoding guessing, '
+                                      'please install the chardet library '
+                                      'from http://chardet.feedparser.org/') from e
+                # check for BOM first
+                decoded = None
+                for bom, encoding in _encoding_map:
+                    if text.startswith(bom):
+                        decoded = text[len(bom):].decode(encoding, 'replace')
+                        break
+                # no BOM found, so use chardet
+                if decoded is None:
+                    enc = chardet.detect(text[:1024])  # Guess using first 1KB
+                    decoded = text.decode(enc.get('encoding') or 'utf-8',
+                                          'replace')
+                text = decoded
+            else:
+                text = text.decode(self.encoding)
+                if text.startswith('\ufeff'):
+                    text = text[len('\ufeff'):]
+        else:
+            if text.startswith('\ufeff'):
+                text = text[len('\ufeff'):]
+
+        # text now *is* a unicode string
+        text = text.replace('\r\n', '\n')
+        text = text.replace('\r', '\n')
+        if self.stripall:
+            text = text.strip()
+        elif self.stripnl:
+            text = text.strip('\n')
+        if self.tabsize > 0:
+            text = text.expandtabs(self.tabsize)
+        if self.ensurenl and not text.endswith('\n'):
+            text += '\n'
+
+        return text
+
+    def get_tokens(self, text, unfiltered=False):
+        """
+        This method is the basic interface of a lexer. It is called by
+        the `highlight()` function. It must process the text and return an
+        iterable of ``(tokentype, value)`` pairs from `text`.
+
+        Normally, you don't need to override this method. The default
+        implementation processes the options recognized by all lexers
+        (`stripnl`, `stripall` and so on), and then yields all tokens
+        from `get_tokens_unprocessed()`, with the ``index`` dropped.
+
+        If `unfiltered` is set to `True`, the filtering mechanism is
+        bypassed even if filters are defined.
+        """
+        text = self._preprocess_lexer_input(text)
+
+        def streamer():
+            for _, t, v in self.get_tokens_unprocessed(text):
+                yield t, v
+        stream = streamer()
+        if not unfiltered:
+            stream = apply_filters(stream, self.filters, self)
+        return stream
+
+    def get_tokens_unprocessed(self, text):
+        """
+        This method should process the text and return an iterable of
+        ``(index, tokentype, value)`` tuples where ``index`` is the starting
+        position of the token within the input text.
+
+        It must be overridden by subclasses. It is recommended to
+        implement it as a generator to maximize effectiveness.
+        """
+        raise NotImplementedError
+
+
+class DelegatingLexer(Lexer):
+    """
+    This lexer takes two lexer as arguments. A root lexer and
+    a language lexer. First everything is scanned using the language
+    lexer, afterwards all ``Other`` tokens are lexed using the root
+    lexer.
+
+    The lexers from the ``template`` lexer package use this base lexer.
+    """
+
+    def __init__(self, _root_lexer, _language_lexer, _needle=Other, **options):
+        self.root_lexer = _root_lexer(**options)
+        self.language_lexer = _language_lexer(**options)
+        self.needle = _needle
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        buffered = ''
+        insertions = []
+        lng_buffer = []
+        for i, t, v in self.language_lexer.get_tokens_unprocessed(text):
+            if t is self.needle:
+                if lng_buffer:
+                    insertions.append((len(buffered), lng_buffer))
+                    lng_buffer = []
+                buffered += v
+            else:
+                lng_buffer.append((i, t, v))
+        if lng_buffer:
+            insertions.append((len(buffered), lng_buffer))
+        return do_insertions(insertions,
+                             self.root_lexer.get_tokens_unprocessed(buffered))
+
+
+# ------------------------------------------------------------------------------
+# RegexLexer and ExtendedRegexLexer
+#
+
+
+class include(str):  # pylint: disable=invalid-name
+    """
+    Indicates that a state should include rules from another state.
+    """
+    pass
+
+
+class _inherit:
+    """
+    Indicates the a state should inherit from its superclass.
+    """
+    def __repr__(self):
+        return 'inherit'
+
+inherit = _inherit()  # pylint: disable=invalid-name
+
+
+class combined(tuple):  # pylint: disable=invalid-name
+    """
+    Indicates a state combined from multiple states.
+    """
+
+    def __new__(cls, *args):
+        return tuple.__new__(cls, args)
+
+    def __init__(self, *args):
+        # tuple.__init__ doesn't do anything
+        pass
+
+
+class _PseudoMatch:
+    """
+    A pseudo match object constructed from a string.
+    """
+
+    def __init__(self, start, text):
+        self._text = text
+        self._start = start
+
+    def start(self, arg=None):
+        return self._start
+
+    def end(self, arg=None):
+        return self._start + len(self._text)
+
+    def group(self, arg=None):
+        if arg:
+            raise IndexError('No such group')
+        return self._text
+
+    def groups(self):
+        return (self._text,)
+
+    def groupdict(self):
+        return {}
+
+
+def bygroups(*args):
+    """
+    Callback that yields multiple actions for each group in the match.
+    """
+    def callback(lexer, match, ctx=None):
+        for i, action in enumerate(args):
+            if action is None:
+                continue
+            elif type(action) is _TokenType:
+                data = match.group(i + 1)
+                if data:
+                    yield match.start(i + 1), action, data
+            else:
+                data = match.group(i + 1)
+                if data is not None:
+                    if ctx:
+                        ctx.pos = match.start(i + 1)
+                    for item in action(lexer,
+                                       _PseudoMatch(match.start(i + 1), data), ctx):
+                        if item:
+                            yield item
+        if ctx:
+            ctx.pos = match.end()
+    return callback
+
+
+class _This:
+    """
+    Special singleton used for indicating the caller class.
+    Used by ``using``.
+    """
+
+this = _This()
+
+
+def using(_other, **kwargs):
+    """
+    Callback that processes the match with a different lexer.
+
+    The keyword arguments are forwarded to the lexer, except `state` which
+    is handled separately.
+
+    `state` specifies the state that the new lexer will start in, and can
+    be an enumerable such as ('root', 'inline', 'string') or a simple
+    string which is assumed to be on top of the root state.
+
+    Note: For that to work, `_other` must not be an `ExtendedRegexLexer`.
+    """
+    gt_kwargs = {}
+    if 'state' in kwargs:
+        s = kwargs.pop('state')
+        if isinstance(s, (list, tuple)):
+            gt_kwargs['stack'] = s
+        else:
+            gt_kwargs['stack'] = ('root', s)
+
+    if _other is this:
+        def callback(lexer, match, ctx=None):
+            # if keyword arguments are given the callback
+            # function has to create a new lexer instance
+            if kwargs:
+                # XXX: cache that somehow
+                kwargs.update(lexer.options)
+                lx = lexer.__class__(**kwargs)
+            else:
+                lx = lexer
+            s = match.start()
+            for i, t, v in lx.get_tokens_unprocessed(match.group(), **gt_kwargs):
+                yield i + s, t, v
+            if ctx:
+                ctx.pos = match.end()
+    else:
+        def callback(lexer, match, ctx=None):
+            # XXX: cache that somehow
+            kwargs.update(lexer.options)
+            lx = _other(**kwargs)
+
+            s = match.start()
+            for i, t, v in lx.get_tokens_unprocessed(match.group(), **gt_kwargs):
+                yield i + s, t, v
+            if ctx:
+                ctx.pos = match.end()
+    return callback
+
+
+class default:
+    """
+    Indicates a state or state action (e.g. #pop) to apply.
+    For example default('#pop') is equivalent to ('', Token, '#pop')
+    Note that state tuples may be used as well.
+
+    .. versionadded:: 2.0
+    """
+    def __init__(self, state):
+        self.state = state
+
+
+class words(Future):
+    """
+    Indicates a list of literal words that is transformed into an optimized
+    regex that matches any of the words.
+
+    .. versionadded:: 2.0
+    """
+    def __init__(self, words, prefix='', suffix=''):
+        self.words = words
+        self.prefix = prefix
+        self.suffix = suffix
+
+    def get(self):
+        return regex_opt(self.words, prefix=self.prefix, suffix=self.suffix)
+
+
+class RegexLexerMeta(LexerMeta):
+    """
+    Metaclass for RegexLexer, creates the self._tokens attribute from
+    self.tokens on the first instantiation.
+    """
+
+    def _process_regex(cls, regex, rflags, state):
+        """Preprocess the regular expression component of a token definition."""
+        if isinstance(regex, Future):
+            regex = regex.get()
+        return re.compile(regex, rflags).match
+
+    def _process_token(cls, token):
+        """Preprocess the token component of a token definition."""
+        assert type(token) is _TokenType or callable(token), \
+            f'token type must be simple type or callable, not {token!r}'
+        return token
+
+    def _process_new_state(cls, new_state, unprocessed, processed):
+        """Preprocess the state transition action of a token definition."""
+        if isinstance(new_state, str):
+            # an existing state
+            if new_state == '#pop':
+                return -1
+            elif new_state in unprocessed:
+                return (new_state,)
+            elif new_state == '#push':
+                return new_state
+            elif new_state[:5] == '#pop:':
+                return -int(new_state[5:])
+            else:
+                assert False, f'unknown new state {new_state!r}'
+        elif isinstance(new_state, combined):
+            # combine a new state from existing ones
+            tmp_state = '_tmp_%d' % cls._tmpname
+            cls._tmpname += 1
+            itokens = []
+            for istate in new_state:
+                assert istate != new_state, f'circular state ref {istate!r}'
+                itokens.extend(cls._process_state(unprocessed,
+                                                  processed, istate))
+            processed[tmp_state] = itokens
+            return (tmp_state,)
+        elif isinstance(new_state, tuple):
+            # push more than one state
+            for istate in new_state:
+                assert (istate in unprocessed or
+                        istate in ('#pop', '#push')), \
+                    'unknown new state ' + istate
+            return new_state
+        else:
+            assert False, f'unknown new state def {new_state!r}'
+
+    def _process_state(cls, unprocessed, processed, state):
+        """Preprocess a single state definition."""
+        assert isinstance(state, str), f"wrong state name {state!r}"
+        assert state[0] != '#', f"invalid state name {state!r}"
+        if state in processed:
+            return processed[state]
+        tokens = processed[state] = []
+        rflags = cls.flags
+        for tdef in unprocessed[state]:
+            if isinstance(tdef, include):
+                # it's a state reference
+                assert tdef != state, f"circular state reference {state!r}"
+                tokens.extend(cls._process_state(unprocessed, processed,
+                                                 str(tdef)))
+                continue
+            if isinstance(tdef, _inherit):
+                # should be processed already, but may not in the case of:
+                # 1. the state has no counterpart in any parent
+                # 2. the state includes more than one 'inherit'
+                continue
+            if isinstance(tdef, default):
+                new_state = cls._process_new_state(tdef.state, unprocessed, processed)
+                tokens.append((re.compile('').match, None, new_state))
+                continue
+
+            assert type(tdef) is tuple, f"wrong rule def {tdef!r}"
+
+            try:
+                rex = cls._process_regex(tdef[0], rflags, state)
+            except Exception as err:
+                raise ValueError(f"uncompilable regex {tdef[0]!r} in state {state!r} of {cls!r}: {err}") from err
+
+            token = cls._process_token(tdef[1])
+
+            if len(tdef) == 2:
+                new_state = None
+            else:
+                new_state = cls._process_new_state(tdef[2],
+                                                   unprocessed, processed)
+
+            tokens.append((rex, token, new_state))
+        return tokens
+
+    def process_tokendef(cls, name, tokendefs=None):
+        """Preprocess a dictionary of token definitions."""
+        processed = cls._all_tokens[name] = {}
+        tokendefs = tokendefs or cls.tokens[name]
+        for state in list(tokendefs):
+            cls._process_state(tokendefs, processed, state)
+        return processed
+
+    def get_tokendefs(cls):
+        """
+        Merge tokens from superclasses in MRO order, returning a single tokendef
+        dictionary.
+
+        Any state that is not defined by a subclass will be inherited
+        automatically.  States that *are* defined by subclasses will, by
+        default, override that state in the superclass.  If a subclass wishes to
+        inherit definitions from a superclass, it can use the special value
+        "inherit", which will cause the superclass' state definition to be
+        included at that point in the state.
+        """
+        tokens = {}
+        inheritable = {}
+        for c in cls.__mro__:
+            toks = c.__dict__.get('tokens', {})
+
+            for state, items in toks.items():
+                curitems = tokens.get(state)
+                if curitems is None:
+                    # N.b. because this is assigned by reference, sufficiently
+                    # deep hierarchies are processed incrementally (e.g. for
+                    # A(B), B(C), C(RegexLexer), B will be premodified so X(B)
+                    # will not see any inherits in B).
+                    tokens[state] = items
+                    try:
+                        inherit_ndx = items.index(inherit)
+                    except ValueError:
+                        continue
+                    inheritable[state] = inherit_ndx
+                    continue
+
+                inherit_ndx = inheritable.pop(state, None)
+                if inherit_ndx is None:
+                    continue
+
+                # Replace the "inherit" value with the items
+                curitems[inherit_ndx:inherit_ndx+1] = items
+                try:
+                    # N.b. this is the index in items (that is, the superclass
+                    # copy), so offset required when storing below.
+                    new_inh_ndx = items.index(inherit)
+                except ValueError:
+                    pass
+                else:
+                    inheritable[state] = inherit_ndx + new_inh_ndx
+
+        return tokens
+
+    def __call__(cls, *args, **kwds):
+        """Instantiate cls after preprocessing its token definitions."""
+        if '_tokens' not in cls.__dict__:
+            cls._all_tokens = {}
+            cls._tmpname = 0
+            if hasattr(cls, 'token_variants') and cls.token_variants:
+                # don't process yet
+                pass
+            else:
+                cls._tokens = cls.process_tokendef('', cls.get_tokendefs())
+
+        return type.__call__(cls, *args, **kwds)
+
+
+class RegexLexer(Lexer, metaclass=RegexLexerMeta):
+    """
+    Base for simple stateful regular expression-based lexers.
+    Simplifies the lexing process so that you need only
+    provide a list of states and regular expressions.
+    """
+
+    #: Flags for compiling the regular expressions.
+    #: Defaults to MULTILINE.
+    flags = re.MULTILINE
+
+    #: At all time there is a stack of states. Initially, the stack contains
+    #: a single state 'root'. The top of the stack is called "the current state".
+    #:
+    #: Dict of ``{'state': [(regex, tokentype, new_state), ...], ...}``
+    #:
+    #: ``new_state`` can be omitted to signify no state transition.
+    #: If ``new_state`` is a string, it is pushed on the stack. This ensure
+    #: the new current state is ``new_state``.
+    #: If ``new_state`` is a tuple of strings, all of those strings are pushed
+    #: on the stack and the current state will be the last element of the list.
+    #: ``new_state`` can also be ``combined('state1', 'state2', ...)``
+    #: to signify a new, anonymous state combined from the rules of two
+    #: or more existing ones.
+    #: Furthermore, it can be '#pop' to signify going back one step in
+    #: the state stack, or '#push' to push the current state on the stack
+    #: again. Note that if you push while in a combined state, the combined
+    #: state itself is pushed, and not only the state in which the rule is
+    #: defined.
+    #:
+    #: The tuple can also be replaced with ``include('state')``, in which
+    #: case the rules from the state named by the string are included in the
+    #: current one.
+    tokens = {}
+
+    def get_tokens_unprocessed(self, text, stack=('root',)):
+        """
+        Split ``text`` into (tokentype, text) pairs.
+
+        ``stack`` is the initial stack (default: ``['root']``)
+        """
+        pos = 0
+        tokendefs = self._tokens
+        statestack = list(stack)
+        statetokens = tokendefs[statestack[-1]]
+        while 1:
+            for rexmatch, action, new_state in statetokens:
+                m = rexmatch(text, pos)
+                if m:
+                    if action is not None:
+                        if type(action) is _TokenType:
+                            yield pos, action, m.group()
+                        else:
+                            yield from action(self, m)
+                    pos = m.end()
+                    if new_state is not None:
+                        # state transition
+                        if isinstance(new_state, tuple):
+                            for state in new_state:
+                                if state == '#pop':
+                                    if len(statestack) > 1:
+                                        statestack.pop()
+                                elif state == '#push':
+                                    statestack.append(statestack[-1])
+                                else:
+                                    statestack.append(state)
+                        elif isinstance(new_state, int):
+                            # pop, but keep at least one state on the stack
+                            # (random code leading to unexpected pops should
+                            # not allow exceptions)
+                            if abs(new_state) >= len(statestack):
+                                del statestack[1:]
+                            else:
+                                del statestack[new_state:]
+                        elif new_state == '#push':
+                            statestack.append(statestack[-1])
+                        else:
+                            assert False, f"wrong state def: {new_state!r}"
+                        statetokens = tokendefs[statestack[-1]]
+                    break
+            else:
+                # We are here only if all state tokens have been considered
+                # and there was not a match on any of them.
+                try:
+                    if text[pos] == '\n':
+                        # at EOL, reset state to "root"
+                        statestack = ['root']
+                        statetokens = tokendefs['root']
+                        yield pos, Whitespace, '\n'
+                        pos += 1
+                        continue
+                    yield pos, Error, text[pos]
+                    pos += 1
+                except IndexError:
+                    break
+
+
+class LexerContext:
+    """
+    A helper object that holds lexer position data.
+    """
+
+    def __init__(self, text, pos, stack=None, end=None):
+        self.text = text
+        self.pos = pos
+        self.end = end or len(text)  # end=0 not supported ;-)
+        self.stack = stack or ['root']
+
+    def __repr__(self):
+        return f'LexerContext({self.text!r}, {self.pos!r}, {self.stack!r})'
+
+
+class ExtendedRegexLexer(RegexLexer):
+    """
+    A RegexLexer that uses a context object to store its state.
+    """
+
+    def get_tokens_unprocessed(self, text=None, context=None):
+        """
+        Split ``text`` into (tokentype, text) pairs.
+        If ``context`` is given, use this lexer context instead.
+        """
+        tokendefs = self._tokens
+        if not context:
+            ctx = LexerContext(text, 0)
+            statetokens = tokendefs['root']
+        else:
+            ctx = context
+            statetokens = tokendefs[ctx.stack[-1]]
+            text = ctx.text
+        while 1:
+            for rexmatch, action, new_state in statetokens:
+                m = rexmatch(text, ctx.pos, ctx.end)
+                if m:
+                    if action is not None:
+                        if type(action) is _TokenType:
+                            yield ctx.pos, action, m.group()
+                            ctx.pos = m.end()
+                        else:
+                            yield from action(self, m, ctx)
+                            if not new_state:
+                                # altered the state stack?
+                                statetokens = tokendefs[ctx.stack[-1]]
+                    # CAUTION: callback must set ctx.pos!
+                    if new_state is not None:
+                        # state transition
+                        if isinstance(new_state, tuple):
+                            for state in new_state:
+                                if state == '#pop':
+                                    if len(ctx.stack) > 1:
+                                        ctx.stack.pop()
+                                elif state == '#push':
+                                    ctx.stack.append(ctx.stack[-1])
+                                else:
+                                    ctx.stack.append(state)
+                        elif isinstance(new_state, int):
+                            # see RegexLexer for why this check is made
+                            if abs(new_state) >= len(ctx.stack):
+                                del ctx.stack[1:]
+                            else:
+                                del ctx.stack[new_state:]
+                        elif new_state == '#push':
+                            ctx.stack.append(ctx.stack[-1])
+                        else:
+                            assert False, f"wrong state def: {new_state!r}"
+                        statetokens = tokendefs[ctx.stack[-1]]
+                    break
+            else:
+                try:
+                    if ctx.pos >= ctx.end:
+                        break
+                    if text[ctx.pos] == '\n':
+                        # at EOL, reset state to "root"
+                        ctx.stack = ['root']
+                        statetokens = tokendefs['root']
+                        yield ctx.pos, Text, '\n'
+                        ctx.pos += 1
+                        continue
+                    yield ctx.pos, Error, text[ctx.pos]
+                    ctx.pos += 1
+                except IndexError:
+                    break
+
+
+def do_insertions(insertions, tokens):
+    """
+    Helper for lexers which must combine the results of several
+    sublexers.
+
+    ``insertions`` is a list of ``(index, itokens)`` pairs.
+    Each ``itokens`` iterable should be inserted at position
+    ``index`` into the token stream given by the ``tokens``
+    argument.
+
+    The result is a combined token stream.
+
+    TODO: clean up the code here.
+    """
+    insertions = iter(insertions)
+    try:
+        index, itokens = next(insertions)
+    except StopIteration:
+        # no insertions
+        yield from tokens
+        return
+
+    realpos = None
+    insleft = True
+
+    # iterate over the token stream where we want to insert
+    # the tokens from the insertion list.
+    for i, t, v in tokens:
+        # first iteration. store the position of first item
+        if realpos is None:
+            realpos = i
+        oldi = 0
+        while insleft and i + len(v) >= index:
+            tmpval = v[oldi:index - i]
+            if tmpval:
+                yield realpos, t, tmpval
+                realpos += len(tmpval)
+            for it_index, it_token, it_value in itokens:
+                yield realpos, it_token, it_value
+                realpos += len(it_value)
+            oldi = index - i
+            try:
+                index, itokens = next(insertions)
+            except StopIteration:
+                insleft = False
+                break  # not strictly necessary
+        if oldi < len(v):
+            yield realpos, t, v[oldi:]
+            realpos += len(v) - oldi
+
+    # leftover tokens
+    while insleft:
+        # no normal tokens, set realpos to zero
+        realpos = realpos or 0
+        for p, t, v in itokens:
+            yield realpos, t, v
+            realpos += len(v)
+        try:
+            index, itokens = next(insertions)
+        except StopIteration:
+            insleft = False
+            break  # not strictly necessary
+
+
+class ProfilingRegexLexerMeta(RegexLexerMeta):
+    """Metaclass for ProfilingRegexLexer, collects regex timing info."""
+
+    def _process_regex(cls, regex, rflags, state):
+        if isinstance(regex, words):
+            rex = regex_opt(regex.words, prefix=regex.prefix,
+                            suffix=regex.suffix)
+        else:
+            rex = regex
+        compiled = re.compile(rex, rflags)
+
+        def match_func(text, pos, endpos=sys.maxsize):
+            info = cls._prof_data[-1].setdefault((state, rex), [0, 0.0])
+            t0 = time.time()
+            res = compiled.match(text, pos, endpos)
+            t1 = time.time()
+            info[0] += 1
+            info[1] += t1 - t0
+            return res
+        return match_func
+
+
+class ProfilingRegexLexer(RegexLexer, metaclass=ProfilingRegexLexerMeta):
+    """Drop-in replacement for RegexLexer that does profiling of its regexes."""
+
+    _prof_data = []
+    _prof_sort_index = 4  # defaults to time per call
+
+    def get_tokens_unprocessed(self, text, stack=('root',)):
+        # this needs to be a stack, since using(this) will produce nested calls
+        self.__class__._prof_data.append({})
+        yield from RegexLexer.get_tokens_unprocessed(self, text, stack)
+        rawdata = self.__class__._prof_data.pop()
+        data = sorted(((s, repr(r).strip('u\'').replace('\\\\', '\\')[:65],
+                        n, 1000 * t, 1000 * t / n)
+                       for ((s, r), (n, t)) in rawdata.items()),
+                      key=lambda x: x[self._prof_sort_index],
+                      reverse=True)
+        sum_total = sum(x[3] for x in data)
+
+        print()
+        print('Profiling result for %s lexing %d chars in %.3f ms' %
+              (self.__class__.__name__, len(text), sum_total))
+        print('=' * 110)
+        print('%-20s %-64s ncalls  tottime  percall' % ('state', 'regex'))
+        print('-' * 110)
+        for d in data:
+            print('%-20s %-65s %5d %8.4f %8.4f' % d)
+        print('=' * 110)
diff --git a/.venv/Lib/site-packages/pygments/lexers/__init__.py b/.venv/Lib/site-packages/pygments/lexers/__init__.py
new file mode 100644 (file)
index 0000000..da51000
--- /dev/null
@@ -0,0 +1,362 @@
+"""
+    pygments.lexers
+    ~~~~~~~~~~~~~~~
+
+    Pygments lexers.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+import sys
+import types
+import fnmatch
+from os.path import basename
+
+from pygments.lexers._mapping import LEXERS
+from pygments.modeline import get_filetype_from_buffer
+from pygments.plugin import find_plugin_lexers
+from pygments.util import ClassNotFound, guess_decode
+
+COMPAT = {
+    'Python3Lexer': 'PythonLexer',
+    'Python3TracebackLexer': 'PythonTracebackLexer',
+    'LeanLexer': 'Lean3Lexer',
+}
+
+__all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class',
+           'guess_lexer', 'load_lexer_from_file'] + list(LEXERS) + list(COMPAT)
+
+_lexer_cache = {}
+_pattern_cache = {}
+
+
+def _fn_matches(fn, glob):
+    """Return whether the supplied file name fn matches pattern filename."""
+    if glob not in _pattern_cache:
+        pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob))
+        return pattern.match(fn)
+    return _pattern_cache[glob].match(fn)
+
+
+def _load_lexers(module_name):
+    """Load a lexer (and all others in the module too)."""
+    mod = __import__(module_name, None, None, ['__all__'])
+    for lexer_name in mod.__all__:
+        cls = getattr(mod, lexer_name)
+        _lexer_cache[cls.name] = cls
+
+
+def get_all_lexers(plugins=True):
+    """Return a generator of tuples in the form ``(name, aliases,
+    filenames, mimetypes)`` of all know lexers.
+
+    If *plugins* is true (the default), plugin lexers supplied by entrypoints
+    are also returned.  Otherwise, only builtin ones are considered.
+    """
+    for item in LEXERS.values():
+        yield item[1:]
+    if plugins:
+        for lexer in find_plugin_lexers():
+            yield lexer.name, lexer.aliases, lexer.filenames, lexer.mimetypes
+
+
+def find_lexer_class(name):
+    """
+    Return the `Lexer` subclass that with the *name* attribute as given by
+    the *name* argument.
+    """
+    if name in _lexer_cache:
+        return _lexer_cache[name]
+    # lookup builtin lexers
+    for module_name, lname, aliases, _, _ in LEXERS.values():
+        if name == lname:
+            _load_lexers(module_name)
+            return _lexer_cache[name]
+    # continue with lexers from setuptools entrypoints
+    for cls in find_plugin_lexers():
+        if cls.name == name:
+            return cls
+
+
+def find_lexer_class_by_name(_alias):
+    """
+    Return the `Lexer` subclass that has `alias` in its aliases list, without
+    instantiating it.
+
+    Like `get_lexer_by_name`, but does not instantiate the class.
+
+    Will raise :exc:`pygments.util.ClassNotFound` if no lexer with that alias is
+    found.
+
+    .. versionadded:: 2.2
+    """
+    if not _alias:
+        raise ClassNotFound(f'no lexer for alias {_alias!r} found')
+    # lookup builtin lexers
+    for module_name, name, aliases, _, _ in LEXERS.values():
+        if _alias.lower() in aliases:
+            if name not in _lexer_cache:
+                _load_lexers(module_name)
+            return _lexer_cache[name]
+    # continue with lexers from setuptools entrypoints
+    for cls in find_plugin_lexers():
+        if _alias.lower() in cls.aliases:
+            return cls
+    raise ClassNotFound(f'no lexer for alias {_alias!r} found')
+
+
+def get_lexer_by_name(_alias, **options):
+    """
+    Return an instance of a `Lexer` subclass that has `alias` in its
+    aliases list. The lexer is given the `options` at its
+    instantiation.
+
+    Will raise :exc:`pygments.util.ClassNotFound` if no lexer with that alias is
+    found.
+    """
+    if not _alias:
+        raise ClassNotFound(f'no lexer for alias {_alias!r} found')
+
+    # lookup builtin lexers
+    for module_name, name, aliases, _, _ in LEXERS.values():
+        if _alias.lower() in aliases:
+            if name not in _lexer_cache:
+                _load_lexers(module_name)
+            return _lexer_cache[name](**options)
+    # continue with lexers from setuptools entrypoints
+    for cls in find_plugin_lexers():
+        if _alias.lower() in cls.aliases:
+            return cls(**options)
+    raise ClassNotFound(f'no lexer for alias {_alias!r} found')
+
+
+def load_lexer_from_file(filename, lexername="CustomLexer", **options):
+    """Load a lexer from a file.
+
+    This method expects a file located relative to the current working
+    directory, which contains a Lexer class. By default, it expects the
+    Lexer to be name CustomLexer; you can specify your own class name
+    as the second argument to this function.
+
+    Users should be very careful with the input, because this method
+    is equivalent to running eval on the input file.
+
+    Raises ClassNotFound if there are any problems importing the Lexer.
+
+    .. versionadded:: 2.2
+    """
+    try:
+        # This empty dict will contain the namespace for the exec'd file
+        custom_namespace = {}
+        with open(filename, 'rb') as f:
+            exec(f.read(), custom_namespace)
+        # Retrieve the class `lexername` from that namespace
+        if lexername not in custom_namespace:
+            raise ClassNotFound(f'no valid {lexername} class found in {filename}')
+        lexer_class = custom_namespace[lexername]
+        # And finally instantiate it with the options
+        return lexer_class(**options)
+    except OSError as err:
+        raise ClassNotFound(f'cannot read {filename}: {err}')
+    except ClassNotFound:
+        raise
+    except Exception as err:
+        raise ClassNotFound(f'error when loading custom lexer: {err}')
+
+
+def find_lexer_class_for_filename(_fn, code=None):
+    """Get a lexer for a filename.
+
+    If multiple lexers match the filename pattern, use ``analyse_text()`` to
+    figure out which one is more appropriate.
+
+    Returns None if not found.
+    """
+    matches = []
+    fn = basename(_fn)
+    for modname, name, _, filenames, _ in LEXERS.values():
+        for filename in filenames:
+            if _fn_matches(fn, filename):
+                if name not in _lexer_cache:
+                    _load_lexers(modname)
+                matches.append((_lexer_cache[name], filename))
+    for cls in find_plugin_lexers():
+        for filename in cls.filenames:
+            if _fn_matches(fn, filename):
+                matches.append((cls, filename))
+
+    if isinstance(code, bytes):
+        # decode it, since all analyse_text functions expect unicode
+        code = guess_decode(code)
+
+    def get_rating(info):
+        cls, filename = info
+        # explicit patterns get a bonus
+        bonus = '*' not in filename and 0.5 or 0
+        # The class _always_ defines analyse_text because it's included in
+        # the Lexer class.  The default implementation returns None which
+        # gets turned into 0.0.  Run scripts/detect_missing_analyse_text.py
+        # to find lexers which need it overridden.
+        if code:
+            return cls.analyse_text(code) + bonus, cls.__name__
+        return cls.priority + bonus, cls.__name__
+
+    if matches:
+        matches.sort(key=get_rating)
+        # print "Possible lexers, after sort:", matches
+        return matches[-1][0]
+
+
+def get_lexer_for_filename(_fn, code=None, **options):
+    """Get a lexer for a filename.
+
+    Return a `Lexer` subclass instance that has a filename pattern
+    matching `fn`. The lexer is given the `options` at its
+    instantiation.
+
+    Raise :exc:`pygments.util.ClassNotFound` if no lexer for that filename
+    is found.
+
+    If multiple lexers match the filename pattern, use their ``analyse_text()``
+    methods to figure out which one is more appropriate.
+    """
+    res = find_lexer_class_for_filename(_fn, code)
+    if not res:
+        raise ClassNotFound(f'no lexer for filename {_fn!r} found')
+    return res(**options)
+
+
+def get_lexer_for_mimetype(_mime, **options):
+    """
+    Return a `Lexer` subclass instance that has `mime` in its mimetype
+    list. The lexer is given the `options` at its instantiation.
+
+    Will raise :exc:`pygments.util.ClassNotFound` if not lexer for that mimetype
+    is found.
+    """
+    for modname, name, _, _, mimetypes in LEXERS.values():
+        if _mime in mimetypes:
+            if name not in _lexer_cache:
+                _load_lexers(modname)
+            return _lexer_cache[name](**options)
+    for cls in find_plugin_lexers():
+        if _mime in cls.mimetypes:
+            return cls(**options)
+    raise ClassNotFound(f'no lexer for mimetype {_mime!r} found')
+
+
+def _iter_lexerclasses(plugins=True):
+    """Return an iterator over all lexer classes."""
+    for key in sorted(LEXERS):
+        module_name, name = LEXERS[key][:2]
+        if name not in _lexer_cache:
+            _load_lexers(module_name)
+        yield _lexer_cache[name]
+    if plugins:
+        yield from find_plugin_lexers()
+
+
+def guess_lexer_for_filename(_fn, _text, **options):
+    """
+    As :func:`guess_lexer()`, but only lexers which have a pattern in `filenames`
+    or `alias_filenames` that matches `filename` are taken into consideration.
+
+    :exc:`pygments.util.ClassNotFound` is raised if no lexer thinks it can
+    handle the content.
+    """
+    fn = basename(_fn)
+    primary = {}
+    matching_lexers = set()
+    for lexer in _iter_lexerclasses():
+        for filename in lexer.filenames:
+            if _fn_matches(fn, filename):
+                matching_lexers.add(lexer)
+                primary[lexer] = True
+        for filename in lexer.alias_filenames:
+            if _fn_matches(fn, filename):
+                matching_lexers.add(lexer)
+                primary[lexer] = False
+    if not matching_lexers:
+        raise ClassNotFound(f'no lexer for filename {fn!r} found')
+    if len(matching_lexers) == 1:
+        return matching_lexers.pop()(**options)
+    result = []
+    for lexer in matching_lexers:
+        rv = lexer.analyse_text(_text)
+        if rv == 1.0:
+            return lexer(**options)
+        result.append((rv, lexer))
+
+    def type_sort(t):
+        # sort by:
+        # - analyse score
+        # - is primary filename pattern?
+        # - priority
+        # - last resort: class name
+        return (t[0], primary[t[1]], t[1].priority, t[1].__name__)
+    result.sort(key=type_sort)
+
+    return result[-1][1](**options)
+
+
+def guess_lexer(_text, **options):
+    """
+    Return a `Lexer` subclass instance that's guessed from the text in
+    `text`. For that, the :meth:`.analyse_text()` method of every known lexer
+    class is called with the text as argument, and the lexer which returned the
+    highest value will be instantiated and returned.
+
+    :exc:`pygments.util.ClassNotFound` is raised if no lexer thinks it can
+    handle the content.
+    """
+
+    if not isinstance(_text, str):
+        inencoding = options.get('inencoding', options.get('encoding'))
+        if inencoding:
+            _text = _text.decode(inencoding or 'utf8')
+        else:
+            _text, _ = guess_decode(_text)
+
+    # try to get a vim modeline first
+    ft = get_filetype_from_buffer(_text)
+
+    if ft is not None:
+        try:
+            return get_lexer_by_name(ft, **options)
+        except ClassNotFound:
+            pass
+
+    best_lexer = [0.0, None]
+    for lexer in _iter_lexerclasses():
+        rv = lexer.analyse_text(_text)
+        if rv == 1.0:
+            return lexer(**options)
+        if rv > best_lexer[0]:
+            best_lexer[:] = (rv, lexer)
+    if not best_lexer[0] or best_lexer[1] is None:
+        raise ClassNotFound('no lexer matching the text found')
+    return best_lexer[1](**options)
+
+
+class _automodule(types.ModuleType):
+    """Automatically import lexers."""
+
+    def __getattr__(self, name):
+        info = LEXERS.get(name)
+        if info:
+            _load_lexers(info[0])
+            cls = _lexer_cache[info[1]]
+            setattr(self, name, cls)
+            return cls
+        if name in COMPAT:
+            return getattr(self, COMPAT[name])
+        raise AttributeError(name)
+
+
+oldmod = sys.modules[__name__]
+newmod = _automodule(__name__)
+newmod.__dict__.update(oldmod.__dict__)
+sys.modules[__name__] = newmod
+del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..dfcb5e6
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_ada_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_ada_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f8dbf9a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_ada_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_asy_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_asy_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..15e89d7
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_asy_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_cl_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_cl_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4aaab69
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_cl_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_cocoa_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_cocoa_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..53eb099
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_cocoa_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_csound_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_csound_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8417929
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_csound_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..bf06117
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_googlesql_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_googlesql_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5c27a37
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_googlesql_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_julia_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_julia_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9e73d97
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_julia_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_lasso_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_lasso_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..fc80407
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_lasso_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_lilypond_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_lilypond_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..306f66a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_lilypond_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..41938e4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_luau_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_luau_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0c9c61c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_luau_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c3cdec6
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_mql_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_mql_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5859cdb
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_mql_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_mysql_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_mysql_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e3537ce
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_mysql_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_openedge_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_openedge_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..39170d6
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_openedge_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_php_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_php_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e8b1140
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_php_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_postgres_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_postgres_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..cff7c01
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_postgres_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_qlik_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_qlik_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4856d24
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_qlik_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_scheme_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_scheme_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6948769
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_scheme_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_scilab_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_scilab_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5b9bba5
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_scilab_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_sourcemod_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_sourcemod_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5fa6af4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_sourcemod_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_stan_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_stan_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8c79efa
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_stan_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_stata_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_stata_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..cd775cd
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_stata_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_tsql_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_tsql_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..84a195c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_tsql_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_usd_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_usd_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..279b8f3
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_usd_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_vbscript_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_vbscript_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5a4d9d4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_vbscript_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/_vim_builtins.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_vim_builtins.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c23528f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/_vim_builtins.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/actionscript.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/actionscript.cpython-312.pyc
new file mode 100644 (file)
index 0000000..02e87de
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/actionscript.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ada.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ada.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d0d7c5d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ada.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/agile.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/agile.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1f9c1d4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/agile.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/algebra.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/algebra.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c6b3c26
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/algebra.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ambient.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ambient.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4fe956b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ambient.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/amdgpu.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/amdgpu.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a7d01b3
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/amdgpu.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ampl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ampl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..75943d5
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ampl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/apdlexer.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/apdlexer.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5d1ef71
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/apdlexer.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/apl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/apl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2cb10c9
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/apl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/archetype.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/archetype.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e06a523
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/archetype.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/arrow.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/arrow.cpython-312.pyc
new file mode 100644 (file)
index 0000000..23cca77
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/arrow.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/arturo.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/arturo.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7f7c84d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/arturo.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/asc.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/asc.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9b345ed
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/asc.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/asm.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/asm.cpython-312.pyc
new file mode 100644 (file)
index 0000000..00a4a07
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/asm.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/asn1.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/asn1.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ab32832
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/asn1.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/automation.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/automation.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9415d53
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/automation.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/bare.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/bare.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a205129
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/bare.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/basic.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/basic.cpython-312.pyc
new file mode 100644 (file)
index 0000000..bc43c37
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/basic.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/bdd.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/bdd.cpython-312.pyc
new file mode 100644 (file)
index 0000000..33bb412
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/bdd.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/berry.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/berry.cpython-312.pyc
new file mode 100644 (file)
index 0000000..71d7b2f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/berry.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/bibtex.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/bibtex.cpython-312.pyc
new file mode 100644 (file)
index 0000000..fd62f57
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/bibtex.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/blueprint.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/blueprint.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e10f62f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/blueprint.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/boa.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/boa.cpython-312.pyc
new file mode 100644 (file)
index 0000000..131d677
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/boa.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/bqn.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/bqn.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2cc029f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/bqn.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/business.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/business.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a20dd8a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/business.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/c_cpp.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/c_cpp.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c93f27a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/c_cpp.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/c_like.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/c_like.cpython-312.pyc
new file mode 100644 (file)
index 0000000..00cc201
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/c_like.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/capnproto.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/capnproto.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9fdf2ba
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/capnproto.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/carbon.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/carbon.cpython-312.pyc
new file mode 100644 (file)
index 0000000..86f35dd
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/carbon.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/cddl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/cddl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1e4ce60
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/cddl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/chapel.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/chapel.cpython-312.pyc
new file mode 100644 (file)
index 0000000..efb3a1b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/chapel.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/clean.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/clean.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ee1c08b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/clean.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/codeql.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/codeql.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7bb79b4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/codeql.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/comal.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/comal.cpython-312.pyc
new file mode 100644 (file)
index 0000000..98acb2f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/comal.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/compiled.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/compiled.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5bdac0f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/compiled.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/configs.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/configs.cpython-312.pyc
new file mode 100644 (file)
index 0000000..953b567
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/configs.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/console.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/console.cpython-312.pyc
new file mode 100644 (file)
index 0000000..20ebd2c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/console.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/cplint.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/cplint.cpython-312.pyc
new file mode 100644 (file)
index 0000000..da0efc9
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/cplint.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/crystal.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/crystal.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3062ccc
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/crystal.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/csound.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/csound.cpython-312.pyc
new file mode 100644 (file)
index 0000000..fdd3028
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/csound.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/css.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/css.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9f4618c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/css.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/d.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/d.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6bd94c3
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/d.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/dalvik.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dalvik.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d99fca8
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dalvik.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/data.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/data.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f5d035e
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/data.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/dax.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dax.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5118771
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dax.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/devicetree.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/devicetree.cpython-312.pyc
new file mode 100644 (file)
index 0000000..69898ae
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/devicetree.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/diff.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/diff.cpython-312.pyc
new file mode 100644 (file)
index 0000000..77f2e17
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/diff.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/dns.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dns.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2358f18
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dns.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/dotnet.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dotnet.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5172bc7
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dotnet.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/dsls.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dsls.cpython-312.pyc
new file mode 100644 (file)
index 0000000..33d7ec5
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dsls.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/dylan.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dylan.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5ccd84d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/dylan.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ecl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ecl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..28d231a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ecl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/eiffel.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/eiffel.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5b7cc13
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/eiffel.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/elm.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/elm.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4c2222f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/elm.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/elpi.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/elpi.cpython-312.pyc
new file mode 100644 (file)
index 0000000..fe0e5b2
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/elpi.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/email.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/email.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4c12765
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/email.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/erlang.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/erlang.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7258153
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/erlang.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/esoteric.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/esoteric.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3eb0935
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/esoteric.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ezhil.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ezhil.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3c0813d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ezhil.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/factor.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/factor.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7b2e3c4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/factor.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/fantom.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/fantom.cpython-312.pyc
new file mode 100644 (file)
index 0000000..108568f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/fantom.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/felix.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/felix.cpython-312.pyc
new file mode 100644 (file)
index 0000000..cdc85c6
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/felix.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/fift.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/fift.cpython-312.pyc
new file mode 100644 (file)
index 0000000..40c2c33
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/fift.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/floscript.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/floscript.cpython-312.pyc
new file mode 100644 (file)
index 0000000..34a8f44
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/floscript.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/forth.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/forth.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b91c456
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/forth.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/fortran.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/fortran.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4c09f65
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/fortran.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/foxpro.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/foxpro.cpython-312.pyc
new file mode 100644 (file)
index 0000000..50bffb1
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/foxpro.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/freefem.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/freefem.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2937f00
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/freefem.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/func.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/func.cpython-312.pyc
new file mode 100644 (file)
index 0000000..fd3ecd2
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/func.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/functional.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/functional.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b5f8823
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/functional.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/futhark.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/futhark.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9d685e6
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/futhark.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/gcodelexer.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/gcodelexer.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f06f338
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/gcodelexer.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/gdscript.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/gdscript.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d1d0886
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/gdscript.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/gleam.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/gleam.cpython-312.pyc
new file mode 100644 (file)
index 0000000..adf7310
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/gleam.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/go.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/go.cpython-312.pyc
new file mode 100644 (file)
index 0000000..bb1d188
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/go.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/grammar_notation.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/grammar_notation.cpython-312.pyc
new file mode 100644 (file)
index 0000000..66a1e03
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/grammar_notation.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/graph.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/graph.cpython-312.pyc
new file mode 100644 (file)
index 0000000..986f22a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/graph.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/graphics.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/graphics.cpython-312.pyc
new file mode 100644 (file)
index 0000000..66685c2
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/graphics.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/graphql.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/graphql.cpython-312.pyc
new file mode 100644 (file)
index 0000000..51d9e98
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/graphql.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/graphviz.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/graphviz.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1f549d1
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/graphviz.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/gsql.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/gsql.cpython-312.pyc
new file mode 100644 (file)
index 0000000..05b9180
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/gsql.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/hare.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/hare.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2a9d61a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/hare.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/haskell.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/haskell.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ec67e18
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/haskell.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/haxe.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/haxe.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4f105dd
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/haxe.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/hdl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/hdl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ce42e81
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/hdl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/hexdump.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/hexdump.cpython-312.pyc
new file mode 100644 (file)
index 0000000..25e6fa3
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/hexdump.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/html.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/html.cpython-312.pyc
new file mode 100644 (file)
index 0000000..dca6062
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/html.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/idl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/idl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..394595c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/idl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/igor.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/igor.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5455eb3
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/igor.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/inferno.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/inferno.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6b8c767
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/inferno.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/installers.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/installers.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3809e70
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/installers.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/int_fiction.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/int_fiction.cpython-312.pyc
new file mode 100644 (file)
index 0000000..efcc352
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/int_fiction.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/iolang.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/iolang.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d7820a0
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/iolang.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/j.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/j.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f2c6e29
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/j.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/javascript.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/javascript.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7f6ff54
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/javascript.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/jmespath.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/jmespath.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f6ac110
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/jmespath.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/jslt.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/jslt.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5b43f6c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/jslt.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/json5.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/json5.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b51329c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/json5.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/jsonnet.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/jsonnet.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f3aee2e
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/jsonnet.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/jsx.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/jsx.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e742184
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/jsx.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/julia.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/julia.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0615758
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/julia.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/jvm.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/jvm.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3ac64ac
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/jvm.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/kuin.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/kuin.cpython-312.pyc
new file mode 100644 (file)
index 0000000..68030de
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/kuin.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/kusto.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/kusto.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1e39f6e
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/kusto.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ldap.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ldap.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7488c4a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ldap.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/lean.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/lean.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d4e766d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/lean.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/lilypond.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/lilypond.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b01ca51
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/lilypond.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/lisp.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/lisp.cpython-312.pyc
new file mode 100644 (file)
index 0000000..010f5f9
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/lisp.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/macaulay2.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/macaulay2.cpython-312.pyc
new file mode 100644 (file)
index 0000000..08648c5
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/macaulay2.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/make.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/make.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0060883
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/make.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/maple.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/maple.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9e07204
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/maple.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/markup.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/markup.cpython-312.pyc
new file mode 100644 (file)
index 0000000..fb0b465
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/markup.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/math.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/math.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5dffa6f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/math.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/matlab.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/matlab.cpython-312.pyc
new file mode 100644 (file)
index 0000000..cf3a947
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/matlab.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/maxima.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/maxima.cpython-312.pyc
new file mode 100644 (file)
index 0000000..753ea13
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/maxima.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/meson.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/meson.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a91cba0
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/meson.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/mime.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/mime.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9625d76
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/mime.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/minecraft.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/minecraft.cpython-312.pyc
new file mode 100644 (file)
index 0000000..48c4278
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/minecraft.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/mips.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/mips.cpython-312.pyc
new file mode 100644 (file)
index 0000000..db7988d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/mips.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ml.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ml.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3e218d4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ml.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/modeling.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/modeling.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4bf3b24
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/modeling.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/modula2.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/modula2.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d9e64ac
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/modula2.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/mojo.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/mojo.cpython-312.pyc
new file mode 100644 (file)
index 0000000..73e21d9
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/mojo.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/monte.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/monte.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7d3cb76
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/monte.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/mosel.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/mosel.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6c4a10b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/mosel.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ncl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ncl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..139c403
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ncl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/nimrod.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/nimrod.cpython-312.pyc
new file mode 100644 (file)
index 0000000..93fd578
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/nimrod.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/nit.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/nit.cpython-312.pyc
new file mode 100644 (file)
index 0000000..93947d8
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/nit.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/nix.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/nix.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6ce6116
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/nix.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/numbair.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/numbair.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c7df59e
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/numbair.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/oberon.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/oberon.cpython-312.pyc
new file mode 100644 (file)
index 0000000..af13ded
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/oberon.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/objective.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/objective.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8eab575
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/objective.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ooc.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ooc.cpython-312.pyc
new file mode 100644 (file)
index 0000000..906c2a9
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ooc.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/openscad.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/openscad.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5049a50
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/openscad.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/other.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/other.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d44590f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/other.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/parasail.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/parasail.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ee1e1e7
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/parasail.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/parsers.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/parsers.cpython-312.pyc
new file mode 100644 (file)
index 0000000..865df4e
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/parsers.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/pascal.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/pascal.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c4241b6
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/pascal.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/pawn.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/pawn.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3583563
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/pawn.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/pddl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/pddl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..55948c7
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/pddl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/perl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/perl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..acd7c13
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/perl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/phix.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/phix.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0dcd71d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/phix.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/php.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/php.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1d92f3f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/php.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/pointless.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/pointless.cpython-312.pyc
new file mode 100644 (file)
index 0000000..637f736
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/pointless.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/pony.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/pony.cpython-312.pyc
new file mode 100644 (file)
index 0000000..bb18403
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/pony.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/praat.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/praat.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7959f0e
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/praat.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/procfile.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/procfile.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a33d14d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/procfile.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/prolog.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/prolog.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8718480
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/prolog.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/promql.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/promql.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c32dc11
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/promql.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/prql.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/prql.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2d4ccab
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/prql.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ptx.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ptx.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c46888f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ptx.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/python.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/python.cpython-312.pyc
new file mode 100644 (file)
index 0000000..99db0df
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/python.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/q.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/q.cpython-312.pyc
new file mode 100644 (file)
index 0000000..099c8d6
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/q.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/qlik.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/qlik.cpython-312.pyc
new file mode 100644 (file)
index 0000000..05a4cc4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/qlik.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/qvt.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/qvt.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ce37a27
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/qvt.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/r.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/r.cpython-312.pyc
new file mode 100644 (file)
index 0000000..31a24c4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/r.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/rdf.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rdf.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e6cf42b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rdf.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/rebol.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rebol.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c97059c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rebol.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/rego.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rego.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c8636fd
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rego.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/resource.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/resource.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0750eaf
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/resource.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ride.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ride.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7d6ead8
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ride.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/rita.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rita.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f4f6306
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rita.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/rnc.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rnc.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ca26131
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rnc.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/roboconf.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/roboconf.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d336601
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/roboconf.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/robotframework.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/robotframework.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e091dd0
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/robotframework.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ruby.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ruby.cpython-312.pyc
new file mode 100644 (file)
index 0000000..81e68ab
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ruby.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/rust.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rust.cpython-312.pyc
new file mode 100644 (file)
index 0000000..522ec87
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/rust.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/sas.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/sas.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1dc62f0
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/sas.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/savi.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/savi.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1a15299
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/savi.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/scdoc.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/scdoc.cpython-312.pyc
new file mode 100644 (file)
index 0000000..70a4c25
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/scdoc.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/scripting.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/scripting.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f62b637
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/scripting.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/sgf.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/sgf.cpython-312.pyc
new file mode 100644 (file)
index 0000000..25ab12f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/sgf.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/shell.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/shell.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1c14715
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/shell.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/sieve.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/sieve.cpython-312.pyc
new file mode 100644 (file)
index 0000000..45e1f75
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/sieve.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/slash.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/slash.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b30de8c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/slash.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/smalltalk.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/smalltalk.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4222b24
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/smalltalk.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/smithy.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/smithy.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ea7f08b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/smithy.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/smv.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/smv.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a09561c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/smv.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/snobol.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/snobol.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8a089cb
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/snobol.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/solidity.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/solidity.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6db9621
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/solidity.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/soong.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/soong.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4ccb67a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/soong.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/sophia.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/sophia.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ebcebeb
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/sophia.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/special.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/special.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e71da01
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/special.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/spice.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/spice.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2a7c8be
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/spice.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/sql.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/sql.cpython-312.pyc
new file mode 100644 (file)
index 0000000..80f3a10
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/sql.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/srcinfo.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/srcinfo.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9bf69b6
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/srcinfo.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/stata.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/stata.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0aa7ffc
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/stata.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/supercollider.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/supercollider.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9b47378
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/supercollider.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/tablegen.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tablegen.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4463551
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tablegen.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/tact.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tact.cpython-312.pyc
new file mode 100644 (file)
index 0000000..bdbbce4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tact.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/tal.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tal.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b45f7a0
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tal.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/tcl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tcl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2589d9b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tcl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/teal.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/teal.cpython-312.pyc
new file mode 100644 (file)
index 0000000..79385f6
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/teal.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/templates.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/templates.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3bc9b97
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/templates.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/teraterm.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/teraterm.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0c41dd1
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/teraterm.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/testing.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/testing.cpython-312.pyc
new file mode 100644 (file)
index 0000000..da06dfb
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/testing.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/text.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/text.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2f8ba3c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/text.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/textedit.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/textedit.cpython-312.pyc
new file mode 100644 (file)
index 0000000..854b1c1
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/textedit.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/textfmts.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/textfmts.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b11cc59
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/textfmts.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/theorem.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/theorem.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c5f263b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/theorem.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/thingsdb.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/thingsdb.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0966da3
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/thingsdb.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/tlb.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tlb.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e818281
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tlb.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/tls.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tls.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a587e5d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tls.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/tnt.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tnt.cpython-312.pyc
new file mode 100644 (file)
index 0000000..670e88e
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/tnt.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/trafficscript.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/trafficscript.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9bba8f7
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/trafficscript.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/typoscript.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/typoscript.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5f5d32d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/typoscript.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/typst.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/typst.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e785d6a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/typst.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/ul4.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ul4.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c434e48
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/ul4.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/unicon.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/unicon.cpython-312.pyc
new file mode 100644 (file)
index 0000000..8f2ed68
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/unicon.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/urbi.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/urbi.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f7f7b6e
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/urbi.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/usd.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/usd.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4c78aff
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/usd.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/varnish.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/varnish.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d2035df
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/varnish.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/verification.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/verification.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e03051a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/verification.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/verifpal.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/verifpal.cpython-312.pyc
new file mode 100644 (file)
index 0000000..81c6d8b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/verifpal.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/vip.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/vip.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0081158
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/vip.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/vyper.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/vyper.cpython-312.pyc
new file mode 100644 (file)
index 0000000..158f941
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/vyper.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/web.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/web.cpython-312.pyc
new file mode 100644 (file)
index 0000000..bcbffac
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/web.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/webassembly.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/webassembly.cpython-312.pyc
new file mode 100644 (file)
index 0000000..57a4ab5
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/webassembly.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/webidl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/webidl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..dceb7e1
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/webidl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/webmisc.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/webmisc.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0999909
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/webmisc.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/wgsl.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/wgsl.cpython-312.pyc
new file mode 100644 (file)
index 0000000..64190bd
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/wgsl.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/whiley.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/whiley.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6511ae1
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/whiley.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/wowtoc.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/wowtoc.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2fcfd61
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/wowtoc.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/wren.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/wren.cpython-312.pyc
new file mode 100644 (file)
index 0000000..0f302bc
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/wren.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/x10.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/x10.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4992b2c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/x10.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/xorg.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/xorg.cpython-312.pyc
new file mode 100644 (file)
index 0000000..643cd34
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/xorg.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/yang.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/yang.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d66521f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/yang.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/yara.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/yara.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7836a4a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/yara.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/__pycache__/zig.cpython-312.pyc b/.venv/Lib/site-packages/pygments/lexers/__pycache__/zig.cpython-312.pyc
new file mode 100644 (file)
index 0000000..52163ef
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/lexers/__pycache__/zig.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/lexers/_ada_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_ada_builtins.py
new file mode 100644 (file)
index 0000000..a2491fb
--- /dev/null
@@ -0,0 +1,103 @@
+"""
+    pygments.lexers._ada_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Ada builtins.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+KEYWORD_LIST = (
+    'abort',
+    'abs',
+    'abstract',
+    'accept',
+    'access',
+    'aliased',
+    'all',
+    'array',
+    'at',
+    'begin',
+    'body',
+    'case',
+    'constant',
+    'declare',
+    'delay',
+    'delta',
+    'digits',
+    'do',
+    'else',
+    'elsif',
+    'end',
+    'entry',
+    'exception',
+    'exit',
+    'interface',
+    'for',
+    'goto',
+    'if',
+    'is',
+    'limited',
+    'loop',
+    'new',
+    'null',
+    'of',
+    'or',
+    'others',
+    'out',
+    'overriding',
+    'pragma',
+    'protected',
+    'raise',
+    'range',
+    'record',
+    'renames',
+    'requeue',
+    'return',
+    'reverse',
+    'select',
+    'separate',
+    'some',
+    'subtype',
+    'synchronized',
+    'task',
+    'tagged',
+    'terminate',
+    'then',
+    'type',
+    'until',
+    'when',
+    'while',
+    'xor'
+)
+
+BUILTIN_LIST = (
+    'Address',
+    'Byte',
+    'Boolean',
+    'Character',
+    'Controlled',
+    'Count',
+    'Cursor',
+    'Duration',
+    'File_Mode',
+    'File_Type',
+    'Float',
+    'Generator',
+    'Integer',
+    'Long_Float',
+    'Long_Integer',
+    'Long_Long_Float',
+    'Long_Long_Integer',
+    'Natural',
+    'Positive',
+    'Reference_Type',
+    'Short_Float',
+    'Short_Integer',
+    'Short_Short_Float',
+    'Short_Short_Integer',
+    'String',
+    'Wide_Character',
+    'Wide_String'
+)
diff --git a/.venv/Lib/site-packages/pygments/lexers/_asy_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_asy_builtins.py
new file mode 100644 (file)
index 0000000..976e1bc
--- /dev/null
@@ -0,0 +1,1644 @@
+"""
+    pygments.lexers._asy_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file contains the asy-function names and asy-variable names of
+    Asymptote.
+
+    Do not edit the ASYFUNCNAME and ASYVARNAME sets by hand.
+    TODO: perl/python script in Asymptote SVN similar to asy-list.pl but only
+    for function and variable names.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+ASYFUNCNAME = {
+    'AND',
+    'Arc',
+    'ArcArrow',
+    'ArcArrows',
+    'Arrow',
+    'Arrows',
+    'Automatic',
+    'AvantGarde',
+    'BBox',
+    'BWRainbow',
+    'BWRainbow2',
+    'Bar',
+    'Bars',
+    'BeginArcArrow',
+    'BeginArrow',
+    'BeginBar',
+    'BeginDotMargin',
+    'BeginMargin',
+    'BeginPenMargin',
+    'Blank',
+    'Bookman',
+    'Bottom',
+    'BottomTop',
+    'Bounds',
+    'Break',
+    'Broken',
+    'BrokenLog',
+    'Ceil',
+    'Circle',
+    'CircleBarIntervalMarker',
+    'Cos',
+    'Courier',
+    'CrossIntervalMarker',
+    'DefaultFormat',
+    'DefaultLogFormat',
+    'Degrees',
+    'Dir',
+    'DotMargin',
+    'DotMargins',
+    'Dotted',
+    'Draw',
+    'Drawline',
+    'Embed',
+    'EndArcArrow',
+    'EndArrow',
+    'EndBar',
+    'EndDotMargin',
+    'EndMargin',
+    'EndPenMargin',
+    'Fill',
+    'FillDraw',
+    'Floor',
+    'Format',
+    'Full',
+    'Gaussian',
+    'Gaussrand',
+    'Gaussrandpair',
+    'Gradient',
+    'Grayscale',
+    'Helvetica',
+    'Hermite',
+    'HookHead',
+    'InOutTicks',
+    'InTicks',
+    'J',
+    'Label',
+    'Landscape',
+    'Left',
+    'LeftRight',
+    'LeftTicks',
+    'Legend',
+    'Linear',
+    'Link',
+    'Log',
+    'LogFormat',
+    'Margin',
+    'Margins',
+    'Mark',
+    'MidArcArrow',
+    'MidArrow',
+    'NOT',
+    'NewCenturySchoolBook',
+    'NoBox',
+    'NoMargin',
+    'NoModifier',
+    'NoTicks',
+    'NoTicks3',
+    'NoZero',
+    'NoZeroFormat',
+    'None',
+    'OR',
+    'OmitFormat',
+    'OmitTick',
+    'OutTicks',
+    'Ox',
+    'Oy',
+    'Palatino',
+    'PaletteTicks',
+    'Pen',
+    'PenMargin',
+    'PenMargins',
+    'Pentype',
+    'Portrait',
+    'RadialShade',
+    'Rainbow',
+    'Range',
+    'Relative',
+    'Right',
+    'RightTicks',
+    'Rotate',
+    'Round',
+    'SQR',
+    'Scale',
+    'ScaleX',
+    'ScaleY',
+    'ScaleZ',
+    'Seascape',
+    'Shift',
+    'Sin',
+    'Slant',
+    'Spline',
+    'StickIntervalMarker',
+    'Straight',
+    'Symbol',
+    'Tan',
+    'TeXify',
+    'Ticks',
+    'Ticks3',
+    'TildeIntervalMarker',
+    'TimesRoman',
+    'Top',
+    'TrueMargin',
+    'UnFill',
+    'UpsideDown',
+    'Wheel',
+    'X',
+    'XEquals',
+    'XOR',
+    'XY',
+    'XYEquals',
+    'XYZero',
+    'XYgrid',
+    'XZEquals',
+    'XZZero',
+    'XZero',
+    'XZgrid',
+    'Y',
+    'YEquals',
+    'YXgrid',
+    'YZ',
+    'YZEquals',
+    'YZZero',
+    'YZero',
+    'YZgrid',
+    'Z',
+    'ZX',
+    'ZXgrid',
+    'ZYgrid',
+    'ZapfChancery',
+    'ZapfDingbats',
+    '_cputime',
+    '_draw',
+    '_eval',
+    '_image',
+    '_labelpath',
+    '_projection',
+    '_strokepath',
+    '_texpath',
+    'aCos',
+    'aSin',
+    'aTan',
+    'abort',
+    'abs',
+    'accel',
+    'acos',
+    'acosh',
+    'acot',
+    'acsc',
+    'add',
+    'addArrow',
+    'addMargins',
+    'addSaveFunction',
+    'addnode',
+    'addnodes',
+    'addpenarc',
+    'addpenline',
+    'addseg',
+    'adjust',
+    'alias',
+    'align',
+    'all',
+    'altitude',
+    'angabscissa',
+    'angle',
+    'angpoint',
+    'animate',
+    'annotate',
+    'anticomplementary',
+    'antipedal',
+    'apply',
+    'approximate',
+    'arc',
+    'arcarrowsize',
+    'arccircle',
+    'arcdir',
+    'arcfromcenter',
+    'arcfromfocus',
+    'arclength',
+    'arcnodesnumber',
+    'arcpoint',
+    'arcsubtended',
+    'arcsubtendedcenter',
+    'arctime',
+    'arctopath',
+    'array',
+    'arrow',
+    'arrow2',
+    'arrowbase',
+    'arrowbasepoints',
+    'arrowsize',
+    'asec',
+    'asin',
+    'asinh',
+    'ask',
+    'assert',
+    'asy',
+    'asycode',
+    'asydir',
+    'asyfigure',
+    'asyfilecode',
+    'asyinclude',
+    'asywrite',
+    'atan',
+    'atan2',
+    'atanh',
+    'atbreakpoint',
+    'atexit',
+    'atime',
+    'attach',
+    'attract',
+    'atupdate',
+    'autoformat',
+    'autoscale',
+    'autoscale3',
+    'axes',
+    'axes3',
+    'axialshade',
+    'axis',
+    'axiscoverage',
+    'azimuth',
+    'babel',
+    'background',
+    'bangles',
+    'bar',
+    'barmarksize',
+    'barsize',
+    'basealign',
+    'baseline',
+    'bbox',
+    'beep',
+    'begin',
+    'beginclip',
+    'begingroup',
+    'beginpoint',
+    'between',
+    'bevel',
+    'bezier',
+    'bezierP',
+    'bezierPP',
+    'bezierPPP',
+    'bezulate',
+    'bibliography',
+    'bibliographystyle',
+    'binarytree',
+    'binarytreeNode',
+    'binomial',
+    'binput',
+    'bins',
+    'bisector',
+    'bisectorpoint',
+    'blend',
+    'boutput',
+    'box',
+    'bqe',
+    'breakpoint',
+    'breakpoints',
+    'brick',
+    'buildRestoreDefaults',
+    'buildRestoreThunk',
+    'buildcycle',
+    'bulletcolor',
+    'canonical',
+    'canonicalcartesiansystem',
+    'cartesiansystem',
+    'case1',
+    'case2',
+    'case3',
+    'cbrt',
+    'cd',
+    'ceil',
+    'center',
+    'centerToFocus',
+    'centroid',
+    'cevian',
+    'change2',
+    'changecoordsys',
+    'checkSegment',
+    'checkconditionlength',
+    'checker',
+    'checklengths',
+    'checkposition',
+    'checktriangle',
+    'choose',
+    'circle',
+    'circlebarframe',
+    'circlemarkradius',
+    'circlenodesnumber',
+    'circumcenter',
+    'circumcircle',
+    'clamped',
+    'clear',
+    'clip',
+    'clipdraw',
+    'close',
+    'cmyk',
+    'code',
+    'colatitude',
+    'collect',
+    'collinear',
+    'color',
+    'colorless',
+    'colors',
+    'colorspace',
+    'comma',
+    'compassmark',
+    'complement',
+    'complementary',
+    'concat',
+    'concurrent',
+    'cone',
+    'conic',
+    'conicnodesnumber',
+    'conictype',
+    'conj',
+    'connect',
+    'containmentTree',
+    'contains',
+    'contour',
+    'contour3',
+    'controlSpecifier',
+    'convert',
+    'coordinates',
+    'coordsys',
+    'copy',
+    'cos',
+    'cosh',
+    'cot',
+    'countIntersections',
+    'cputime',
+    'crop',
+    'cropcode',
+    'cross',
+    'crossframe',
+    'crosshatch',
+    'crossmarksize',
+    'csc',
+    'cubicroots',
+    'curabscissa',
+    'curlSpecifier',
+    'curpoint',
+    'currentarrow',
+    'currentexitfunction',
+    'currentmomarrow',
+    'currentpolarconicroutine',
+    'curve',
+    'cut',
+    'cutafter',
+    'cutbefore',
+    'cyclic',
+    'cylinder',
+    'debugger',
+    'deconstruct',
+    'defaultdir',
+    'defaultformat',
+    'defaultpen',
+    'defined',
+    'degenerate',
+    'degrees',
+    'delete',
+    'deletepreamble',
+    'determinant',
+    'diagonal',
+    'diamond',
+    'diffdiv',
+    'dir',
+    'dirSpecifier',
+    'dirtime',
+    'display',
+    'distance',
+    'divisors',
+    'do_overpaint',
+    'dot',
+    'dotframe',
+    'dotsize',
+    'downcase',
+    'draw',
+    'drawAll',
+    'drawDoubleLine',
+    'drawFermion',
+    'drawGhost',
+    'drawGluon',
+    'drawMomArrow',
+    'drawPhoton',
+    'drawScalar',
+    'drawVertex',
+    'drawVertexBox',
+    'drawVertexBoxO',
+    'drawVertexBoxX',
+    'drawVertexO',
+    'drawVertexOX',
+    'drawVertexTriangle',
+    'drawVertexTriangleO',
+    'drawVertexX',
+    'drawarrow',
+    'drawarrow2',
+    'drawline',
+    'drawtick',
+    'duplicate',
+    'elle',
+    'ellipse',
+    'ellipsenodesnumber',
+    'embed',
+    'embed3',
+    'empty',
+    'enclose',
+    'end',
+    'endScript',
+    'endclip',
+    'endgroup',
+    'endl',
+    'endpoint',
+    'endpoints',
+    'eof',
+    'eol',
+    'equation',
+    'equations',
+    'erase',
+    'erasestep',
+    'erf',
+    'erfc',
+    'error',
+    'errorbar',
+    'errorbars',
+    'eval',
+    'excenter',
+    'excircle',
+    'exit',
+    'exitXasyMode',
+    'exitfunction',
+    'exp',
+    'expfactors',
+    'expi',
+    'expm1',
+    'exradius',
+    'extend',
+    'extension',
+    'extouch',
+    'fabs',
+    'factorial',
+    'fermat',
+    'fft',
+    'fhorner',
+    'figure',
+    'file',
+    'filecode',
+    'fill',
+    'filldraw',
+    'filloutside',
+    'fillrule',
+    'filltype',
+    'find',
+    'finite',
+    'finiteDifferenceJacobian',
+    'firstcut',
+    'firstframe',
+    'fit',
+    'fit2',
+    'fixedscaling',
+    'floor',
+    'flush',
+    'fmdefaults',
+    'fmod',
+    'focusToCenter',
+    'font',
+    'fontcommand',
+    'fontsize',
+    'foot',
+    'format',
+    'frac',
+    'frequency',
+    'fromCenter',
+    'fromFocus',
+    'fspline',
+    'functionshade',
+    'gamma',
+    'generate_random_backtrace',
+    'generateticks',
+    'gergonne',
+    'getc',
+    'getint',
+    'getpair',
+    'getreal',
+    'getstring',
+    'gettriple',
+    'gluon',
+    'gouraudshade',
+    'graph',
+    'graphic',
+    'gray',
+    'grestore',
+    'grid',
+    'grid3',
+    'gsave',
+    'halfbox',
+    'hatch',
+    'hdiffdiv',
+    'hermite',
+    'hex',
+    'histogram',
+    'history',
+    'hline',
+    'hprojection',
+    'hsv',
+    'hyperbola',
+    'hyperbolanodesnumber',
+    'hyperlink',
+    'hypot',
+    'identity',
+    'image',
+    'incenter',
+    'incentral',
+    'incircle',
+    'increasing',
+    'incrementposition',
+    'indexedTransform',
+    'indexedfigure',
+    'initXasyMode',
+    'initdefaults',
+    'input',
+    'inradius',
+    'insert',
+    'inside',
+    'integrate',
+    'interactive',
+    'interior',
+    'interp',
+    'interpolate',
+    'intersect',
+    'intersection',
+    'intersectionpoint',
+    'intersectionpoints',
+    'intersections',
+    'intouch',
+    'inverse',
+    'inversion',
+    'invisible',
+    'is3D',
+    'isDuplicate',
+    'isogonal',
+    'isogonalconjugate',
+    'isotomic',
+    'isotomicconjugate',
+    'isparabola',
+    'italic',
+    'item',
+    'key',
+    'kurtosis',
+    'kurtosisexcess',
+    'label',
+    'labelaxis',
+    'labelmargin',
+    'labelpath',
+    'labels',
+    'labeltick',
+    'labelx',
+    'labelx3',
+    'labely',
+    'labely3',
+    'labelz',
+    'labelz3',
+    'lastcut',
+    'latex',
+    'latitude',
+    'latticeshade',
+    'layer',
+    'layout',
+    'ldexp',
+    'leastsquares',
+    'legend',
+    'legenditem',
+    'length',
+    'lift',
+    'light',
+    'limits',
+    'line',
+    'linear',
+    'linecap',
+    'lineinversion',
+    'linejoin',
+    'linemargin',
+    'lineskip',
+    'linetype',
+    'linewidth',
+    'link',
+    'list',
+    'lm_enorm',
+    'lm_evaluate_default',
+    'lm_lmdif',
+    'lm_lmpar',
+    'lm_minimize',
+    'lm_print_default',
+    'lm_print_quiet',
+    'lm_qrfac',
+    'lm_qrsolv',
+    'locale',
+    'locate',
+    'locatefile',
+    'location',
+    'log',
+    'log10',
+    'log1p',
+    'logaxiscoverage',
+    'longitude',
+    'lookup',
+    'magnetize',
+    'makeNode',
+    'makedraw',
+    'makepen',
+    'map',
+    'margin',
+    'markangle',
+    'markangleradius',
+    'markanglespace',
+    'markarc',
+    'marker',
+    'markinterval',
+    'marknodes',
+    'markrightangle',
+    'markuniform',
+    'mass',
+    'masscenter',
+    'massformat',
+    'math',
+    'max',
+    'max3',
+    'maxbezier',
+    'maxbound',
+    'maxcoords',
+    'maxlength',
+    'maxratio',
+    'maxtimes',
+    'mean',
+    'medial',
+    'median',
+    'midpoint',
+    'min',
+    'min3',
+    'minbezier',
+    'minbound',
+    'minipage',
+    'minratio',
+    'mintimes',
+    'miterlimit',
+    'momArrowPath',
+    'momarrowsize',
+    'monotonic',
+    'multifigure',
+    'nativeformat',
+    'natural',
+    'needshipout',
+    'newl',
+    'newpage',
+    'newslide',
+    'newton',
+    'newtree',
+    'nextframe',
+    'nextnormal',
+    'nextpage',
+    'nib',
+    'nodabscissa',
+    'none',
+    'norm',
+    'normalvideo',
+    'notaknot',
+    'nowarn',
+    'numberpage',
+    'nurb',
+    'object',
+    'offset',
+    'onpath',
+    'opacity',
+    'opposite',
+    'orientation',
+    'orig_circlenodesnumber',
+    'orig_circlenodesnumber1',
+    'orig_draw',
+    'orig_ellipsenodesnumber',
+    'orig_ellipsenodesnumber1',
+    'orig_hyperbolanodesnumber',
+    'orig_parabolanodesnumber',
+    'origin',
+    'orthic',
+    'orthocentercenter',
+    'outformat',
+    'outline',
+    'outprefix',
+    'output',
+    'overloadedMessage',
+    'overwrite',
+    'pack',
+    'pad',
+    'pairs',
+    'palette',
+    'parabola',
+    'parabolanodesnumber',
+    'parallel',
+    'partialsum',
+    'path',
+    'path3',
+    'pattern',
+    'pause',
+    'pdf',
+    'pedal',
+    'periodic',
+    'perp',
+    'perpendicular',
+    'perpendicularmark',
+    'phantom',
+    'phi1',
+    'phi2',
+    'phi3',
+    'photon',
+    'piecewisestraight',
+    'point',
+    'polar',
+    'polarconicroutine',
+    'polargraph',
+    'polygon',
+    'postcontrol',
+    'postscript',
+    'pow10',
+    'ppoint',
+    'prc',
+    'prc0',
+    'precision',
+    'precontrol',
+    'prepend',
+    'print_random_addresses',
+    'project',
+    'projection',
+    'purge',
+    'pwhermite',
+    'quadrant',
+    'quadraticroots',
+    'quantize',
+    'quarticroots',
+    'quotient',
+    'radialshade',
+    'radians',
+    'radicalcenter',
+    'radicalline',
+    'radius',
+    'rand',
+    'randompath',
+    'rd',
+    'readline',
+    'realmult',
+    'realquarticroots',
+    'rectangle',
+    'rectangular',
+    'rectify',
+    'reflect',
+    'relabscissa',
+    'relative',
+    'relativedistance',
+    'reldir',
+    'relpoint',
+    'reltime',
+    'remainder',
+    'remark',
+    'removeDuplicates',
+    'rename',
+    'replace',
+    'report',
+    'resetdefaultpen',
+    'restore',
+    'restoredefaults',
+    'reverse',
+    'reversevideo',
+    'rf',
+    'rfind',
+    'rgb',
+    'rgba',
+    'rgbint',
+    'rms',
+    'rotate',
+    'rotateO',
+    'rotation',
+    'round',
+    'roundbox',
+    'roundedpath',
+    'roundrectangle',
+    'samecoordsys',
+    'sameside',
+    'sample',
+    'save',
+    'savedefaults',
+    'saveline',
+    'scale',
+    'scale3',
+    'scaleO',
+    'scaleT',
+    'scaleless',
+    'scientific',
+    'search',
+    'searchtree',
+    'sec',
+    'secondaryX',
+    'secondaryY',
+    'seconds',
+    'section',
+    'sector',
+    'seek',
+    'seekeof',
+    'segment',
+    'sequence',
+    'setpens',
+    'sgn',
+    'sgnd',
+    'sharpangle',
+    'sharpdegrees',
+    'shift',
+    'shiftless',
+    'shipout',
+    'shipout3',
+    'show',
+    'side',
+    'simeq',
+    'simpson',
+    'sin',
+    'single',
+    'sinh',
+    'size',
+    'size3',
+    'skewness',
+    'skip',
+    'slant',
+    'sleep',
+    'slope',
+    'slopefield',
+    'solve',
+    'solveBVP',
+    'sort',
+    'sourceline',
+    'sphere',
+    'split',
+    'sqrt',
+    'square',
+    'srand',
+    'standardizecoordsys',
+    'startScript',
+    'startTrembling',
+    'stdev',
+    'step',
+    'stickframe',
+    'stickmarksize',
+    'stickmarkspace',
+    'stop',
+    'straight',
+    'straightness',
+    'string',
+    'stripdirectory',
+    'stripextension',
+    'stripfile',
+    'strokepath',
+    'subdivide',
+    'subitem',
+    'subpath',
+    'substr',
+    'sum',
+    'surface',
+    'symmedial',
+    'symmedian',
+    'system',
+    'tab',
+    'tableau',
+    'tan',
+    'tangent',
+    'tangential',
+    'tangents',
+    'tanh',
+    'tell',
+    'tensionSpecifier',
+    'tensorshade',
+    'tex',
+    'texcolor',
+    'texify',
+    'texpath',
+    'texpreamble',
+    'texreset',
+    'texshipout',
+    'texsize',
+    'textpath',
+    'thick',
+    'thin',
+    'tick',
+    'tickMax',
+    'tickMax3',
+    'tickMin',
+    'tickMin3',
+    'ticklabelshift',
+    'ticklocate',
+    'tildeframe',
+    'tildemarksize',
+    'tile',
+    'tiling',
+    'time',
+    'times',
+    'title',
+    'titlepage',
+    'topbox',
+    'transform',
+    'transformation',
+    'transpose',
+    'tremble',
+    'trembleFuzz',
+    'tremble_circlenodesnumber',
+    'tremble_circlenodesnumber1',
+    'tremble_draw',
+    'tremble_ellipsenodesnumber',
+    'tremble_ellipsenodesnumber1',
+    'tremble_hyperbolanodesnumber',
+    'tremble_marknodes',
+    'tremble_markuniform',
+    'tremble_parabolanodesnumber',
+    'triangle',
+    'triangleAbc',
+    'triangleabc',
+    'triangulate',
+    'tricoef',
+    'tridiagonal',
+    'trilinear',
+    'trim',
+    'trueMagnetize',
+    'truepoint',
+    'tube',
+    'uncycle',
+    'unfill',
+    'uniform',
+    'unit',
+    'unitrand',
+    'unitsize',
+    'unityroot',
+    'unstraighten',
+    'upcase',
+    'updatefunction',
+    'uperiodic',
+    'upscale',
+    'uptodate',
+    'usepackage',
+    'usersetting',
+    'usetypescript',
+    'usleep',
+    'value',
+    'variance',
+    'variancebiased',
+    'vbox',
+    'vector',
+    'vectorfield',
+    'verbatim',
+    'view',
+    'vline',
+    'vperiodic',
+    'vprojection',
+    'warn',
+    'warning',
+    'windingnumber',
+    'write',
+    'xaxis',
+    'xaxis3',
+    'xaxis3At',
+    'xaxisAt',
+    'xequals',
+    'xinput',
+    'xlimits',
+    'xoutput',
+    'xpart',
+    'xscale',
+    'xscaleO',
+    'xtick',
+    'xtick3',
+    'xtrans',
+    'yaxis',
+    'yaxis3',
+    'yaxis3At',
+    'yaxisAt',
+    'yequals',
+    'ylimits',
+    'ypart',
+    'yscale',
+    'yscaleO',
+    'ytick',
+    'ytick3',
+    'ytrans',
+    'zaxis3',
+    'zaxis3At',
+    'zero',
+    'zero3',
+    'zlimits',
+    'zpart',
+    'ztick',
+    'ztick3',
+    'ztrans'
+}
+
+ASYVARNAME = {
+    'AliceBlue',
+    'Align',
+    'Allow',
+    'AntiqueWhite',
+    'Apricot',
+    'Aqua',
+    'Aquamarine',
+    'Aspect',
+    'Azure',
+    'BeginPoint',
+    'Beige',
+    'Bisque',
+    'Bittersweet',
+    'Black',
+    'BlanchedAlmond',
+    'Blue',
+    'BlueGreen',
+    'BlueViolet',
+    'Both',
+    'Break',
+    'BrickRed',
+    'Brown',
+    'BurlyWood',
+    'BurntOrange',
+    'CCW',
+    'CW',
+    'CadetBlue',
+    'CarnationPink',
+    'Center',
+    'Centered',
+    'Cerulean',
+    'Chartreuse',
+    'Chocolate',
+    'Coeff',
+    'Coral',
+    'CornflowerBlue',
+    'Cornsilk',
+    'Crimson',
+    'Crop',
+    'Cyan',
+    'Dandelion',
+    'DarkBlue',
+    'DarkCyan',
+    'DarkGoldenrod',
+    'DarkGray',
+    'DarkGreen',
+    'DarkKhaki',
+    'DarkMagenta',
+    'DarkOliveGreen',
+    'DarkOrange',
+    'DarkOrchid',
+    'DarkRed',
+    'DarkSalmon',
+    'DarkSeaGreen',
+    'DarkSlateBlue',
+    'DarkSlateGray',
+    'DarkTurquoise',
+    'DarkViolet',
+    'DeepPink',
+    'DeepSkyBlue',
+    'DefaultHead',
+    'DimGray',
+    'DodgerBlue',
+    'Dotted',
+    'Draw',
+    'E',
+    'ENE',
+    'EPS',
+    'ESE',
+    'E_Euler',
+    'E_PC',
+    'E_RK2',
+    'E_RK3BS',
+    'Emerald',
+    'EndPoint',
+    'Euler',
+    'Fill',
+    'FillDraw',
+    'FireBrick',
+    'FloralWhite',
+    'ForestGreen',
+    'Fuchsia',
+    'Gainsboro',
+    'GhostWhite',
+    'Gold',
+    'Goldenrod',
+    'Gray',
+    'Green',
+    'GreenYellow',
+    'Honeydew',
+    'HookHead',
+    'Horizontal',
+    'HotPink',
+    'I',
+    'IgnoreAspect',
+    'IndianRed',
+    'Indigo',
+    'Ivory',
+    'JOIN_IN',
+    'JOIN_OUT',
+    'JungleGreen',
+    'Khaki',
+    'LM_DWARF',
+    'LM_MACHEP',
+    'LM_SQRT_DWARF',
+    'LM_SQRT_GIANT',
+    'LM_USERTOL',
+    'Label',
+    'Lavender',
+    'LavenderBlush',
+    'LawnGreen',
+    'LeftJustified',
+    'LeftSide',
+    'LemonChiffon',
+    'LightBlue',
+    'LightCoral',
+    'LightCyan',
+    'LightGoldenrodYellow',
+    'LightGreen',
+    'LightGrey',
+    'LightPink',
+    'LightSalmon',
+    'LightSeaGreen',
+    'LightSkyBlue',
+    'LightSlateGray',
+    'LightSteelBlue',
+    'LightYellow',
+    'Lime',
+    'LimeGreen',
+    'Linear',
+    'Linen',
+    'Log',
+    'Logarithmic',
+    'Magenta',
+    'Mahogany',
+    'Mark',
+    'MarkFill',
+    'Maroon',
+    'Max',
+    'MediumAquamarine',
+    'MediumBlue',
+    'MediumOrchid',
+    'MediumPurple',
+    'MediumSeaGreen',
+    'MediumSlateBlue',
+    'MediumSpringGreen',
+    'MediumTurquoise',
+    'MediumVioletRed',
+    'Melon',
+    'MidPoint',
+    'MidnightBlue',
+    'Min',
+    'MintCream',
+    'MistyRose',
+    'Moccasin',
+    'Move',
+    'MoveQuiet',
+    'Mulberry',
+    'N',
+    'NE',
+    'NNE',
+    'NNW',
+    'NW',
+    'NavajoWhite',
+    'Navy',
+    'NavyBlue',
+    'NoAlign',
+    'NoCrop',
+    'NoFill',
+    'NoSide',
+    'OldLace',
+    'Olive',
+    'OliveDrab',
+    'OliveGreen',
+    'Orange',
+    'OrangeRed',
+    'Orchid',
+    'Ox',
+    'Oy',
+    'PC',
+    'PaleGoldenrod',
+    'PaleGreen',
+    'PaleTurquoise',
+    'PaleVioletRed',
+    'PapayaWhip',
+    'Peach',
+    'PeachPuff',
+    'Periwinkle',
+    'Peru',
+    'PineGreen',
+    'Pink',
+    'Plum',
+    'PowderBlue',
+    'ProcessBlue',
+    'Purple',
+    'RK2',
+    'RK3',
+    'RK3BS',
+    'RK4',
+    'RK5',
+    'RK5DP',
+    'RK5F',
+    'RawSienna',
+    'Red',
+    'RedOrange',
+    'RedViolet',
+    'Rhodamine',
+    'RightJustified',
+    'RightSide',
+    'RosyBrown',
+    'RoyalBlue',
+    'RoyalPurple',
+    'RubineRed',
+    'S',
+    'SE',
+    'SSE',
+    'SSW',
+    'SW',
+    'SaddleBrown',
+    'Salmon',
+    'SandyBrown',
+    'SeaGreen',
+    'Seashell',
+    'Sepia',
+    'Sienna',
+    'Silver',
+    'SimpleHead',
+    'SkyBlue',
+    'SlateBlue',
+    'SlateGray',
+    'Snow',
+    'SpringGreen',
+    'SteelBlue',
+    'Suppress',
+    'SuppressQuiet',
+    'Tan',
+    'TeXHead',
+    'Teal',
+    'TealBlue',
+    'Thistle',
+    'Ticksize',
+    'Tomato',
+    'Turquoise',
+    'UnFill',
+    'VERSION',
+    'Value',
+    'Vertical',
+    'Violet',
+    'VioletRed',
+    'W',
+    'WNW',
+    'WSW',
+    'Wheat',
+    'White',
+    'WhiteSmoke',
+    'WildStrawberry',
+    'XYAlign',
+    'YAlign',
+    'Yellow',
+    'YellowGreen',
+    'YellowOrange',
+    'addpenarc',
+    'addpenline',
+    'align',
+    'allowstepping',
+    'angularsystem',
+    'animationdelay',
+    'appendsuffix',
+    'arcarrowangle',
+    'arcarrowfactor',
+    'arrow2sizelimit',
+    'arrowangle',
+    'arrowbarb',
+    'arrowdir',
+    'arrowfactor',
+    'arrowhookfactor',
+    'arrowlength',
+    'arrowsizelimit',
+    'arrowtexfactor',
+    'authorpen',
+    'axis',
+    'axiscoverage',
+    'axislabelfactor',
+    'background',
+    'backgroundcolor',
+    'backgroundpen',
+    'barfactor',
+    'barmarksizefactor',
+    'basealign',
+    'baselinetemplate',
+    'beveljoin',
+    'bigvertexpen',
+    'bigvertexsize',
+    'black',
+    'blue',
+    'bm',
+    'bottom',
+    'bp',
+    'brown',
+    'bullet',
+    'byfoci',
+    'byvertices',
+    'camerafactor',
+    'chartreuse',
+    'circlemarkradiusfactor',
+    'circlenodesnumberfactor',
+    'circleprecision',
+    'circlescale',
+    'cm',
+    'codefile',
+    'codepen',
+    'codeskip',
+    'colorPen',
+    'coloredNodes',
+    'coloredSegments',
+    'conditionlength',
+    'conicnodesfactor',
+    'count',
+    'cputimeformat',
+    'crossmarksizefactor',
+    'currentcoordsys',
+    'currentlight',
+    'currentpatterns',
+    'currentpen',
+    'currentpicture',
+    'currentposition',
+    'currentprojection',
+    'curvilinearsystem',
+    'cuttings',
+    'cyan',
+    'darkblue',
+    'darkbrown',
+    'darkcyan',
+    'darkgray',
+    'darkgreen',
+    'darkgrey',
+    'darkmagenta',
+    'darkolive',
+    'darkred',
+    'dashdotted',
+    'dashed',
+    'datepen',
+    'dateskip',
+    'debuggerlines',
+    'debugging',
+    'deepblue',
+    'deepcyan',
+    'deepgray',
+    'deepgreen',
+    'deepgrey',
+    'deepmagenta',
+    'deepred',
+    'default',
+    'defaultControl',
+    'defaultS',
+    'defaultbackpen',
+    'defaultcoordsys',
+    'defaultfilename',
+    'defaultformat',
+    'defaultmassformat',
+    'defaultpen',
+    'diagnostics',
+    'differentlengths',
+    'dot',
+    'dotfactor',
+    'dotframe',
+    'dotted',
+    'doublelinepen',
+    'doublelinespacing',
+    'down',
+    'duplicateFuzz',
+    'ellipsenodesnumberfactor',
+    'eps',
+    'epsgeo',
+    'epsilon',
+    'evenodd',
+    'extendcap',
+    'fermionpen',
+    'figureborder',
+    'figuremattpen',
+    'firstnode',
+    'firststep',
+    'foregroundcolor',
+    'fuchsia',
+    'fuzz',
+    'gapfactor',
+    'ghostpen',
+    'gluonamplitude',
+    'gluonpen',
+    'gluonratio',
+    'gray',
+    'green',
+    'grey',
+    'hatchepsilon',
+    'havepagenumber',
+    'heavyblue',
+    'heavycyan',
+    'heavygray',
+    'heavygreen',
+    'heavygrey',
+    'heavymagenta',
+    'heavyred',
+    'hline',
+    'hwratio',
+    'hyperbolanodesnumberfactor',
+    'identity4',
+    'ignore',
+    'inXasyMode',
+    'inch',
+    'inches',
+    'includegraphicscommand',
+    'inf',
+    'infinity',
+    'institutionpen',
+    'intMax',
+    'intMin',
+    'invert',
+    'invisible',
+    'itempen',
+    'itemskip',
+    'itemstep',
+    'labelmargin',
+    'landscape',
+    'lastnode',
+    'left',
+    'legendhskip',
+    'legendlinelength',
+    'legendmargin',
+    'legendmarkersize',
+    'legendmaxrelativewidth',
+    'legendvskip',
+    'lightblue',
+    'lightcyan',
+    'lightgray',
+    'lightgreen',
+    'lightgrey',
+    'lightmagenta',
+    'lightolive',
+    'lightred',
+    'lightyellow',
+    'linemargin',
+    'lm_infmsg',
+    'lm_shortmsg',
+    'longdashdotted',
+    'longdashed',
+    'magenta',
+    'magneticPoints',
+    'magneticRadius',
+    'mantissaBits',
+    'markangleradius',
+    'markangleradiusfactor',
+    'markanglespace',
+    'markanglespacefactor',
+    'mediumblue',
+    'mediumcyan',
+    'mediumgray',
+    'mediumgreen',
+    'mediumgrey',
+    'mediummagenta',
+    'mediumred',
+    'mediumyellow',
+    'middle',
+    'minDistDefault',
+    'minblockheight',
+    'minblockwidth',
+    'mincirclediameter',
+    'minipagemargin',
+    'minipagewidth',
+    'minvertexangle',
+    'miterjoin',
+    'mm',
+    'momarrowfactor',
+    'momarrowlength',
+    'momarrowmargin',
+    'momarrowoffset',
+    'momarrowpen',
+    'monoPen',
+    'morepoints',
+    'nCircle',
+    'newbulletcolor',
+    'ngraph',
+    'nil',
+    'nmesh',
+    'nobasealign',
+    'nodeMarginDefault',
+    'nodesystem',
+    'nomarker',
+    'nopoint',
+    'noprimary',
+    'nullpath',
+    'nullpen',
+    'numarray',
+    'ocgindex',
+    'oldbulletcolor',
+    'olive',
+    'orange',
+    'origin',
+    'overpaint',
+    'page',
+    'pageheight',
+    'pagemargin',
+    'pagenumberalign',
+    'pagenumberpen',
+    'pagenumberposition',
+    'pagewidth',
+    'paleblue',
+    'palecyan',
+    'palegray',
+    'palegreen',
+    'palegrey',
+    'palemagenta',
+    'palered',
+    'paleyellow',
+    'parabolanodesnumberfactor',
+    'perpfactor',
+    'phi',
+    'photonamplitude',
+    'photonpen',
+    'photonratio',
+    'pi',
+    'pink',
+    'plain',
+    'plus',
+    'preamblenodes',
+    'pt',
+    'purple',
+    'r3',
+    'r4a',
+    'r4b',
+    'randMax',
+    'realDigits',
+    'realEpsilon',
+    'realMax',
+    'realMin',
+    'red',
+    'relativesystem',
+    'reverse',
+    'right',
+    'roundcap',
+    'roundjoin',
+    'royalblue',
+    'salmon',
+    'saveFunctions',
+    'scalarpen',
+    'sequencereal',
+    'settings',
+    'shipped',
+    'signedtrailingzero',
+    'solid',
+    'springgreen',
+    'sqrtEpsilon',
+    'squarecap',
+    'squarepen',
+    'startposition',
+    'stdin',
+    'stdout',
+    'stepfactor',
+    'stepfraction',
+    'steppagenumberpen',
+    'stepping',
+    'stickframe',
+    'stickmarksizefactor',
+    'stickmarkspacefactor',
+    'textpen',
+    'ticksize',
+    'tildeframe',
+    'tildemarksizefactor',
+    'tinv',
+    'titlealign',
+    'titlepagepen',
+    'titlepageposition',
+    'titlepen',
+    'titleskip',
+    'top',
+    'trailingzero',
+    'treeLevelStep',
+    'treeMinNodeWidth',
+    'treeNodeStep',
+    'trembleAngle',
+    'trembleFrequency',
+    'trembleRandom',
+    'tremblingMode',
+    'undefined',
+    'unitcircle',
+    'unitsquare',
+    'up',
+    'urlpen',
+    'urlskip',
+    'version',
+    'vertexpen',
+    'vertexsize',
+    'viewportmargin',
+    'viewportsize',
+    'vline',
+    'white',
+    'wye',
+    'xformStack',
+    'yellow',
+    'ylabelwidth',
+    'zerotickfuzz',
+    'zerowinding'
+}
diff --git a/.venv/Lib/site-packages/pygments/lexers/_cl_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_cl_builtins.py
new file mode 100644 (file)
index 0000000..6e4516d
--- /dev/null
@@ -0,0 +1,231 @@
+"""
+    pygments.lexers._cl_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    ANSI Common Lisp builtins.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+BUILTIN_FUNCTIONS = {  # 638 functions
+    '<', '<=', '=', '>', '>=', '-', '/', '/=', '*', '+', '1-', '1+',
+    'abort', 'abs', 'acons', 'acos', 'acosh', 'add-method', 'adjoin',
+    'adjustable-array-p', 'adjust-array', 'allocate-instance',
+    'alpha-char-p', 'alphanumericp', 'append', 'apply', 'apropos',
+    'apropos-list', 'aref', 'arithmetic-error-operands',
+    'arithmetic-error-operation', 'array-dimension', 'array-dimensions',
+    'array-displacement', 'array-element-type', 'array-has-fill-pointer-p',
+    'array-in-bounds-p', 'arrayp', 'array-rank', 'array-row-major-index',
+    'array-total-size', 'ash', 'asin', 'asinh', 'assoc', 'assoc-if',
+    'assoc-if-not', 'atan', 'atanh', 'atom', 'bit', 'bit-and', 'bit-andc1',
+    'bit-andc2', 'bit-eqv', 'bit-ior', 'bit-nand', 'bit-nor', 'bit-not',
+    'bit-orc1', 'bit-orc2', 'bit-vector-p', 'bit-xor', 'boole',
+    'both-case-p', 'boundp', 'break', 'broadcast-stream-streams',
+    'butlast', 'byte', 'byte-position', 'byte-size', 'caaaar', 'caaadr',
+    'caaar', 'caadar', 'caaddr', 'caadr', 'caar', 'cadaar', 'cadadr',
+    'cadar', 'caddar', 'cadddr', 'caddr', 'cadr', 'call-next-method', 'car',
+    'cdaaar', 'cdaadr', 'cdaar', 'cdadar', 'cdaddr', 'cdadr', 'cdar',
+    'cddaar', 'cddadr', 'cddar', 'cdddar', 'cddddr', 'cdddr', 'cddr', 'cdr',
+    'ceiling', 'cell-error-name', 'cerror', 'change-class', 'char', 'char<',
+    'char<=', 'char=', 'char>', 'char>=', 'char/=', 'character',
+    'characterp', 'char-code', 'char-downcase', 'char-equal',
+    'char-greaterp', 'char-int', 'char-lessp', 'char-name',
+    'char-not-equal', 'char-not-greaterp', 'char-not-lessp', 'char-upcase',
+    'cis', 'class-name', 'class-of', 'clear-input', 'clear-output',
+    'close', 'clrhash', 'code-char', 'coerce', 'compile',
+    'compiled-function-p', 'compile-file', 'compile-file-pathname',
+    'compiler-macro-function', 'complement', 'complex', 'complexp',
+    'compute-applicable-methods', 'compute-restarts', 'concatenate',
+    'concatenated-stream-streams', 'conjugate', 'cons', 'consp',
+    'constantly', 'constantp', 'continue', 'copy-alist', 'copy-list',
+    'copy-pprint-dispatch', 'copy-readtable', 'copy-seq', 'copy-structure',
+    'copy-symbol', 'copy-tree', 'cos', 'cosh', 'count', 'count-if',
+    'count-if-not', 'decode-float', 'decode-universal-time', 'delete',
+    'delete-duplicates', 'delete-file', 'delete-if', 'delete-if-not',
+    'delete-package', 'denominator', 'deposit-field', 'describe',
+    'describe-object', 'digit-char', 'digit-char-p', 'directory',
+    'directory-namestring', 'disassemble', 'documentation', 'dpb',
+    'dribble', 'echo-stream-input-stream', 'echo-stream-output-stream',
+    'ed', 'eighth', 'elt', 'encode-universal-time', 'endp',
+    'enough-namestring', 'ensure-directories-exist',
+    'ensure-generic-function', 'eq', 'eql', 'equal', 'equalp', 'error',
+    'eval', 'evenp', 'every', 'exp', 'export', 'expt', 'fboundp',
+    'fceiling', 'fdefinition', 'ffloor', 'fifth', 'file-author',
+    'file-error-pathname', 'file-length', 'file-namestring',
+    'file-position', 'file-string-length', 'file-write-date',
+    'fill', 'fill-pointer', 'find', 'find-all-symbols', 'find-class',
+    'find-if', 'find-if-not', 'find-method', 'find-package', 'find-restart',
+    'find-symbol', 'finish-output', 'first', 'float', 'float-digits',
+    'floatp', 'float-precision', 'float-radix', 'float-sign', 'floor',
+    'fmakunbound', 'force-output', 'format', 'fourth', 'fresh-line',
+    'fround', 'ftruncate', 'funcall', 'function-keywords',
+    'function-lambda-expression', 'functionp', 'gcd', 'gensym', 'gentemp',
+    'get', 'get-decoded-time', 'get-dispatch-macro-character', 'getf',
+    'gethash', 'get-internal-real-time', 'get-internal-run-time',
+    'get-macro-character', 'get-output-stream-string', 'get-properties',
+    'get-setf-expansion', 'get-universal-time', 'graphic-char-p',
+    'hash-table-count', 'hash-table-p', 'hash-table-rehash-size',
+    'hash-table-rehash-threshold', 'hash-table-size', 'hash-table-test',
+    'host-namestring', 'identity', 'imagpart', 'import',
+    'initialize-instance', 'input-stream-p', 'inspect',
+    'integer-decode-float', 'integer-length', 'integerp',
+    'interactive-stream-p', 'intern', 'intersection',
+    'invalid-method-error', 'invoke-debugger', 'invoke-restart',
+    'invoke-restart-interactively', 'isqrt', 'keywordp', 'last', 'lcm',
+    'ldb', 'ldb-test', 'ldiff', 'length', 'lisp-implementation-type',
+    'lisp-implementation-version', 'list', 'list*', 'list-all-packages',
+    'listen', 'list-length', 'listp', 'load',
+    'load-logical-pathname-translations', 'log', 'logand', 'logandc1',
+    'logandc2', 'logbitp', 'logcount', 'logeqv', 'logical-pathname',
+    'logical-pathname-translations', 'logior', 'lognand', 'lognor',
+    'lognot', 'logorc1', 'logorc2', 'logtest', 'logxor', 'long-site-name',
+    'lower-case-p', 'machine-instance', 'machine-type', 'machine-version',
+    'macroexpand', 'macroexpand-1', 'macro-function', 'make-array',
+    'make-broadcast-stream', 'make-concatenated-stream', 'make-condition',
+    'make-dispatch-macro-character', 'make-echo-stream', 'make-hash-table',
+    'make-instance', 'make-instances-obsolete', 'make-list',
+    'make-load-form', 'make-load-form-saving-slots', 'make-package',
+    'make-pathname', 'make-random-state', 'make-sequence', 'make-string',
+    'make-string-input-stream', 'make-string-output-stream', 'make-symbol',
+    'make-synonym-stream', 'make-two-way-stream', 'makunbound', 'map',
+    'mapc', 'mapcan', 'mapcar', 'mapcon', 'maphash', 'map-into', 'mapl',
+    'maplist', 'mask-field', 'max', 'member', 'member-if', 'member-if-not',
+    'merge', 'merge-pathnames', 'method-combination-error',
+    'method-qualifiers', 'min', 'minusp', 'mismatch', 'mod',
+    'muffle-warning', 'name-char', 'namestring', 'nbutlast', 'nconc',
+    'next-method-p', 'nintersection', 'ninth', 'no-applicable-method',
+    'no-next-method', 'not', 'notany', 'notevery', 'nreconc', 'nreverse',
+    'nset-difference', 'nset-exclusive-or', 'nstring-capitalize',
+    'nstring-downcase', 'nstring-upcase', 'nsublis', 'nsubst', 'nsubst-if',
+    'nsubst-if-not', 'nsubstitute', 'nsubstitute-if', 'nsubstitute-if-not',
+    'nth', 'nthcdr', 'null', 'numberp', 'numerator', 'nunion', 'oddp',
+    'open', 'open-stream-p', 'output-stream-p', 'package-error-package',
+    'package-name', 'package-nicknames', 'packagep',
+    'package-shadowing-symbols', 'package-used-by-list', 'package-use-list',
+    'pairlis', 'parse-integer', 'parse-namestring', 'pathname',
+    'pathname-device', 'pathname-directory', 'pathname-host',
+    'pathname-match-p', 'pathname-name', 'pathnamep', 'pathname-type',
+    'pathname-version', 'peek-char', 'phase', 'plusp', 'position',
+    'position-if', 'position-if-not', 'pprint', 'pprint-dispatch',
+    'pprint-fill', 'pprint-indent', 'pprint-linear', 'pprint-newline',
+    'pprint-tab', 'pprint-tabular', 'prin1', 'prin1-to-string', 'princ',
+    'princ-to-string', 'print', 'print-object', 'probe-file', 'proclaim',
+    'provide', 'random', 'random-state-p', 'rassoc', 'rassoc-if',
+    'rassoc-if-not', 'rational', 'rationalize', 'rationalp', 'read',
+    'read-byte', 'read-char', 'read-char-no-hang', 'read-delimited-list',
+    'read-from-string', 'read-line', 'read-preserving-whitespace',
+    'read-sequence', 'readtable-case', 'readtablep', 'realp', 'realpart',
+    'reduce', 'reinitialize-instance', 'rem', 'remhash', 'remove',
+    'remove-duplicates', 'remove-if', 'remove-if-not', 'remove-method',
+    'remprop', 'rename-file', 'rename-package', 'replace', 'require',
+    'rest', 'restart-name', 'revappend', 'reverse', 'room', 'round',
+    'row-major-aref', 'rplaca', 'rplacd', 'sbit', 'scale-float', 'schar',
+    'search', 'second', 'set', 'set-difference',
+    'set-dispatch-macro-character', 'set-exclusive-or',
+    'set-macro-character', 'set-pprint-dispatch', 'set-syntax-from-char',
+    'seventh', 'shadow', 'shadowing-import', 'shared-initialize',
+    'short-site-name', 'signal', 'signum', 'simple-bit-vector-p',
+    'simple-condition-format-arguments', 'simple-condition-format-control',
+    'simple-string-p', 'simple-vector-p', 'sin', 'sinh', 'sixth', 'sleep',
+    'slot-boundp', 'slot-exists-p', 'slot-makunbound', 'slot-missing',
+    'slot-unbound', 'slot-value', 'software-type', 'software-version',
+    'some', 'sort', 'special-operator-p', 'sqrt', 'stable-sort',
+    'standard-char-p', 'store-value', 'stream-element-type',
+    'stream-error-stream', 'stream-external-format', 'streamp', 'string',
+    'string<', 'string<=', 'string=', 'string>', 'string>=', 'string/=',
+    'string-capitalize', 'string-downcase', 'string-equal',
+    'string-greaterp', 'string-left-trim', 'string-lessp',
+    'string-not-equal', 'string-not-greaterp', 'string-not-lessp',
+    'stringp', 'string-right-trim', 'string-trim', 'string-upcase',
+    'sublis', 'subseq', 'subsetp', 'subst', 'subst-if', 'subst-if-not',
+    'substitute', 'substitute-if', 'substitute-if-not', 'subtypep','svref',
+    'sxhash', 'symbol-function', 'symbol-name', 'symbolp', 'symbol-package',
+    'symbol-plist', 'symbol-value', 'synonym-stream-symbol', 'syntax:',
+    'tailp', 'tan', 'tanh', 'tenth', 'terpri', 'third',
+    'translate-logical-pathname', 'translate-pathname', 'tree-equal',
+    'truename', 'truncate', 'two-way-stream-input-stream',
+    'two-way-stream-output-stream', 'type-error-datum',
+    'type-error-expected-type', 'type-of', 'typep', 'unbound-slot-instance',
+    'unexport', 'unintern', 'union', 'unread-char', 'unuse-package',
+    'update-instance-for-different-class',
+    'update-instance-for-redefined-class', 'upgraded-array-element-type',
+    'upgraded-complex-part-type', 'upper-case-p', 'use-package',
+    'user-homedir-pathname', 'use-value', 'values', 'values-list', 'vector',
+    'vectorp', 'vector-pop', 'vector-push', 'vector-push-extend', 'warn',
+    'wild-pathname-p', 'write', 'write-byte', 'write-char', 'write-line',
+    'write-sequence', 'write-string', 'write-to-string', 'yes-or-no-p',
+    'y-or-n-p', 'zerop',
+}
+
+SPECIAL_FORMS = {
+    'block', 'catch', 'declare', 'eval-when', 'flet', 'function', 'go', 'if',
+    'labels', 'lambda', 'let', 'let*', 'load-time-value', 'locally', 'macrolet',
+    'multiple-value-call', 'multiple-value-prog1', 'progn', 'progv', 'quote',
+    'return-from', 'setq', 'symbol-macrolet', 'tagbody', 'the', 'throw',
+    'unwind-protect',
+}
+
+MACROS = {
+    'and', 'assert', 'call-method', 'case', 'ccase', 'check-type', 'cond',
+    'ctypecase', 'decf', 'declaim', 'defclass', 'defconstant', 'defgeneric',
+    'define-compiler-macro', 'define-condition', 'define-method-combination',
+    'define-modify-macro', 'define-setf-expander', 'define-symbol-macro',
+    'defmacro', 'defmethod', 'defpackage', 'defparameter', 'defsetf',
+    'defstruct', 'deftype', 'defun', 'defvar', 'destructuring-bind', 'do',
+    'do*', 'do-all-symbols', 'do-external-symbols', 'dolist', 'do-symbols',
+    'dotimes', 'ecase', 'etypecase', 'formatter', 'handler-bind',
+    'handler-case', 'ignore-errors', 'incf', 'in-package', 'lambda', 'loop',
+    'loop-finish', 'make-method', 'multiple-value-bind', 'multiple-value-list',
+    'multiple-value-setq', 'nth-value', 'or', 'pop',
+    'pprint-exit-if-list-exhausted', 'pprint-logical-block', 'pprint-pop',
+    'print-unreadable-object', 'prog', 'prog*', 'prog1', 'prog2', 'psetf',
+    'psetq', 'push', 'pushnew', 'remf', 'restart-bind', 'restart-case',
+    'return', 'rotatef', 'setf', 'shiftf', 'step', 'time', 'trace', 'typecase',
+    'unless', 'untrace', 'when', 'with-accessors', 'with-compilation-unit',
+    'with-condition-restarts', 'with-hash-table-iterator',
+    'with-input-from-string', 'with-open-file', 'with-open-stream',
+    'with-output-to-string', 'with-package-iterator', 'with-simple-restart',
+    'with-slots', 'with-standard-io-syntax',
+}
+
+LAMBDA_LIST_KEYWORDS = {
+    '&allow-other-keys', '&aux', '&body', '&environment', '&key', '&optional',
+    '&rest', '&whole',
+}
+
+DECLARATIONS = {
+    'dynamic-extent', 'ignore', 'optimize', 'ftype', 'inline', 'special',
+    'ignorable', 'notinline', 'type',
+}
+
+BUILTIN_TYPES = {
+    'atom', 'boolean', 'base-char', 'base-string', 'bignum', 'bit',
+    'compiled-function', 'extended-char', 'fixnum', 'keyword', 'nil',
+    'signed-byte', 'short-float', 'single-float', 'double-float', 'long-float',
+    'simple-array', 'simple-base-string', 'simple-bit-vector', 'simple-string',
+    'simple-vector', 'standard-char', 'unsigned-byte',
+
+    # Condition Types
+    'arithmetic-error', 'cell-error', 'condition', 'control-error',
+    'division-by-zero', 'end-of-file', 'error', 'file-error',
+    'floating-point-inexact', 'floating-point-overflow',
+    'floating-point-underflow', 'floating-point-invalid-operation',
+    'parse-error', 'package-error', 'print-not-readable', 'program-error',
+    'reader-error', 'serious-condition', 'simple-condition', 'simple-error',
+    'simple-type-error', 'simple-warning', 'stream-error', 'storage-condition',
+    'style-warning', 'type-error', 'unbound-variable', 'unbound-slot',
+    'undefined-function', 'warning',
+}
+
+BUILTIN_CLASSES = {
+    'array', 'broadcast-stream', 'bit-vector', 'built-in-class', 'character',
+    'class', 'complex', 'concatenated-stream', 'cons', 'echo-stream',
+    'file-stream', 'float', 'function', 'generic-function', 'hash-table',
+    'integer', 'list', 'logical-pathname', 'method-combination', 'method',
+    'null', 'number', 'package', 'pathname', 'ratio', 'rational', 'readtable',
+    'real', 'random-state', 'restart', 'sequence', 'standard-class',
+    'standard-generic-function', 'standard-method', 'standard-object',
+    'string-stream', 'stream', 'string', 'structure-class', 'structure-object',
+    'symbol', 'synonym-stream', 't', 'two-way-stream', 'vector',
+}
diff --git a/.venv/Lib/site-packages/pygments/lexers/_cocoa_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_cocoa_builtins.py
new file mode 100644 (file)
index 0000000..ef0a968
--- /dev/null
@@ -0,0 +1,75 @@
+"""
+    pygments.lexers._cocoa_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file defines a set of types used across Cocoa frameworks from Apple.
+    There is a list of @interfaces, @protocols and some other (structs, unions)
+
+    File may be also used as standalone generator for above.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+COCOA_INTERFACES = {'AAAttribution', 'ABNewPersonViewController', 'ABPeoplePickerNavigationController', 'ABPersonViewController', 'ABUnknownPersonViewController', 'ACAccount', 'ACAccountCredential', 'ACAccountStore', 'ACAccountType', 'ADBannerView', 'ADClient', 'ADInterstitialAd', 'ADInterstitialAdPresentationViewController', 'AEAssessmentConfiguration', 'AEAssessmentSession', 'ALAsset', 'ALAssetRepresentation', 'ALAssetsFilter', 'ALAssetsGroup', 'ALAssetsLibrary', 'APActivationPayload', 'ARAnchor', 'ARAppClipCodeAnchor', 'ARBody2D', 'ARBodyAnchor', 'ARBodyTrackingConfiguration', 'ARCamera', 'ARCoachingOverlayView', 'ARCollaborationData', 'ARConfiguration', 'ARDepthData', 'ARDirectionalLightEstimate', 'AREnvironmentProbeAnchor', 'ARFaceAnchor', 'ARFaceGeometry', 'ARFaceTrackingConfiguration', 'ARFrame', 'ARGeoAnchor', 'ARGeoTrackingConfiguration', 'ARGeoTrackingStatus', 'ARGeometryElement', 'ARGeometrySource', 'ARHitTestResult', 'ARImageAnchor', 'ARImageTrackingConfiguration', 'ARLightEstimate', 'ARMatteGenerator', 'ARMeshAnchor', 'ARMeshGeometry', 'ARObjectAnchor', 'ARObjectScanningConfiguration', 'AROrientationTrackingConfiguration', 'ARParticipantAnchor', 'ARPlaneAnchor', 'ARPlaneGeometry', 'ARPointCloud', 'ARPositionalTrackingConfiguration', 'ARQuickLookPreviewItem', 'ARRaycastQuery', 'ARRaycastResult', 'ARReferenceImage', 'ARReferenceObject', 'ARSCNFaceGeometry', 'ARSCNPlaneGeometry', 'ARSCNView', 'ARSKView', 'ARSession', 'ARSkeleton', 'ARSkeleton2D', 'ARSkeleton3D', 'ARSkeletonDefinition', 'ARTrackedRaycast', 'ARVideoFormat', 'ARView', 'ARWorldMap', 'ARWorldTrackingConfiguration', 'ASAccountAuthenticationModificationController', 'ASAccountAuthenticationModificationExtensionContext', 'ASAccountAuthenticationModificationReplacePasswordWithSignInWithAppleRequest', 'ASAccountAuthenticationModificationRequest', 'ASAccountAuthenticationModificationUpgradePasswordToStrongPasswordRequest', 'ASAccountAuthenticationModificationViewController', 'ASAuthorization', 'ASAuthorizationAppleIDButton', 'ASAuthorizationAppleIDCredential', 'ASAuthorizationAppleIDProvider', 'ASAuthorizationAppleIDRequest', 'ASAuthorizationController', 'ASAuthorizationOpenIDRequest', 'ASAuthorizationPasswordProvider', 'ASAuthorizationPasswordRequest', 'ASAuthorizationProviderExtensionAuthorizationRequest', 'ASAuthorizationRequest', 'ASAuthorizationSingleSignOnCredential', 'ASAuthorizationSingleSignOnProvider', 'ASAuthorizationSingleSignOnRequest', 'ASCredentialIdentityStore', 'ASCredentialIdentityStoreState', 'ASCredentialProviderExtensionContext', 'ASCredentialProviderViewController', 'ASCredentialServiceIdentifier', 'ASIdentifierManager', 'ASPasswordCredential', 'ASPasswordCredentialIdentity', 'ASWebAuthenticationSession', 'ASWebAuthenticationSessionRequest', 'ASWebAuthenticationSessionWebBrowserSessionManager', 'ATTrackingManager', 'AUAudioUnit', 'AUAudioUnitBus', 'AUAudioUnitBusArray', 'AUAudioUnitPreset', 'AUAudioUnitV2Bridge', 'AUAudioUnitViewConfiguration', 'AUParameter', 'AUParameterGroup', 'AUParameterNode', 'AUParameterTree', 'AUViewController', 'AVAggregateAssetDownloadTask', 'AVAsset', 'AVAssetCache', 'AVAssetDownloadStorageManagementPolicy', 'AVAssetDownloadStorageManager', 'AVAssetDownloadTask', 'AVAssetDownloadURLSession', 'AVAssetExportSession', 'AVAssetImageGenerator', 'AVAssetReader', 'AVAssetReaderAudioMixOutput', 'AVAssetReaderOutput', 'AVAssetReaderOutputMetadataAdaptor', 'AVAssetReaderSampleReferenceOutput', 'AVAssetReaderTrackOutput', 'AVAssetReaderVideoCompositionOutput', 'AVAssetResourceLoader', 'AVAssetResourceLoadingContentInformationRequest', 'AVAssetResourceLoadingDataRequest', 'AVAssetResourceLoadingRequest', 'AVAssetResourceLoadingRequestor', 'AVAssetResourceRenewalRequest', 'AVAssetSegmentReport', 'AVAssetSegmentReportSampleInformation', 'AVAssetSegmentTrackReport', 'AVAssetTrack', 'AVAssetTrackGroup', 'AVAssetTrackSegment', 'AVAssetWriter', 'AVAssetWriterInput', 'AVAssetWriterInputGroup', 'AVAssetWriterInputMetadataAdaptor', 'AVAssetWriterInputPassDescription', 'AVAssetWriterInputPixelBufferAdaptor', 'AVAsynchronousCIImageFilteringRequest', 'AVAsynchronousVideoCompositionRequest', 'AVAudioMix', 'AVAudioMixInputParameters', 'AVAudioSession', 'AVCameraCalibrationData', 'AVCaptureAudioChannel', 'AVCaptureAudioDataOutput', 'AVCaptureAudioFileOutput', 'AVCaptureAudioPreviewOutput', 'AVCaptureAutoExposureBracketedStillImageSettings', 'AVCaptureBracketedStillImageSettings', 'AVCaptureConnection', 'AVCaptureDataOutputSynchronizer', 'AVCaptureDepthDataOutput', 'AVCaptureDevice', 'AVCaptureDeviceDiscoverySession', 'AVCaptureDeviceFormat', 'AVCaptureDeviceInput', 'AVCaptureDeviceInputSource', 'AVCaptureFileOutput', 'AVCaptureInput', 'AVCaptureInputPort', 'AVCaptureManualExposureBracketedStillImageSettings', 'AVCaptureMetadataInput', 'AVCaptureMetadataOutput', 'AVCaptureMovieFileOutput', 'AVCaptureMultiCamSession', 'AVCaptureOutput', 'AVCapturePhoto', 'AVCapturePhotoBracketSettings', 'AVCapturePhotoOutput', 'AVCapturePhotoSettings', 'AVCaptureResolvedPhotoSettings', 'AVCaptureScreenInput', 'AVCaptureSession', 'AVCaptureStillImageOutput', 'AVCaptureSynchronizedData', 'AVCaptureSynchronizedDataCollection', 'AVCaptureSynchronizedDepthData', 'AVCaptureSynchronizedMetadataObjectData', 'AVCaptureSynchronizedSampleBufferData', 'AVCaptureSystemPressureState', 'AVCaptureVideoDataOutput', 'AVCaptureVideoPreviewLayer', 'AVComposition', 'AVCompositionTrack', 'AVCompositionTrackFormatDescriptionReplacement', 'AVCompositionTrackSegment', 'AVContentKeyRequest', 'AVContentKeyResponse', 'AVContentKeySession', 'AVDateRangeMetadataGroup', 'AVDepthData', 'AVDisplayCriteria', 'AVFragmentedAsset', 'AVFragmentedAssetMinder', 'AVFragmentedAssetTrack', 'AVFragmentedMovie', 'AVFragmentedMovieMinder', 'AVFragmentedMovieTrack', 'AVFrameRateRange', 'AVMediaDataStorage', 'AVMediaSelection', 'AVMediaSelectionGroup', 'AVMediaSelectionOption', 'AVMetadataBodyObject', 'AVMetadataCatBodyObject', 'AVMetadataDogBodyObject', 'AVMetadataFaceObject', 'AVMetadataGroup', 'AVMetadataHumanBodyObject', 'AVMetadataItem', 'AVMetadataItemFilter', 'AVMetadataItemValueRequest', 'AVMetadataMachineReadableCodeObject', 'AVMetadataObject', 'AVMetadataSalientObject', 'AVMovie', 'AVMovieTrack', 'AVMutableAssetDownloadStorageManagementPolicy', 'AVMutableAudioMix', 'AVMutableAudioMixInputParameters', 'AVMutableComposition', 'AVMutableCompositionTrack', 'AVMutableDateRangeMetadataGroup', 'AVMutableMediaSelection', 'AVMutableMetadataItem', 'AVMutableMovie', 'AVMutableMovieTrack', 'AVMutableTimedMetadataGroup', 'AVMutableVideoComposition', 'AVMutableVideoCompositionInstruction', 'AVMutableVideoCompositionLayerInstruction', 'AVOutputSettingsAssistant', 'AVPersistableContentKeyRequest', 'AVPictureInPictureController', 'AVPlayer', 'AVPlayerItem', 'AVPlayerItemAccessLog', 'AVPlayerItemAccessLogEvent', 'AVPlayerItemErrorLog', 'AVPlayerItemErrorLogEvent', 'AVPlayerItemLegibleOutput', 'AVPlayerItemMediaDataCollector', 'AVPlayerItemMetadataCollector', 'AVPlayerItemMetadataOutput', 'AVPlayerItemOutput', 'AVPlayerItemTrack', 'AVPlayerItemVideoOutput', 'AVPlayerLayer', 'AVPlayerLooper', 'AVPlayerMediaSelectionCriteria', 'AVPlayerViewController', 'AVPortraitEffectsMatte', 'AVQueuePlayer', 'AVRouteDetector', 'AVRoutePickerView', 'AVSampleBufferAudioRenderer', 'AVSampleBufferDisplayLayer', 'AVSampleBufferRenderSynchronizer', 'AVSemanticSegmentationMatte', 'AVSynchronizedLayer', 'AVTextStyleRule', 'AVTimedMetadataGroup', 'AVURLAsset', 'AVVideoComposition', 'AVVideoCompositionCoreAnimationTool', 'AVVideoCompositionInstruction', 'AVVideoCompositionLayerInstruction', 'AVVideoCompositionRenderContext', 'AVVideoCompositionRenderHint', 'AXCustomContent', 'BCChatAction', 'BCChatButton', 'BGAppRefreshTask', 'BGAppRefreshTaskRequest', 'BGProcessingTask', 'BGProcessingTaskRequest', 'BGTask', 'BGTaskRequest', 'BGTaskScheduler', 'CAAnimation', 'CAAnimationGroup', 'CABTMIDICentralViewController', 'CABTMIDILocalPeripheralViewController', 'CABasicAnimation', 'CADisplayLink', 'CAEAGLLayer', 'CAEmitterCell', 'CAEmitterLayer', 'CAGradientLayer', 'CAInterAppAudioSwitcherView', 'CAInterAppAudioTransportView', 'CAKeyframeAnimation', 'CALayer', 'CAMediaTimingFunction', 'CAMetalLayer', 'CAPropertyAnimation', 'CAReplicatorLayer', 'CAScrollLayer', 'CAShapeLayer', 'CASpringAnimation', 'CATextLayer', 'CATiledLayer', 'CATransaction', 'CATransformLayer', 'CATransition', 'CAValueFunction', 'CBATTRequest', 'CBAttribute', 'CBCentral', 'CBCentralManager', 'CBCharacteristic', 'CBDescriptor', 'CBL2CAPChannel', 'CBManager', 'CBMutableCharacteristic', 'CBMutableDescriptor', 'CBMutableService', 'CBPeer', 'CBPeripheral', 'CBPeripheralManager', 'CBService', 'CBUUID', 'CHHapticDynamicParameter', 'CHHapticEngine', 'CHHapticEvent', 'CHHapticEventParameter', 'CHHapticParameterCurve', 'CHHapticParameterCurveControlPoint', 'CHHapticPattern', 'CIAztecCodeDescriptor', 'CIBarcodeDescriptor', 'CIBlendKernel', 'CIColor', 'CIColorKernel', 'CIContext', 'CIDataMatrixCodeDescriptor', 'CIDetector', 'CIFaceFeature', 'CIFeature', 'CIFilter', 'CIFilterGenerator', 'CIFilterShape', 'CIImage', 'CIImageAccumulator', 'CIImageProcessorKernel', 'CIKernel', 'CIPDF417CodeDescriptor', 'CIPlugIn', 'CIQRCodeDescriptor', 'CIQRCodeFeature', 'CIRectangleFeature', 'CIRenderDestination', 'CIRenderInfo', 'CIRenderTask', 'CISampler', 'CITextFeature', 'CIVector', 'CIWarpKernel', 'CKAcceptSharesOperation', 'CKAsset', 'CKContainer', 'CKDatabase', 'CKDatabaseNotification', 'CKDatabaseOperation', 'CKDatabaseSubscription', 'CKDiscoverAllUserIdentitiesOperation', 'CKDiscoverUserIdentitiesOperation', 'CKFetchDatabaseChangesOperation', 'CKFetchNotificationChangesOperation', 'CKFetchRecordChangesOperation', 'CKFetchRecordZoneChangesConfiguration', 'CKFetchRecordZoneChangesOperation', 'CKFetchRecordZoneChangesOptions', 'CKFetchRecordZonesOperation', 'CKFetchRecordsOperation', 'CKFetchShareMetadataOperation', 'CKFetchShareParticipantsOperation', 'CKFetchSubscriptionsOperation', 'CKFetchWebAuthTokenOperation', 'CKLocationSortDescriptor', 'CKMarkNotificationsReadOperation', 'CKModifyBadgeOperation', 'CKModifyRecordZonesOperation', 'CKModifyRecordsOperation', 'CKModifySubscriptionsOperation', 'CKNotification', 'CKNotificationID', 'CKNotificationInfo', 'CKOperation', 'CKOperationConfiguration', 'CKOperationGroup', 'CKQuery', 'CKQueryCursor', 'CKQueryNotification', 'CKQueryOperation', 'CKQuerySubscription', 'CKRecord', 'CKRecordID', 'CKRecordZone', 'CKRecordZoneID', 'CKRecordZoneNotification', 'CKRecordZoneSubscription', 'CKReference', 'CKServerChangeToken', 'CKShare', 'CKShareMetadata', 'CKShareParticipant', 'CKSubscription', 'CKUserIdentity', 'CKUserIdentityLookupInfo', 'CLBeacon', 'CLBeaconIdentityConstraint', 'CLBeaconRegion', 'CLCircularRegion', 'CLFloor', 'CLGeocoder', 'CLHeading', 'CLKComplication', 'CLKComplicationDescriptor', 'CLKComplicationServer', 'CLKComplicationTemplate', 'CLKComplicationTemplateCircularSmallRingImage', 'CLKComplicationTemplateCircularSmallRingText', 'CLKComplicationTemplateCircularSmallSimpleImage', 'CLKComplicationTemplateCircularSmallSimpleText', 'CLKComplicationTemplateCircularSmallStackImage', 'CLKComplicationTemplateCircularSmallStackText', 'CLKComplicationTemplateExtraLargeColumnsText', 'CLKComplicationTemplateExtraLargeRingImage', 'CLKComplicationTemplateExtraLargeRingText', 'CLKComplicationTemplateExtraLargeSimpleImage', 'CLKComplicationTemplateExtraLargeSimpleText', 'CLKComplicationTemplateExtraLargeStackImage', 'CLKComplicationTemplateExtraLargeStackText', 'CLKComplicationTemplateGraphicBezelCircularText', 'CLKComplicationTemplateGraphicCircular', 'CLKComplicationTemplateGraphicCircularClosedGaugeImage', 'CLKComplicationTemplateGraphicCircularClosedGaugeText', 'CLKComplicationTemplateGraphicCircularImage', 'CLKComplicationTemplateGraphicCircularOpenGaugeImage', 'CLKComplicationTemplateGraphicCircularOpenGaugeRangeText', 'CLKComplicationTemplateGraphicCircularOpenGaugeSimpleText', 'CLKComplicationTemplateGraphicCircularStackImage', 'CLKComplicationTemplateGraphicCircularStackText', 'CLKComplicationTemplateGraphicCornerCircularImage', 'CLKComplicationTemplateGraphicCornerGaugeImage', 'CLKComplicationTemplateGraphicCornerGaugeText', 'CLKComplicationTemplateGraphicCornerStackText', 'CLKComplicationTemplateGraphicCornerTextImage', 'CLKComplicationTemplateGraphicExtraLargeCircular', 'CLKComplicationTemplateGraphicExtraLargeCircularClosedGaugeImage', 'CLKComplicationTemplateGraphicExtraLargeCircularClosedGaugeText', 'CLKComplicationTemplateGraphicExtraLargeCircularImage', 'CLKComplicationTemplateGraphicExtraLargeCircularOpenGaugeImage', 'CLKComplicationTemplateGraphicExtraLargeCircularOpenGaugeRangeText', 'CLKComplicationTemplateGraphicExtraLargeCircularOpenGaugeSimpleText', 'CLKComplicationTemplateGraphicExtraLargeCircularStackImage', 'CLKComplicationTemplateGraphicExtraLargeCircularStackText', 'CLKComplicationTemplateGraphicRectangularFullImage', 'CLKComplicationTemplateGraphicRectangularLargeImage', 'CLKComplicationTemplateGraphicRectangularStandardBody', 'CLKComplicationTemplateGraphicRectangularTextGauge', 'CLKComplicationTemplateModularLargeColumns', 'CLKComplicationTemplateModularLargeStandardBody', 'CLKComplicationTemplateModularLargeTable', 'CLKComplicationTemplateModularLargeTallBody', 'CLKComplicationTemplateModularSmallColumnsText', 'CLKComplicationTemplateModularSmallRingImage', 'CLKComplicationTemplateModularSmallRingText', 'CLKComplicationTemplateModularSmallSimpleImage', 'CLKComplicationTemplateModularSmallSimpleText', 'CLKComplicationTemplateModularSmallStackImage', 'CLKComplicationTemplateModularSmallStackText', 'CLKComplicationTemplateUtilitarianLargeFlat', 'CLKComplicationTemplateUtilitarianSmallFlat', 'CLKComplicationTemplateUtilitarianSmallRingImage', 'CLKComplicationTemplateUtilitarianSmallRingText', 'CLKComplicationTemplateUtilitarianSmallSquare', 'CLKComplicationTimelineEntry', 'CLKDateTextProvider', 'CLKFullColorImageProvider', 'CLKGaugeProvider', 'CLKImageProvider', 'CLKRelativeDateTextProvider', 'CLKSimpleGaugeProvider', 'CLKSimpleTextProvider', 'CLKTextProvider', 'CLKTimeIntervalGaugeProvider', 'CLKTimeIntervalTextProvider', 'CLKTimeTextProvider', 'CLKWatchFaceLibrary', 'CLLocation', 'CLLocationManager', 'CLPlacemark', 'CLRegion', 'CLSActivity', 'CLSActivityItem', 'CLSBinaryItem', 'CLSContext', 'CLSDataStore', 'CLSObject', 'CLSProgressReportingCapability', 'CLSQuantityItem', 'CLSScoreItem', 'CLVisit', 'CMAccelerometerData', 'CMAltimeter', 'CMAltitudeData', 'CMAttitude', 'CMDeviceMotion', 'CMDyskineticSymptomResult', 'CMFallDetectionEvent', 'CMFallDetectionManager', 'CMGyroData', 'CMHeadphoneMotionManager', 'CMLogItem', 'CMMagnetometerData', 'CMMotionActivity', 'CMMotionActivityManager', 'CMMotionManager', 'CMMovementDisorderManager', 'CMPedometer', 'CMPedometerData', 'CMPedometerEvent', 'CMRecordedAccelerometerData', 'CMRecordedRotationRateData', 'CMRotationRateData', 'CMSensorDataList', 'CMSensorRecorder', 'CMStepCounter', 'CMTremorResult', 'CNChangeHistoryAddContactEvent', 'CNChangeHistoryAddGroupEvent', 'CNChangeHistoryAddMemberToGroupEvent', 'CNChangeHistoryAddSubgroupToGroupEvent', 'CNChangeHistoryDeleteContactEvent', 'CNChangeHistoryDeleteGroupEvent', 'CNChangeHistoryDropEverythingEvent', 'CNChangeHistoryEvent', 'CNChangeHistoryFetchRequest', 'CNChangeHistoryRemoveMemberFromGroupEvent', 'CNChangeHistoryRemoveSubgroupFromGroupEvent', 'CNChangeHistoryUpdateContactEvent', 'CNChangeHistoryUpdateGroupEvent', 'CNContact', 'CNContactFetchRequest', 'CNContactFormatter', 'CNContactPickerViewController', 'CNContactProperty', 'CNContactRelation', 'CNContactStore', 'CNContactVCardSerialization', 'CNContactViewController', 'CNContactsUserDefaults', 'CNContainer', 'CNFetchRequest', 'CNFetchResult', 'CNGroup', 'CNInstantMessageAddress', 'CNLabeledValue', 'CNMutableContact', 'CNMutableGroup', 'CNMutablePostalAddress', 'CNPhoneNumber', 'CNPostalAddress', 'CNPostalAddressFormatter', 'CNSaveRequest', 'CNSocialProfile', 'CPActionSheetTemplate', 'CPAlertAction', 'CPAlertTemplate', 'CPBarButton', 'CPButton', 'CPContact', 'CPContactCallButton', 'CPContactDirectionsButton', 'CPContactMessageButton', 'CPContactTemplate', 'CPDashboardButton', 'CPDashboardController', 'CPGridButton', 'CPGridTemplate', 'CPImageSet', 'CPInformationItem', 'CPInformationRatingItem', 'CPInformationTemplate', 'CPInterfaceController', 'CPListImageRowItem', 'CPListItem', 'CPListSection', 'CPListTemplate', 'CPManeuver', 'CPMapButton', 'CPMapTemplate', 'CPMessageComposeBarButton', 'CPMessageListItem', 'CPMessageListItemLeadingConfiguration', 'CPMessageListItemTrailingConfiguration', 'CPNavigationAlert', 'CPNavigationSession', 'CPNowPlayingAddToLibraryButton', 'CPNowPlayingButton', 'CPNowPlayingImageButton', 'CPNowPlayingMoreButton', 'CPNowPlayingPlaybackRateButton', 'CPNowPlayingRepeatButton', 'CPNowPlayingShuffleButton', 'CPNowPlayingTemplate', 'CPPointOfInterest', 'CPPointOfInterestTemplate', 'CPRouteChoice', 'CPSearchTemplate', 'CPSessionConfiguration', 'CPTabBarTemplate', 'CPTemplate', 'CPTemplateApplicationDashboardScene', 'CPTemplateApplicationScene', 'CPTextButton', 'CPTravelEstimates', 'CPTrip', 'CPTripPreviewTextConfiguration', 'CPVoiceControlState', 'CPVoiceControlTemplate', 'CPWindow', 'CSCustomAttributeKey', 'CSIndexExtensionRequestHandler', 'CSLocalizedString', 'CSPerson', 'CSSearchQuery', 'CSSearchableIndex', 'CSSearchableItem', 'CSSearchableItemAttributeSet', 'CTCall', 'CTCallCenter', 'CTCarrier', 'CTCellularData', 'CTCellularPlanProvisioning', 'CTCellularPlanProvisioningRequest', 'CTSubscriber', 'CTSubscriberInfo', 'CTTelephonyNetworkInfo', 'CXAction', 'CXAnswerCallAction', 'CXCall', 'CXCallAction', 'CXCallController', 'CXCallDirectoryExtensionContext', 'CXCallDirectoryManager', 'CXCallDirectoryProvider', 'CXCallObserver', 'CXCallUpdate', 'CXEndCallAction', 'CXHandle', 'CXPlayDTMFCallAction', 'CXProvider', 'CXProviderConfiguration', 'CXSetGroupCallAction', 'CXSetHeldCallAction', 'CXSetMutedCallAction', 'CXStartCallAction', 'CXTransaction', 'DCAppAttestService', 'DCDevice', 'EAAccessory', 'EAAccessoryManager', 'EAGLContext', 'EAGLSharegroup', 'EASession', 'EAWiFiUnconfiguredAccessory', 'EAWiFiUnconfiguredAccessoryBrowser', 'EKAlarm', 'EKCalendar', 'EKCalendarChooser', 'EKCalendarItem', 'EKEvent', 'EKEventEditViewController', 'EKEventStore', 'EKEventViewController', 'EKObject', 'EKParticipant', 'EKRecurrenceDayOfWeek', 'EKRecurrenceEnd', 'EKRecurrenceRule', 'EKReminder', 'EKSource', 'EKStructuredLocation', 'ENExposureConfiguration', 'ENExposureDaySummary', 'ENExposureDetectionSummary', 'ENExposureInfo', 'ENExposureSummaryItem', 'ENExposureWindow', 'ENManager', 'ENScanInstance', 'ENTemporaryExposureKey', 'EntityRotationGestureRecognizer', 'EntityScaleGestureRecognizer', 'EntityTranslationGestureRecognizer', 'FPUIActionExtensionContext', 'FPUIActionExtensionViewController', 'GCColor', 'GCController', 'GCControllerAxisInput', 'GCControllerButtonInput', 'GCControllerDirectionPad', 'GCControllerElement', 'GCControllerTouchpad', 'GCDeviceBattery', 'GCDeviceCursor', 'GCDeviceHaptics', 'GCDeviceLight', 'GCDirectionalGamepad', 'GCDualShockGamepad', 'GCEventViewController', 'GCExtendedGamepad', 'GCExtendedGamepadSnapshot', 'GCGamepad', 'GCGamepadSnapshot', 'GCKeyboard', 'GCKeyboardInput', 'GCMicroGamepad', 'GCMicroGamepadSnapshot', 'GCMotion', 'GCMouse', 'GCMouseInput', 'GCPhysicalInputProfile', 'GCXboxGamepad', 'GKARC4RandomSource', 'GKAccessPoint', 'GKAchievement', 'GKAchievementChallenge', 'GKAchievementDescription', 'GKAchievementViewController', 'GKAgent', 'GKAgent2D', 'GKAgent3D', 'GKBasePlayer', 'GKBehavior', 'GKBillowNoiseSource', 'GKChallenge', 'GKChallengeEventHandler', 'GKCheckerboardNoiseSource', 'GKCircleObstacle', 'GKCloudPlayer', 'GKCoherentNoiseSource', 'GKComponent', 'GKComponentSystem', 'GKCompositeBehavior', 'GKConstantNoiseSource', 'GKCylindersNoiseSource', 'GKDecisionNode', 'GKDecisionTree', 'GKEntity', 'GKFriendRequestComposeViewController', 'GKGameCenterViewController', 'GKGameSession', 'GKGameSessionSharingViewController', 'GKGaussianDistribution', 'GKGoal', 'GKGraph', 'GKGraphNode', 'GKGraphNode2D', 'GKGraphNode3D', 'GKGridGraph', 'GKGridGraphNode', 'GKInvite', 'GKLeaderboard', 'GKLeaderboardEntry', 'GKLeaderboardScore', 'GKLeaderboardSet', 'GKLeaderboardViewController', 'GKLinearCongruentialRandomSource', 'GKLocalPlayer', 'GKMatch', 'GKMatchRequest', 'GKMatchmaker', 'GKMatchmakerViewController', 'GKMersenneTwisterRandomSource', 'GKMeshGraph', 'GKMinmaxStrategist', 'GKMonteCarloStrategist', 'GKNSPredicateRule', 'GKNoise', 'GKNoiseMap', 'GKNoiseSource', 'GKNotificationBanner', 'GKObstacle', 'GKObstacleGraph', 'GKOctree', 'GKOctreeNode', 'GKPath', 'GKPeerPickerController', 'GKPerlinNoiseSource', 'GKPlayer', 'GKPolygonObstacle', 'GKQuadtree', 'GKQuadtreeNode', 'GKRTree', 'GKRandomDistribution', 'GKRandomSource', 'GKRidgedNoiseSource', 'GKRule', 'GKRuleSystem', 'GKSCNNodeComponent', 'GKSKNodeComponent', 'GKSavedGame', 'GKScene', 'GKScore', 'GKScoreChallenge', 'GKSession', 'GKShuffledDistribution', 'GKSphereObstacle', 'GKSpheresNoiseSource', 'GKState', 'GKStateMachine', 'GKTurnBasedEventHandler', 'GKTurnBasedExchangeReply', 'GKTurnBasedMatch', 'GKTurnBasedMatchmakerViewController', 'GKTurnBasedParticipant', 'GKVoiceChat', 'GKVoiceChatService', 'GKVoronoiNoiseSource', 'GLKBaseEffect', 'GLKEffectProperty', 'GLKEffectPropertyFog', 'GLKEffectPropertyLight', 'GLKEffectPropertyMaterial', 'GLKEffectPropertyTexture', 'GLKEffectPropertyTransform', 'GLKMesh', 'GLKMeshBuffer', 'GLKMeshBufferAllocator', 'GLKReflectionMapEffect', 'GLKSkyboxEffect', 'GLKSubmesh', 'GLKTextureInfo', 'GLKTextureLoader', 'GLKView', 'GLKViewController', 'HKActivityMoveModeObject', 'HKActivityRingView', 'HKActivitySummary', 'HKActivitySummaryQuery', 'HKActivitySummaryType', 'HKAnchoredObjectQuery', 'HKAudiogramSample', 'HKAudiogramSampleType', 'HKAudiogramSensitivityPoint', 'HKBiologicalSexObject', 'HKBloodTypeObject', 'HKCDADocument', 'HKCDADocumentSample', 'HKCategorySample', 'HKCategoryType', 'HKCharacteristicType', 'HKClinicalRecord', 'HKClinicalType', 'HKCorrelation', 'HKCorrelationQuery', 'HKCorrelationType', 'HKCumulativeQuantitySample', 'HKCumulativeQuantitySeriesSample', 'HKDeletedObject', 'HKDevice', 'HKDiscreteQuantitySample', 'HKDocumentQuery', 'HKDocumentSample', 'HKDocumentType', 'HKElectrocardiogram', 'HKElectrocardiogramQuery', 'HKElectrocardiogramType', 'HKElectrocardiogramVoltageMeasurement', 'HKFHIRResource', 'HKFHIRVersion', 'HKFitzpatrickSkinTypeObject', 'HKHealthStore', 'HKHeartbeatSeriesBuilder', 'HKHeartbeatSeriesQuery', 'HKHeartbeatSeriesSample', 'HKLiveWorkoutBuilder', 'HKLiveWorkoutDataSource', 'HKObject', 'HKObjectType', 'HKObserverQuery', 'HKQuantity', 'HKQuantitySample', 'HKQuantitySeriesSampleBuilder', 'HKQuantitySeriesSampleQuery', 'HKQuantityType', 'HKQuery', 'HKQueryAnchor', 'HKSample', 'HKSampleQuery', 'HKSampleType', 'HKSeriesBuilder', 'HKSeriesSample', 'HKSeriesType', 'HKSource', 'HKSourceQuery', 'HKSourceRevision', 'HKStatistics', 'HKStatisticsCollection', 'HKStatisticsCollectionQuery', 'HKStatisticsQuery', 'HKUnit', 'HKWheelchairUseObject', 'HKWorkout', 'HKWorkoutBuilder', 'HKWorkoutConfiguration', 'HKWorkoutEvent', 'HKWorkoutRoute', 'HKWorkoutRouteBuilder', 'HKWorkoutRouteQuery', 'HKWorkoutSession', 'HKWorkoutType', 'HMAccessControl', 'HMAccessory', 'HMAccessoryBrowser', 'HMAccessoryCategory', 'HMAccessoryOwnershipToken', 'HMAccessoryProfile', 'HMAccessorySetupPayload', 'HMAction', 'HMActionSet', 'HMAddAccessoryRequest', 'HMCalendarEvent', 'HMCameraAudioControl', 'HMCameraControl', 'HMCameraProfile', 'HMCameraSettingsControl', 'HMCameraSnapshot', 'HMCameraSnapshotControl', 'HMCameraSource', 'HMCameraStream', 'HMCameraStreamControl', 'HMCameraView', 'HMCharacteristic', 'HMCharacteristicEvent', 'HMCharacteristicMetadata', 'HMCharacteristicThresholdRangeEvent', 'HMCharacteristicWriteAction', 'HMDurationEvent', 'HMEvent', 'HMEventTrigger', 'HMHome', 'HMHomeAccessControl', 'HMHomeManager', 'HMLocationEvent', 'HMMutableCalendarEvent', 'HMMutableCharacteristicEvent', 'HMMutableCharacteristicThresholdRangeEvent', 'HMMutableDurationEvent', 'HMMutableLocationEvent', 'HMMutablePresenceEvent', 'HMMutableSignificantTimeEvent', 'HMNetworkConfigurationProfile', 'HMNumberRange', 'HMPresenceEvent', 'HMRoom', 'HMService', 'HMServiceGroup', 'HMSignificantTimeEvent', 'HMTimeEvent', 'HMTimerTrigger', 'HMTrigger', 'HMUser', 'HMZone', 'ICCameraDevice', 'ICCameraFile', 'ICCameraFolder', 'ICCameraItem', 'ICDevice', 'ICDeviceBrowser', 'ICScannerBandData', 'ICScannerDevice', 'ICScannerFeature', 'ICScannerFeatureBoolean', 'ICScannerFeatureEnumeration', 'ICScannerFeatureRange', 'ICScannerFeatureTemplate', 'ICScannerFunctionalUnit', 'ICScannerFunctionalUnitDocumentFeeder', 'ICScannerFunctionalUnitFlatbed', 'ICScannerFunctionalUnitNegativeTransparency', 'ICScannerFunctionalUnitPositiveTransparency', 'ILCallClassificationRequest', 'ILCallCommunication', 'ILClassificationRequest', 'ILClassificationResponse', 'ILClassificationUIExtensionContext', 'ILClassificationUIExtensionViewController', 'ILCommunication', 'ILMessageClassificationRequest', 'ILMessageCommunication', 'ILMessageFilterExtension', 'ILMessageFilterExtensionContext', 'ILMessageFilterQueryRequest', 'ILMessageFilterQueryResponse', 'ILNetworkResponse', 'INAccountTypeResolutionResult', 'INActivateCarSignalIntent', 'INActivateCarSignalIntentResponse', 'INAddMediaIntent', 'INAddMediaIntentResponse', 'INAddMediaMediaDestinationResolutionResult', 'INAddMediaMediaItemResolutionResult', 'INAddTasksIntent', 'INAddTasksIntentResponse', 'INAddTasksTargetTaskListResolutionResult', 'INAddTasksTemporalEventTriggerResolutionResult', 'INAirline', 'INAirport', 'INAirportGate', 'INAppendToNoteIntent', 'INAppendToNoteIntentResponse', 'INBalanceAmount', 'INBalanceTypeResolutionResult', 'INBillDetails', 'INBillPayee', 'INBillPayeeResolutionResult', 'INBillTypeResolutionResult', 'INBoatReservation', 'INBoatTrip', 'INBookRestaurantReservationIntent', 'INBookRestaurantReservationIntentResponse', 'INBooleanResolutionResult', 'INBusReservation', 'INBusTrip', 'INCallCapabilityResolutionResult', 'INCallDestinationTypeResolutionResult', 'INCallRecord', 'INCallRecordFilter', 'INCallRecordResolutionResult', 'INCallRecordTypeOptionsResolutionResult', 'INCallRecordTypeResolutionResult', 'INCancelRideIntent', 'INCancelRideIntentResponse', 'INCancelWorkoutIntent', 'INCancelWorkoutIntentResponse', 'INCar', 'INCarAirCirculationModeResolutionResult', 'INCarAudioSourceResolutionResult', 'INCarDefrosterResolutionResult', 'INCarHeadUnit', 'INCarSeatResolutionResult', 'INCarSignalOptionsResolutionResult', 'INCreateNoteIntent', 'INCreateNoteIntentResponse', 'INCreateTaskListIntent', 'INCreateTaskListIntentResponse', 'INCurrencyAmount', 'INCurrencyAmountResolutionResult', 'INDailyRoutineRelevanceProvider', 'INDateComponentsRange', 'INDateComponentsRangeResolutionResult', 'INDateComponentsResolutionResult', 'INDateRelevanceProvider', 'INDateSearchTypeResolutionResult', 'INDefaultCardTemplate', 'INDeleteTasksIntent', 'INDeleteTasksIntentResponse', 'INDeleteTasksTaskListResolutionResult', 'INDeleteTasksTaskResolutionResult', 'INDoubleResolutionResult', 'INEndWorkoutIntent', 'INEndWorkoutIntentResponse', 'INEnergyResolutionResult', 'INEnumResolutionResult', 'INExtension', 'INFile', 'INFileResolutionResult', 'INFlight', 'INFlightReservation', 'INGetAvailableRestaurantReservationBookingDefaultsIntent', 'INGetAvailableRestaurantReservationBookingDefaultsIntentResponse', 'INGetAvailableRestaurantReservationBookingsIntent', 'INGetAvailableRestaurantReservationBookingsIntentResponse', 'INGetCarLockStatusIntent', 'INGetCarLockStatusIntentResponse', 'INGetCarPowerLevelStatusIntent', 'INGetCarPowerLevelStatusIntentResponse', 'INGetReservationDetailsIntent', 'INGetReservationDetailsIntentResponse', 'INGetRestaurantGuestIntent', 'INGetRestaurantGuestIntentResponse', 'INGetRideStatusIntent', 'INGetRideStatusIntentResponse', 'INGetUserCurrentRestaurantReservationBookingsIntent', 'INGetUserCurrentRestaurantReservationBookingsIntentResponse', 'INGetVisualCodeIntent', 'INGetVisualCodeIntentResponse', 'INImage', 'INImageNoteContent', 'INIntegerResolutionResult', 'INIntent', 'INIntentResolutionResult', 'INIntentResponse', 'INInteraction', 'INLengthResolutionResult', 'INListCarsIntent', 'INListCarsIntentResponse', 'INListRideOptionsIntent', 'INListRideOptionsIntentResponse', 'INLocationRelevanceProvider', 'INLocationSearchTypeResolutionResult', 'INLodgingReservation', 'INMassResolutionResult', 'INMediaAffinityTypeResolutionResult', 'INMediaDestination', 'INMediaDestinationResolutionResult', 'INMediaItem', 'INMediaItemResolutionResult', 'INMediaSearch', 'INMediaUserContext', 'INMessage', 'INMessageAttributeOptionsResolutionResult', 'INMessageAttributeResolutionResult', 'INNote', 'INNoteContent', 'INNoteContentResolutionResult', 'INNoteContentTypeResolutionResult', 'INNoteResolutionResult', 'INNotebookItemTypeResolutionResult', 'INObject', 'INObjectCollection', 'INObjectResolutionResult', 'INObjectSection', 'INOutgoingMessageTypeResolutionResult', 'INParameter', 'INPauseWorkoutIntent', 'INPauseWorkoutIntentResponse', 'INPayBillIntent', 'INPayBillIntentResponse', 'INPaymentAccount', 'INPaymentAccountResolutionResult', 'INPaymentAmount', 'INPaymentAmountResolutionResult', 'INPaymentMethod', 'INPaymentMethodResolutionResult', 'INPaymentRecord', 'INPaymentStatusResolutionResult', 'INPerson', 'INPersonHandle', 'INPersonResolutionResult', 'INPlacemarkResolutionResult', 'INPlayMediaIntent', 'INPlayMediaIntentResponse', 'INPlayMediaMediaItemResolutionResult', 'INPlayMediaPlaybackSpeedResolutionResult', 'INPlaybackQueueLocationResolutionResult', 'INPlaybackRepeatModeResolutionResult', 'INPreferences', 'INPriceRange', 'INRadioTypeResolutionResult', 'INRecurrenceRule', 'INRelativeReferenceResolutionResult', 'INRelativeSettingResolutionResult', 'INRelevanceProvider', 'INRelevantShortcut', 'INRelevantShortcutStore', 'INRentalCar', 'INRentalCarReservation', 'INRequestPaymentCurrencyAmountResolutionResult', 'INRequestPaymentIntent', 'INRequestPaymentIntentResponse', 'INRequestPaymentPayerResolutionResult', 'INRequestRideIntent', 'INRequestRideIntentResponse', 'INReservation', 'INReservationAction', 'INRestaurant', 'INRestaurantGuest', 'INRestaurantGuestDisplayPreferences', 'INRestaurantGuestResolutionResult', 'INRestaurantOffer', 'INRestaurantReservation', 'INRestaurantReservationBooking', 'INRestaurantReservationUserBooking', 'INRestaurantResolutionResult', 'INResumeWorkoutIntent', 'INResumeWorkoutIntentResponse', 'INRideCompletionStatus', 'INRideDriver', 'INRideFareLineItem', 'INRideOption', 'INRidePartySizeOption', 'INRideStatus', 'INRideVehicle', 'INSaveProfileInCarIntent', 'INSaveProfileInCarIntentResponse', 'INSearchCallHistoryIntent', 'INSearchCallHistoryIntentResponse', 'INSearchForAccountsIntent', 'INSearchForAccountsIntentResponse', 'INSearchForBillsIntent', 'INSearchForBillsIntentResponse', 'INSearchForMediaIntent', 'INSearchForMediaIntentResponse', 'INSearchForMediaMediaItemResolutionResult', 'INSearchForMessagesIntent', 'INSearchForMessagesIntentResponse', 'INSearchForNotebookItemsIntent', 'INSearchForNotebookItemsIntentResponse', 'INSearchForPhotosIntent', 'INSearchForPhotosIntentResponse', 'INSeat', 'INSendMessageAttachment', 'INSendMessageIntent', 'INSendMessageIntentResponse', 'INSendMessageRecipientResolutionResult', 'INSendPaymentCurrencyAmountResolutionResult', 'INSendPaymentIntent', 'INSendPaymentIntentResponse', 'INSendPaymentPayeeResolutionResult', 'INSendRideFeedbackIntent', 'INSendRideFeedbackIntentResponse', 'INSetAudioSourceInCarIntent', 'INSetAudioSourceInCarIntentResponse', 'INSetCarLockStatusIntent', 'INSetCarLockStatusIntentResponse', 'INSetClimateSettingsInCarIntent', 'INSetClimateSettingsInCarIntentResponse', 'INSetDefrosterSettingsInCarIntent', 'INSetDefrosterSettingsInCarIntentResponse', 'INSetMessageAttributeIntent', 'INSetMessageAttributeIntentResponse', 'INSetProfileInCarIntent', 'INSetProfileInCarIntentResponse', 'INSetRadioStationIntent', 'INSetRadioStationIntentResponse', 'INSetSeatSettingsInCarIntent', 'INSetSeatSettingsInCarIntentResponse', 'INSetTaskAttributeIntent', 'INSetTaskAttributeIntentResponse', 'INSetTaskAttributeTemporalEventTriggerResolutionResult', 'INShortcut', 'INSnoozeTasksIntent', 'INSnoozeTasksIntentResponse', 'INSnoozeTasksTaskResolutionResult', 'INSpatialEventTrigger', 'INSpatialEventTriggerResolutionResult', 'INSpeakableString', 'INSpeakableStringResolutionResult', 'INSpeedResolutionResult', 'INStartAudioCallIntent', 'INStartAudioCallIntentResponse', 'INStartCallCallCapabilityResolutionResult', 'INStartCallCallRecordToCallBackResolutionResult', 'INStartCallContactResolutionResult', 'INStartCallIntent', 'INStartCallIntentResponse', 'INStartPhotoPlaybackIntent', 'INStartPhotoPlaybackIntentResponse', 'INStartVideoCallIntent', 'INStartVideoCallIntentResponse', 'INStartWorkoutIntent', 'INStartWorkoutIntentResponse', 'INStringResolutionResult', 'INTask', 'INTaskList', 'INTaskListResolutionResult', 'INTaskPriorityResolutionResult', 'INTaskResolutionResult', 'INTaskStatusResolutionResult', 'INTemperatureResolutionResult', 'INTemporalEventTrigger', 'INTemporalEventTriggerResolutionResult', 'INTemporalEventTriggerTypeOptionsResolutionResult', 'INTermsAndConditions', 'INTextNoteContent', 'INTicketedEvent', 'INTicketedEventReservation', 'INTimeIntervalResolutionResult', 'INTrainReservation', 'INTrainTrip', 'INTransferMoneyIntent', 'INTransferMoneyIntentResponse', 'INUIAddVoiceShortcutButton', 'INUIAddVoiceShortcutViewController', 'INUIEditVoiceShortcutViewController', 'INURLResolutionResult', 'INUpcomingMediaManager', 'INUpdateMediaAffinityIntent', 'INUpdateMediaAffinityIntentResponse', 'INUpdateMediaAffinityMediaItemResolutionResult', 'INUserContext', 'INVisualCodeTypeResolutionResult', 'INVocabulary', 'INVoiceShortcut', 'INVoiceShortcutCenter', 'INVolumeResolutionResult', 'INWorkoutGoalUnitTypeResolutionResult', 'INWorkoutLocationTypeResolutionResult', 'IOSurface', 'JSContext', 'JSManagedValue', 'JSValue', 'JSVirtualMachine', 'LAContext', 'LPLinkMetadata', 'LPLinkView', 'LPMetadataProvider', 'MCAdvertiserAssistant', 'MCBrowserViewController', 'MCNearbyServiceAdvertiser', 'MCNearbyServiceBrowser', 'MCPeerID', 'MCSession', 'MDLAnimatedMatrix4x4', 'MDLAnimatedQuaternion', 'MDLAnimatedQuaternionArray', 'MDLAnimatedScalar', 'MDLAnimatedScalarArray', 'MDLAnimatedValue', 'MDLAnimatedVector2', 'MDLAnimatedVector3', 'MDLAnimatedVector3Array', 'MDLAnimatedVector4', 'MDLAnimationBindComponent', 'MDLAreaLight', 'MDLAsset', 'MDLBundleAssetResolver', 'MDLCamera', 'MDLCheckerboardTexture', 'MDLColorSwatchTexture', 'MDLLight', 'MDLLightProbe', 'MDLMaterial', 'MDLMaterialProperty', 'MDLMaterialPropertyConnection', 'MDLMaterialPropertyGraph', 'MDLMaterialPropertyNode', 'MDLMatrix4x4Array', 'MDLMesh', 'MDLMeshBufferData', 'MDLMeshBufferDataAllocator', 'MDLMeshBufferMap', 'MDLMeshBufferZoneDefault', 'MDLNoiseTexture', 'MDLNormalMapTexture', 'MDLObject', 'MDLObjectContainer', 'MDLPackedJointAnimation', 'MDLPathAssetResolver', 'MDLPhotometricLight', 'MDLPhysicallyPlausibleLight', 'MDLPhysicallyPlausibleScatteringFunction', 'MDLRelativeAssetResolver', 'MDLScatteringFunction', 'MDLSkeleton', 'MDLSkyCubeTexture', 'MDLStereoscopicCamera', 'MDLSubmesh', 'MDLSubmeshTopology', 'MDLTexture', 'MDLTextureFilter', 'MDLTextureSampler', 'MDLTransform', 'MDLTransformMatrixOp', 'MDLTransformOrientOp', 'MDLTransformRotateOp', 'MDLTransformRotateXOp', 'MDLTransformRotateYOp', 'MDLTransformRotateZOp', 'MDLTransformScaleOp', 'MDLTransformStack', 'MDLTransformTranslateOp', 'MDLURLTexture', 'MDLVertexAttribute', 'MDLVertexAttributeData', 'MDLVertexBufferLayout', 'MDLVertexDescriptor', 'MDLVoxelArray', 'MFMailComposeViewController', 'MFMessageComposeViewController', 'MIDICIDeviceInfo', 'MIDICIDiscoveredNode', 'MIDICIDiscoveryManager', 'MIDICIProfile', 'MIDICIProfileState', 'MIDICIResponder', 'MIDICISession', 'MIDINetworkConnection', 'MIDINetworkHost', 'MIDINetworkSession', 'MKAnnotationView', 'MKCircle', 'MKCircleRenderer', 'MKCircleView', 'MKClusterAnnotation', 'MKCompassButton', 'MKDirections', 'MKDirectionsRequest', 'MKDirectionsResponse', 'MKDistanceFormatter', 'MKETAResponse', 'MKGeoJSONDecoder', 'MKGeoJSONFeature', 'MKGeodesicPolyline', 'MKGradientPolylineRenderer', 'MKLocalPointsOfInterestRequest', 'MKLocalSearch', 'MKLocalSearchCompleter', 'MKLocalSearchCompletion', 'MKLocalSearchRequest', 'MKLocalSearchResponse', 'MKMapCamera', 'MKMapCameraBoundary', 'MKMapCameraZoomRange', 'MKMapItem', 'MKMapSnapshot', 'MKMapSnapshotOptions', 'MKMapSnapshotter', 'MKMapView', 'MKMarkerAnnotationView', 'MKMultiPoint', 'MKMultiPolygon', 'MKMultiPolygonRenderer', 'MKMultiPolyline', 'MKMultiPolylineRenderer', 'MKOverlayPathRenderer', 'MKOverlayPathView', 'MKOverlayRenderer', 'MKOverlayView', 'MKPinAnnotationView', 'MKPitchControl', 'MKPlacemark', 'MKPointAnnotation', 'MKPointOfInterestFilter', 'MKPolygon', 'MKPolygonRenderer', 'MKPolygonView', 'MKPolyline', 'MKPolylineRenderer', 'MKPolylineView', 'MKReverseGeocoder', 'MKRoute', 'MKRouteStep', 'MKScaleView', 'MKShape', 'MKTileOverlay', 'MKTileOverlayRenderer', 'MKUserLocation', 'MKUserLocationView', 'MKUserTrackingBarButtonItem', 'MKUserTrackingButton', 'MKZoomControl', 'MLArrayBatchProvider', 'MLCActivationDescriptor', 'MLCActivationLayer', 'MLCArithmeticLayer', 'MLCBatchNormalizationLayer', 'MLCConcatenationLayer', 'MLCConvolutionDescriptor', 'MLCConvolutionLayer', 'MLCDevice', 'MLCDropoutLayer', 'MLCEmbeddingDescriptor', 'MLCEmbeddingLayer', 'MLCFullyConnectedLayer', 'MLCGramMatrixLayer', 'MLCGraph', 'MLCGroupNormalizationLayer', 'MLCInferenceGraph', 'MLCInstanceNormalizationLayer', 'MLCLSTMDescriptor', 'MLCLSTMLayer', 'MLCLayer', 'MLCLayerNormalizationLayer', 'MLCLossDescriptor', 'MLCLossLayer', 'MLCMatMulDescriptor', 'MLCMatMulLayer', 'MLCMultiheadAttentionDescriptor', 'MLCMultiheadAttentionLayer', 'MLCPaddingLayer', 'MLCPoolingDescriptor', 'MLCPoolingLayer', 'MLCReductionLayer', 'MLCReshapeLayer', 'MLCSliceLayer', 'MLCSoftmaxLayer', 'MLCSplitLayer', 'MLCTensor', 'MLCTensorData', 'MLCTensorDescriptor', 'MLCTensorOptimizerDeviceData', 'MLCTensorParameter', 'MLCTrainingGraph', 'MLCTransposeLayer', 'MLCUpsampleLayer', 'MLCYOLOLossDescriptor', 'MLCYOLOLossLayer', 'MLDictionaryConstraint', 'MLDictionaryFeatureProvider', 'MLFeatureDescription', 'MLFeatureValue', 'MLImageConstraint', 'MLImageSize', 'MLImageSizeConstraint', 'MLKey', 'MLMetricKey', 'MLModel', 'MLModelCollection', 'MLModelCollectionEntry', 'MLModelConfiguration', 'MLModelDescription', 'MLMultiArray', 'MLMultiArrayConstraint', 'MLMultiArrayShapeConstraint', 'MLNumericConstraint', 'MLParameterDescription', 'MLParameterKey', 'MLPredictionOptions', 'MLSequence', 'MLSequenceConstraint', 'MLTask', 'MLUpdateContext', 'MLUpdateProgressHandlers', 'MLUpdateTask', 'MPChangeLanguageOptionCommandEvent', 'MPChangePlaybackPositionCommand', 'MPChangePlaybackPositionCommandEvent', 'MPChangePlaybackRateCommand', 'MPChangePlaybackRateCommandEvent', 'MPChangeRepeatModeCommand', 'MPChangeRepeatModeCommandEvent', 'MPChangeShuffleModeCommand', 'MPChangeShuffleModeCommandEvent', 'MPContentItem', 'MPFeedbackCommand', 'MPFeedbackCommandEvent', 'MPMediaEntity', 'MPMediaItem', 'MPMediaItemArtwork', 'MPMediaItemCollection', 'MPMediaLibrary', 'MPMediaPickerController', 'MPMediaPlaylist', 'MPMediaPlaylistCreationMetadata', 'MPMediaPredicate', 'MPMediaPropertyPredicate', 'MPMediaQuery', 'MPMediaQuerySection', 'MPMovieAccessLog', 'MPMovieAccessLogEvent', 'MPMovieErrorLog', 'MPMovieErrorLogEvent', 'MPMoviePlayerController', 'MPMoviePlayerViewController', 'MPMusicPlayerApplicationController', 'MPMusicPlayerController', 'MPMusicPlayerControllerMutableQueue', 'MPMusicPlayerControllerQueue', 'MPMusicPlayerMediaItemQueueDescriptor', 'MPMusicPlayerPlayParameters', 'MPMusicPlayerPlayParametersQueueDescriptor', 'MPMusicPlayerQueueDescriptor', 'MPMusicPlayerStoreQueueDescriptor', 'MPNowPlayingInfoCenter', 'MPNowPlayingInfoLanguageOption', 'MPNowPlayingInfoLanguageOptionGroup', 'MPNowPlayingSession', 'MPPlayableContentManager', 'MPPlayableContentManagerContext', 'MPRatingCommand', 'MPRatingCommandEvent', 'MPRemoteCommand', 'MPRemoteCommandCenter', 'MPRemoteCommandEvent', 'MPSGraph', 'MPSGraphConvolution2DOpDescriptor', 'MPSGraphDepthwiseConvolution2DOpDescriptor', 'MPSGraphDevice', 'MPSGraphExecutionDescriptor', 'MPSGraphOperation', 'MPSGraphPooling2DOpDescriptor', 'MPSGraphShapedType', 'MPSGraphTensor', 'MPSGraphTensorData', 'MPSGraphVariableOp', 'MPSeekCommandEvent', 'MPSkipIntervalCommand', 'MPSkipIntervalCommandEvent', 'MPTimedMetadata', 'MPVolumeView', 'MSConversation', 'MSMessage', 'MSMessageLayout', 'MSMessageLiveLayout', 'MSMessageTemplateLayout', 'MSMessagesAppViewController', 'MSServiceAccount', 'MSSession', 'MSSetupSession', 'MSSticker', 'MSStickerBrowserView', 'MSStickerBrowserViewController', 'MSStickerView', 'MTKMesh', 'MTKMeshBuffer', 'MTKMeshBufferAllocator', 'MTKSubmesh', 'MTKTextureLoader', 'MTKView', 'MTLAccelerationStructureBoundingBoxGeometryDescriptor', 'MTLAccelerationStructureDescriptor', 'MTLAccelerationStructureGeometryDescriptor', 'MTLAccelerationStructureTriangleGeometryDescriptor', 'MTLArgument', 'MTLArgumentDescriptor', 'MTLArrayType', 'MTLAttribute', 'MTLAttributeDescriptor', 'MTLAttributeDescriptorArray', 'MTLBinaryArchiveDescriptor', 'MTLBlitPassDescriptor', 'MTLBlitPassSampleBufferAttachmentDescriptor', 'MTLBlitPassSampleBufferAttachmentDescriptorArray', 'MTLBufferLayoutDescriptor', 'MTLBufferLayoutDescriptorArray', 'MTLCaptureDescriptor', 'MTLCaptureManager', 'MTLCommandBufferDescriptor', 'MTLCompileOptions', 'MTLComputePassDescriptor', 'MTLComputePassSampleBufferAttachmentDescriptor', 'MTLComputePassSampleBufferAttachmentDescriptorArray', 'MTLComputePipelineDescriptor', 'MTLComputePipelineReflection', 'MTLCounterSampleBufferDescriptor', 'MTLDepthStencilDescriptor', 'MTLFunctionConstant', 'MTLFunctionConstantValues', 'MTLFunctionDescriptor', 'MTLHeapDescriptor', 'MTLIndirectCommandBufferDescriptor', 'MTLInstanceAccelerationStructureDescriptor', 'MTLIntersectionFunctionDescriptor', 'MTLIntersectionFunctionTableDescriptor', 'MTLLinkedFunctions', 'MTLPipelineBufferDescriptor', 'MTLPipelineBufferDescriptorArray', 'MTLPointerType', 'MTLPrimitiveAccelerationStructureDescriptor', 'MTLRasterizationRateLayerArray', 'MTLRasterizationRateLayerDescriptor', 'MTLRasterizationRateMapDescriptor', 'MTLRasterizationRateSampleArray', 'MTLRenderPassAttachmentDescriptor', 'MTLRenderPassColorAttachmentDescriptor', 'MTLRenderPassColorAttachmentDescriptorArray', 'MTLRenderPassDepthAttachmentDescriptor', 'MTLRenderPassDescriptor', 'MTLRenderPassSampleBufferAttachmentDescriptor', 'MTLRenderPassSampleBufferAttachmentDescriptorArray', 'MTLRenderPassStencilAttachmentDescriptor', 'MTLRenderPipelineColorAttachmentDescriptor', 'MTLRenderPipelineColorAttachmentDescriptorArray', 'MTLRenderPipelineDescriptor', 'MTLRenderPipelineReflection', 'MTLResourceStatePassDescriptor', 'MTLResourceStatePassSampleBufferAttachmentDescriptor', 'MTLResourceStatePassSampleBufferAttachmentDescriptorArray', 'MTLSamplerDescriptor', 'MTLSharedEventHandle', 'MTLSharedEventListener', 'MTLSharedTextureHandle', 'MTLStageInputOutputDescriptor', 'MTLStencilDescriptor', 'MTLStructMember', 'MTLStructType', 'MTLTextureDescriptor', 'MTLTextureReferenceType', 'MTLTileRenderPipelineColorAttachmentDescriptor', 'MTLTileRenderPipelineColorAttachmentDescriptorArray', 'MTLTileRenderPipelineDescriptor', 'MTLType', 'MTLVertexAttribute', 'MTLVertexAttributeDescriptor', 'MTLVertexAttributeDescriptorArray', 'MTLVertexBufferLayoutDescriptor', 'MTLVertexBufferLayoutDescriptorArray', 'MTLVertexDescriptor', 'MTLVisibleFunctionTableDescriptor', 'MXAnimationMetric', 'MXAppExitMetric', 'MXAppLaunchMetric', 'MXAppResponsivenessMetric', 'MXAppRunTimeMetric', 'MXAverage', 'MXBackgroundExitData', 'MXCPUExceptionDiagnostic', 'MXCPUMetric', 'MXCallStackTree', 'MXCellularConditionMetric', 'MXCrashDiagnostic', 'MXDiagnostic', 'MXDiagnosticPayload', 'MXDiskIOMetric', 'MXDiskWriteExceptionDiagnostic', 'MXDisplayMetric', 'MXForegroundExitData', 'MXGPUMetric', 'MXHangDiagnostic', 'MXHistogram', 'MXHistogramBucket', 'MXLocationActivityMetric', 'MXMemoryMetric', 'MXMetaData', 'MXMetric', 'MXMetricManager', 'MXMetricPayload', 'MXNetworkTransferMetric', 'MXSignpostIntervalData', 'MXSignpostMetric', 'MXUnitAveragePixelLuminance', 'MXUnitSignalBars', 'MyClass', 'NCWidgetController', 'NEAppProxyFlow', 'NEAppProxyProvider', 'NEAppProxyProviderManager', 'NEAppProxyTCPFlow', 'NEAppProxyUDPFlow', 'NEAppPushManager', 'NEAppPushProvider', 'NEAppRule', 'NEDNSOverHTTPSSettings', 'NEDNSOverTLSSettings', 'NEDNSProxyManager', 'NEDNSProxyProvider', 'NEDNSProxyProviderProtocol', 'NEDNSSettings', 'NEDNSSettingsManager', 'NEEvaluateConnectionRule', 'NEFilterBrowserFlow', 'NEFilterControlProvider', 'NEFilterControlVerdict', 'NEFilterDataProvider', 'NEFilterDataVerdict', 'NEFilterFlow', 'NEFilterManager', 'NEFilterNewFlowVerdict', 'NEFilterPacketContext', 'NEFilterPacketProvider', 'NEFilterProvider', 'NEFilterProviderConfiguration', 'NEFilterRemediationVerdict', 'NEFilterReport', 'NEFilterRule', 'NEFilterSettings', 'NEFilterSocketFlow', 'NEFilterVerdict', 'NEFlowMetaData', 'NEHotspotConfiguration', 'NEHotspotConfigurationManager', 'NEHotspotEAPSettings', 'NEHotspotHS20Settings', 'NEHotspotHelper', 'NEHotspotHelperCommand', 'NEHotspotHelperResponse', 'NEHotspotNetwork', 'NEIPv4Route', 'NEIPv4Settings', 'NEIPv6Route', 'NEIPv6Settings', 'NENetworkRule', 'NEOnDemandRule', 'NEOnDemandRuleConnect', 'NEOnDemandRuleDisconnect', 'NEOnDemandRuleEvaluateConnection', 'NEOnDemandRuleIgnore', 'NEPacket', 'NEPacketTunnelFlow', 'NEPacketTunnelNetworkSettings', 'NEPacketTunnelProvider', 'NEProvider', 'NEProxyServer', 'NEProxySettings', 'NETransparentProxyManager', 'NETransparentProxyNetworkSettings', 'NETransparentProxyProvider', 'NETunnelNetworkSettings', 'NETunnelProvider', 'NETunnelProviderManager', 'NETunnelProviderProtocol', 'NETunnelProviderSession', 'NEVPNConnection', 'NEVPNIKEv2SecurityAssociationParameters', 'NEVPNManager', 'NEVPNProtocol', 'NEVPNProtocolIKEv2', 'NEVPNProtocolIPSec', 'NFCISO15693CustomCommandConfiguration', 'NFCISO15693ReadMultipleBlocksConfiguration', 'NFCISO15693ReaderSession', 'NFCISO7816APDU', 'NFCNDEFMessage', 'NFCNDEFPayload', 'NFCNDEFReaderSession', 'NFCReaderSession', 'NFCTagCommandConfiguration', 'NFCTagReaderSession', 'NFCVASCommandConfiguration', 'NFCVASReaderSession', 'NFCVASResponse', 'NIConfiguration', 'NIDiscoveryToken', 'NINearbyObject', 'NINearbyPeerConfiguration', 'NISession', 'NKAssetDownload', 'NKIssue', 'NKLibrary', 'NLEmbedding', 'NLGazetteer', 'NLLanguageRecognizer', 'NLModel', 'NLModelConfiguration', 'NLTagger', 'NLTokenizer', 'NSArray', 'NSAssertionHandler', 'NSAsynchronousFetchRequest', 'NSAsynchronousFetchResult', 'NSAtomicStore', 'NSAtomicStoreCacheNode', 'NSAttributeDescription', 'NSAttributedString', 'NSAutoreleasePool', 'NSBatchDeleteRequest', 'NSBatchDeleteResult', 'NSBatchInsertRequest', 'NSBatchInsertResult', 'NSBatchUpdateRequest', 'NSBatchUpdateResult', 'NSBlockOperation', 'NSBundle', 'NSBundleResourceRequest', 'NSByteCountFormatter', 'NSCache', 'NSCachedURLResponse', 'NSCalendar', 'NSCharacterSet', 'NSCoder', 'NSCollectionLayoutAnchor', 'NSCollectionLayoutBoundarySupplementaryItem', 'NSCollectionLayoutDecorationItem', 'NSCollectionLayoutDimension', 'NSCollectionLayoutEdgeSpacing', 'NSCollectionLayoutGroup', 'NSCollectionLayoutGroupCustomItem', 'NSCollectionLayoutItem', 'NSCollectionLayoutSection', 'NSCollectionLayoutSize', 'NSCollectionLayoutSpacing', 'NSCollectionLayoutSupplementaryItem', 'NSComparisonPredicate', 'NSCompoundPredicate', 'NSCondition', 'NSConditionLock', 'NSConstantString', 'NSConstraintConflict', 'NSCoreDataCoreSpotlightDelegate', 'NSCountedSet', 'NSData', 'NSDataAsset', 'NSDataDetector', 'NSDate', 'NSDateComponents', 'NSDateComponentsFormatter', 'NSDateFormatter', 'NSDateInterval', 'NSDateIntervalFormatter', 'NSDecimalNumber', 'NSDecimalNumberHandler', 'NSDerivedAttributeDescription', 'NSDictionary', 'NSDiffableDataSourceSectionSnapshot', 'NSDiffableDataSourceSectionTransaction', 'NSDiffableDataSourceSnapshot', 'NSDiffableDataSourceTransaction', 'NSDimension', 'NSDirectoryEnumerator', 'NSEnergyFormatter', 'NSEntityDescription', 'NSEntityMapping', 'NSEntityMigrationPolicy', 'NSEnumerator', 'NSError', 'NSEvent', 'NSException', 'NSExpression', 'NSExpressionDescription', 'NSExtensionContext', 'NSExtensionItem', 'NSFetchIndexDescription', 'NSFetchIndexElementDescription', 'NSFetchRequest', 'NSFetchRequestExpression', 'NSFetchedPropertyDescription', 'NSFetchedResultsController', 'NSFileAccessIntent', 'NSFileCoordinator', 'NSFileHandle', 'NSFileManager', 'NSFileProviderDomain', 'NSFileProviderExtension', 'NSFileProviderManager', 'NSFileProviderService', 'NSFileSecurity', 'NSFileVersion', 'NSFileWrapper', 'NSFormatter', 'NSHTTPCookie', 'NSHTTPCookieStorage', 'NSHTTPURLResponse', 'NSHashTable', 'NSISO8601DateFormatter', 'NSIncrementalStore', 'NSIncrementalStoreNode', 'NSIndexPath', 'NSIndexSet', 'NSInputStream', 'NSInvocation', 'NSInvocationOperation', 'NSItemProvider', 'NSJSONSerialization', 'NSKeyedArchiver', 'NSKeyedUnarchiver', 'NSLayoutAnchor', 'NSLayoutConstraint', 'NSLayoutDimension', 'NSLayoutManager', 'NSLayoutXAxisAnchor', 'NSLayoutYAxisAnchor', 'NSLengthFormatter', 'NSLinguisticTagger', 'NSListFormatter', 'NSLocale', 'NSLock', 'NSMachPort', 'NSManagedObject', 'NSManagedObjectContext', 'NSManagedObjectID', 'NSManagedObjectModel', 'NSMapTable', 'NSMappingModel', 'NSMassFormatter', 'NSMeasurement', 'NSMeasurementFormatter', 'NSMenuToolbarItem', 'NSMergeConflict', 'NSMergePolicy', 'NSMessagePort', 'NSMetadataItem', 'NSMetadataQuery', 'NSMetadataQueryAttributeValueTuple', 'NSMetadataQueryResultGroup', 'NSMethodSignature', 'NSMigrationManager', 'NSMutableArray', 'NSMutableAttributedString', 'NSMutableCharacterSet', 'NSMutableData', 'NSMutableDictionary', 'NSMutableIndexSet', 'NSMutableOrderedSet', 'NSMutableParagraphStyle', 'NSMutableSet', 'NSMutableString', 'NSMutableURLRequest', 'NSNetService', 'NSNetServiceBrowser', 'NSNotification', 'NSNotificationCenter', 'NSNotificationQueue', 'NSNull', 'NSNumber', 'NSNumberFormatter', 'NSObject', 'NSOperation', 'NSOperationQueue', 'NSOrderedCollectionChange', 'NSOrderedCollectionDifference', 'NSOrderedSet', 'NSOrthography', 'NSOutputStream', 'NSParagraphStyle', 'NSPersistentCloudKitContainer', 'NSPersistentCloudKitContainerEvent', 'NSPersistentCloudKitContainerEventRequest', 'NSPersistentCloudKitContainerEventResult', 'NSPersistentCloudKitContainerOptions', 'NSPersistentContainer', 'NSPersistentHistoryChange', 'NSPersistentHistoryChangeRequest', 'NSPersistentHistoryResult', 'NSPersistentHistoryToken', 'NSPersistentHistoryTransaction', 'NSPersistentStore', 'NSPersistentStoreAsynchronousResult', 'NSPersistentStoreCoordinator', 'NSPersistentStoreDescription', 'NSPersistentStoreRequest', 'NSPersistentStoreResult', 'NSPersonNameComponents', 'NSPersonNameComponentsFormatter', 'NSPipe', 'NSPointerArray', 'NSPointerFunctions', 'NSPort', 'NSPredicate', 'NSProcessInfo', 'NSProgress', 'NSPropertyDescription', 'NSPropertyListSerialization', 'NSPropertyMapping', 'NSProxy', 'NSPurgeableData', 'NSQueryGenerationToken', 'NSRecursiveLock', 'NSRegularExpression', 'NSRelationshipDescription', 'NSRelativeDateTimeFormatter', 'NSRunLoop', 'NSSaveChangesRequest', 'NSScanner', 'NSSecureUnarchiveFromDataTransformer', 'NSSet', 'NSShadow', 'NSSharingServicePickerToolbarItem', 'NSSharingServicePickerTouchBarItem', 'NSSimpleCString', 'NSSocketPort', 'NSSortDescriptor', 'NSStream', 'NSString', 'NSStringDrawingContext', 'NSTextAttachment', 'NSTextCheckingResult', 'NSTextContainer', 'NSTextStorage', 'NSTextTab', 'NSThread', 'NSTimeZone', 'NSTimer', 'NSToolbarItem', 'NSURL', 'NSURLAuthenticationChallenge', 'NSURLCache', 'NSURLComponents', 'NSURLConnection', 'NSURLCredential', 'NSURLCredentialStorage', 'NSURLProtectionSpace', 'NSURLProtocol', 'NSURLQueryItem', 'NSURLRequest', 'NSURLResponse', 'NSURLSession', 'NSURLSessionConfiguration', 'NSURLSessionDataTask', 'NSURLSessionDownloadTask', 'NSURLSessionStreamTask', 'NSURLSessionTask', 'NSURLSessionTaskMetrics', 'NSURLSessionTaskTransactionMetrics', 'NSURLSessionUploadTask', 'NSURLSessionWebSocketMessage', 'NSURLSessionWebSocketTask', 'NSUUID', 'NSUbiquitousKeyValueStore', 'NSUndoManager', 'NSUnit', 'NSUnitAcceleration', 'NSUnitAngle', 'NSUnitArea', 'NSUnitConcentrationMass', 'NSUnitConverter', 'NSUnitConverterLinear', 'NSUnitDispersion', 'NSUnitDuration', 'NSUnitElectricCharge', 'NSUnitElectricCurrent', 'NSUnitElectricPotentialDifference', 'NSUnitElectricResistance', 'NSUnitEnergy', 'NSUnitFrequency', 'NSUnitFuelEfficiency', 'NSUnitIlluminance', 'NSUnitInformationStorage', 'NSUnitLength', 'NSUnitMass', 'NSUnitPower', 'NSUnitPressure', 'NSUnitSpeed', 'NSUnitTemperature', 'NSUnitVolume', 'NSUserActivity', 'NSUserDefaults', 'NSValue', 'NSValueTransformer', 'NSXMLParser', 'NSXPCCoder', 'NSXPCConnection', 'NSXPCInterface', 'NSXPCListener', 'NSXPCListenerEndpoint', 'NWBonjourServiceEndpoint', 'NWEndpoint', 'NWHostEndpoint', 'NWPath', 'NWTCPConnection', 'NWTLSParameters', 'NWUDPSession', 'OSLogEntry', 'OSLogEntryActivity', 'OSLogEntryBoundary', 'OSLogEntryLog', 'OSLogEntrySignpost', 'OSLogEnumerator', 'OSLogMessageComponent', 'OSLogPosition', 'OSLogStore', 'PDFAction', 'PDFActionGoTo', 'PDFActionNamed', 'PDFActionRemoteGoTo', 'PDFActionResetForm', 'PDFActionURL', 'PDFAnnotation', 'PDFAppearanceCharacteristics', 'PDFBorder', 'PDFDestination', 'PDFDocument', 'PDFOutline', 'PDFPage', 'PDFSelection', 'PDFThumbnailView', 'PDFView', 'PHAdjustmentData', 'PHAsset', 'PHAssetChangeRequest', 'PHAssetCollection', 'PHAssetCollectionChangeRequest', 'PHAssetCreationRequest', 'PHAssetResource', 'PHAssetResourceCreationOptions', 'PHAssetResourceManager', 'PHAssetResourceRequestOptions', 'PHCachingImageManager', 'PHChange', 'PHChangeRequest', 'PHCloudIdentifier', 'PHCollection', 'PHCollectionList', 'PHCollectionListChangeRequest', 'PHContentEditingInput', 'PHContentEditingInputRequestOptions', 'PHContentEditingOutput', 'PHEditingExtensionContext', 'PHFetchOptions', 'PHFetchResult', 'PHFetchResultChangeDetails', 'PHImageManager', 'PHImageRequestOptions', 'PHLivePhoto', 'PHLivePhotoEditingContext', 'PHLivePhotoRequestOptions', 'PHLivePhotoView', 'PHObject', 'PHObjectChangeDetails', 'PHObjectPlaceholder', 'PHPhotoLibrary', 'PHPickerConfiguration', 'PHPickerFilter', 'PHPickerResult', 'PHPickerViewController', 'PHProject', 'PHProjectChangeRequest', 'PHVideoRequestOptions', 'PKAddCarKeyPassConfiguration', 'PKAddPassButton', 'PKAddPassesViewController', 'PKAddPaymentPassRequest', 'PKAddPaymentPassRequestConfiguration', 'PKAddPaymentPassViewController', 'PKAddSecureElementPassConfiguration', 'PKAddSecureElementPassViewController', 'PKAddShareablePassConfiguration', 'PKBarcodeEventConfigurationRequest', 'PKBarcodeEventMetadataRequest', 'PKBarcodeEventMetadataResponse', 'PKBarcodeEventSignatureRequest', 'PKBarcodeEventSignatureResponse', 'PKCanvasView', 'PKContact', 'PKDisbursementAuthorizationController', 'PKDisbursementRequest', 'PKDisbursementVoucher', 'PKDrawing', 'PKEraserTool', 'PKFloatRange', 'PKInk', 'PKInkingTool', 'PKIssuerProvisioningExtensionHandler', 'PKIssuerProvisioningExtensionPassEntry', 'PKIssuerProvisioningExtensionPaymentPassEntry', 'PKIssuerProvisioningExtensionStatus', 'PKLabeledValue', 'PKLassoTool', 'PKObject', 'PKPass', 'PKPassLibrary', 'PKPayment', 'PKPaymentAuthorizationController', 'PKPaymentAuthorizationResult', 'PKPaymentAuthorizationViewController', 'PKPaymentButton', 'PKPaymentInformationEventExtension', 'PKPaymentMerchantSession', 'PKPaymentMethod', 'PKPaymentPass', 'PKPaymentRequest', 'PKPaymentRequestMerchantSessionUpdate', 'PKPaymentRequestPaymentMethodUpdate', 'PKPaymentRequestShippingContactUpdate', 'PKPaymentRequestShippingMethodUpdate', 'PKPaymentRequestUpdate', 'PKPaymentSummaryItem', 'PKPaymentToken', 'PKPushCredentials', 'PKPushPayload', 'PKPushRegistry', 'PKSecureElementPass', 'PKShareablePassMetadata', 'PKShippingMethod', 'PKStroke', 'PKStrokePath', 'PKStrokePoint', 'PKSuicaPassProperties', 'PKTool', 'PKToolPicker', 'PKTransitPassProperties', 'QLFileThumbnailRequest', 'QLPreviewController', 'QLThumbnailGenerationRequest', 'QLThumbnailGenerator', 'QLThumbnailProvider', 'QLThumbnailReply', 'QLThumbnailRepresentation', 'RPBroadcastActivityController', 'RPBroadcastActivityViewController', 'RPBroadcastConfiguration', 'RPBroadcastController', 'RPBroadcastHandler', 'RPBroadcastMP4ClipHandler', 'RPBroadcastSampleHandler', 'RPPreviewViewController', 'RPScreenRecorder', 'RPSystemBroadcastPickerView', 'SCNAccelerationConstraint', 'SCNAction', 'SCNAnimation', 'SCNAnimationEvent', 'SCNAnimationPlayer', 'SCNAudioPlayer', 'SCNAudioSource', 'SCNAvoidOccluderConstraint', 'SCNBillboardConstraint', 'SCNBox', 'SCNCamera', 'SCNCameraController', 'SCNCapsule', 'SCNCone', 'SCNConstraint', 'SCNCylinder', 'SCNDistanceConstraint', 'SCNFloor', 'SCNGeometry', 'SCNGeometryElement', 'SCNGeometrySource', 'SCNGeometryTessellator', 'SCNHitTestResult', 'SCNIKConstraint', 'SCNLevelOfDetail', 'SCNLight', 'SCNLookAtConstraint', 'SCNMaterial', 'SCNMaterialProperty', 'SCNMorpher', 'SCNNode', 'SCNParticlePropertyController', 'SCNParticleSystem', 'SCNPhysicsBallSocketJoint', 'SCNPhysicsBehavior', 'SCNPhysicsBody', 'SCNPhysicsConeTwistJoint', 'SCNPhysicsContact', 'SCNPhysicsField', 'SCNPhysicsHingeJoint', 'SCNPhysicsShape', 'SCNPhysicsSliderJoint', 'SCNPhysicsVehicle', 'SCNPhysicsVehicleWheel', 'SCNPhysicsWorld', 'SCNPlane', 'SCNProgram', 'SCNPyramid', 'SCNReferenceNode', 'SCNRenderer', 'SCNReplicatorConstraint', 'SCNScene', 'SCNSceneSource', 'SCNShape', 'SCNSkinner', 'SCNSliderConstraint', 'SCNSphere', 'SCNTechnique', 'SCNText', 'SCNTimingFunction', 'SCNTorus', 'SCNTransaction', 'SCNTransformConstraint', 'SCNTube', 'SCNView', 'SFAcousticFeature', 'SFAuthenticationSession', 'SFContentBlockerManager', 'SFContentBlockerState', 'SFSafariViewController', 'SFSafariViewControllerConfiguration', 'SFSpeechAudioBufferRecognitionRequest', 'SFSpeechRecognitionRequest', 'SFSpeechRecognitionResult', 'SFSpeechRecognitionTask', 'SFSpeechRecognizer', 'SFSpeechURLRecognitionRequest', 'SFTranscription', 'SFTranscriptionSegment', 'SFVoiceAnalytics', 'SK3DNode', 'SKAction', 'SKAdNetwork', 'SKArcadeService', 'SKAttribute', 'SKAttributeValue', 'SKAudioNode', 'SKCameraNode', 'SKCloudServiceController', 'SKCloudServiceSetupViewController', 'SKConstraint', 'SKCropNode', 'SKDownload', 'SKEffectNode', 'SKEmitterNode', 'SKFieldNode', 'SKKeyframeSequence', 'SKLabelNode', 'SKLightNode', 'SKMutablePayment', 'SKMutableTexture', 'SKNode', 'SKOverlay', 'SKOverlayAppClipConfiguration', 'SKOverlayAppConfiguration', 'SKOverlayConfiguration', 'SKOverlayTransitionContext', 'SKPayment', 'SKPaymentDiscount', 'SKPaymentQueue', 'SKPaymentTransaction', 'SKPhysicsBody', 'SKPhysicsContact', 'SKPhysicsJoint', 'SKPhysicsJointFixed', 'SKPhysicsJointLimit', 'SKPhysicsJointPin', 'SKPhysicsJointSliding', 'SKPhysicsJointSpring', 'SKPhysicsWorld', 'SKProduct', 'SKProductDiscount', 'SKProductStorePromotionController', 'SKProductSubscriptionPeriod', 'SKProductsRequest', 'SKProductsResponse', 'SKRange', 'SKReachConstraints', 'SKReceiptRefreshRequest', 'SKReferenceNode', 'SKRegion', 'SKRenderer', 'SKRequest', 'SKScene', 'SKShader', 'SKShapeNode', 'SKSpriteNode', 'SKStoreProductViewController', 'SKStoreReviewController', 'SKStorefront', 'SKTexture', 'SKTextureAtlas', 'SKTileDefinition', 'SKTileGroup', 'SKTileGroupRule', 'SKTileMapNode', 'SKTileSet', 'SKTransformNode', 'SKTransition', 'SKUniform', 'SKVideoNode', 'SKView', 'SKWarpGeometry', 'SKWarpGeometryGrid', 'SLComposeServiceViewController', 'SLComposeSheetConfigurationItem', 'SLComposeViewController', 'SLRequest', 'SNAudioFileAnalyzer', 'SNAudioStreamAnalyzer', 'SNClassification', 'SNClassificationResult', 'SNClassifySoundRequest', 'SRAmbientLightSample', 'SRApplicationUsage', 'SRDeletionRecord', 'SRDevice', 'SRDeviceUsageReport', 'SRFetchRequest', 'SRFetchResult', 'SRKeyboardMetrics', 'SRKeyboardProbabilityMetric', 'SRMessagesUsageReport', 'SRNotificationUsage', 'SRPhoneUsageReport', 'SRSensorReader', 'SRVisit', 'SRWebUsage', 'SRWristDetection', 'SSReadingList', 'STScreenTimeConfiguration', 'STScreenTimeConfigurationObserver', 'STWebHistory', 'STWebpageController', 'TKBERTLVRecord', 'TKCompactTLVRecord', 'TKSimpleTLVRecord', 'TKSmartCard', 'TKSmartCardATR', 'TKSmartCardATRInterfaceGroup', 'TKSmartCardPINFormat', 'TKSmartCardSlot', 'TKSmartCardSlotManager', 'TKSmartCardToken', 'TKSmartCardTokenDriver', 'TKSmartCardTokenSession', 'TKSmartCardUserInteraction', 'TKSmartCardUserInteractionForPINOperation', 'TKSmartCardUserInteractionForSecurePINChange', 'TKSmartCardUserInteractionForSecurePINVerification', 'TKTLVRecord', 'TKToken', 'TKTokenAuthOperation', 'TKTokenConfiguration', 'TKTokenDriver', 'TKTokenDriverConfiguration', 'TKTokenKeyAlgorithm', 'TKTokenKeyExchangeParameters', 'TKTokenKeychainCertificate', 'TKTokenKeychainContents', 'TKTokenKeychainItem', 'TKTokenKeychainKey', 'TKTokenPasswordAuthOperation', 'TKTokenSession', 'TKTokenSmartCardPINAuthOperation', 'TKTokenWatcher', 'TWRequest', 'TWTweetComposeViewController', 'UIAcceleration', 'UIAccelerometer', 'UIAccessibilityCustomAction', 'UIAccessibilityCustomRotor', 'UIAccessibilityCustomRotorItemResult', 'UIAccessibilityCustomRotorSearchPredicate', 'UIAccessibilityElement', 'UIAccessibilityLocationDescriptor', 'UIAction', 'UIActionSheet', 'UIActivity', 'UIActivityIndicatorView', 'UIActivityItemProvider', 'UIActivityItemsConfiguration', 'UIActivityViewController', 'UIAlertAction', 'UIAlertController', 'UIAlertView', 'UIApplication', 'UIApplicationShortcutIcon', 'UIApplicationShortcutItem', 'UIAttachmentBehavior', 'UIBackgroundConfiguration', 'UIBarAppearance', 'UIBarButtonItem', 'UIBarButtonItemAppearance', 'UIBarButtonItemGroup', 'UIBarButtonItemStateAppearance', 'UIBarItem', 'UIBezierPath', 'UIBlurEffect', 'UIButton', 'UICellAccessory', 'UICellAccessoryCheckmark', 'UICellAccessoryCustomView', 'UICellAccessoryDelete', 'UICellAccessoryDisclosureIndicator', 'UICellAccessoryInsert', 'UICellAccessoryLabel', 'UICellAccessoryMultiselect', 'UICellAccessoryOutlineDisclosure', 'UICellAccessoryReorder', 'UICellConfigurationState', 'UICloudSharingController', 'UICollectionLayoutListConfiguration', 'UICollectionReusableView', 'UICollectionView', 'UICollectionViewCell', 'UICollectionViewCellRegistration', 'UICollectionViewCompositionalLayout', 'UICollectionViewCompositionalLayoutConfiguration', 'UICollectionViewController', 'UICollectionViewDiffableDataSource', 'UICollectionViewDiffableDataSourceReorderingHandlers', 'UICollectionViewDiffableDataSourceSectionSnapshotHandlers', 'UICollectionViewDropPlaceholder', 'UICollectionViewDropProposal', 'UICollectionViewFlowLayout', 'UICollectionViewFlowLayoutInvalidationContext', 'UICollectionViewFocusUpdateContext', 'UICollectionViewLayout', 'UICollectionViewLayoutAttributes', 'UICollectionViewLayoutInvalidationContext', 'UICollectionViewListCell', 'UICollectionViewPlaceholder', 'UICollectionViewSupplementaryRegistration', 'UICollectionViewTransitionLayout', 'UICollectionViewUpdateItem', 'UICollisionBehavior', 'UIColor', 'UIColorPickerViewController', 'UIColorWell', 'UICommand', 'UICommandAlternate', 'UIContextMenuConfiguration', 'UIContextMenuInteraction', 'UIContextualAction', 'UIControl', 'UICubicTimingParameters', 'UIDatePicker', 'UIDeferredMenuElement', 'UIDevice', 'UIDictationPhrase', 'UIDocument', 'UIDocumentBrowserAction', 'UIDocumentBrowserTransitionController', 'UIDocumentBrowserViewController', 'UIDocumentInteractionController', 'UIDocumentMenuViewController', 'UIDocumentPickerExtensionViewController', 'UIDocumentPickerViewController', 'UIDragInteraction', 'UIDragItem', 'UIDragPreview', 'UIDragPreviewParameters', 'UIDragPreviewTarget', 'UIDropInteraction', 'UIDropProposal', 'UIDynamicAnimator', 'UIDynamicBehavior', 'UIDynamicItemBehavior', 'UIDynamicItemGroup', 'UIEvent', 'UIFeedbackGenerator', 'UIFieldBehavior', 'UIFocusAnimationCoordinator', 'UIFocusDebugger', 'UIFocusGuide', 'UIFocusMovementHint', 'UIFocusSystem', 'UIFocusUpdateContext', 'UIFont', 'UIFontDescriptor', 'UIFontMetrics', 'UIFontPickerViewController', 'UIFontPickerViewControllerConfiguration', 'UIGestureRecognizer', 'UIGraphicsImageRenderer', 'UIGraphicsImageRendererContext', 'UIGraphicsImageRendererFormat', 'UIGraphicsPDFRenderer', 'UIGraphicsPDFRendererContext', 'UIGraphicsPDFRendererFormat', 'UIGraphicsRenderer', 'UIGraphicsRendererContext', 'UIGraphicsRendererFormat', 'UIGravityBehavior', 'UIHoverGestureRecognizer', 'UIImage', 'UIImageAsset', 'UIImageConfiguration', 'UIImagePickerController', 'UIImageSymbolConfiguration', 'UIImageView', 'UIImpactFeedbackGenerator', 'UIIndirectScribbleInteraction', 'UIInputView', 'UIInputViewController', 'UIInterpolatingMotionEffect', 'UIKey', 'UIKeyCommand', 'UILabel', 'UILargeContentViewerInteraction', 'UILayoutGuide', 'UILexicon', 'UILexiconEntry', 'UIListContentConfiguration', 'UIListContentImageProperties', 'UIListContentTextProperties', 'UIListContentView', 'UILocalNotification', 'UILocalizedIndexedCollation', 'UILongPressGestureRecognizer', 'UIManagedDocument', 'UIMarkupTextPrintFormatter', 'UIMenu', 'UIMenuController', 'UIMenuElement', 'UIMenuItem', 'UIMenuSystem', 'UIMotionEffect', 'UIMotionEffectGroup', 'UIMutableApplicationShortcutItem', 'UIMutableUserNotificationAction', 'UIMutableUserNotificationCategory', 'UINavigationBar', 'UINavigationBarAppearance', 'UINavigationController', 'UINavigationItem', 'UINib', 'UINotificationFeedbackGenerator', 'UIOpenURLContext', 'UIPageControl', 'UIPageViewController', 'UIPanGestureRecognizer', 'UIPasteConfiguration', 'UIPasteboard', 'UIPencilInteraction', 'UIPercentDrivenInteractiveTransition', 'UIPickerView', 'UIPinchGestureRecognizer', 'UIPointerEffect', 'UIPointerHighlightEffect', 'UIPointerHoverEffect', 'UIPointerInteraction', 'UIPointerLiftEffect', 'UIPointerLockState', 'UIPointerRegion', 'UIPointerRegionRequest', 'UIPointerShape', 'UIPointerStyle', 'UIPopoverBackgroundView', 'UIPopoverController', 'UIPopoverPresentationController', 'UIPresentationController', 'UIPress', 'UIPressesEvent', 'UIPreviewAction', 'UIPreviewActionGroup', 'UIPreviewInteraction', 'UIPreviewParameters', 'UIPreviewTarget', 'UIPrintFormatter', 'UIPrintInfo', 'UIPrintInteractionController', 'UIPrintPageRenderer', 'UIPrintPaper', 'UIPrinter', 'UIPrinterPickerController', 'UIProgressView', 'UIPushBehavior', 'UIReferenceLibraryViewController', 'UIRefreshControl', 'UIRegion', 'UIResponder', 'UIRotationGestureRecognizer', 'UIScene', 'UISceneActivationConditions', 'UISceneActivationRequestOptions', 'UISceneConfiguration', 'UISceneConnectionOptions', 'UISceneDestructionRequestOptions', 'UISceneOpenExternalURLOptions', 'UISceneOpenURLOptions', 'UISceneSession', 'UISceneSizeRestrictions', 'UIScreen', 'UIScreenEdgePanGestureRecognizer', 'UIScreenMode', 'UIScreenshotService', 'UIScribbleInteraction', 'UIScrollView', 'UISearchBar', 'UISearchContainerViewController', 'UISearchController', 'UISearchDisplayController', 'UISearchSuggestionItem', 'UISearchTextField', 'UISearchToken', 'UISegmentedControl', 'UISelectionFeedbackGenerator', 'UISimpleTextPrintFormatter', 'UISlider', 'UISnapBehavior', 'UISplitViewController', 'UISpringLoadedInteraction', 'UISpringTimingParameters', 'UIStackView', 'UIStatusBarManager', 'UIStepper', 'UIStoryboard', 'UIStoryboardPopoverSegue', 'UIStoryboardSegue', 'UIStoryboardUnwindSegueSource', 'UISwipeActionsConfiguration', 'UISwipeGestureRecognizer', 'UISwitch', 'UITabBar', 'UITabBarAppearance', 'UITabBarController', 'UITabBarItem', 'UITabBarItemAppearance', 'UITabBarItemStateAppearance', 'UITableView', 'UITableViewCell', 'UITableViewController', 'UITableViewDiffableDataSource', 'UITableViewDropPlaceholder', 'UITableViewDropProposal', 'UITableViewFocusUpdateContext', 'UITableViewHeaderFooterView', 'UITableViewPlaceholder', 'UITableViewRowAction', 'UITapGestureRecognizer', 'UITargetedDragPreview', 'UITargetedPreview', 'UITextChecker', 'UITextDragPreviewRenderer', 'UITextDropProposal', 'UITextField', 'UITextFormattingCoordinator', 'UITextInputAssistantItem', 'UITextInputMode', 'UITextInputPasswordRules', 'UITextInputStringTokenizer', 'UITextInteraction', 'UITextPlaceholder', 'UITextPosition', 'UITextRange', 'UITextSelectionRect', 'UITextView', 'UITitlebar', 'UIToolbar', 'UIToolbarAppearance', 'UITouch', 'UITraitCollection', 'UIUserNotificationAction', 'UIUserNotificationCategory', 'UIUserNotificationSettings', 'UIVibrancyEffect', 'UIVideoEditorController', 'UIView', 'UIViewConfigurationState', 'UIViewController', 'UIViewPrintFormatter', 'UIViewPropertyAnimator', 'UIVisualEffect', 'UIVisualEffectView', 'UIWebView', 'UIWindow', 'UIWindowScene', 'UIWindowSceneDestructionRequestOptions', 'UNCalendarNotificationTrigger', 'UNLocationNotificationTrigger', 'UNMutableNotificationContent', 'UNNotification', 'UNNotificationAction', 'UNNotificationAttachment', 'UNNotificationCategory', 'UNNotificationContent', 'UNNotificationRequest', 'UNNotificationResponse', 'UNNotificationServiceExtension', 'UNNotificationSettings', 'UNNotificationSound', 'UNNotificationTrigger', 'UNPushNotificationTrigger', 'UNTextInputNotificationAction', 'UNTextInputNotificationResponse', 'UNTimeIntervalNotificationTrigger', 'UNUserNotificationCenter', 'UTType', 'VNBarcodeObservation', 'VNCircle', 'VNClassificationObservation', 'VNClassifyImageRequest', 'VNContour', 'VNContoursObservation', 'VNCoreMLFeatureValueObservation', 'VNCoreMLModel', 'VNCoreMLRequest', 'VNDetectBarcodesRequest', 'VNDetectContoursRequest', 'VNDetectFaceCaptureQualityRequest', 'VNDetectFaceLandmarksRequest', 'VNDetectFaceRectanglesRequest', 'VNDetectHorizonRequest', 'VNDetectHumanBodyPoseRequest', 'VNDetectHumanHandPoseRequest', 'VNDetectHumanRectanglesRequest', 'VNDetectRectanglesRequest', 'VNDetectTextRectanglesRequest', 'VNDetectTrajectoriesRequest', 'VNDetectedObjectObservation', 'VNDetectedPoint', 'VNDocumentCameraScan', 'VNDocumentCameraViewController', 'VNFaceLandmarkRegion', 'VNFaceLandmarkRegion2D', 'VNFaceLandmarks', 'VNFaceLandmarks2D', 'VNFaceObservation', 'VNFeaturePrintObservation', 'VNGenerateAttentionBasedSaliencyImageRequest', 'VNGenerateImageFeaturePrintRequest', 'VNGenerateObjectnessBasedSaliencyImageRequest', 'VNGenerateOpticalFlowRequest', 'VNGeometryUtils', 'VNHomographicImageRegistrationRequest', 'VNHorizonObservation', 'VNHumanBodyPoseObservation', 'VNHumanHandPoseObservation', 'VNImageAlignmentObservation', 'VNImageBasedRequest', 'VNImageHomographicAlignmentObservation', 'VNImageRegistrationRequest', 'VNImageRequestHandler', 'VNImageTranslationAlignmentObservation', 'VNObservation', 'VNPixelBufferObservation', 'VNPoint', 'VNRecognizeAnimalsRequest', 'VNRecognizeTextRequest', 'VNRecognizedObjectObservation', 'VNRecognizedPoint', 'VNRecognizedPointsObservation', 'VNRecognizedText', 'VNRecognizedTextObservation', 'VNRectangleObservation', 'VNRequest', 'VNSaliencyImageObservation', 'VNSequenceRequestHandler', 'VNStatefulRequest', 'VNTargetedImageRequest', 'VNTextObservation', 'VNTrackObjectRequest', 'VNTrackRectangleRequest', 'VNTrackingRequest', 'VNTrajectoryObservation', 'VNTranslationalImageRegistrationRequest', 'VNVector', 'VNVideoProcessor', 'VNVideoProcessorCadence', 'VNVideoProcessorFrameRateCadence', 'VNVideoProcessorRequestProcessingOptions', 'VNVideoProcessorTimeIntervalCadence', 'VSAccountApplicationProvider', 'VSAccountManager', 'VSAccountManagerResult', 'VSAccountMetadata', 'VSAccountMetadataRequest', 'VSAccountProviderResponse', 'VSSubscription', 'VSSubscriptionRegistrationCenter', 'WCSession', 'WCSessionFile', 'WCSessionFileTransfer', 'WCSessionUserInfoTransfer', 'WKBackForwardList', 'WKBackForwardListItem', 'WKContentRuleList', 'WKContentRuleListStore', 'WKContentWorld', 'WKContextMenuElementInfo', 'WKFindConfiguration', 'WKFindResult', 'WKFrameInfo', 'WKHTTPCookieStore', 'WKNavigation', 'WKNavigationAction', 'WKNavigationResponse', 'WKOpenPanelParameters', 'WKPDFConfiguration', 'WKPreferences', 'WKPreviewElementInfo', 'WKProcessPool', 'WKScriptMessage', 'WKSecurityOrigin', 'WKSnapshotConfiguration', 'WKUserContentController', 'WKUserScript', 'WKWebView', 'WKWebViewConfiguration', 'WKWebpagePreferences', 'WKWebsiteDataRecord', 'WKWebsiteDataStore', 'WKWindowFeatures', '__EntityAccessibilityWrapper'}
+COCOA_PROTOCOLS = {'ABNewPersonViewControllerDelegate', 'ABPeoplePickerNavigationControllerDelegate', 'ABPersonViewControllerDelegate', 'ABUnknownPersonViewControllerDelegate', 'ADActionViewControllerChildInterface', 'ADActionViewControllerInterface', 'ADBannerViewDelegate', 'ADInterstitialAdDelegate', 'AEAssessmentSessionDelegate', 'ARAnchorCopying', 'ARCoachingOverlayViewDelegate', 'ARSCNViewDelegate', 'ARSKViewDelegate', 'ARSessionDelegate', 'ARSessionObserver', 'ARSessionProviding', 'ARTrackable', 'ASAccountAuthenticationModificationControllerDelegate', 'ASAccountAuthenticationModificationControllerPresentationContextProviding', 'ASAuthorizationControllerDelegate', 'ASAuthorizationControllerPresentationContextProviding', 'ASAuthorizationCredential', 'ASAuthorizationProvider', 'ASAuthorizationProviderExtensionAuthorizationRequestHandler', 'ASWebAuthenticationPresentationContextProviding', 'ASWebAuthenticationSessionRequestDelegate', 'ASWebAuthenticationSessionWebBrowserSessionHandling', 'AUAudioUnitFactory', 'AVAssetDownloadDelegate', 'AVAssetResourceLoaderDelegate', 'AVAssetWriterDelegate', 'AVAsynchronousKeyValueLoading', 'AVCaptureAudioDataOutputSampleBufferDelegate', 'AVCaptureDataOutputSynchronizerDelegate', 'AVCaptureDepthDataOutputDelegate', 'AVCaptureFileOutputDelegate', 'AVCaptureFileOutputRecordingDelegate', 'AVCaptureMetadataOutputObjectsDelegate', 'AVCapturePhotoCaptureDelegate', 'AVCapturePhotoFileDataRepresentationCustomizer', 'AVCaptureVideoDataOutputSampleBufferDelegate', 'AVContentKeyRecipient', 'AVContentKeySessionDelegate', 'AVFragmentMinding', 'AVPictureInPictureControllerDelegate', 'AVPlayerItemLegibleOutputPushDelegate', 'AVPlayerItemMetadataCollectorPushDelegate', 'AVPlayerItemMetadataOutputPushDelegate', 'AVPlayerItemOutputPullDelegate', 'AVPlayerItemOutputPushDelegate', 'AVPlayerViewControllerDelegate', 'AVQueuedSampleBufferRendering', 'AVRoutePickerViewDelegate', 'AVVideoCompositing', 'AVVideoCompositionInstruction', 'AVVideoCompositionValidationHandling', 'AXCustomContentProvider', 'CAAction', 'CAAnimationDelegate', 'CALayerDelegate', 'CAMediaTiming', 'CAMetalDrawable', 'CBCentralManagerDelegate', 'CBPeripheralDelegate', 'CBPeripheralManagerDelegate', 'CHHapticAdvancedPatternPlayer', 'CHHapticDeviceCapability', 'CHHapticParameterAttributes', 'CHHapticPatternPlayer', 'CIAccordionFoldTransition', 'CIAffineClamp', 'CIAffineTile', 'CIAreaAverage', 'CIAreaHistogram', 'CIAreaMaximum', 'CIAreaMaximumAlpha', 'CIAreaMinMax', 'CIAreaMinMaxRed', 'CIAreaMinimum', 'CIAreaMinimumAlpha', 'CIAreaReductionFilter', 'CIAttributedTextImageGenerator', 'CIAztecCodeGenerator', 'CIBarcodeGenerator', 'CIBarsSwipeTransition', 'CIBicubicScaleTransform', 'CIBlendWithMask', 'CIBloom', 'CIBokehBlur', 'CIBoxBlur', 'CIBumpDistortion', 'CIBumpDistortionLinear', 'CICMYKHalftone', 'CICheckerboardGenerator', 'CICircleSplashDistortion', 'CICircularScreen', 'CICircularWrap', 'CICode128BarcodeGenerator', 'CIColorAbsoluteDifference', 'CIColorClamp', 'CIColorControls', 'CIColorCrossPolynomial', 'CIColorCube', 'CIColorCubeWithColorSpace', 'CIColorCubesMixedWithMask', 'CIColorCurves', 'CIColorInvert', 'CIColorMap', 'CIColorMatrix', 'CIColorMonochrome', 'CIColorPolynomial', 'CIColorPosterize', 'CIColorThreshold', 'CIColorThresholdOtsu', 'CIColumnAverage', 'CIComicEffect', 'CICompositeOperation', 'CIConvolution', 'CICopyMachineTransition', 'CICoreMLModel', 'CICrystallize', 'CIDepthOfField', 'CIDepthToDisparity', 'CIDiscBlur', 'CIDisintegrateWithMaskTransition', 'CIDisparityToDepth', 'CIDisplacementDistortion', 'CIDissolveTransition', 'CIDither', 'CIDocumentEnhancer', 'CIDotScreen', 'CIDroste', 'CIEdgePreserveUpsample', 'CIEdgeWork', 'CIEdges', 'CIEightfoldReflectedTile', 'CIExposureAdjust', 'CIFalseColor', 'CIFilter', 'CIFilterConstructor', 'CIFlashTransition', 'CIFourCoordinateGeometryFilter', 'CIFourfoldReflectedTile', 'CIFourfoldRotatedTile', 'CIFourfoldTranslatedTile', 'CIGaborGradients', 'CIGammaAdjust', 'CIGaussianBlur', 'CIGaussianGradient', 'CIGlassDistortion', 'CIGlassLozenge', 'CIGlideReflectedTile', 'CIGloom', 'CIHatchedScreen', 'CIHeightFieldFromMask', 'CIHexagonalPixellate', 'CIHighlightShadowAdjust', 'CIHistogramDisplay', 'CIHoleDistortion', 'CIHueAdjust', 'CIHueSaturationValueGradient', 'CIImageProcessorInput', 'CIImageProcessorOutput', 'CIKMeans', 'CIKaleidoscope', 'CIKeystoneCorrectionCombined', 'CIKeystoneCorrectionHorizontal', 'CIKeystoneCorrectionVertical', 'CILabDeltaE', 'CILanczosScaleTransform', 'CILenticularHaloGenerator', 'CILightTunnel', 'CILineOverlay', 'CILineScreen', 'CILinearGradient', 'CILinearToSRGBToneCurve', 'CIMaskToAlpha', 'CIMaskedVariableBlur', 'CIMaximumComponent', 'CIMedian', 'CIMeshGenerator', 'CIMinimumComponent', 'CIMix', 'CIModTransition', 'CIMorphologyGradient', 'CIMorphologyMaximum', 'CIMorphologyMinimum', 'CIMorphologyRectangleMaximum', 'CIMorphologyRectangleMinimum', 'CIMotionBlur', 'CINinePartStretched', 'CINinePartTiled', 'CINoiseReduction', 'CIOpTile', 'CIPDF417BarcodeGenerator', 'CIPageCurlTransition', 'CIPageCurlWithShadowTransition', 'CIPaletteCentroid', 'CIPalettize', 'CIParallelogramTile', 'CIPerspectiveCorrection', 'CIPerspectiveRotate', 'CIPerspectiveTile', 'CIPerspectiveTransform', 'CIPerspectiveTransformWithExtent', 'CIPhotoEffect', 'CIPinchDistortion', 'CIPixellate', 'CIPlugInRegistration', 'CIPointillize', 'CIQRCodeGenerator', 'CIRadialGradient', 'CIRandomGenerator', 'CIRippleTransition', 'CIRoundedRectangleGenerator', 'CIRowAverage', 'CISRGBToneCurveToLinear', 'CISaliencyMap', 'CISepiaTone', 'CIShadedMaterial', 'CISharpenLuminance', 'CISixfoldReflectedTile', 'CISixfoldRotatedTile', 'CISmoothLinearGradient', 'CISpotColor', 'CISpotLight', 'CIStarShineGenerator', 'CIStraighten', 'CIStretchCrop', 'CIStripesGenerator', 'CISunbeamsGenerator', 'CISwipeTransition', 'CITemperatureAndTint', 'CITextImageGenerator', 'CIThermal', 'CIToneCurve', 'CITorusLensDistortion', 'CITransitionFilter', 'CITriangleKaleidoscope', 'CITriangleTile', 'CITwelvefoldReflectedTile', 'CITwirlDistortion', 'CIUnsharpMask', 'CIVibrance', 'CIVignette', 'CIVignetteEffect', 'CIVortexDistortion', 'CIWhitePointAdjust', 'CIXRay', 'CIZoomBlur', 'CKRecordKeyValueSetting', 'CKRecordValue', 'CLKComplicationDataSource', 'CLLocationManagerDelegate', 'CLSContextProvider', 'CLSDataStoreDelegate', 'CMFallDetectionDelegate', 'CMHeadphoneMotionManagerDelegate', 'CNChangeHistoryEventVisitor', 'CNContactPickerDelegate', 'CNContactViewControllerDelegate', 'CNKeyDescriptor', 'CPApplicationDelegate', 'CPBarButtonProviding', 'CPInterfaceControllerDelegate', 'CPListTemplateDelegate', 'CPListTemplateItem', 'CPMapTemplateDelegate', 'CPNowPlayingTemplateObserver', 'CPPointOfInterestTemplateDelegate', 'CPSearchTemplateDelegate', 'CPSelectableListItem', 'CPSessionConfigurationDelegate', 'CPTabBarTemplateDelegate', 'CPTemplateApplicationDashboardSceneDelegate', 'CPTemplateApplicationSceneDelegate', 'CSSearchableIndexDelegate', 'CTSubscriberDelegate', 'CTTelephonyNetworkInfoDelegate', 'CXCallDirectoryExtensionContextDelegate', 'CXCallObserverDelegate', 'CXProviderDelegate', 'EAAccessoryDelegate', 'EAGLDrawable', 'EAWiFiUnconfiguredAccessoryBrowserDelegate', 'EKCalendarChooserDelegate', 'EKEventEditViewDelegate', 'EKEventViewDelegate', 'GCDevice', 'GKAchievementViewControllerDelegate', 'GKAgentDelegate', 'GKChallengeEventHandlerDelegate', 'GKChallengeListener', 'GKFriendRequestComposeViewControllerDelegate', 'GKGameCenterControllerDelegate', 'GKGameModel', 'GKGameModelPlayer', 'GKGameModelUpdate', 'GKGameSessionEventListener', 'GKGameSessionSharingViewControllerDelegate', 'GKInviteEventListener', 'GKLeaderboardViewControllerDelegate', 'GKLocalPlayerListener', 'GKMatchDelegate', 'GKMatchmakerViewControllerDelegate', 'GKPeerPickerControllerDelegate', 'GKRandom', 'GKSavedGameListener', 'GKSceneRootNodeType', 'GKSessionDelegate', 'GKStrategist', 'GKTurnBasedEventListener', 'GKTurnBasedMatchmakerViewControllerDelegate', 'GKVoiceChatClient', 'GLKNamedEffect', 'GLKViewControllerDelegate', 'GLKViewDelegate', 'HKLiveWorkoutBuilderDelegate', 'HKWorkoutSessionDelegate', 'HMAccessoryBrowserDelegate', 'HMAccessoryDelegate', 'HMCameraSnapshotControlDelegate', 'HMCameraStreamControlDelegate', 'HMHomeDelegate', 'HMHomeManagerDelegate', 'HMNetworkConfigurationProfileDelegate', 'ICCameraDeviceDelegate', 'ICCameraDeviceDownloadDelegate', 'ICDeviceBrowserDelegate', 'ICDeviceDelegate', 'ICScannerDeviceDelegate', 'ILMessageFilterQueryHandling', 'INActivateCarSignalIntentHandling', 'INAddMediaIntentHandling', 'INAddTasksIntentHandling', 'INAppendToNoteIntentHandling', 'INBookRestaurantReservationIntentHandling', 'INCallsDomainHandling', 'INCancelRideIntentHandling', 'INCancelWorkoutIntentHandling', 'INCarCommandsDomainHandling', 'INCarPlayDomainHandling', 'INCreateNoteIntentHandling', 'INCreateTaskListIntentHandling', 'INDeleteTasksIntentHandling', 'INEndWorkoutIntentHandling', 'INGetAvailableRestaurantReservationBookingDefaultsIntentHandling', 'INGetAvailableRestaurantReservationBookingsIntentHandling', 'INGetCarLockStatusIntentHandling', 'INGetCarPowerLevelStatusIntentHandling', 'INGetCarPowerLevelStatusIntentResponseObserver', 'INGetRestaurantGuestIntentHandling', 'INGetRideStatusIntentHandling', 'INGetRideStatusIntentResponseObserver', 'INGetUserCurrentRestaurantReservationBookingsIntentHandling', 'INGetVisualCodeIntentHandling', 'INIntentHandlerProviding', 'INListCarsIntentHandling', 'INListRideOptionsIntentHandling', 'INMessagesDomainHandling', 'INNotebookDomainHandling', 'INPauseWorkoutIntentHandling', 'INPayBillIntentHandling', 'INPaymentsDomainHandling', 'INPhotosDomainHandling', 'INPlayMediaIntentHandling', 'INRadioDomainHandling', 'INRequestPaymentIntentHandling', 'INRequestRideIntentHandling', 'INResumeWorkoutIntentHandling', 'INRidesharingDomainHandling', 'INSaveProfileInCarIntentHandling', 'INSearchCallHistoryIntentHandling', 'INSearchForAccountsIntentHandling', 'INSearchForBillsIntentHandling', 'INSearchForMediaIntentHandling', 'INSearchForMessagesIntentHandling', 'INSearchForNotebookItemsIntentHandling', 'INSearchForPhotosIntentHandling', 'INSendMessageIntentHandling', 'INSendPaymentIntentHandling', 'INSendRideFeedbackIntentHandling', 'INSetAudioSourceInCarIntentHandling', 'INSetCarLockStatusIntentHandling', 'INSetClimateSettingsInCarIntentHandling', 'INSetDefrosterSettingsInCarIntentHandling', 'INSetMessageAttributeIntentHandling', 'INSetProfileInCarIntentHandling', 'INSetRadioStationIntentHandling', 'INSetSeatSettingsInCarIntentHandling', 'INSetTaskAttributeIntentHandling', 'INSnoozeTasksIntentHandling', 'INSpeakable', 'INStartAudioCallIntentHandling', 'INStartCallIntentHandling', 'INStartPhotoPlaybackIntentHandling', 'INStartVideoCallIntentHandling', 'INStartWorkoutIntentHandling', 'INTransferMoneyIntentHandling', 'INUIAddVoiceShortcutButtonDelegate', 'INUIAddVoiceShortcutViewControllerDelegate', 'INUIEditVoiceShortcutViewControllerDelegate', 'INUIHostedViewControlling', 'INUIHostedViewSiriProviding', 'INUpdateMediaAffinityIntentHandling', 'INVisualCodeDomainHandling', 'INWorkoutsDomainHandling', 'JSExport', 'MCAdvertiserAssistantDelegate', 'MCBrowserViewControllerDelegate', 'MCNearbyServiceAdvertiserDelegate', 'MCNearbyServiceBrowserDelegate', 'MCSessionDelegate', 'MDLAssetResolver', 'MDLComponent', 'MDLJointAnimation', 'MDLLightProbeIrradianceDataSource', 'MDLMeshBuffer', 'MDLMeshBufferAllocator', 'MDLMeshBufferZone', 'MDLNamed', 'MDLObjectContainerComponent', 'MDLTransformComponent', 'MDLTransformOp', 'MFMailComposeViewControllerDelegate', 'MFMessageComposeViewControllerDelegate', 'MIDICIProfileResponderDelegate', 'MKAnnotation', 'MKGeoJSONObject', 'MKLocalSearchCompleterDelegate', 'MKMapViewDelegate', 'MKOverlay', 'MKReverseGeocoderDelegate', 'MLBatchProvider', 'MLCustomLayer', 'MLCustomModel', 'MLFeatureProvider', 'MLWritable', 'MPMediaPickerControllerDelegate', 'MPMediaPlayback', 'MPNowPlayingSessionDelegate', 'MPPlayableContentDataSource', 'MPPlayableContentDelegate', 'MPSystemMusicPlayerController', 'MSAuthenticationPresentationContext', 'MSMessagesAppTranscriptPresentation', 'MSStickerBrowserViewDataSource', 'MTKViewDelegate', 'MTLAccelerationStructure', 'MTLAccelerationStructureCommandEncoder', 'MTLArgumentEncoder', 'MTLBinaryArchive', 'MTLBlitCommandEncoder', 'MTLBuffer', 'MTLCaptureScope', 'MTLCommandBuffer', 'MTLCommandBufferEncoderInfo', 'MTLCommandEncoder', 'MTLCommandQueue', 'MTLComputeCommandEncoder', 'MTLComputePipelineState', 'MTLCounter', 'MTLCounterSampleBuffer', 'MTLCounterSet', 'MTLDepthStencilState', 'MTLDevice', 'MTLDrawable', 'MTLDynamicLibrary', 'MTLEvent', 'MTLFence', 'MTLFunction', 'MTLFunctionHandle', 'MTLFunctionLog', 'MTLFunctionLogDebugLocation', 'MTLHeap', 'MTLIndirectCommandBuffer', 'MTLIndirectComputeCommand', 'MTLIndirectComputeCommandEncoder', 'MTLIndirectRenderCommand', 'MTLIndirectRenderCommandEncoder', 'MTLIntersectionFunctionTable', 'MTLLibrary', 'MTLLogContainer', 'MTLParallelRenderCommandEncoder', 'MTLRasterizationRateMap', 'MTLRenderCommandEncoder', 'MTLRenderPipelineState', 'MTLResource', 'MTLResourceStateCommandEncoder', 'MTLSamplerState', 'MTLSharedEvent', 'MTLTexture', 'MTLVisibleFunctionTable', 'MXMetricManagerSubscriber', 'MyClassJavaScriptMethods', 'NCWidgetProviding', 'NEAppPushDelegate', 'NFCFeliCaTag', 'NFCISO15693Tag', 'NFCISO7816Tag', 'NFCMiFareTag', 'NFCNDEFReaderSessionDelegate', 'NFCNDEFTag', 'NFCReaderSession', 'NFCReaderSessionDelegate', 'NFCTag', 'NFCTagReaderSessionDelegate', 'NFCVASReaderSessionDelegate', 'NISessionDelegate', 'NSCacheDelegate', 'NSCoding', 'NSCollectionLayoutContainer', 'NSCollectionLayoutEnvironment', 'NSCollectionLayoutVisibleItem', 'NSCopying', 'NSDecimalNumberBehaviors', 'NSDiscardableContent', 'NSExtensionRequestHandling', 'NSFastEnumeration', 'NSFetchRequestResult', 'NSFetchedResultsControllerDelegate', 'NSFetchedResultsSectionInfo', 'NSFileManagerDelegate', 'NSFilePresenter', 'NSFileProviderChangeObserver', 'NSFileProviderEnumerationObserver', 'NSFileProviderEnumerator', 'NSFileProviderItem', 'NSFileProviderServiceSource', 'NSItemProviderReading', 'NSItemProviderWriting', 'NSKeyedArchiverDelegate', 'NSKeyedUnarchiverDelegate', 'NSLayoutManagerDelegate', 'NSLocking', 'NSMachPortDelegate', 'NSMetadataQueryDelegate', 'NSMutableCopying', 'NSNetServiceBrowserDelegate', 'NSNetServiceDelegate', 'NSPortDelegate', 'NSProgressReporting', 'NSSecureCoding', 'NSStreamDelegate', 'NSTextAttachmentContainer', 'NSTextLayoutOrientationProvider', 'NSTextStorageDelegate', 'NSURLAuthenticationChallengeSender', 'NSURLConnectionDataDelegate', 'NSURLConnectionDelegate', 'NSURLConnectionDownloadDelegate', 'NSURLProtocolClient', 'NSURLSessionDataDelegate', 'NSURLSessionDelegate', 'NSURLSessionDownloadDelegate', 'NSURLSessionStreamDelegate', 'NSURLSessionTaskDelegate', 'NSURLSessionWebSocketDelegate', 'NSUserActivityDelegate', 'NSXMLParserDelegate', 'NSXPCListenerDelegate', 'NSXPCProxyCreating', 'NWTCPConnectionAuthenticationDelegate', 'OSLogEntryFromProcess', 'OSLogEntryWithPayload', 'PDFDocumentDelegate', 'PDFViewDelegate', 'PHContentEditingController', 'PHLivePhotoFrame', 'PHLivePhotoViewDelegate', 'PHPhotoLibraryAvailabilityObserver', 'PHPhotoLibraryChangeObserver', 'PHPickerViewControllerDelegate', 'PKAddPassesViewControllerDelegate', 'PKAddPaymentPassViewControllerDelegate', 'PKAddSecureElementPassViewControllerDelegate', 'PKCanvasViewDelegate', 'PKDisbursementAuthorizationControllerDelegate', 'PKIssuerProvisioningExtensionAuthorizationProviding', 'PKPaymentAuthorizationControllerDelegate', 'PKPaymentAuthorizationViewControllerDelegate', 'PKPaymentInformationRequestHandling', 'PKPushRegistryDelegate', 'PKToolPickerObserver', 'PreviewDisplaying', 'QLPreviewControllerDataSource', 'QLPreviewControllerDelegate', 'QLPreviewItem', 'QLPreviewingController', 'RPBroadcastActivityControllerDelegate', 'RPBroadcastActivityViewControllerDelegate', 'RPBroadcastControllerDelegate', 'RPPreviewViewControllerDelegate', 'RPScreenRecorderDelegate', 'SCNActionable', 'SCNAnimatable', 'SCNAnimation', 'SCNAvoidOccluderConstraintDelegate', 'SCNBoundingVolume', 'SCNBufferStream', 'SCNCameraControlConfiguration', 'SCNCameraControllerDelegate', 'SCNNodeRendererDelegate', 'SCNPhysicsContactDelegate', 'SCNProgramDelegate', 'SCNSceneExportDelegate', 'SCNSceneRenderer', 'SCNSceneRendererDelegate', 'SCNShadable', 'SCNTechniqueSupport', 'SFSafariViewControllerDelegate', 'SFSpeechRecognitionTaskDelegate', 'SFSpeechRecognizerDelegate', 'SKCloudServiceSetupViewControllerDelegate', 'SKOverlayDelegate', 'SKPaymentQueueDelegate', 'SKPaymentTransactionObserver', 'SKPhysicsContactDelegate', 'SKProductsRequestDelegate', 'SKRequestDelegate', 'SKSceneDelegate', 'SKStoreProductViewControllerDelegate', 'SKViewDelegate', 'SKWarpable', 'SNRequest', 'SNResult', 'SNResultsObserving', 'SRSensorReaderDelegate', 'TKSmartCardTokenDriverDelegate', 'TKSmartCardUserInteractionDelegate', 'TKTokenDelegate', 'TKTokenDriverDelegate', 'TKTokenSessionDelegate', 'UIAccelerometerDelegate', 'UIAccessibilityContainerDataTable', 'UIAccessibilityContainerDataTableCell', 'UIAccessibilityContentSizeCategoryImageAdjusting', 'UIAccessibilityIdentification', 'UIAccessibilityReadingContent', 'UIActionSheetDelegate', 'UIActivityItemSource', 'UIActivityItemsConfigurationReading', 'UIAdaptivePresentationControllerDelegate', 'UIAlertViewDelegate', 'UIAppearance', 'UIAppearanceContainer', 'UIApplicationDelegate', 'UIBarPositioning', 'UIBarPositioningDelegate', 'UICloudSharingControllerDelegate', 'UICollectionViewDataSource', 'UICollectionViewDataSourcePrefetching', 'UICollectionViewDelegate', 'UICollectionViewDelegateFlowLayout', 'UICollectionViewDragDelegate', 'UICollectionViewDropCoordinator', 'UICollectionViewDropDelegate', 'UICollectionViewDropItem', 'UICollectionViewDropPlaceholderContext', 'UICollisionBehaviorDelegate', 'UIColorPickerViewControllerDelegate', 'UIConfigurationState', 'UIContentConfiguration', 'UIContentContainer', 'UIContentSizeCategoryAdjusting', 'UIContentView', 'UIContextMenuInteractionAnimating', 'UIContextMenuInteractionCommitAnimating', 'UIContextMenuInteractionDelegate', 'UICoordinateSpace', 'UIDataSourceModelAssociation', 'UIDataSourceTranslating', 'UIDocumentBrowserViewControllerDelegate', 'UIDocumentInteractionControllerDelegate', 'UIDocumentMenuDelegate', 'UIDocumentPickerDelegate', 'UIDragAnimating', 'UIDragDropSession', 'UIDragInteractionDelegate', 'UIDragSession', 'UIDropInteractionDelegate', 'UIDropSession', 'UIDynamicAnimatorDelegate', 'UIDynamicItem', 'UIFocusAnimationContext', 'UIFocusDebuggerOutput', 'UIFocusEnvironment', 'UIFocusItem', 'UIFocusItemContainer', 'UIFocusItemScrollableContainer', 'UIFontPickerViewControllerDelegate', 'UIGestureRecognizerDelegate', 'UIGuidedAccessRestrictionDelegate', 'UIImageConfiguration', 'UIImagePickerControllerDelegate', 'UIIndirectScribbleInteractionDelegate', 'UIInputViewAudioFeedback', 'UIInteraction', 'UIItemProviderPresentationSizeProviding', 'UIKeyInput', 'UILargeContentViewerInteractionDelegate', 'UILargeContentViewerItem', 'UILayoutSupport', 'UIMenuBuilder', 'UINavigationBarDelegate', 'UINavigationControllerDelegate', 'UIObjectRestoration', 'UIPageViewControllerDataSource', 'UIPageViewControllerDelegate', 'UIPasteConfigurationSupporting', 'UIPencilInteractionDelegate', 'UIPickerViewAccessibilityDelegate', 'UIPickerViewDataSource', 'UIPickerViewDelegate', 'UIPointerInteractionAnimating', 'UIPointerInteractionDelegate', 'UIPopoverBackgroundViewMethods', 'UIPopoverControllerDelegate', 'UIPopoverPresentationControllerDelegate', 'UIPreviewActionItem', 'UIPreviewInteractionDelegate', 'UIPrintInteractionControllerDelegate', 'UIPrinterPickerControllerDelegate', 'UIResponderStandardEditActions', 'UISceneDelegate', 'UIScreenshotServiceDelegate', 'UIScribbleInteractionDelegate', 'UIScrollViewAccessibilityDelegate', 'UIScrollViewDelegate', 'UISearchBarDelegate', 'UISearchControllerDelegate', 'UISearchDisplayDelegate', 'UISearchResultsUpdating', 'UISearchSuggestion', 'UISearchTextFieldDelegate', 'UISearchTextFieldPasteItem', 'UISplitViewControllerDelegate', 'UISpringLoadedInteractionBehavior', 'UISpringLoadedInteractionContext', 'UISpringLoadedInteractionEffect', 'UISpringLoadedInteractionSupporting', 'UIStateRestoring', 'UITabBarControllerDelegate', 'UITabBarDelegate', 'UITableViewDataSource', 'UITableViewDataSourcePrefetching', 'UITableViewDelegate', 'UITableViewDragDelegate', 'UITableViewDropCoordinator', 'UITableViewDropDelegate', 'UITableViewDropItem', 'UITableViewDropPlaceholderContext', 'UITextDocumentProxy', 'UITextDragDelegate', 'UITextDragRequest', 'UITextDraggable', 'UITextDropDelegate', 'UITextDropRequest', 'UITextDroppable', 'UITextFieldDelegate', 'UITextFormattingCoordinatorDelegate', 'UITextInput', 'UITextInputDelegate', 'UITextInputTokenizer', 'UITextInputTraits', 'UITextInteractionDelegate', 'UITextPasteConfigurationSupporting', 'UITextPasteDelegate', 'UITextPasteItem', 'UITextSelecting', 'UITextViewDelegate', 'UITimingCurveProvider', 'UIToolbarDelegate', 'UITraitEnvironment', 'UIUserActivityRestoring', 'UIVideoEditorControllerDelegate', 'UIViewAnimating', 'UIViewControllerAnimatedTransitioning', 'UIViewControllerContextTransitioning', 'UIViewControllerInteractiveTransitioning', 'UIViewControllerPreviewing', 'UIViewControllerPreviewingDelegate', 'UIViewControllerRestoration', 'UIViewControllerTransitionCoordinator', 'UIViewControllerTransitionCoordinatorContext', 'UIViewControllerTransitioningDelegate', 'UIViewImplicitlyAnimating', 'UIWebViewDelegate', 'UIWindowSceneDelegate', 'UNNotificationContentExtension', 'UNUserNotificationCenterDelegate', 'VNDocumentCameraViewControllerDelegate', 'VNFaceObservationAccepting', 'VNRequestProgressProviding', 'VNRequestRevisionProviding', 'VSAccountManagerDelegate', 'WCSessionDelegate', 'WKHTTPCookieStoreObserver', 'WKNavigationDelegate', 'WKPreviewActionItem', 'WKScriptMessageHandler', 'WKScriptMessageHandlerWithReply', 'WKUIDelegate', 'WKURLSchemeHandler', 'WKURLSchemeTask'}
+COCOA_PRIMITIVES = {'ACErrorCode', 'ALCcontext_struct', 'ALCdevice_struct', 'ALMXGlyphEntry', 'ALMXHeader', 'API_UNAVAILABLE', 'AUChannelInfo', 'AUDependentParameter', 'AUDistanceAttenuationData', 'AUHostIdentifier', 'AUHostVersionIdentifier', 'AUInputSamplesInOutputCallbackStruct', 'AUMIDIEvent', 'AUMIDIOutputCallbackStruct', 'AUNodeInteraction', 'AUNodeRenderCallback', 'AUNumVersion', 'AUParameterAutomationEvent', 'AUParameterEvent', 'AUParameterMIDIMapping', 'AUPreset', 'AUPresetEvent', 'AURecordedParameterEvent', 'AURenderCallbackStruct', 'AURenderEventHeader', 'AUSamplerBankPresetData', 'AUSamplerInstrumentData', 'AnchorPoint', 'AnchorPointTable', 'AnkrTable', 'AudioBalanceFade', 'AudioBuffer', 'AudioBufferList', 'AudioBytePacketTranslation', 'AudioChannelDescription', 'AudioChannelLayout', 'AudioClassDescription', 'AudioCodecMagicCookieInfo', 'AudioCodecPrimeInfo', 'AudioComponentDescription', 'AudioComponentPlugInInterface', 'AudioConverterPrimeInfo', 'AudioFileMarker', 'AudioFileMarkerList', 'AudioFilePacketTableInfo', 'AudioFileRegion', 'AudioFileRegionList', 'AudioFileTypeAndFormatID', 'AudioFile_SMPTE_Time', 'AudioFormatInfo', 'AudioFormatListItem', 'AudioFramePacketTranslation', 'AudioIndependentPacketTranslation', 'AudioOutputUnitMIDICallbacks', 'AudioOutputUnitStartAtTimeParams', 'AudioPacketDependencyInfoTranslation', 'AudioPacketRangeByteCountTranslation', 'AudioPacketRollDistanceTranslation', 'AudioPanningInfo', 'AudioQueueBuffer', 'AudioQueueChannelAssignment', 'AudioQueueLevelMeterState', 'AudioQueueParameterEvent', 'AudioStreamBasicDescription', 'AudioStreamPacketDescription', 'AudioTimeStamp', 'AudioUnitCocoaViewInfo', 'AudioUnitConnection', 'AudioUnitExternalBuffer', 'AudioUnitFrequencyResponseBin', 'AudioUnitMIDIControlMapping', 'AudioUnitMeterClipping', 'AudioUnitNodeConnection', 'AudioUnitOtherPluginDesc', 'AudioUnitParameter', 'AudioUnitParameterEvent', 'AudioUnitParameterHistoryInfo', 'AudioUnitParameterInfo', 'AudioUnitParameterNameInfo', 'AudioUnitParameterStringFromValue', 'AudioUnitParameterValueFromString', 'AudioUnitParameterValueName', 'AudioUnitParameterValueTranslation', 'AudioUnitPresetMAS_SettingData', 'AudioUnitPresetMAS_Settings', 'AudioUnitProperty', 'AudioUnitRenderContext', 'AudioValueRange', 'AudioValueTranslation', 'AuthorizationOpaqueRef', 'BslnFormat0Part', 'BslnFormat1Part', 'BslnFormat2Part', 'BslnFormat3Part', 'BslnTable', 'CABarBeatTime', 'CAFAudioDescription', 'CAFChunkHeader', 'CAFDataChunk', 'CAFFileHeader', 'CAFInfoStrings', 'CAFInstrumentChunk', 'CAFMarker', 'CAFMarkerChunk', 'CAFOverviewChunk', 'CAFOverviewSample', 'CAFPacketTableHeader', 'CAFPeakChunk', 'CAFPositionPeak', 'CAFRegion', 'CAFRegionChunk', 'CAFStringID', 'CAFStrings', 'CAFUMIDChunk', 'CAF_SMPTE_Time', 'CAF_UUID_ChunkHeader', 'CA_BOXABLE', 'CFHostClientContext', 'CFNetServiceClientContext', 'CF_BRIDGED_MUTABLE_TYPE', 'CF_BRIDGED_TYPE', 'CF_RELATED_TYPE', 'CGAffineTransform', 'CGDataConsumerCallbacks', 'CGDataProviderDirectCallbacks', 'CGDataProviderSequentialCallbacks', 'CGFunctionCallbacks', 'CGPDFArray', 'CGPDFContentStream', 'CGPDFDictionary', 'CGPDFObject', 'CGPDFOperatorTable', 'CGPDFScanner', 'CGPDFStream', 'CGPDFString', 'CGPathElement', 'CGPatternCallbacks', 'CGVector', 'CG_BOXABLE', 'CLLocationCoordinate2D', 'CM_BRIDGED_TYPE', 'CTParagraphStyleSetting', 'CVPlanarComponentInfo', 'CVPlanarPixelBufferInfo', 'CVPlanarPixelBufferInfo_YCbCrBiPlanar', 'CVPlanarPixelBufferInfo_YCbCrPlanar', 'CVSMPTETime', 'CV_BRIDGED_TYPE', 'ComponentInstanceRecord', 'ExtendedAudioFormatInfo', 'ExtendedControlEvent', 'ExtendedNoteOnEvent', 'ExtendedTempoEvent', 'FontVariation', 'GCQuaternion', 'GKBox', 'GKQuad', 'GKTriangle', 'GLKEffectPropertyPrv', 'HostCallbackInfo', 'IIO_BRIDGED_TYPE', 'IUnknownVTbl', 'JustDirectionTable', 'JustPCAction', 'JustPCActionSubrecord', 'JustPCConditionalAddAction', 'JustPCDecompositionAction', 'JustPCDuctilityAction', 'JustPCGlyphRepeatAddAction', 'JustPostcompTable', 'JustTable', 'JustWidthDeltaEntry', 'JustWidthDeltaGroup', 'KernIndexArrayHeader', 'KernKerningPair', 'KernOffsetTable', 'KernOrderedListEntry', 'KernOrderedListHeader', 'KernSimpleArrayHeader', 'KernStateEntry', 'KernStateHeader', 'KernSubtableHeader', 'KernTableHeader', 'KernVersion0Header', 'KernVersion0SubtableHeader', 'KerxAnchorPointAction', 'KerxControlPointAction', 'KerxControlPointEntry', 'KerxControlPointHeader', 'KerxCoordinateAction', 'KerxIndexArrayHeader', 'KerxKerningPair', 'KerxOrderedListEntry', 'KerxOrderedListHeader', 'KerxSimpleArrayHeader', 'KerxStateEntry', 'KerxStateHeader', 'KerxSubtableHeader', 'KerxTableHeader', 'LcarCaretClassEntry', 'LcarCaretTable', 'LtagStringRange', 'LtagTable', 'MDL_CLASS_EXPORT', 'MIDICIDeviceIdentification', 'MIDIChannelMessage', 'MIDIControlTransform', 'MIDIDriverInterface', 'MIDIEventList', 'MIDIEventPacket', 'MIDIIOErrorNotification', 'MIDIMessage_128', 'MIDIMessage_64', 'MIDIMessage_96', 'MIDIMetaEvent', 'MIDINoteMessage', 'MIDINotification', 'MIDIObjectAddRemoveNotification', 'MIDIObjectPropertyChangeNotification', 'MIDIPacket', 'MIDIPacketList', 'MIDIRawData', 'MIDISysexSendRequest', 'MIDIThruConnectionEndpoint', 'MIDIThruConnectionParams', 'MIDITransform', 'MIDIValueMap', 'MPSDeviceOptions', 'MixerDistanceParams', 'MortChain', 'MortContextualSubtable', 'MortFeatureEntry', 'MortInsertionSubtable', 'MortLigatureSubtable', 'MortRearrangementSubtable', 'MortSubtable', 'MortSwashSubtable', 'MortTable', 'MorxChain', 'MorxContextualSubtable', 'MorxInsertionSubtable', 'MorxLigatureSubtable', 'MorxRearrangementSubtable', 'MorxSubtable', 'MorxTable', 'MusicDeviceNoteParams', 'MusicDeviceStdNoteParams', 'MusicEventUserData', 'MusicTrackLoopInfo', 'NoteParamsControlValue', 'OpaqueAudioComponent', 'OpaqueAudioComponentInstance', 'OpaqueAudioConverter', 'OpaqueAudioQueue', 'OpaqueAudioQueueProcessingTap', 'OpaqueAudioQueueTimeline', 'OpaqueExtAudioFile', 'OpaqueJSClass', 'OpaqueJSContext', 'OpaqueJSContextGroup', 'OpaqueJSPropertyNameAccumulator', 'OpaqueJSPropertyNameArray', 'OpaqueJSString', 'OpaqueJSValue', 'OpaqueMusicEventIterator', 'OpaqueMusicPlayer', 'OpaqueMusicSequence', 'OpaqueMusicTrack', 'OpbdSideValues', 'OpbdTable', 'ParameterEvent', 'PropLookupSegment', 'PropLookupSingle', 'PropTable', 'ROTAGlyphEntry', 'ROTAHeader', 'SCNMatrix4', 'SCNVector3', 'SCNVector4', 'SFNTLookupArrayHeader', 'SFNTLookupBinarySearchHeader', 'SFNTLookupSegment', 'SFNTLookupSegmentHeader', 'SFNTLookupSingle', 'SFNTLookupSingleHeader', 'SFNTLookupTable', 'SFNTLookupTrimmedArrayHeader', 'SFNTLookupVectorHeader', 'SMPTETime', 'STClassTable', 'STEntryOne', 'STEntryTwo', 'STEntryZero', 'STHeader', 'STXEntryOne', 'STXEntryTwo', 'STXEntryZero', 'STXHeader', 'ScheduledAudioFileRegion', 'ScheduledAudioSlice', 'SecKeychainAttribute', 'SecKeychainAttributeInfo', 'SecKeychainAttributeList', 'TrakTable', 'TrakTableData', 'TrakTableEntry', 'UIAccessibility', 'VTDecompressionOutputCallbackRecord', 'VTInt32Point', 'VTInt32Size', '_CFHTTPAuthentication', '_GLKMatrix2', '_GLKMatrix3', '_GLKMatrix4', '_GLKQuaternion', '_GLKVector2', '_GLKVector3', '_GLKVector4', '_GLKVertexAttributeParameters', '_MTLAxisAlignedBoundingBox', '_MTLPackedFloat3', '_MTLPackedFloat4x3', '_NSRange', '_NSZone', '__CFHTTPMessage', '__CFHost', '__CFNetDiagnostic', '__CFNetService', '__CFNetServiceBrowser', '__CFNetServiceMonitor', '__CFXMLNode', '__CFXMLParser', '__GLsync', '__SecAccess', '__SecCertificate', '__SecIdentity', '__SecKey', '__SecRandom', '__attribute__', 'gss_OID_desc_struct', 'gss_OID_set_desc_struct', 'gss_auth_identity', 'gss_buffer_desc_struct', 'gss_buffer_set_desc_struct', 'gss_channel_bindings_struct', 'gss_cred_id_t_desc_struct', 'gss_ctx_id_t_desc_struct', 'gss_iov_buffer_desc_struct', 'gss_krb5_cfx_keydata', 'gss_krb5_lucid_context_v1', 'gss_krb5_lucid_context_version', 'gss_krb5_lucid_key', 'gss_krb5_rfc1964_keydata', 'gss_name_t_desc_struct', 'opaqueCMBufferQueueTriggerToken', 'sfntCMapEncoding', 'sfntCMapExtendedSubHeader', 'sfntCMapHeader', 'sfntCMapSubHeader', 'sfntDescriptorHeader', 'sfntDirectory', 'sfntDirectoryEntry', 'sfntFeatureHeader', 'sfntFeatureName', 'sfntFontDescriptor', 'sfntFontFeatureSetting', 'sfntFontRunFeature', 'sfntInstance', 'sfntNameHeader', 'sfntNameRecord', 'sfntVariationAxis', 'sfntVariationHeader'}
+
+if __name__ == '__main__':  # pragma: no cover
+    import os
+    import re
+
+    FRAMEWORKS_PATH = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/'
+    frameworks = os.listdir(FRAMEWORKS_PATH)
+
+    all_interfaces = set()
+    all_protocols  = set()
+    all_primitives = set()
+    for framework in frameworks:
+        frameworkHeadersDir = FRAMEWORKS_PATH + framework + '/Headers/'
+        if not os.path.exists(frameworkHeadersDir):
+            continue
+
+        headerFilenames = os.listdir(frameworkHeadersDir)
+
+        for f in headerFilenames:
+            if not f.endswith('.h'):
+                continue
+            headerFilePath = frameworkHeadersDir + f
+                
+            try:
+                with open(headerFilePath, encoding='utf-8') as f:
+                    content = f.read()
+            except UnicodeDecodeError:
+                print(f"Decoding error for file: {headerFilePath}")
+                continue
+                
+            res = re.findall(r'(?<=@interface )\w+', content)
+            for r in res:
+                all_interfaces.add(r)
+
+            res = re.findall(r'(?<=@protocol )\w+', content)
+            for r in res:
+                all_protocols.add(r)
+
+            res = re.findall(r'(?<=typedef enum )\w+', content)
+            for r in res:
+                all_primitives.add(r)
+
+            res = re.findall(r'(?<=typedef struct )\w+', content)
+            for r in res:
+                all_primitives.add(r)
+
+            res = re.findall(r'(?<=typedef const struct )\w+', content)
+            for r in res:
+                all_primitives.add(r)
+
+
+    print("ALL interfaces: \n")
+    print(sorted(list(all_interfaces)))
+
+    print("\nALL protocols: \n")
+    print(sorted(list(all_protocols)))
+
+    print("\nALL primitives: \n")
+    print(sorted(list(all_primitives)))
diff --git a/.venv/Lib/site-packages/pygments/lexers/_csound_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_csound_builtins.py
new file mode 100644 (file)
index 0000000..3431819
--- /dev/null
@@ -0,0 +1,1780 @@
+"""
+    pygments.lexers._csound_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+REMOVED_OPCODES = set('''
+OSCsendA
+beadsynt
+beosc
+buchla
+getrowlin
+lua_exec
+lua_iaopcall
+lua_iaopcall_off
+lua_ikopcall
+lua_ikopcall_off
+lua_iopcall
+lua_iopcall_off
+lua_opdef
+mp3scal_check
+mp3scal_load
+mp3scal_load2
+mp3scal_play
+mp3scal_play2
+pvsgendy
+socksend_k
+signalflowgraph
+sumTableFilter
+systime
+tabrowlin
+vbap1move
+'''.split())
+
+# Opcodes in Csound 6.18.0 using:
+#   python3 -c "
+#   import re
+#   from subprocess import Popen, PIPE
+#   output = Popen(['csound', '--list-opcodes0'], stderr=PIPE, text=True).communicate()[1]
+#   opcodes = output[re.search(r'^\$', output, re.M).end() : re.search(r'^\d+ opcodes\$', output, re.M).start()].split()
+#   output = Popen(['csound', '--list-opcodes2'], stderr=PIPE, text=True).communicate()[1]
+#   all_opcodes = output[re.search(r'^\$', output, re.M).end() : re.search(r'^\d+ opcodes\$', output, re.M).start()].split()
+#   deprecated_opcodes = [opcode for opcode in all_opcodes if opcode not in opcodes]
+#   # Remove opcodes that csound.py treats as keywords.
+#   keyword_opcodes = [
+#       'cggoto',   # https://csound.com/docs/manual/cggoto.html
+#       'cigoto',   # https://csound.com/docs/manual/cigoto.html
+#       'cingoto',  # (undocumented)
+#       'ckgoto',   # https://csound.com/docs/manual/ckgoto.html
+#       'cngoto',   # https://csound.com/docs/manual/cngoto.html
+#       'cnkgoto',  # (undocumented)
+#       'endin',    # https://csound.com/docs/manual/endin.html
+#       'endop',    # https://csound.com/docs/manual/endop.html
+#       'goto',     # https://csound.com/docs/manual/goto.html
+#       'igoto',    # https://csound.com/docs/manual/igoto.html
+#       'instr',    # https://csound.com/docs/manual/instr.html
+#       'kgoto',    # https://csound.com/docs/manual/kgoto.html
+#       'loop_ge',  # https://csound.com/docs/manual/loop_ge.html
+#       'loop_gt',  # https://csound.com/docs/manual/loop_gt.html
+#       'loop_le',  # https://csound.com/docs/manual/loop_le.html
+#       'loop_lt',  # https://csound.com/docs/manual/loop_lt.html
+#       'opcode',   # https://csound.com/docs/manual/opcode.html
+#       'reinit',   # https://csound.com/docs/manual/reinit.html
+#       'return',   # https://csound.com/docs/manual/return.html
+#       'rireturn', # https://csound.com/docs/manual/rireturn.html
+#       'rigoto',   # https://csound.com/docs/manual/rigoto.html
+#       'tigoto',   # https://csound.com/docs/manual/tigoto.html
+#       'timout'    # https://csound.com/docs/manual/timout.html
+#   ]
+#   opcodes = [opcode for opcode in opcodes if opcode not in keyword_opcodes]
+#   newline = '\n'
+#   print(f'''OPCODES = set(\'''
+#   {newline.join(opcodes)}
+#   \'''.split())
+#
+#   DEPRECATED_OPCODES = set(\'''
+#   {newline.join(deprecated_opcodes)}
+#   \'''.split())
+#   ''')
+#   "
+
+OPCODES = set('''
+ATSadd
+ATSaddnz
+ATSbufread
+ATScross
+ATSinfo
+ATSinterpread
+ATSpartialtap
+ATSread
+ATSreadnz
+ATSsinnoi
+FLbox
+FLbutBank
+FLbutton
+FLcloseButton
+FLcolor
+FLcolor2
+FLcount
+FLexecButton
+FLgetsnap
+FLgroup
+FLgroupEnd
+FLgroup_end
+FLhide
+FLhvsBox
+FLhvsBoxSetValue
+FLjoy
+FLkeyIn
+FLknob
+FLlabel
+FLloadsnap
+FLmouse
+FLpack
+FLpackEnd
+FLpack_end
+FLpanel
+FLpanelEnd
+FLpanel_end
+FLprintk
+FLprintk2
+FLroller
+FLrun
+FLsavesnap
+FLscroll
+FLscrollEnd
+FLscroll_end
+FLsetAlign
+FLsetBox
+FLsetColor
+FLsetColor2
+FLsetFont
+FLsetPosition
+FLsetSize
+FLsetSnapGroup
+FLsetText
+FLsetTextColor
+FLsetTextSize
+FLsetTextType
+FLsetVal
+FLsetVal_i
+FLsetVali
+FLsetsnap
+FLshow
+FLslidBnk
+FLslidBnk2
+FLslidBnk2Set
+FLslidBnk2Setk
+FLslidBnkGetHandle
+FLslidBnkSet
+FLslidBnkSetk
+FLslider
+FLtabs
+FLtabsEnd
+FLtabs_end
+FLtext
+FLupdate
+FLvalue
+FLvkeybd
+FLvslidBnk
+FLvslidBnk2
+FLxyin
+JackoAudioIn
+JackoAudioInConnect
+JackoAudioOut
+JackoAudioOutConnect
+JackoFreewheel
+JackoInfo
+JackoInit
+JackoMidiInConnect
+JackoMidiOut
+JackoMidiOutConnect
+JackoNoteOut
+JackoOn
+JackoTransport
+K35_hpf
+K35_lpf
+MixerClear
+MixerGetLevel
+MixerReceive
+MixerSend
+MixerSetLevel
+MixerSetLevel_i
+OSCbundle
+OSCcount
+OSCinit
+OSCinitM
+OSClisten
+OSCraw
+OSCsend
+OSCsend_lo
+S
+STKBandedWG
+STKBeeThree
+STKBlowBotl
+STKBlowHole
+STKBowed
+STKBrass
+STKClarinet
+STKDrummer
+STKFMVoices
+STKFlute
+STKHevyMetl
+STKMandolin
+STKModalBar
+STKMoog
+STKPercFlut
+STKPlucked
+STKResonate
+STKRhodey
+STKSaxofony
+STKShakers
+STKSimple
+STKSitar
+STKStifKarp
+STKTubeBell
+STKVoicForm
+STKWhistle
+STKWurley
+a
+abs
+active
+adsr
+adsyn
+adsynt
+adsynt2
+aftouch
+allpole
+alpass
+alwayson
+ampdb
+ampdbfs
+ampmidi
+ampmidicurve
+ampmidid
+apoleparams
+arduinoRead
+arduinoReadF
+arduinoStart
+arduinoStop
+areson
+aresonk
+atone
+atonek
+atonex
+autocorr
+babo
+balance
+balance2
+bamboo
+barmodel
+bbcutm
+bbcuts
+betarand
+bexprnd
+bformdec1
+bformdec2
+bformenc1
+binit
+biquad
+biquada
+birnd
+bob
+bpf
+bpfcos
+bqrez
+butbp
+butbr
+buthp
+butlp
+butterbp
+butterbr
+butterhp
+butterlp
+button
+buzz
+c2r
+cabasa
+cauchy
+cauchyi
+cbrt
+ceil
+cell
+cent
+centroid
+ceps
+cepsinv
+chanctrl
+changed
+changed2
+chani
+chano
+chebyshevpoly
+checkbox
+chn_S
+chn_a
+chn_k
+chnclear
+chnexport
+chnget
+chngeta
+chngeti
+chngetk
+chngetks
+chngets
+chnmix
+chnparams
+chnset
+chnseta
+chnseti
+chnsetk
+chnsetks
+chnsets
+chuap
+clear
+clfilt
+clip
+clockoff
+clockon
+cmp
+cmplxprod
+cntCreate
+cntCycles
+cntDelete
+cntDelete_i
+cntRead
+cntReset
+cntState
+comb
+combinv
+compilecsd
+compileorc
+compilestr
+compress
+compress2
+connect
+control
+convle
+convolve
+copya2ftab
+copyf2array
+cos
+cosh
+cosinv
+cosseg
+cossegb
+cossegr
+count
+count_i
+cps2pch
+cpsmidi
+cpsmidib
+cpsmidinn
+cpsoct
+cpspch
+cpstmid
+cpstun
+cpstuni
+cpsxpch
+cpumeter
+cpuprc
+cross2
+crossfm
+crossfmi
+crossfmpm
+crossfmpmi
+crosspm
+crosspmi
+crunch
+ctlchn
+ctrl14
+ctrl21
+ctrl7
+ctrlinit
+ctrlpreset
+ctrlprint
+ctrlprintpresets
+ctrlsave
+ctrlselect
+cuserrnd
+dam
+date
+dates
+db
+dbamp
+dbfsamp
+dcblock
+dcblock2
+dconv
+dct
+dctinv
+deinterleave
+delay
+delay1
+delayk
+delayr
+delayw
+deltap
+deltap3
+deltapi
+deltapn
+deltapx
+deltapxw
+denorm
+diff
+diode_ladder
+directory
+diskgrain
+diskin
+diskin2
+dispfft
+display
+distort
+distort1
+divz
+doppler
+dot
+downsamp
+dripwater
+dssiactivate
+dssiaudio
+dssictls
+dssiinit
+dssilist
+dumpk
+dumpk2
+dumpk3
+dumpk4
+duserrnd
+dust
+dust2
+elapsedcycles
+elapsedtime
+envlpx
+envlpxr
+ephasor
+eqfil
+evalstr
+event
+event_i
+eventcycles
+eventtime
+exciter
+exitnow
+exp
+expcurve
+expon
+exprand
+exprandi
+expseg
+expsega
+expsegb
+expsegba
+expsegr
+fareylen
+fareyleni
+faustaudio
+faustcompile
+faustctl
+faustdsp
+faustgen
+faustplay
+fft
+fftinv
+ficlose
+filebit
+filelen
+filenchnls
+filepeak
+filescal
+filesr
+filevalid
+fillarray
+filter2
+fin
+fini
+fink
+fiopen
+flanger
+flashtxt
+flooper
+flooper2
+floor
+fluidAllOut
+fluidCCi
+fluidCCk
+fluidControl
+fluidEngine
+fluidInfo
+fluidLoad
+fluidNote
+fluidOut
+fluidProgramSelect
+fluidSetInterpMethod
+fmanal
+fmax
+fmb3
+fmbell
+fmin
+fmmetal
+fmod
+fmpercfl
+fmrhode
+fmvoice
+fmwurlie
+fof
+fof2
+fofilter
+fog
+fold
+follow
+follow2
+foscil
+foscili
+fout
+fouti
+foutir
+foutk
+fprintks
+fprints
+frac
+fractalnoise
+framebuffer
+freeverb
+ftaudio
+ftchnls
+ftconv
+ftcps
+ftexists
+ftfree
+ftgen
+ftgenonce
+ftgentmp
+ftlen
+ftload
+ftloadk
+ftlptim
+ftmorf
+ftom
+ftprint
+ftresize
+ftresizei
+ftsamplebank
+ftsave
+ftsavek
+ftset
+ftslice
+ftslicei
+ftsr
+gain
+gainslider
+gauss
+gaussi
+gausstrig
+gbuzz
+genarray
+genarray_i
+gendy
+gendyc
+gendyx
+getcfg
+getcol
+getftargs
+getrow
+getseed
+gogobel
+grain
+grain2
+grain3
+granule
+gtadsr
+gtf
+guiro
+harmon
+harmon2
+harmon3
+harmon4
+hdf5read
+hdf5write
+hilbert
+hilbert2
+hrtfearly
+hrtfmove
+hrtfmove2
+hrtfreverb
+hrtfstat
+hsboscil
+hvs1
+hvs2
+hvs3
+hypot
+i
+ihold
+imagecreate
+imagefree
+imagegetpixel
+imageload
+imagesave
+imagesetpixel
+imagesize
+in
+in32
+inch
+inh
+init
+initc14
+initc21
+initc7
+inleta
+inletf
+inletk
+inletkid
+inletv
+ino
+inq
+inrg
+ins
+insglobal
+insremot
+int
+integ
+interleave
+interp
+invalue
+inx
+inz
+jacktransport
+jitter
+jitter2
+joystick
+jspline
+k
+la_i_add_mc
+la_i_add_mr
+la_i_add_vc
+la_i_add_vr
+la_i_assign_mc
+la_i_assign_mr
+la_i_assign_t
+la_i_assign_vc
+la_i_assign_vr
+la_i_conjugate_mc
+la_i_conjugate_mr
+la_i_conjugate_vc
+la_i_conjugate_vr
+la_i_distance_vc
+la_i_distance_vr
+la_i_divide_mc
+la_i_divide_mr
+la_i_divide_vc
+la_i_divide_vr
+la_i_dot_mc
+la_i_dot_mc_vc
+la_i_dot_mr
+la_i_dot_mr_vr
+la_i_dot_vc
+la_i_dot_vr
+la_i_get_mc
+la_i_get_mr
+la_i_get_vc
+la_i_get_vr
+la_i_invert_mc
+la_i_invert_mr
+la_i_lower_solve_mc
+la_i_lower_solve_mr
+la_i_lu_det_mc
+la_i_lu_det_mr
+la_i_lu_factor_mc
+la_i_lu_factor_mr
+la_i_lu_solve_mc
+la_i_lu_solve_mr
+la_i_mc_create
+la_i_mc_set
+la_i_mr_create
+la_i_mr_set
+la_i_multiply_mc
+la_i_multiply_mr
+la_i_multiply_vc
+la_i_multiply_vr
+la_i_norm1_mc
+la_i_norm1_mr
+la_i_norm1_vc
+la_i_norm1_vr
+la_i_norm_euclid_mc
+la_i_norm_euclid_mr
+la_i_norm_euclid_vc
+la_i_norm_euclid_vr
+la_i_norm_inf_mc
+la_i_norm_inf_mr
+la_i_norm_inf_vc
+la_i_norm_inf_vr
+la_i_norm_max_mc
+la_i_norm_max_mr
+la_i_print_mc
+la_i_print_mr
+la_i_print_vc
+la_i_print_vr
+la_i_qr_eigen_mc
+la_i_qr_eigen_mr
+la_i_qr_factor_mc
+la_i_qr_factor_mr
+la_i_qr_sym_eigen_mc
+la_i_qr_sym_eigen_mr
+la_i_random_mc
+la_i_random_mr
+la_i_random_vc
+la_i_random_vr
+la_i_size_mc
+la_i_size_mr
+la_i_size_vc
+la_i_size_vr
+la_i_subtract_mc
+la_i_subtract_mr
+la_i_subtract_vc
+la_i_subtract_vr
+la_i_t_assign
+la_i_trace_mc
+la_i_trace_mr
+la_i_transpose_mc
+la_i_transpose_mr
+la_i_upper_solve_mc
+la_i_upper_solve_mr
+la_i_vc_create
+la_i_vc_set
+la_i_vr_create
+la_i_vr_set
+la_k_a_assign
+la_k_add_mc
+la_k_add_mr
+la_k_add_vc
+la_k_add_vr
+la_k_assign_a
+la_k_assign_f
+la_k_assign_mc
+la_k_assign_mr
+la_k_assign_t
+la_k_assign_vc
+la_k_assign_vr
+la_k_conjugate_mc
+la_k_conjugate_mr
+la_k_conjugate_vc
+la_k_conjugate_vr
+la_k_current_f
+la_k_current_vr
+la_k_distance_vc
+la_k_distance_vr
+la_k_divide_mc
+la_k_divide_mr
+la_k_divide_vc
+la_k_divide_vr
+la_k_dot_mc
+la_k_dot_mc_vc
+la_k_dot_mr
+la_k_dot_mr_vr
+la_k_dot_vc
+la_k_dot_vr
+la_k_f_assign
+la_k_get_mc
+la_k_get_mr
+la_k_get_vc
+la_k_get_vr
+la_k_invert_mc
+la_k_invert_mr
+la_k_lower_solve_mc
+la_k_lower_solve_mr
+la_k_lu_det_mc
+la_k_lu_det_mr
+la_k_lu_factor_mc
+la_k_lu_factor_mr
+la_k_lu_solve_mc
+la_k_lu_solve_mr
+la_k_mc_set
+la_k_mr_set
+la_k_multiply_mc
+la_k_multiply_mr
+la_k_multiply_vc
+la_k_multiply_vr
+la_k_norm1_mc
+la_k_norm1_mr
+la_k_norm1_vc
+la_k_norm1_vr
+la_k_norm_euclid_mc
+la_k_norm_euclid_mr
+la_k_norm_euclid_vc
+la_k_norm_euclid_vr
+la_k_norm_inf_mc
+la_k_norm_inf_mr
+la_k_norm_inf_vc
+la_k_norm_inf_vr
+la_k_norm_max_mc
+la_k_norm_max_mr
+la_k_qr_eigen_mc
+la_k_qr_eigen_mr
+la_k_qr_factor_mc
+la_k_qr_factor_mr
+la_k_qr_sym_eigen_mc
+la_k_qr_sym_eigen_mr
+la_k_random_mc
+la_k_random_mr
+la_k_random_vc
+la_k_random_vr
+la_k_subtract_mc
+la_k_subtract_mr
+la_k_subtract_vc
+la_k_subtract_vr
+la_k_t_assign
+la_k_trace_mc
+la_k_trace_mr
+la_k_upper_solve_mc
+la_k_upper_solve_mr
+la_k_vc_set
+la_k_vr_set
+lag
+lagud
+lastcycle
+lenarray
+lfo
+lfsr
+limit
+limit1
+lincos
+line
+linen
+linenr
+lineto
+link_beat_force
+link_beat_get
+link_beat_request
+link_create
+link_enable
+link_is_enabled
+link_metro
+link_peers
+link_tempo_get
+link_tempo_set
+linlin
+linrand
+linseg
+linsegb
+linsegr
+liveconv
+locsend
+locsig
+log
+log10
+log2
+logbtwo
+logcurve
+loopseg
+loopsegp
+looptseg
+loopxseg
+lorenz
+loscil
+loscil3
+loscil3phs
+loscilphs
+loscilx
+lowpass2
+lowres
+lowresx
+lpcanal
+lpcfilter
+lpf18
+lpform
+lpfreson
+lphasor
+lpinterp
+lposcil
+lposcil3
+lposcila
+lposcilsa
+lposcilsa2
+lpread
+lpreson
+lpshold
+lpsholdp
+lpslot
+lufs
+mac
+maca
+madsr
+mags
+mandel
+mandol
+maparray
+maparray_i
+marimba
+massign
+max
+max_k
+maxabs
+maxabsaccum
+maxaccum
+maxalloc
+maxarray
+mclock
+mdelay
+median
+mediank
+metro
+metro2
+metrobpm
+mfb
+midglobal
+midiarp
+midic14
+midic21
+midic7
+midichannelaftertouch
+midichn
+midicontrolchange
+midictrl
+mididefault
+midifilestatus
+midiin
+midinoteoff
+midinoteoncps
+midinoteonkey
+midinoteonoct
+midinoteonpch
+midion
+midion2
+midiout
+midiout_i
+midipgm
+midipitchbend
+midipolyaftertouch
+midiprogramchange
+miditempo
+midremot
+min
+minabs
+minabsaccum
+minaccum
+minarray
+mincer
+mirror
+mode
+modmatrix
+monitor
+moog
+moogladder
+moogladder2
+moogvcf
+moogvcf2
+moscil
+mp3bitrate
+mp3in
+mp3len
+mp3nchnls
+mp3out
+mp3scal
+mp3sr
+mpulse
+mrtmsg
+ms2st
+mtof
+mton
+multitap
+mute
+mvchpf
+mvclpf1
+mvclpf2
+mvclpf3
+mvclpf4
+mvmfilter
+mxadsr
+nchnls_hw
+nestedap
+nlalp
+nlfilt
+nlfilt2
+noise
+noteoff
+noteon
+noteondur
+noteondur2
+notnum
+nreverb
+nrpn
+nsamp
+nstance
+nstrnum
+nstrstr
+ntof
+ntom
+ntrpol
+nxtpow2
+octave
+octcps
+octmidi
+octmidib
+octmidinn
+octpch
+olabuffer
+oscbnk
+oscil
+oscil1
+oscil1i
+oscil3
+oscili
+oscilikt
+osciliktp
+oscilikts
+osciln
+oscils
+oscilx
+out
+out32
+outall
+outc
+outch
+outh
+outiat
+outic
+outic14
+outipat
+outipb
+outipc
+outkat
+outkc
+outkc14
+outkpat
+outkpb
+outkpc
+outleta
+outletf
+outletk
+outletkid
+outletv
+outo
+outq
+outq1
+outq2
+outq3
+outq4
+outrg
+outs
+outs1
+outs2
+outvalue
+outx
+outz
+p
+p5gconnect
+p5gdata
+pan
+pan2
+pareq
+part2txt
+partials
+partikkel
+partikkelget
+partikkelset
+partikkelsync
+passign
+paulstretch
+pcauchy
+pchbend
+pchmidi
+pchmidib
+pchmidinn
+pchoct
+pchtom
+pconvolve
+pcount
+pdclip
+pdhalf
+pdhalfy
+peak
+pgmassign
+pgmchn
+phaser1
+phaser2
+phasor
+phasorbnk
+phs
+pindex
+pinker
+pinkish
+pitch
+pitchac
+pitchamdf
+planet
+platerev
+plltrack
+pluck
+poisson
+pol2rect
+polyaft
+polynomial
+port
+portk
+poscil
+poscil3
+pow
+powershape
+powoftwo
+pows
+prealloc
+prepiano
+print
+print_type
+printarray
+printf
+printf_i
+printk
+printk2
+printks
+printks2
+println
+prints
+printsk
+product
+pset
+ptablew
+ptrack
+puts
+pvadd
+pvbufread
+pvcross
+pvinterp
+pvoc
+pvread
+pvs2array
+pvs2tab
+pvsadsyn
+pvsanal
+pvsarp
+pvsbandp
+pvsbandr
+pvsbandwidth
+pvsbin
+pvsblur
+pvsbuffer
+pvsbufread
+pvsbufread2
+pvscale
+pvscent
+pvsceps
+pvscfs
+pvscross
+pvsdemix
+pvsdiskin
+pvsdisp
+pvsenvftw
+pvsfilter
+pvsfread
+pvsfreeze
+pvsfromarray
+pvsftr
+pvsftw
+pvsfwrite
+pvsgain
+pvsgendy
+pvshift
+pvsifd
+pvsin
+pvsinfo
+pvsinit
+pvslock
+pvslpc
+pvsmaska
+pvsmix
+pvsmooth
+pvsmorph
+pvsosc
+pvsout
+pvspitch
+pvstanal
+pvstencil
+pvstrace
+pvsvoc
+pvswarp
+pvsynth
+pwd
+pyassign
+pyassigni
+pyassignt
+pycall
+pycall1
+pycall1i
+pycall1t
+pycall2
+pycall2i
+pycall2t
+pycall3
+pycall3i
+pycall3t
+pycall4
+pycall4i
+pycall4t
+pycall5
+pycall5i
+pycall5t
+pycall6
+pycall6i
+pycall6t
+pycall7
+pycall7i
+pycall7t
+pycall8
+pycall8i
+pycall8t
+pycalli
+pycalln
+pycallni
+pycallt
+pyeval
+pyevali
+pyevalt
+pyexec
+pyexeci
+pyexect
+pyinit
+pylassign
+pylassigni
+pylassignt
+pylcall
+pylcall1
+pylcall1i
+pylcall1t
+pylcall2
+pylcall2i
+pylcall2t
+pylcall3
+pylcall3i
+pylcall3t
+pylcall4
+pylcall4i
+pylcall4t
+pylcall5
+pylcall5i
+pylcall5t
+pylcall6
+pylcall6i
+pylcall6t
+pylcall7
+pylcall7i
+pylcall7t
+pylcall8
+pylcall8i
+pylcall8t
+pylcalli
+pylcalln
+pylcallni
+pylcallt
+pyleval
+pylevali
+pylevalt
+pylexec
+pylexeci
+pylexect
+pylrun
+pylruni
+pylrunt
+pyrun
+pyruni
+pyrunt
+qinf
+qnan
+r2c
+rand
+randc
+randh
+randi
+random
+randomh
+randomi
+rbjeq
+readclock
+readf
+readfi
+readk
+readk2
+readk3
+readk4
+readks
+readscore
+readscratch
+rect2pol
+release
+remoteport
+remove
+repluck
+reshapearray
+reson
+resonbnk
+resonk
+resonr
+resonx
+resonxk
+resony
+resonz
+resyn
+reverb
+reverb2
+reverbsc
+rewindscore
+rezzy
+rfft
+rifft
+rms
+rnd
+rnd31
+rndseed
+round
+rspline
+rtclock
+s16b14
+s32b14
+samphold
+sandpaper
+sc_lag
+sc_lagud
+sc_phasor
+sc_trig
+scale
+scale2
+scalearray
+scanhammer
+scanmap
+scans
+scansmap
+scantable
+scanu
+scanu2
+schedkwhen
+schedkwhennamed
+schedule
+schedulek
+schedwhen
+scoreline
+scoreline_i
+seed
+sekere
+select
+semitone
+sense
+sensekey
+seqtime
+seqtime2
+sequ
+sequstate
+serialBegin
+serialEnd
+serialFlush
+serialPrint
+serialRead
+serialWrite
+serialWrite_i
+setcol
+setctrl
+setksmps
+setrow
+setscorepos
+sfilist
+sfinstr
+sfinstr3
+sfinstr3m
+sfinstrm
+sfload
+sflooper
+sfpassign
+sfplay
+sfplay3
+sfplay3m
+sfplaym
+sfplist
+sfpreset
+shaker
+shiftin
+shiftout
+signum
+sin
+sinh
+sininv
+sinsyn
+skf
+sleighbells
+slicearray
+slicearray_i
+slider16
+slider16f
+slider16table
+slider16tablef
+slider32
+slider32f
+slider32table
+slider32tablef
+slider64
+slider64f
+slider64table
+slider64tablef
+slider8
+slider8f
+slider8table
+slider8tablef
+sliderKawai
+sndloop
+sndwarp
+sndwarpst
+sockrecv
+sockrecvs
+socksend
+socksends
+sorta
+sortd
+soundin
+space
+spat3d
+spat3di
+spat3dt
+spdist
+spf
+splitrig
+sprintf
+sprintfk
+spsend
+sqrt
+squinewave
+st2ms
+statevar
+sterrain
+stix
+strcat
+strcatk
+strchar
+strchark
+strcmp
+strcmpk
+strcpy
+strcpyk
+strecv
+streson
+strfromurl
+strget
+strindex
+strindexk
+string2array
+strlen
+strlenk
+strlower
+strlowerk
+strrindex
+strrindexk
+strset
+strstrip
+strsub
+strsubk
+strtod
+strtodk
+strtol
+strtolk
+strupper
+strupperk
+stsend
+subinstr
+subinstrinit
+sum
+sumarray
+svfilter
+svn
+syncgrain
+syncloop
+syncphasor
+system
+system_i
+tab
+tab2array
+tab2pvs
+tab_i
+tabifd
+table
+table3
+table3kt
+tablecopy
+tablefilter
+tablefilteri
+tablegpw
+tablei
+tableicopy
+tableigpw
+tableikt
+tableimix
+tablekt
+tablemix
+tableng
+tablera
+tableseg
+tableshuffle
+tableshufflei
+tablew
+tablewa
+tablewkt
+tablexkt
+tablexseg
+tabmorph
+tabmorpha
+tabmorphak
+tabmorphi
+tabplay
+tabrec
+tabsum
+tabw
+tabw_i
+tambourine
+tan
+tanh
+taninv
+taninv2
+tbvcf
+tempest
+tempo
+temposcal
+tempoval
+timedseq
+timeinstk
+timeinsts
+timek
+times
+tival
+tlineto
+tone
+tonek
+tonex
+tradsyn
+trandom
+transeg
+transegb
+transegr
+trcross
+trfilter
+trhighest
+trigExpseg
+trigLinseg
+trigexpseg
+trigger
+trighold
+triglinseg
+trigphasor
+trigseq
+trim
+trim_i
+trirand
+trlowest
+trmix
+trscale
+trshift
+trsplit
+turnoff
+turnoff2
+turnoff2_i
+turnoff3
+turnon
+tvconv
+unirand
+unwrap
+upsamp
+urandom
+urd
+vactrol
+vadd
+vadd_i
+vaddv
+vaddv_i
+vaget
+valpass
+vaset
+vbap
+vbapg
+vbapgmove
+vbaplsinit
+vbapmove
+vbapz
+vbapzmove
+vcella
+vclpf
+vco
+vco2
+vco2ft
+vco2ift
+vco2init
+vcomb
+vcopy
+vcopy_i
+vdel_k
+vdelay
+vdelay3
+vdelayk
+vdelayx
+vdelayxq
+vdelayxs
+vdelayxw
+vdelayxwq
+vdelayxws
+vdivv
+vdivv_i
+vecdelay
+veloc
+vexp
+vexp_i
+vexpseg
+vexpv
+vexpv_i
+vibes
+vibr
+vibrato
+vincr
+vlimit
+vlinseg
+vlowres
+vmap
+vmirror
+vmult
+vmult_i
+vmultv
+vmultv_i
+voice
+vosim
+vphaseseg
+vport
+vpow
+vpow_i
+vpowv
+vpowv_i
+vps
+vpvoc
+vrandh
+vrandi
+vsubv
+vsubv_i
+vtaba
+vtabi
+vtabk
+vtable1k
+vtablea
+vtablei
+vtablek
+vtablewa
+vtablewi
+vtablewk
+vtabwa
+vtabwi
+vtabwk
+vwrap
+waveset
+websocket
+weibull
+wgbow
+wgbowedbar
+wgbrass
+wgclar
+wgflute
+wgpluck
+wgpluck2
+wguide1
+wguide2
+wiiconnect
+wiidata
+wiirange
+wiisend
+window
+wrap
+writescratch
+wterrain
+wterrain2
+xadsr
+xin
+xout
+xtratim
+xyscale
+zacl
+zakinit
+zamod
+zar
+zarg
+zaw
+zawm
+zdf_1pole
+zdf_1pole_mode
+zdf_2pole
+zdf_2pole_mode
+zdf_ladder
+zfilter2
+zir
+ziw
+ziwm
+zkcl
+zkmod
+zkr
+zkw
+zkwm
+'''.split())
+
+DEPRECATED_OPCODES = set('''
+array
+bformdec
+bformenc
+copy2ftab
+copy2ttab
+hrtfer
+ktableseg
+lentab
+maxtab
+mintab
+pop
+pop_f
+ptable
+ptable3
+ptablei
+ptableiw
+push
+push_f
+scalet
+sndload
+soundout
+soundouts
+specaddm
+specdiff
+specdisp
+specfilt
+spechist
+specptrk
+specscal
+specsum
+spectrum
+stack
+sumtab
+tabgen
+tableiw
+tabmap
+tabmap_i
+tabslice
+tb0
+tb0_init
+tb1
+tb10
+tb10_init
+tb11
+tb11_init
+tb12
+tb12_init
+tb13
+tb13_init
+tb14
+tb14_init
+tb15
+tb15_init
+tb1_init
+tb2
+tb2_init
+tb3
+tb3_init
+tb4
+tb4_init
+tb5
+tb5_init
+tb6
+tb6_init
+tb7
+tb7_init
+tb8
+tb8_init
+tb9
+tb9_init
+vbap16
+vbap4
+vbap4move
+vbap8
+vbap8move
+xscanmap
+xscans
+xscansmap
+xscanu
+xyin
+'''.split())
diff --git a/.venv/Lib/site-packages/pygments/lexers/_css_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_css_builtins.py
new file mode 100644 (file)
index 0000000..7295319
--- /dev/null
@@ -0,0 +1,558 @@
+"""
+    pygments.lexers._css_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file is autogenerated by scripts/get_css_properties.py
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+_css_properties = (
+    '-webkit-line-clamp',
+    'accent-color',
+    'align-content',
+    'align-items',
+    'align-self',
+    'alignment-baseline',
+    'all',
+    'animation',
+    'animation-delay',
+    'animation-direction',
+    'animation-duration',
+    'animation-fill-mode',
+    'animation-iteration-count',
+    'animation-name',
+    'animation-play-state',
+    'animation-timing-function',
+    'appearance',
+    'aspect-ratio',
+    'azimuth',
+    'backface-visibility',
+    'background',
+    'background-attachment',
+    'background-blend-mode',
+    'background-clip',
+    'background-color',
+    'background-image',
+    'background-origin',
+    'background-position',
+    'background-repeat',
+    'background-size',
+    'baseline-shift',
+    'baseline-source',
+    'block-ellipsis',
+    'block-size',
+    'block-step',
+    'block-step-align',
+    'block-step-insert',
+    'block-step-round',
+    'block-step-size',
+    'bookmark-label',
+    'bookmark-level',
+    'bookmark-state',
+    'border',
+    'border-block',
+    'border-block-color',
+    'border-block-end',
+    'border-block-end-color',
+    'border-block-end-style',
+    'border-block-end-width',
+    'border-block-start',
+    'border-block-start-color',
+    'border-block-start-style',
+    'border-block-start-width',
+    'border-block-style',
+    'border-block-width',
+    'border-bottom',
+    'border-bottom-color',
+    'border-bottom-left-radius',
+    'border-bottom-right-radius',
+    'border-bottom-style',
+    'border-bottom-width',
+    'border-boundary',
+    'border-collapse',
+    'border-color',
+    'border-end-end-radius',
+    'border-end-start-radius',
+    'border-image',
+    'border-image-outset',
+    'border-image-repeat',
+    'border-image-slice',
+    'border-image-source',
+    'border-image-width',
+    'border-inline',
+    'border-inline-color',
+    'border-inline-end',
+    'border-inline-end-color',
+    'border-inline-end-style',
+    'border-inline-end-width',
+    'border-inline-start',
+    'border-inline-start-color',
+    'border-inline-start-style',
+    'border-inline-start-width',
+    'border-inline-style',
+    'border-inline-width',
+    'border-left',
+    'border-left-color',
+    'border-left-style',
+    'border-left-width',
+    'border-radius',
+    'border-right',
+    'border-right-color',
+    'border-right-style',
+    'border-right-width',
+    'border-spacing',
+    'border-start-end-radius',
+    'border-start-start-radius',
+    'border-style',
+    'border-top',
+    'border-top-color',
+    'border-top-left-radius',
+    'border-top-right-radius',
+    'border-top-style',
+    'border-top-width',
+    'border-width',
+    'bottom',
+    'box-decoration-break',
+    'box-shadow',
+    'box-sizing',
+    'box-snap',
+    'break-after',
+    'break-before',
+    'break-inside',
+    'caption-side',
+    'caret',
+    'caret-color',
+    'caret-shape',
+    'chains',
+    'clear',
+    'clip',
+    'clip-path',
+    'clip-rule',
+    'color',
+    'color-adjust',
+    'color-interpolation-filters',
+    'color-scheme',
+    'column-count',
+    'column-fill',
+    'column-gap',
+    'column-rule',
+    'column-rule-color',
+    'column-rule-style',
+    'column-rule-width',
+    'column-span',
+    'column-width',
+    'columns',
+    'contain',
+    'contain-intrinsic-block-size',
+    'contain-intrinsic-height',
+    'contain-intrinsic-inline-size',
+    'contain-intrinsic-size',
+    'contain-intrinsic-width',
+    'container',
+    'container-name',
+    'container-type',
+    'content',
+    'content-visibility',
+    'continue',
+    'counter-increment',
+    'counter-reset',
+    'counter-set',
+    'cue',
+    'cue-after',
+    'cue-before',
+    'cursor',
+    'direction',
+    'display',
+    'dominant-baseline',
+    'elevation',
+    'empty-cells',
+    'fill',
+    'fill-break',
+    'fill-color',
+    'fill-image',
+    'fill-opacity',
+    'fill-origin',
+    'fill-position',
+    'fill-repeat',
+    'fill-rule',
+    'fill-size',
+    'filter',
+    'flex',
+    'flex-basis',
+    'flex-direction',
+    'flex-flow',
+    'flex-grow',
+    'flex-shrink',
+    'flex-wrap',
+    'float',
+    'float-defer',
+    'float-offset',
+    'float-reference',
+    'flood-color',
+    'flood-opacity',
+    'flow',
+    'flow-from',
+    'flow-into',
+    'font',
+    'font-family',
+    'font-feature-settings',
+    'font-kerning',
+    'font-language-override',
+    'font-optical-sizing',
+    'font-palette',
+    'font-size',
+    'font-size-adjust',
+    'font-stretch',
+    'font-style',
+    'font-synthesis',
+    'font-synthesis-small-caps',
+    'font-synthesis-style',
+    'font-synthesis-weight',
+    'font-variant',
+    'font-variant-alternates',
+    'font-variant-caps',
+    'font-variant-east-asian',
+    'font-variant-emoji',
+    'font-variant-ligatures',
+    'font-variant-numeric',
+    'font-variant-position',
+    'font-variation-settings',
+    'font-weight',
+    'footnote-display',
+    'footnote-policy',
+    'forced-color-adjust',
+    'gap',
+    'glyph-orientation-vertical',
+    'grid',
+    'grid-area',
+    'grid-auto-columns',
+    'grid-auto-flow',
+    'grid-auto-rows',
+    'grid-column',
+    'grid-column-end',
+    'grid-column-start',
+    'grid-row',
+    'grid-row-end',
+    'grid-row-start',
+    'grid-template',
+    'grid-template-areas',
+    'grid-template-columns',
+    'grid-template-rows',
+    'hanging-punctuation',
+    'height',
+    'hyphenate-character',
+    'hyphenate-limit-chars',
+    'hyphenate-limit-last',
+    'hyphenate-limit-lines',
+    'hyphenate-limit-zone',
+    'hyphens',
+    'image-orientation',
+    'image-rendering',
+    'image-resolution',
+    'initial-letter',
+    'initial-letter-align',
+    'initial-letter-wrap',
+    'inline-size',
+    'inline-sizing',
+    'input-security',
+    'inset',
+    'inset-block',
+    'inset-block-end',
+    'inset-block-start',
+    'inset-inline',
+    'inset-inline-end',
+    'inset-inline-start',
+    'isolation',
+    'justify-content',
+    'justify-items',
+    'justify-self',
+    'leading-trim',
+    'left',
+    'letter-spacing',
+    'lighting-color',
+    'line-break',
+    'line-clamp',
+    'line-grid',
+    'line-height',
+    'line-height-step',
+    'line-padding',
+    'line-snap',
+    'list-style',
+    'list-style-image',
+    'list-style-position',
+    'list-style-type',
+    'margin',
+    'margin-block',
+    'margin-block-end',
+    'margin-block-start',
+    'margin-bottom',
+    'margin-break',
+    'margin-inline',
+    'margin-inline-end',
+    'margin-inline-start',
+    'margin-left',
+    'margin-right',
+    'margin-top',
+    'margin-trim',
+    'marker',
+    'marker-end',
+    'marker-knockout-left',
+    'marker-knockout-right',
+    'marker-mid',
+    'marker-pattern',
+    'marker-segment',
+    'marker-side',
+    'marker-start',
+    'mask',
+    'mask-border',
+    'mask-border-mode',
+    'mask-border-outset',
+    'mask-border-repeat',
+    'mask-border-slice',
+    'mask-border-source',
+    'mask-border-width',
+    'mask-clip',
+    'mask-composite',
+    'mask-image',
+    'mask-mode',
+    'mask-origin',
+    'mask-position',
+    'mask-repeat',
+    'mask-size',
+    'mask-type',
+    'max-block-size',
+    'max-height',
+    'max-inline-size',
+    'max-lines',
+    'max-width',
+    'min-block-size',
+    'min-height',
+    'min-inline-size',
+    'min-intrinsic-sizing',
+    'min-width',
+    'mix-blend-mode',
+    'nav-down',
+    'nav-left',
+    'nav-right',
+    'nav-up',
+    'object-fit',
+    'object-overflow',
+    'object-position',
+    'object-view-box',
+    'offset',
+    'offset-anchor',
+    'offset-distance',
+    'offset-path',
+    'offset-position',
+    'offset-rotate',
+    'opacity',
+    'order',
+    'orphans',
+    'outline',
+    'outline-color',
+    'outline-offset',
+    'outline-style',
+    'outline-width',
+    'overflow',
+    'overflow-anchor',
+    'overflow-block',
+    'overflow-clip-margin',
+    'overflow-inline',
+    'overflow-wrap',
+    'overflow-x',
+    'overflow-y',
+    'overscroll-behavior',
+    'overscroll-behavior-block',
+    'overscroll-behavior-inline',
+    'overscroll-behavior-x',
+    'overscroll-behavior-y',
+    'padding',
+    'padding-block',
+    'padding-block-end',
+    'padding-block-start',
+    'padding-bottom',
+    'padding-inline',
+    'padding-inline-end',
+    'padding-inline-start',
+    'padding-left',
+    'padding-right',
+    'padding-top',
+    'page',
+    'page-break-after',
+    'page-break-before',
+    'page-break-inside',
+    'pause',
+    'pause-after',
+    'pause-before',
+    'perspective',
+    'perspective-origin',
+    'pitch',
+    'pitch-range',
+    'place-content',
+    'place-items',
+    'place-self',
+    'play-during',
+    'pointer-events',
+    'position',
+    'print-color-adjust',
+    'property-name',
+    'quotes',
+    'region-fragment',
+    'resize',
+    'rest',
+    'rest-after',
+    'rest-before',
+    'richness',
+    'right',
+    'rotate',
+    'row-gap',
+    'ruby-align',
+    'ruby-merge',
+    'ruby-overhang',
+    'ruby-position',
+    'running',
+    'scale',
+    'scroll-behavior',
+    'scroll-margin',
+    'scroll-margin-block',
+    'scroll-margin-block-end',
+    'scroll-margin-block-start',
+    'scroll-margin-bottom',
+    'scroll-margin-inline',
+    'scroll-margin-inline-end',
+    'scroll-margin-inline-start',
+    'scroll-margin-left',
+    'scroll-margin-right',
+    'scroll-margin-top',
+    'scroll-padding',
+    'scroll-padding-block',
+    'scroll-padding-block-end',
+    'scroll-padding-block-start',
+    'scroll-padding-bottom',
+    'scroll-padding-inline',
+    'scroll-padding-inline-end',
+    'scroll-padding-inline-start',
+    'scroll-padding-left',
+    'scroll-padding-right',
+    'scroll-padding-top',
+    'scroll-snap-align',
+    'scroll-snap-stop',
+    'scroll-snap-type',
+    'scrollbar-color',
+    'scrollbar-gutter',
+    'scrollbar-width',
+    'shape-image-threshold',
+    'shape-inside',
+    'shape-margin',
+    'shape-outside',
+    'spatial-navigation-action',
+    'spatial-navigation-contain',
+    'spatial-navigation-function',
+    'speak',
+    'speak-as',
+    'speak-header',
+    'speak-numeral',
+    'speak-punctuation',
+    'speech-rate',
+    'stress',
+    'string-set',
+    'stroke',
+    'stroke-align',
+    'stroke-alignment',
+    'stroke-break',
+    'stroke-color',
+    'stroke-dash-corner',
+    'stroke-dash-justify',
+    'stroke-dashadjust',
+    'stroke-dasharray',
+    'stroke-dashcorner',
+    'stroke-dashoffset',
+    'stroke-image',
+    'stroke-linecap',
+    'stroke-linejoin',
+    'stroke-miterlimit',
+    'stroke-opacity',
+    'stroke-origin',
+    'stroke-position',
+    'stroke-repeat',
+    'stroke-size',
+    'stroke-width',
+    'tab-size',
+    'table-layout',
+    'text-align',
+    'text-align-all',
+    'text-align-last',
+    'text-combine-upright',
+    'text-decoration',
+    'text-decoration-color',
+    'text-decoration-line',
+    'text-decoration-skip',
+    'text-decoration-skip-box',
+    'text-decoration-skip-ink',
+    'text-decoration-skip-inset',
+    'text-decoration-skip-self',
+    'text-decoration-skip-spaces',
+    'text-decoration-style',
+    'text-decoration-thickness',
+    'text-edge',
+    'text-emphasis',
+    'text-emphasis-color',
+    'text-emphasis-position',
+    'text-emphasis-skip',
+    'text-emphasis-style',
+    'text-group-align',
+    'text-indent',
+    'text-justify',
+    'text-orientation',
+    'text-overflow',
+    'text-shadow',
+    'text-space-collapse',
+    'text-space-trim',
+    'text-spacing',
+    'text-transform',
+    'text-underline-offset',
+    'text-underline-position',
+    'text-wrap',
+    'top',
+    'transform',
+    'transform-box',
+    'transform-origin',
+    'transform-style',
+    'transition',
+    'transition-delay',
+    'transition-duration',
+    'transition-property',
+    'transition-timing-function',
+    'translate',
+    'unicode-bidi',
+    'user-select',
+    'vertical-align',
+    'visibility',
+    'voice-balance',
+    'voice-duration',
+    'voice-family',
+    'voice-pitch',
+    'voice-range',
+    'voice-rate',
+    'voice-stress',
+    'voice-volume',
+    'volume',
+    'white-space',
+    'widows',
+    'width',
+    'will-change',
+    'word-boundary-detection',
+    'word-boundary-expansion',
+    'word-break',
+    'word-spacing',
+    'word-wrap',
+    'wrap-after',
+    'wrap-before',
+    'wrap-flow',
+    'wrap-inside',
+    'wrap-through',
+    'writing-mode',
+    'z-index',
+)
\ No newline at end of file
diff --git a/.venv/Lib/site-packages/pygments/lexers/_googlesql_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_googlesql_builtins.py
new file mode 100644 (file)
index 0000000..13ef3a2
--- /dev/null
@@ -0,0 +1,918 @@
+"""
+    pygments.lexers._googlesql_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Autogenerated data files for the GoogleSQL lexer.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+constants = [
+    'FALSE',
+    'NULL',
+    'TRUE',
+    'UNKNOWN',
+]
+
+# Everything below this line is auto-generated from the GoogleSQL source code.
+# ----------------------------------------------------------------------------
+
+functionnames = [
+    'ABS',
+    'ACOS',
+    'ACOSH',
+    'AEAD.DECRYPT_BYTES',
+    'AEAD.DECRYPT_STRING',
+    'AEAD.ENCRYPT',
+    'AEAD.ENVELOPE_DECRYPT_BYTES',
+    'AEAD.ENVELOPE_DECRYPT_STRING',
+    'AEAD.ENVELOPE_ENCRYPT',
+    'ALL_DIFFERENT',
+    'ANON_AVG',
+    'ANON_COUNT',
+    'ANON_COUNT',
+    'ANON_PERCENTILE_CONT',
+    'ANON_QUANTILES',
+    'ANON_STDDEV_POP',
+    'ANON_SUM',
+    'ANON_VAR_POP',
+    'ANY_VALUE',
+    'APPROX_COSINE_DISTANCE',
+    'APPROX_COUNT_DISTINCT',
+    'APPROX_DOT_PRODUCT',
+    'APPROX_EUCLIDEAN_DISTANCE',
+    'APPROX_QUANTILES',
+    'APPROX_TOP_COUNT',
+    'APPROX_TOP_SUM',
+    'ARRAY[KEY()]',
+    'ARRAY[SAFE_KEY()]',
+    'ARRAY_AGG',
+    'ARRAY_AVG',
+    'ARRAY_CONCAT',
+    'ARRAY_CONCAT_AGG',
+    'ARRAY_FILTER',
+    'ARRAY_FIND',
+    'ARRAY_FIND_ALL',
+    'ARRAY_FIRST',
+    'ARRAY_FIRST_N',
+    'ARRAY_INCLUDES',
+    'ARRAY_INCLUDES_ALL',
+    'ARRAY_INCLUDES_ANY',
+    'ARRAY_IS_DISTINCT',
+    'ARRAY_LAST',
+    'ARRAY_LAST_N',
+    'ARRAY_LENGTH',
+    'ARRAY_MAX',
+    'ARRAY_MIN',
+    'ARRAY_OFFSET',
+    'ARRAY_OFFSETS',
+    'ARRAY_REMOVE_FIRST_N',
+    'ARRAY_REMOVE_LAST_N',
+    'ARRAY_REVERSE',
+    'ARRAY_SLICE',
+    'ARRAY_SUM',
+    'ARRAY_TO_STRING',
+    'ARRAY_TRANSFORM',
+    'ARRAY_ZIP',
+    'ASCII',
+    'ASIN',
+    'ASINH',
+    'ATAN',
+    'ATAN2',
+    'ATANH',
+    'AVG',
+    'BIT_AND',
+    'BIT_COUNT',
+    'BIT_OR',
+    'BIT_XOR',
+    'BOOL',
+    'BOOL_ARRAY',
+    'BYTE_LENGTH',
+    'CASE',
+    'CAST',
+    'CBRT',
+    'CEIL',
+    'CEILING',
+    'CHARACTER_LENGTH',
+    'CHAR_LENGTH',
+    'CHR',
+    'COALESCE',
+    'CODE_POINTS_TO_BYTES',
+    'CODE_POINTS_TO_STRING',
+    'COLLATE',
+    'CONCAT',
+    'CORR',
+    'COS',
+    'COSH',
+    'COSINE_DISTANCE',
+    'COT',
+    'COTH',
+    'COUNT',
+    'COUNT(*)',
+    'COUNTIF',
+    'COVAR_POP',
+    'COVAR_SAMP',
+    'CSC',
+    'CSCH',
+    'CUME_DIST',
+    'CURRENT_DATE',
+    'CURRENT_DATETIME',
+    'CURRENT_TIME',
+    'CURRENT_TIMESTAMP',
+    'D3A_COUNT.EXTRACT',
+    'D3A_COUNT.INIT',
+    'D3A_COUNT.MERGE',
+    'D3A_COUNT.MERGE_PARTIAL',
+    'D3A_COUNT.TO_HLL',
+    'DATE',
+    'DATETIME',
+    'DATETIME_ADD',
+    'DATETIME_BUCKET',
+    'DATETIME_DIFF',
+    'DATETIME_SUB',
+    'DATETIME_TRUNC',
+    'DATE_ADD',
+    'DATE_BUCKET',
+    'DATE_DIFF',
+    'DATE_FROM_UNIX_DATE',
+    'DATE_SUB',
+    'DATE_TRUNC',
+    'DENSE_RANK',
+    'DESTINATION_NODE_ID',
+    'DETERMINISTIC_DECRYPT_BYTES',
+    'DETERMINISTIC_DECRYPT_STRING',
+    'DETERMINISTIC_ENCRYPT',
+    'DIV',
+    'DOT_PRODUCT',
+    'EDGES',
+    'EDIT_DISTANCE',
+    'ELEMENTWISE_AVG',
+    'ELEMENTWISE_SUM',
+    'ELEMENT_DEFINITION_NAME',
+    'ELEMENT_ID',
+    'ENDS_WITH',
+    'ENUM_VALUE_DESCRIPTOR_PROTO',
+    'ERROR',
+    'EUCLIDEAN_DISTANCE',
+    'EXP',
+    'EXTRACT',
+    'EXTRACT_FOR_DP_APPROX_COUNT_DISTINCT',
+    'FARM_FINGERPRINT',
+    'FILTER_FIELDS',
+    'FIRST_VALUE',
+    'FLATTEN',
+    'FLOAT32',
+    'FLOAT32_ARRAY',
+    'FLOAT64',
+    'FLOAT64_ARRAY',
+    'FLOOR',
+    'FORMAT',
+    'FORMAT_DATE',
+    'FORMAT_DATETIME',
+    'FORMAT_TIME',
+    'FORMAT_TIMESTAMP',
+    'FROM_BASE32',
+    'FROM_BASE64',
+    'FROM_HEX',
+    'GENERATE_ARRAY',
+    'GENERATE_DATE_ARRAY',
+    'GENERATE_RANGE_ARRAY',
+    'GENERATE_TIMESTAMP_ARRAY',
+    'GENERATE_UUID',
+    'GREATEST',
+    'GROUPING',
+    'HLL_COUNT.EXTRACT',
+    'HLL_COUNT.INIT',
+    'HLL_COUNT.MERGE',
+    'HLL_COUNT.MERGE_PARTIAL',
+    'IEEE_DIVIDE',
+    'IF',
+    'IFERROR',
+    'IFNULL',
+    'IN UNNEST',
+    'INITCAP',
+    'INIT_FOR_DP_APPROX_COUNT_DISTINCT',
+    'INSTR',
+    'INT64',
+    'INT64_ARRAY',
+    'IS DESTINATION OF',
+    'IS DISTINCT FROM',
+    'IS NOT DISTINCT FROM',
+    'IS SOURCE OF',
+    'ISERROR',
+    'IS_ACYCLIC',
+    'IS_INF',
+    'IS_NAN',
+    'IS_SIMPLE',
+    'IS_TRAIL',
+    'JSON_ARRAY',
+    'JSON_ARRAY_APPEND',
+    'JSON_ARRAY_INSERT',
+    'JSON_CONTAINS',
+    'JSON_EXTRACT',
+    'JSON_EXTRACT_ARRAY',
+    'JSON_EXTRACT_SCALAR',
+    'JSON_EXTRACT_STRING_ARRAY',
+    'JSON_KEYS',
+    'JSON_OBJECT',
+    'JSON_QUERY',
+    'JSON_QUERY_ARRAY',
+    'JSON_REMOVE',
+    'JSON_SET',
+    'JSON_STRIP_NULLS',
+    'JSON_TYPE',
+    'JSON_VALUE',
+    'JSON_VALUE_ARRAY',
+    'JUSTIFY_DAYS',
+    'JUSTIFY_HOURS',
+    'JUSTIFY_INTERVAL',
+    'KEYS.ADD_KEY_FROM_RAW_BYTES',
+    'KEYS.KEYSET_CHAIN',
+    'KEYS.KEYSET_FROM_JSON',
+    'KEYS.KEYSET_LENGTH',
+    'KEYS.KEYSET_TO_JSON',
+    'KEYS.NEW_KEYSET',
+    'KEYS.NEW_WRAPPED_KEYSET',
+    'KEYS.REWRAP_KEYSET',
+    'KEYS.ROTATE_KEYSET',
+    'KEYS.ROTATE_WRAPPED_KEYSET',
+    'KLL_QUANTILES.EXTRACT_FLOAT64',
+    'KLL_QUANTILES.EXTRACT_INT64',
+    'KLL_QUANTILES.EXTRACT_POINT_FLOAT64',
+    'KLL_QUANTILES.EXTRACT_POINT_INT64',
+    'KLL_QUANTILES.INIT_FLOAT64',
+    'KLL_QUANTILES.INIT_INT64',
+    'KLL_QUANTILES.MERGE_FLOAT64',
+    'KLL_QUANTILES.MERGE_INT64',
+    'KLL_QUANTILES.MERGE_PARTIAL',
+    'KLL_QUANTILES.MERGE_POINT_FLOAT64',
+    'KLL_QUANTILES.MERGE_POINT_INT64',
+    'L1_NORM',
+    'L2_NORM',
+    'LABELS',
+    'LAG',
+    'LAST_DAY',
+    'LAST_VALUE',
+    'LAX_BOOL',
+    'LAX_BOOL_ARRAY',
+    'LAX_FLOAT32',
+    'LAX_FLOAT32_ARRAY',
+    'LAX_FLOAT64',
+    'LAX_FLOAT64_ARRAY',
+    'LAX_INT64',
+    'LAX_INT64_ARRAY',
+    'LAX_STRING',
+    'LAX_STRING_ARRAY',
+    'LEAD',
+    'LEAST',
+    'LEFT',
+    'LENGTH',
+    'LIKE ALL',
+    'LIKE ALL UNNEST',
+    'LIKE ANY',
+    'LIKE ANY UNNEST',
+    'LN',
+    'LOG',
+    'LOG10',
+    'LOGICAL_AND',
+    'LOGICAL_OR',
+    'LOWER',
+    'LPAD',
+    'LTRIM',
+    'MAKE_INTERVAL',
+    'MANHATTAN_DISTANCE',
+    'MAP_CARDINALITY',
+    'MAP_CONTAINS_KEY',
+    'MAP_DELETE',
+    'MAP_EMPTY',
+    'MAP_ENTRIES_SORTED',
+    'MAP_ENTRIES_UNSORTED',
+    'MAP_FILTER',
+    'MAP_FROM_ARRAY',
+    'MAP_GET',
+    'MAP_INSERT',
+    'MAP_INSERT_OR_REPLACE',
+    'MAP_KEYS_SORTED',
+    'MAP_KEYS_UNSORTED',
+    'MAP_REPLACE',
+    'MAP_VALUES_SORTED',
+    'MAP_VALUES_SORTED_BY_KEY',
+    'MAP_VALUES_UNSORTED',
+    'MAX',
+    'MD5',
+    'MERGE_PARTIAL_FOR_DP_APPROX_COUNT_DISTINCT',
+    'MIN',
+    'MOD',
+    'NET.HOST',
+    'NET.IPV4_FROM_INT64',
+    'NET.IPV4_TO_INT64',
+    'NET.IP_FROM_STRING',
+    'NET.IP_NET_MASK',
+    'NET.IP_TO_STRING',
+    'NET.IP_TRUNC',
+    'NET.PUBLIC_SUFFIX',
+    'NET.REG_DOMAIN',
+    'NET.SAFE_IP_FROM_STRING',
+    'NEW_UUID',
+    'NODES',
+    'NORMALIZE',
+    'NORMALIZE_AND_CASEFOLD',
+    'NOT LIKE ALL',
+    'NOT LIKE ALL UNNEST',
+    'NOT LIKE ANY',
+    'NOT LIKE ANY UNNEST',
+    'NTH_VALUE',
+    'NTILE',
+    'NULLIF',
+    'NULLIFERROR',
+    'NULLIFZERO',
+    'OCTET_LENGTH',
+    'OFFSET',
+    'ORDINAL',
+    'PARSE_BIGNUMERIC',
+    'PARSE_DATE',
+    'PARSE_DATETIME',
+    'PARSE_JSON',
+    'PARSE_NUMERIC',
+    'PARSE_TIME',
+    'PARSE_TIMESTAMP',
+    'PATH',
+    'PATH_FIRST',
+    'PATH_LAST',
+    'PATH_LENGTH',
+    'PERCENTILE_CONT',
+    'PERCENTILE_DISC',
+    'PERCENT_RANK',
+    'PI',
+    'PIVOT',
+    'PI_BIGNUMERIC',
+    'PI_NUMERIC',
+    'POW',
+    'POWER',
+    'PROPERTY_EXISTS',
+    'PROPERTY_NAMES',
+    'PROTO_MAP_CONTAINS_KEY',
+    'PROTO_MODIFY_MAP',
+    'RAND',
+    'RANGE',
+    'RANGE_BUCKET',
+    'RANGE_CONTAINS',
+    'RANGE_END',
+    'RANGE_INTERSECT',
+    'RANGE_IS_END_UNBOUNDED',
+    'RANGE_IS_START_UNBOUNDED',
+    'RANGE_OVERLAPS',
+    'RANGE_START',
+    'RANK',
+    'REGEXP_CONTAINS',
+    'REGEXP_EXTRACT',
+    'REGEXP_EXTRACT_ALL',
+    'REGEXP_INSTR',
+    'REGEXP_REPLACE',
+    'REGEXP_SUBSTR',
+    'REPEAT',
+    'REPLACE',
+    'REVERSE',
+    'RIGHT',
+    'ROUND',
+    'ROW_NUMBER',
+    'RPAD',
+    'RTRIM',
+    'S2_CELLIDFROMPOINT',
+    'S2_COVERINGCELLIDS',
+    'SAFE_ADD',
+    'SAFE_CONVERT_BYTES_TO_STRING',
+    'SAFE_DIVIDE',
+    'SAFE_MULTIPLY',
+    'SAFE_NEGATE',
+    'SAFE_OFFSET',
+    'SAFE_ORDINAL',
+    'SAFE_SUBTRACT',
+    'SAFE_TO_JSON',
+    'SAME',
+    'SEC',
+    'SECH',
+    'SESSION_USER',
+    'SHA1',
+    'SHA256',
+    'SHA512',
+    'SIGN',
+    'SIN',
+    'SINH',
+    'SOUNDEX',
+    'SOURCE_NODE_ID',
+    'SPLIT',
+    'SPLIT_SUBSTR',
+    'SQRT',
+    'STARTS_WITH',
+    'STDDEV',
+    'STDDEV_POP',
+    'STDDEV_SAMP',
+    'STRING',
+    'STRING_AGG',
+    'STRING_ARRAY',
+    'STRPOS',
+    'ST_ANGLE',
+    'ST_AREA',
+    'ST_ASBINARY',
+    'ST_ASGEOJSON',
+    'ST_ASKML',
+    'ST_ASTEXT',
+    'ST_AZIMUTH',
+    'ST_BOUNDARY',
+    'ST_BOUNDINGBOX',
+    'ST_BUFFER',
+    'ST_BUFFERWITHTOLERANCE',
+    'ST_CENTROID',
+    'ST_CENTROID_AGG',
+    'ST_CLOSESTPOINT',
+    'ST_CLUSTERDBSCAN',
+    'ST_CONTAINS',
+    'ST_CONVEXHULL',
+    'ST_COVEREDBY',
+    'ST_COVERS',
+    'ST_DIFFERENCE',
+    'ST_DIMENSION',
+    'ST_DISJOINT',
+    'ST_DISTANCE',
+    'ST_DUMP',
+    'ST_DUMPPOINTS',
+    'ST_DWITHIN',
+    'ST_ENDPOINT',
+    'ST_EQUALS',
+    'ST_EXTENT',
+    'ST_EXTERIORRING',
+    'ST_GEOGFROM',
+    'ST_GEOGFROMGEOJSON',
+    'ST_GEOGFROMKML',
+    'ST_GEOGFROMTEXT',
+    'ST_GEOGFROMWKB',
+    'ST_GEOGPOINT',
+    'ST_GEOGPOINTFROMGEOHASH',
+    'ST_GEOHASH',
+    'ST_GEOMETRYTYPE',
+    'ST_HAUSDORFFDISTANCE',
+    'ST_HAUSDORFFDWITHIN',
+    'ST_INTERIORRINGS',
+    'ST_INTERSECTION',
+    'ST_INTERSECTS',
+    'ST_INTERSECTSBOX',
+    'ST_ISCLOSED',
+    'ST_ISCOLLECTION',
+    'ST_ISEMPTY',
+    'ST_ISRING',
+    'ST_LENGTH',
+    'ST_LINEINTERPOLATEPOINT',
+    'ST_LINELOCATEPOINT',
+    'ST_LINESUBSTRING',
+    'ST_MAKELINE',
+    'ST_MAKEPOLYGON',
+    'ST_MAKEPOLYGONORIENTED',
+    'ST_MAXDISTANCE',
+    'ST_NEAREST_NEIGHBORS',
+    'ST_NPOINTS',
+    'ST_NUMGEOMETRIES',
+    'ST_NUMPOINTS',
+    'ST_PERIMETER',
+    'ST_POINTN',
+    'ST_SIMPLIFY',
+    'ST_SNAPTOGRID',
+    'ST_STARTPOINT',
+    'ST_TOUCHES',
+    'ST_UNARYUNION',
+    'ST_UNION',
+    'ST_UNION_AGG',
+    'ST_WITHIN',
+    'ST_X',
+    'ST_Y',
+    'SUBSTR',
+    'SUBSTRING',
+    'SUM',
+    'TAN',
+    'TANH',
+    'TIME',
+    'TIMESTAMP',
+    'TIMESTAMP_ADD',
+    'TIMESTAMP_BUCKET',
+    'TIMESTAMP_DIFF',
+    'TIMESTAMP_FROM_UNIX_MICROS',
+    'TIMESTAMP_FROM_UNIX_MILLIS',
+    'TIMESTAMP_FROM_UNIX_SECONDS',
+    'TIMESTAMP_MICROS',
+    'TIMESTAMP_MILLIS',
+    'TIMESTAMP_SECONDS',
+    'TIMESTAMP_SUB',
+    'TIMESTAMP_TRUNC',
+    'TIME_ADD',
+    'TIME_DIFF',
+    'TIME_SUB',
+    'TIME_TRUNC',
+    'TO_BASE32',
+    'TO_BASE64',
+    'TO_CODE_POINTS',
+    'TO_HEX',
+    'TO_JSON',
+    'TO_JSON_STRING',
+    'TRANSLATE',
+    'TRIM',
+    'TRUNC',
+    'TYPEOF',
+    'UNICODE',
+    'UNIX_DATE',
+    'UNIX_MICROS',
+    'UNIX_MILLIS',
+    'UNIX_SECONDS',
+    'UNNEST',
+    'UNPIVOT',
+    'UPPER',
+    'VARIANCE',
+    'VAR_POP',
+    'VAR_SAMP',
+    'ZEROIFNULL',
+]
+
+keywords = [
+    'ABORT',
+    'ACCESS',
+    'ACTION',
+    'ACYCLIC',
+    'ADD',
+    'AFTER',
+    'AGGREGATE',
+    'ALL',
+    'ALTER',
+    'ALWAYS',
+    'ANALYZE',
+    'AND',
+    'ANY',
+    'APPROX',
+    'ARE',
+    'AS',
+    'ASC',
+    'ASCENDING',
+    'ASSERT',
+    'ASSERT_ROWS_MODIFIED',
+    'AT',
+    'BATCH',
+    'BEGIN',
+    'BETWEEN',
+    'BIGDECIMAL',
+    'BREAK',
+    'BY',
+    'CALL',
+    'CASCADE',
+    'CASE',
+    'CAST',
+    'CHECK',
+    'CLAMPED',
+    'CLONE',
+    'CLUSTER',
+    'COLLATE',
+    'COLUMN',
+    'COLUMNS',
+    'COMMIT',
+    'CONFLICT',
+    'CONNECTION',
+    'CONSTANT',
+    'CONSTRAINT',
+    'CONTAINS',
+    'CONTINUE',
+    'COPY',
+    'CORRESPONDING',
+    'CREATE',
+    'CROSS',
+    'CUBE',
+    'CURRENT',
+    'CYCLE',
+    'DATA',
+    'DATABASE',
+    'DAY',
+    'DAYOFWEEK',
+    'DAYOFYEAR',
+    'DECIMAL',
+    'DECLARE',
+    'DEFAULT',
+    'DEFINE',
+    'DEFINER',
+    'DELETE',
+    'DELETION',
+    'DEPTH',
+    'DESC',
+    'DESCENDING',
+    'DESCRIBE',
+    'DESCRIPTOR',
+    'DESTINATION',
+    'DETERMINISTIC',
+    'DISTINCT',
+    'DO',
+    'DROP',
+    'EDGE',
+    'ELSE',
+    'ELSEIF',
+    'END',
+    'ENFORCED',
+    'ERROR',
+    'ESCAPE',
+    'EXCEPT',
+    'EXCEPTION',
+    'EXCLUDE',
+    'EXECUTE',
+    'EXISTS',
+    'EXPLAIN',
+    'EXPORT',
+    'EXTEND',
+    'EXTERNAL',
+    'EXTRACT',
+    'FALSE',
+    'FETCH',
+    'FIELD',
+    'FILES',
+    'FILL',
+    'FILTER',
+    'FIRST',
+    'FOLLOWING',
+    'FOR',
+    'FOREIGN',
+    'FORK',
+    'FORMAT',
+    'FRIDAY',
+    'FROM',
+    'FULL',
+    'FUNCTION',
+    'GENERATED',
+    'GRANT',
+    'GRAPH',
+    'GRAPH_TABLE',
+    'GROUP',
+    'GROUPING',
+    'GROUPS',
+    'GROUP_ROWS',
+    'HAS',
+    'HASH',
+    'HAVING',
+    'HIDDEN',
+    'HOUR',
+    'IDENTITY',
+    'IF',
+    'IGNORE',
+    'IMMEDIATE',
+    'IMMUTABLE',
+    'IMPORT',
+    'IN',
+    'INCLUDE',
+    'INCREMENT',
+    'INDEX',
+    'INNER',
+    'INOUT',
+    'INPUT',
+    'INSERT',
+    'INTERLEAVE',
+    'INTERSECT',
+    'INTO',
+    'INVOKER',
+    'IS',
+    'ISOLATION',
+    'ISOWEEK ',
+    'ISOYEAR',
+    'ITERATE',
+    'JOIN',
+    'KEY',
+    'LABEL',
+    'LABELED',
+    'LANGUAGE',
+    'LAST',
+    'LATERAL',
+    'LEAVE',
+    'LEFT',
+    'LET',
+    'LEVEL',
+    'LIKE',
+    'LIMIT',
+    'LOAD',
+    'LOG',
+    'LOOKUP',
+    'LOOP',
+    'MACRO',
+    'MATCH',
+    'MATCHED',
+    'MATCH_RECOGNIZE',
+    'MATERIALIZED',
+    'MAX',
+    'MAXVALUE',
+    'MEASURES',
+    'MERGE',
+    'MESSAGE',
+    'METADATA',
+    'MICROSECOND',
+    'MILLISECOND',
+    'MIN',
+    'MINUTE',
+    'MINVALUE',
+    'MODEL',
+    'MODULE',
+    'MONDAY',
+    'MONTH',
+    'NAME',
+    'NANOSECOND',
+    'NATURAL',
+    'NEW',
+    'NEXT',
+    'NO',
+    'NODE',
+    'NOT',
+    'NOTHING',
+    'NULL',
+    'NULLS',
+    'NULL_FILTERED',
+    'OF',
+    'OFFSET',
+    'ON',
+    'ONEOF_CASE',
+    'ONLY',
+    'OPTIONAL',
+    'OPTIONS',
+    'OR',
+    'ORDER',
+    'OUT',
+    'OUTER',
+    'OUTPUT',
+    'OVER',
+    'OVERWRITE',
+    'PARENT',
+    'PARTITION',
+    'PARTITIONS',
+    'PAST',
+    'PATH',
+    'PATHS',
+    'PATTERN',
+    'PERCENT',
+    'PIVOT',
+    'POLICIES',
+    'POLICY',
+    'PRECEDING',
+    'PRIMARY',
+    'PRIVATE',
+    'PRIVILEGE',
+    'PRIVILEGES',
+    'PROCEDURE',
+    'PROJECT',
+    'PROPERTIES',
+    'PROPERTY',
+    'PUBLIC',
+    'QUALIFY',
+    'QUARTER',
+    'RAISE',
+    'RAW',
+    'READ',
+    'RECURSIVE',
+    'REFERENCES',
+    'REMOTE',
+    'REMOVE',
+    'RENAME',
+    'REPEAT',
+    'REPEATABLE',
+    'REPLACE',
+    'REPLACE_FIELDS',
+    'REPLICA',
+    'REPORT',
+    'RESPECT',
+    'RESTRICT',
+    'RESTRICTION',
+    'RETURN',
+    'RETURNS',
+    'REVOKE',
+    'RIGHT',
+    'ROLLBACK',
+    'ROLLUP',
+    'ROW',
+    'ROWS',
+    'RUN',
+    'SAFE_CAST',
+    'SATURDAY',
+    'SCHEMA',
+    'SEARCH',
+    'SECOND ',
+    'SECURITY',
+    'SELECT',
+    'SEQUENCE',
+    'SET',
+    'SETS',
+    'SHORTEST',
+    'SHOW',
+    'SIMPLE',
+    'SKIP',
+    'SNAPSHOT',
+    'SOME',
+    'SOURCE',
+    'SQL',
+    'STABLE',
+    'START',
+    'STATIC_DESCRIBE',
+    'STORED',
+    'STORING',
+    'STRICT',
+    'SUNDAY',
+    'SYSTEM',
+    'SYSTEM_TIME',
+    'TABLE',
+    'TABLES',
+    'TABLESAMPLE',
+    'TARGET',
+    'TEMP',
+    'TEMPORARY',
+    'THEN',
+    'THURSDAY',
+    'TO',
+    'TRAIL',
+    'TRANSACTION',
+    'TRANSFORM',
+    'TREAT',
+    'TRUE',
+    'TRUNCATE',
+    'TUESDAY',
+    'TYPE',
+    'UNBOUNDED',
+    'UNDROP',
+    'UNION',
+    'UNIQUE',
+    'UNKNOWN',
+    'UNNEST',
+    'UNPIVOT',
+    'UNTIL',
+    'UPDATE',
+    'USING',
+    'VALUE',
+    'VALUES',
+    'VECTOR',
+    'VIEW',
+    'VIEWS',
+    'VOLATILE',
+    'WALK',
+    'WEDNESDAY',
+    'WEEK',
+    'WEIGHT',
+    'WHEN',
+    'WHERE',
+    'WHILE',
+    'WINDOW',
+    'WITH',
+    'WITHIN',
+    'WRITE',
+    'YEAR',
+    'ZONE',
+]
+
+operators = [
+    '!=',
+    '&',
+    '*',
+    '+',
+    '-',
+    '/',
+    '<',
+    '<<',
+    '<=',
+    '=',
+    '>',
+    '>=',
+    '>>',
+    '^',
+    '|',
+    '||',
+    '~',
+]
+
+types = [
+    'ARRAY',
+    'BIGNUMERIC',
+    'BOOL',
+    'BYTES',
+    'DATE',
+    'DATETIME',
+    'DOUBLE',
+    'ENUM',
+    'EXTENDED',
+    'FLOAT',
+    'GEOGRAPHY',
+    'GRAPH_ELEMENT',
+    'GRAPH_PATH',
+    'INT32',
+    'INT64',
+    'INTERVAL',
+    'JSON',
+    'MAP',
+    'MEASURE',
+    'NUMERIC',
+    'PROTO',
+    'RANGE',
+    'STRING',
+    'STRUCT',
+    'TIME',
+    'TIMESTAMP',
+    'TIMESTAMP_PICOS',
+    'TOKENLIST',
+    'UINT32',
+    'UINT64',
+    'UUID',
+]
diff --git a/.venv/Lib/site-packages/pygments/lexers/_julia_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_julia_builtins.py
new file mode 100644 (file)
index 0000000..2849afe
--- /dev/null
@@ -0,0 +1,411 @@
+"""
+    pygments.lexers._julia_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Julia builtins.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# operators
+#   see https://github.com/JuliaLang/julia/blob/master/src/julia-parser.scm
+# Julia v1.6.0-rc1
+OPERATORS_LIST = [
+    # other
+    '->',
+    # prec-assignment
+    ':=', '$=',
+    # prec-conditional, prec-lazy-or, prec-lazy-and
+    '?', '||', '&&',
+    # prec-colon
+    ':',
+    # prec-plus
+    '$',
+    # prec-decl
+    '::',
+]
+DOTTED_OPERATORS_LIST = [
+    # prec-assignment
+    r'=', r'+=', r'-=', r'*=', r'/=', r'//=', r'\=', r'^=', r'÷=', r'%=', r'<<=',
+    r'>>=', r'>>>=', r'|=', r'&=', r'⊻=', r'≔', r'⩴', r"≕'", r'~',
+    # prec-pair
+    '=>',
+    # prec-arrow
+    r'→', r'↔', r'↚', r'↛', r'↞', r'↠', r'↢', r'↣', r'↦', r'↤', r'↮', r'⇎', r'⇍', r'⇏',
+    r'⇐', r'⇒', r'⇔', r'⇴', r'⇶', r'⇷', r'⇸', r'⇹', r'⇺', r'⇻', r'⇼', r'⇽', r'⇾', r'⇿',
+    r'⟵', r'⟶', r'⟷', r'⟹', r'⟺', r'⟻', r'⟼', r'⟽', r'⟾', r'⟿', r'⤀', r'⤁', r'⤂', r'⤃',
+    r'⤄', r'⤅', r'⤆', r'⤇', r'⤌', r'⤍', r'⤎', r'⤏', r'⤐', r'⤑', r'⤔', r'⤕', r'⤖', r'⤗',
+    r'⤘', r'⤝', r'⤞', r'⤟', r'⤠', r'⥄', r'⥅', r'⥆', r'⥇', r'⥈', r'⥊', r'⥋', r'⥎', r'⥐',
+    r'⥒', r'⥓', r'⥖', r'⥗', r'⥚', r'⥛', r'⥞', r'⥟', r'⥢', r'⥤', r'⥦', r'⥧', r'⥨', r'⥩',
+    r'⥪', r'⥫', r'⥬', r'⥭', r'⥰', r'⧴', r'⬱', r'⬰', r'⬲', r'⬳', r'⬴', r'⬵', r'⬶', r'⬷',
+    r'⬸', r'⬹', r'⬺', r'⬻', r'⬼', r'⬽', r'⬾', r'⬿', r'⭀', r'⭁', r'⭂', r'⭃', r'⭄', r'⭇',
+    r'⭈', r'⭉', r'⭊', r'⭋', r'⭌', r'←', r'→', r'⇜', r'⇝', r'↜', r'↝', r'↩', r'↪', r'↫',
+    r'↬', r'↼', r'↽', r'⇀', r'⇁', r'⇄', r'⇆', r'⇇', r'⇉', r'⇋', r'⇌', r'⇚', r'⇛', r'⇠',
+    r'⇢', r'↷', r'↶', r'↺', r'↻', r'-->', r'<--', r'<-->',
+    # prec-comparison
+    r'>', r'<', r'>=', r'≥', r'<=', r'≤', r'==', r'===', r'≡', r'!=', r'≠', r'!==',
+    r'≢', r'∈', r'∉', r'∋', r'∌', r'⊆', r'⊈', r'⊂', r'⊄', r'⊊', r'∝', r'∊', r'∍', r'∥',
+    r'∦', r'∷', r'∺', r'∻', r'∽', r'∾', r'≁', r'≃', r'≂', r'≄', r'≅', r'≆', r'≇', r'≈',
+    r'≉', r'≊', r'≋', r'≌', r'≍', r'≎', r'≐', r'≑', r'≒', r'≓', r'≖', r'≗', r'≘', r'≙',
+    r'≚', r'≛', r'≜', r'≝', r'≞', r'≟', r'≣', r'≦', r'≧', r'≨', r'≩', r'≪', r'≫', r'≬',
+    r'≭', r'≮', r'≯', r'≰', r'≱', r'≲', r'≳', r'≴', r'≵', r'≶', r'≷', r'≸', r'≹', r'≺',
+    r'≻', r'≼', r'≽', r'≾', r'≿', r'⊀', r'⊁', r'⊃', r'⊅', r'⊇', r'⊉', r'⊋', r'⊏', r'⊐',
+    r'⊑', r'⊒', r'⊜', r'⊩', r'⊬', r'⊮', r'⊰', r'⊱', r'⊲', r'⊳', r'⊴', r'⊵', r'⊶', r'⊷',
+    r'⋍', r'⋐', r'⋑', r'⋕', r'⋖', r'⋗', r'⋘', r'⋙', r'⋚', r'⋛', r'⋜', r'⋝', r'⋞', r'⋟',
+    r'⋠', r'⋡', r'⋢', r'⋣', r'⋤', r'⋥', r'⋦', r'⋧', r'⋨', r'⋩', r'⋪', r'⋫', r'⋬', r'⋭',
+    r'⋲', r'⋳', r'⋴', r'⋵', r'⋶', r'⋷', r'⋸', r'⋹', r'⋺', r'⋻', r'⋼', r'⋽', r'⋾', r'⋿',
+    r'⟈', r'⟉', r'⟒', r'⦷', r'⧀', r'⧁', r'⧡', r'⧣', r'⧤', r'⧥', r'⩦', r'⩧', r'⩪', r'⩫',
+    r'⩬', r'⩭', r'⩮', r'⩯', r'⩰', r'⩱', r'⩲', r'⩳', r'⩵', r'⩶', r'⩷', r'⩸', r'⩹', r'⩺',
+    r'⩻', r'⩼', r'⩽', r'⩾', r'⩿', r'⪀', r'⪁', r'⪂', r'⪃', r'⪄', r'⪅', r'⪆', r'⪇', r'⪈',
+    r'⪉', r'⪊', r'⪋', r'⪌', r'⪍', r'⪎', r'⪏', r'⪐', r'⪑', r'⪒', r'⪓', r'⪔', r'⪕', r'⪖',
+    r'⪗', r'⪘', r'⪙', r'⪚', r'⪛', r'⪜', r'⪝', r'⪞', r'⪟', r'⪠', r'⪡', r'⪢', r'⪣', r'⪤',
+    r'⪥', r'⪦', r'⪧', r'⪨', r'⪩', r'⪪', r'⪫', r'⪬', r'⪭', r'⪮', r'⪯', r'⪰', r'⪱', r'⪲',
+    r'⪳', r'⪴', r'⪵', r'⪶', r'⪷', r'⪸', r'⪹', r'⪺', r'⪻', r'⪼', r'⪽', r'⪾', r'⪿', r'⫀',
+    r'⫁', r'⫂', r'⫃', r'⫄', r'⫅', r'⫆', r'⫇', r'⫈', r'⫉', r'⫊', r'⫋', r'⫌', r'⫍', r'⫎',
+    r'⫏', r'⫐', r'⫑', r'⫒', r'⫓', r'⫔', r'⫕', r'⫖', r'⫗', r'⫘', r'⫙', r'⫷', r'⫸', r'⫹',
+    r'⫺', r'⊢', r'⊣', r'⟂', r'<:', r'>:',
+    # prec-pipe
+    '<|', '|>',
+    # prec-colon
+    r'…', r'⁝', r'⋮', r'⋱', r'⋰', r'⋯',
+    # prec-plus
+    r'+', r'-', r'¦', r'|', r'⊕', r'⊖', r'⊞', r'⊟', r'++', r'∪', r'∨', r'⊔', r'±', r'∓',
+    r'∔', r'∸', r'≏', r'⊎', r'⊻', r'⊽', r'⋎', r'⋓', r'⧺', r'⧻', r'⨈', r'⨢', r'⨣', r'⨤',
+    r'⨥', r'⨦', r'⨧', r'⨨', r'⨩', r'⨪', r'⨫', r'⨬', r'⨭', r'⨮', r'⨹', r'⨺', r'⩁', r'⩂',
+    r'⩅', r'⩊', r'⩌', r'⩏', r'⩐', r'⩒', r'⩔', r'⩖', r'⩗', r'⩛', r'⩝', r'⩡', r'⩢', r'⩣',
+    # prec-times
+    r'*', r'/', r'⌿', r'÷', r'%', r'&', r'⋅', r'∘', r'×', '\\', r'∩', r'∧', r'⊗', r'⊘',
+    r'⊙', r'⊚', r'⊛', r'⊠', r'⊡', r'⊓', r'∗', r'∙', r'∤', r'⅋', r'≀', r'⊼', r'⋄', r'⋆',
+    r'⋇', r'⋉', r'⋊', r'⋋', r'⋌', r'⋏', r'⋒', r'⟑', r'⦸', r'⦼', r'⦾', r'⦿', r'⧶', r'⧷',
+    r'⨇', r'⨰', r'⨱', r'⨲', r'⨳', r'⨴', r'⨵', r'⨶', r'⨷', r'⨸', r'⨻', r'⨼', r'⨽', r'⩀',
+    r'⩃', r'⩄', r'⩋', r'⩍', r'⩎', r'⩑', r'⩓', r'⩕', r'⩘', r'⩚', r'⩜', r'⩞', r'⩟', r'⩠',
+    r'⫛', r'⊍', r'▷', r'⨝', r'⟕', r'⟖', r'⟗', r'⨟',
+    # prec-rational, prec-bitshift
+    '//', '>>', '<<', '>>>',
+    # prec-power
+    r'^', r'↑', r'↓', r'⇵', r'⟰', r'⟱', r'⤈', r'⤉', r'⤊', r'⤋', r'⤒', r'⤓', r'⥉', r'⥌',
+    r'⥍', r'⥏', r'⥑', r'⥔', r'⥕', r'⥘', r'⥙', r'⥜', r'⥝', r'⥠', r'⥡', r'⥣', r'⥥', r'⥮',
+    r'⥯', r'↑', r'↓',
+    # unary-ops, excluding unary-and-binary-ops
+    '!', r'¬', r'√', r'∛', r'∜'
+]
+
+# Generated with the following in Julia v1.6.0-rc1
+'''
+#!/usr/bin/env julia
+
+import REPL.REPLCompletions
+res = String["in", "isa", "where"]
+for kw in collect(x.keyword for x in REPLCompletions.complete_keyword(""))
+    if !(contains(kw, " ") || kw == "struct")
+        push!(res, kw)
+    end
+end
+sort!(unique!(setdiff!(res, ["true", "false"])))
+foreach(x -> println("\'", x, "\',"), res)
+'''
+KEYWORD_LIST = (
+    'baremodule',
+    'begin',
+    'break',
+    'catch',
+    'ccall',
+    'const',
+    'continue',
+    'do',
+    'else',
+    'elseif',
+    'end',
+    'export',
+    'finally',
+    'for',
+    'function',
+    'global',
+    'if',
+    'import',
+    'in',
+    'isa',
+    'let',
+    'local',
+    'macro',
+    'module',
+    'quote',
+    'return',
+    'try',
+    'using',
+    'where',
+    'while',
+)
+
+# Generated with the following in Julia v1.6.0-rc1
+'''
+#!/usr/bin/env julia
+
+import REPL.REPLCompletions
+res = String[]
+for compl in filter!(x -> isa(x, REPLCompletions.ModuleCompletion) && (x.parent === Base || x.parent === Core),
+                    REPLCompletions.completions("", 0)[1])
+    try
+        v = eval(Symbol(compl.mod))
+        if (v isa Type || v isa TypeVar) && (compl.mod != "=>")
+            push!(res, compl.mod)
+        end
+    catch e
+    end
+end
+sort!(unique!(res))
+foreach(x -> println("\'", x, "\',"), res)
+'''
+BUILTIN_LIST = (
+    'AbstractArray',
+    'AbstractChannel',
+    'AbstractChar',
+    'AbstractDict',
+    'AbstractDisplay',
+    'AbstractFloat',
+    'AbstractIrrational',
+    'AbstractMatch',
+    'AbstractMatrix',
+    'AbstractPattern',
+    'AbstractRange',
+    'AbstractSet',
+    'AbstractString',
+    'AbstractUnitRange',
+    'AbstractVecOrMat',
+    'AbstractVector',
+    'Any',
+    'ArgumentError',
+    'Array',
+    'AssertionError',
+    'BigFloat',
+    'BigInt',
+    'BitArray',
+    'BitMatrix',
+    'BitSet',
+    'BitVector',
+    'Bool',
+    'BoundsError',
+    'CapturedException',
+    'CartesianIndex',
+    'CartesianIndices',
+    'Cchar',
+    'Cdouble',
+    'Cfloat',
+    'Channel',
+    'Char',
+    'Cint',
+    'Cintmax_t',
+    'Clong',
+    'Clonglong',
+    'Cmd',
+    'Colon',
+    'Complex',
+    'ComplexF16',
+    'ComplexF32',
+    'ComplexF64',
+    'ComposedFunction',
+    'CompositeException',
+    'Condition',
+    'Cptrdiff_t',
+    'Cshort',
+    'Csize_t',
+    'Cssize_t',
+    'Cstring',
+    'Cuchar',
+    'Cuint',
+    'Cuintmax_t',
+    'Culong',
+    'Culonglong',
+    'Cushort',
+    'Cvoid',
+    'Cwchar_t',
+    'Cwstring',
+    'DataType',
+    'DenseArray',
+    'DenseMatrix',
+    'DenseVecOrMat',
+    'DenseVector',
+    'Dict',
+    'DimensionMismatch',
+    'Dims',
+    'DivideError',
+    'DomainError',
+    'EOFError',
+    'Enum',
+    'ErrorException',
+    'Exception',
+    'ExponentialBackOff',
+    'Expr',
+    'Float16',
+    'Float32',
+    'Float64',
+    'Function',
+    'GlobalRef',
+    'HTML',
+    'IO',
+    'IOBuffer',
+    'IOContext',
+    'IOStream',
+    'IdDict',
+    'IndexCartesian',
+    'IndexLinear',
+    'IndexStyle',
+    'InexactError',
+    'InitError',
+    'Int',
+    'Int128',
+    'Int16',
+    'Int32',
+    'Int64',
+    'Int8',
+    'Integer',
+    'InterruptException',
+    'InvalidStateException',
+    'Irrational',
+    'KeyError',
+    'LinRange',
+    'LineNumberNode',
+    'LinearIndices',
+    'LoadError',
+    'MIME',
+    'Matrix',
+    'Method',
+    'MethodError',
+    'Missing',
+    'MissingException',
+    'Module',
+    'NTuple',
+    'NamedTuple',
+    'Nothing',
+    'Number',
+    'OrdinalRange',
+    'OutOfMemoryError',
+    'OverflowError',
+    'Pair',
+    'PartialQuickSort',
+    'PermutedDimsArray',
+    'Pipe',
+    'ProcessFailedException',
+    'Ptr',
+    'QuoteNode',
+    'Rational',
+    'RawFD',
+    'ReadOnlyMemoryError',
+    'Real',
+    'ReentrantLock',
+    'Ref',
+    'Regex',
+    'RegexMatch',
+    'RoundingMode',
+    'SegmentationFault',
+    'Set',
+    'Signed',
+    'Some',
+    'StackOverflowError',
+    'StepRange',
+    'StepRangeLen',
+    'StridedArray',
+    'StridedMatrix',
+    'StridedVecOrMat',
+    'StridedVector',
+    'String',
+    'StringIndexError',
+    'SubArray',
+    'SubString',
+    'SubstitutionString',
+    'Symbol',
+    'SystemError',
+    'Task',
+    'TaskFailedException',
+    'Text',
+    'TextDisplay',
+    'Timer',
+    'Tuple',
+    'Type',
+    'TypeError',
+    'TypeVar',
+    'UInt',
+    'UInt128',
+    'UInt16',
+    'UInt32',
+    'UInt64',
+    'UInt8',
+    'UndefInitializer',
+    'UndefKeywordError',
+    'UndefRefError',
+    'UndefVarError',
+    'Union',
+    'UnionAll',
+    'UnitRange',
+    'Unsigned',
+    'Val',
+    'Vararg',
+    'VecElement',
+    'VecOrMat',
+    'Vector',
+    'VersionNumber',
+    'WeakKeyDict',
+    'WeakRef',
+)
+
+# Generated with the following in Julia v1.6.0-rc1
+'''
+#!/usr/bin/env julia
+
+import REPL.REPLCompletions
+res = String["true", "false"]
+for compl in filter!(x -> isa(x, REPLCompletions.ModuleCompletion) && (x.parent === Base || x.parent === Core),
+                    REPLCompletions.completions("", 0)[1])
+    try
+        v = eval(Symbol(compl.mod))
+        if !(v isa Function || v isa Type || v isa TypeVar || v isa Module || v isa Colon)
+            push!(res, compl.mod)
+        end
+    catch e
+    end
+end
+sort!(unique!(res))
+foreach(x -> println("\'", x, "\',"), res)
+'''
+LITERAL_LIST = (
+    'ARGS',
+    'C_NULL',
+    'DEPOT_PATH',
+    'ENDIAN_BOM',
+    'ENV',
+    'Inf',
+    'Inf16',
+    'Inf32',
+    'Inf64',
+    'InsertionSort',
+    'LOAD_PATH',
+    'MergeSort',
+    'NaN',
+    'NaN16',
+    'NaN32',
+    'NaN64',
+    'PROGRAM_FILE',
+    'QuickSort',
+    'RoundDown',
+    'RoundFromZero',
+    'RoundNearest',
+    'RoundNearestTiesAway',
+    'RoundNearestTiesUp',
+    'RoundToZero',
+    'RoundUp',
+    'VERSION',
+    'devnull',
+    'false',
+    'im',
+    'missing',
+    'nothing',
+    'pi',
+    'stderr',
+    'stdin',
+    'stdout',
+    'true',
+    'undef',
+    'π',
+    'ℯ',
+)
diff --git a/.venv/Lib/site-packages/pygments/lexers/_lasso_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_lasso_builtins.py
new file mode 100644 (file)
index 0000000..a559847
--- /dev/null
@@ -0,0 +1,5326 @@
+"""
+    pygments.lexers._lasso_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Built-in Lasso types, traits, methods, and members.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+BUILTINS = {
+    'Types': (
+        'array',
+        'atbegin',
+        'boolean',
+        'bson_iter',
+        'bson',
+        'bytes_document_body',
+        'bytes',
+        'cache_server_element',
+        'cache_server',
+        'capture',
+        'client_address',
+        'client_ip',
+        'component_container',
+        'component_render_state',
+        'component',
+        'curl',
+        'curltoken',
+        'currency',
+        'custom',
+        'data_document',
+        'database_registry',
+        'date',
+        'dateandtime',
+        'dbgp_packet',
+        'dbgp_server',
+        'debugging_stack',
+        'decimal',
+        'delve',
+        'dir',
+        'dirdesc',
+        'dns_response',
+        'document_base',
+        'document_body',
+        'document_header',
+        'dsinfo',
+        'duration',
+        'eacher',
+        'email_compose',
+        'email_parse',
+        'email_pop',
+        'email_queue_impl_base',
+        'email_queue_impl',
+        'email_smtp',
+        'email_stage_impl_base',
+        'email_stage_impl',
+        'fastcgi_each_fcgi_param',
+        'fastcgi_server',
+        'fcgi_record',
+        'fcgi_request',
+        'file',
+        'filedesc',
+        'filemaker_datasource',
+        'generateforeachkeyed',
+        'generateforeachunkeyed',
+        'generateseries',
+        'hash_map',
+        'html_atomic_element',
+        'html_attr',
+        'html_base',
+        'html_binary',
+        'html_br',
+        'html_cdata',
+        'html_container_element',
+        'html_div',
+        'html_document_body',
+        'html_document_head',
+        'html_eol',
+        'html_fieldset',
+        'html_form',
+        'html_h1',
+        'html_h2',
+        'html_h3',
+        'html_h4',
+        'html_h5',
+        'html_h6',
+        'html_hr',
+        'html_img',
+        'html_input',
+        'html_json',
+        'html_label',
+        'html_legend',
+        'html_link',
+        'html_meta',
+        'html_object',
+        'html_option',
+        'html_raw',
+        'html_script',
+        'html_select',
+        'html_span',
+        'html_style',
+        'html_table',
+        'html_td',
+        'html_text',
+        'html_th',
+        'html_tr',
+        'http_document_header',
+        'http_document',
+        'http_error',
+        'http_header_field',
+        'http_server_connection_handler_globals',
+        'http_server_connection_handler',
+        'http_server_request_logger_thread',
+        'http_server_web_connection',
+        'http_server',
+        'image',
+        'include_cache',
+        'inline_type',
+        'integer',
+        'java_jnienv',
+        'jbyte',
+        'jbytearray',
+        'jchar',
+        'jchararray',
+        'jfieldid',
+        'jfloat',
+        'jint',
+        'jmethodid',
+        'jobject',
+        'jshort',
+        'json_decode',
+        'json_encode',
+        'json_literal',
+        'json_object',
+        'keyword',
+        'lassoapp_compiledsrc_appsource',
+        'lassoapp_compiledsrc_fileresource',
+        'lassoapp_content_rep_halt',
+        'lassoapp_dirsrc_appsource',
+        'lassoapp_dirsrc_fileresource',
+        'lassoapp_installer',
+        'lassoapp_livesrc_appsource',
+        'lassoapp_livesrc_fileresource',
+        'lassoapp_long_expiring_bytes',
+        'lassoapp_manualsrc_appsource',
+        'lassoapp_zip_file_server',
+        'lassoapp_zipsrc_appsource',
+        'lassoapp_zipsrc_fileresource',
+        'ldap',
+        'library_thread_loader',
+        'list_node',
+        'list',
+        'locale',
+        'log_impl_base',
+        'log_impl',
+        'magick_image',
+        'map_node',
+        'map',
+        'memberstream',
+        'memory_session_driver_impl_entry',
+        'memory_session_driver_impl',
+        'memory_session_driver',
+        'mime_reader',
+        'mongo_client',
+        'mongo_collection',
+        'mongo_cursor',
+        'mustache_ctx',
+        'mysql_session_driver_impl',
+        'mysql_session_driver',
+        'net_named_pipe',
+        'net_tcp_ssl',
+        'net_tcp',
+        'net_udp_packet',
+        'net_udp',
+        'null',
+        'odbc_session_driver_impl',
+        'odbc_session_driver',
+        'opaque',
+        'os_process',
+        'pair_compare',
+        'pair',
+        'pairup',
+        'pdf_barcode',
+        'pdf_chunk',
+        'pdf_color',
+        'pdf_doc',
+        'pdf_font',
+        'pdf_hyphenator',
+        'pdf_image',
+        'pdf_list',
+        'pdf_paragraph',
+        'pdf_phrase',
+        'pdf_read',
+        'pdf_table',
+        'pdf_text',
+        'pdf_typebase',
+        'percent',
+        'portal_impl',
+        'queriable_groupby',
+        'queriable_grouping',
+        'queriable_groupjoin',
+        'queriable_join',
+        'queriable_orderby',
+        'queriable_orderbydescending',
+        'queriable_select',
+        'queriable_selectmany',
+        'queriable_skip',
+        'queriable_take',
+        'queriable_thenby',
+        'queriable_thenbydescending',
+        'queriable_where',
+        'queue',
+        'raw_document_body',
+        'regexp',
+        'repeat',
+        'scientific',
+        'security_registry',
+        'serialization_element',
+        'serialization_object_identity_compare',
+        'serialization_reader',
+        'serialization_writer_ref',
+        'serialization_writer_standin',
+        'serialization_writer',
+        'session_delete_expired_thread',
+        'set',
+        'signature',
+        'sourcefile',
+        'sqlite_column',
+        'sqlite_currentrow',
+        'sqlite_db',
+        'sqlite_results',
+        'sqlite_session_driver_impl_entry',
+        'sqlite_session_driver_impl',
+        'sqlite_session_driver',
+        'sqlite_table',
+        'sqlite3_stmt',
+        'sqlite3',
+        'staticarray',
+        'string',
+        'sys_process',
+        'tag',
+        'text_document',
+        'tie',
+        'timeonly',
+        'trait',
+        'tree_base',
+        'tree_node',
+        'tree_nullnode',
+        'ucal',
+        'usgcpu',
+        'usgvm',
+        'void',
+        'web_error_atend',
+        'web_node_base',
+        'web_node_content_representation_css_specialized',
+        'web_node_content_representation_html_specialized',
+        'web_node_content_representation_js_specialized',
+        'web_node_content_representation_xhr_container',
+        'web_node_echo',
+        'web_node_root',
+        'web_request_impl',
+        'web_request',
+        'web_response_impl',
+        'web_response',
+        'web_router',
+        'websocket_handler',
+        'worker_pool',
+        'xml_attr',
+        'xml_cdatasection',
+        'xml_characterdata',
+        'xml_comment',
+        'xml_document',
+        'xml_documentfragment',
+        'xml_documenttype',
+        'xml_domimplementation',
+        'xml_element',
+        'xml_entity',
+        'xml_entityreference',
+        'xml_namednodemap_attr',
+        'xml_namednodemap_ht',
+        'xml_namednodemap',
+        'xml_node',
+        'xml_nodelist',
+        'xml_notation',
+        'xml_processinginstruction',
+        'xml_text',
+        'xmlstream',
+        'zip_file_impl',
+        'zip_file',
+        'zip_impl',
+        'zip',
+    ),
+    'Traits': (
+        'any',
+        'formattingbase',
+        'html_attributed',
+        'html_element_coreattrs',
+        'html_element_eventsattrs',
+        'html_element_i18nattrs',
+        'lassoapp_capabilities',
+        'lassoapp_resource',
+        'lassoapp_source',
+        'queriable_asstring',
+        'session_driver',
+        'trait_array',
+        'trait_asstring',
+        'trait_backcontractible',
+        'trait_backended',
+        'trait_backexpandable',
+        'trait_close',
+        'trait_contractible',
+        'trait_decompose_assignment',
+        'trait_doubleended',
+        'trait_each_sub',
+        'trait_encodeurl',
+        'trait_endedfullymutable',
+        'trait_expandable',
+        'trait_file',
+        'trait_finite',
+        'trait_finiteforeach',
+        'trait_foreach',
+        'trait_foreachtextelement',
+        'trait_frontcontractible',
+        'trait_frontended',
+        'trait_frontexpandable',
+        'trait_fullymutable',
+        'trait_generator',
+        'trait_generatorcentric',
+        'trait_hashable',
+        'trait_json_serialize',
+        'trait_keyed',
+        'trait_keyedfinite',
+        'trait_keyedforeach',
+        'trait_keyedmutable',
+        'trait_list',
+        'trait_map',
+        'trait_net',
+        'trait_pathcomponents',
+        'trait_positionallykeyed',
+        'trait_positionallysearchable',
+        'trait_queriable',
+        'trait_queriablelambda',
+        'trait_readbytes',
+        'trait_readstring',
+        'trait_scalar',
+        'trait_searchable',
+        'trait_serializable',
+        'trait_setencoding',
+        'trait_setoperations',
+        'trait_stack',
+        'trait_treenode',
+        'trait_writebytes',
+        'trait_writestring',
+        'trait_xml_elementcompat',
+        'trait_xml_nodecompat',
+        'web_connection',
+        'web_node_container',
+        'web_node_content_css_specialized',
+        'web_node_content_document',
+        'web_node_content_html_specialized',
+        'web_node_content_js_specialized',
+        'web_node_content_json_specialized',
+        'web_node_content_representation',
+        'web_node_content',
+        'web_node_postable',
+        'web_node',
+    ),
+    'Unbound Methods': (
+        'abort_clear',
+        'abort_now',
+        'abort',
+        'action_param',
+        'action_params',
+        'action_statement',
+        'admin_authorization',
+        'admin_currentgroups',
+        'admin_currentuserid',
+        'admin_currentusername',
+        'admin_getpref',
+        'admin_initialize',
+        'admin_lassoservicepath',
+        'admin_removepref',
+        'admin_setpref',
+        'admin_userexists',
+        'all',
+        'auth_admin',
+        'auth_check',
+        'auth_custom',
+        'auth_group',
+        'auth_prompt',
+        'auth_user',
+        'bom_utf16be',
+        'bom_utf16le',
+        'bom_utf32be',
+        'bom_utf32le',
+        'bom_utf8',
+        'bw',
+        'capture_nearestloopabort',
+        'capture_nearestloopcontinue',
+        'capture_nearestloopcount',
+        'checked',
+        'cipher_decrypt_private',
+        'cipher_decrypt_public',
+        'cipher_decrypt',
+        'cipher_digest',
+        'cipher_encrypt_private',
+        'cipher_encrypt_public',
+        'cipher_encrypt',
+        'cipher_generate_key',
+        'cipher_hmac',
+        'cipher_keylength',
+        'cipher_list',
+        'cipher_open',
+        'cipher_seal',
+        'cipher_sign',
+        'cipher_verify',
+        'client_addr',
+        'client_authorization',
+        'client_browser',
+        'client_contentlength',
+        'client_contenttype',
+        'client_cookielist',
+        'client_cookies',
+        'client_encoding',
+        'client_formmethod',
+        'client_getargs',
+        'client_getparam',
+        'client_getparams',
+        'client_headers',
+        'client_integertoip',
+        'client_iptointeger',
+        'client_password',
+        'client_postargs',
+        'client_postparam',
+        'client_postparams',
+        'client_type',
+        'client_url',
+        'client_username',
+        'cn',
+        'column_name',
+        'column_names',
+        'column_type',
+        'column',
+        'compress',
+        'content_addheader',
+        'content_body',
+        'content_encoding',
+        'content_header',
+        'content_replaceheader',
+        'content_type',
+        'cookie_set',
+        'cookie',
+        'curl_easy_cleanup',
+        'curl_easy_duphandle',
+        'curl_easy_getinfo',
+        'curl_easy_init',
+        'curl_easy_reset',
+        'curl_easy_setopt',
+        'curl_easy_strerror',
+        'curl_getdate',
+        'curl_http_version_1_0',
+        'curl_http_version_1_1',
+        'curl_http_version_none',
+        'curl_ipresolve_v4',
+        'curl_ipresolve_v6',
+        'curl_ipresolve_whatever',
+        'curl_multi_perform',
+        'curl_multi_result',
+        'curl_netrc_ignored',
+        'curl_netrc_optional',
+        'curl_netrc_required',
+        'curl_sslversion_default',
+        'curl_sslversion_sslv2',
+        'curl_sslversion_sslv3',
+        'curl_sslversion_tlsv1',
+        'curl_version_asynchdns',
+        'curl_version_debug',
+        'curl_version_gssnegotiate',
+        'curl_version_idn',
+        'curl_version_info',
+        'curl_version_ipv6',
+        'curl_version_kerberos4',
+        'curl_version_largefile',
+        'curl_version_libz',
+        'curl_version_ntlm',
+        'curl_version_spnego',
+        'curl_version_ssl',
+        'curl_version',
+        'curlauth_any',
+        'curlauth_anysafe',
+        'curlauth_basic',
+        'curlauth_digest',
+        'curlauth_gssnegotiate',
+        'curlauth_none',
+        'curlauth_ntlm',
+        'curle_aborted_by_callback',
+        'curle_bad_calling_order',
+        'curle_bad_content_encoding',
+        'curle_bad_download_resume',
+        'curle_bad_function_argument',
+        'curle_bad_password_entered',
+        'curle_couldnt_connect',
+        'curle_couldnt_resolve_host',
+        'curle_couldnt_resolve_proxy',
+        'curle_failed_init',
+        'curle_file_couldnt_read_file',
+        'curle_filesize_exceeded',
+        'curle_ftp_access_denied',
+        'curle_ftp_cant_get_host',
+        'curle_ftp_cant_reconnect',
+        'curle_ftp_couldnt_get_size',
+        'curle_ftp_couldnt_retr_file',
+        'curle_ftp_couldnt_set_ascii',
+        'curle_ftp_couldnt_set_binary',
+        'curle_ftp_couldnt_use_rest',
+        'curle_ftp_port_failed',
+        'curle_ftp_quote_error',
+        'curle_ftp_ssl_failed',
+        'curle_ftp_user_password_incorrect',
+        'curle_ftp_weird_227_format',
+        'curle_ftp_weird_pass_reply',
+        'curle_ftp_weird_pasv_reply',
+        'curle_ftp_weird_server_reply',
+        'curle_ftp_weird_user_reply',
+        'curle_ftp_write_error',
+        'curle_function_not_found',
+        'curle_got_nothing',
+        'curle_http_post_error',
+        'curle_http_range_error',
+        'curle_http_returned_error',
+        'curle_interface_failed',
+        'curle_ldap_cannot_bind',
+        'curle_ldap_invalid_url',
+        'curle_ldap_search_failed',
+        'curle_library_not_found',
+        'curle_login_denied',
+        'curle_malformat_user',
+        'curle_obsolete',
+        'curle_ok',
+        'curle_operation_timeouted',
+        'curle_out_of_memory',
+        'curle_partial_file',
+        'curle_read_error',
+        'curle_recv_error',
+        'curle_send_error',
+        'curle_send_fail_rewind',
+        'curle_share_in_use',
+        'curle_ssl_cacert',
+        'curle_ssl_certproblem',
+        'curle_ssl_cipher',
+        'curle_ssl_connect_error',
+        'curle_ssl_engine_initfailed',
+        'curle_ssl_engine_notfound',
+        'curle_ssl_engine_setfailed',
+        'curle_ssl_peer_certificate',
+        'curle_telnet_option_syntax',
+        'curle_too_many_redirects',
+        'curle_unknown_telnet_option',
+        'curle_unsupported_protocol',
+        'curle_url_malformat_user',
+        'curle_url_malformat',
+        'curle_write_error',
+        'curlftpauth_default',
+        'curlftpauth_ssl',
+        'curlftpauth_tls',
+        'curlftpssl_all',
+        'curlftpssl_control',
+        'curlftpssl_last',
+        'curlftpssl_none',
+        'curlftpssl_try',
+        'curlinfo_connect_time',
+        'curlinfo_content_length_download',
+        'curlinfo_content_length_upload',
+        'curlinfo_content_type',
+        'curlinfo_effective_url',
+        'curlinfo_filetime',
+        'curlinfo_header_size',
+        'curlinfo_http_connectcode',
+        'curlinfo_httpauth_avail',
+        'curlinfo_namelookup_time',
+        'curlinfo_num_connects',
+        'curlinfo_os_errno',
+        'curlinfo_pretransfer_time',
+        'curlinfo_proxyauth_avail',
+        'curlinfo_redirect_count',
+        'curlinfo_redirect_time',
+        'curlinfo_request_size',
+        'curlinfo_response_code',
+        'curlinfo_size_download',
+        'curlinfo_size_upload',
+        'curlinfo_speed_download',
+        'curlinfo_speed_upload',
+        'curlinfo_ssl_engines',
+        'curlinfo_ssl_verifyresult',
+        'curlinfo_starttransfer_time',
+        'curlinfo_total_time',
+        'curlmsg_done',
+        'curlopt_autoreferer',
+        'curlopt_buffersize',
+        'curlopt_cainfo',
+        'curlopt_capath',
+        'curlopt_connecttimeout',
+        'curlopt_cookie',
+        'curlopt_cookiefile',
+        'curlopt_cookiejar',
+        'curlopt_cookiesession',
+        'curlopt_crlf',
+        'curlopt_customrequest',
+        'curlopt_dns_use_global_cache',
+        'curlopt_egdsocket',
+        'curlopt_encoding',
+        'curlopt_failonerror',
+        'curlopt_filetime',
+        'curlopt_followlocation',
+        'curlopt_forbid_reuse',
+        'curlopt_fresh_connect',
+        'curlopt_ftp_account',
+        'curlopt_ftp_create_missing_dirs',
+        'curlopt_ftp_response_timeout',
+        'curlopt_ftp_ssl',
+        'curlopt_ftp_use_eprt',
+        'curlopt_ftp_use_epsv',
+        'curlopt_ftpappend',
+        'curlopt_ftplistonly',
+        'curlopt_ftpport',
+        'curlopt_ftpsslauth',
+        'curlopt_header',
+        'curlopt_http_version',
+        'curlopt_http200aliases',
+        'curlopt_httpauth',
+        'curlopt_httpget',
+        'curlopt_httpheader',
+        'curlopt_httppost',
+        'curlopt_httpproxytunnel',
+        'curlopt_infilesize_large',
+        'curlopt_infilesize',
+        'curlopt_interface',
+        'curlopt_ipresolve',
+        'curlopt_krb4level',
+        'curlopt_low_speed_limit',
+        'curlopt_low_speed_time',
+        'curlopt_mail_from',
+        'curlopt_mail_rcpt',
+        'curlopt_maxconnects',
+        'curlopt_maxfilesize_large',
+        'curlopt_maxfilesize',
+        'curlopt_maxredirs',
+        'curlopt_netrc_file',
+        'curlopt_netrc',
+        'curlopt_nobody',
+        'curlopt_noprogress',
+        'curlopt_port',
+        'curlopt_post',
+        'curlopt_postfields',
+        'curlopt_postfieldsize_large',
+        'curlopt_postfieldsize',
+        'curlopt_postquote',
+        'curlopt_prequote',
+        'curlopt_proxy',
+        'curlopt_proxyauth',
+        'curlopt_proxyport',
+        'curlopt_proxytype',
+        'curlopt_proxyuserpwd',
+        'curlopt_put',
+        'curlopt_quote',
+        'curlopt_random_file',
+        'curlopt_range',
+        'curlopt_readdata',
+        'curlopt_referer',
+        'curlopt_resume_from_large',
+        'curlopt_resume_from',
+        'curlopt_ssl_cipher_list',
+        'curlopt_ssl_verifyhost',
+        'curlopt_ssl_verifypeer',
+        'curlopt_sslcert',
+        'curlopt_sslcerttype',
+        'curlopt_sslengine_default',
+        'curlopt_sslengine',
+        'curlopt_sslkey',
+        'curlopt_sslkeypasswd',
+        'curlopt_sslkeytype',
+        'curlopt_sslversion',
+        'curlopt_tcp_nodelay',
+        'curlopt_timecondition',
+        'curlopt_timeout',
+        'curlopt_timevalue',
+        'curlopt_transfertext',
+        'curlopt_unrestricted_auth',
+        'curlopt_upload',
+        'curlopt_url',
+        'curlopt_use_ssl',
+        'curlopt_useragent',
+        'curlopt_userpwd',
+        'curlopt_verbose',
+        'curlopt_writedata',
+        'curlproxy_http',
+        'curlproxy_socks4',
+        'curlproxy_socks5',
+        'database_adddefaultsqlitehost',
+        'database_database',
+        'database_initialize',
+        'database_name',
+        'database_qs',
+        'database_table_database_tables',
+        'database_table_datasource_databases',
+        'database_table_datasource_hosts',
+        'database_table_datasources',
+        'database_table_table_fields',
+        'database_util_cleanpath',
+        'dbgp_stop_stack_name',
+        'debugging_break',
+        'debugging_breakpoint_get',
+        'debugging_breakpoint_list',
+        'debugging_breakpoint_remove',
+        'debugging_breakpoint_set',
+        'debugging_breakpoint_update',
+        'debugging_context_locals',
+        'debugging_context_self',
+        'debugging_context_vars',
+        'debugging_detach',
+        'debugging_enabled',
+        'debugging_get_context',
+        'debugging_get_stack',
+        'debugging_run',
+        'debugging_step_in',
+        'debugging_step_out',
+        'debugging_step_over',
+        'debugging_stop',
+        'debugging_terminate',
+        'decimal_random',
+        'decompress',
+        'decrypt_blowfish',
+        'define_atbegin',
+        'define_atend',
+        'dns_default',
+        'dns_lookup',
+        'document',
+        'email_attachment_mime_type',
+        'email_batch',
+        'email_digestchallenge',
+        'email_digestresponse',
+        'email_extract',
+        'email_findemails',
+        'email_fix_address_list',
+        'email_fix_address',
+        'email_fs_error_clean',
+        'email_immediate',
+        'email_initialize',
+        'email_merge',
+        'email_mxlookup',
+        'email_pop_priv_extract',
+        'email_pop_priv_quote',
+        'email_pop_priv_substring',
+        'email_queue',
+        'email_result',
+        'email_safeemail',
+        'email_send',
+        'email_status',
+        'email_token',
+        'email_translatebreakstocrlf',
+        'encode_qheader',
+        'encoding_iso88591',
+        'encoding_utf8',
+        'encrypt_blowfish',
+        'encrypt_crammd5',
+        'encrypt_hmac',
+        'encrypt_md5',
+        'eol',
+        'eq',
+        'error_code_aborted',
+        'error_code_dividebyzero',
+        'error_code_filenotfound',
+        'error_code_invalidparameter',
+        'error_code_methodnotfound',
+        'error_code_networkerror',
+        'error_code_noerror',
+        'error_code_resnotfound',
+        'error_code_runtimeassertion',
+        'error_code',
+        'error_msg_aborted',
+        'error_msg_dividebyzero',
+        'error_msg_filenotfound',
+        'error_msg_invalidparameter',
+        'error_msg_methodnotfound',
+        'error_msg_networkerror',
+        'error_msg_noerror',
+        'error_msg_resnotfound',
+        'error_msg_runtimeassertion',
+        'error_msg',
+        'error_obj',
+        'error_pop',
+        'error_push',
+        'error_reset',
+        'error_stack',
+        'escape_tag',
+        'evdns_resolve_ipv4',
+        'evdns_resolve_ipv6',
+        'evdns_resolve_reverse_ipv6',
+        'evdns_resolve_reverse',
+        'ew',
+        'fail_if',
+        'fail_ifnot',
+        'fail_now',
+        'fail',
+        'failure_clear',
+        'fastcgi_createfcgirequest',
+        'fastcgi_handlecon',
+        'fastcgi_handlereq',
+        'fastcgi_initialize',
+        'fastcgi_initiate_request',
+        'fcgi_abort_request',
+        'fcgi_authorize',
+        'fcgi_begin_request',
+        'fcgi_bodychunksize',
+        'fcgi_cant_mpx_conn',
+        'fcgi_data',
+        'fcgi_end_request',
+        'fcgi_filter',
+        'fcgi_get_values_result',
+        'fcgi_get_values',
+        'fcgi_keep_conn',
+        'fcgi_makeendrequestbody',
+        'fcgi_makestdoutbody',
+        'fcgi_max_conns',
+        'fcgi_max_reqs',
+        'fcgi_mpxs_conns',
+        'fcgi_null_request_id',
+        'fcgi_overloaded',
+        'fcgi_params',
+        'fcgi_read_timeout_seconds',
+        'fcgi_readparam',
+        'fcgi_request_complete',
+        'fcgi_responder',
+        'fcgi_stderr',
+        'fcgi_stdin',
+        'fcgi_stdout',
+        'fcgi_unknown_role',
+        'fcgi_unknown_type',
+        'fcgi_version_1',
+        'fcgi_x_stdin',
+        'field_name',
+        'field_names',
+        'field',
+        'file_copybuffersize',
+        'file_defaultencoding',
+        'file_forceroot',
+        'file_modechar',
+        'file_modeline',
+        'file_stderr',
+        'file_stdin',
+        'file_stdout',
+        'file_tempfile',
+        'filemakerds_initialize',
+        'filemakerds',
+        'found_count',
+        'ft',
+        'ftp_deletefile',
+        'ftp_getdata',
+        'ftp_getfile',
+        'ftp_getlisting',
+        'ftp_putdata',
+        'ftp_putfile',
+        'full',
+        'generateforeach',
+        'gt',
+        'gte',
+        'handle_failure',
+        'handle',
+        'hash_primes',
+        'html_comment',
+        'http_char_colon',
+        'http_char_cr',
+        'http_char_htab',
+        'http_char_lf',
+        'http_char_question',
+        'http_char_space',
+        'http_default_files',
+        'http_read_headers',
+        'http_read_timeout_secs',
+        'http_server_apps_path',
+        'http_server_request_logger',
+        'if_empty',
+        'if_false',
+        'if_null',
+        'if_true',
+        'include_cache_compare',
+        'include_currentpath',
+        'include_filepath',
+        'include_localpath',
+        'include_once',
+        'include_path',
+        'include_raw',
+        'include_url',
+        'include',
+        'includes',
+        'inline_colinfo_name_pos',
+        'inline_colinfo_type_pos',
+        'inline_colinfo_valuelist_pos',
+        'inline_columninfo_pos',
+        'inline_foundcount_pos',
+        'inline_namedget',
+        'inline_namedput',
+        'inline_resultrows_pos',
+        'inline_scopeget',
+        'inline_scopepop',
+        'inline_scopepush',
+        'inline',
+        'integer_bitor',
+        'integer_random',
+        'io_dir_dt_blk',
+        'io_dir_dt_chr',
+        'io_dir_dt_dir',
+        'io_dir_dt_fifo',
+        'io_dir_dt_lnk',
+        'io_dir_dt_reg',
+        'io_dir_dt_sock',
+        'io_dir_dt_unknown',
+        'io_dir_dt_wht',
+        'io_file_access',
+        'io_file_chdir',
+        'io_file_chmod',
+        'io_file_chown',
+        'io_file_dirname',
+        'io_file_f_dupfd',
+        'io_file_f_getfd',
+        'io_file_f_getfl',
+        'io_file_f_getlk',
+        'io_file_f_rdlck',
+        'io_file_f_setfd',
+        'io_file_f_setfl',
+        'io_file_f_setlk',
+        'io_file_f_setlkw',
+        'io_file_f_test',
+        'io_file_f_tlock',
+        'io_file_f_ulock',
+        'io_file_f_unlck',
+        'io_file_f_wrlck',
+        'io_file_fd_cloexec',
+        'io_file_fioasync',
+        'io_file_fioclex',
+        'io_file_fiodtype',
+        'io_file_fiogetown',
+        'io_file_fionbio',
+        'io_file_fionclex',
+        'io_file_fionread',
+        'io_file_fiosetown',
+        'io_file_getcwd',
+        'io_file_lchown',
+        'io_file_link',
+        'io_file_lockf',
+        'io_file_lstat_atime',
+        'io_file_lstat_mode',
+        'io_file_lstat_mtime',
+        'io_file_lstat_size',
+        'io_file_mkdir',
+        'io_file_mkfifo',
+        'io_file_mkstemp',
+        'io_file_o_append',
+        'io_file_o_async',
+        'io_file_o_creat',
+        'io_file_o_excl',
+        'io_file_o_exlock',
+        'io_file_o_fsync',
+        'io_file_o_nofollow',
+        'io_file_o_nonblock',
+        'io_file_o_rdonly',
+        'io_file_o_rdwr',
+        'io_file_o_shlock',
+        'io_file_o_sync',
+        'io_file_o_trunc',
+        'io_file_o_wronly',
+        'io_file_pipe',
+        'io_file_readlink',
+        'io_file_realpath',
+        'io_file_remove',
+        'io_file_rename',
+        'io_file_rmdir',
+        'io_file_s_ifblk',
+        'io_file_s_ifchr',
+        'io_file_s_ifdir',
+        'io_file_s_ififo',
+        'io_file_s_iflnk',
+        'io_file_s_ifmt',
+        'io_file_s_ifreg',
+        'io_file_s_ifsock',
+        'io_file_s_irgrp',
+        'io_file_s_iroth',
+        'io_file_s_irusr',
+        'io_file_s_irwxg',
+        'io_file_s_irwxo',
+        'io_file_s_irwxu',
+        'io_file_s_isgid',
+        'io_file_s_isuid',
+        'io_file_s_isvtx',
+        'io_file_s_iwgrp',
+        'io_file_s_iwoth',
+        'io_file_s_iwusr',
+        'io_file_s_ixgrp',
+        'io_file_s_ixoth',
+        'io_file_s_ixusr',
+        'io_file_seek_cur',
+        'io_file_seek_end',
+        'io_file_seek_set',
+        'io_file_stat_atime',
+        'io_file_stat_mode',
+        'io_file_stat_mtime',
+        'io_file_stat_size',
+        'io_file_stderr',
+        'io_file_stdin',
+        'io_file_stdout',
+        'io_file_symlink',
+        'io_file_tempnam',
+        'io_file_truncate',
+        'io_file_umask',
+        'io_file_unlink',
+        'io_net_accept',
+        'io_net_af_inet',
+        'io_net_af_inet6',
+        'io_net_af_unix',
+        'io_net_bind',
+        'io_net_connect',
+        'io_net_getpeername',
+        'io_net_getsockname',
+        'io_net_ipproto_ip',
+        'io_net_ipproto_udp',
+        'io_net_listen',
+        'io_net_msg_oob',
+        'io_net_msg_peek',
+        'io_net_msg_waitall',
+        'io_net_recv',
+        'io_net_recvfrom',
+        'io_net_send',
+        'io_net_sendto',
+        'io_net_shut_rd',
+        'io_net_shut_rdwr',
+        'io_net_shut_wr',
+        'io_net_shutdown',
+        'io_net_so_acceptconn',
+        'io_net_so_broadcast',
+        'io_net_so_debug',
+        'io_net_so_dontroute',
+        'io_net_so_error',
+        'io_net_so_keepalive',
+        'io_net_so_linger',
+        'io_net_so_oobinline',
+        'io_net_so_rcvbuf',
+        'io_net_so_rcvlowat',
+        'io_net_so_rcvtimeo',
+        'io_net_so_reuseaddr',
+        'io_net_so_sndbuf',
+        'io_net_so_sndlowat',
+        'io_net_so_sndtimeo',
+        'io_net_so_timestamp',
+        'io_net_so_type',
+        'io_net_so_useloopback',
+        'io_net_sock_dgram',
+        'io_net_sock_raw',
+        'io_net_sock_rdm',
+        'io_net_sock_seqpacket',
+        'io_net_sock_stream',
+        'io_net_socket',
+        'io_net_sol_socket',
+        'io_net_ssl_accept',
+        'io_net_ssl_begin',
+        'io_net_ssl_connect',
+        'io_net_ssl_end',
+        'io_net_ssl_error',
+        'io_net_ssl_errorstring',
+        'io_net_ssl_funcerrorstring',
+        'io_net_ssl_liberrorstring',
+        'io_net_ssl_read',
+        'io_net_ssl_reasonerrorstring',
+        'io_net_ssl_setacceptstate',
+        'io_net_ssl_setconnectstate',
+        'io_net_ssl_setverifylocations',
+        'io_net_ssl_shutdown',
+        'io_net_ssl_usecertificatechainfile',
+        'io_net_ssl_useprivatekeyfile',
+        'io_net_ssl_write',
+        'java_jvm_create',
+        'java_jvm_getenv',
+        'jdbc_initialize',
+        'json_back_slash',
+        'json_back_space',
+        'json_close_array',
+        'json_close_object',
+        'json_colon',
+        'json_comma',
+        'json_consume_array',
+        'json_consume_object',
+        'json_consume_string',
+        'json_consume_token',
+        'json_cr',
+        'json_debug',
+        'json_deserialize',
+        'json_e_lower',
+        'json_e_upper',
+        'json_f_lower',
+        'json_form_feed',
+        'json_forward_slash',
+        'json_lf',
+        'json_n_lower',
+        'json_negative',
+        'json_open_array',
+        'json_open_object',
+        'json_period',
+        'json_positive',
+        'json_quote_double',
+        'json_rpccall',
+        'json_serialize',
+        'json_t_lower',
+        'json_tab',
+        'json_white_space',
+        'keycolumn_name',
+        'keycolumn_value',
+        'keyfield_name',
+        'keyfield_value',
+        'lasso_currentaction',
+        'lasso_errorreporting',
+        'lasso_executiontimelimit',
+        'lasso_methodexists',
+        'lasso_tagexists',
+        'lasso_uniqueid',
+        'lasso_version',
+        'lassoapp_current_app',
+        'lassoapp_current_include',
+        'lassoapp_do_with_include',
+        'lassoapp_exists',
+        'lassoapp_find_missing_file',
+        'lassoapp_format_mod_date',
+        'lassoapp_get_capabilities_name',
+        'lassoapp_include_current',
+        'lassoapp_include',
+        'lassoapp_initialize_db',
+        'lassoapp_initialize',
+        'lassoapp_invoke_resource',
+        'lassoapp_issourcefileextension',
+        'lassoapp_link',
+        'lassoapp_load_module',
+        'lassoapp_mime_get',
+        'lassoapp_mime_type_appcache',
+        'lassoapp_mime_type_css',
+        'lassoapp_mime_type_csv',
+        'lassoapp_mime_type_doc',
+        'lassoapp_mime_type_docx',
+        'lassoapp_mime_type_eof',
+        'lassoapp_mime_type_eot',
+        'lassoapp_mime_type_gif',
+        'lassoapp_mime_type_html',
+        'lassoapp_mime_type_ico',
+        'lassoapp_mime_type_jpg',
+        'lassoapp_mime_type_js',
+        'lassoapp_mime_type_lasso',
+        'lassoapp_mime_type_map',
+        'lassoapp_mime_type_pdf',
+        'lassoapp_mime_type_png',
+        'lassoapp_mime_type_ppt',
+        'lassoapp_mime_type_rss',
+        'lassoapp_mime_type_svg',
+        'lassoapp_mime_type_swf',
+        'lassoapp_mime_type_tif',
+        'lassoapp_mime_type_ttf',
+        'lassoapp_mime_type_txt',
+        'lassoapp_mime_type_woff',
+        'lassoapp_mime_type_xaml',
+        'lassoapp_mime_type_xap',
+        'lassoapp_mime_type_xbap',
+        'lassoapp_mime_type_xhr',
+        'lassoapp_mime_type_xml',
+        'lassoapp_mime_type_zip',
+        'lassoapp_path_to_method_name',
+        'lassoapp_settingsdb',
+        'layout_name',
+        'lcapi_datasourceadd',
+        'lcapi_datasourcecloseconnection',
+        'lcapi_datasourcedelete',
+        'lcapi_datasourceduplicate',
+        'lcapi_datasourceexecsql',
+        'lcapi_datasourcefindall',
+        'lcapi_datasourceimage',
+        'lcapi_datasourceinfo',
+        'lcapi_datasourceinit',
+        'lcapi_datasourcematchesname',
+        'lcapi_datasourcenames',
+        'lcapi_datasourcenothing',
+        'lcapi_datasourceopand',
+        'lcapi_datasourceopany',
+        'lcapi_datasourceopbw',
+        'lcapi_datasourceopct',
+        'lcapi_datasourceopeq',
+        'lcapi_datasourceopew',
+        'lcapi_datasourceopft',
+        'lcapi_datasourceopgt',
+        'lcapi_datasourceopgteq',
+        'lcapi_datasourceopin',
+        'lcapi_datasourceoplt',
+        'lcapi_datasourceoplteq',
+        'lcapi_datasourceopnbw',
+        'lcapi_datasourceopnct',
+        'lcapi_datasourceopneq',
+        'lcapi_datasourceopnew',
+        'lcapi_datasourceopnin',
+        'lcapi_datasourceopno',
+        'lcapi_datasourceopnot',
+        'lcapi_datasourceopnrx',
+        'lcapi_datasourceopor',
+        'lcapi_datasourceoprx',
+        'lcapi_datasourcepreparesql',
+        'lcapi_datasourceprotectionnone',
+        'lcapi_datasourceprotectionreadonly',
+        'lcapi_datasourcerandom',
+        'lcapi_datasourceschemanames',
+        'lcapi_datasourcescripts',
+        'lcapi_datasourcesearch',
+        'lcapi_datasourcesortascending',
+        'lcapi_datasourcesortcustom',
+        'lcapi_datasourcesortdescending',
+        'lcapi_datasourcetablenames',
+        'lcapi_datasourceterm',
+        'lcapi_datasourcetickle',
+        'lcapi_datasourcetypeblob',
+        'lcapi_datasourcetypeboolean',
+        'lcapi_datasourcetypedate',
+        'lcapi_datasourcetypedecimal',
+        'lcapi_datasourcetypeinteger',
+        'lcapi_datasourcetypestring',
+        'lcapi_datasourceunpreparesql',
+        'lcapi_datasourceupdate',
+        'lcapi_fourchartointeger',
+        'lcapi_listdatasources',
+        'lcapi_loadmodule',
+        'lcapi_loadmodules',
+        'lcapi_updatedatasourceslist',
+        'ldap_scope_base',
+        'ldap_scope_children',
+        'ldap_scope_onelevel',
+        'ldap_scope_subtree',
+        'library_once',
+        'library',
+        'ljapi_initialize',
+        'locale_availablelocales',
+        'locale_canada',
+        'locale_canadafrench',
+        'locale_china',
+        'locale_chinese',
+        'locale_default',
+        'locale_english',
+        'locale_format_style_date_time',
+        'locale_format_style_default',
+        'locale_format_style_full',
+        'locale_format_style_long',
+        'locale_format_style_medium',
+        'locale_format_style_none',
+        'locale_format_style_short',
+        'locale_format',
+        'locale_france',
+        'locale_french',
+        'locale_german',
+        'locale_germany',
+        'locale_isocountries',
+        'locale_isolanguages',
+        'locale_italian',
+        'locale_italy',
+        'locale_japan',
+        'locale_japanese',
+        'locale_korea',
+        'locale_korean',
+        'locale_prc',
+        'locale_setdefault',
+        'locale_simplifiedchinese',
+        'locale_taiwan',
+        'locale_traditionalchinese',
+        'locale_uk',
+        'locale_us',
+        'log_always',
+        'log_critical',
+        'log_deprecated',
+        'log_destination_console',
+        'log_destination_database',
+        'log_destination_file',
+        'log_detail',
+        'log_initialize',
+        'log_level_critical',
+        'log_level_deprecated',
+        'log_level_detail',
+        'log_level_sql',
+        'log_level_warning',
+        'log_max_file_size',
+        'log_setdestination',
+        'log_sql',
+        'log_trim_file_size',
+        'log_warning',
+        'log',
+        'loop_abort',
+        'loop_continue',
+        'loop_count',
+        'loop_key_pop',
+        'loop_key_push',
+        'loop_key',
+        'loop_pop',
+        'loop_push',
+        'loop_value_pop',
+        'loop_value_push',
+        'loop_value',
+        'loop',
+        'lt',
+        'lte',
+        'main_thread_only',
+        'max',
+        'maxrecords_value',
+        'median',
+        'method_name',
+        'micros',
+        'millis',
+        'min',
+        'minimal',
+        'mongo_insert_continue_on_error',
+        'mongo_insert_no_validate',
+        'mongo_insert_none',
+        'mongo_query_await_data',
+        'mongo_query_exhaust',
+        'mongo_query_no_cursor_timeout',
+        'mongo_query_none',
+        'mongo_query_oplog_replay',
+        'mongo_query_partial',
+        'mongo_query_slave_ok',
+        'mongo_query_tailable_cursor',
+        'mongo_remove_none',
+        'mongo_remove_single_remove',
+        'mongo_update_multi_update',
+        'mongo_update_no_validate',
+        'mongo_update_none',
+        'mongo_update_upsert',
+        'mustache_compile_file',
+        'mustache_compile_string',
+        'mustache_include',
+        'mysqlds',
+        'namespace_global',
+        'namespace_import',
+        'namespace_using',
+        'nbw',
+        'ncn',
+        'neq',
+        'net_connectinprogress',
+        'net_connectok',
+        'net_typessl',
+        'net_typessltcp',
+        'net_typessludp',
+        'net_typetcp',
+        'net_typeudp',
+        'net_waitread',
+        'net_waittimeout',
+        'net_waitwrite',
+        'new',
+        'none',
+        'nrx',
+        'nslookup',
+        'odbc_session_driver_mssql',
+        'odbc',
+        'output_none',
+        'output',
+        'pdf_package',
+        'pdf_rectangle',
+        'pdf_serve',
+        'pi',
+        'portal',
+        'postgresql',
+        'process',
+        'protect_now',
+        'protect',
+        'queriable_average',
+        'queriable_defaultcompare',
+        'queriable_do',
+        'queriable_internal_combinebindings',
+        'queriable_max',
+        'queriable_min',
+        'queriable_qsort',
+        'queriable_reversecompare',
+        'queriable_sum',
+        'random_seed',
+        'range',
+        'records_array',
+        'records_map',
+        'records',
+        'redirect_url',
+        'referer_url',
+        'referrer_url',
+        'register_thread',
+        'register',
+        'response_filepath',
+        'response_localpath',
+        'response_path',
+        'response_realm',
+        'response_root',
+        'resultset_count',
+        'resultset',
+        'resultsets',
+        'rows_array',
+        'rows_impl',
+        'rows',
+        'rx',
+        'schema_name',
+        'security_database',
+        'security_default_realm',
+        'security_initialize',
+        'security_table_groups',
+        'security_table_ug_map',
+        'security_table_users',
+        'selected',
+        'series',
+        'server_admin',
+        'server_ip',
+        'server_name',
+        'server_port',
+        'server_protocol',
+        'server_push',
+        'server_signature',
+        'server_software',
+        'session_abort',
+        'session_addvar',
+        'session_decorate',
+        'session_deleteexpired',
+        'session_end',
+        'session_getdefaultdriver',
+        'session_id',
+        'session_initialize',
+        'session_removevar',
+        'session_result',
+        'session_setdefaultdriver',
+        'session_start',
+        'shown_count',
+        'shown_first',
+        'shown_last',
+        'site_id',
+        'site_name',
+        'skiprecords_value',
+        'sleep',
+        'split_thread',
+        'sqlite_abort',
+        'sqlite_auth',
+        'sqlite_blob',
+        'sqlite_busy',
+        'sqlite_cantopen',
+        'sqlite_constraint',
+        'sqlite_corrupt',
+        'sqlite_createdb',
+        'sqlite_done',
+        'sqlite_empty',
+        'sqlite_error',
+        'sqlite_float',
+        'sqlite_format',
+        'sqlite_full',
+        'sqlite_integer',
+        'sqlite_internal',
+        'sqlite_interrupt',
+        'sqlite_ioerr',
+        'sqlite_locked',
+        'sqlite_mismatch',
+        'sqlite_misuse',
+        'sqlite_nolfs',
+        'sqlite_nomem',
+        'sqlite_notadb',
+        'sqlite_notfound',
+        'sqlite_null',
+        'sqlite_ok',
+        'sqlite_perm',
+        'sqlite_protocol',
+        'sqlite_range',
+        'sqlite_readonly',
+        'sqlite_row',
+        'sqlite_schema',
+        'sqlite_setsleepmillis',
+        'sqlite_setsleeptries',
+        'sqlite_text',
+        'sqlite_toobig',
+        'sqliteconnector',
+        'staticarray_join',
+        'stdout',
+        'stdoutnl',
+        'string_validcharset',
+        'suspend',
+        'sys_appspath',
+        'sys_chroot',
+        'sys_clock',
+        'sys_clockspersec',
+        'sys_credits',
+        'sys_databasespath',
+        'sys_detach_exec',
+        'sys_difftime',
+        'sys_dll_ext',
+        'sys_drand48',
+        'sys_environ',
+        'sys_eol',
+        'sys_erand48',
+        'sys_errno',
+        'sys_exec_pid_to_os_pid',
+        'sys_exec',
+        'sys_exit',
+        'sys_fork',
+        'sys_garbagecollect',
+        'sys_getbytessincegc',
+        'sys_getchar',
+        'sys_getegid',
+        'sys_getenv',
+        'sys_geteuid',
+        'sys_getgid',
+        'sys_getgrnam',
+        'sys_getheapfreebytes',
+        'sys_getheapsize',
+        'sys_getlogin',
+        'sys_getpid',
+        'sys_getppid',
+        'sys_getpwnam',
+        'sys_getpwuid',
+        'sys_getstartclock',
+        'sys_getthreadcount',
+        'sys_getuid',
+        'sys_growheapby',
+        'sys_homepath',
+        'sys_is_full_path',
+        'sys_is_windows',
+        'sys_isfullpath',
+        'sys_iswindows',
+        'sys_iterate',
+        'sys_jrand48',
+        'sys_kill_exec',
+        'sys_kill',
+        'sys_lcong48',
+        'sys_librariespath',
+        'sys_listtraits',
+        'sys_listtypes',
+        'sys_listunboundmethods',
+        'sys_loadlibrary',
+        'sys_lrand48',
+        'sys_masterhomepath',
+        'sys_mrand48',
+        'sys_nrand48',
+        'sys_pid_exec',
+        'sys_pointersize',
+        'sys_rand',
+        'sys_random',
+        'sys_seed48',
+        'sys_setenv',
+        'sys_setgid',
+        'sys_setsid',
+        'sys_setuid',
+        'sys_sigabrt',
+        'sys_sigalrm',
+        'sys_sigbus',
+        'sys_sigchld',
+        'sys_sigcont',
+        'sys_sigfpe',
+        'sys_sighup',
+        'sys_sigill',
+        'sys_sigint',
+        'sys_sigkill',
+        'sys_sigpipe',
+        'sys_sigprof',
+        'sys_sigquit',
+        'sys_sigsegv',
+        'sys_sigstop',
+        'sys_sigsys',
+        'sys_sigterm',
+        'sys_sigtrap',
+        'sys_sigtstp',
+        'sys_sigttin',
+        'sys_sigttou',
+        'sys_sigurg',
+        'sys_sigusr1',
+        'sys_sigusr2',
+        'sys_sigvtalrm',
+        'sys_sigxcpu',
+        'sys_sigxfsz',
+        'sys_srand',
+        'sys_srand48',
+        'sys_srandom',
+        'sys_strerror',
+        'sys_supportpath',
+        'sys_test_exec',
+        'sys_time',
+        'sys_uname',
+        'sys_unsetenv',
+        'sys_usercapimodulepath',
+        'sys_userstartuppath',
+        'sys_version',
+        'sys_wait_exec',
+        'sys_waitpid',
+        'sys_wcontinued',
+        'sys_while',
+        'sys_wnohang',
+        'sys_wuntraced',
+        'table_name',
+        'tag_exists',
+        'tag_name',
+        'thread_var_get',
+        'thread_var_pop',
+        'thread_var_push',
+        'threadvar_find',
+        'threadvar_get',
+        'threadvar_set_asrt',
+        'threadvar_set',
+        'timer',
+        'token_value',
+        'treemap',
+        'u_lb_alphabetic',
+        'u_lb_ambiguous',
+        'u_lb_break_after',
+        'u_lb_break_before',
+        'u_lb_break_both',
+        'u_lb_break_symbols',
+        'u_lb_carriage_return',
+        'u_lb_close_punctuation',
+        'u_lb_combining_mark',
+        'u_lb_complex_context',
+        'u_lb_contingent_break',
+        'u_lb_exclamation',
+        'u_lb_glue',
+        'u_lb_h2',
+        'u_lb_h3',
+        'u_lb_hyphen',
+        'u_lb_ideographic',
+        'u_lb_infix_numeric',
+        'u_lb_inseparable',
+        'u_lb_jl',
+        'u_lb_jt',
+        'u_lb_jv',
+        'u_lb_line_feed',
+        'u_lb_mandatory_break',
+        'u_lb_next_line',
+        'u_lb_nonstarter',
+        'u_lb_numeric',
+        'u_lb_open_punctuation',
+        'u_lb_postfix_numeric',
+        'u_lb_prefix_numeric',
+        'u_lb_quotation',
+        'u_lb_space',
+        'u_lb_surrogate',
+        'u_lb_unknown',
+        'u_lb_word_joiner',
+        'u_lb_zwspace',
+        'u_nt_decimal',
+        'u_nt_digit',
+        'u_nt_none',
+        'u_nt_numeric',
+        'u_sb_aterm',
+        'u_sb_close',
+        'u_sb_format',
+        'u_sb_lower',
+        'u_sb_numeric',
+        'u_sb_oletter',
+        'u_sb_other',
+        'u_sb_sep',
+        'u_sb_sp',
+        'u_sb_sterm',
+        'u_sb_upper',
+        'u_wb_aletter',
+        'u_wb_extendnumlet',
+        'u_wb_format',
+        'u_wb_katakana',
+        'u_wb_midletter',
+        'u_wb_midnum',
+        'u_wb_numeric',
+        'u_wb_other',
+        'ucal_ampm',
+        'ucal_dayofmonth',
+        'ucal_dayofweek',
+        'ucal_dayofweekinmonth',
+        'ucal_dayofyear',
+        'ucal_daysinfirstweek',
+        'ucal_dowlocal',
+        'ucal_dstoffset',
+        'ucal_era',
+        'ucal_extendedyear',
+        'ucal_firstdayofweek',
+        'ucal_hour',
+        'ucal_hourofday',
+        'ucal_julianday',
+        'ucal_lenient',
+        'ucal_listtimezones',
+        'ucal_millisecond',
+        'ucal_millisecondsinday',
+        'ucal_minute',
+        'ucal_month',
+        'ucal_second',
+        'ucal_weekofmonth',
+        'ucal_weekofyear',
+        'ucal_year',
+        'ucal_yearwoy',
+        'ucal_zoneoffset',
+        'uchar_age',
+        'uchar_alphabetic',
+        'uchar_ascii_hex_digit',
+        'uchar_bidi_class',
+        'uchar_bidi_control',
+        'uchar_bidi_mirrored',
+        'uchar_bidi_mirroring_glyph',
+        'uchar_block',
+        'uchar_canonical_combining_class',
+        'uchar_case_folding',
+        'uchar_case_sensitive',
+        'uchar_dash',
+        'uchar_decomposition_type',
+        'uchar_default_ignorable_code_point',
+        'uchar_deprecated',
+        'uchar_diacritic',
+        'uchar_east_asian_width',
+        'uchar_extender',
+        'uchar_full_composition_exclusion',
+        'uchar_general_category_mask',
+        'uchar_general_category',
+        'uchar_grapheme_base',
+        'uchar_grapheme_cluster_break',
+        'uchar_grapheme_extend',
+        'uchar_grapheme_link',
+        'uchar_hangul_syllable_type',
+        'uchar_hex_digit',
+        'uchar_hyphen',
+        'uchar_id_continue',
+        'uchar_ideographic',
+        'uchar_ids_binary_operator',
+        'uchar_ids_trinary_operator',
+        'uchar_iso_comment',
+        'uchar_join_control',
+        'uchar_joining_group',
+        'uchar_joining_type',
+        'uchar_lead_canonical_combining_class',
+        'uchar_line_break',
+        'uchar_logical_order_exception',
+        'uchar_lowercase_mapping',
+        'uchar_lowercase',
+        'uchar_math',
+        'uchar_name',
+        'uchar_nfc_inert',
+        'uchar_nfc_quick_check',
+        'uchar_nfd_inert',
+        'uchar_nfd_quick_check',
+        'uchar_nfkc_inert',
+        'uchar_nfkc_quick_check',
+        'uchar_nfkd_inert',
+        'uchar_nfkd_quick_check',
+        'uchar_noncharacter_code_point',
+        'uchar_numeric_type',
+        'uchar_numeric_value',
+        'uchar_pattern_syntax',
+        'uchar_pattern_white_space',
+        'uchar_posix_alnum',
+        'uchar_posix_blank',
+        'uchar_posix_graph',
+        'uchar_posix_print',
+        'uchar_posix_xdigit',
+        'uchar_quotation_mark',
+        'uchar_radical',
+        'uchar_s_term',
+        'uchar_script',
+        'uchar_segment_starter',
+        'uchar_sentence_break',
+        'uchar_simple_case_folding',
+        'uchar_simple_lowercase_mapping',
+        'uchar_simple_titlecase_mapping',
+        'uchar_simple_uppercase_mapping',
+        'uchar_soft_dotted',
+        'uchar_terminal_punctuation',
+        'uchar_titlecase_mapping',
+        'uchar_trail_canonical_combining_class',
+        'uchar_unicode_1_name',
+        'uchar_unified_ideograph',
+        'uchar_uppercase_mapping',
+        'uchar_uppercase',
+        'uchar_variation_selector',
+        'uchar_white_space',
+        'uchar_word_break',
+        'uchar_xid_continue',
+        'uncompress',
+        'usage',
+        'uuid_compare',
+        'uuid_copy',
+        'uuid_generate_random',
+        'uuid_generate_time',
+        'uuid_generate',
+        'uuid_is_null',
+        'uuid_parse',
+        'uuid_unparse_lower',
+        'uuid_unparse_upper',
+        'uuid_unparse',
+        'value_list',
+        'value_listitem',
+        'valuelistitem',
+        'var_keys',
+        'var_values',
+        'wap_isenabled',
+        'wap_maxbuttons',
+        'wap_maxcolumns',
+        'wap_maxhorzpixels',
+        'wap_maxrows',
+        'wap_maxvertpixels',
+        'web_handlefcgirequest',
+        'web_node_content_representation_css',
+        'web_node_content_representation_html',
+        'web_node_content_representation_js',
+        'web_node_content_representation_xhr',
+        'web_node_forpath',
+        'web_nodes_initialize',
+        'web_nodes_normalizeextension',
+        'web_nodes_processcontentnode',
+        'web_nodes_requesthandler',
+        'web_response_nodesentry',
+        'web_router_database',
+        'web_router_initialize',
+        'websocket_handler_timeout',
+        'wexitstatus',
+        'wifcontinued',
+        'wifexited',
+        'wifsignaled',
+        'wifstopped',
+        'wstopsig',
+        'wtermsig',
+        'xml_transform',
+        'xml',
+        'zip_add_dir',
+        'zip_add',
+        'zip_checkcons',
+        'zip_close',
+        'zip_cm_bzip2',
+        'zip_cm_default',
+        'zip_cm_deflate',
+        'zip_cm_deflate64',
+        'zip_cm_implode',
+        'zip_cm_pkware_implode',
+        'zip_cm_reduce_1',
+        'zip_cm_reduce_2',
+        'zip_cm_reduce_3',
+        'zip_cm_reduce_4',
+        'zip_cm_shrink',
+        'zip_cm_store',
+        'zip_create',
+        'zip_delete',
+        'zip_em_3des_112',
+        'zip_em_3des_168',
+        'zip_em_aes_128',
+        'zip_em_aes_192',
+        'zip_em_aes_256',
+        'zip_em_des',
+        'zip_em_none',
+        'zip_em_rc2_old',
+        'zip_em_rc2',
+        'zip_em_rc4',
+        'zip_em_trad_pkware',
+        'zip_em_unknown',
+        'zip_er_changed',
+        'zip_er_close',
+        'zip_er_compnotsupp',
+        'zip_er_crc',
+        'zip_er_deleted',
+        'zip_er_eof',
+        'zip_er_exists',
+        'zip_er_incons',
+        'zip_er_internal',
+        'zip_er_inval',
+        'zip_er_memory',
+        'zip_er_multidisk',
+        'zip_er_noent',
+        'zip_er_nozip',
+        'zip_er_ok',
+        'zip_er_open',
+        'zip_er_read',
+        'zip_er_remove',
+        'zip_er_rename',
+        'zip_er_seek',
+        'zip_er_tmpopen',
+        'zip_er_write',
+        'zip_er_zipclosed',
+        'zip_er_zlib',
+        'zip_error_get_sys_type',
+        'zip_error_get',
+        'zip_error_to_str',
+        'zip_et_none',
+        'zip_et_sys',
+        'zip_et_zlib',
+        'zip_excl',
+        'zip_fclose',
+        'zip_file_error_get',
+        'zip_file_strerror',
+        'zip_fl_compressed',
+        'zip_fl_nocase',
+        'zip_fl_nodir',
+        'zip_fl_unchanged',
+        'zip_fopen_index',
+        'zip_fopen',
+        'zip_fread',
+        'zip_get_archive_comment',
+        'zip_get_file_comment',
+        'zip_get_name',
+        'zip_get_num_files',
+        'zip_name_locate',
+        'zip_open',
+        'zip_rename',
+        'zip_replace',
+        'zip_set_archive_comment',
+        'zip_set_file_comment',
+        'zip_stat_index',
+        'zip_stat',
+        'zip_strerror',
+        'zip_unchange_all',
+        'zip_unchange_archive',
+        'zip_unchange',
+        'zlib_version',
+    ),
+    'Lasso 8 Tags': (
+        '__char',
+        '__sync_timestamp__',
+        '_admin_addgroup',
+        '_admin_adduser',
+        '_admin_defaultconnector',
+        '_admin_defaultconnectornames',
+        '_admin_defaultdatabase',
+        '_admin_defaultfield',
+        '_admin_defaultgroup',
+        '_admin_defaulthost',
+        '_admin_defaulttable',
+        '_admin_defaultuser',
+        '_admin_deleteconnector',
+        '_admin_deletedatabase',
+        '_admin_deletefield',
+        '_admin_deletegroup',
+        '_admin_deletehost',
+        '_admin_deletetable',
+        '_admin_deleteuser',
+        '_admin_duplicategroup',
+        '_admin_internaldatabase',
+        '_admin_listconnectors',
+        '_admin_listdatabases',
+        '_admin_listfields',
+        '_admin_listgroups',
+        '_admin_listhosts',
+        '_admin_listtables',
+        '_admin_listusers',
+        '_admin_refreshconnector',
+        '_admin_refreshsecurity',
+        '_admin_servicepath',
+        '_admin_updateconnector',
+        '_admin_updatedatabase',
+        '_admin_updatefield',
+        '_admin_updategroup',
+        '_admin_updatehost',
+        '_admin_updatetable',
+        '_admin_updateuser',
+        '_chartfx_activation_string',
+        '_chartfx_getchallengestring',
+        '_chop_args',
+        '_chop_mimes',
+        '_client_addr_old',
+        '_client_address_old',
+        '_client_ip_old',
+        '_database_names',
+        '_datasource_reload',
+        '_date_current',
+        '_date_format',
+        '_date_msec',
+        '_date_parse',
+        '_execution_timelimit',
+        '_file_chmod',
+        '_initialize',
+        '_jdbc_acceptsurl',
+        '_jdbc_debug',
+        '_jdbc_deletehost',
+        '_jdbc_driverclasses',
+        '_jdbc_driverinfo',
+        '_jdbc_metainfo',
+        '_jdbc_propertyinfo',
+        '_jdbc_setdriver',
+        '_lasso_param',
+        '_log_helper',
+        '_proc_noparam',
+        '_proc_withparam',
+        '_recursion_limit',
+        '_request_param',
+        '_security_binaryexpiration',
+        '_security_flushcaches',
+        '_security_isserialized',
+        '_security_serialexpiration',
+        '_srand',
+        '_strict_literals',
+        '_substring',
+        '_xmlrpc_exconverter',
+        '_xmlrpc_inconverter',
+        '_xmlrpc_xmlinconverter',
+        'abort',
+        'action_addinfo',
+        'action_addrecord',
+        'action_param',
+        'action_params',
+        'action_setfoundcount',
+        'action_setrecordid',
+        'action_settotalcount',
+        'action_statement',
+        'admin_allowedfileroots',
+        'admin_changeuser',
+        'admin_createuser',
+        'admin_currentgroups',
+        'admin_currentuserid',
+        'admin_currentusername',
+        'admin_getpref',
+        'admin_groupassignuser',
+        'admin_grouplistusers',
+        'admin_groupremoveuser',
+        'admin_lassoservicepath',
+        'admin_listgroups',
+        'admin_refreshlicensing',
+        'admin_refreshsecurity',
+        'admin_reloaddatasource',
+        'admin_removepref',
+        'admin_setpref',
+        'admin_userexists',
+        'admin_userlistgroups',
+        'all',
+        'and',
+        'array',
+        'array_iterator',
+        'auth',
+        'auth_admin',
+        'auth_auth',
+        'auth_custom',
+        'auth_group',
+        'auth_prompt',
+        'auth_user',
+        'base64',
+        'bean',
+        'bigint',
+        'bom_utf16be',
+        'bom_utf16le',
+        'bom_utf32be',
+        'bom_utf32le',
+        'bom_utf8',
+        'boolean',
+        'bw',
+        'bytes',
+        'cache',
+        'cache_delete',
+        'cache_empty',
+        'cache_exists',
+        'cache_fetch',
+        'cache_internal',
+        'cache_maintenance',
+        'cache_object',
+        'cache_preferences',
+        'cache_store',
+        'case',
+        'chartfx',
+        'chartfx_records',
+        'chartfx_serve',
+        'checked',
+        'choice_list',
+        'choice_listitem',
+        'choicelistitem',
+        'cipher_decrypt',
+        'cipher_digest',
+        'cipher_encrypt',
+        'cipher_hmac',
+        'cipher_keylength',
+        'cipher_list',
+        'click_text',
+        'client_addr',
+        'client_address',
+        'client_authorization',
+        'client_browser',
+        'client_contentlength',
+        'client_contenttype',
+        'client_cookielist',
+        'client_cookies',
+        'client_encoding',
+        'client_formmethod',
+        'client_getargs',
+        'client_getparams',
+        'client_headers',
+        'client_ip',
+        'client_ipfrominteger',
+        'client_iptointeger',
+        'client_password',
+        'client_postargs',
+        'client_postparams',
+        'client_type',
+        'client_url',
+        'client_username',
+        'cn',
+        'column',
+        'column_name',
+        'column_names',
+        'compare_beginswith',
+        'compare_contains',
+        'compare_endswith',
+        'compare_equalto',
+        'compare_greaterthan',
+        'compare_greaterthanorequals',
+        'compare_greaterthanorequls',
+        'compare_lessthan',
+        'compare_lessthanorequals',
+        'compare_notbeginswith',
+        'compare_notcontains',
+        'compare_notendswith',
+        'compare_notequalto',
+        'compare_notregexp',
+        'compare_regexp',
+        'compare_strictequalto',
+        'compare_strictnotequalto',
+        'compiler_removecacheddoc',
+        'compiler_setdefaultparserflags',
+        'compress',
+        'content_body',
+        'content_encoding',
+        'content_header',
+        'content_type',
+        'cookie',
+        'cookie_set',
+        'curl_ftp_getfile',
+        'curl_ftp_getlisting',
+        'curl_ftp_putfile',
+        'curl_include_url',
+        'currency',
+        'database_changecolumn',
+        'database_changefield',
+        'database_createcolumn',
+        'database_createfield',
+        'database_createtable',
+        'database_fmcontainer',
+        'database_hostinfo',
+        'database_inline',
+        'database_name',
+        'database_nameitem',
+        'database_names',
+        'database_realname',
+        'database_removecolumn',
+        'database_removefield',
+        'database_removetable',
+        'database_repeating',
+        'database_repeating_valueitem',
+        'database_repeatingvalueitem',
+        'database_schemanameitem',
+        'database_schemanames',
+        'database_tablecolumn',
+        'database_tablenameitem',
+        'database_tablenames',
+        'datasource_name',
+        'datasource_register',
+        'date',
+        'date__date_current',
+        'date__date_format',
+        'date__date_msec',
+        'date__date_parse',
+        'date_add',
+        'date_date',
+        'date_difference',
+        'date_duration',
+        'date_format',
+        'date_getcurrentdate',
+        'date_getday',
+        'date_getdayofweek',
+        'date_gethour',
+        'date_getlocaltimezone',
+        'date_getminute',
+        'date_getmonth',
+        'date_getsecond',
+        'date_gettime',
+        'date_getyear',
+        'date_gmttolocal',
+        'date_localtogmt',
+        'date_maximum',
+        'date_minimum',
+        'date_msec',
+        'date_setformat',
+        'date_subtract',
+        'db_layoutnameitem',
+        'db_layoutnames',
+        'db_nameitem',
+        'db_names',
+        'db_tablenameitem',
+        'db_tablenames',
+        'dbi_column_names',
+        'dbi_field_names',
+        'decimal',
+        'decimal_setglobaldefaultprecision',
+        'decode_base64',
+        'decode_bheader',
+        'decode_hex',
+        'decode_html',
+        'decode_json',
+        'decode_qheader',
+        'decode_quotedprintable',
+        'decode_quotedprintablebytes',
+        'decode_url',
+        'decode_xml',
+        'decompress',
+        'decrypt_blowfish',
+        'decrypt_blowfish2',
+        'default',
+        'define_atbegin',
+        'define_atend',
+        'define_constant',
+        'define_prototype',
+        'define_tag',
+        'define_tagp',
+        'define_type',
+        'define_typep',
+        'deserialize',
+        'directory_directorynameitem',
+        'directory_lister',
+        'directory_nameitem',
+        'directorynameitem',
+        'dns_default',
+        'dns_lookup',
+        'dns_response',
+        'duration',
+        'else',
+        'email_batch',
+        'email_compose',
+        'email_digestchallenge',
+        'email_digestresponse',
+        'email_extract',
+        'email_findemails',
+        'email_immediate',
+        'email_merge',
+        'email_mxerror',
+        'email_mxlookup',
+        'email_parse',
+        'email_pop',
+        'email_queue',
+        'email_result',
+        'email_safeemail',
+        'email_send',
+        'email_smtp',
+        'email_status',
+        'email_token',
+        'email_translatebreakstocrlf',
+        'encode_base64',
+        'encode_bheader',
+        'encode_break',
+        'encode_breaks',
+        'encode_crc32',
+        'encode_hex',
+        'encode_html',
+        'encode_htmltoxml',
+        'encode_json',
+        'encode_qheader',
+        'encode_quotedprintable',
+        'encode_quotedprintablebytes',
+        'encode_set',
+        'encode_smart',
+        'encode_sql',
+        'encode_sql92',
+        'encode_stricturl',
+        'encode_url',
+        'encode_xml',
+        'encrypt_blowfish',
+        'encrypt_blowfish2',
+        'encrypt_crammd5',
+        'encrypt_hmac',
+        'encrypt_md5',
+        'eq',
+        'error_adderror',
+        'error_code',
+        'error_code_aborted',
+        'error_code_assert',
+        'error_code_bof',
+        'error_code_connectioninvalid',
+        'error_code_couldnotclosefile',
+        'error_code_couldnotcreateoropenfile',
+        'error_code_couldnotdeletefile',
+        'error_code_couldnotdisposememory',
+        'error_code_couldnotlockmemory',
+        'error_code_couldnotreadfromfile',
+        'error_code_couldnotunlockmemory',
+        'error_code_couldnotwritetofile',
+        'error_code_criterianotmet',
+        'error_code_datasourceerror',
+        'error_code_directoryfull',
+        'error_code_diskfull',
+        'error_code_dividebyzero',
+        'error_code_eof',
+        'error_code_failure',
+        'error_code_fieldrestriction',
+        'error_code_file',
+        'error_code_filealreadyexists',
+        'error_code_filecorrupt',
+        'error_code_fileinvalid',
+        'error_code_fileinvalidaccessmode',
+        'error_code_fileisclosed',
+        'error_code_fileisopen',
+        'error_code_filelocked',
+        'error_code_filenotfound',
+        'error_code_fileunlocked',
+        'error_code_httpfilenotfound',
+        'error_code_illegalinstruction',
+        'error_code_illegaluseoffrozeninstance',
+        'error_code_invaliddatabase',
+        'error_code_invalidfilename',
+        'error_code_invalidmemoryobject',
+        'error_code_invalidparameter',
+        'error_code_invalidpassword',
+        'error_code_invalidpathname',
+        'error_code_invalidusername',
+        'error_code_ioerror',
+        'error_code_loopaborted',
+        'error_code_memory',
+        'error_code_network',
+        'error_code_nilpointer',
+        'error_code_noerr',
+        'error_code_nopermission',
+        'error_code_outofmemory',
+        'error_code_outofstackspace',
+        'error_code_overflow',
+        'error_code_postconditionfailed',
+        'error_code_preconditionfailed',
+        'error_code_resnotfound',
+        'error_code_resource',
+        'error_code_streamreaderror',
+        'error_code_streamwriteerror',
+        'error_code_syntaxerror',
+        'error_code_tagnotfound',
+        'error_code_unknownerror',
+        'error_code_varnotfound',
+        'error_code_volumedoesnotexist',
+        'error_code_webactionnotsupported',
+        'error_code_webadderror',
+        'error_code_webdeleteerror',
+        'error_code_webmodulenotfound',
+        'error_code_webnosuchobject',
+        'error_code_webrepeatingrelatedfield',
+        'error_code_webrequiredfieldmissing',
+        'error_code_webtimeout',
+        'error_code_webupdateerror',
+        'error_columnrestriction',
+        'error_currenterror',
+        'error_databaseconnectionunavailable',
+        'error_databasetimeout',
+        'error_deleteerror',
+        'error_fieldrestriction',
+        'error_filenotfound',
+        'error_invaliddatabase',
+        'error_invalidpassword',
+        'error_invalidusername',
+        'error_modulenotfound',
+        'error_msg',
+        'error_msg_aborted',
+        'error_msg_assert',
+        'error_msg_bof',
+        'error_msg_connectioninvalid',
+        'error_msg_couldnotclosefile',
+        'error_msg_couldnotcreateoropenfile',
+        'error_msg_couldnotdeletefile',
+        'error_msg_couldnotdisposememory',
+        'error_msg_couldnotlockmemory',
+        'error_msg_couldnotreadfromfile',
+        'error_msg_couldnotunlockmemory',
+        'error_msg_couldnotwritetofile',
+        'error_msg_criterianotmet',
+        'error_msg_datasourceerror',
+        'error_msg_directoryfull',
+        'error_msg_diskfull',
+        'error_msg_dividebyzero',
+        'error_msg_eof',
+        'error_msg_failure',
+        'error_msg_fieldrestriction',
+        'error_msg_file',
+        'error_msg_filealreadyexists',
+        'error_msg_filecorrupt',
+        'error_msg_fileinvalid',
+        'error_msg_fileinvalidaccessmode',
+        'error_msg_fileisclosed',
+        'error_msg_fileisopen',
+        'error_msg_filelocked',
+        'error_msg_filenotfound',
+        'error_msg_fileunlocked',
+        'error_msg_httpfilenotfound',
+        'error_msg_illegalinstruction',
+        'error_msg_illegaluseoffrozeninstance',
+        'error_msg_invaliddatabase',
+        'error_msg_invalidfilename',
+        'error_msg_invalidmemoryobject',
+        'error_msg_invalidparameter',
+        'error_msg_invalidpassword',
+        'error_msg_invalidpathname',
+        'error_msg_invalidusername',
+        'error_msg_ioerror',
+        'error_msg_loopaborted',
+        'error_msg_memory',
+        'error_msg_network',
+        'error_msg_nilpointer',
+        'error_msg_noerr',
+        'error_msg_nopermission',
+        'error_msg_outofmemory',
+        'error_msg_outofstackspace',
+        'error_msg_overflow',
+        'error_msg_postconditionfailed',
+        'error_msg_preconditionfailed',
+        'error_msg_resnotfound',
+        'error_msg_resource',
+        'error_msg_streamreaderror',
+        'error_msg_streamwriteerror',
+        'error_msg_syntaxerror',
+        'error_msg_tagnotfound',
+        'error_msg_unknownerror',
+        'error_msg_varnotfound',
+        'error_msg_volumedoesnotexist',
+        'error_msg_webactionnotsupported',
+        'error_msg_webadderror',
+        'error_msg_webdeleteerror',
+        'error_msg_webmodulenotfound',
+        'error_msg_webnosuchobject',
+        'error_msg_webrepeatingrelatedfield',
+        'error_msg_webrequiredfieldmissing',
+        'error_msg_webtimeout',
+        'error_msg_webupdateerror',
+        'error_noerror',
+        'error_nopermission',
+        'error_norecordsfound',
+        'error_outofmemory',
+        'error_pop',
+        'error_push',
+        'error_reqcolumnmissing',
+        'error_reqfieldmissing',
+        'error_requiredcolumnmissing',
+        'error_requiredfieldmissing',
+        'error_reset',
+        'error_seterrorcode',
+        'error_seterrormessage',
+        'error_updateerror',
+        'euro',
+        'event_schedule',
+        'ew',
+        'fail',
+        'fail_if',
+        'false',
+        'field',
+        'field_name',
+        'field_names',
+        'file',
+        'file_autoresolvefullpaths',
+        'file_chmod',
+        'file_control',
+        'file_copy',
+        'file_create',
+        'file_creationdate',
+        'file_currenterror',
+        'file_delete',
+        'file_exists',
+        'file_getlinecount',
+        'file_getsize',
+        'file_isdirectory',
+        'file_listdirectory',
+        'file_moddate',
+        'file_modechar',
+        'file_modeline',
+        'file_move',
+        'file_openread',
+        'file_openreadwrite',
+        'file_openwrite',
+        'file_openwriteappend',
+        'file_openwritetruncate',
+        'file_probeeol',
+        'file_processuploads',
+        'file_read',
+        'file_readline',
+        'file_rename',
+        'file_serve',
+        'file_setsize',
+        'file_stream',
+        'file_streamcopy',
+        'file_uploads',
+        'file_waitread',
+        'file_waittimeout',
+        'file_waitwrite',
+        'file_write',
+        'find_soap_ops',
+        'form_param',
+        'found_count',
+        'ft',
+        'ftp_getfile',
+        'ftp_getlisting',
+        'ftp_putfile',
+        'full',
+        'global',
+        'global_defined',
+        'global_remove',
+        'global_reset',
+        'globals',
+        'gt',
+        'gte',
+        'handle',
+        'handle_error',
+        'header',
+        'html_comment',
+        'http_getfile',
+        'ical_alarm',
+        'ical_attribute',
+        'ical_calendar',
+        'ical_daylight',
+        'ical_event',
+        'ical_freebusy',
+        'ical_item',
+        'ical_journal',
+        'ical_parse',
+        'ical_standard',
+        'ical_timezone',
+        'ical_todo',
+        'if',
+        'if_empty',
+        'if_false',
+        'if_null',
+        'if_true',
+        'image',
+        'image_url',
+        'img',
+        'include',
+        'include_cgi',
+        'include_currentpath',
+        'include_once',
+        'include_raw',
+        'include_url',
+        'inline',
+        'integer',
+        'iterate',
+        'iterator',
+        'java',
+        'java_bean',
+        'json_records',
+        'json_rpccall',
+        'keycolumn_name',
+        'keycolumn_value',
+        'keyfield_name',
+        'keyfield_value',
+        'lasso_comment',
+        'lasso_currentaction',
+        'lasso_datasourceis',
+        'lasso_datasourceis4d',
+        'lasso_datasourceisfilemaker',
+        'lasso_datasourceisfilemaker7',
+        'lasso_datasourceisfilemaker9',
+        'lasso_datasourceisfilemakersa',
+        'lasso_datasourceisjdbc',
+        'lasso_datasourceislassomysql',
+        'lasso_datasourceismysql',
+        'lasso_datasourceisodbc',
+        'lasso_datasourceisopenbase',
+        'lasso_datasourceisoracle',
+        'lasso_datasourceispostgresql',
+        'lasso_datasourceisspotlight',
+        'lasso_datasourceissqlite',
+        'lasso_datasourceissqlserver',
+        'lasso_datasourcemodulename',
+        'lasso_datatype',
+        'lasso_disableondemand',
+        'lasso_errorreporting',
+        'lasso_executiontimelimit',
+        'lasso_parser',
+        'lasso_process',
+        'lasso_sessionid',
+        'lasso_siteid',
+        'lasso_siteisrunning',
+        'lasso_sitename',
+        'lasso_siterestart',
+        'lasso_sitestart',
+        'lasso_sitestop',
+        'lasso_tagexists',
+        'lasso_tagmodulename',
+        'lasso_uniqueid',
+        'lasso_updatecheck',
+        'lasso_uptime',
+        'lasso_version',
+        'lassoapp_create',
+        'lassoapp_dump',
+        'lassoapp_flattendir',
+        'lassoapp_getappdata',
+        'lassoapp_link',
+        'lassoapp_list',
+        'lassoapp_process',
+        'lassoapp_unitize',
+        'layout_name',
+        'ldap',
+        'ldap_scope_base',
+        'ldap_scope_onelevel',
+        'ldap_scope_subtree',
+        'ldml',
+        'ldml_ldml',
+        'library',
+        'library_once',
+        'link',
+        'link_currentaction',
+        'link_currentactionparams',
+        'link_currentactionurl',
+        'link_currentgroup',
+        'link_currentgroupparams',
+        'link_currentgroupurl',
+        'link_currentrecord',
+        'link_currentrecordparams',
+        'link_currentrecordurl',
+        'link_currentsearch',
+        'link_currentsearchparams',
+        'link_currentsearchurl',
+        'link_detail',
+        'link_detailparams',
+        'link_detailurl',
+        'link_firstgroup',
+        'link_firstgroupparams',
+        'link_firstgroupurl',
+        'link_firstrecord',
+        'link_firstrecordparams',
+        'link_firstrecordurl',
+        'link_lastgroup',
+        'link_lastgroupparams',
+        'link_lastgroupurl',
+        'link_lastrecord',
+        'link_lastrecordparams',
+        'link_lastrecordurl',
+        'link_nextgroup',
+        'link_nextgroupparams',
+        'link_nextgroupurl',
+        'link_nextrecord',
+        'link_nextrecordparams',
+        'link_nextrecordurl',
+        'link_params',
+        'link_prevgroup',
+        'link_prevgroupparams',
+        'link_prevgroupurl',
+        'link_prevrecord',
+        'link_prevrecordparams',
+        'link_prevrecordurl',
+        'link_setformat',
+        'link_url',
+        'list',
+        'list_additem',
+        'list_fromlist',
+        'list_fromstring',
+        'list_getitem',
+        'list_itemcount',
+        'list_iterator',
+        'list_removeitem',
+        'list_replaceitem',
+        'list_reverseiterator',
+        'list_tostring',
+        'literal',
+        'ljax_end',
+        'ljax_hastarget',
+        'ljax_include',
+        'ljax_start',
+        'ljax_target',
+        'local',
+        'local_defined',
+        'local_remove',
+        'local_reset',
+        'locale_format',
+        'locals',
+        'log',
+        'log_always',
+        'log_critical',
+        'log_deprecated',
+        'log_destination_console',
+        'log_destination_database',
+        'log_destination_file',
+        'log_detail',
+        'log_level_critical',
+        'log_level_deprecated',
+        'log_level_detail',
+        'log_level_sql',
+        'log_level_warning',
+        'log_setdestination',
+        'log_sql',
+        'log_warning',
+        'logicalop_value',
+        'logicaloperator_value',
+        'loop',
+        'loop_abort',
+        'loop_continue',
+        'loop_count',
+        'lt',
+        'lte',
+        'magick_image',
+        'map',
+        'map_iterator',
+        'match_comparator',
+        'match_notrange',
+        'match_notregexp',
+        'match_range',
+        'match_regexp',
+        'math_abs',
+        'math_acos',
+        'math_add',
+        'math_asin',
+        'math_atan',
+        'math_atan2',
+        'math_ceil',
+        'math_converteuro',
+        'math_cos',
+        'math_div',
+        'math_exp',
+        'math_floor',
+        'math_internal_rand',
+        'math_internal_randmax',
+        'math_internal_srand',
+        'math_ln',
+        'math_log',
+        'math_log10',
+        'math_max',
+        'math_min',
+        'math_mod',
+        'math_mult',
+        'math_pow',
+        'math_random',
+        'math_range',
+        'math_rint',
+        'math_roman',
+        'math_round',
+        'math_sin',
+        'math_sqrt',
+        'math_sub',
+        'math_tan',
+        'maxrecords_value',
+        'memory_session_driver',
+        'mime_type',
+        'minimal',
+        'misc__srand',
+        'misc_randomnumber',
+        'misc_roman',
+        'misc_valid_creditcard',
+        'mysql_session_driver',
+        'named_param',
+        'namespace_current',
+        'namespace_delimiter',
+        'namespace_exists',
+        'namespace_file_fullpathexists',
+        'namespace_global',
+        'namespace_import',
+        'namespace_load',
+        'namespace_page',
+        'namespace_unload',
+        'namespace_using',
+        'neq',
+        'net',
+        'net_connectinprogress',
+        'net_connectok',
+        'net_typessl',
+        'net_typessltcp',
+        'net_typessludp',
+        'net_typetcp',
+        'net_typeudp',
+        'net_waitread',
+        'net_waittimeout',
+        'net_waitwrite',
+        'no_default_output',
+        'none',
+        'noprocess',
+        'not',
+        'nrx',
+        'nslookup',
+        'null',
+        'object',
+        'once',
+        'oneoff',
+        'op_logicalvalue',
+        'operator_logicalvalue',
+        'option',
+        'or',
+        'os_process',
+        'output',
+        'output_none',
+        'pair',
+        'params_up',
+        'pdf_barcode',
+        'pdf_color',
+        'pdf_doc',
+        'pdf_font',
+        'pdf_image',
+        'pdf_list',
+        'pdf_read',
+        'pdf_serve',
+        'pdf_table',
+        'pdf_text',
+        'percent',
+        'portal',
+        'postcondition',
+        'precondition',
+        'prettyprintingnsmap',
+        'prettyprintingtypemap',
+        'priorityqueue',
+        'private',
+        'proc_convert',
+        'proc_convertbody',
+        'proc_convertone',
+        'proc_extract',
+        'proc_extractone',
+        'proc_find',
+        'proc_first',
+        'proc_foreach',
+        'proc_get',
+        'proc_join',
+        'proc_lasso',
+        'proc_last',
+        'proc_map_entry',
+        'proc_null',
+        'proc_regexp',
+        'proc_xml',
+        'proc_xslt',
+        'process',
+        'protect',
+        'queue',
+        'rand',
+        'randomnumber',
+        'raw',
+        'recid_value',
+        'record_count',
+        'recordcount',
+        'recordid_value',
+        'records',
+        'records_array',
+        'records_map',
+        'redirect_url',
+        'reference',
+        'referer',
+        'referer_url',
+        'referrer',
+        'referrer_url',
+        'regexp',
+        'repeating',
+        'repeating_valueitem',
+        'repeatingvalueitem',
+        'repetition',
+        'req_column',
+        'req_field',
+        'required_column',
+        'required_field',
+        'response_fileexists',
+        'response_filepath',
+        'response_localpath',
+        'response_path',
+        'response_realm',
+        'resultset',
+        'resultset_count',
+        'return',
+        'return_value',
+        'reverseiterator',
+        'roman',
+        'row_count',
+        'rows',
+        'rows_array',
+        'run_children',
+        'rx',
+        'schema_name',
+        'scientific',
+        'search_args',
+        'search_arguments',
+        'search_columnitem',
+        'search_fielditem',
+        'search_operatoritem',
+        'search_opitem',
+        'search_valueitem',
+        'searchfielditem',
+        'searchoperatoritem',
+        'searchopitem',
+        'searchvalueitem',
+        'select',
+        'selected',
+        'self',
+        'serialize',
+        'series',
+        'server_date',
+        'server_day',
+        'server_ip',
+        'server_name',
+        'server_port',
+        'server_push',
+        'server_siteisrunning',
+        'server_sitestart',
+        'server_sitestop',
+        'server_time',
+        'session_abort',
+        'session_addoutputfilter',
+        'session_addvar',
+        'session_addvariable',
+        'session_deleteexpired',
+        'session_driver',
+        'session_end',
+        'session_id',
+        'session_removevar',
+        'session_removevariable',
+        'session_result',
+        'session_setdriver',
+        'session_start',
+        'set',
+        'set_iterator',
+        'set_reverseiterator',
+        'shown_count',
+        'shown_first',
+        'shown_last',
+        'site_atbegin',
+        'site_id',
+        'site_name',
+        'site_restart',
+        'skiprecords_value',
+        'sleep',
+        'soap_convertpartstopairs',
+        'soap_definetag',
+        'soap_info',
+        'soap_lastrequest',
+        'soap_lastresponse',
+        'soap_stub',
+        'sort_args',
+        'sort_arguments',
+        'sort_columnitem',
+        'sort_fielditem',
+        'sort_orderitem',
+        'sortcolumnitem',
+        'sortfielditem',
+        'sortorderitem',
+        'sqlite_createdb',
+        'sqlite_session_driver',
+        'sqlite_setsleepmillis',
+        'sqlite_setsleeptries',
+        'srand',
+        'stack',
+        'stock_quote',
+        'string',
+        'string_charfromname',
+        'string_concatenate',
+        'string_countfields',
+        'string_endswith',
+        'string_extract',
+        'string_findposition',
+        'string_findregexp',
+        'string_fordigit',
+        'string_getfield',
+        'string_getunicodeversion',
+        'string_insert',
+        'string_isalpha',
+        'string_isalphanumeric',
+        'string_isdigit',
+        'string_ishexdigit',
+        'string_islower',
+        'string_isnumeric',
+        'string_ispunctuation',
+        'string_isspace',
+        'string_isupper',
+        'string_length',
+        'string_lowercase',
+        'string_remove',
+        'string_removeleading',
+        'string_removetrailing',
+        'string_replace',
+        'string_replaceregexp',
+        'string_todecimal',
+        'string_tointeger',
+        'string_uppercase',
+        'string_validcharset',
+        'table_name',
+        'table_realname',
+        'tag',
+        'tag_name',
+        'tags',
+        'tags_find',
+        'tags_list',
+        'tcp_close',
+        'tcp_open',
+        'tcp_send',
+        'tcp_tcp_close',
+        'tcp_tcp_open',
+        'tcp_tcp_send',
+        'thread_abort',
+        'thread_atomic',
+        'thread_event',
+        'thread_exists',
+        'thread_getcurrentid',
+        'thread_getpriority',
+        'thread_info',
+        'thread_list',
+        'thread_lock',
+        'thread_pipe',
+        'thread_priority_default',
+        'thread_priority_high',
+        'thread_priority_low',
+        'thread_rwlock',
+        'thread_semaphore',
+        'thread_setpriority',
+        'token_value',
+        'total_records',
+        'treemap',
+        'treemap_iterator',
+        'true',
+        'url_rewrite',
+        'valid_creditcard',
+        'valid_date',
+        'valid_email',
+        'valid_url',
+        'value_list',
+        'value_listitem',
+        'valuelistitem',
+        'var',
+        'var_defined',
+        'var_remove',
+        'var_reset',
+        'var_set',
+        'variable',
+        'variable_defined',
+        'variable_set',
+        'variables',
+        'variant_count',
+        'vars',
+        'wap_isenabled',
+        'wap_maxbuttons',
+        'wap_maxcolumns',
+        'wap_maxhorzpixels',
+        'wap_maxrows',
+        'wap_maxvertpixels',
+        'while',
+        'wsdl_extract',
+        'wsdl_getbinding',
+        'wsdl_getbindingforoperation',
+        'wsdl_getbindingoperations',
+        'wsdl_getmessagenamed',
+        'wsdl_getmessageparts',
+        'wsdl_getmessagetriofromporttype',
+        'wsdl_getopbodystyle',
+        'wsdl_getopbodyuse',
+        'wsdl_getoperation',
+        'wsdl_getoplocation',
+        'wsdl_getopmessagetypes',
+        'wsdl_getopsoapaction',
+        'wsdl_getportaddress',
+        'wsdl_getportsforservice',
+        'wsdl_getporttype',
+        'wsdl_getporttypeoperation',
+        'wsdl_getservicedocumentation',
+        'wsdl_getservices',
+        'wsdl_gettargetnamespace',
+        'wsdl_issoapoperation',
+        'wsdl_listoperations',
+        'wsdl_maketest',
+        'xml',
+        'xml_extract',
+        'xml_rpc',
+        'xml_rpccall',
+        'xml_rw',
+        'xml_serve',
+        'xml_transform',
+        'xml_xml',
+        'xml_xmlstream',
+        'xmlstream',
+        'xsd_attribute',
+        'xsd_blankarraybase',
+        'xsd_blankbase',
+        'xsd_buildtype',
+        'xsd_cache',
+        'xsd_checkcardinality',
+        'xsd_continueall',
+        'xsd_continueannotation',
+        'xsd_continueany',
+        'xsd_continueanyattribute',
+        'xsd_continueattribute',
+        'xsd_continueattributegroup',
+        'xsd_continuechoice',
+        'xsd_continuecomplexcontent',
+        'xsd_continuecomplextype',
+        'xsd_continuedocumentation',
+        'xsd_continueextension',
+        'xsd_continuegroup',
+        'xsd_continuekey',
+        'xsd_continuelist',
+        'xsd_continuerestriction',
+        'xsd_continuesequence',
+        'xsd_continuesimplecontent',
+        'xsd_continuesimpletype',
+        'xsd_continueunion',
+        'xsd_deserialize',
+        'xsd_fullyqualifyname',
+        'xsd_generate',
+        'xsd_generateblankfromtype',
+        'xsd_generateblanksimpletype',
+        'xsd_generatetype',
+        'xsd_getschematype',
+        'xsd_issimpletype',
+        'xsd_loadschema',
+        'xsd_lookupnamespaceuri',
+        'xsd_lookuptype',
+        'xsd_processany',
+        'xsd_processattribute',
+        'xsd_processattributegroup',
+        'xsd_processcomplextype',
+        'xsd_processelement',
+        'xsd_processgroup',
+        'xsd_processimport',
+        'xsd_processinclude',
+        'xsd_processschema',
+        'xsd_processsimpletype',
+        'xsd_ref',
+        'xsd_type',
+    )
+}
+MEMBERS = {
+    'Member Methods': (
+        'abort',
+        'abs',
+        'accept_charset',
+        'accept',
+        'acceptconnections',
+        'acceptdeserializedelement',
+        'acceptnossl',
+        'acceptpost',
+        'accesskey',
+        'acos',
+        'acosh',
+        'action',
+        'actionparams',
+        'active_tick',
+        'add',
+        'addatend',
+        'addattachment',
+        'addbarcode',
+        'addchapter',
+        'addcheckbox',
+        'addcolumninfo',
+        'addcombobox',
+        'addcomment',
+        'addcomponent',
+        'addcomponents',
+        'addcss',
+        'adddatabasetable',
+        'adddatasource',
+        'adddatasourcedatabase',
+        'adddatasourcehost',
+        'adddir',
+        'adddirpath',
+        'addendjs',
+        'addendjstext',
+        'adderror',
+        'addfavicon',
+        'addfile',
+        'addgroup',
+        'addheader',
+        'addhiddenfield',
+        'addhtmlpart',
+        'addimage',
+        'addjavascript',
+        'addjs',
+        'addjstext',
+        'addlist',
+        'addmathfunctions',
+        'addmember',
+        'addoneheaderline',
+        'addpage',
+        'addparagraph',
+        'addpart',
+        'addpasswordfield',
+        'addphrase',
+        'addpostdispatch',
+        'addpredispatch',
+        'addradiobutton',
+        'addradiogroup',
+        'addresetbutton',
+        'addrow',
+        'addsection',
+        'addselectlist',
+        'addset',
+        'addsubmitbutton',
+        'addsubnode',
+        'addtable',
+        'addtask',
+        'addtext',
+        'addtextarea',
+        'addtextfield',
+        'addtextpart',
+        'addtobuffer',
+        'addtrait',
+        'adduser',
+        'addusertogroup',
+        'addwarning',
+        'addzip',
+        'allocobject',
+        'am',
+        'ampm',
+        'annotate',
+        'answer',
+        'apop',
+        'append',
+        'appendarray',
+        'appendarraybegin',
+        'appendarrayend',
+        'appendbool',
+        'appendbytes',
+        'appendchar',
+        'appendchild',
+        'appendcolon',
+        'appendcomma',
+        'appenddata',
+        'appenddatetime',
+        'appenddbpointer',
+        'appenddecimal',
+        'appenddocument',
+        'appendimagetolist',
+        'appendinteger',
+        'appendnowutc',
+        'appendnull',
+        'appendoid',
+        'appendregex',
+        'appendreplacement',
+        'appendstring',
+        'appendtail',
+        'appendtime',
+        'applyheatcolors',
+        'appmessage',
+        'appname',
+        'appprefix',
+        'appstatus',
+        'arc',
+        'archive',
+        'arguments',
+        'argumentvalue',
+        'asarray',
+        'asarraystring',
+        'asasync',
+        'asbytes',
+        'ascopy',
+        'ascopydeep',
+        'asdecimal',
+        'asgenerator',
+        'asin',
+        'asinh',
+        'asinteger',
+        'askeyedgenerator',
+        'aslazystring',
+        'aslist',
+        'asraw',
+        'asstaticarray',
+        'asstring',
+        'asstringhex',
+        'asstringoct',
+        'asxml',
+        'atan',
+        'atan2',
+        'atanh',
+        'atend',
+        'atends',
+        'atime',
+        'attributecount',
+        'attributes',
+        'attrs',
+        'auth',
+        'authenticate',
+        'authorize',
+        'autocollectbuffer',
+        'average',
+        'back',
+        'basename',
+        'basepaths',
+        'baseuri',
+        'bcc',
+        'beginssl',
+        'beginswith',
+        'begintls',
+        'bestcharset',
+        'bind_blob',
+        'bind_double',
+        'bind_int',
+        'bind_null',
+        'bind_parameter_index',
+        'bind_text',
+        'bind',
+        'bindcount',
+        'bindone',
+        'bindparam',
+        'bitand',
+        'bitclear',
+        'bitflip',
+        'bitformat',
+        'bitnot',
+        'bitor',
+        'bitset',
+        'bitshiftleft',
+        'bitshiftright',
+        'bittest',
+        'bitxor',
+        'blur',
+        'body',
+        'bodybytes',
+        'boundary',
+        'bptoxml',
+        'bptypetostr',
+        'bucketnumber',
+        'buff',
+        'buildquery',
+        'businessdaysbetween',
+        'by',
+        'bytes',
+        'cachedappprefix',
+        'cachedroot',
+        'callboolean',
+        'callbooleanmethod',
+        'callbytemethod',
+        'callcharmethod',
+        'calldoublemethod',
+        'calledname',
+        'callfirst',
+        'callfloat',
+        'callfloatmethod',
+        'callint',
+        'callintmethod',
+        'calllongmethod',
+        'callnonvirtualbooleanmethod',
+        'callnonvirtualbytemethod',
+        'callnonvirtualcharmethod',
+        'callnonvirtualdoublemethod',
+        'callnonvirtualfloatmethod',
+        'callnonvirtualintmethod',
+        'callnonvirtuallongmethod',
+        'callnonvirtualobjectmethod',
+        'callnonvirtualshortmethod',
+        'callnonvirtualvoidmethod',
+        'callobject',
+        'callobjectmethod',
+        'callshortmethod',
+        'callsite_col',
+        'callsite_file',
+        'callsite_line',
+        'callstack',
+        'callstaticboolean',
+        'callstaticbooleanmethod',
+        'callstaticbytemethod',
+        'callstaticcharmethod',
+        'callstaticdoublemethod',
+        'callstaticfloatmethod',
+        'callstaticint',
+        'callstaticintmethod',
+        'callstaticlongmethod',
+        'callstaticobject',
+        'callstaticobjectmethod',
+        'callstaticshortmethod',
+        'callstaticstring',
+        'callstaticvoidmethod',
+        'callstring',
+        'callvoid',
+        'callvoidmethod',
+        'cancel',
+        'cap',
+        'capa',
+        'capabilities',
+        'capi',
+        'cbrt',
+        'cc',
+        'ceil',
+        'chardigitvalue',
+        'charname',
+        'charset',
+        'chartype',
+        'checkdebugging',
+        'checked',
+        'checkuser',
+        'childnodes',
+        'chk',
+        'chmod',
+        'choosecolumntype',
+        'chown',
+        'chunked',
+        'circle',
+        'class',
+        'classid',
+        'clear',
+        'clonenode',
+        'close',
+        'closepath',
+        'closeprepared',
+        'closewrite',
+        'code',
+        'codebase',
+        'codetype',
+        'colmap',
+        'colorspace',
+        'column_blob',
+        'column_count',
+        'column_decltype',
+        'column_double',
+        'column_int64',
+        'column_name',
+        'column_text',
+        'column_type',
+        'command',
+        'comments',
+        'compare',
+        'comparecodepointorder',
+        'componentdelimiter',
+        'components',
+        'composite',
+        'compress',
+        'concat',
+        'condtoint',
+        'configureds',
+        'configuredskeys',
+        'connect',
+        'connection',
+        'connectionhandler',
+        'connhandler',
+        'consume_domain',
+        'consume_label',
+        'consume_message',
+        'consume_rdata',
+        'consume_string',
+        'contains',
+        'content_disposition',
+        'content_transfer_encoding',
+        'content_type',
+        'content',
+        'contentlength',
+        'contents',
+        'contenttype',
+        'continuation',
+        'continuationpacket',
+        'continuationpoint',
+        'continuationstack',
+        'continue',
+        'contrast',
+        'conventionaltop',
+        'convert',
+        'cookie',
+        'cookies',
+        'cookiesarray',
+        'cookiesary',
+        'copyto',
+        'cos',
+        'cosh',
+        'count',
+        'countkeys',
+        'country',
+        'countusersbygroup',
+        'crc',
+        'create',
+        'createattribute',
+        'createattributens',
+        'createcdatasection',
+        'createcomment',
+        'createdocument',
+        'createdocumentfragment',
+        'createdocumenttype',
+        'createelement',
+        'createelementns',
+        'createentityreference',
+        'createindex',
+        'createprocessinginstruction',
+        'createtable',
+        'createtextnode',
+        'criteria',
+        'crop',
+        'csscontent',
+        'curl',
+        'current',
+        'currentfile',
+        'curveto',
+        'd',
+        'data',
+        'databasecolumnnames',
+        'databasecolumns',
+        'databasemap',
+        'databasename',
+        'datasourcecolumnnames',
+        'datasourcecolumns',
+        'datasourcemap',
+        'date',
+        'day',
+        'dayofmonth',
+        'dayofweek',
+        'dayofweekinmonth',
+        'dayofyear',
+        'days',
+        'daysbetween',
+        'db',
+        'dbtablestable',
+        'debug',
+        'declare',
+        'decodebase64',
+        'decodehex',
+        'decodehtml',
+        'decodeqp',
+        'decodeurl',
+        'decodexml',
+        'decompose',
+        'decomposeassignment',
+        'defaultcontentrepresentation',
+        'defer',
+        'deg2rad',
+        'dele',
+        'delete',
+        'deletedata',
+        'deleteglobalref',
+        'deletelocalref',
+        'delim',
+        'depth',
+        'dereferencepointer',
+        'describe',
+        'description',
+        'deserialize',
+        'detach',
+        'detectcharset',
+        'didinclude',
+        'difference',
+        'digit',
+        'dir',
+        'displaycountry',
+        'displaylanguage',
+        'displayname',
+        'displayscript',
+        'displayvariant',
+        'div',
+        'dns_response',
+        'do',
+        'doatbegins',
+        'doatends',
+        'doccomment',
+        'doclose',
+        'doctype',
+        'document',
+        'documentelement',
+        'documentroot',
+        'domainbody',
+        'done',
+        'dosessions',
+        'dowithclose',
+        'dowlocal',
+        'download',
+        'drawtext',
+        'drop',
+        'dropindex',
+        'dsdbtable',
+        'dshoststable',
+        'dsinfo',
+        'dst',
+        'dstable',
+        'dstoffset',
+        'dtdid',
+        'dup',
+        'dup2',
+        'each',
+        'eachbyte',
+        'eachcharacter',
+        'eachchild',
+        'eachcomponent',
+        'eachdir',
+        'eachdirpath',
+        'eachdirpathrecursive',
+        'eachentry',
+        'eachfile',
+        'eachfilename',
+        'eachfilepath',
+        'eachfilepathrecursive',
+        'eachkey',
+        'eachline',
+        'eachlinebreak',
+        'eachmatch',
+        'eachnode',
+        'eachpair',
+        'eachpath',
+        'eachpathrecursive',
+        'eachrow',
+        'eachsub',
+        'eachword',
+        'eachwordbreak',
+        'element',
+        'eligiblepath',
+        'eligiblepaths',
+        'encodebase64',
+        'encodehex',
+        'encodehtml',
+        'encodehtmltoxml',
+        'encodemd5',
+        'encodepassword',
+        'encodeqp',
+        'encodesql',
+        'encodesql92',
+        'encodeurl',
+        'encodevalue',
+        'encodexml',
+        'encoding',
+        'enctype',
+        'end',
+        'endjs',
+        'endssl',
+        'endswith',
+        'endtls',
+        'enhance',
+        'ensurestopped',
+        'entities',
+        'entry',
+        'env',
+        'equals',
+        'era',
+        'erf',
+        'erfc',
+        'err',
+        'errcode',
+        'errmsg',
+        'error',
+        'errors',
+        'errstack',
+        'escape_member',
+        'establisherrorstate',
+        'exceptioncheck',
+        'exceptionclear',
+        'exceptiondescribe',
+        'exceptionoccurred',
+        'exchange',
+        'execinits',
+        'execinstalls',
+        'execute',
+        'executelazy',
+        'executenow',
+        'exists',
+        'exit',
+        'exitcode',
+        'exp',
+        'expire',
+        'expireminutes',
+        'expiresminutes',
+        'expm1',
+        'export16bits',
+        'export32bits',
+        'export64bits',
+        'export8bits',
+        'exportas',
+        'exportbytes',
+        'exportfdf',
+        'exportpointerbits',
+        'exportsigned16bits',
+        'exportsigned32bits',
+        'exportsigned64bits',
+        'exportsigned8bits',
+        'exportstring',
+        'expose',
+        'extendedyear',
+        'extensiondelimiter',
+        'extensions',
+        'extract',
+        'extractfast',
+        'extractfastone',
+        'extractimage',
+        'extractone',
+        'f',
+        'fabs',
+        'fail',
+        'failnoconnectionhandler',
+        'family',
+        'fatalerror',
+        'fcgireq',
+        'fchdir',
+        'fchmod',
+        'fchown',
+        'fd',
+        'features',
+        'fetchdata',
+        'fieldnames',
+        'fieldposition',
+        'fieldstable',
+        'fieldtype',
+        'fieldvalue',
+        'file',
+        'filename',
+        'filenames',
+        'filequeue',
+        'fileuploads',
+        'fileuploadsary',
+        'filterinputcolumn',
+        'finalize',
+        'find',
+        'findall',
+        'findandmodify',
+        'findbucket',
+        'findcase',
+        'findclass',
+        'findcount',
+        'finddescendant',
+        'findfirst',
+        'findinclude',
+        'findinctx',
+        'findindex',
+        'findlast',
+        'findpattern',
+        'findposition',
+        'findsymbols',
+        'first',
+        'firstchild',
+        'firstcomponent',
+        'firstdayofweek',
+        'firstnode',
+        'fixformat',
+        'flags',
+        'fliph',
+        'flipv',
+        'floor',
+        'flush',
+        'foldcase',
+        'foo',
+        'for',
+        'forcedrowid',
+        'foreach',
+        'foreachaccept',
+        'foreachbyte',
+        'foreachcharacter',
+        'foreachchild',
+        'foreachday',
+        'foreachentry',
+        'foreachfile',
+        'foreachfilename',
+        'foreachkey',
+        'foreachline',
+        'foreachlinebreak',
+        'foreachmatch',
+        'foreachnode',
+        'foreachpair',
+        'foreachpathcomponent',
+        'foreachrow',
+        'foreachspool',
+        'foreachsub',
+        'foreachwordbreak',
+        'form',
+        'format',
+        'formatas',
+        'formatcontextelement',
+        'formatcontextelements',
+        'formatnumber',
+        'free',
+        'frexp',
+        'from',
+        'fromname',
+        'fromport',
+        'fromreflectedfield',
+        'fromreflectedmethod',
+        'front',
+        'fsync',
+        'ftpdeletefile',
+        'ftpgetlisting',
+        'ftruncate',
+        'fullpath',
+        'fx',
+        'gamma',
+        'gatewayinterface',
+        'gen',
+        'generatechecksum',
+        'get',
+        'getabswidth',
+        'getalignment',
+        'getappsource',
+        'getarraylength',
+        'getattr',
+        'getattribute',
+        'getattributenamespace',
+        'getattributenode',
+        'getattributenodens',
+        'getattributens',
+        'getbarheight',
+        'getbarmultiplier',
+        'getbarwidth',
+        'getbaseline',
+        'getbold',
+        'getbooleanarrayelements',
+        'getbooleanarrayregion',
+        'getbooleanfield',
+        'getbordercolor',
+        'getborderwidth',
+        'getbytearrayelements',
+        'getbytearrayregion',
+        'getbytefield',
+        'getchararrayelements',
+        'getchararrayregion',
+        'getcharfield',
+        'getclass',
+        'getcode',
+        'getcolor',
+        'getcolumn',
+        'getcolumncount',
+        'getcolumns',
+        'getdatabasebyalias',
+        'getdatabasebyid',
+        'getdatabasebyname',
+        'getdatabasehost',
+        'getdatabasetable',
+        'getdatabasetablebyalias',
+        'getdatabasetablebyid',
+        'getdatabasetablepart',
+        'getdatasource',
+        'getdatasourcedatabase',
+        'getdatasourcedatabasebyid',
+        'getdatasourcehost',
+        'getdatasourceid',
+        'getdatasourcename',
+        'getdefaultstorage',
+        'getdoublearrayelements',
+        'getdoublearrayregion',
+        'getdoublefield',
+        'getelementbyid',
+        'getelementsbytagname',
+        'getelementsbytagnamens',
+        'getencoding',
+        'getface',
+        'getfield',
+        'getfieldid',
+        'getfile',
+        'getfloatarrayelements',
+        'getfloatarrayregion',
+        'getfloatfield',
+        'getfont',
+        'getformat',
+        'getfullfontname',
+        'getgroup',
+        'getgroupid',
+        'getheader',
+        'getheaders',
+        'gethostdatabase',
+        'gethtmlattr',
+        'gethtmlattrstring',
+        'getinclude',
+        'getintarrayelements',
+        'getintarrayregion',
+        'getintfield',
+        'getisocomment',
+        'getitalic',
+        'getlasterror',
+        'getlcapitype',
+        'getlibrary',
+        'getlongarrayelements',
+        'getlongarrayregion',
+        'getlongfield',
+        'getmargins',
+        'getmethodid',
+        'getmode',
+        'getnameditem',
+        'getnameditemns',
+        'getnode',
+        'getnumericvalue',
+        'getobjectarrayelement',
+        'getobjectclass',
+        'getobjectfield',
+        'getpadding',
+        'getpagenumber',
+        'getparts',
+        'getprefs',
+        'getpropertyvalue',
+        'getprowcount',
+        'getpsfontname',
+        'getrange',
+        'getrowcount',
+        'getset',
+        'getshortarrayelements',
+        'getshortarrayregion',
+        'getshortfield',
+        'getsize',
+        'getsortfieldspart',
+        'getspacing',
+        'getstaticbooleanfield',
+        'getstaticbytefield',
+        'getstaticcharfield',
+        'getstaticdoublefield',
+        'getstaticfieldid',
+        'getstaticfloatfield',
+        'getstaticintfield',
+        'getstaticlongfield',
+        'getstaticmethodid',
+        'getstaticobjectfield',
+        'getstaticshortfield',
+        'getstatus',
+        'getstringchars',
+        'getstringlength',
+        'getstyle',
+        'getsupportedencodings',
+        'gettablebyid',
+        'gettext',
+        'gettextalignment',
+        'gettextsize',
+        'gettrigger',
+        'gettype',
+        'getunderline',
+        'getuniquealiasname',
+        'getuser',
+        'getuserbykey',
+        'getuserid',
+        'getversion',
+        'getzipfilebytes',
+        'givenblock',
+        'gmt',
+        'gotconnection',
+        'gotfileupload',
+        'groupby',
+        'groupcolumns',
+        'groupcount',
+        'groupjoin',
+        'handlebreakpointget',
+        'handlebreakpointlist',
+        'handlebreakpointremove',
+        'handlebreakpointset',
+        'handlebreakpointupdate',
+        'handlecontextget',
+        'handlecontextnames',
+        'handlecontinuation',
+        'handledefinitionbody',
+        'handledefinitionhead',
+        'handledefinitionresource',
+        'handledevconnection',
+        'handleevalexpired',
+        'handlefeatureget',
+        'handlefeatureset',
+        'handlelassoappcontent',
+        'handlelassoappresponse',
+        'handlenested',
+        'handlenormalconnection',
+        'handlepop',
+        'handleresource',
+        'handlesource',
+        'handlestackget',
+        'handlestderr',
+        'handlestdin',
+        'handlestdout',
+        'handshake',
+        'hasattribute',
+        'hasattributens',
+        'hasattributes',
+        'hasbinaryproperty',
+        'haschildnodes',
+        'hasexpired',
+        'hasfeature',
+        'hasfield',
+        'hash',
+        'hashtmlattr',
+        'hasmethod',
+        'hastable',
+        'hastrailingcomponent',
+        'hasvalue',
+        'head',
+        'header',
+        'headerbytes',
+        'headers',
+        'headersarray',
+        'headersmap',
+        'height',
+        'histogram',
+        'home',
+        'host',
+        'hostcolumnnames',
+        'hostcolumnnames2',
+        'hostcolumns',
+        'hostcolumns2',
+        'hostdatasource',
+        'hostextra',
+        'hostid',
+        'hostisdynamic',
+        'hostmap',
+        'hostmap2',
+        'hostname',
+        'hostpassword',
+        'hostport',
+        'hostschema',
+        'hosttableencoding',
+        'hosttonet16',
+        'hosttonet32',
+        'hosttonet64',
+        'hostusername',
+        'hour',
+        'hourofampm',
+        'hourofday',
+        'hoursbetween',
+        'href',
+        'hreflang',
+        'htmlcontent',
+        'htmlizestacktrace',
+        'htmlizestacktracelink',
+        'httpaccept',
+        'httpacceptencoding',
+        'httpacceptlanguage',
+        'httpauthorization',
+        'httpcachecontrol',
+        'httpconnection',
+        'httpcookie',
+        'httpequiv',
+        'httphost',
+        'httpreferer',
+        'httpreferrer',
+        'httpuseragent',
+        'hypot',
+        'id',
+        'idealinmemory',
+        'idle',
+        'idmap',
+        'ifempty',
+        'ifkey',
+        'ifnotempty',
+        'ifnotkey',
+        'ignorecase',
+        'ilogb',
+        'imgptr',
+        'implementation',
+        'import16bits',
+        'import32bits',
+        'import64bits',
+        'import8bits',
+        'importas',
+        'importbytes',
+        'importfdf',
+        'importnode',
+        'importpointer',
+        'importstring',
+        'in',
+        'include',
+        'includebytes',
+        'includelibrary',
+        'includelibraryonce',
+        'includeonce',
+        'includes',
+        'includestack',
+        'indaylighttime',
+        'index',
+        'init',
+        'initialize',
+        'initrequest',
+        'inits',
+        'inneroncompare',
+        'input',
+        'inputcolumns',
+        'inputtype',
+        'insert',
+        'insertback',
+        'insertbefore',
+        'insertdata',
+        'insertfirst',
+        'insertfrom',
+        'insertfront',
+        'insertinternal',
+        'insertlast',
+        'insertpage',
+        'install',
+        'installs',
+        'integer',
+        'internalsubset',
+        'interrupt',
+        'intersection',
+        'inttocond',
+        'invoke',
+        'invokeautocollect',
+        'invokeuntil',
+        'invokewhile',
+        'ioctl',
+        'isa',
+        'isalive',
+        'isallof',
+        'isalnum',
+        'isalpha',
+        'isanyof',
+        'isbase',
+        'isblank',
+        'iscntrl',
+        'isdigit',
+        'isdir',
+        'isdirectory',
+        'isempty',
+        'isemptyelement',
+        'isfirststep',
+        'isfullpath',
+        'isgraph',
+        'ishttps',
+        'isidle',
+        'isinstanceof',
+        'islink',
+        'islower',
+        'ismultipart',
+        'isnan',
+        'isnota',
+        'isnotempty',
+        'isnothing',
+        'iso3country',
+        'iso3language',
+        'isopen',
+        'isprint',
+        'ispunct',
+        'issameobject',
+        'isset',
+        'issourcefile',
+        'isspace',
+        'isssl',
+        'issupported',
+        'istitle',
+        'istruetype',
+        'istype',
+        'isualphabetic',
+        'isulowercase',
+        'isupper',
+        'isuuppercase',
+        'isuwhitespace',
+        'isvalid',
+        'iswhitespace',
+        'isxdigit',
+        'isxhr',
+        'item',
+        'j0',
+        'j1',
+        'javascript',
+        'jbarcode',
+        'jcolor',
+        'jfont',
+        'jimage',
+        'jlist',
+        'jn',
+        'jobjectisa',
+        'join',
+        'jread',
+        'jscontent',
+        'jsonfornode',
+        'jsonhtml',
+        'jsonisleaf',
+        'jsonlabel',
+        'jtable',
+        'jtext',
+        'julianday',
+        'kernel',
+        'key',
+        'keycolumns',
+        'keys',
+        'keywords',
+        'kill',
+        'label',
+        'lang',
+        'language',
+        'last_insert_rowid',
+        'last',
+        'lastaccessdate',
+        'lastaccesstime',
+        'lastchild',
+        'lastcomponent',
+        'lasterror',
+        'lastinsertid',
+        'lastnode',
+        'lastpoint',
+        'lasttouched',
+        'lazyvalue',
+        'ldexp',
+        'leaveopen',
+        'left',
+        'length',
+        'lgamma',
+        'line',
+        'linediffers',
+        'linkto',
+        'linktype',
+        'list',
+        'listactivedatasources',
+        'listalldatabases',
+        'listalltables',
+        'listdatabasetables',
+        'listdatasourcedatabases',
+        'listdatasourcehosts',
+        'listdatasources',
+        'listen',
+        'listgroups',
+        'listgroupsbyuser',
+        'listhostdatabases',
+        'listhosts',
+        'listmethods',
+        'listnode',
+        'listusers',
+        'listusersbygroup',
+        'loadcerts',
+        'loaddatasourcehostinfo',
+        'loaddatasourceinfo',
+        'loadlibrary',
+        'localaddress',
+        'localname',
+        'locals',
+        'lock',
+        'log',
+        'log10',
+        'log1p',
+        'logb',
+        'lookupnamespace',
+        'lop',
+        'lowagiefont',
+        'lowercase',
+        'makecolor',
+        'makecolumnlist',
+        'makecolumnmap',
+        'makecookieyumyum',
+        'makefullpath',
+        'makeinheritedcopy',
+        'makenonrelative',
+        'makeurl',
+        'map',
+        'marker',
+        'matches',
+        'matchesstart',
+        'matchposition',
+        'matchstring',
+        'matchtriggers',
+        'max',
+        'maxinmemory',
+        'maxlength',
+        'maxrows',
+        'maxworkers',
+        'maybeslash',
+        'maybevalue',
+        'md5hex',
+        'media',
+        'members',
+        'merge',
+        'meta',
+        'method',
+        'methodname',
+        'millisecond',
+        'millisecondsinday',
+        'mime_boundary',
+        'mime_contenttype',
+        'mime_hdrs',
+        'mime',
+        'mimes',
+        'min',
+        'minute',
+        'minutesbetween',
+        'moddatestr',
+        'mode',
+        'modf',
+        'modificationdate',
+        'modificationtime',
+        'modulate',
+        'monitorenter',
+        'monitorexit',
+        'month',
+        'moveto',
+        'movetoattribute',
+        'movetoattributenamespace',
+        'movetoelement',
+        'movetofirstattribute',
+        'movetonextattribute',
+        'msg',
+        'mtime',
+        'multiple',
+        'n',
+        'name',
+        'named',
+        'namespaceuri',
+        'needinitialization',
+        'net',
+        'nettohost16',
+        'nettohost32',
+        'nettohost64',
+        'new',
+        'newbooleanarray',
+        'newbytearray',
+        'newchararray',
+        'newdoublearray',
+        'newfloatarray',
+        'newglobalref',
+        'newintarray',
+        'newlongarray',
+        'newobject',
+        'newobjectarray',
+        'newshortarray',
+        'newstring',
+        'next',
+        'nextafter',
+        'nextnode',
+        'nextprime',
+        'nextprune',
+        'nextprunedelta',
+        'nextsibling',
+        'nodeforpath',
+        'nodelist',
+        'nodename',
+        'nodetype',
+        'nodevalue',
+        'noop',
+        'normalize',
+        'notationname',
+        'notations',
+        'novaluelists',
+        'numsets',
+        'object',
+        'objects',
+        'objecttype',
+        'onclick',
+        'oncompare',
+        'oncomparestrict',
+        'onconvert',
+        'oncreate',
+        'ondblclick',
+        'onkeydown',
+        'onkeypress',
+        'onkeyup',
+        'onmousedown',
+        'onmousemove',
+        'onmouseout',
+        'onmouseover',
+        'onmouseup',
+        'onreset',
+        'onsubmit',
+        'ontop',
+        'open',
+        'openappend',
+        'openread',
+        'opentruncate',
+        'openwith',
+        'openwrite',
+        'openwriteonly',
+        'orderby',
+        'orderbydescending',
+        'out',
+        'output',
+        'outputencoding',
+        'ownerdocument',
+        'ownerelement',
+        'padleading',
+        'padtrailing',
+        'padzero',
+        'pagecount',
+        'pagerotation',
+        'pagesize',
+        'param',
+        'paramdescs',
+        'params',
+        'parent',
+        'parentdir',
+        'parentnode',
+        'parse_body',
+        'parse_boundary',
+        'parse_charset',
+        'parse_content_disposition',
+        'parse_content_transfer_encoding',
+        'parse_content_type',
+        'parse_hdrs',
+        'parse_mode',
+        'parse_msg',
+        'parse_parts',
+        'parse_rawhdrs',
+        'parse',
+        'parseas',
+        'parsedocument',
+        'parsenumber',
+        'parseoneheaderline',
+        'pass',
+        'path',
+        'pathinfo',
+        'pathtouri',
+        'pathtranslated',
+        'pause',
+        'payload',
+        'pdifference',
+        'perform',
+        'performonce',
+        'perms',
+        'pid',
+        'pixel',
+        'pm',
+        'polldbg',
+        'pollide',
+        'pop_capa',
+        'pop_cmd',
+        'pop_debug',
+        'pop_err',
+        'pop_get',
+        'pop_ids',
+        'pop_index',
+        'pop_log',
+        'pop_mode',
+        'pop_net',
+        'pop_res',
+        'pop_server',
+        'pop_timeout',
+        'pop_token',
+        'pop',
+        'popctx',
+        'popinclude',
+        'populate',
+        'port',
+        'position',
+        'postdispatch',
+        'postparam',
+        'postparams',
+        'postparamsary',
+        'poststring',
+        'pow',
+        'predispatch',
+        'prefix',
+        'preflight',
+        'prepare',
+        'prepared',
+        'pretty',
+        'prev',
+        'previoussibling',
+        'printsimplemsg',
+        'private_compare',
+        'private_find',
+        'private_findlast',
+        'private_merge',
+        'private_rebalanceforinsert',
+        'private_rebalanceforremove',
+        'private_replaceall',
+        'private_replacefirst',
+        'private_rotateleft',
+        'private_rotateright',
+        'private_setrange',
+        'private_split',
+        'probemimetype',
+        'provides',
+        'proxying',
+        'prune',
+        'publicid',
+        'pullhttpheader',
+        'pullmimepost',
+        'pulloneheaderline',
+        'pullpost',
+        'pullrawpost',
+        'pullrawpostchunks',
+        'pullrequest',
+        'pullrequestline',
+        'push',
+        'pushctx',
+        'pushinclude',
+        'qdarray',
+        'qdcount',
+        'queryparam',
+        'queryparams',
+        'queryparamsary',
+        'querystring',
+        'queue_maintenance',
+        'queue_messages',
+        'queue_status',
+        'queue',
+        'quit',
+        'r',
+        'raw',
+        'rawcontent',
+        'rawdiff',
+        'rawheader',
+        'rawheaders',
+        'rawinvokable',
+        'read',
+        'readattributevalue',
+        'readbytes',
+        'readbytesfully',
+        'readdestinations',
+        'readerror',
+        'readidobjects',
+        'readline',
+        'readmessage',
+        'readnumber',
+        'readobject',
+        'readobjecttcp',
+        'readpacket',
+        'readsomebytes',
+        'readstring',
+        'ready',
+        'realdoc',
+        'realpath',
+        'receivefd',
+        'recipients',
+        'recover',
+        'rect',
+        'rectype',
+        'red',
+        'redirectto',
+        'referrals',
+        'refid',
+        'refobj',
+        'refresh',
+        'rel',
+        'remainder',
+        'remoteaddr',
+        'remoteaddress',
+        'remoteport',
+        'remove',
+        'removeall',
+        'removeattribute',
+        'removeattributenode',
+        'removeattributens',
+        'removeback',
+        'removechild',
+        'removedatabasetable',
+        'removedatasource',
+        'removedatasourcedatabase',
+        'removedatasourcehost',
+        'removefield',
+        'removefirst',
+        'removefront',
+        'removegroup',
+        'removelast',
+        'removeleading',
+        'removenameditem',
+        'removenameditemns',
+        'removenode',
+        'removesubnode',
+        'removetrailing',
+        'removeuser',
+        'removeuserfromallgroups',
+        'removeuserfromgroup',
+        'rename',
+        'renderbytes',
+        'renderdocumentbytes',
+        'renderstring',
+        'replace',
+        'replaceall',
+        'replacechild',
+        'replacedata',
+        'replacefirst',
+        'replaceheader',
+        'replacepattern',
+        'representnode',
+        'representnoderesult',
+        'reqid',
+        'requestid',
+        'requestmethod',
+        'requestparams',
+        'requesturi',
+        'requires',
+        'reserve',
+        'reset',
+        'resize',
+        'resolutionh',
+        'resolutionv',
+        'resolvelinks',
+        'resourcedata',
+        'resourceinvokable',
+        'resourcename',
+        'resources',
+        'respond',
+        'restart',
+        'restname',
+        'result',
+        'results',
+        'resume',
+        'retr',
+        'retrieve',
+        'returncolumns',
+        'returntype',
+        'rev',
+        'reverse',
+        'rewind',
+        'right',
+        'rint',
+        'roll',
+        'root',
+        'rootmap',
+        'rotate',
+        'route',
+        'rowsfound',
+        'rset',
+        'rule',
+        'rules',
+        'run',
+        'running',
+        'runonce',
+        's',
+        'sa',
+        'safeexport8bits',
+        'sameas',
+        'save',
+        'savedata',
+        'scalb',
+        'scale',
+        'scanfordatasource',
+        'scantasks',
+        'scanworkers',
+        'schemaname',
+        'scheme',
+        'script',
+        'scriptextensions',
+        'scriptfilename',
+        'scriptname',
+        'scripttype',
+        'scripturi',
+        'scripturl',
+        'scrubkeywords',
+        'search',
+        'searchinbucket',
+        'searchurl',
+        'second',
+        'secondsbetween',
+        'seek',
+        'select',
+        'selected',
+        'selectmany',
+        'self',
+        'send',
+        'sendchunk',
+        'sendfd',
+        'sendfile',
+        'sendpacket',
+        'sendresponse',
+        'separator',
+        'serializationelements',
+        'serialize',
+        'serveraddr',
+        'serveradmin',
+        'servername',
+        'serverport',
+        'serverprotocol',
+        'serversignature',
+        'serversoftware',
+        'sessionsdump',
+        'sessionsmap',
+        'set',
+        'setalignment',
+        'setattr',
+        'setattribute',
+        'setattributenode',
+        'setattributenodens',
+        'setattributens',
+        'setbarheight',
+        'setbarmultiplier',
+        'setbarwidth',
+        'setbaseline',
+        'setbold',
+        'setbooleanarrayregion',
+        'setbooleanfield',
+        'setbordercolor',
+        'setborderwidth',
+        'setbytearrayregion',
+        'setbytefield',
+        'setchararrayregion',
+        'setcharfield',
+        'setcode',
+        'setcolor',
+        'setcolorspace',
+        'setcookie',
+        'setcwd',
+        'setdefaultstorage',
+        'setdestination',
+        'setdoublearrayregion',
+        'setdoublefield',
+        'setencoding',
+        'setface',
+        'setfieldvalue',
+        'setfindpattern',
+        'setfloatarrayregion',
+        'setfloatfield',
+        'setfont',
+        'setformat',
+        'setgeneratechecksum',
+        'setheaders',
+        'sethtmlattr',
+        'setignorecase',
+        'setinput',
+        'setintarrayregion',
+        'setintfield',
+        'setitalic',
+        'setlinewidth',
+        'setlongarrayregion',
+        'setlongfield',
+        'setmarker',
+        'setmaxfilesize',
+        'setmode',
+        'setname',
+        'setnameditem',
+        'setnameditemns',
+        'setobjectarrayelement',
+        'setobjectfield',
+        'setpadding',
+        'setpagenumber',
+        'setpagerange',
+        'setposition',
+        'setrange',
+        'setreplacepattern',
+        'setshortarrayregion',
+        'setshortfield',
+        'setshowchecksum',
+        'setsize',
+        'setspacing',
+        'setstaticbooleanfield',
+        'setstaticbytefield',
+        'setstaticcharfield',
+        'setstaticdoublefield',
+        'setstaticfloatfield',
+        'setstaticintfield',
+        'setstaticlongfield',
+        'setstaticobjectfield',
+        'setstaticshortfield',
+        'setstatus',
+        'settextalignment',
+        'settextsize',
+        'settimezone',
+        'settrait',
+        'setunderline',
+        'sharpen',
+        'shouldabort',
+        'shouldclose',
+        'showchecksum',
+        'showcode39startstop',
+        'showeanguardbars',
+        'shutdownrd',
+        'shutdownrdwr',
+        'shutdownwr',
+        'sin',
+        'sinh',
+        'size',
+        'skip',
+        'skiprows',
+        'sort',
+        'sortcolumns',
+        'source',
+        'sourcecolumn',
+        'sourcefile',
+        'sourceline',
+        'specified',
+        'split',
+        'splitconnection',
+        'splitdebuggingthread',
+        'splitextension',
+        'splittext',
+        'splitthread',
+        'splittoprivatedev',
+        'splituppath',
+        'sql',
+        'sqlite3',
+        'sqrt',
+        'src',
+        'srcpath',
+        'sslerrfail',
+        'stack',
+        'standby',
+        'start',
+        'startone',
+        'startup',
+        'stat',
+        'statement',
+        'statementonly',
+        'stats',
+        'status',
+        'statuscode',
+        'statusmsg',
+        'stdin',
+        'step',
+        'stls',
+        'stop',
+        'stoprunning',
+        'storedata',
+        'stripfirstcomponent',
+        'striplastcomponent',
+        'style',
+        'styletype',
+        'sub',
+        'subject',
+        'subnode',
+        'subnodes',
+        'substringdata',
+        'subtract',
+        'subtraits',
+        'sum',
+        'supportscontentrepresentation',
+        'swapbytes',
+        'systemid',
+        't',
+        'tabindex',
+        'table',
+        'tablecolumnnames',
+        'tablecolumns',
+        'tablehascolumn',
+        'tableizestacktrace',
+        'tableizestacktracelink',
+        'tablemap',
+        'tablename',
+        'tables',
+        'tabs',
+        'tabstr',
+        'tag',
+        'tagname',
+        'take',
+        'tan',
+        'tanh',
+        'target',
+        'tasks',
+        'tb',
+        'tell',
+        'testexitcode',
+        'testlock',
+        'textwidth',
+        'thenby',
+        'thenbydescending',
+        'threadreaddesc',
+        'throw',
+        'thrownew',
+        'time',
+        'timezone',
+        'title',
+        'titlecase',
+        'to',
+        'token',
+        'tolower',
+        'top',
+        'toreflectedfield',
+        'toreflectedmethod',
+        'total_changes',
+        'totitle',
+        'touch',
+        'toupper',
+        'toxmlstring',
+        'trace',
+        'trackingid',
+        'trait',
+        'transform',
+        'trigger',
+        'trim',
+        'trunk',
+        'tryfinderrorfile',
+        'trylock',
+        'tryreadobject',
+        'type',
+        'typename',
+        'uidl',
+        'uncompress',
+        'unescape',
+        'union',
+        'uniqueid',
+        'unlock',
+        'unspool',
+        'up',
+        'update',
+        'updategroup',
+        'upload',
+        'uppercase',
+        'url',
+        'used',
+        'usemap',
+        'user',
+        'usercolumns',
+        'valid',
+        'validate',
+        'validatesessionstable',
+        'value',
+        'values',
+        'valuetype',
+        'variant',
+        'version',
+        'wait',
+        'waitforcompletion',
+        'warnings',
+        'week',
+        'weekofmonth',
+        'weekofyear',
+        'where',
+        'width',
+        'workers',
+        'workinginputcolumns',
+        'workingkeycolumns',
+        'workingkeyfield_name',
+        'workingreturncolumns',
+        'workingsortcolumns',
+        'write',
+        'writebodybytes',
+        'writebytes',
+        'writeheader',
+        'writeheaderbytes',
+        'writeheaderline',
+        'writeid',
+        'writemessage',
+        'writeobject',
+        'writeobjecttcp',
+        'writestring',
+        'wroteheaders',
+        'xhtml',
+        'xmllang',
+        'y0',
+        'y1',
+        'year',
+        'yearwoy',
+        'yn',
+        'z',
+        'zip',
+        'zipfile',
+        'zipfilename',
+        'zipname',
+        'zips',
+        'zoneoffset',
+    ),
+    'Lasso 8 Member Tags': (
+        'accept',
+        'add',
+        'addattachment',
+        'addattribute',
+        'addbarcode',
+        'addchapter',
+        'addcheckbox',
+        'addchild',
+        'addcombobox',
+        'addcomment',
+        'addcontent',
+        'addhiddenfield',
+        'addhtmlpart',
+        'addimage',
+        'addjavascript',
+        'addlist',
+        'addnamespace',
+        'addnextsibling',
+        'addpage',
+        'addparagraph',
+        'addparenttype',
+        'addpart',
+        'addpasswordfield',
+        'addphrase',
+        'addprevsibling',
+        'addradiobutton',
+        'addradiogroup',
+        'addresetbutton',
+        'addsection',
+        'addselectlist',
+        'addsibling',
+        'addsubmitbutton',
+        'addtable',
+        'addtext',
+        'addtextarea',
+        'addtextfield',
+        'addtextpart',
+        'alarms',
+        'annotate',
+        'answer',
+        'append',
+        'appendreplacement',
+        'appendtail',
+        'arc',
+        'asasync',
+        'astype',
+        'atbegin',
+        'atbottom',
+        'atend',
+        'atfarleft',
+        'atfarright',
+        'attop',
+        'attributecount',
+        'attributes',
+        'authenticate',
+        'authorize',
+        'backward',
+        'baseuri',
+        'bcc',
+        'beanproperties',
+        'beginswith',
+        'bind',
+        'bitand',
+        'bitclear',
+        'bitflip',
+        'bitformat',
+        'bitnot',
+        'bitor',
+        'bitset',
+        'bitshiftleft',
+        'bitshiftright',
+        'bittest',
+        'bitxor',
+        'blur',
+        'body',
+        'boundary',
+        'bytes',
+        'call',
+        'cancel',
+        'capabilities',
+        'cc',
+        'chardigitvalue',
+        'charname',
+        'charset',
+        'chartype',
+        'children',
+        'circle',
+        'close',
+        'closepath',
+        'closewrite',
+        'code',
+        'colorspace',
+        'command',
+        'comments',
+        'compare',
+        'comparecodepointorder',
+        'compile',
+        'composite',
+        'connect',
+        'contains',
+        'content_disposition',
+        'content_transfer_encoding',
+        'content_type',
+        'contents',
+        'contrast',
+        'convert',
+        'crop',
+        'curveto',
+        'data',
+        'date',
+        'day',
+        'daylights',
+        'dayofweek',
+        'dayofyear',
+        'decrement',
+        'delete',
+        'depth',
+        'describe',
+        'description',
+        'deserialize',
+        'detach',
+        'detachreference',
+        'difference',
+        'digit',
+        'document',
+        'down',
+        'drawtext',
+        'dst',
+        'dump',
+        'endswith',
+        'enhance',
+        'equals',
+        'errors',
+        'eval',
+        'events',
+        'execute',
+        'export16bits',
+        'export32bits',
+        'export64bits',
+        'export8bits',
+        'exportfdf',
+        'exportstring',
+        'extract',
+        'extractone',
+        'fieldnames',
+        'fieldtype',
+        'fieldvalue',
+        'file',
+        'find',
+        'findindex',
+        'findnamespace',
+        'findnamespacebyhref',
+        'findpattern',
+        'findposition',
+        'first',
+        'firstchild',
+        'fliph',
+        'flipv',
+        'flush',
+        'foldcase',
+        'foreach',
+        'format',
+        'forward',
+        'freebusies',
+        'freezetype',
+        'freezevalue',
+        'from',
+        'fulltype',
+        'generatechecksum',
+        'get',
+        'getabswidth',
+        'getalignment',
+        'getattribute',
+        'getattributenamespace',
+        'getbarheight',
+        'getbarmultiplier',
+        'getbarwidth',
+        'getbaseline',
+        'getbordercolor',
+        'getborderwidth',
+        'getcode',
+        'getcolor',
+        'getcolumncount',
+        'getencoding',
+        'getface',
+        'getfont',
+        'getformat',
+        'getfullfontname',
+        'getheaders',
+        'getmargins',
+        'getmethod',
+        'getnumericvalue',
+        'getpadding',
+        'getpagenumber',
+        'getparams',
+        'getproperty',
+        'getpsfontname',
+        'getrange',
+        'getrowcount',
+        'getsize',
+        'getspacing',
+        'getsupportedencodings',
+        'gettextalignment',
+        'gettextsize',
+        'gettype',
+        'gmt',
+        'groupcount',
+        'hasattribute',
+        'haschildren',
+        'hasvalue',
+        'header',
+        'headers',
+        'height',
+        'histogram',
+        'hosttonet16',
+        'hosttonet32',
+        'hour',
+        'id',
+        'ignorecase',
+        'import16bits',
+        'import32bits',
+        'import64bits',
+        'import8bits',
+        'importfdf',
+        'importstring',
+        'increment',
+        'input',
+        'insert',
+        'insertatcurrent',
+        'insertfirst',
+        'insertfrom',
+        'insertlast',
+        'insertpage',
+        'integer',
+        'intersection',
+        'invoke',
+        'isa',
+        'isalnum',
+        'isalpha',
+        'isbase',
+        'iscntrl',
+        'isdigit',
+        'isemptyelement',
+        'islower',
+        'isopen',
+        'isprint',
+        'isspace',
+        'istitle',
+        'istruetype',
+        'isualphabetic',
+        'isulowercase',
+        'isupper',
+        'isuuppercase',
+        'isuwhitespace',
+        'iswhitespace',
+        'iterator',
+        'javascript',
+        'join',
+        'journals',
+        'key',
+        'keys',
+        'last',
+        'lastchild',
+        'lasterror',
+        'left',
+        'length',
+        'line',
+        'listen',
+        'localaddress',
+        'localname',
+        'lock',
+        'lookupnamespace',
+        'lowercase',
+        'marker',
+        'matches',
+        'matchesstart',
+        'matchposition',
+        'matchstring',
+        'merge',
+        'millisecond',
+        'minute',
+        'mode',
+        'modulate',
+        'month',
+        'moveto',
+        'movetoattributenamespace',
+        'movetoelement',
+        'movetofirstattribute',
+        'movetonextattribute',
+        'name',
+        'namespaces',
+        'namespaceuri',
+        'nettohost16',
+        'nettohost32',
+        'newchild',
+        'next',
+        'nextsibling',
+        'nodetype',
+        'open',
+        'output',
+        'padleading',
+        'padtrailing',
+        'pagecount',
+        'pagesize',
+        'paraminfo',
+        'params',
+        'parent',
+        'path',
+        'pixel',
+        'position',
+        'prefix',
+        'previoussibling',
+        'properties',
+        'rawheaders',
+        'read',
+        'readattributevalue',
+        'readerror',
+        'readfrom',
+        'readline',
+        'readlock',
+        'readstring',
+        'readunlock',
+        'recipients',
+        'rect',
+        'refcount',
+        'referrals',
+        'remoteaddress',
+        'remove',
+        'removeall',
+        'removeattribute',
+        'removechild',
+        'removecurrent',
+        'removefirst',
+        'removelast',
+        'removeleading',
+        'removenamespace',
+        'removetrailing',
+        'render',
+        'replace',
+        'replaceall',
+        'replacefirst',
+        'replacepattern',
+        'replacewith',
+        'reserve',
+        'reset',
+        'resolutionh',
+        'resolutionv',
+        'response',
+        'results',
+        'retrieve',
+        'returntype',
+        'reverse',
+        'reverseiterator',
+        'right',
+        'rotate',
+        'run',
+        'save',
+        'scale',
+        'search',
+        'second',
+        'send',
+        'serialize',
+        'set',
+        'setalignment',
+        'setbarheight',
+        'setbarmultiplier',
+        'setbarwidth',
+        'setbaseline',
+        'setblocking',
+        'setbordercolor',
+        'setborderwidth',
+        'setbytes',
+        'setcode',
+        'setcolor',
+        'setcolorspace',
+        'setdatatype',
+        'setencoding',
+        'setface',
+        'setfieldvalue',
+        'setfont',
+        'setformat',
+        'setgeneratechecksum',
+        'setheight',
+        'setlassodata',
+        'setlinewidth',
+        'setmarker',
+        'setmode',
+        'setname',
+        'setpadding',
+        'setpagenumber',
+        'setpagerange',
+        'setposition',
+        'setproperty',
+        'setrange',
+        'setshowchecksum',
+        'setsize',
+        'setspacing',
+        'settemplate',
+        'settemplatestr',
+        'settextalignment',
+        'settextdata',
+        'settextsize',
+        'settype',
+        'setunderline',
+        'setwidth',
+        'setxmldata',
+        'sharpen',
+        'showchecksum',
+        'showcode39startstop',
+        'showeanguardbars',
+        'signal',
+        'signalall',
+        'size',
+        'smooth',
+        'sort',
+        'sortwith',
+        'split',
+        'standards',
+        'steal',
+        'subject',
+        'substring',
+        'subtract',
+        'swapbytes',
+        'textwidth',
+        'time',
+        'timezones',
+        'titlecase',
+        'to',
+        'todos',
+        'tolower',
+        'totitle',
+        'toupper',
+        'transform',
+        'trim',
+        'type',
+        'unescape',
+        'union',
+        'uniqueid',
+        'unlock',
+        'unserialize',
+        'up',
+        'uppercase',
+        'value',
+        'values',
+        'valuetype',
+        'wait',
+        'waskeyword',
+        'week',
+        'width',
+        'write',
+        'writelock',
+        'writeto',
+        'writeunlock',
+        'xmllang',
+        'xmlschematype',
+        'year',
+    )
+}
diff --git a/.venv/Lib/site-packages/pygments/lexers/_lilypond_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_lilypond_builtins.py
new file mode 100644 (file)
index 0000000..b00dbbf
--- /dev/null
@@ -0,0 +1,4932 @@
+"""
+    pygments.lexers._lilypond_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    LilyPond builtins.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# Contents generated by the script lilypond-builtins-generator.ly
+# found in the external/ directory of the source tree.
+
+keywords = [
+  "accepts",
+  "addlyrics",
+  "alias",
+  "book",
+  "bookpart",
+  "chordmode",
+  "chords",
+  "consists",
+  "context",
+  "defaultchild",
+  "denies",
+  "description",
+  "drummode",
+  "drums",
+  "etc",
+  "figuremode",
+  "figures",
+  "header",
+  "include",
+  "inherit-acceptability",
+  "language",
+  "layout",
+  "lyricmode",
+  "lyricsto",
+  "midi",
+  "name",
+  "new",
+  "notemode",
+  "paper",
+  "remove",
+  "score",
+  "type",
+  "version",
+  "with",
+]
+
+clefs = [
+  "C",
+  "F",
+  "G",
+  "G2",
+  "GG",
+  "alto",
+  "altovarC",
+  "baritone",
+  "baritonevarC",
+  "baritonevarF",
+  "bass",
+  "blackmensural-c1",
+  "blackmensural-c2",
+  "blackmensural-c3",
+  "blackmensural-c4",
+  "blackmensural-c5",
+  "french",
+  "hufnagel-do-fa",
+  "hufnagel-do1",
+  "hufnagel-do2",
+  "hufnagel-do3",
+  "hufnagel-fa1",
+  "hufnagel-fa2",
+  "kievan-do",
+  "medicaea-do1",
+  "medicaea-do2",
+  "medicaea-do3",
+  "medicaea-fa1",
+  "medicaea-fa2",
+  "mensural-c1",
+  "mensural-c2",
+  "mensural-c3",
+  "mensural-c4",
+  "mensural-c5",
+  "mensural-f",
+  "mensural-g",
+  "mezzosoprano",
+  "moderntab",
+  "neomensural-c1",
+  "neomensural-c2",
+  "neomensural-c3",
+  "neomensural-c4",
+  "neomensural-c5",
+  "percussion",
+  "petrucci-c1",
+  "petrucci-c2",
+  "petrucci-c3",
+  "petrucci-c4",
+  "petrucci-c5",
+  "petrucci-f",
+  "petrucci-f2",
+  "petrucci-f3",
+  "petrucci-f4",
+  "petrucci-f5",
+  "petrucci-g",
+  "petrucci-g1",
+  "petrucci-g2",
+  "soprano",
+  "subbass",
+  "tab",
+  "tenor",
+  "tenorG",
+  "tenorvarC",
+  "treble",
+  "varC",
+  "varbaritone",
+  "varpercussion",
+  "vaticana-do1",
+  "vaticana-do2",
+  "vaticana-do3",
+  "vaticana-fa1",
+  "vaticana-fa2",
+  "violin",
+]
+
+scales = [
+  "aeolian",
+  "dorian",
+  "ionian",
+  "locrian",
+  "lydian",
+  "major",
+  "minor",
+  "mixolydian",
+  "phrygian",
+]
+
+repeat_types = [
+  "percent",
+  "segno",
+  "tremolo",
+  "unfold",
+  "volta",
+]
+
+units = [
+  "cm",
+  "in",
+  "mm",
+  "pt",
+  "staff-space",
+]
+
+chord_modifiers = [
+  "aug",
+  "dim",
+  "m",
+  "maj",
+]
+
+pitch_language_names = [
+  "arabic",
+  "catalan",
+  "català",
+  "deutsch",
+  "english",
+  "espanol",
+  "español",
+  "français",
+  "italiano",
+  "nederlands",
+  "norsk",
+  "portugues",
+  "português",
+  "suomi",
+  "svenska",
+  "vlaams",
+]
+
+pitches = [
+  "R",
+  "a",
+  "a-flat",
+  "a-flatflat",
+  "a-natural",
+  "a-sharp",
+  "a-sharpsharp",
+  "ab",
+  "acousticbassdrum",
+  "acousticsnare",
+  "ad",
+  "adb",
+  "add",
+  "aeh",
+  "aes",
+  "aeseh",
+  "aeses",
+  "aess",
+  "aesseh",
+  "aessess",
+  "af",
+  "aff",
+  "afhb",
+  "afhd",
+  "agh",
+  "agl",
+  "ah",
+  "aih",
+  "ais",
+  "aisih",
+  "aisis",
+  "aiss",
+  "aissih",
+  "aississ",
+  "aqf",
+  "aqs",
+  "as",
+  "asah",
+  "asas",
+  "aseh",
+  "ases",
+  "ashb",
+  "ashd",
+  "ass",
+  "asseh",
+  "assess",
+  "atqb",
+  "atqd",
+  "atqf",
+  "atqs",
+  "ax",
+  "b",
+  "b-flat",
+  "b-flatflat",
+  "b-natural",
+  "b-sharp",
+  "b-sharpsharp",
+  "bassdrum",
+  "bb",
+  "bd",
+  "bda",
+  "bdb",
+  "bdd",
+  "beh",
+  "bes",
+  "beseh",
+  "beses",
+  "bess",
+  "bf",
+  "bff",
+  "bfhb",
+  "bfhd",
+  "bih",
+  "bis",
+  "bisih",
+  "bisis",
+  "boh",
+  "bohm",
+  "boho",
+  "bol",
+  "bolm",
+  "bolo",
+  "bqf",
+  "bqs",
+  "bs",
+  "bshb",
+  "bshd",
+  "bss",
+  "btqb",
+  "btqd",
+  "btqf",
+  "btqs",
+  "bx",
+  "c",
+  "c-flat",
+  "c-flatflat",
+  "c-natural",
+  "c-sharp",
+  "c-sharpsharp",
+  "cab",
+  "cabasa",
+  "cb",
+  "cd",
+  "cdb",
+  "cdd",
+  "ceh",
+  "ces",
+  "ceseh",
+  "ceses",
+  "cess",
+  "cesseh",
+  "cessess",
+  "cf",
+  "cff",
+  "cfhb",
+  "cfhd",
+  "cgh",
+  "cghm",
+  "cgho",
+  "cgl",
+  "cglm",
+  "cglo",
+  "chinesecymbal",
+  "cih",
+  "cis",
+  "cisih",
+  "cisis",
+  "ciss",
+  "cissih",
+  "cississ",
+  "cl",
+  "claves",
+  "closedhihat",
+  "cowbell",
+  "cqf",
+  "cqs",
+  "crashcymbal",
+  "crashcymbala",
+  "crashcymbalb",
+  "cs",
+  "cshb",
+  "cshd",
+  "css",
+  "ctqb",
+  "ctqd",
+  "ctqf",
+  "ctqs",
+  "cuim",
+  "cuio",
+  "cx",
+  "cymc",
+  "cymca",
+  "cymcb",
+  "cymch",
+  "cymr",
+  "cymra",
+  "cymrb",
+  "cyms",
+  "d",
+  "d-flat",
+  "d-flatflat",
+  "d-natural",
+  "d-sharp",
+  "d-sharpsharp",
+  "db",
+  "dd",
+  "ddb",
+  "ddd",
+  "deh",
+  "des",
+  "deseh",
+  "deses",
+  "dess",
+  "desseh",
+  "dessess",
+  "df",
+  "dff",
+  "dfhb",
+  "dfhd",
+  "dih",
+  "dis",
+  "disih",
+  "disis",
+  "diss",
+  "dissih",
+  "dississ",
+  "do",
+  "dob",
+  "dobb",
+  "dobhb",
+  "dobqt",
+  "dobsb",
+  "dobtqt",
+  "docb",
+  "docs",
+  "dod",
+  "dodd",
+  "dodsd",
+  "dohb",
+  "dohk",
+  "dok",
+  "dokhk",
+  "dokk",
+  "doqb",
+  "doqd",
+  "doqs",
+  "dos",
+  "dosb",
+  "dosd",
+  "dosqt",
+  "doss",
+  "dostqt",
+  "dotcb",
+  "dotcs",
+  "dotqb",
+  "dotqd",
+  "dotqs",
+  "dox",
+  "dqf",
+  "dqs",
+  "ds",
+  "dshb",
+  "dshd",
+  "dss",
+  "dtqb",
+  "dtqd",
+  "dtqf",
+  "dtqs",
+  "dx",
+  "e",
+  "e-flat",
+  "e-flatflat",
+  "e-natural",
+  "e-sharp",
+  "e-sharpsharp",
+  "eb",
+  "ed",
+  "edb",
+  "edd",
+  "eeh",
+  "ees",
+  "eeseh",
+  "eeses",
+  "eess",
+  "eesseh",
+  "eessess",
+  "ef",
+  "eff",
+  "efhb",
+  "efhd",
+  "eh",
+  "eih",
+  "eis",
+  "eisih",
+  "eisis",
+  "eiss",
+  "eissih",
+  "eississ",
+  "electricsnare",
+  "eqf",
+  "eqs",
+  "es",
+  "eseh",
+  "eses",
+  "eshb",
+  "eshd",
+  "ess",
+  "esseh",
+  "essess",
+  "etqb",
+  "etqd",
+  "etqf",
+  "etqs",
+  "ex",
+  "f",
+  "f-flat",
+  "f-flatflat",
+  "f-natural",
+  "f-sharp",
+  "f-sharpsharp",
+  "fa",
+  "fab",
+  "fabb",
+  "fabhb",
+  "fabqt",
+  "fabsb",
+  "fabtqt",
+  "facb",
+  "facs",
+  "fad",
+  "fadd",
+  "fadsd",
+  "fahb",
+  "fahk",
+  "fak",
+  "fakhk",
+  "fakk",
+  "faqb",
+  "faqd",
+  "faqs",
+  "fas",
+  "fasb",
+  "fasd",
+  "fasqt",
+  "fass",
+  "fastqt",
+  "fatcb",
+  "fatcs",
+  "fatqb",
+  "fatqd",
+  "fatqs",
+  "fax",
+  "fb",
+  "fd",
+  "fdb",
+  "fdd",
+  "feh",
+  "fes",
+  "feseh",
+  "feses",
+  "fess",
+  "fesseh",
+  "fessess",
+  "ff",
+  "fff",
+  "ffhb",
+  "ffhd",
+  "fih",
+  "fis",
+  "fisih",
+  "fisis",
+  "fiss",
+  "fissih",
+  "fississ",
+  "fqf",
+  "fqs",
+  "fs",
+  "fshb",
+  "fshd",
+  "fss",
+  "ftqb",
+  "ftqd",
+  "ftqf",
+  "ftqs",
+  "fx",
+  "g",
+  "g-flat",
+  "g-flatflat",
+  "g-natural",
+  "g-sharp",
+  "g-sharpsharp",
+  "gb",
+  "gd",
+  "gdb",
+  "gdd",
+  "geh",
+  "ges",
+  "geseh",
+  "geses",
+  "gess",
+  "gesseh",
+  "gessess",
+  "gf",
+  "gff",
+  "gfhb",
+  "gfhd",
+  "gih",
+  "gis",
+  "gisih",
+  "gisis",
+  "giss",
+  "gissih",
+  "gississ",
+  "gqf",
+  "gqs",
+  "gs",
+  "gshb",
+  "gshd",
+  "gss",
+  "gtqb",
+  "gtqd",
+  "gtqf",
+  "gtqs",
+  "gui",
+  "guil",
+  "guiro",
+  "guis",
+  "gx",
+  "h",
+  "halfopenhihat",
+  "handclap",
+  "hc",
+  "heh",
+  "heseh",
+  "heses",
+  "hesseh",
+  "hessess",
+  "hh",
+  "hhc",
+  "hhho",
+  "hho",
+  "hhp",
+  "hiagogo",
+  "hibongo",
+  "hiconga",
+  "highfloortom",
+  "hightom",
+  "hih",
+  "hihat",
+  "himidtom",
+  "his",
+  "hisidestick",
+  "hisih",
+  "hisis",
+  "hiss",
+  "hissih",
+  "hississ",
+  "hitimbale",
+  "hiwoodblock",
+  "la",
+  "lab",
+  "labb",
+  "labhb",
+  "labqt",
+  "labsb",
+  "labtqt",
+  "lacb",
+  "lacs",
+  "lad",
+  "ladd",
+  "ladsd",
+  "lahb",
+  "lahk",
+  "lak",
+  "lakhk",
+  "lakk",
+  "laqb",
+  "laqd",
+  "laqs",
+  "las",
+  "lasb",
+  "lasd",
+  "lasqt",
+  "lass",
+  "lastqt",
+  "latcb",
+  "latcs",
+  "latqb",
+  "latqd",
+  "latqs",
+  "lax",
+  "loagogo",
+  "lobongo",
+  "loconga",
+  "longguiro",
+  "longwhistle",
+  "losidestick",
+  "lotimbale",
+  "lowfloortom",
+  "lowmidtom",
+  "lowoodblock",
+  "lowtom",
+  "mar",
+  "maracas",
+  "mi",
+  "mib",
+  "mibb",
+  "mibhb",
+  "mibqt",
+  "mibsb",
+  "mibtqt",
+  "micb",
+  "mics",
+  "mid",
+  "midd",
+  "midsd",
+  "mihb",
+  "mihk",
+  "mik",
+  "mikhk",
+  "mikk",
+  "miqb",
+  "miqd",
+  "miqs",
+  "mis",
+  "misb",
+  "misd",
+  "misqt",
+  "miss",
+  "mistqt",
+  "mitcb",
+  "mitcs",
+  "mitqb",
+  "mitqd",
+  "mitqs",
+  "mix",
+  "mutecuica",
+  "mutehibongo",
+  "mutehiconga",
+  "mutelobongo",
+  "muteloconga",
+  "mutetriangle",
+  "opencuica",
+  "openhibongo",
+  "openhiconga",
+  "openhihat",
+  "openlobongo",
+  "openloconga",
+  "opentriangle",
+  "pedalhihat",
+  "r",
+  "rb",
+  "re",
+  "reb",
+  "rebb",
+  "rebhb",
+  "rebqt",
+  "rebsb",
+  "rebtqt",
+  "recb",
+  "recs",
+  "red",
+  "redd",
+  "redsd",
+  "rehb",
+  "rehk",
+  "rek",
+  "rekhk",
+  "rekk",
+  "reqb",
+  "reqd",
+  "reqs",
+  "res",
+  "resb",
+  "resd",
+  "resqt",
+  "ress",
+  "restqt",
+  "retcb",
+  "retcs",
+  "retqb",
+  "retqd",
+  "retqs",
+  "rex",
+  "ridebell",
+  "ridecymbal",
+  "ridecymbala",
+  "ridecymbalb",
+  "ré",
+  "réb",
+  "rébb",
+  "rébsb",
+  "réd",
+  "rédd",
+  "rédsd",
+  "résb",
+  "résd",
+  "réx",
+  "shortguiro",
+  "shortwhistle",
+  "si",
+  "sib",
+  "sibb",
+  "sibhb",
+  "sibqt",
+  "sibsb",
+  "sibtqt",
+  "sicb",
+  "sics",
+  "sid",
+  "sidd",
+  "sidestick",
+  "sidsd",
+  "sihb",
+  "sihk",
+  "sik",
+  "sikhk",
+  "sikk",
+  "siqb",
+  "siqd",
+  "siqs",
+  "sis",
+  "sisb",
+  "sisd",
+  "sisqt",
+  "siss",
+  "sistqt",
+  "sitcb",
+  "sitcs",
+  "sitqb",
+  "sitqd",
+  "sitqs",
+  "six",
+  "sn",
+  "sna",
+  "snare",
+  "sne",
+  "sol",
+  "solb",
+  "solbb",
+  "solbhb",
+  "solbqt",
+  "solbsb",
+  "solbtqt",
+  "solcb",
+  "solcs",
+  "sold",
+  "soldd",
+  "soldsd",
+  "solhb",
+  "solhk",
+  "solk",
+  "solkhk",
+  "solkk",
+  "solqb",
+  "solqd",
+  "solqs",
+  "sols",
+  "solsb",
+  "solsd",
+  "solsqt",
+  "solss",
+  "solstqt",
+  "soltcb",
+  "soltcs",
+  "soltqb",
+  "soltqd",
+  "soltqs",
+  "solx",
+  "splashcymbal",
+  "ss",
+  "ssh",
+  "ssl",
+  "tamb",
+  "tambourine",
+  "timh",
+  "timl",
+  "tomfh",
+  "tomfl",
+  "tomh",
+  "toml",
+  "tommh",
+  "tomml",
+  "tri",
+  "triangle",
+  "trim",
+  "trio",
+  "tt",
+  "vibraslap",
+  "vibs",
+  "wbh",
+  "wbl",
+  "whl",
+  "whs",
+]
+
+music_functions = [
+  "=",
+  "absolute",
+  "acciaccatura",
+  "accidentalStyle",
+  "addChordShape",
+  "addInstrumentDefinition",
+  "addQuote",
+  "after",
+  "afterGrace",
+  "allowPageTurn",
+  "allowVoltaHook",
+  "alterBroken",
+  "alternative",
+  "ambitusAfter",
+  "appendToTag",
+  "applyContext",
+  "applyMusic",
+  "applyOutput",
+  "appoggiatura",
+  "assertBeamQuant",
+  "assertBeamSlope",
+  "autoChange",
+  "balloonGrobText",
+  "balloonText",
+  "bar",
+  "barNumberCheck",
+  "beamExceptions",
+  "bendAfter",
+  "bendHold",
+  "bendStartLevel",
+  "bookOutputName",
+  "bookOutputSuffix",
+  "breathe",
+  "caesura",
+  "change",
+  "chordRepeats",
+  "clef",
+  "codaMark",
+  "compoundMeter",
+  "compressMMRests",
+  "crossStaff",
+  "cueClef",
+  "cueClefUnset",
+  "cueDuring",
+  "cueDuringWithClef",
+  "deadNote",
+  "defineBarLine",
+  "displayLilyMusic",
+  "displayMusic",
+  "displayScheme",
+  "dropNote",
+  "enablePolymeter",
+  "endSpanners",
+  "eventChords",
+  "featherDurations",
+  "finger",
+  "fixed",
+  "footnote",
+  "grace",
+  "grobdescriptions",
+  "harmonicByFret",
+  "harmonicByRatio",
+  "harmonicNote",
+  "harmonicsOn",
+  "hide",
+  "inStaffSegno",
+  "incipit",
+  "inherit-acceptability",
+  "instrumentSwitch",
+  "inversion",
+  "invertChords",
+  "jump",
+  "keepWithTag",
+  "key",
+  "killCues",
+  "label",
+  "language",
+  "languageRestore",
+  "languageSaveAndChange",
+  "magnifyMusic",
+  "magnifyStaff",
+  "makeClusters",
+  "makeDefaultStringTuning",
+  "mark",
+  "markupMap",
+  "modalInversion",
+  "modalTranspose",
+  "musicMap",
+  "noPageBreak",
+  "noPageTurn",
+  "octaveCheck",
+  "offset",
+  "omit",
+  "once",
+  "ottava",
+  "override",
+  "overrideProperty",
+  "overrideTimeSignatureSettings",
+  "pageBreak",
+  "pageTurn",
+  "palmMute",
+  "palmMuteOn",
+  "parallelMusic",
+  "parenthesize",
+  "partCombine",
+  "partCombineDown",
+  "partCombineForce",
+  "partCombineUp",
+  "partial",
+  "phrasingSlurDashPattern",
+  "pitchedTrill",
+  "pointAndClickOff",
+  "pointAndClickOn",
+  "pointAndClickTypes",
+  "preBend",
+  "preBendHold",
+  "propertyOverride",
+  "propertyRevert",
+  "propertySet",
+  "propertyTweak",
+  "propertyUnset",
+  "pushToTag",
+  "quoteDuring",
+  "raiseNote",
+  "reduceChords",
+  "relative",
+  "removeWithTag",
+  "repeat",
+  "resetRelativeOctave",
+  "retrograde",
+  "revert",
+  "revertTimeSignatureSettings",
+  "rightHandFinger",
+  "scaleDurations",
+  "sectionLabel",
+  "segnoMark",
+  "set",
+  "settingsFrom",
+  "shape",
+  "shiftDurations",
+  "single",
+  "skip",
+  "slashedGrace",
+  "slurDashPattern",
+  "staffHighlight",
+  "storePredefinedDiagram",
+  "stringTuning",
+  "styledNoteHeads",
+  "tabChordRepeats",
+  "tabChordRepetition",
+  "tag",
+  "tagGroup",
+  "tempo",
+  "temporary",
+  "textEndMark",
+  "textMark",
+  "tieDashPattern",
+  "time",
+  "times",
+  "tocItem",
+  "transpose",
+  "transposedCueDuring",
+  "transposition",
+  "tuplet",
+  "tupletSpan",
+  "tweak",
+  "undo",
+  "unfoldRepeats",
+  "unfolded",
+  "unset",
+  "voices",
+  "void",
+  "volta",
+  "vshape",
+  "withMusicProperty",
+  "xNote",
+]
+
+dynamics = [
+  "!",
+  "<",
+  ">",
+  "cr",
+  "cresc",
+  "decr",
+  "decresc",
+  "dim",
+  "endcr",
+  "endcresc",
+  "enddecr",
+  "enddecresc",
+  "enddim",
+  "f",
+  "ff",
+  "fff",
+  "ffff",
+  "fffff",
+  "fp",
+  "fz",
+  "mf",
+  "mp",
+  "n",
+  "p",
+  "pp",
+  "ppp",
+  "pppp",
+  "ppppp",
+  "rfz",
+  "sf",
+  "sff",
+  "sfp",
+  "sfz",
+  "sp",
+  "spp",
+]
+
+articulations = [
+  "(",
+  ")",
+  "-",
+  "[",
+  "]",
+  "^",
+  "accent",
+  "arpeggio",
+  "breakDynamicSpan",
+  "coda",
+  "dashBang",
+  "dashDash",
+  "dashDot",
+  "dashHat",
+  "dashLarger",
+  "dashPlus",
+  "dashUnderscore",
+  "downbow",
+  "downmordent",
+  "downprall",
+  "episemFinis",
+  "episemInitium",
+  "espressivo",
+  "fermata",
+  "flageolet",
+  "glide",
+  "glissando",
+  "halfopen",
+  "harmonic",
+  "haydnturn",
+  "henzelongfermata",
+  "henzeshortfermata",
+  "laissezVibrer",
+  "lheel",
+  "lineprall",
+  "longfermata",
+  "ltoe",
+  "marcato",
+  "mordent",
+  "noBeam",
+  "open",
+  "portato",
+  "prall",
+  "pralldown",
+  "prallmordent",
+  "prallprall",
+  "prallup",
+  "repeatTie",
+  "reverseturn",
+  "rheel",
+  "rtoe",
+  "segno",
+  "shortfermata",
+  "signumcongruentiae",
+  "slashturn",
+  "snappizzicato",
+  "sostenutoOff",
+  "sostenutoOn",
+  "staccatissimo",
+  "staccato",
+  "startGraceSlur",
+  "startGroup",
+  "startTextSpan",
+  "startTrillSpan",
+  "stopGraceSlur",
+  "stopGroup",
+  "stopTextSpan",
+  "stopTrillSpan",
+  "stopped",
+  "sustainOff",
+  "sustainOn",
+  "tenuto",
+  "thumb",
+  "treCorde",
+  "trill",
+  "turn",
+  "unaCorda",
+  "upbow",
+  "upmordent",
+  "upprall",
+  "varcoda",
+  "verylongfermata",
+  "veryshortfermata",
+  "vowelTransition",
+  "~",
+]
+
+music_commands = [
+  "[",
+  "]",
+  "aikenHeads",
+  "aikenHeadsMinor",
+  "aikenThinHeads",
+  "aikenThinHeadsMinor",
+  "allowBreak",
+  "arabicStringNumbers",
+  "arpeggioArrowDown",
+  "arpeggioArrowUp",
+  "arpeggioBracket",
+  "arpeggioNormal",
+  "arpeggioParenthesis",
+  "arpeggioParenthesisDashed",
+  "autoBeamOff",
+  "autoBeamOn",
+  "autoBreaksOff",
+  "autoBreaksOn",
+  "autoLineBreaksOff",
+  "autoLineBreaksOn",
+  "autoPageBreaksOff",
+  "autoPageBreaksOn",
+  "balloonLengthOff",
+  "balloonLengthOn",
+  "bassFigureExtendersOff",
+  "bassFigureExtendersOn",
+  "bassFigureStaffAlignmentDown",
+  "bassFigureStaffAlignmentNeutral",
+  "bassFigureStaffAlignmentUp",
+  "break",
+  "cadenzaOff",
+  "cadenzaOn",
+  "compressEmptyMeasures",
+  "crescHairpin",
+  "crescTextCresc",
+  "deadNotesOff",
+  "deadNotesOn",
+  "defaultNoteHeads",
+  "defaultTimeSignature",
+  "deprecatedcresc",
+  "deprecateddim",
+  "deprecatedendcresc",
+  "deprecatedenddim",
+  "dimHairpin",
+  "dimTextDecr",
+  "dimTextDecresc",
+  "dimTextDim",
+  "dotsDown",
+  "dotsNeutral",
+  "dotsUp",
+  "dynamicDown",
+  "dynamicNeutral",
+  "dynamicUp",
+  "easyHeadsOff",
+  "easyHeadsOn",
+  "endSkipNCs",
+  "expandEmptyMeasures",
+  "fine",
+  "frenchChords",
+  "funkHeads",
+  "funkHeadsMinor",
+  "germanChords",
+  "harmonicsOff",
+  "hideNotes",
+  "hideSplitTiedTabNotes",
+  "hideStaffSwitch",
+  "huge",
+  "ignatzekExceptionMusic",
+  "improvisationOff",
+  "improvisationOn",
+  "italianChords",
+  "kievanOff",
+  "kievanOn",
+  "large",
+  "markLengthOff",
+  "markLengthOn",
+  "medianChordGridStyle",
+  "melisma",
+  "melismaEnd",
+  "mergeDifferentlyDottedOff",
+  "mergeDifferentlyDottedOn",
+  "mergeDifferentlyHeadedOff",
+  "mergeDifferentlyHeadedOn",
+  "newSpacingSection",
+  "noBreak",
+  "normalsize",
+  "numericTimeSignature",
+  "oneVoice",
+  "palmMuteOff",
+  "partCombineApart",
+  "partCombineAutomatic",
+  "partCombineChords",
+  "partCombineSoloI",
+  "partCombineSoloII",
+  "partCombineUnisono",
+  "phrasingSlurDashed",
+  "phrasingSlurDotted",
+  "phrasingSlurDown",
+  "phrasingSlurHalfDashed",
+  "phrasingSlurHalfSolid",
+  "phrasingSlurNeutral",
+  "phrasingSlurSolid",
+  "phrasingSlurUp",
+  "predefinedFretboardsOff",
+  "predefinedFretboardsOn",
+  "romanStringNumbers",
+  "sacredHarpHeads",
+  "sacredHarpHeadsMinor",
+  "section",
+  "semiGermanChords",
+  "setDefaultDurationToQuarter",
+  "shiftOff",
+  "shiftOn",
+  "shiftOnn",
+  "shiftOnnn",
+  "showSplitTiedTabNotes",
+  "showStaffSwitch",
+  "skipNC",
+  "skipNCs",
+  "slurDashed",
+  "slurDotted",
+  "slurDown",
+  "slurHalfDashed",
+  "slurHalfSolid",
+  "slurNeutral",
+  "slurSolid",
+  "slurUp",
+  "small",
+  "southernHarmonyHeads",
+  "southernHarmonyHeadsMinor",
+  "startAcciaccaturaMusic",
+  "startAppoggiaturaMusic",
+  "startGraceMusic",
+  "startMeasureCount",
+  "startMeasureSpanner",
+  "startSlashedGraceMusic",
+  "startStaff",
+  "stemDown",
+  "stemNeutral",
+  "stemUp",
+  "stopAcciaccaturaMusic",
+  "stopAppoggiaturaMusic",
+  "stopGraceMusic",
+  "stopMeasureCount",
+  "stopMeasureSpanner",
+  "stopSlashedGraceMusic",
+  "stopStaff",
+  "stopStaffHighlight",
+  "tabFullNotation",
+  "teeny",
+  "textLengthOff",
+  "textLengthOn",
+  "textSpannerDown",
+  "textSpannerNeutral",
+  "textSpannerUp",
+  "tieDashed",
+  "tieDotted",
+  "tieDown",
+  "tieHalfDashed",
+  "tieHalfSolid",
+  "tieNeutral",
+  "tieSolid",
+  "tieUp",
+  "tiny",
+  "tupletDown",
+  "tupletNeutral",
+  "tupletUp",
+  "unHideNotes",
+  "voiceFour",
+  "voiceFourStyle",
+  "voiceNeutralStyle",
+  "voiceOne",
+  "voiceOneStyle",
+  "voiceThree",
+  "voiceThreeStyle",
+  "voiceTwo",
+  "voiceTwoStyle",
+  "walkerHeads",
+  "walkerHeadsMinor",
+  "xNotesOff",
+  "xNotesOn",
+  "|",
+  "~",
+]
+
+markup_commands = [
+  "abs-fontsize",
+  "accidental",
+  "align-on-other",
+  "arrow-head",
+  "auto-footnote",
+  "backslashed-digit",
+  "beam",
+  "bold",
+  "box",
+  "bracket",
+  "caps",
+  "center-align",
+  "center-column",
+  "char",
+  "circle",
+  "coda",
+  "column",
+  "column-lines",
+  "combine",
+  "compound-meter",
+  "concat",
+  "conditional-trill-markup",
+  "customTabClef",
+  "dir-column",
+  "discant",
+  "doubleflat",
+  "doublesharp",
+  "draw-circle",
+  "draw-dashed-line",
+  "draw-dotted-line",
+  "draw-hline",
+  "draw-line",
+  "draw-squiggle-line",
+  "dynamic",
+  "ellipse",
+  "epsfile",
+  "eyeglasses",
+  "fermata",
+  "figured-bass",
+  "fill-line",
+  "fill-with-pattern",
+  "filled-box",
+  "finger",
+  "first-visible",
+  "flat",
+  "fontCaps",
+  "fontsize",
+  "footnote",
+  "fraction",
+  "freeBass",
+  "fret-diagram",
+  "fret-diagram-terse",
+  "fret-diagram-verbose",
+  "fromproperty",
+  "general-align",
+  "halign",
+  "harp-pedal",
+  "hbracket",
+  "hcenter-in",
+  "hspace",
+  "huge",
+  "if",
+  "italic",
+  "justified-lines",
+  "justify",
+  "justify-field",
+  "justify-line",
+  "justify-string",
+  "large",
+  "larger",
+  "left-align",
+  "left-brace",
+  "left-column",
+  "line",
+  "lookup",
+  "lower",
+  "magnify",
+  "map-markup-commands",
+  "markalphabet",
+  "markletter",
+  "markup",
+  "markuplist",
+  "medium",
+  "multi-measure-rest-by-number",
+  "musicglyph",
+  "natural",
+  "normal-size-sub",
+  "normal-size-super",
+  "normal-text",
+  "normalsize",
+  "note",
+  "note-by-number",
+  "null",
+  "number",
+  "on-the-fly",
+  "oval",
+  "overlay",
+  "override",
+  "override-lines",
+  "overtie",
+  "pad-around",
+  "pad-markup",
+  "pad-to-box",
+  "pad-x",
+  "page-link",
+  "page-ref",
+  "parenthesize",
+  "path",
+  "pattern",
+  "polygon",
+  "postscript",
+  "property-recursive",
+  "put-adjacent",
+  "raise",
+  "replace",
+  "rest",
+  "rest-by-number",
+  "rhythm",
+  "right-align",
+  "right-brace",
+  "right-column",
+  "roman",
+  "rotate",
+  "rounded-box",
+  "sans",
+  "scale",
+  "score",
+  "score-lines",
+  "segno",
+  "semiflat",
+  "semisharp",
+  "sesquiflat",
+  "sesquisharp",
+  "sharp",
+  "simple",
+  "slashed-digit",
+  "small",
+  "smallCaps",
+  "smaller",
+  "stdBass",
+  "stdBassIV",
+  "stdBassV",
+  "stdBassVI",
+  "stencil",
+  "string-lines",
+  "strut",
+  "sub",
+  "super",
+  "table",
+  "table-of-contents",
+  "teeny",
+  "text",
+  "tie",
+  "tied-lyric",
+  "tiny",
+  "translate",
+  "translate-scaled",
+  "transparent",
+  "triangle",
+  "typewriter",
+  "underline",
+  "undertie",
+  "unless",
+  "upright",
+  "varcoda",
+  "vcenter",
+  "verbatim-file",
+  "vspace",
+  "whiteout",
+  "with-color",
+  "with-dimension",
+  "with-dimension-from",
+  "with-dimensions",
+  "with-dimensions-from",
+  "with-link",
+  "with-outline",
+  "with-string-transformer",
+  "with-true-dimension",
+  "with-true-dimensions",
+  "with-url",
+  "woodwind-diagram",
+  "wordwrap",
+  "wordwrap-field",
+  "wordwrap-internal",
+  "wordwrap-lines",
+  "wordwrap-string",
+  "wordwrap-string-internal",
+]
+
+grobs = [
+  "Accidental",
+  "AccidentalCautionary",
+  "AccidentalPlacement",
+  "AccidentalSuggestion",
+  "Ambitus",
+  "AmbitusAccidental",
+  "AmbitusLine",
+  "AmbitusNoteHead",
+  "Arpeggio",
+  "BalloonText",
+  "BarLine",
+  "BarNumber",
+  "BassFigure",
+  "BassFigureAlignment",
+  "BassFigureAlignmentPositioning",
+  "BassFigureBracket",
+  "BassFigureContinuation",
+  "BassFigureLine",
+  "Beam",
+  "BendAfter",
+  "BendSpanner",
+  "BreakAlignGroup",
+  "BreakAlignment",
+  "BreathingSign",
+  "CaesuraScript",
+  "CenteredBarNumber",
+  "CenteredBarNumberLineSpanner",
+  "ChordName",
+  "ChordSquare",
+  "Clef",
+  "ClefModifier",
+  "ClusterSpanner",
+  "ClusterSpannerBeacon",
+  "CodaMark",
+  "CombineTextScript",
+  "ControlPoint",
+  "ControlPolygon",
+  "CueClef",
+  "CueEndClef",
+  "Custos",
+  "Divisio",
+  "DotColumn",
+  "Dots",
+  "DoublePercentRepeat",
+  "DoublePercentRepeatCounter",
+  "DoubleRepeatSlash",
+  "DurationLine",
+  "DynamicLineSpanner",
+  "DynamicText",
+  "DynamicTextSpanner",
+  "Episema",
+  "FingerGlideSpanner",
+  "Fingering",
+  "FingeringColumn",
+  "Flag",
+  "Footnote",
+  "FretBoard",
+  "Glissando",
+  "GraceSpacing",
+  "GridChordName",
+  "GridLine",
+  "GridPoint",
+  "Hairpin",
+  "HorizontalBracket",
+  "HorizontalBracketText",
+  "InstrumentName",
+  "InstrumentSwitch",
+  "JumpScript",
+  "KeyCancellation",
+  "KeySignature",
+  "KievanLigature",
+  "LaissezVibrerTie",
+  "LaissezVibrerTieColumn",
+  "LedgerLineSpanner",
+  "LeftEdge",
+  "LigatureBracket",
+  "LyricExtender",
+  "LyricHyphen",
+  "LyricRepeatCount",
+  "LyricSpace",
+  "LyricText",
+  "MeasureCounter",
+  "MeasureGrouping",
+  "MeasureSpanner",
+  "MelodyItem",
+  "MensuralLigature",
+  "MetronomeMark",
+  "MultiMeasureRest",
+  "MultiMeasureRestNumber",
+  "MultiMeasureRestScript",
+  "MultiMeasureRestText",
+  "NonMusicalPaperColumn",
+  "NoteCollision",
+  "NoteColumn",
+  "NoteHead",
+  "NoteName",
+  "NoteSpacing",
+  "OttavaBracket",
+  "PaperColumn",
+  "Parentheses",
+  "PercentRepeat",
+  "PercentRepeatCounter",
+  "PhrasingSlur",
+  "PianoPedalBracket",
+  "RehearsalMark",
+  "RepeatSlash",
+  "RepeatTie",
+  "RepeatTieColumn",
+  "Rest",
+  "RestCollision",
+  "Script",
+  "ScriptColumn",
+  "ScriptRow",
+  "SectionLabel",
+  "SegnoMark",
+  "SignumRepetitionis",
+  "Slur",
+  "SostenutoPedal",
+  "SostenutoPedalLineSpanner",
+  "SpacingSpanner",
+  "SpanBar",
+  "SpanBarStub",
+  "StaffEllipsis",
+  "StaffGrouper",
+  "StaffHighlight",
+  "StaffSpacing",
+  "StaffSymbol",
+  "StanzaNumber",
+  "Stem",
+  "StemStub",
+  "StemTremolo",
+  "StringNumber",
+  "StrokeFinger",
+  "SustainPedal",
+  "SustainPedalLineSpanner",
+  "System",
+  "SystemStartBar",
+  "SystemStartBrace",
+  "SystemStartBracket",
+  "SystemStartSquare",
+  "TabNoteHead",
+  "TextMark",
+  "TextScript",
+  "TextSpanner",
+  "Tie",
+  "TieColumn",
+  "TimeSignature",
+  "TrillPitchAccidental",
+  "TrillPitchGroup",
+  "TrillPitchHead",
+  "TrillPitchParentheses",
+  "TrillSpanner",
+  "TupletBracket",
+  "TupletNumber",
+  "UnaCordaPedal",
+  "UnaCordaPedalLineSpanner",
+  "VaticanaLigature",
+  "VerticalAlignment",
+  "VerticalAxisGroup",
+  "VoiceFollower",
+  "VoltaBracket",
+  "VoltaBracketSpanner",
+  "VowelTransition",
+]
+
+contexts = [
+  "ChoirStaff",
+  "ChordGrid",
+  "ChordGridScore",
+  "ChordNames",
+  "CueVoice",
+  "Devnull",
+  "DrumStaff",
+  "DrumVoice",
+  "Dynamics",
+  "FiguredBass",
+  "FretBoards",
+  "Global",
+  "GrandStaff",
+  "GregorianTranscriptionLyrics",
+  "GregorianTranscriptionStaff",
+  "GregorianTranscriptionVoice",
+  "InternalGregorianStaff",
+  "KievanStaff",
+  "KievanVoice",
+  "Lyrics",
+  "MensuralStaff",
+  "MensuralVoice",
+  "NoteNames",
+  "NullVoice",
+  "OneStaff",
+  "PetrucciStaff",
+  "PetrucciVoice",
+  "PianoStaff",
+  "RhythmicStaff",
+  "Score",
+  "Staff",
+  "StaffGroup",
+  "StandaloneRhythmScore",
+  "StandaloneRhythmStaff",
+  "StandaloneRhythmVoice",
+  "TabStaff",
+  "TabVoice",
+  "Timing",
+  "VaticanaLyrics",
+  "VaticanaStaff",
+  "VaticanaVoice",
+  "Voice",
+]
+
+translators = [
+  "Accidental_engraver",
+  "Alteration_glyph_engraver",
+  "Ambitus_engraver",
+  "Arpeggio_engraver",
+  "Auto_beam_engraver",
+  "Axis_group_engraver",
+  "Balloon_engraver",
+  "Bar_engraver",
+  "Bar_number_engraver",
+  "Beam_collision_engraver",
+  "Beam_engraver",
+  "Beam_performer",
+  "Beat_engraver",
+  "Beat_performer",
+  "Bend_engraver",
+  "Bend_spanner_engraver",
+  "Break_align_engraver",
+  "Breathing_sign_engraver",
+  "Caesura_engraver",
+  "Centered_bar_number_align_engraver",
+  "Chord_name_engraver",
+  "Chord_square_engraver",
+  "Chord_tremolo_engraver",
+  "Clef_engraver",
+  "Cluster_spanner_engraver",
+  "Collision_engraver",
+  "Completion_heads_engraver",
+  "Completion_rest_engraver",
+  "Concurrent_hairpin_engraver",
+  "Control_track_performer",
+  "Cue_clef_engraver",
+  "Current_chord_text_engraver",
+  "Custos_engraver",
+  "Divisio_engraver",
+  "Dot_column_engraver",
+  "Dots_engraver",
+  "Double_percent_repeat_engraver",
+  "Drum_note_performer",
+  "Drum_notes_engraver",
+  "Duration_line_engraver",
+  "Dynamic_align_engraver",
+  "Dynamic_engraver",
+  "Dynamic_performer",
+  "Episema_engraver",
+  "Extender_engraver",
+  "Figured_bass_engraver",
+  "Figured_bass_position_engraver",
+  "Finger_glide_engraver",
+  "Fingering_column_engraver",
+  "Fingering_engraver",
+  "Font_size_engraver",
+  "Footnote_engraver",
+  "Forbid_line_break_engraver",
+  "Fretboard_engraver",
+  "Glissando_engraver",
+  "Grace_auto_beam_engraver",
+  "Grace_beam_engraver",
+  "Grace_engraver",
+  "Grace_spacing_engraver",
+  "Grid_chord_name_engraver",
+  "Grid_line_span_engraver",
+  "Grid_point_engraver",
+  "Grob_pq_engraver",
+  "Horizontal_bracket_engraver",
+  "Hyphen_engraver",
+  "Instrument_name_engraver",
+  "Instrument_switch_engraver",
+  "Jump_engraver",
+  "Keep_alive_together_engraver",
+  "Key_engraver",
+  "Key_performer",
+  "Kievan_ligature_engraver",
+  "Laissez_vibrer_engraver",
+  "Ledger_line_engraver",
+  "Ligature_bracket_engraver",
+  "Lyric_engraver",
+  "Lyric_performer",
+  "Lyric_repeat_count_engraver",
+  "Mark_engraver",
+  "Mark_performer",
+  "Mark_tracking_translator",
+  "Measure_counter_engraver",
+  "Measure_grouping_engraver",
+  "Measure_spanner_engraver",
+  "Melody_engraver",
+  "Mensural_ligature_engraver",
+  "Merge_mmrest_numbers_engraver",
+  "Merge_rests_engraver",
+  "Metronome_mark_engraver",
+  "Midi_control_change_performer",
+  "Multi_measure_rest_engraver",
+  "New_fingering_engraver",
+  "Non_musical_script_column_engraver",
+  "Note_head_line_engraver",
+  "Note_heads_engraver",
+  "Note_name_engraver",
+  "Note_performer",
+  "Note_spacing_engraver",
+  "Ottava_spanner_engraver",
+  "Output_property_engraver",
+  "Page_turn_engraver",
+  "Paper_column_engraver",
+  "Parenthesis_engraver",
+  "Part_combine_engraver",
+  "Percent_repeat_engraver",
+  "Phrasing_slur_engraver",
+  "Piano_pedal_align_engraver",
+  "Piano_pedal_engraver",
+  "Piano_pedal_performer",
+  "Pitch_squash_engraver",
+  "Pitched_trill_engraver",
+  "Pure_from_neighbor_engraver",
+  "Repeat_acknowledge_engraver",
+  "Repeat_tie_engraver",
+  "Rest_collision_engraver",
+  "Rest_engraver",
+  "Rhythmic_column_engraver",
+  "Script_column_engraver",
+  "Script_engraver",
+  "Script_row_engraver",
+  "Separating_line_group_engraver",
+  "Show_control_points_engraver",
+  "Signum_repetitionis_engraver",
+  "Skip_typesetting_engraver",
+  "Slash_repeat_engraver",
+  "Slur_engraver",
+  "Slur_performer",
+  "Spacing_engraver",
+  "Span_arpeggio_engraver",
+  "Span_bar_engraver",
+  "Span_bar_stub_engraver",
+  "Span_stem_engraver",
+  "Spanner_break_forbid_engraver",
+  "Spanner_tracking_engraver",
+  "Staff_collecting_engraver",
+  "Staff_highlight_engraver",
+  "Staff_performer",
+  "Staff_symbol_engraver",
+  "Stanza_number_align_engraver",
+  "Stanza_number_engraver",
+  "Stem_engraver",
+  "System_start_delimiter_engraver",
+  "Tab_note_heads_engraver",
+  "Tab_staff_symbol_engraver",
+  "Tab_tie_follow_engraver",
+  "Tempo_performer",
+  "Text_engraver",
+  "Text_mark_engraver",
+  "Text_spanner_engraver",
+  "Tie_engraver",
+  "Tie_performer",
+  "Time_signature_engraver",
+  "Time_signature_performer",
+  "Timing_translator",
+  "Trill_spanner_engraver",
+  "Tuplet_engraver",
+  "Tweak_engraver",
+  "Vaticana_ligature_engraver",
+  "Vertical_align_engraver",
+  "Volta_engraver",
+]
+
+scheme_functions = [
+  "!=",
+  "*location*",
+  "*parser*",
+  "Alteration_glyph_engraver",
+  "Beat_performer",
+  "Bend_spanner_engraver",
+  "Breathing_sign_engraver",
+  "Centered_bar_number_align_engraver",
+  "Chord_name_engraver",
+  "Chord_square_engraver",
+  "Current_chord_text_engraver",
+  "Divisio_engraver",
+  "Duration_line_engraver",
+  "Finger_glide_engraver",
+  "G_",
+  "Grid_chord_name_engraver",
+  "Lyric_repeat_count_engraver",
+  "Measure_counter_engraver",
+  "Measure_spanner_engraver",
+  "Merge_mmrest_numbers_engraver",
+  "Merge_rests_engraver",
+  "Show_control_points_engraver",
+  "Signum_repetitionis_engraver",
+  "Skip_typesetting_engraver",
+  "Span_stem_engraver",
+  "Spanner_tracking_engraver",
+  "Staff_highlight_engraver",
+  "Text_mark_engraver",
+  "Trill_spanner_engraver",
+  "_i",
+  "abs-fontsize-markup",
+  "accidental->markup",
+  "accidental->markup-italian",
+  "accidental-interface::calc-alteration",
+  "accidental-interface::calc-glyph-name",
+  "accidental-invalid?",
+  "accidental-markup",
+  "add-bar-glyph-print-procedure",
+  "add-font",
+  "add-grace-property",
+  "add-music",
+  "add-music-fonts",
+  "add-new-clef",
+  "add-pango-fonts",
+  "add-point",
+  "add-quotable",
+  "add-score",
+  "add-simple-time-signature-style",
+  "add-stroke-glyph",
+  "add-stroke-straight",
+  "add-text",
+  "adjust-slash-stencil",
+  "align-on-other-markup",
+  "aligned-text-stencil-function",
+  "alist->hash-table",
+  "alist<?",
+  "alist?",
+  "all-bar-numbers-visible",
+  "all-equal?",
+  "all-repeat-counts-visible",
+  "allow-volta-hook",
+  "alteration->text-accidental-markup",
+  "alterations-in-key",
+  "ambitus-line::calc-gap",
+  "ambitus::print",
+  "analyse-spanner-states",
+  "ancestor-lookup-initialize",
+  "angle-0-2pi",
+  "angle-0-360",
+  "annotate-spacing-spec",
+  "annotate-y-interval",
+  "any-mmrest-events",
+  "apply-durations",
+  "apply-group-draw-rule-series",
+  "arrow-head-markup",
+  "arrow-stencil",
+  "arrow-stencil-maker",
+  "assemble-stencils",
+  "assoc-get",
+  "assoc-keys",
+  "assoc-values",
+  "at-bar-line-substitute-caesura-type",
+  "aug-modifier",
+  "auto-footnote-markup",
+  "average",
+  "b",
+  "backslashed-digit-markup",
+  "bar-line::bar-y-extent",
+  "bar-line::calc-blot",
+  "bar-line::calc-break-visibility",
+  "bar-line::calc-glyph-name",
+  "bar-line::calc-glyph-name-for-direction",
+  "bar-line::compound-bar-line",
+  "bar-line::draw-filled-box",
+  "bar-line::widen-bar-extent-on-span",
+  "base-length",
+  "bass-clarinet-rh-ees-key-stencil",
+  "bassoon-bend-info-maker",
+  "bassoon-cc-six-key-stencil",
+  "bassoon-lh-a-flick-key-stencil",
+  "bassoon-lh-c-flick-key-stencil",
+  "bassoon-lh-cis-key-stencil",
+  "bassoon-lh-d-flick-key-stencil",
+  "bassoon-lh-ees-key-stencil",
+  "bassoon-lh-he-key-stencil",
+  "bassoon-lh-hees-key-stencil",
+  "bassoon-lh-lb-key-stencil",
+  "bassoon-lh-lbes-key-stencil",
+  "bassoon-lh-lc-key-stencil",
+  "bassoon-lh-ld-key-stencil",
+  "bassoon-lh-lhees-key-stencil",
+  "bassoon-lh-thumb-cis-key-stencil",
+  "bassoon-lh-whisper-key-stencil",
+  "bassoon-midline-rule",
+  "bassoon-rh-bes-key-stencil",
+  "bassoon-rh-cis-key-stencil",
+  "bassoon-rh-f-key-stencil",
+  "bassoon-rh-fis-key-stencil",
+  "bassoon-rh-gis-key-stencil",
+  "bassoon-rh-thumb-bes-key-stencil",
+  "bassoon-rh-thumb-e-key-stencil",
+  "bassoon-rh-thumb-fis-key-stencil",
+  "bassoon-rh-thumb-gis-key-stencil",
+  "bassoon-uber-key-stencil",
+  "beam-exceptions",
+  "beam-markup",
+  "beam::align-with-broken-parts",
+  "beam::get-kievan-positions",
+  "beam::get-kievan-quantized-positions",
+  "beam::place-broken-parts-individually",
+  "beam::slope-like-broken-parts",
+  "beat-grouping-internal",
+  "beat-structure",
+  "bend-spanner::print",
+  "bend::arrow-head-stencil",
+  "bend::calc-bend-x-begin",
+  "bend::calc-bend-x-end",
+  "bend::calc-y-coordinates",
+  "bend::draw-curves",
+  "bend::make-line-curve-stencil",
+  "bend::print",
+  "bend::remove-certain-tab-note-heads",
+  "bend::target-cautionary",
+  "bend::text-stencil",
+  "bend::text-string",
+  "bezier-head-for-stencil",
+  "binary-search",
+  "bold-markup",
+  "book-first-page",
+  "boolean-or-number?",
+  "boolean-or-symbol?",
+  "bounding-note-heads-pitches",
+  "box-grob-stencil",
+  "box-markup",
+  "box-stencil",
+  "bracket-markup",
+  "bracketify-stencil",
+  "break-alignable-interface::self-alignment-of-anchor",
+  "break-alignable-interface::self-alignment-opposite-of-anchor",
+  "break-alignment-list",
+  "breathe::midi-length",
+  "buildflag",
+  "cached-file-contents",
+  "caesura-script-interface::before-line-breaking",
+  "caesura-to-bar-line-or-divisio",
+  "caesura-to-divisio",
+  "calc-harmonic-pitch",
+  "calc-line-thickness",
+  "calc-repeat-slash-count",
+  "calculate-complex-compound-time",
+  "calculate-compound-base-beat",
+  "calculate-compound-base-beat-full",
+  "calculate-compound-beat-grouping",
+  "calculate-compound-measure-length",
+  "calculate-time-fraction",
+  "call-after-session",
+  "caps-markup",
+  "car-or-identity",
+  "car<",
+  "car<=",
+  "cdr-or-identity",
+  "center-align-markup",
+  "center-column-markup",
+  "centered-spanner-interface::calc-x-offset",
+  "centered-stencil",
+  "chain-assoc-get",
+  "change-pitches",
+  "char-markup",
+  "cheap-list?",
+  "cheap-markup?",
+  "check-beam-quant",
+  "check-beam-slope-sign",
+  "check-broken-spanner",
+  "check-context-path",
+  "check-division-alist",
+  "check-for-annotation",
+  "check-for-replacement",
+  "check-grob-path",
+  "check-music-path",
+  "check-pitch-against-signature",
+  "check-quant-callbacks",
+  "check-slope-callbacks",
+  "chord-name->german-markup",
+  "chord-name->italian-markup",
+  "chord-square::height",
+  "chord-square::print",
+  "chord-square::width",
+  "circle-markup",
+  "circle-stencil",
+  "clarinet-lh-R-key-stencil",
+  "clarinet-lh-a-key-stencil",
+  "clarinet-lh-cis-key-stencil",
+  "clarinet-lh-d-key-stencil",
+  "clarinet-lh-e-key-stencil",
+  "clarinet-lh-ees-key-stencil",
+  "clarinet-lh-f-key-stencil",
+  "clarinet-lh-fis-key-stencil",
+  "clarinet-lh-gis-key-stencil",
+  "clarinet-lh-thumb-key-stencil",
+  "clarinet-rh-b-key-stencil",
+  "clarinet-rh-d-key-stencil",
+  "clarinet-rh-e-key-stencil",
+  "clarinet-rh-f-key-stencil",
+  "clarinet-rh-fis-key-stencil",
+  "clarinet-rh-four-key-stencil",
+  "clarinet-rh-gis-key-stencil",
+  "clarinet-rh-low-c-key-stencil",
+  "clarinet-rh-low-cis-key-stencil",
+  "clarinet-rh-low-d-key-stencil",
+  "clarinet-rh-one-key-stencil",
+  "clarinet-rh-three-key-stencil",
+  "clarinet-rh-two-key-stencil",
+  "clef-transposition-markup",
+  "clef::print-modern-tab-if-set",
+  "clip-systems-to-region-stencils",
+  "clipped-systems-stencils",
+  "close-enough?",
+  "close-port-rename",
+  "coda-markup",
+  "collect-book-music-for-book",
+  "collect-bookpart-for-book",
+  "collect-music-aux",
+  "collect-music-for-book",
+  "collect-scores-for-book",
+  "color?",
+  "column-circle-stencil",
+  "column-lines-markup-list",
+  "column-markup",
+  "combine-markup",
+  "comparable-note-events",
+  "comparator-from-key",
+  "compile-all-markup-args",
+  "compile-all-markup-expressions",
+  "compile-markup-arg",
+  "compile-markup-expression",
+  "completize-formats",
+  "completize-grob-entry",
+  "compound-meter-markup",
+  "concat-markup",
+  "conditional-kern-before",
+  "conditional-string-capitalize",
+  "conditional-trill-markup-markup",
+  "configuration",
+  "cons-fret",
+  "constante-hairpin",
+  "construct-chord-elements",
+  "context-defs-from-music",
+  "context-mod-from-music",
+  "context-spec-music",
+  "control-point::calc-offset",
+  "control-polygon::calc-text",
+  "coord-axis",
+  "coord-rotate",
+  "coord-rotated",
+  "coord-scale",
+  "coord-translate",
+  "coord-x",
+  "coord-y",
+  "copy-binary-file",
+  "copy-repeat-chord",
+  "count-list",
+  "create-file-exclusive",
+  "create-fretboard",
+  "create-glyph-flag",
+  "cross-staff-connect",
+  "css-color",
+  "cue-substitute",
+  "current-or-previous-voice-states",
+  "customTabClef-markup",
+  "cyclic-base-value",
+  "debugf",
+  "def-grace-function",
+  "default-auto-beam-check",
+  "default-flag",
+  "default-paren-color",
+  "define-bar-line",
+  "define-event-class",
+  "define-event-function",
+  "define-fonts",
+  "define-grob-property",
+  "define-internal-grob-property",
+  "define-markup-command",
+  "define-markup-command-internal",
+  "define-markup-list-command",
+  "define-music-function",
+  "define-scheme-function",
+  "define-session",
+  "define-session-public",
+  "define-syntax-function",
+  "define-syntax-public",
+  "define-syntax-rule-public",
+  "define-tag-group",
+  "define-void-function",
+  "degree-first-true",
+  "degrees->radians",
+  "descend-to-context",
+  "determine-frets",
+  "determine-split-list",
+  "determine-string-fret-finger",
+  "dim-modifier",
+  "dimension-arrows",
+  "dir-basename",
+  "dir-column-markup",
+  "display-lily-music",
+  "display-music",
+  "display-scheme-music",
+  "dodecaphonic-no-repeat-rule",
+  "done?",
+  "dot-column-interface::pad-by-one-dot-width",
+  "dot-has-color",
+  "dot-is-inverted",
+  "dot-is-parenthesized",
+  "dots::calc-dot-count",
+  "dots::calc-dot-stencil",
+  "dots::calc-glyph-name",
+  "dots::calc-staff-position",
+  "doubleflat-markup",
+  "doublesharp-markup",
+  "draw-circle-markup",
+  "draw-dashed-line-markup",
+  "draw-dotted-line-markup",
+  "draw-hline-markup",
+  "draw-line-markup",
+  "draw-squiggle-line-markup",
+  "dump-zombies",
+  "duration",
+  "duration-dot-factor",
+  "duration-length",
+  "duration-line::calc",
+  "duration-line::calc-thickness",
+  "duration-line::print",
+  "duration-log-factor",
+  "duration-of-note",
+  "duration-or-music?",
+  "duration-visual",
+  "duration-visual-length",
+  "dynamic-markup",
+  "dynamic-text-spanner::before-line-breaking",
+  "elbowed-hairpin",
+  "ellipse-markup",
+  "ellipse-radius",
+  "ellipse-stencil",
+  "empty-music",
+  "end-broken-spanner?",
+  "entry-greater-than-x?",
+  "eps-file->stencil",
+  "epsfile-markup",
+  "eval-carefully",
+  "event-cause",
+  "event-chord-notes",
+  "event-chord-pitches",
+  "event-chord-reduce",
+  "event-chord-wrap!",
+  "event-class-cons",
+  "event-has-articulation?",
+  "events",
+  "every-nth-bar-number-visible",
+  "every-nth-repeat-count-visible",
+  "exact-rational?",
+  "expand-repeat-chords!",
+  "expand-repeat-notes!",
+  "extent-combine",
+  "extract-alteration",
+  "extract-beam-exceptions",
+  "extract-music",
+  "extract-named-music",
+  "extract-typed-music",
+  "eyeglasses-markup",
+  "fermata-markup",
+  "figured-bass-markup",
+  "fill-line-markup",
+  "fill-with-pattern-markup",
+  "filled-box-markup",
+  "find-named-props",
+  "find-pitch-entry",
+  "find-value-to-offset",
+  "finger-glide::print",
+  "finger-markup",
+  "fingering::calc-text",
+  "first-assoc",
+  "first-bar-number-invisible",
+  "first-bar-number-invisible-and-no-parenthesized-bar-numbers",
+  "first-bar-number-invisible-save-broken-bars",
+  "first-broken-spanner?",
+  "first-member",
+  "first-visible-markup",
+  "flared-hairpin",
+  "flat-flag",
+  "flat-markup",
+  "flatten-alist",
+  "flatten-list",
+  "flip-stencil",
+  "flute-lh-b-key-stencil",
+  "flute-lh-bes-key-stencil",
+  "flute-lh-gis-key-stencil",
+  "flute-lh-gis-rh-bes-key-stencil",
+  "flute-rh-b-key-stencil",
+  "flute-rh-bes-key-stencil",
+  "flute-rh-c-key-stencil",
+  "flute-rh-cis-key-stencil",
+  "flute-rh-d-key-stencil",
+  "flute-rh-dis-key-stencil",
+  "flute-rh-ees-key-stencil",
+  "flute-rh-gz-key-stencil",
+  "fold-some-music",
+  "font-children",
+  "font-default",
+  "font-name-split",
+  "font-name-style",
+  "font-qualifier",
+  "fontCaps-markup",
+  "fontsize-markup",
+  "footnote-markup",
+  "for-some-music",
+  "forced-configuration",
+  "format",
+  "format-bass-figure",
+  "format-coda-mark",
+  "format-compound-time",
+  "format-dal-segno-text",
+  "format-dal-segno-text-brief",
+  "format-mark-alphabet",
+  "format-mark-barnumbers",
+  "format-mark-box-alphabet",
+  "format-mark-box-barnumbers",
+  "format-mark-box-letters",
+  "format-mark-box-numbers",
+  "format-mark-circle-alphabet",
+  "format-mark-circle-barnumbers",
+  "format-mark-circle-letters",
+  "format-mark-circle-numbers",
+  "format-mark-generic",
+  "format-mark-letters",
+  "format-mark-numbers",
+  "format-metronome-markup",
+  "format-segno-mark",
+  "format-segno-mark-considering-bar-lines",
+  "format-sign-with-number",
+  "format-time-element",
+  "format-time-fraction",
+  "format-time-list",
+  "format-time-numerator",
+  "format-varcoda-mark",
+  "fraction->moment",
+  "fraction-markup",
+  "fraction?",
+  "fret->pitch",
+  "fret-board::calc-stencil",
+  "fret-count",
+  "fret-diagram-markup",
+  "fret-diagram-terse-markup",
+  "fret-diagram-verbose-markup",
+  "fret-letter-tablature-format",
+  "fret-number-tablature-format",
+  "fret-number-tablature-format-banjo",
+  "fret-parse-definition-string",
+  "fret-parse-marking-list",
+  "fret-parse-terse-definition-string",
+  "fromproperty-markup",
+  "function-chain",
+  "g",
+  "g-lookup-font",
+  "general-align-markup",
+  "general-column",
+  "generate-bassoon-family-entry",
+  "generate-clarinet-family-entry",
+  "generate-crop-stencil",
+  "generate-flute-family-entry",
+  "generate-oboe-family-entry",
+  "generate-preview-stencil",
+  "generate-saxophone-family-entry",
+  "generate-system-stencils",
+  "generate-tin-whistle-family-entry",
+  "get-bound-note-heads",
+  "get-chord-shape",
+  "get-current-filename",
+  "get-current-suffix",
+  "get-fill-space",
+  "get-key",
+  "get-named-spreadsheet-column",
+  "get-next-unique-voice-name",
+  "get-numeric-from-key",
+  "get-outfile-name",
+  "get-postscript-bbox",
+  "get-quarter-diffs",
+  "get-setting",
+  "get-slope-offset",
+  "get-span-glyph",
+  "get-spreadsheet-column",
+  "get-step",
+  "get-sub-list",
+  "get-top-most-tab-head",
+  "get-tweakable-music",
+  "get-woodwind-key-list",
+  "glissando::calc-tab-extra-dy",
+  "glissando::draw-tab-glissando",
+  "glyph->stencil",
+  "glyph-flag",
+  "grace-spacing::calc-shortest-duration",
+  "gray-colorize",
+  "grid-chord-name::calc-X-offset",
+  "grid-chord-name::calc-Y-offset",
+  "grid-chord-name::calc-offset-on-axis",
+  "grob-interpret-markup",
+  "grob-list?",
+  "grob-transformer",
+  "grob::all-objects",
+  "grob::calc-property-by-copy",
+  "grob::compose-function",
+  "grob::display-objects",
+  "grob::has-interface",
+  "grob::inherit-parent-property",
+  "grob::is-live?",
+  "grob::name",
+  "grob::objects-from-interface",
+  "grob::offset-function",
+  "grob::relay-other-property",
+  "grob::rhythmic-location",
+  "grob::show-skylines-if-debug-skylines-set",
+  "grob::unpure-Y-extent-from-stencil",
+  "grob::when",
+  "group-automate-rule",
+  "group-draw-rule",
+  "group-extra-offset-rule",
+  "gs-cmd-args",
+  "gs-safe-run",
+  "hairpin::calc-grow-direction",
+  "halign-markup",
+  "harp-pedal-check",
+  "harp-pedal-info",
+  "harp-pedal-markup",
+  "harp-pedals-parse-string",
+  "has-at-least-two?",
+  "has-one-or-less?",
+  "hash-table->alist",
+  "hbracket-markup",
+  "hcenter-in-markup",
+  "header-to-file",
+  "headers-property-alist-chain",
+  "hook-stencil",
+  "horizontal-slash-interval",
+  "hspace-markup",
+  "huge-markup",
+  "if-markup",
+  "ignatzek-chord-names",
+  "index-cell",
+  "index-or-markup?",
+  "index?",
+  "insert-markups",
+  "internal-set-paper-size",
+  "interpret-markup",
+  "interpret-markup-list",
+  "interval-bound",
+  "interval-center",
+  "interval-contains?",
+  "interval-empty?",
+  "interval-end",
+  "interval-index",
+  "interval-intersection",
+  "interval-length",
+  "interval-sane?",
+  "interval-scale",
+  "interval-start",
+  "interval-union",
+  "interval-widen",
+  "invalidate-alterations",
+  "inverter-factory",
+  "is-absolute?",
+  "is-square?",
+  "italic-markup",
+  "item::extra-spacing-height-including-staff",
+  "justified-lines-markup-list",
+  "justify-field-markup",
+  "justify-line-helper",
+  "justify-line-markup",
+  "justify-markup",
+  "justify-string-markup",
+  "key-crawler",
+  "key-entry-alteration",
+  "key-entry-bar-number",
+  "key-entry-end-mom",
+  "key-entry-notename",
+  "key-entry-octave",
+  "key-fill-translate",
+  "key-list-or-music?",
+  "key-list-or-symbol?",
+  "key-list?",
+  "key-signature-interface::alteration-position",
+  "key-signature-interface::alteration-positions",
+  "key?",
+  "keyword->make-markup",
+  "large-markup",
+  "larger-markup",
+  "layout-blot-diameter",
+  "layout-extract-page-properties",
+  "layout-line-thickness",
+  "layout-set-absolute-staff-size",
+  "layout-set-absolute-staff-size-in-module",
+  "layout-set-staff-size",
+  "left-align-markup",
+  "left-brace-markup",
+  "left-column-markup",
+  "lexicographic-list-compare?",
+  "lh-woodwind-text-stencil",
+  "lilypond-all",
+  "lilypond-file",
+  "lilypond-main",
+  "lilypond-version",
+  "lilypond-version-outdated?",
+  "line-markup",
+  "list-all-possible-keys",
+  "list-all-possible-keys-verbose",
+  "list-element-index",
+  "list-insert-separator",
+  "list-join",
+  "listener->once-listener",
+  "little-elliptical-key-stencil",
+  "long-midline-stencil",
+  "lookup-font",
+  "lookup-markup",
+  "lookup-markup-command",
+  "lookup-markup-command-aux",
+  "lookup-markup-list-command",
+  "lookup-paper-name",
+  "low-bass-clarinet-rh-ees-key-stencil",
+  "lower-markup",
+  "ly-getcwd",
+  "ly-type?",
+  "ly:accidental-interface::height",
+  "ly:accidental-interface::horizontal-skylines",
+  "ly:accidental-interface::print",
+  "ly:accidental-interface::remove-tied",
+  "ly:accidental-placement::calc-positioning-done",
+  "ly:add-context-mod",
+  "ly:add-interface",
+  "ly:add-listener",
+  "ly:add-option",
+  "ly:align-interface::align-to-ideal-distances",
+  "ly:align-interface::align-to-minimum-distances",
+  "ly:all-grob-interfaces",
+  "ly:all-options",
+  "ly:all-output-backend-commands",
+  "ly:all-stencil-commands",
+  "ly:all-stencil-expressions",
+  "ly:alternative-sequence-iterator::constructor",
+  "ly:angle",
+  "ly:apply-context-iterator::constructor",
+  "ly:arpeggio::brew-chord-bracket",
+  "ly:arpeggio::brew-chord-slur",
+  "ly:arpeggio::calc-cross-staff",
+  "ly:arpeggio::calc-positions",
+  "ly:arpeggio::print",
+  "ly:arpeggio::pure-height",
+  "ly:arpeggio::width",
+  "ly:assoc-get",
+  "ly:axis-group-interface::add-element",
+  "ly:axis-group-interface::adjacent-pure-heights",
+  "ly:axis-group-interface::calc-pure-relevant-grobs",
+  "ly:axis-group-interface::calc-pure-staff-staff-spacing",
+  "ly:axis-group-interface::calc-pure-y-common",
+  "ly:axis-group-interface::calc-skylines",
+  "ly:axis-group-interface::calc-staff-staff-spacing",
+  "ly:axis-group-interface::calc-x-common",
+  "ly:axis-group-interface::calc-y-common",
+  "ly:axis-group-interface::combine-skylines",
+  "ly:axis-group-interface::height",
+  "ly:axis-group-interface::pure-height",
+  "ly:axis-group-interface::width",
+  "ly:balloon-interface::print",
+  "ly:balloon-interface::pure-height",
+  "ly:balloon-interface::remove-irrelevant-spanner",
+  "ly:balloon-interface::width",
+  "ly:bar-check-iterator::constructor",
+  "ly:bar-line::calc-anchor",
+  "ly:bar-line::calc-bar-extent",
+  "ly:bar-line::print",
+  "ly:basic-progress",
+  "ly:beam::calc-beam-segments",
+  "ly:beam::calc-beaming",
+  "ly:beam::calc-cross-staff",
+  "ly:beam::calc-direction",
+  "ly:beam::calc-normal-stems",
+  "ly:beam::calc-stem-shorten",
+  "ly:beam::calc-x-positions",
+  "ly:beam::print",
+  "ly:beam::pure-rest-collision-callback",
+  "ly:beam::quanting",
+  "ly:beam::rest-collision-callback",
+  "ly:beam::set-stem-lengths",
+  "ly:bezier-extent",
+  "ly:bezier-extract",
+  "ly:book-add-bookpart!",
+  "ly:book-add-score!",
+  "ly:book-book-parts",
+  "ly:book-header",
+  "ly:book-paper",
+  "ly:book-process",
+  "ly:book-process-to-systems",
+  "ly:book-scores",
+  "ly:book-set-header!",
+  "ly:book?",
+  "ly:bp",
+  "ly:bracket",
+  "ly:break-alignable-interface::find-parent",
+  "ly:break-alignable-interface::self-align-callback",
+  "ly:break-aligned-interface::calc-average-anchor",
+  "ly:break-aligned-interface::calc-break-visibility",
+  "ly:break-aligned-interface::calc-extent-aligned-anchor",
+  "ly:break-aligned-interface::calc-joint-anchor-alignment",
+  "ly:break-alignment-interface::calc-positioning-done",
+  "ly:break-alignment-interface::find-nonempty-break-align-group",
+  "ly:breathing-sign::divisio-maior",
+  "ly:breathing-sign::divisio-maxima",
+  "ly:breathing-sign::divisio-minima",
+  "ly:breathing-sign::finalis",
+  "ly:breathing-sign::offset-callback",
+  "ly:breathing-sign::set-breath-properties",
+  "ly:broadcast",
+  "ly:cairo-output-stencil",
+  "ly:cairo-output-stencils",
+  "ly:calculated-sequential-music::length",
+  "ly:calculated-sequential-music::start",
+  "ly:camel-case->lisp-identifier",
+  "ly:chain-assoc-get",
+  "ly:change-iterator::constructor",
+  "ly:check-expected-warnings",
+  "ly:chord-name::after-line-breaking",
+  "ly:clef-modifier::calc-parent-alignment",
+  "ly:clef::calc-glyph-name",
+  "ly:clef::print",
+  "ly:cluster-beacon::height",
+  "ly:cluster::calc-cross-staff",
+  "ly:cluster::print",
+  "ly:cm",
+  "ly:command-line-code",
+  "ly:command-line-options",
+  "ly:connect-dispatchers",
+  "ly:context-current-moment",
+  "ly:context-def-lookup",
+  "ly:context-def-modify",
+  "ly:context-def?",
+  "ly:context-event-source",
+  "ly:context-events-below",
+  "ly:context-find",
+  "ly:context-grob-definition",
+  "ly:context-id",
+  "ly:context-matched-pop-property",
+  "ly:context-mod-apply!",
+  "ly:context-mod?",
+  "ly:context-name",
+  "ly:context-output-def",
+  "ly:context-parent",
+  "ly:context-property",
+  "ly:context-property-where-defined",
+  "ly:context-pushpop-property",
+  "ly:context-set-property!",
+  "ly:context-specced-music-iterator::constructor",
+  "ly:context-unset-property",
+  "ly:context?",
+  "ly:custos::print",
+  "ly:debug",
+  "ly:default-scale",
+  "ly:dimension?",
+  "ly:dir?",
+  "ly:directed",
+  "ly:disconnect-dispatchers",
+  "ly:dispatcher?",
+  "ly:dot-column::calc-positioning-done",
+  "ly:dots::print",
+  "ly:duration->string",
+  "ly:duration-compress",
+  "ly:duration-dot-count",
+  "ly:duration-factor",
+  "ly:duration-length",
+  "ly:duration-log",
+  "ly:duration-scale",
+  "ly:duration::less?",
+  "ly:duration<?",
+  "ly:duration?",
+  "ly:effective-prefix",
+  "ly:enclosing-bracket::print",
+  "ly:enclosing-bracket::width",
+  "ly:engraver-announce-end-grob",
+  "ly:engraver-make-grob",
+  "ly:engraver-make-item",
+  "ly:engraver-make-spanner",
+  "ly:engraver-make-sticky",
+  "ly:error",
+  "ly:event-chord-iterator::constructor",
+  "ly:event-deep-copy",
+  "ly:event-iterator::constructor",
+  "ly:event-property",
+  "ly:event-set-property!",
+  "ly:event-warning",
+  "ly:event?",
+  "ly:exit",
+  "ly:expect-warning",
+  "ly:extract-subfont-from-collection",
+  "ly:figured-bass-continuation::center-on-figures",
+  "ly:figured-bass-continuation::print",
+  "ly:find-file",
+  "ly:fine-iterator::constructor",
+  "ly:fingering-column::calc-positioning-done",
+  "ly:flag::calc-x-offset",
+  "ly:flag::calc-y-offset",
+  "ly:flag::glyph-name",
+  "ly:flag::print",
+  "ly:flag::pure-calc-y-offset",
+  "ly:flag::width",
+  "ly:font-config-add-directory",
+  "ly:font-config-add-font",
+  "ly:font-config-display-fonts",
+  "ly:font-config-get-font-file",
+  "ly:font-design-size",
+  "ly:font-file-name",
+  "ly:font-get-glyph",
+  "ly:font-glyph-name-to-charcode",
+  "ly:font-glyph-name-to-index",
+  "ly:font-index-to-charcode",
+  "ly:font-magnification",
+  "ly:font-metric?",
+  "ly:font-name",
+  "ly:font-sub-fonts",
+  "ly:format",
+  "ly:format-output",
+  "ly:generic-bound-extent",
+  "ly:get-all-function-documentation",
+  "ly:get-all-translators",
+  "ly:get-cff-offset",
+  "ly:get-context-mods",
+  "ly:get-font-format",
+  "ly:get-option",
+  "ly:get-spacing-spec",
+  "ly:grace-iterator::constructor",
+  "ly:grace-music::start-callback",
+  "ly:grid-line-interface::print",
+  "ly:grid-line-interface::width",
+  "ly:grob-alist-chain",
+  "ly:grob-array->list",
+  "ly:grob-array-length",
+  "ly:grob-array-ref",
+  "ly:grob-array?",
+  "ly:grob-basic-properties",
+  "ly:grob-chain-callback",
+  "ly:grob-common-refpoint",
+  "ly:grob-common-refpoint-of-array",
+  "ly:grob-default-font",
+  "ly:grob-extent",
+  "ly:grob-get-vertical-axis-group-index",
+  "ly:grob-interfaces",
+  "ly:grob-layout",
+  "ly:grob-list->grob-array",
+  "ly:grob-object",
+  "ly:grob-original",
+  "ly:grob-parent",
+  "ly:grob-pq<?",
+  "ly:grob-properties?",
+  "ly:grob-property",
+  "ly:grob-property-data",
+  "ly:grob-pure-height",
+  "ly:grob-pure-property",
+  "ly:grob-relative-coordinate",
+  "ly:grob-robust-relative-extent",
+  "ly:grob-script-priority-less",
+  "ly:grob-set-nested-property!",
+  "ly:grob-set-object!",
+  "ly:grob-set-parent!",
+  "ly:grob-set-property!",
+  "ly:grob-spanned-column-rank-interval",
+  "ly:grob-staff-position",
+  "ly:grob-suicide!",
+  "ly:grob-system",
+  "ly:grob-translate-axis!",
+  "ly:grob-vertical<?",
+  "ly:grob-warning",
+  "ly:grob::horizontal-skylines-from-element-stencils",
+  "ly:grob::horizontal-skylines-from-stencil",
+  "ly:grob::pure-horizontal-skylines-from-element-stencils",
+  "ly:grob::pure-simple-horizontal-skylines-from-extents",
+  "ly:grob::pure-simple-vertical-skylines-from-extents",
+  "ly:grob::pure-stencil-height",
+  "ly:grob::pure-vertical-skylines-from-element-stencils",
+  "ly:grob::simple-horizontal-skylines-from-extents",
+  "ly:grob::simple-vertical-skylines-from-extents",
+  "ly:grob::stencil-height",
+  "ly:grob::stencil-width",
+  "ly:grob::vertical-skylines-from-element-stencils",
+  "ly:grob::vertical-skylines-from-stencil",
+  "ly:grob::x-parent-positioning",
+  "ly:grob::y-parent-positioning",
+  "ly:grob?",
+  "ly:gs-cli",
+  "ly:gulp-file",
+  "ly:gulp-file-utf8",
+  "ly:hairpin::broken-bound-padding",
+  "ly:hairpin::print",
+  "ly:hairpin::pure-height",
+  "ly:hara-kiri-group-spanner::calc-skylines",
+  "ly:hara-kiri-group-spanner::force-hara-kiri-callback",
+  "ly:hara-kiri-group-spanner::force-hara-kiri-in-y-parent-callback",
+  "ly:hara-kiri-group-spanner::pure-height",
+  "ly:hara-kiri-group-spanner::y-extent",
+  "ly:has-glyph-names?",
+  "ly:hash-table-keys",
+  "ly:horizontal-bracket-text::calc-direction",
+  "ly:horizontal-bracket-text::print",
+  "ly:horizontal-bracket::print",
+  "ly:horizontal-line-spanner::calc-left-bound-info",
+  "ly:horizontal-line-spanner::calc-left-bound-info-and-text",
+  "ly:horizontal-line-spanner::calc-right-bound-info",
+  "ly:in-event-class?",
+  "ly:inch",
+  "ly:input-both-locations",
+  "ly:input-file-line-char-column",
+  "ly:input-location?",
+  "ly:input-message",
+  "ly:input-warning",
+  "ly:interpret-music-expression",
+  "ly:intlog2",
+  "ly:item-break-dir",
+  "ly:item-get-column",
+  "ly:item?",
+  "ly:iterator?",
+  "ly:key-signature-interface::print",
+  "ly:kievan-ligature::print",
+  "ly:ledger-line-spanner::print",
+  "ly:ledger-line-spanner::set-spacing-rods",
+  "ly:length",
+  "ly:lily-lexer?",
+  "ly:lily-parser?",
+  "ly:line-interface::line",
+  "ly:line-spanner::calc-cross-staff",
+  "ly:line-spanner::calc-left-bound-info",
+  "ly:line-spanner::calc-left-bound-info-and-text",
+  "ly:line-spanner::calc-right-bound-info",
+  "ly:line-spanner::print",
+  "ly:list->offsets",
+  "ly:listened-event-class?",
+  "ly:listened-event-types",
+  "ly:listener?",
+  "ly:load",
+  "ly:lyric-combine-music-iterator::constructor",
+  "ly:lyric-combine-music::length-callback",
+  "ly:lyric-extender::print",
+  "ly:lyric-hyphen::print",
+  "ly:lyric-hyphen::set-spacing-rods",
+  "ly:make-book",
+  "ly:make-book-part",
+  "ly:make-context-mod",
+  "ly:make-dispatcher",
+  "ly:make-duration",
+  "ly:make-event-class",
+  "ly:make-global-context",
+  "ly:make-global-translator",
+  "ly:make-grob-properties",
+  "ly:make-listener",
+  "ly:make-moment",
+  "ly:make-music",
+  "ly:make-music-function",
+  "ly:make-music-relative!",
+  "ly:make-output-def",
+  "ly:make-page-label-marker",
+  "ly:make-page-permission-marker",
+  "ly:make-pango-description-string",
+  "ly:make-paper-outputter",
+  "ly:make-pitch",
+  "ly:make-prob",
+  "ly:make-rotation",
+  "ly:make-scale",
+  "ly:make-scaling",
+  "ly:make-score",
+  "ly:make-skyline",
+  "ly:make-spring",
+  "ly:make-stencil",
+  "ly:make-stream-event",
+  "ly:make-transform",
+  "ly:make-translation",
+  "ly:make-unpure-pure-container",
+  "ly:measure-grouping::print",
+  "ly:measure-spanner::calc-connect-to-neighbors",
+  "ly:measure-spanner::print",
+  "ly:melody-spanner::calc-neutral-stem-direction",
+  "ly:mensural-ligature::brew-ligature-primitive",
+  "ly:mensural-ligature::print",
+  "ly:message",
+  "ly:minimal-breaking",
+  "ly:mm",
+  "ly:module->alist",
+  "ly:module-copy",
+  "ly:modules-lookup",
+  "ly:moment-add",
+  "ly:moment-div",
+  "ly:moment-grace",
+  "ly:moment-grace-denominator",
+  "ly:moment-grace-numerator",
+  "ly:moment-main",
+  "ly:moment-main-denominator",
+  "ly:moment-main-numerator",
+  "ly:moment-mod",
+  "ly:moment-mul",
+  "ly:moment-sub",
+  "ly:moment<?",
+  "ly:moment?",
+  "ly:multi-measure-rest::height",
+  "ly:multi-measure-rest::print",
+  "ly:multi-measure-rest::set-spacing-rods",
+  "ly:multi-measure-rest::set-text-rods",
+  "ly:music-compress",
+  "ly:music-deep-copy",
+  "ly:music-duration-compress",
+  "ly:music-duration-length",
+  "ly:music-error",
+  "ly:music-function-extract",
+  "ly:music-function-signature",
+  "ly:music-function?",
+  "ly:music-iterator::constructor",
+  "ly:music-length",
+  "ly:music-list?",
+  "ly:music-message",
+  "ly:music-mutable-properties",
+  "ly:music-output?",
+  "ly:music-property",
+  "ly:music-sequence::cumulative-length-callback",
+  "ly:music-sequence::event-chord-length-callback",
+  "ly:music-sequence::event-chord-relative-callback",
+  "ly:music-sequence::first-start-callback",
+  "ly:music-sequence::maximum-length-callback",
+  "ly:music-sequence::minimum-start-callback",
+  "ly:music-sequence::simultaneous-relative-callback",
+  "ly:music-set-property!",
+  "ly:music-start",
+  "ly:music-transpose",
+  "ly:music-warning",
+  "ly:music-wrapper-iterator::constructor",
+  "ly:music-wrapper::length-callback",
+  "ly:music-wrapper::start-callback",
+  "ly:music::duration-length-callback",
+  "ly:music?",
+  "ly:non-fatal-error",
+  "ly:note-collision-interface::calc-positioning-done",
+  "ly:note-column-accidentals",
+  "ly:note-column-dot-column",
+  "ly:note-column::calc-main-extent",
+  "ly:note-extra-source-file",
+  "ly:note-head::calc-stem-attachment",
+  "ly:note-head::calc-tab-stem-attachment",
+  "ly:note-head::include-ledger-line-height",
+  "ly:note-head::print",
+  "ly:note-head::stem-attachment",
+  "ly:note-head::stem-x-shift",
+  "ly:number->string",
+  "ly:number-pair->string",
+  "ly:one-line-auto-height-breaking",
+  "ly:one-line-breaking",
+  "ly:one-page-breaking",
+  "ly:optimal-breaking",
+  "ly:option-usage",
+  "ly:otf->cff",
+  "ly:otf-font-glyph-info",
+  "ly:otf-font-table-data",
+  "ly:otf-font?",
+  "ly:otf-glyph-count",
+  "ly:otf-glyph-list",
+  "ly:ottava-bracket::print",
+  "ly:output-def-clone",
+  "ly:output-def-lookup",
+  "ly:output-def-parent",
+  "ly:output-def-scope",
+  "ly:output-def-set-variable!",
+  "ly:output-def?",
+  "ly:output-description",
+  "ly:output-find-context-def",
+  "ly:outputter-close",
+  "ly:outputter-dump-stencil",
+  "ly:outputter-dump-string",
+  "ly:outputter-output-scheme",
+  "ly:outputter-port",
+  "ly:page-marker?",
+  "ly:page-turn-breaking",
+  "ly:pango-font-physical-fonts",
+  "ly:pango-font?",
+  "ly:paper-book-header",
+  "ly:paper-book-pages",
+  "ly:paper-book-paper",
+  "ly:paper-book-performances",
+  "ly:paper-book-scopes",
+  "ly:paper-book-systems",
+  "ly:paper-book?",
+  "ly:paper-column::break-align-width",
+  "ly:paper-column::print",
+  "ly:paper-fonts",
+  "ly:paper-get-font",
+  "ly:paper-get-number",
+  "ly:paper-outputscale",
+  "ly:paper-score-paper-systems",
+  "ly:paper-system-minimum-distance",
+  "ly:paper-system?",
+  "ly:parse-file",
+  "ly:parse-init",
+  "ly:parse-string-expression",
+  "ly:parsed-undead-list!",
+  "ly:parser-clear-error",
+  "ly:parser-clone",
+  "ly:parser-define!",
+  "ly:parser-error",
+  "ly:parser-has-error?",
+  "ly:parser-include-string",
+  "ly:parser-lookup",
+  "ly:parser-output-name",
+  "ly:parser-parse-string",
+  "ly:parser-set-note-names",
+  "ly:part-combine-iterator::constructor",
+  "ly:partial-iterator::constructor",
+  "ly:partial-iterator::finalization",
+  "ly:percent-repeat-interface::beat-slash",
+  "ly:percent-repeat-interface::double-percent",
+  "ly:percent-repeat-interface::percent",
+  "ly:percent-repeat-iterator::constructor",
+  "ly:perform-text-replacements",
+  "ly:performance-headers",
+  "ly:performance-write",
+  "ly:piano-pedal-bracket::print",
+  "ly:pitch-alteration",
+  "ly:pitch-diff",
+  "ly:pitch-negate",
+  "ly:pitch-notename",
+  "ly:pitch-octave",
+  "ly:pitch-quartertones",
+  "ly:pitch-semitones",
+  "ly:pitch-steps",
+  "ly:pitch-tones",
+  "ly:pitch-transpose",
+  "ly:pitch::less?",
+  "ly:pitch<?",
+  "ly:pitch?",
+  "ly:pointer-group-interface::add-grob",
+  "ly:pop-property-iterator::constructor",
+  "ly:position-on-line?",
+  "ly:prob-immutable-properties",
+  "ly:prob-mutable-properties",
+  "ly:prob-property",
+  "ly:prob-property?",
+  "ly:prob-set-property!",
+  "ly:prob-type?",
+  "ly:prob?",
+  "ly:programming-error",
+  "ly:progress",
+  "ly:property-iterator::constructor",
+  "ly:property-lookup-stats",
+  "ly:property-unset-iterator::constructor",
+  "ly:pt",
+  "ly:pure-call",
+  "ly:pure-from-neighbor-interface::calc-pure-relevant-grobs",
+  "ly:push-property-iterator::constructor",
+  "ly:quote-iterator::constructor",
+  "ly:randomize-rand-seed",
+  "ly:register-stencil-expression",
+  "ly:register-translator",
+  "ly:relative-group-extent",
+  "ly:relative-octave-check::relative-callback",
+  "ly:relative-octave-music::no-relative-callback",
+  "ly:relative-octave-music::relative-callback",
+  "ly:rename-file",
+  "ly:reset-all-fonts",
+  "ly:rest-collision::calc-positioning-done",
+  "ly:rest-collision::force-shift-callback-rest",
+  "ly:rest::calc-cross-staff",
+  "ly:rest::height",
+  "ly:rest::print",
+  "ly:rest::pure-height",
+  "ly:rest::width",
+  "ly:rest::y-offset-callback",
+  "ly:rhythmic-music-iterator::constructor",
+  "ly:round-filled-box",
+  "ly:round-polygon",
+  "ly:run-translator",
+  "ly:score-add-output-def!",
+  "ly:score-embedded-format",
+  "ly:score-error?",
+  "ly:score-header",
+  "ly:score-music",
+  "ly:score-output-defs",
+  "ly:score-set-header!",
+  "ly:score?",
+  "ly:script-column::before-line-breaking",
+  "ly:script-column::row-before-line-breaking",
+  "ly:script-interface::calc-cross-staff",
+  "ly:script-interface::calc-direction",
+  "ly:script-interface::calc-positioning-done",
+  "ly:script-interface::print",
+  "ly:self-alignment-interface::aligned-on-x-parent",
+  "ly:self-alignment-interface::aligned-on-y-parent",
+  "ly:self-alignment-interface::centered-on-x-parent",
+  "ly:self-alignment-interface::centered-on-y-parent",
+  "ly:self-alignment-interface::pure-y-aligned-on-self",
+  "ly:self-alignment-interface::x-aligned-on-self",
+  "ly:self-alignment-interface::y-aligned-on-self",
+  "ly:semi-tie-column::calc-head-direction",
+  "ly:semi-tie-column::calc-positioning-done",
+  "ly:semi-tie::calc-control-points",
+  "ly:separation-item::calc-skylines",
+  "ly:sequential-iterator::constructor",
+  "ly:set-color-names",
+  "ly:set-default-scale",
+  "ly:set-grob-creation-callback",
+  "ly:set-grob-modification-callback",
+  "ly:set-middle-C!",
+  "ly:set-option",
+  "ly:set-origin!",
+  "ly:set-property-cache-callback",
+  "ly:side-position-interface::calc-cross-staff",
+  "ly:side-position-interface::move-to-extremal-staff",
+  "ly:side-position-interface::pure-y-aligned-side",
+  "ly:side-position-interface::set-axis!",
+  "ly:side-position-interface::x-aligned-side",
+  "ly:side-position-interface::y-aligned-side",
+  "ly:simple-music-iterator::constructor",
+  "ly:simultaneous-music-iterator::constructor",
+  "ly:skyline->points",
+  "ly:skyline-distance",
+  "ly:skyline-empty?",
+  "ly:skyline-height",
+  "ly:skyline-max-height",
+  "ly:skyline-max-height-position",
+  "ly:skyline-merge",
+  "ly:skyline-pad",
+  "ly:skyline-pair?",
+  "ly:skyline-touching-point",
+  "ly:skyline?",
+  "ly:skylines-for-stencil",
+  "ly:slur::calc-control-points",
+  "ly:slur::calc-cross-staff",
+  "ly:slur::calc-direction",
+  "ly:slur::height",
+  "ly:slur::outside-slur-callback",
+  "ly:slur::outside-slur-cross-staff",
+  "ly:slur::print",
+  "ly:slur::pure-height",
+  "ly:slur::pure-outside-slur-callback",
+  "ly:smob-protects",
+  "ly:solve-spring-rod-problem",
+  "ly:source-file?",
+  "ly:source-files",
+  "ly:spacing-spanner::calc-common-shortest-duration",
+  "ly:spacing-spanner::set-springs",
+  "ly:span-bar::before-line-breaking",
+  "ly:span-bar::calc-anchor",
+  "ly:span-bar::calc-glyph-name",
+  "ly:span-bar::choose-model-bar-line",
+  "ly:span-bar::print",
+  "ly:span-bar::width",
+  "ly:spanner-bound",
+  "ly:spanner-broken-into",
+  "ly:spanner-set-bound!",
+  "ly:spanner::bounds-width",
+  "ly:spanner::calc-normalized-endpoints",
+  "ly:spanner::kill-zero-spanned-time",
+  "ly:spanner::set-spacing-rods",
+  "ly:spanner?",
+  "ly:spawn",
+  "ly:spring-set-inverse-compress-strength!",
+  "ly:spring-set-inverse-stretch-strength!",
+  "ly:spring?",
+  "ly:staff-symbol-line-thickness",
+  "ly:staff-symbol-referencer::callback",
+  "ly:staff-symbol-staff-radius",
+  "ly:staff-symbol-staff-space",
+  "ly:staff-symbol::height",
+  "ly:staff-symbol::print",
+  "ly:stderr-redirect",
+  "ly:stem-tremolo::calc-cross-staff",
+  "ly:stem-tremolo::calc-direction",
+  "ly:stem-tremolo::calc-shape",
+  "ly:stem-tremolo::calc-slope",
+  "ly:stem-tremolo::calc-width",
+  "ly:stem-tremolo::calc-y-offset",
+  "ly:stem-tremolo::print",
+  "ly:stem-tremolo::pure-calc-y-offset",
+  "ly:stem-tremolo::pure-height",
+  "ly:stem-tremolo::width",
+  "ly:stem::calc-cross-staff",
+  "ly:stem::calc-default-direction",
+  "ly:stem::calc-direction",
+  "ly:stem::calc-length",
+  "ly:stem::calc-positioning-done",
+  "ly:stem::calc-stem-begin-position",
+  "ly:stem::calc-stem-end-position",
+  "ly:stem::calc-stem-info",
+  "ly:stem::height",
+  "ly:stem::offset-callback",
+  "ly:stem::print",
+  "ly:stem::pure-calc-length",
+  "ly:stem::pure-calc-stem-begin-position",
+  "ly:stem::pure-calc-stem-end-position",
+  "ly:stem::pure-height",
+  "ly:stem::width",
+  "ly:stencil-add",
+  "ly:stencil-aligned-to",
+  "ly:stencil-combine-at-edge",
+  "ly:stencil-empty?",
+  "ly:stencil-expr",
+  "ly:stencil-extent",
+  "ly:stencil-in-color",
+  "ly:stencil-outline",
+  "ly:stencil-rotate",
+  "ly:stencil-rotate-absolute",
+  "ly:stencil-scale",
+  "ly:stencil-stack",
+  "ly:stencil-translate",
+  "ly:stencil-translate-axis",
+  "ly:stencil?",
+  "ly:stream-event?",
+  "ly:string-percent-encode",
+  "ly:string-substitute",
+  "ly:sustain-pedal::print",
+  "ly:system",
+  "ly:system-font-load",
+  "ly:system-start-delimiter::print",
+  "ly:system::calc-pure-height",
+  "ly:system::calc-pure-relevant-grobs",
+  "ly:system::footnotes-after-line-breaking",
+  "ly:system::footnotes-before-line-breaking",
+  "ly:system::get-nonspaceable-staves",
+  "ly:system::get-spaceable-staves",
+  "ly:system::get-staves",
+  "ly:system::get-vertical-alignment",
+  "ly:system::height",
+  "ly:system::vertical-skyline-elements",
+  "ly:text-interface::interpret-markup",
+  "ly:text-interface::interpret-string",
+  "ly:text-interface::print",
+  "ly:tie-column::before-line-breaking",
+  "ly:tie-column::calc-positioning-done",
+  "ly:tie::calc-control-points",
+  "ly:tie::calc-direction",
+  "ly:tie::print",
+  "ly:time-signature::print",
+  "ly:transform->list",
+  "ly:transform?",
+  "ly:translate-cpp-warning-scheme",
+  "ly:translator-context",
+  "ly:translator-description",
+  "ly:translator-group?",
+  "ly:translator-name",
+  "ly:translator?",
+  "ly:transpose-key-alist",
+  "ly:ttf->pfa",
+  "ly:ttf-ps-name",
+  "ly:tuplet-bracket::calc-connect-to-neighbors",
+  "ly:tuplet-bracket::calc-cross-staff",
+  "ly:tuplet-bracket::calc-direction",
+  "ly:tuplet-bracket::calc-positions",
+  "ly:tuplet-bracket::calc-x-positions",
+  "ly:tuplet-bracket::print",
+  "ly:tuplet-iterator::constructor",
+  "ly:tuplet-number::calc-cross-staff",
+  "ly:tuplet-number::calc-x-offset",
+  "ly:tuplet-number::calc-y-offset",
+  "ly:tuplet-number::print",
+  "ly:type1->pfa",
+  "ly:unit",
+  "ly:unpure-call",
+  "ly:unpure-pure-container-pure-part",
+  "ly:unpure-pure-container-unpure-part",
+  "ly:unpure-pure-container?",
+  "ly:usage",
+  "ly:vaticana-ligature::brew-ligature-primitive",
+  "ly:vaticana-ligature::print",
+  "ly:verbose-output?",
+  "ly:version",
+  "ly:version?",
+  "ly:volta-bracket-interface::print",
+  "ly:volta-bracket::calc-shorten-pair",
+  "ly:volta-repeat-iterator::constructor",
+  "ly:volta-specced-music-iterator::constructor",
+  "ly:vowel-transition::set-spacing-rods",
+  "ly:warning",
+  "ly:warning-located",
+  "ly:wide-char->utf-8",
+  "lyric-hyphen::vaticana-style",
+  "lyric-text::print",
+  "magnification->font-size",
+  "magnify-markup",
+  "magnifyStaff-is-set?",
+  "magstep",
+  "maj7-modifier",
+  "make-abs-fontsize-markup",
+  "make-accidental-dodecaphonic-rule",
+  "make-accidental-markup",
+  "make-accidental-rule",
+  "make-align-on-other-markup",
+  "make-apply-context",
+  "make-arrow-head-markup",
+  "make-articulation",
+  "make-auto-footnote-markup",
+  "make-autochange-music",
+  "make-backslashed-digit-markup",
+  "make-beam-markup",
+  "make-bezier-sandwich-stencil",
+  "make-bold-markup",
+  "make-bow-stencil",
+  "make-box-markup",
+  "make-bracket-bar-line",
+  "make-bracket-markup",
+  "make-c-time-signature-markup",
+  "make-caps-markup",
+  "make-center-align-markup",
+  "make-center-column-markup",
+  "make-central-column-hole-addresses",
+  "make-char-markup",
+  "make-chord-elements",
+  "make-circle-markup",
+  "make-circle-stencil",
+  "make-clef-set",
+  "make-coda-markup",
+  "make-colon-bar-line",
+  "make-color-handler",
+  "make-column-lines-markup-list",
+  "make-column-markup",
+  "make-combine-markup",
+  "make-compound-meter-markup",
+  "make-concat-markup",
+  "make-conditional-trill-markup-markup",
+  "make-connected-line",
+  "make-connected-path-stencil",
+  "make-cue-clef-set",
+  "make-cue-clef-unset",
+  "make-customTabClef-markup",
+  "make-dashed-bar-line",
+  "make-default-fonts-tree",
+  "make-dir-column-markup",
+  "make-dotted-bar-line",
+  "make-doubleflat-markup",
+  "make-doublesharp-markup",
+  "make-draw-circle-markup",
+  "make-draw-dashed-line-markup",
+  "make-draw-dotted-line-markup",
+  "make-draw-hline-markup",
+  "make-draw-line-markup",
+  "make-draw-squiggle-line-markup",
+  "make-duration-of-length",
+  "make-dynamic-markup",
+  "make-ellipse-markup",
+  "make-ellipse-stencil",
+  "make-empty-bar-line",
+  "make-engraver",
+  "make-epsfile-markup",
+  "make-event-chord",
+  "make-extended-scale",
+  "make-eyeglasses-markup",
+  "make-fermata-markup",
+  "make-figured-bass-markup",
+  "make-fill-line-markup",
+  "make-fill-with-pattern-markup",
+  "make-filled-box-markup",
+  "make-filled-box-stencil",
+  "make-finger-markup",
+  "make-first-visible-markup",
+  "make-flat-markup",
+  "make-font-tree-leaf",
+  "make-font-tree-node",
+  "make-fontCaps-markup",
+  "make-fontsize-markup",
+  "make-footnote-markup",
+  "make-fraction-markup",
+  "make-fret-diagram",
+  "make-fret-diagram-markup",
+  "make-fret-diagram-terse-markup",
+  "make-fret-diagram-verbose-markup",
+  "make-fromproperty-markup",
+  "make-general-align-markup",
+  "make-glyph-time-signature-markup",
+  "make-grace-music",
+  "make-graceless-rhythmic-location",
+  "make-grob-property-override",
+  "make-grob-property-revert",
+  "make-grob-property-set",
+  "make-halign-markup",
+  "make-harmonic",
+  "make-harp-pedal-markup",
+  "make-hbracket-markup",
+  "make-hcenter-in-markup",
+  "make-hspace-markup",
+  "make-huge-markup",
+  "make-if-markup",
+  "make-italic-markup",
+  "make-justified-lines-markup-list",
+  "make-justify-field-markup",
+  "make-justify-line-markup",
+  "make-justify-markup",
+  "make-justify-string-markup",
+  "make-key-alist",
+  "make-key-symbols",
+  "make-kievan-bar-line",
+  "make-large-markup",
+  "make-larger-markup",
+  "make-left-align-markup",
+  "make-left-brace-markup",
+  "make-left-column-markup",
+  "make-left-hand-key-addresses",
+  "make-line-markup",
+  "make-line-stencil",
+  "make-lookup-markup",
+  "make-lower-markup",
+  "make-lyric-event",
+  "make-lyric-repeat-count-formatter",
+  "make-magnify-markup",
+  "make-map-markup-commands-markup-list",
+  "make-markalphabet-markup",
+  "make-markletter-markup",
+  "make-markup",
+  "make-medium-markup",
+  "make-modal-inverter",
+  "make-modal-transposer",
+  "make-multi-measure-rest",
+  "make-multi-measure-rest-by-number-markup",
+  "make-music",
+  "make-musicglyph-markup",
+  "make-name-keylist",
+  "make-named-spreadsheet",
+  "make-natural-markup",
+  "make-no-bar-line",
+  "make-non-relative-music",
+  "make-normal-size-sub-markup",
+  "make-normal-size-super-markup",
+  "make-normal-text-markup",
+  "make-normalsize-markup",
+  "make-note-by-number-markup",
+  "make-note-markup",
+  "make-null-markup",
+  "make-number-keylist",
+  "make-number-markup",
+  "make-on-the-fly-markup",
+  "make-oval-markup",
+  "make-oval-stencil",
+  "make-overlay-markup",
+  "make-override-lines-markup-list",
+  "make-override-markup",
+  "make-overtie-markup",
+  "make-pad-around-markup",
+  "make-pad-markup-markup",
+  "make-pad-to-box-markup",
+  "make-pad-x-markup",
+  "make-page-link-markup",
+  "make-page-ref-markup",
+  "make-pango-font-tree",
+  "make-parenthesis-stencil",
+  "make-parenthesize-markup",
+  "make-part-combine-context-changes",
+  "make-part-combine-marks",
+  "make-partial-ellipse-stencil",
+  "make-path-markup",
+  "make-path-stencil",
+  "make-pattern-markup",
+  "make-percent-set",
+  "make-performer",
+  "make-polygon-markup",
+  "make-postscript-markup",
+  "make-property-recursive-markup",
+  "make-property-set",
+  "make-property-unset",
+  "make-put-adjacent-markup",
+  "make-raise-markup",
+  "make-relative",
+  "make-relative::to-relative-callback",
+  "make-repeat",
+  "make-replace-markup",
+  "make-rest-by-number-markup",
+  "make-rest-markup",
+  "make-rhythm-markup",
+  "make-rhythmic-location",
+  "make-right-align-markup",
+  "make-right-brace-markup",
+  "make-right-column-markup",
+  "make-right-hand-key-addresses",
+  "make-roman-markup",
+  "make-rotate-markup",
+  "make-rounded-box-markup",
+  "make-sans-markup",
+  "make-scale",
+  "make-scale-markup",
+  "make-score-lines-markup-list",
+  "make-score-markup",
+  "make-segno-bar-line",
+  "make-segno-markup",
+  "make-semiflat-markup",
+  "make-semisharp-markup",
+  "make-semitone->pitch",
+  "make-sequential-music",
+  "make-sesquiflat-markup",
+  "make-sesquisharp-markup",
+  "make-session-variable",
+  "make-setting",
+  "make-sharp-markup",
+  "make-short-bar-line",
+  "make-simple-bar-line",
+  "make-simple-markup",
+  "make-simultaneous-music",
+  "make-skip-music",
+  "make-skipped",
+  "make-slashed-digit-markup",
+  "make-small-markup",
+  "make-smallCaps-markup",
+  "make-smaller-markup",
+  "make-spacer-bar-line",
+  "make-span-event",
+  "make-split-state",
+  "make-spreadsheet",
+  "make-stem-span!",
+  "make-stem-spans!",
+  "make-stencil-boxer",
+  "make-stencil-circler",
+  "make-stencil-markup",
+  "make-string-lines-markup-list",
+  "make-strut-markup",
+  "make-sub-markup",
+  "make-super-markup",
+  "make-symbol-alist",
+  "make-tab-heads-transparent",
+  "make-table-markup-list",
+  "make-teeny-markup",
+  "make-text-markup",
+  "make-thick-bar-line",
+  "make-tick-bar-line",
+  "make-tie-markup",
+  "make-tie-stencil",
+  "make-tied-lyric-markup",
+  "make-tilted-portion",
+  "make-time-signature-set",
+  "make-tiny-markup",
+  "make-tmpfile",
+  "make-translate-markup",
+  "make-translate-scaled-markup",
+  "make-translator",
+  "make-translator-component",
+  "make-translator-internal",
+  "make-transparent-box-stencil",
+  "make-transparent-markup",
+  "make-tremolo-set",
+  "make-triangle-markup",
+  "make-type-checker",
+  "make-typewriter-markup",
+  "make-underline-markup",
+  "make-undertie-markup",
+  "make-unfolded-set",
+  "make-unless-markup",
+  "make-upright-markup",
+  "make-varcoda-markup",
+  "make-vcenter-markup",
+  "make-verbatim-file-markup",
+  "make-voice-props-override",
+  "make-voice-props-revert",
+  "make-voice-props-set",
+  "make-voice-states",
+  "make-volta-set",
+  "make-vspace-markup",
+  "make-whiteout-markup",
+  "make-with-color-markup",
+  "make-with-dimension-from-markup",
+  "make-with-dimension-markup",
+  "make-with-dimensions-from-markup",
+  "make-with-dimensions-markup",
+  "make-with-link-markup",
+  "make-with-outline-markup",
+  "make-with-string-transformer-markup",
+  "make-with-true-dimension-markup",
+  "make-with-true-dimensions-markup",
+  "make-with-url-markup",
+  "make-woodwind-diagram-markup",
+  "make-wordwrap-field-markup",
+  "make-wordwrap-internal-markup-list",
+  "make-wordwrap-lines-markup-list",
+  "make-wordwrap-markup",
+  "make-wordwrap-string-internal-markup-list",
+  "make-wordwrap-string-markup",
+  "map-alist-keys",
+  "map-alist-vals",
+  "map-markup-commands-markup-list",
+  "map-selected-alist-keys",
+  "map-some-music",
+  "markalphabet-markup",
+  "marked-up-headfoot",
+  "marked-up-title",
+  "markgeneric-string",
+  "markletter-markup",
+  "markup",
+  "markup->string",
+  "markup-argument-list-error",
+  "markup-argument-list?",
+  "markup-command-list?",
+  "markup-command-signature",
+  "markup-default-to-string-method",
+  "markup-expression->make-markup",
+  "markup-function-as-string-method",
+  "markup-function-category",
+  "markup-function-properties",
+  "markup-function?",
+  "markup-join",
+  "markup-lambda",
+  "markup-lambda-listify",
+  "markup-lambda-worker",
+  "markup-list-function?",
+  "markup-list-lambda",
+  "markup-list?",
+  "markup-thrower-typecheck",
+  "markup-typecheck?",
+  "markup?",
+  "match-predicate",
+  "measure-counter::text",
+  "medium-markup",
+  "mensural-flag",
+  "merge-details",
+  "metronome-markup",
+  "middle-broken-spanner?",
+  "midi-program",
+  "midline-stencil",
+  "minor-modifier",
+  "mkdir-if-not-exist",
+  "mm-rest-child-list",
+  "mmrest-of-length",
+  "modern-straight-flag",
+  "modified-font-metric-font-scaling",
+  "modulo-bar-number-visible",
+  "moment",
+  "moment->fraction",
+  "moment-min",
+  "moment-pair?",
+  "moment<=?",
+  "move-chord-note",
+  "multi-fork",
+  "multi-measure-rest-by-number-markup",
+  "music->make-music",
+  "music-check-error",
+  "music-clone",
+  "music-filter",
+  "music-invert",
+  "music-is-of-type?",
+  "music-map",
+  "music-pitches",
+  "music-property-description",
+  "music-selective-filter",
+  "music-selective-map",
+  "music-separator?",
+  "music-type-predicate",
+  "musicglyph-markup",
+  "n-true-entries",
+  "narrow-glyph?",
+  "natural-chord-alteration",
+  "natural-markup",
+  "negate-extent",
+  "neo-modern-accidental-rule",
+  "no-flag",
+  "normal-flag",
+  "normal-size-sub-markup",
+  "normal-size-super-markup",
+  "normal-text-markup",
+  "normalize-fraction",
+  "normalsize-markup",
+  "not-first-broken-spanner?",
+  "not-last-broken-spanner?",
+  "note-by-number-markup",
+  "note-events",
+  "note-head::brew-ez-stencil",
+  "note-head::calc-duration-log",
+  "note-head::calc-glyph-name",
+  "note-head::calc-kievan-duration-log",
+  "note-markup",
+  "note-name->german-markup",
+  "note-name->markup",
+  "note-name->string",
+  "note-name-markup",
+  "note-names-language",
+  "note-to-cluster",
+  "notes-to-clusters",
+  "null-markup",
+  "number->octal-string",
+  "number-column-stencil",
+  "number-format",
+  "number-list?",
+  "number-markup",
+  "number-or-grob?",
+  "number-or-pair?",
+  "number-or-string?",
+  "number-pair-list?",
+  "number-pair?",
+  "numbered-footnotes",
+  "numerify",
+  "object-type",
+  "object-type-name",
+  "oboe-lh-I-key-stencil",
+  "oboe-lh-II-key-stencil",
+  "oboe-lh-III-key-stencil",
+  "oboe-lh-b-key-stencil",
+  "oboe-lh-bes-key-stencil",
+  "oboe-lh-cis-key-stencil",
+  "oboe-lh-d-key-stencil",
+  "oboe-lh-ees-key-stencil",
+  "oboe-lh-ees-lh-bes-key-stencil",
+  "oboe-lh-f-key-stencil",
+  "oboe-lh-gis-key-stencil",
+  "oboe-lh-gis-lh-low-b-key-stencil",
+  "oboe-lh-low-b-key-stencil",
+  "oboe-lh-octave-key-stencil",
+  "oboe-rh-a-key-stencil",
+  "oboe-rh-banana-key-stencil",
+  "oboe-rh-c-key-stencil",
+  "oboe-rh-c-rh-ees-key-stencil",
+  "oboe-rh-cis-key-stencil",
+  "oboe-rh-d-key-stencil",
+  "oboe-rh-ees-key-stencil",
+  "oboe-rh-f-key-stencil",
+  "oboe-rh-gis-key-stencil",
+  "octave-woodwind-text-stencil",
+  "offset-add",
+  "offset-flip-y",
+  "offset-fret",
+  "offset-multiple-types",
+  "offset-scale",
+  "offsetter",
+  "old-straight-flag",
+  "on-the-fly-markup",
+  "only-if-beamed",
+  "ordered-cons",
+  "other-axis",
+  "output-module?",
+  "output-scopes",
+  "outputproperty-compatibility",
+  "oval-markup",
+  "oval-stencil",
+  "overlay-markup",
+  "override-head-style",
+  "override-lines-markup-list",
+  "override-markup",
+  "override-property-setting",
+  "override-time-signature-setting",
+  "overtie-markup",
+  "pad-around-markup",
+  "pad-markup-markup",
+  "pad-to-box-markup",
+  "pad-x-markup",
+  "page-link-markup",
+  "page-ref-markup",
+  "pair-map",
+  "pango-font-name",
+  "pango-pf-file-name",
+  "pango-pf-font-name",
+  "pango-pf-fontindex",
+  "paper-variable",
+  "parentheses-interface::calc-angled-bracket-stencils",
+  "parentheses-interface::calc-parenthesis-stencils",
+  "parentheses-interface::print",
+  "parentheses-interface::y-extent",
+  "parenthesize-elements",
+  "parenthesize-markup",
+  "parenthesize-stencil",
+  "parse-and-check-version",
+  "parse-lily-version",
+  "parse-terse-string",
+  "path-markup",
+  "pattern-markup",
+  "percussion?",
+  "performance-name-from-headers",
+  "piccolo-rh-x-key-stencil",
+  "pitch-alteration-semitones",
+  "pitch-invert",
+  "pitch-of-note",
+  "pitch-step",
+  "polar->rectangular",
+  "polygon-markup",
+  "position-true-endpoint",
+  "postprocess-output",
+  "postscript->pdf",
+  "postscript->png",
+  "postscript->ps",
+  "postscript-markup",
+  "precompute-music-length",
+  "prepend-alist-chain",
+  "prepend-props",
+  "pretty-printable?",
+  "previous-span-state",
+  "previous-voice-state",
+  "print-book-with",
+  "print-book-with-defaults",
+  "print-book-with-defaults-as-systems",
+  "print-circled-text-callback",
+  "print-keys",
+  "print-keys-verbose",
+  "process-fill-value",
+  "property-recursive-markup",
+  "pure-chain-offset-callback",
+  "pure-from-neighbor-interface::account-for-span-bar",
+  "pure-from-neighbor-interface::extra-spacing-height",
+  "pure-from-neighbor-interface::extra-spacing-height-at-beginning-of-line",
+  "pure-from-neighbor-interface::extra-spacing-height-including-staff",
+  "pure-from-neighbor-interface::pure-height",
+  "put-adjacent-markup",
+  "quarterdiff->string",
+  "quote-substitute",
+  "raise-markup",
+  "randomize-rand-seed",
+  "ratio->fret",
+  "ratio->pitch",
+  "rational-or-procedure?",
+  "read-lily-expression",
+  "read-lily-expression-internal",
+  "recent-enough?",
+  "recompute-music-length",
+  "recording-group-emulate",
+  "regexp-split",
+  "relevant-book-systems",
+  "relevant-dump-systems",
+  "remove-grace-property",
+  "remove-step",
+  "remove-whitespace",
+  "repeat-tie::handle-tab-note-head",
+  "replace-markup",
+  "replace-step",
+  "replicate-modify",
+  "reset-stencil-colors",
+  "rest-by-number-markup",
+  "rest-markup",
+  "retrieve-glyph-flag",
+  "retrograde-music",
+  "return-1",
+  "reverse-interval",
+  "revert-fontSize",
+  "revert-head-style",
+  "revert-property-setting",
+  "revert-props",
+  "revert-time-signature-setting",
+  "rgb-color",
+  "rh-woodwind-text-stencil",
+  "rhythm-markup",
+  "rhythmic-location->file-string",
+  "rhythmic-location->string",
+  "rhythmic-location-bar-number",
+  "rhythmic-location-measure-position",
+  "rhythmic-location<=?",
+  "rhythmic-location<?",
+  "rhythmic-location=?",
+  "rhythmic-location>=?",
+  "rhythmic-location>?",
+  "rhythmic-location?",
+  "rich-bassoon-uber-key-stencil",
+  "rich-e-stencil",
+  "rich-group-draw-rule",
+  "rich-group-extra-offset-rule",
+  "rich-path-stencil",
+  "rich-pe-stencil",
+  "right-align-markup",
+  "right-brace-markup",
+  "right-column-markup",
+  "ring-column-circle-stencil",
+  "robust-bar-number-function",
+  "roman-markup",
+  "rotate-markup",
+  "rounded-box-markup",
+  "rounded-box-stencil",
+  "sans-markup",
+  "sans-serif-stencil",
+  "saxophone-lh-T-key-stencil",
+  "saxophone-lh-b-cis-key-stencil",
+  "saxophone-lh-b-key-stencil",
+  "saxophone-lh-bes-key-stencil",
+  "saxophone-lh-cis-key-stencil",
+  "saxophone-lh-d-key-stencil",
+  "saxophone-lh-ees-key-stencil",
+  "saxophone-lh-f-key-stencil",
+  "saxophone-lh-front-f-key-stencil",
+  "saxophone-lh-gis-key-stencil",
+  "saxophone-lh-low-a-key-stencil",
+  "saxophone-lh-low-bes-key-stencil",
+  "saxophone-name-passerelle",
+  "saxophone-rh-bes-key-stencil",
+  "saxophone-rh-c-key-stencil",
+  "saxophone-rh-e-key-stencil",
+  "saxophone-rh-ees-key-stencil",
+  "saxophone-rh-fis-key-stencil",
+  "saxophone-rh-high-fis-key-stencil",
+  "saxophone-rh-low-c-key-stencil",
+  "saxophone-rh-side-key-stencil",
+  "scale->factor",
+  "scale-beam-thickness",
+  "scale-by-font-size",
+  "scale-fontSize",
+  "scale-layout",
+  "scale-markup",
+  "scale-props",
+  "scale?",
+  "scheme?",
+  "scm->string",
+  "score-lines-markup-list",
+  "score-markup",
+  "scorify-music",
+  "script-interface::calc-x-offset",
+  "script-or-side-position-cross-staff",
+  "search-executable",
+  "seconds->moment",
+  "segno-markup",
+  "select-head-glyph",
+  "select-option",
+  "self-alignment-interface::self-aligned-on-breakable",
+  "self-evaluating?",
+  "semi-tie::calc-cross-staff",
+  "semiflat-markup",
+  "semisharp-markup",
+  "sequential-music-to-chord-exceptions",
+  "sesquiflat-markup",
+  "sesquisharp-markup",
+  "session-replay",
+  "session-save",
+  "session-start-record",
+  "session-terminate",
+  "set-accidental-style",
+  "set-bar-number-visibility",
+  "set-counter-text!",
+  "set-default-paper-size",
+  "set-global-fonts",
+  "set-global-staff-size",
+  "set-mus-properties!",
+  "set-output-property",
+  "set-paper-dimension-variables",
+  "set-paper-dimensions",
+  "set-paper-size",
+  "sharp-markup",
+  "shift-duration-log",
+  "shift-octave",
+  "shift-one-duration-log",
+  "shift-right-at-line-begin",
+  "shift-semitone->pitch",
+  "short-glyph?",
+  "sign",
+  "silence-events",
+  "simple-markup",
+  "simple-stencil-alist",
+  "skip->rest",
+  "skip-as-needed",
+  "skip-of-length",
+  "skip-of-moment-span",
+  "skyline-pair-and-non-empty?",
+  "skyline-pair::empty?",
+  "slashed-digit-internal",
+  "slashed-digit-markup",
+  "slashify",
+  "small-markup",
+  "smallCaps-markup",
+  "smaller-markup",
+  "space-lines",
+  "span-bar::compound-bar-line",
+  "span-state",
+  "split-at-predicate",
+  "split-index",
+  "split-list",
+  "split-list-by-separator",
+  "stack-lines",
+  "stack-stencil-line",
+  "stack-stencils",
+  "stack-stencils-padding-list",
+  "stack-thirds",
+  "staff-ellipsis::calc-y-extent",
+  "staff-ellipsis::print",
+  "staff-highlight::height",
+  "staff-highlight::print",
+  "staff-highlight::width",
+  "staff-magnification-is-changing?",
+  "staff-symbol-line-count",
+  "staff-symbol-line-positions",
+  "staff-symbol-line-span",
+  "staff-symbol-y-extent-from-line-positions",
+  "staff-symbol::calc-widened-extent",
+  "standard-e-stencil",
+  "standard-path-stencil",
+  "stderr",
+  "stem-connectable?",
+  "stem-is-root?",
+  "stem-span-stencil",
+  "stem-stub::do-calculations",
+  "stem-stub::extra-spacing-height",
+  "stem-stub::pure-height",
+  "stem-stub::width",
+  "stem-tremolo::calc-tab-width",
+  "stem::calc-duration-log",
+  "stem::kievan-offset-callback",
+  "stencil-fretboard-extent",
+  "stencil-fretboard-offset",
+  "stencil-markup",
+  "stencil-true-extent",
+  "stencil-whiteout",
+  "stencil-whiteout-box",
+  "stencil-whiteout-outline",
+  "stencil-with-color",
+  "sticky-grob-interface::inherit-property",
+  "straight-flag",
+  "string->string-list",
+  "string-encode-integer",
+  "string-endswith",
+  "string-lines-markup-list",
+  "string-number::calc-text",
+  "string-or-music?",
+  "string-or-pair?",
+  "string-or-symbol?",
+  "string-regexp-substitute",
+  "string-startswith",
+  "string-thickness",
+  "strip-string-annotation",
+  "stroke-finger::calc-text",
+  "strut-markup",
+  "style-note-heads",
+  "sub-markup",
+  "subtract-base-fret",
+  "suggest-convert-ly-message",
+  "super-markup",
+  "sus-modifier",
+  "symbol-concatenate",
+  "symbol-footnotes",
+  "symbol-key-alist?",
+  "symbol-key<?",
+  "symbol-list-or-music?",
+  "symbol-list-or-symbol?",
+  "symbol-list?",
+  "symbol<?",
+  "symlink-if-not-exist",
+  "symlink-or-copy-if-not-exist",
+  "symmetric-interval",
+  "synced?",
+  "system-start-text::calc-x-offset",
+  "system-start-text::calc-y-offset",
+  "system-start-text::print",
+  "tab-note-head::calc-glyph-name",
+  "tab-note-head::print",
+  "tab-note-head::print-custom-fret-label",
+  "tab-note-head::whiteout-if-style-set",
+  "tablature-position-on-lines",
+  "table-markup-list",
+  "tabvoice::draw-double-stem-for-half-notes",
+  "tabvoice::make-double-stem-width-for-half-notes",
+  "tag-group-get",
+  "tags-keep-predicate",
+  "tags-remove-predicate",
+  "teaching-accidental-rule",
+  "teeny-markup",
+  "text-fill-translate",
+  "text-mark-interface::calc-break-visibility",
+  "text-mark-interface::calc-self-alignment-X",
+  "text-markup",
+  "tie-markup",
+  "tie::handle-tab-note-head",
+  "tied-lyric-markup",
+  "tiny-markup",
+  "translate-draw-instructions",
+  "translate-key-instruction",
+  "translate-markup",
+  "translate-scaled-markup",
+  "translator-property-description",
+  "transparent-markup",
+  "transposer-factory",
+  "triangle-markup",
+  "trill-pitch-group::pure-height",
+  "true-entry?",
+  "tuning",
+  "tuplet-number::append-note-wrapper",
+  "tuplet-number::calc-denominator-text",
+  "tuplet-number::calc-direction",
+  "tuplet-number::calc-fraction-text",
+  "tuplet-number::fraction-with-notes",
+  "tuplet-number::non-default-fraction-with-notes",
+  "tuplet-number::non-default-tuplet-denominator-text",
+  "tuplet-number::non-default-tuplet-fraction-text",
+  "type-name",
+  "typewriter-markup",
+  "unbroken-or-first-broken-spanner?",
+  "unbroken-or-last-broken-spanner?",
+  "unbroken-spanner?",
+  "underline-markup",
+  "undertie-markup",
+  "unfold-repeats",
+  "unfold-repeats-fully",
+  "uniform-draw-instructions",
+  "uniform-extra-offset-rule",
+  "uniq-list",
+  "uniqued-alist",
+  "unity-if-multimeasure",
+  "universal-color",
+  "unless-markup",
+  "update-possb-list",
+  "upper-key-stencil",
+  "upright-markup",
+  "value-for-spanner-piece",
+  "varcoda-markup",
+  "variable-column-circle-stencil",
+  "vcenter-markup",
+  "vector-for-each",
+  "verbatim-file-markup",
+  "version-not-seen-message",
+  "voice-states",
+  "voicify-chord",
+  "voicify-list",
+  "voicify-music",
+  "void?",
+  "volta-bracket-interface::pure-height",
+  "volta-bracket::calc-hook-visibility",
+  "volta-spec-music",
+  "vspace-markup",
+  "whiteout-markup",
+  "with-color-markup",
+  "with-dimension-from-markup",
+  "with-dimension-markup",
+  "with-dimensions-from-markup",
+  "with-dimensions-markup",
+  "with-link-markup",
+  "with-outline-markup",
+  "with-string-transformer-markup",
+  "with-true-dimension-markup",
+  "with-true-dimensions-markup",
+  "with-url-markup",
+  "woodwind-diagram-markup",
+  "wordwrap-field-markup",
+  "wordwrap-internal-markup-list",
+  "wordwrap-lines-markup-list",
+  "wordwrap-markup",
+  "wordwrap-stencils",
+  "wordwrap-string-internal-markup-list",
+  "wordwrap-string-markup",
+  "write-lilypond-book-aux-files",
+  "write-me",
+  "write-performances-midis",
+  "x11-color",
+]
+
+context_properties = [
+  "aDueText",
+  "accidentalGrouping",
+  "additionalBassStrings",
+  "additionalPitchPrefix",
+  "alignAboveContext",
+  "alignBelowContext",
+  "alterationGlyphs",
+  "alternativeNumber",
+  "alternativeNumberingStyle",
+  "alternativeRestores",
+  "associatedVoice",
+  "associatedVoiceContext",
+  "associatedVoiceType",
+  "autoAccidentals",
+  "autoBeamCheck",
+  "autoBeaming",
+  "autoCautionaries",
+  "barCheckLastFail",
+  "barCheckSynchronize",
+  "barExtraVelocity",
+  "barNumberFormatter",
+  "barNumberVisibility",
+  "baseMoment",
+  "beamExceptions",
+  "beamHalfMeasure",
+  "beamMelismaBusy",
+  "beatExtraVelocity",
+  "beatStructure",
+  "breathMarkDefinitions",
+  "breathMarkType",
+  "busyGrobs",
+  "caesuraType",
+  "caesuraTypeTransform",
+  "centerBarNumbers",
+  "chordChanges",
+  "chordNameExceptions",
+  "chordNameFunction",
+  "chordNameLowercaseMinor",
+  "chordNameSeparator",
+  "chordNoteNamer",
+  "chordPrefixSpacer",
+  "chordRootNamer",
+  "clefGlyph",
+  "clefPosition",
+  "clefTransposition",
+  "clefTranspositionFormatter",
+  "clefTranspositionStyle",
+  "codaMarkCount",
+  "codaMarkFormatter",
+  "completionBusy",
+  "completionFactor",
+  "completionUnit",
+  "connectArpeggios",
+  "countPercentRepeats",
+  "createKeyOnClefChange",
+  "createSpacing",
+  "crescendoSpanner",
+  "crescendoText",
+  "cueClefGlyph",
+  "cueClefPosition",
+  "cueClefTransposition",
+  "cueClefTranspositionFormatter",
+  "cueClefTranspositionStyle",
+  "currentBarLine",
+  "currentBarNumber",
+  "currentChordCause",
+  "currentChordText",
+  "currentCommandColumn",
+  "currentMusicalColumn",
+  "currentPerformanceMarkEvent",
+  "currentRehearsalMarkEvent",
+  "dalSegnoTextFormatter",
+  "decrescendoSpanner",
+  "decrescendoText",
+  "defaultStrings",
+  "doubleRepeatBarType",
+  "doubleRepeatSegnoBarType",
+  "doubleSlurs",
+  "drumPitchTable",
+  "drumStyleTable",
+  "dynamicAbsoluteVolumeFunction",
+  "endAtSkip",
+  "endRepeatBarType",
+  "endRepeatSegnoBarType",
+  "explicitClefVisibility",
+  "explicitCueClefVisibility",
+  "explicitKeySignatureVisibility",
+  "extendersOverRests",
+  "extraNatural",
+  "figuredBassAlterationDirection",
+  "figuredBassCenterContinuations",
+  "figuredBassFormatter",
+  "figuredBassLargeNumberAlignment",
+  "figuredBassPlusDirection",
+  "figuredBassPlusStrokedAlist",
+  "finalFineTextVisibility",
+  "finalizations",
+  "fineBarType",
+  "fineSegnoBarType",
+  "fineStartRepeatSegnoBarType",
+  "fineText",
+  "fingeringOrientations",
+  "firstClef",
+  "followVoice",
+  "fontSize",
+  "forbidBreak",
+  "forbidBreakBetweenBarLines",
+  "forceBreak",
+  "forceClef",
+  "fretLabels",
+  "glissandoMap",
+  "graceSettings",
+  "gridInterval",
+  "handleNegativeFrets",
+  "harmonicAccidentals",
+  "harmonicDots",
+  "hasAxisGroup",
+  "hasStaffSpacing",
+  "highStringOne",
+  "ignoreBarChecks",
+  "ignoreBarNumberChecks",
+  "ignoreFiguredBassRest",
+  "ignoreMelismata",
+  "implicitBassFigures",
+  "includeGraceNotes",
+  "initialTimeSignatureVisibility",
+  "instrumentCueName",
+  "instrumentEqualizer",
+  "instrumentName",
+  "instrumentTransposition",
+  "internalBarNumber",
+  "keepAliveInterfaces",
+  "keyAlterationOrder",
+  "keyAlterations",
+  "lastChord",
+  "lastKeyAlterations",
+  "localAlterations",
+  "lyricMelismaAlignment",
+  "lyricRepeatCountFormatter",
+  "magnifyStaffValue",
+  "majorSevenSymbol",
+  "maximumFretStretch",
+  "measureBarType",
+  "measureLength",
+  "measurePosition",
+  "measureStartNow",
+  "melismaBusy",
+  "melismaBusyProperties",
+  "metronomeMarkFormatter",
+  "middleCClefPosition",
+  "middleCCuePosition",
+  "middleCOffset",
+  "middleCPosition",
+  "midiBalance",
+  "midiChannelMapping",
+  "midiChorusLevel",
+  "midiExpression",
+  "midiInstrument",
+  "midiMaximumVolume",
+  "midiMergeUnisons",
+  "midiMinimumVolume",
+  "midiPanPosition",
+  "midiReverbLevel",
+  "midiSkipOffset",
+  "minimumFret",
+  "minimumPageTurnLength",
+  "minimumRepeatLengthForPageTurn",
+  "minorChordModifier",
+  "noChordSymbol",
+  "noteNameFunction",
+  "noteNameSeparator",
+  "noteToFretFunction",
+  "nullAccidentals",
+  "ottavaStartNow",
+  "ottavation",
+  "ottavationMarkups",
+  "output",
+  "partCombineForced",
+  "partCombineTextsOnNote",
+  "partialBusy",
+  "pedalSostenutoStrings",
+  "pedalSostenutoStyle",
+  "pedalSustainStrings",
+  "pedalSustainStyle",
+  "pedalUnaCordaStrings",
+  "pedalUnaCordaStyle",
+  "predefinedDiagramTable",
+  "printAccidentalNames",
+  "printKeyCancellation",
+  "printNotesLanguage",
+  "printOctaveNames",
+  "printPartCombineTexts",
+  "proportionalNotationDuration",
+  "quotedCueEventTypes",
+  "quotedEventTypes",
+  "rehearsalMark",
+  "rehearsalMarkFormatter",
+  "repeatCommands",
+  "repeatCountVisibility",
+  "restCompletionBusy",
+  "restNumberThreshold",
+  "restrainOpenStrings",
+  "rootSystem",
+  "scriptDefinitions",
+  "searchForVoice",
+  "sectionBarType",
+  "segnoBarType",
+  "segnoMarkCount",
+  "segnoMarkFormatter",
+  "segnoStyle",
+  "shapeNoteStyles",
+  "shortInstrumentName",
+  "shortVocalName",
+  "skipBars",
+  "skipTypesetting",
+  "slashChordSeparator",
+  "slurMelismaBusy",
+  "soloIIText",
+  "soloText",
+  "squashedPosition",
+  "staffLineLayoutFunction",
+  "stanza",
+  "startAtNoteColumn",
+  "startAtSkip",
+  "startRepeatBarType",
+  "startRepeatSegnoBarType",
+  "stavesFound",
+  "stemLeftBeamCount",
+  "stemRightBeamCount",
+  "strictBeatBeaming",
+  "stringFretFingerList",
+  "stringNumberOrientations",
+  "stringOneTopmost",
+  "stringTunings",
+  "strokeFingerOrientations",
+  "subdivideBeams",
+  "suggestAccidentals",
+  "supportNonIntegerFret",
+  "suspendMelodyDecisions",
+  "suspendRestMerging",
+  "systemStartDelimiter",
+  "systemStartDelimiterHierarchy",
+  "tabStaffLineLayoutFunction",
+  "tablatureFormat",
+  "tempoHideNote",
+  "tempoWholesPerMinute",
+  "tieMelismaBusy",
+  "tieWaitForNote",
+  "timeSignatureFraction",
+  "timeSignatureSettings",
+  "timing",
+  "tonic",
+  "topLevelAlignment",
+  "tupletFullLength",
+  "tupletFullLengthNote",
+  "tupletSpannerDuration",
+  "underlyingRepeatBarType",
+  "useBassFigureExtenders",
+  "vocalName",
+  "voltaSpannerDuration",
+  "whichBar",
+]
+
+grob_properties = [
+  "X-align-on-main-noteheads",
+  "X-attachment",
+  "X-common",
+  "X-extent",
+  "X-offset",
+  "X-positions",
+  "Y-attachment",
+  "Y-common",
+  "Y-extent",
+  "Y-offset",
+  "accidental-grob",
+  "accidental-grobs",
+  "add-cauda",
+  "add-join",
+  "add-stem",
+  "add-stem-support",
+  "adjacent-pure-heights",
+  "adjacent-spanners",
+  "after-line-breaking",
+  "align-dir",
+  "all-elements",
+  "allow-loose-spacing",
+  "allow-span-bar",
+  "alteration",
+  "alteration-alist",
+  "alteration-glyph-name-alist",
+  "annotation",
+  "annotation-balloon",
+  "annotation-line",
+  "arpeggio-direction",
+  "arrow-length",
+  "arrow-width",
+  "ascendens",
+  "auctum",
+  "auto-knee-gap",
+  "automatically-numbered",
+  "average-spacing-wishes",
+  "avoid-note-head",
+  "avoid-scripts",
+  "avoid-slur",
+  "axes",
+  "axis-group-parent-X",
+  "axis-group-parent-Y",
+  "bar-extent",
+  "bars",
+  "base-shortest-duration",
+  "baseline-skip",
+  "beam",
+  "beam-segments",
+  "beam-thickness",
+  "beam-width",
+  "beamed-stem-shorten",
+  "beaming",
+  "beamlet-default-length",
+  "beamlet-max-length-proportion",
+  "before-line-breaking",
+  "begin-of-line-visible",
+  "bend-me",
+  "between-cols",
+  "bezier",
+  "bound-alignment-interfaces",
+  "bound-details",
+  "bound-padding",
+  "bound-prefatory-paddings",
+  "bounded-by-me",
+  "bracket",
+  "bracket-flare",
+  "bracket-text",
+  "bracket-visibility",
+  "break-align-anchor",
+  "break-align-anchor-alignment",
+  "break-align-orders",
+  "break-align-symbol",
+  "break-align-symbols",
+  "break-alignment",
+  "break-overshoot",
+  "break-visibility",
+  "breakable",
+  "broken-bound-padding",
+  "c0-position",
+  "cause",
+  "cavum",
+  "chord-dots-limit",
+  "chord-names",
+  "circled-tip",
+  "clef-alignments",
+  "clip-edges",
+  "collapse-height",
+  "collision-interfaces",
+  "collision-voice-only",
+  "color",
+  "columns",
+  "common-shortest-duration",
+  "concaveness",
+  "concurrent-hairpins",
+  "conditional-elements",
+  "connect-to-neighbor",
+  "context-info",
+  "control-points",
+  "count-from",
+  "covered-grobs",
+  "cross-staff",
+  "damping",
+  "dash-definition",
+  "dash-fraction",
+  "dash-period",
+  "dashed-edge",
+  "default-direction",
+  "default-staff-staff-spacing",
+  "delta-position",
+  "deminutum",
+  "descendens",
+  "details",
+  "digit-names",
+  "direction",
+  "direction-source",
+  "display-cautionary",
+  "dot",
+  "dot-count",
+  "dot-negative-kern",
+  "dot-placement-list",
+  "dot-stencil",
+  "dots",
+  "double-stem-separation",
+  "duration-log",
+  "eccentricity",
+  "edge-height",
+  "edge-text",
+  "elements",
+  "encompass-objects",
+  "endpoint-alignments",
+  "expand-limit",
+  "extra-dy",
+  "extra-offset",
+  "extra-spacing-height",
+  "extra-spacing-width",
+  "extroversion",
+  "fa-merge-direction",
+  "fa-styles",
+  "figures",
+  "filled",
+  "flag",
+  "flag-count",
+  "flag-style",
+  "flat-positions",
+  "flexa-height",
+  "flexa-interval",
+  "flexa-width",
+  "font",
+  "font-encoding",
+  "font-family",
+  "font-features",
+  "font-name",
+  "font-series",
+  "font-shape",
+  "font-size",
+  "footnote",
+  "footnote-music",
+  "footnote-stencil",
+  "footnote-text",
+  "footnotes-after-line-breaking",
+  "footnotes-before-line-breaking",
+  "force-hshift",
+  "forced",
+  "forced-spacing",
+  "fraction",
+  "french-beaming",
+  "french-beaming-stem-adjustment",
+  "fret-diagram-details",
+  "full-length-padding",
+  "full-length-to-extent",
+  "full-measure-extra-space",
+  "full-size-change",
+  "gap",
+  "gap-count",
+  "glissando-index",
+  "glissando-skip",
+  "glyph",
+  "glyph-left",
+  "glyph-name",
+  "glyph-right",
+  "grace-spacing",
+  "graphical",
+  "grow-direction",
+  "hair-thickness",
+  "harp-pedal-details",
+  "has-span-bar",
+  "head-direction",
+  "head-width",
+  "heads",
+  "height",
+  "height-limit",
+  "hide-tied-accidental-after-break",
+  "horizon-padding",
+  "horizontal-shift",
+  "horizontal-skylines",
+  "id",
+  "ideal-distances",
+  "ignore-ambitus",
+  "ignore-collision",
+  "implicit",
+  "important-column-ranks",
+  "in-note-direction",
+  "in-note-padding",
+  "in-note-stencil",
+  "inclinatum",
+  "index",
+  "inspect-quants",
+  "interfaces",
+  "items-worth-living",
+  "keep-alive-with",
+  "keep-inside-line",
+  "kern",
+  "knee",
+  "knee-spacing-correction",
+  "knee-to-beam",
+  "labels",
+  "layer",
+  "least-squares-dy",
+  "ledger-extra",
+  "ledger-line-thickness",
+  "ledger-positions",
+  "ledger-positions-function",
+  "left-bound-info",
+  "left-items",
+  "left-neighbor",
+  "left-number-text",
+  "left-padding",
+  "length",
+  "length-fraction",
+  "ligature-flexa",
+  "line-break-penalty",
+  "line-break-permission",
+  "line-break-system-details",
+  "line-count",
+  "line-positions",
+  "line-thickness",
+  "linea",
+  "long-text",
+  "main-extent",
+  "make-dead-when",
+  "max-beam-connect",
+  "max-symbol-separation",
+  "maximum-gap",
+  "maybe-loose",
+  "measure-count",
+  "measure-division",
+  "measure-division-chord-placement-alist",
+  "measure-division-lines-alist",
+  "measure-length",
+  "melody-spanner",
+  "merge-differently-dotted",
+  "merge-differently-headed",
+  "meta",
+  "minimum-X-extent",
+  "minimum-Y-extent",
+  "minimum-distance",
+  "minimum-distances",
+  "minimum-length",
+  "minimum-length-after-break",
+  "minimum-length-fraction",
+  "minimum-space",
+  "minimum-translations-alist",
+  "neighbors",
+  "neutral-direction",
+  "neutral-position",
+  "next",
+  "no-ledgers",
+  "no-stem-extend",
+  "non-break-align-symbols",
+  "non-default",
+  "non-musical",
+  "nonstaff-nonstaff-spacing",
+  "nonstaff-relatedstaff-spacing",
+  "nonstaff-unrelatedstaff-spacing",
+  "normal-stems",
+  "normalized-endpoints",
+  "note-collision",
+  "note-collision-threshold",
+  "note-columns",
+  "note-head",
+  "note-heads",
+  "note-names",
+  "number-range-separator",
+  "number-type",
+  "numbering-assertion-function",
+  "oriscus",
+  "output-attributes",
+  "outside-staff-horizontal-padding",
+  "outside-staff-padding",
+  "outside-staff-placement-directive",
+  "outside-staff-priority",
+  "packed-spacing",
+  "padding",
+  "padding-pairs",
+  "page-break-penalty",
+  "page-break-permission",
+  "page-number",
+  "page-turn-penalty",
+  "page-turn-permission",
+  "parent-alignment-X",
+  "parent-alignment-Y",
+  "parenthesis-friends",
+  "parenthesis-id",
+  "parenthesized",
+  "pedal-text",
+  "pes-or-flexa",
+  "positioning-done",
+  "positions",
+  "prefer-dotted-right",
+  "prefix-set",
+  "primitive",
+  "protrusion",
+  "pure-Y-common",
+  "pure-Y-extent",
+  "pure-Y-offset-in-progress",
+  "pure-relevant-grobs",
+  "pure-relevant-items",
+  "pure-relevant-spanners",
+  "quantize-position",
+  "quantized-positions",
+  "quilisma",
+  "rank-on-page",
+  "ratio",
+  "remove-empty",
+  "remove-first",
+  "remove-layer",
+  "replacement-alist",
+  "rest",
+  "rest-collision",
+  "restore-first",
+  "rests",
+  "rhythmic-location",
+  "right-bound-info",
+  "right-items",
+  "right-neighbor",
+  "right-number-text",
+  "right-padding",
+  "rotation",
+  "round-up-exceptions",
+  "round-up-to-longer-rest",
+  "rounded",
+  "same-direction-correction",
+  "script-column",
+  "script-priority",
+  "script-stencil",
+  "scripts",
+  "segno-kern",
+  "self-alignment-X",
+  "self-alignment-Y",
+  "shape",
+  "sharp-positions",
+  "shorten",
+  "shorten-pair",
+  "shortest-duration-space",
+  "shortest-playing-duration",
+  "shortest-starter-duration",
+  "show-control-points",
+  "show-horizontal-skylines",
+  "show-vertical-skylines",
+  "side-axis",
+  "side-relative-direction",
+  "side-support-elements",
+  "size",
+  "skip-quanting",
+  "skyline-horizontal-padding",
+  "skyline-vertical-padding",
+  "slash-negative-kern",
+  "slope",
+  "slur",
+  "slur-padding",
+  "snap-radius",
+  "space-alist",
+  "space-increment",
+  "space-to-barline",
+  "spacing",
+  "spacing-increment",
+  "spacing-pair",
+  "spacing-wishes",
+  "span-start",
+  "spanner-broken",
+  "spanner-id",
+  "spanner-placement",
+  "springs-and-rods",
+  "stacking-dir",
+  "staff-affinity",
+  "staff-grouper",
+  "staff-padding",
+  "staff-position",
+  "staff-space",
+  "staff-staff-spacing",
+  "staff-symbol",
+  "staffgroup-staff-spacing",
+  "stem",
+  "stem-attachment",
+  "stem-begin-position",
+  "stem-info",
+  "stem-spacing-correction",
+  "stemlet-length",
+  "stems",
+  "stencil",
+  "stencils",
+  "sticky-host",
+  "strict-grace-spacing",
+  "strict-note-spacing",
+  "stroke-style",
+  "stropha",
+  "style",
+  "system-Y-offset",
+  "text",
+  "text-alignment-X",
+  "text-alignment-Y",
+  "text-direction",
+  "thick-thickness",
+  "thickness",
+  "tie",
+  "tie-configuration",
+  "ties",
+  "to-barline",
+  "toward-stem-shift",
+  "toward-stem-shift-in-column",
+  "transparent",
+  "tremolo-flag",
+  "tuplet-number",
+  "tuplet-slur",
+  "tuplet-start",
+  "tuplets",
+  "uniform-stretching",
+  "usable-duration-logs",
+  "use-skylines",
+  "used",
+  "vertical-alignment",
+  "vertical-skyline-elements",
+  "vertical-skylines",
+  "virga",
+  "visible-over-note-heads",
+  "voiced-position",
+  "when",
+  "whiteout",
+  "whiteout-style",
+  "widened-extent",
+  "width",
+  "woodwind-diagram-details",
+  "word-space",
+  "x-offset",
+  "zigzag-length",
+  "zigzag-width",
+]
+
+paper_variables = [
+  "auto-first-page-number",
+  "basic-distance",
+  "binding-offset",
+  "blank-last-page-penalty",
+  "blank-page-penalty",
+  "bookTitleMarkup",
+  "bottom-margin",
+  "check-consistency",
+  "evenFooterMarkup",
+  "evenHeaderMarkup",
+  "first-page-number",
+  "footnote-separator-markup",
+  "horizontal-shift",
+  "indent",
+  "inner-margin",
+  "last-bottom-spacing",
+  "left-margin",
+  "line-width",
+  "markup-markup-spacing",
+  "markup-system-spacing",
+  "max-systems-per-page",
+  "min-systems-per-page",
+  "minimum-distance",
+  "oddFooterMarkup",
+  "oddHeaderMarkup",
+  "outer-margin",
+  "padding",
+  "page-breaking",
+  "page-breaking-system-system-spacing",
+  "page-count",
+  "page-number-type",
+  "page-spacing-weight",
+  "paper-height",
+  "paper-width",
+  "print-all-headers",
+  "print-first-page-number",
+  "ragged-bottom",
+  "ragged-last",
+  "ragged-last-bottom",
+  "ragged-right",
+  "right-margin",
+  "score-markup-spacing",
+  "score-system-spacing",
+  "scoreTitleMarkup",
+  "short-indent",
+  "stretchability",
+  "system-count",
+  "system-separator-markup",
+  "system-system-spacing",
+  "systems-per-page",
+  "top-margin",
+  "top-markup-spacing",
+  "top-system-spacing",
+  "two-sided",
+]
+
+header_variables = [
+  "arranger",
+  "composer",
+  "copyright",
+  "dedication",
+  "doctitle",
+  "instrument",
+  "lsrtags",
+  "meter",
+  "opus",
+  "piece",
+  "poet",
+  "subsubtitle",
+  "subtitle",
+  "tagline",
+  "texidoc",
+  "title",
+]
+
diff --git a/.venv/Lib/site-packages/pygments/lexers/_lua_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_lua_builtins.py
new file mode 100644 (file)
index 0000000..e0977a0
--- /dev/null
@@ -0,0 +1,285 @@
+"""
+    pygments.lexers._lua_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file contains the names and modules of lua functions
+    It is able to re-generate itself, but for adding new functions you
+    probably have to add some callbacks (see function module_callbacks).
+
+    Do not edit the MODULES dict by hand.
+
+    Run with `python -I` to regenerate.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+MODULES = {'basic': ('_G',
+           '_VERSION',
+           'assert',
+           'collectgarbage',
+           'dofile',
+           'error',
+           'getmetatable',
+           'ipairs',
+           'load',
+           'loadfile',
+           'next',
+           'pairs',
+           'pcall',
+           'print',
+           'rawequal',
+           'rawget',
+           'rawlen',
+           'rawset',
+           'select',
+           'setmetatable',
+           'tonumber',
+           'tostring',
+           'type',
+           'warn',
+           'xpcall'),
+ 'bit32': ('bit32.arshift',
+           'bit32.band',
+           'bit32.bnot',
+           'bit32.bor',
+           'bit32.btest',
+           'bit32.bxor',
+           'bit32.extract',
+           'bit32.lrotate',
+           'bit32.lshift',
+           'bit32.replace',
+           'bit32.rrotate',
+           'bit32.rshift'),
+ 'coroutine': ('coroutine.close',
+               'coroutine.create',
+               'coroutine.isyieldable',
+               'coroutine.resume',
+               'coroutine.running',
+               'coroutine.status',
+               'coroutine.wrap',
+               'coroutine.yield'),
+ 'debug': ('debug.debug',
+           'debug.gethook',
+           'debug.getinfo',
+           'debug.getlocal',
+           'debug.getmetatable',
+           'debug.getregistry',
+           'debug.getupvalue',
+           'debug.getuservalue',
+           'debug.sethook',
+           'debug.setlocal',
+           'debug.setmetatable',
+           'debug.setupvalue',
+           'debug.setuservalue',
+           'debug.traceback',
+           'debug.upvalueid',
+           'debug.upvaluejoin'),
+ 'io': ('io.close',
+        'io.flush',
+        'io.input',
+        'io.lines',
+        'io.open',
+        'io.output',
+        'io.popen',
+        'io.read',
+        'io.stderr',
+        'io.stdin',
+        'io.stdout',
+        'io.tmpfile',
+        'io.type',
+        'io.write'),
+ 'math': ('math.abs',
+          'math.acos',
+          'math.asin',
+          'math.atan',
+          'math.atan2',
+          'math.ceil',
+          'math.cos',
+          'math.cosh',
+          'math.deg',
+          'math.exp',
+          'math.floor',
+          'math.fmod',
+          'math.frexp',
+          'math.huge',
+          'math.ldexp',
+          'math.log',
+          'math.max',
+          'math.maxinteger',
+          'math.min',
+          'math.mininteger',
+          'math.modf',
+          'math.pi',
+          'math.pow',
+          'math.rad',
+          'math.random',
+          'math.randomseed',
+          'math.sin',
+          'math.sinh',
+          'math.sqrt',
+          'math.tan',
+          'math.tanh',
+          'math.tointeger',
+          'math.type',
+          'math.ult'),
+ 'modules': ('package.config',
+             'package.cpath',
+             'package.loaded',
+             'package.loadlib',
+             'package.path',
+             'package.preload',
+             'package.searchers',
+             'package.searchpath',
+             'require'),
+ 'os': ('os.clock',
+        'os.date',
+        'os.difftime',
+        'os.execute',
+        'os.exit',
+        'os.getenv',
+        'os.remove',
+        'os.rename',
+        'os.setlocale',
+        'os.time',
+        'os.tmpname'),
+ 'string': ('string.byte',
+            'string.char',
+            'string.dump',
+            'string.find',
+            'string.format',
+            'string.gmatch',
+            'string.gsub',
+            'string.len',
+            'string.lower',
+            'string.match',
+            'string.pack',
+            'string.packsize',
+            'string.rep',
+            'string.reverse',
+            'string.sub',
+            'string.unpack',
+            'string.upper'),
+ 'table': ('table.concat',
+           'table.insert',
+           'table.move',
+           'table.pack',
+           'table.remove',
+           'table.sort',
+           'table.unpack'),
+ 'utf8': ('utf8.char',
+          'utf8.charpattern',
+          'utf8.codepoint',
+          'utf8.codes',
+          'utf8.len',
+          'utf8.offset')}
+
+if __name__ == '__main__':  # pragma: no cover
+    import re
+    from urllib.request import urlopen
+    import pprint
+
+    # you can't generally find out what module a function belongs to if you
+    # have only its name. Because of this, here are some callback functions
+    # that recognize if a gioven function belongs to a specific module
+    def module_callbacks():
+        def is_in_coroutine_module(name):
+            return name.startswith('coroutine.')
+
+        def is_in_modules_module(name):
+            if name in ['require', 'module'] or name.startswith('package'):
+                return True
+            else:
+                return False
+
+        def is_in_string_module(name):
+            return name.startswith('string.')
+
+        def is_in_table_module(name):
+            return name.startswith('table.')
+
+        def is_in_math_module(name):
+            return name.startswith('math')
+
+        def is_in_io_module(name):
+            return name.startswith('io.')
+
+        def is_in_os_module(name):
+            return name.startswith('os.')
+
+        def is_in_debug_module(name):
+            return name.startswith('debug.')
+
+        return {'coroutine': is_in_coroutine_module,
+                'modules': is_in_modules_module,
+                'string': is_in_string_module,
+                'table': is_in_table_module,
+                'math': is_in_math_module,
+                'io': is_in_io_module,
+                'os': is_in_os_module,
+                'debug': is_in_debug_module}
+
+
+
+    def get_newest_version():
+        f = urlopen('http://www.lua.org/manual/')
+        r = re.compile(r'^<A HREF="(\d\.\d)/">(Lua )?\1</A>')
+        for line in f:
+            m = r.match(line.decode('iso-8859-1'))
+            if m is not None:
+                return m.groups()[0]
+
+    def get_lua_functions(version):
+        f = urlopen(f'http://www.lua.org/manual/{version}/')
+        r = re.compile(r'^<A HREF="manual.html#pdf-(?!lua|LUA)([^:]+)">\1</A>')
+        functions = []
+        for line in f:
+            m = r.match(line.decode('iso-8859-1'))
+            if m is not None:
+                functions.append(m.groups()[0])
+        return functions
+
+    def get_function_module(name):
+        for mod, cb in module_callbacks().items():
+            if cb(name):
+                return mod
+        if '.' in name:
+            return name.split('.')[0]
+        else:
+            return 'basic'
+
+    def regenerate(filename, modules):
+        with open(filename, encoding='utf-8') as fp:
+            content = fp.read()
+
+        header = content[:content.find('MODULES = {')]
+        footer = content[content.find("if __name__ == '__main__':"):]
+
+
+        with open(filename, 'w', encoding='utf-8') as fp:
+            fp.write(header)
+            fp.write(f'MODULES = {pprint.pformat(modules)}\n\n')
+            fp.write(footer)
+
+    def run():
+        version = get_newest_version()
+        functions = set()
+        for v in ('5.2', version):
+            print(f'> Downloading function index for Lua {v}')
+            f = get_lua_functions(v)
+            print('> %d functions found, %d new:' %
+                  (len(f), len(set(f) - functions)))
+            functions |= set(f)
+
+        functions = sorted(functions)
+
+        modules = {}
+        for full_function_name in functions:
+            print(f'>> {full_function_name}')
+            m = get_function_module(full_function_name)
+            modules.setdefault(m, []).append(full_function_name)
+        modules = {k: tuple(v) for k, v in modules.items()}
+
+        regenerate(__file__, modules)
+
+    run()
diff --git a/.venv/Lib/site-packages/pygments/lexers/_luau_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_luau_builtins.py
new file mode 100644 (file)
index 0000000..9e06b07
--- /dev/null
@@ -0,0 +1,62 @@
+"""
+    pygments.lexers._luau_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Includes the builtins for Luau and Roblox.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+LUAU_BUILTINS = {
+       'bit32',
+       'buffer',
+       'coroutine',
+       'debug',
+       'math',
+       'os',
+       'string',
+       'table',
+       'utf8',
+}
+
+ROBLOX_BUILTINS = {
+       'task',
+
+       'Axes',
+       'BrickColor',
+       'CatalogSearchParams',
+       'CFrame',
+       'Color3',
+       'ColorSequence',
+       'ColorSequenceKeypoint',
+       'DateTime',
+       'DockWidgetPluginGuiInfo',
+       'Faces',
+       'FloatCurveKey',
+       'Font',
+       'Instance',
+       'NumberRange',
+       'NumberSequence',
+       'NumberSequenceKeypoint',
+       'OverlapParams',
+       'PathWaypoint',
+       'PhysicalProperties',
+       'Random',
+       'Ray',
+       'RaycastParams',
+       'RaycastResult',
+       'RBXScriptConnection',
+       'RBXScriptSignal',
+       'Rect',
+       'Region3',
+       'Region3int16',
+       'SharedTable',
+       'TweenInfo',
+       'UDim',
+       'UDim2',
+       'Vector2',
+       'Vector2int16',
+       'Vector3',
+       'Vector3int16',
+}
\ No newline at end of file
diff --git a/.venv/Lib/site-packages/pygments/lexers/_mapping.py b/.venv/Lib/site-packages/pygments/lexers/_mapping.py
new file mode 100644 (file)
index 0000000..cfc534d
--- /dev/null
@@ -0,0 +1,602 @@
+# Automatically generated by scripts/gen_mapfiles.py.
+# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead.
+
+LEXERS = {
+    'ABAPLexer': ('pygments.lexers.business', 'ABAP', ('abap',), ('*.abap', '*.ABAP'), ('text/x-abap',)),
+    'AMDGPULexer': ('pygments.lexers.amdgpu', 'AMDGPU', ('amdgpu',), ('*.isa',), ()),
+    'APLLexer': ('pygments.lexers.apl', 'APL', ('apl',), ('*.apl', '*.aplf', '*.aplo', '*.apln', '*.aplc', '*.apli', '*.dyalog'), ()),
+    'AbnfLexer': ('pygments.lexers.grammar_notation', 'ABNF', ('abnf',), ('*.abnf',), ('text/x-abnf',)),
+    'ActionScript3Lexer': ('pygments.lexers.actionscript', 'ActionScript 3', ('actionscript3', 'as3'), ('*.as',), ('application/x-actionscript3', 'text/x-actionscript3', 'text/actionscript3')),
+    'ActionScriptLexer': ('pygments.lexers.actionscript', 'ActionScript', ('actionscript', 'as'), ('*.as',), ('application/x-actionscript', 'text/x-actionscript', 'text/actionscript')),
+    'AdaLexer': ('pygments.lexers.ada', 'Ada', ('ada', 'ada95', 'ada2005'), ('*.adb', '*.ads', '*.ada'), ('text/x-ada',)),
+    'AdlLexer': ('pygments.lexers.archetype', 'ADL', ('adl',), ('*.adl', '*.adls', '*.adlf', '*.adlx'), ()),
+    'AgdaLexer': ('pygments.lexers.haskell', 'Agda', ('agda',), ('*.agda',), ('text/x-agda',)),
+    'AheuiLexer': ('pygments.lexers.esoteric', 'Aheui', ('aheui',), ('*.aheui',), ()),
+    'AlloyLexer': ('pygments.lexers.dsls', 'Alloy', ('alloy',), ('*.als',), ('text/x-alloy',)),
+    'AmbientTalkLexer': ('pygments.lexers.ambient', 'AmbientTalk', ('ambienttalk', 'ambienttalk/2', 'at'), ('*.at',), ('text/x-ambienttalk',)),
+    'AmplLexer': ('pygments.lexers.ampl', 'Ampl', ('ampl',), ('*.run',), ()),
+    'Angular2HtmlLexer': ('pygments.lexers.templates', 'HTML + Angular2', ('html+ng2',), ('*.ng2',), ()),
+    'Angular2Lexer': ('pygments.lexers.templates', 'Angular2', ('ng2',), (), ()),
+    'AntlrActionScriptLexer': ('pygments.lexers.parsers', 'ANTLR With ActionScript Target', ('antlr-actionscript', 'antlr-as'), ('*.G', '*.g'), ()),
+    'AntlrCSharpLexer': ('pygments.lexers.parsers', 'ANTLR With C# Target', ('antlr-csharp', 'antlr-c#'), ('*.G', '*.g'), ()),
+    'AntlrCppLexer': ('pygments.lexers.parsers', 'ANTLR With CPP Target', ('antlr-cpp',), ('*.G', '*.g'), ()),
+    'AntlrJavaLexer': ('pygments.lexers.parsers', 'ANTLR With Java Target', ('antlr-java',), ('*.G', '*.g'), ()),
+    'AntlrLexer': ('pygments.lexers.parsers', 'ANTLR', ('antlr',), (), ()),
+    'AntlrObjectiveCLexer': ('pygments.lexers.parsers', 'ANTLR With ObjectiveC Target', ('antlr-objc',), ('*.G', '*.g'), ()),
+    'AntlrPerlLexer': ('pygments.lexers.parsers', 'ANTLR With Perl Target', ('antlr-perl',), ('*.G', '*.g'), ()),
+    'AntlrPythonLexer': ('pygments.lexers.parsers', 'ANTLR With Python Target', ('antlr-python',), ('*.G', '*.g'), ()),
+    'AntlrRubyLexer': ('pygments.lexers.parsers', 'ANTLR With Ruby Target', ('antlr-ruby', 'antlr-rb'), ('*.G', '*.g'), ()),
+    'ApacheConfLexer': ('pygments.lexers.configs', 'ApacheConf', ('apacheconf', 'aconf', 'apache'), ('.htaccess', 'apache.conf', 'apache2.conf'), ('text/x-apacheconf',)),
+    'AppleScriptLexer': ('pygments.lexers.scripting', 'AppleScript', ('applescript',), ('*.applescript',), ()),
+    'ArduinoLexer': ('pygments.lexers.c_like', 'Arduino', ('arduino',), ('*.ino',), ('text/x-arduino',)),
+    'ArrowLexer': ('pygments.lexers.arrow', 'Arrow', ('arrow',), ('*.arw',), ()),
+    'ArturoLexer': ('pygments.lexers.arturo', 'Arturo', ('arturo', 'art'), ('*.art',), ()),
+    'AscLexer': ('pygments.lexers.asc', 'ASCII armored', ('asc', 'pem'), ('*.asc', '*.pem', 'id_dsa', 'id_ecdsa', 'id_ecdsa_sk', 'id_ed25519', 'id_ed25519_sk', 'id_rsa'), ('application/pgp-keys', 'application/pgp-encrypted', 'application/pgp-signature', 'application/pem-certificate-chain')),
+    'Asn1Lexer': ('pygments.lexers.asn1', 'ASN.1', ('asn1',), ('*.asn1',), ()),
+    'AspectJLexer': ('pygments.lexers.jvm', 'AspectJ', ('aspectj',), ('*.aj',), ('text/x-aspectj',)),
+    'AsymptoteLexer': ('pygments.lexers.graphics', 'Asymptote', ('asymptote', 'asy'), ('*.asy',), ('text/x-asymptote',)),
+    'AugeasLexer': ('pygments.lexers.configs', 'Augeas', ('augeas',), ('*.aug',), ()),
+    'AutoItLexer': ('pygments.lexers.automation', 'AutoIt', ('autoit',), ('*.au3',), ('text/x-autoit',)),
+    'AutohotkeyLexer': ('pygments.lexers.automation', 'autohotkey', ('autohotkey', 'ahk'), ('*.ahk', '*.ahkl'), ('text/x-autohotkey',)),
+    'AwkLexer': ('pygments.lexers.textedit', 'Awk', ('awk', 'gawk', 'mawk', 'nawk'), ('*.awk',), ('application/x-awk',)),
+    'BBCBasicLexer': ('pygments.lexers.basic', 'BBC Basic', ('bbcbasic',), ('*.bbc',), ()),
+    'BBCodeLexer': ('pygments.lexers.markup', 'BBCode', ('bbcode',), (), ('text/x-bbcode',)),
+    'BCLexer': ('pygments.lexers.algebra', 'BC', ('bc',), ('*.bc',), ()),
+    'BQNLexer': ('pygments.lexers.bqn', 'BQN', ('bqn',), ('*.bqn',), ()),
+    'BSTLexer': ('pygments.lexers.bibtex', 'BST', ('bst', 'bst-pybtex'), ('*.bst',), ()),
+    'BareLexer': ('pygments.lexers.bare', 'BARE', ('bare',), ('*.bare',), ()),
+    'BaseMakefileLexer': ('pygments.lexers.make', 'Base Makefile', ('basemake',), (), ()),
+    'BashLexer': ('pygments.lexers.shell', 'Bash', ('bash', 'sh', 'ksh', 'zsh', 'shell', 'openrc'), ('*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass', '*.exheres-0', '*.exlib', '*.zsh', '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc', '.kshrc', 'kshrc', 'PKGBUILD'), ('application/x-sh', 'application/x-shellscript', 'text/x-shellscript')),
+    'BashSessionLexer': ('pygments.lexers.shell', 'Bash Session', ('console', 'shell-session'), ('*.sh-session', '*.shell-session'), ('application/x-shell-session', 'application/x-sh-session')),
+    'BatchLexer': ('pygments.lexers.shell', 'Batchfile', ('batch', 'bat', 'dosbatch', 'winbatch'), ('*.bat', '*.cmd'), ('application/x-dos-batch',)),
+    'BddLexer': ('pygments.lexers.bdd', 'Bdd', ('bdd',), ('*.feature',), ('text/x-bdd',)),
+    'BefungeLexer': ('pygments.lexers.esoteric', 'Befunge', ('befunge',), ('*.befunge',), ('application/x-befunge',)),
+    'BerryLexer': ('pygments.lexers.berry', 'Berry', ('berry', 'be'), ('*.be',), ('text/x-berry', 'application/x-berry')),
+    'BibTeXLexer': ('pygments.lexers.bibtex', 'BibTeX', ('bibtex', 'bib'), ('*.bib',), ('text/x-bibtex',)),
+    'BlitzBasicLexer': ('pygments.lexers.basic', 'BlitzBasic', ('blitzbasic', 'b3d', 'bplus'), ('*.bb', '*.decls'), ('text/x-bb',)),
+    'BlitzMaxLexer': ('pygments.lexers.basic', 'BlitzMax', ('blitzmax', 'bmax'), ('*.bmx',), ('text/x-bmx',)),
+    'BlueprintLexer': ('pygments.lexers.blueprint', 'Blueprint', ('blueprint',), ('*.blp',), ('text/x-blueprint',)),
+    'BnfLexer': ('pygments.lexers.grammar_notation', 'BNF', ('bnf',), ('*.bnf',), ('text/x-bnf',)),
+    'BoaLexer': ('pygments.lexers.boa', 'Boa', ('boa',), ('*.boa',), ()),
+    'BooLexer': ('pygments.lexers.dotnet', 'Boo', ('boo',), ('*.boo',), ('text/x-boo',)),
+    'BoogieLexer': ('pygments.lexers.verification', 'Boogie', ('boogie',), ('*.bpl',), ()),
+    'BrainfuckLexer': ('pygments.lexers.esoteric', 'Brainfuck', ('brainfuck', 'bf'), ('*.bf', '*.b'), ('application/x-brainfuck',)),
+    'BugsLexer': ('pygments.lexers.modeling', 'BUGS', ('bugs', 'winbugs', 'openbugs'), ('*.bug',), ()),
+    'CAmkESLexer': ('pygments.lexers.esoteric', 'CAmkES', ('camkes', 'idl4'), ('*.camkes', '*.idl4'), ()),
+    'CLexer': ('pygments.lexers.c_cpp', 'C', ('c',), ('*.c', '*.h', '*.idc', '*.x[bp]m'), ('text/x-chdr', 'text/x-csrc', 'image/x-xbitmap', 'image/x-xpixmap')),
+    'CMakeLexer': ('pygments.lexers.make', 'CMake', ('cmake',), ('*.cmake', 'CMakeLists.txt'), ('text/x-cmake',)),
+    'CObjdumpLexer': ('pygments.lexers.asm', 'c-objdump', ('c-objdump',), ('*.c-objdump',), ('text/x-c-objdump',)),
+    'CPSALexer': ('pygments.lexers.lisp', 'CPSA', ('cpsa',), ('*.cpsa',), ()),
+    'CSSUL4Lexer': ('pygments.lexers.ul4', 'CSS+UL4', ('css+ul4',), ('*.cssul4',), ()),
+    'CSharpAspxLexer': ('pygments.lexers.dotnet', 'aspx-cs', ('aspx-cs',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()),
+    'CSharpLexer': ('pygments.lexers.dotnet', 'C#', ('csharp', 'c#', 'cs'), ('*.cs',), ('text/x-csharp',)),
+    'Ca65Lexer': ('pygments.lexers.asm', 'ca65 assembler', ('ca65',), ('*.s',), ()),
+    'CadlLexer': ('pygments.lexers.archetype', 'cADL', ('cadl',), ('*.cadl',), ()),
+    'CapDLLexer': ('pygments.lexers.esoteric', 'CapDL', ('capdl',), ('*.cdl',), ()),
+    'CapnProtoLexer': ('pygments.lexers.capnproto', "Cap'n Proto", ('capnp',), ('*.capnp',), ()),
+    'CarbonLexer': ('pygments.lexers.carbon', 'Carbon', ('carbon',), ('*.carbon',), ('text/x-carbon',)),
+    'CbmBasicV2Lexer': ('pygments.lexers.basic', 'CBM BASIC V2', ('cbmbas',), ('*.bas',), ()),
+    'CddlLexer': ('pygments.lexers.cddl', 'CDDL', ('cddl',), ('*.cddl',), ('text/x-cddl',)),
+    'CeylonLexer': ('pygments.lexers.jvm', 'Ceylon', ('ceylon',), ('*.ceylon',), ('text/x-ceylon',)),
+    'Cfengine3Lexer': ('pygments.lexers.configs', 'CFEngine3', ('cfengine3', 'cf3'), ('*.cf',), ()),
+    'ChaiscriptLexer': ('pygments.lexers.scripting', 'ChaiScript', ('chaiscript', 'chai'), ('*.chai',), ('text/x-chaiscript', 'application/x-chaiscript')),
+    'ChapelLexer': ('pygments.lexers.chapel', 'Chapel', ('chapel', 'chpl'), ('*.chpl',), ()),
+    'CharmciLexer': ('pygments.lexers.c_like', 'Charmci', ('charmci',), ('*.ci',), ()),
+    'CheetahHtmlLexer': ('pygments.lexers.templates', 'HTML+Cheetah', ('html+cheetah', 'html+spitfire', 'htmlcheetah'), (), ('text/html+cheetah', 'text/html+spitfire')),
+    'CheetahJavascriptLexer': ('pygments.lexers.templates', 'JavaScript+Cheetah', ('javascript+cheetah', 'js+cheetah', 'javascript+spitfire', 'js+spitfire'), (), ('application/x-javascript+cheetah', 'text/x-javascript+cheetah', 'text/javascript+cheetah', 'application/x-javascript+spitfire', 'text/x-javascript+spitfire', 'text/javascript+spitfire')),
+    'CheetahLexer': ('pygments.lexers.templates', 'Cheetah', ('cheetah', 'spitfire'), ('*.tmpl', '*.spt'), ('application/x-cheetah', 'application/x-spitfire')),
+    'CheetahXmlLexer': ('pygments.lexers.templates', 'XML+Cheetah', ('xml+cheetah', 'xml+spitfire'), (), ('application/xml+cheetah', 'application/xml+spitfire')),
+    'CirruLexer': ('pygments.lexers.webmisc', 'Cirru', ('cirru',), ('*.cirru',), ('text/x-cirru',)),
+    'ClayLexer': ('pygments.lexers.c_like', 'Clay', ('clay',), ('*.clay',), ('text/x-clay',)),
+    'CleanLexer': ('pygments.lexers.clean', 'Clean', ('clean',), ('*.icl', '*.dcl'), ()),
+    'ClojureLexer': ('pygments.lexers.jvm', 'Clojure', ('clojure', 'clj'), ('*.clj', '*.cljc'), ('text/x-clojure', 'application/x-clojure')),
+    'ClojureScriptLexer': ('pygments.lexers.jvm', 'ClojureScript', ('clojurescript', 'cljs'), ('*.cljs',), ('text/x-clojurescript', 'application/x-clojurescript')),
+    'CobolFreeformatLexer': ('pygments.lexers.business', 'COBOLFree', ('cobolfree',), ('*.cbl', '*.CBL'), ()),
+    'CobolLexer': ('pygments.lexers.business', 'COBOL', ('cobol',), ('*.cob', '*.COB', '*.cpy', '*.CPY'), ('text/x-cobol',)),
+    'CodeQLLexer': ('pygments.lexers.codeql', 'CodeQL', ('codeql', 'ql'), ('*.ql', '*.qll'), ()),
+    'CoffeeScriptLexer': ('pygments.lexers.javascript', 'CoffeeScript', ('coffeescript', 'coffee-script', 'coffee'), ('*.coffee',), ('text/coffeescript',)),
+    'ColdfusionCFCLexer': ('pygments.lexers.templates', 'Coldfusion CFC', ('cfc',), ('*.cfc',), ()),
+    'ColdfusionHtmlLexer': ('pygments.lexers.templates', 'Coldfusion HTML', ('cfm',), ('*.cfm', '*.cfml'), ('application/x-coldfusion',)),
+    'ColdfusionLexer': ('pygments.lexers.templates', 'cfstatement', ('cfs',), (), ()),
+    'Comal80Lexer': ('pygments.lexers.comal', 'COMAL-80', ('comal', 'comal80'), ('*.cml', '*.comal'), ()),
+    'CommonLispLexer': ('pygments.lexers.lisp', 'Common Lisp', ('common-lisp', 'cl', 'lisp'), ('*.cl', '*.lisp'), ('text/x-common-lisp',)),
+    'ComponentPascalLexer': ('pygments.lexers.oberon', 'Component Pascal', ('componentpascal', 'cp'), ('*.cp', '*.cps'), ('text/x-component-pascal',)),
+    'CoqLexer': ('pygments.lexers.theorem', 'Coq', ('coq',), ('*.v',), ('text/x-coq',)),
+    'CplintLexer': ('pygments.lexers.cplint', 'cplint', ('cplint',), ('*.ecl', '*.prolog', '*.pro', '*.pl', '*.P', '*.lpad', '*.cpl'), ('text/x-cplint',)),
+    'CppLexer': ('pygments.lexers.c_cpp', 'C++', ('cpp', 'c++'), ('*.cpp', '*.hpp', '*.c++', '*.h++', '*.cc', '*.hh', '*.cxx', '*.hxx', '*.C', '*.H', '*.cp', '*.CPP', '*.tpp'), ('text/x-c++hdr', 'text/x-c++src')),
+    'CppObjdumpLexer': ('pygments.lexers.asm', 'cpp-objdump', ('cpp-objdump', 'c++-objdumb', 'cxx-objdump'), ('*.cpp-objdump', '*.c++-objdump', '*.cxx-objdump'), ('text/x-cpp-objdump',)),
+    'CrmshLexer': ('pygments.lexers.dsls', 'Crmsh', ('crmsh', 'pcmk'), ('*.crmsh', '*.pcmk'), ()),
+    'CrocLexer': ('pygments.lexers.d', 'Croc', ('croc',), ('*.croc',), ('text/x-crocsrc',)),
+    'CryptolLexer': ('pygments.lexers.haskell', 'Cryptol', ('cryptol', 'cry'), ('*.cry',), ('text/x-cryptol',)),
+    'CrystalLexer': ('pygments.lexers.crystal', 'Crystal', ('cr', 'crystal'), ('*.cr',), ('text/x-crystal',)),
+    'CsoundDocumentLexer': ('pygments.lexers.csound', 'Csound Document', ('csound-document', 'csound-csd'), ('*.csd',), ()),
+    'CsoundOrchestraLexer': ('pygments.lexers.csound', 'Csound Orchestra', ('csound', 'csound-orc'), ('*.orc', '*.udo'), ()),
+    'CsoundScoreLexer': ('pygments.lexers.csound', 'Csound Score', ('csound-score', 'csound-sco'), ('*.sco',), ()),
+    'CssDjangoLexer': ('pygments.lexers.templates', 'CSS+Django/Jinja', ('css+django', 'css+jinja'), ('*.css.j2', '*.css.jinja2'), ('text/css+django', 'text/css+jinja')),
+    'CssErbLexer': ('pygments.lexers.templates', 'CSS+Ruby', ('css+ruby', 'css+erb'), (), ('text/css+ruby',)),
+    'CssGenshiLexer': ('pygments.lexers.templates', 'CSS+Genshi Text', ('css+genshitext', 'css+genshi'), (), ('text/css+genshi',)),
+    'CssLexer': ('pygments.lexers.css', 'CSS', ('css',), ('*.css',), ('text/css',)),
+    'CssPhpLexer': ('pygments.lexers.templates', 'CSS+PHP', ('css+php',), (), ('text/css+php',)),
+    'CssSmartyLexer': ('pygments.lexers.templates', 'CSS+Smarty', ('css+smarty',), (), ('text/css+smarty',)),
+    'CudaLexer': ('pygments.lexers.c_like', 'CUDA', ('cuda', 'cu'), ('*.cu', '*.cuh'), ('text/x-cuda',)),
+    'CypherLexer': ('pygments.lexers.graph', 'Cypher', ('cypher',), ('*.cyp', '*.cypher'), ()),
+    'CythonLexer': ('pygments.lexers.python', 'Cython', ('cython', 'pyx', 'pyrex'), ('*.pyx', '*.pxd', '*.pxi'), ('text/x-cython', 'application/x-cython')),
+    'DLexer': ('pygments.lexers.d', 'D', ('d',), ('*.d', '*.di'), ('text/x-dsrc',)),
+    'DObjdumpLexer': ('pygments.lexers.asm', 'd-objdump', ('d-objdump',), ('*.d-objdump',), ('text/x-d-objdump',)),
+    'DarcsPatchLexer': ('pygments.lexers.diff', 'Darcs Patch', ('dpatch',), ('*.dpatch', '*.darcspatch'), ()),
+    'DartLexer': ('pygments.lexers.javascript', 'Dart', ('dart',), ('*.dart',), ('text/x-dart',)),
+    'Dasm16Lexer': ('pygments.lexers.asm', 'DASM16', ('dasm16',), ('*.dasm16', '*.dasm'), ('text/x-dasm16',)),
+    'DaxLexer': ('pygments.lexers.dax', 'Dax', ('dax',), ('*.dax',), ()),
+    'DebianControlLexer': ('pygments.lexers.installers', 'Debian Control file', ('debcontrol', 'control'), ('control',), ()),
+    'DebianSourcesLexer': ('pygments.lexers.installers', 'Debian Sources file', ('debian.sources',), ('*.sources',), ()),
+    'DelphiLexer': ('pygments.lexers.pascal', 'Delphi', ('delphi', 'pas', 'pascal', 'objectpascal'), ('*.pas', '*.dpr'), ('text/x-pascal',)),
+    'DesktopLexer': ('pygments.lexers.configs', 'Desktop file', ('desktop',), ('*.desktop',), ('application/x-desktop',)),
+    'DevicetreeLexer': ('pygments.lexers.devicetree', 'Devicetree', ('devicetree', 'dts'), ('*.dts', '*.dtsi'), ('text/x-c',)),
+    'DgLexer': ('pygments.lexers.python', 'dg', ('dg',), ('*.dg',), ('text/x-dg',)),
+    'DiffLexer': ('pygments.lexers.diff', 'Diff', ('diff', 'udiff'), ('*.diff', '*.patch'), ('text/x-diff', 'text/x-patch')),
+    'DjangoLexer': ('pygments.lexers.templates', 'Django/Jinja', ('django', 'jinja'), (), ('application/x-django-templating', 'application/x-jinja')),
+    'DnsZoneLexer': ('pygments.lexers.dns', 'Zone', ('zone',), ('*.zone',), ('text/dns',)),
+    'DockerLexer': ('pygments.lexers.configs', 'Docker', ('docker', 'dockerfile'), ('Dockerfile', '*.docker'), ('text/x-dockerfile-config',)),
+    'DtdLexer': ('pygments.lexers.html', 'DTD', ('dtd',), ('*.dtd',), ('application/xml-dtd',)),
+    'DuelLexer': ('pygments.lexers.webmisc', 'Duel', ('duel', 'jbst', 'jsonml+bst'), ('*.duel', '*.jbst'), ('text/x-duel', 'text/x-jbst')),
+    'DylanConsoleLexer': ('pygments.lexers.dylan', 'Dylan session', ('dylan-console', 'dylan-repl'), ('*.dylan-console',), ('text/x-dylan-console',)),
+    'DylanLexer': ('pygments.lexers.dylan', 'Dylan', ('dylan',), ('*.dylan', '*.dyl', '*.intr'), ('text/x-dylan',)),
+    'DylanLidLexer': ('pygments.lexers.dylan', 'DylanLID', ('dylan-lid', 'lid'), ('*.lid', '*.hdp'), ('text/x-dylan-lid',)),
+    'ECLLexer': ('pygments.lexers.ecl', 'ECL', ('ecl',), ('*.ecl',), ('application/x-ecl',)),
+    'ECLexer': ('pygments.lexers.c_like', 'eC', ('ec',), ('*.ec', '*.eh'), ('text/x-echdr', 'text/x-ecsrc')),
+    'EarlGreyLexer': ('pygments.lexers.javascript', 'Earl Grey', ('earl-grey', 'earlgrey', 'eg'), ('*.eg',), ('text/x-earl-grey',)),
+    'EasytrieveLexer': ('pygments.lexers.scripting', 'Easytrieve', ('easytrieve',), ('*.ezt', '*.mac'), ('text/x-easytrieve',)),
+    'EbnfLexer': ('pygments.lexers.parsers', 'EBNF', ('ebnf',), ('*.ebnf',), ('text/x-ebnf',)),
+    'EiffelLexer': ('pygments.lexers.eiffel', 'Eiffel', ('eiffel',), ('*.e',), ('text/x-eiffel',)),
+    'ElixirConsoleLexer': ('pygments.lexers.erlang', 'Elixir iex session', ('iex',), (), ('text/x-elixir-shellsession',)),
+    'ElixirLexer': ('pygments.lexers.erlang', 'Elixir', ('elixir', 'ex', 'exs'), ('*.ex', '*.eex', '*.exs', '*.leex'), ('text/x-elixir',)),
+    'ElmLexer': ('pygments.lexers.elm', 'Elm', ('elm',), ('*.elm',), ('text/x-elm',)),
+    'ElpiLexer': ('pygments.lexers.elpi', 'Elpi', ('elpi',), ('*.elpi',), ('text/x-elpi',)),
+    'EmacsLispLexer': ('pygments.lexers.lisp', 'EmacsLisp', ('emacs-lisp', 'elisp', 'emacs'), ('*.el',), ('text/x-elisp', 'application/x-elisp')),
+    'EmailLexer': ('pygments.lexers.email', 'E-mail', ('email', 'eml'), ('*.eml',), ('message/rfc822',)),
+    'ErbLexer': ('pygments.lexers.templates', 'ERB', ('erb',), (), ('application/x-ruby-templating',)),
+    'ErlangLexer': ('pygments.lexers.erlang', 'Erlang', ('erlang',), ('*.erl', '*.hrl', '*.es', '*.escript'), ('text/x-erlang',)),
+    'ErlangShellLexer': ('pygments.lexers.erlang', 'Erlang erl session', ('erl',), ('*.erl-sh',), ('text/x-erl-shellsession',)),
+    'EvoqueHtmlLexer': ('pygments.lexers.templates', 'HTML+Evoque', ('html+evoque',), (), ('text/html+evoque',)),
+    'EvoqueLexer': ('pygments.lexers.templates', 'Evoque', ('evoque',), ('*.evoque',), ('application/x-evoque',)),
+    'EvoqueXmlLexer': ('pygments.lexers.templates', 'XML+Evoque', ('xml+evoque',), (), ('application/xml+evoque',)),
+    'ExeclineLexer': ('pygments.lexers.shell', 'execline', ('execline',), ('*.exec',), ()),
+    'EzhilLexer': ('pygments.lexers.ezhil', 'Ezhil', ('ezhil',), ('*.n',), ('text/x-ezhil',)),
+    'FSharpLexer': ('pygments.lexers.dotnet', 'F#', ('fsharp', 'f#'), ('*.fs', '*.fsi', '*.fsx'), ('text/x-fsharp',)),
+    'FStarLexer': ('pygments.lexers.ml', 'FStar', ('fstar',), ('*.fst', '*.fsti'), ('text/x-fstar',)),
+    'FactorLexer': ('pygments.lexers.factor', 'Factor', ('factor',), ('*.factor',), ('text/x-factor',)),
+    'FancyLexer': ('pygments.lexers.ruby', 'Fancy', ('fancy', 'fy'), ('*.fy', '*.fancypack'), ('text/x-fancysrc',)),
+    'FantomLexer': ('pygments.lexers.fantom', 'Fantom', ('fan',), ('*.fan',), ('application/x-fantom',)),
+    'FelixLexer': ('pygments.lexers.felix', 'Felix', ('felix', 'flx'), ('*.flx', '*.flxh'), ('text/x-felix',)),
+    'FennelLexer': ('pygments.lexers.lisp', 'Fennel', ('fennel', 'fnl'), ('*.fnl',), ()),
+    'FiftLexer': ('pygments.lexers.fift', 'Fift', ('fift', 'fif'), ('*.fif',), ()),
+    'FishShellLexer': ('pygments.lexers.shell', 'Fish', ('fish', 'fishshell'), ('*.fish', '*.load'), ('application/x-fish',)),
+    'FlatlineLexer': ('pygments.lexers.dsls', 'Flatline', ('flatline',), (), ('text/x-flatline',)),
+    'FloScriptLexer': ('pygments.lexers.floscript', 'FloScript', ('floscript', 'flo'), ('*.flo',), ()),
+    'ForthLexer': ('pygments.lexers.forth', 'Forth', ('forth',), ('*.frt', '*.fs'), ('application/x-forth',)),
+    'FortranFixedLexer': ('pygments.lexers.fortran', 'FortranFixed', ('fortranfixed',), ('*.f', '*.F'), ()),
+    'FortranLexer': ('pygments.lexers.fortran', 'Fortran', ('fortran', 'f90'), ('*.f03', '*.f90', '*.F03', '*.F90'), ('text/x-fortran',)),
+    'FoxProLexer': ('pygments.lexers.foxpro', 'FoxPro', ('foxpro', 'vfp', 'clipper', 'xbase'), ('*.PRG', '*.prg'), ()),
+    'FreeFemLexer': ('pygments.lexers.freefem', 'Freefem', ('freefem',), ('*.edp',), ('text/x-freefem',)),
+    'FuncLexer': ('pygments.lexers.func', 'FunC', ('func', 'fc'), ('*.fc', '*.func'), ()),
+    'FutharkLexer': ('pygments.lexers.futhark', 'Futhark', ('futhark',), ('*.fut',), ('text/x-futhark',)),
+    'GAPConsoleLexer': ('pygments.lexers.algebra', 'GAP session', ('gap-console', 'gap-repl'), ('*.tst',), ()),
+    'GAPLexer': ('pygments.lexers.algebra', 'GAP', ('gap',), ('*.g', '*.gd', '*.gi', '*.gap'), ()),
+    'GDScriptLexer': ('pygments.lexers.gdscript', 'GDScript', ('gdscript', 'gd'), ('*.gd',), ('text/x-gdscript', 'application/x-gdscript')),
+    'GLShaderLexer': ('pygments.lexers.graphics', 'GLSL', ('glsl',), ('*.vert', '*.frag', '*.geo'), ('text/x-glslsrc',)),
+    'GSQLLexer': ('pygments.lexers.gsql', 'GSQL', ('gsql',), ('*.gsql',), ()),
+    'GasLexer': ('pygments.lexers.asm', 'GAS', ('gas', 'asm'), ('*.s', '*.S'), ('text/x-gas',)),
+    'GcodeLexer': ('pygments.lexers.gcodelexer', 'g-code', ('gcode',), ('*.gcode',), ()),
+    'GenshiLexer': ('pygments.lexers.templates', 'Genshi', ('genshi', 'kid', 'xml+genshi', 'xml+kid'), ('*.kid',), ('application/x-genshi', 'application/x-kid')),
+    'GenshiTextLexer': ('pygments.lexers.templates', 'Genshi Text', ('genshitext',), (), ('application/x-genshi-text', 'text/x-genshi')),
+    'GettextLexer': ('pygments.lexers.textfmts', 'Gettext Catalog', ('pot', 'po'), ('*.pot', '*.po'), ('application/x-gettext', 'text/x-gettext', 'text/gettext')),
+    'GherkinLexer': ('pygments.lexers.testing', 'Gherkin', ('gherkin', 'cucumber'), ('*.feature',), ('text/x-gherkin',)),
+    'GleamLexer': ('pygments.lexers.gleam', 'Gleam', ('gleam',), ('*.gleam',), ('text/x-gleam',)),
+    'GnuplotLexer': ('pygments.lexers.graphics', 'Gnuplot', ('gnuplot',), ('*.plot', '*.plt'), ('text/x-gnuplot',)),
+    'GoLexer': ('pygments.lexers.go', 'Go', ('go', 'golang'), ('*.go',), ('text/x-gosrc',)),
+    'GoloLexer': ('pygments.lexers.jvm', 'Golo', ('golo',), ('*.golo',), ()),
+    'GoodDataCLLexer': ('pygments.lexers.business', 'GoodData-CL', ('gooddata-cl',), ('*.gdc',), ('text/x-gooddata-cl',)),
+    'GoogleSqlLexer': ('pygments.lexers.sql', 'GoogleSQL', ('googlesql', 'zetasql'), ('*.googlesql', '*.googlesql.sql'), ('text/x-google-sql', 'text/x-google-sql-aux')),
+    'GosuLexer': ('pygments.lexers.jvm', 'Gosu', ('gosu',), ('*.gs', '*.gsx', '*.gsp', '*.vark'), ('text/x-gosu',)),
+    'GosuTemplateLexer': ('pygments.lexers.jvm', 'Gosu Template', ('gst',), ('*.gst',), ('text/x-gosu-template',)),
+    'GraphQLLexer': ('pygments.lexers.graphql', 'GraphQL', ('graphql',), ('*.graphql',), ()),
+    'GraphvizLexer': ('pygments.lexers.graphviz', 'Graphviz', ('graphviz', 'dot'), ('*.gv', '*.dot'), ('text/x-graphviz', 'text/vnd.graphviz')),
+    'GroffLexer': ('pygments.lexers.markup', 'Groff', ('groff', 'nroff', 'man'), ('*.[1-9]', '*.man', '*.1p', '*.3pm'), ('application/x-troff', 'text/troff')),
+    'GroovyLexer': ('pygments.lexers.jvm', 'Groovy', ('groovy',), ('*.groovy', '*.gradle'), ('text/x-groovy',)),
+    'HLSLShaderLexer': ('pygments.lexers.graphics', 'HLSL', ('hlsl',), ('*.hlsl', '*.hlsli'), ('text/x-hlsl',)),
+    'HTMLUL4Lexer': ('pygments.lexers.ul4', 'HTML+UL4', ('html+ul4',), ('*.htmlul4',), ()),
+    'HamlLexer': ('pygments.lexers.html', 'Haml', ('haml',), ('*.haml',), ('text/x-haml',)),
+    'HandlebarsHtmlLexer': ('pygments.lexers.templates', 'HTML+Handlebars', ('html+handlebars',), ('*.handlebars', '*.hbs'), ('text/html+handlebars', 'text/x-handlebars-template')),
+    'HandlebarsLexer': ('pygments.lexers.templates', 'Handlebars', ('handlebars',), (), ()),
+    'HareLexer': ('pygments.lexers.hare', 'Hare', ('hare',), ('*.ha',), ('text/x-hare',)),
+    'HaskellLexer': ('pygments.lexers.haskell', 'Haskell', ('haskell', 'hs'), ('*.hs',), ('text/x-haskell',)),
+    'HaxeLexer': ('pygments.lexers.haxe', 'Haxe', ('haxe', 'hxsl', 'hx'), ('*.hx', '*.hxsl'), ('text/haxe', 'text/x-haxe', 'text/x-hx')),
+    'HexdumpLexer': ('pygments.lexers.hexdump', 'Hexdump', ('hexdump',), (), ()),
+    'HsailLexer': ('pygments.lexers.asm', 'HSAIL', ('hsail', 'hsa'), ('*.hsail',), ('text/x-hsail',)),
+    'HspecLexer': ('pygments.lexers.haskell', 'Hspec', ('hspec',), ('*Spec.hs',), ()),
+    'HtmlDjangoLexer': ('pygments.lexers.templates', 'HTML+Django/Jinja', ('html+django', 'html+jinja', 'htmldjango'), ('*.html.j2', '*.htm.j2', '*.xhtml.j2', '*.html.jinja2', '*.htm.jinja2', '*.xhtml.jinja2'), ('text/html+django', 'text/html+jinja')),
+    'HtmlGenshiLexer': ('pygments.lexers.templates', 'HTML+Genshi', ('html+genshi', 'html+kid'), (), ('text/html+genshi',)),
+    'HtmlLexer': ('pygments.lexers.html', 'HTML', ('html',), ('*.html', '*.htm', '*.xhtml', '*.xslt'), ('text/html', 'application/xhtml+xml')),
+    'HtmlPhpLexer': ('pygments.lexers.templates', 'HTML+PHP', ('html+php',), ('*.phtml',), ('application/x-php', 'application/x-httpd-php', 'application/x-httpd-php3', 'application/x-httpd-php4', 'application/x-httpd-php5')),
+    'HtmlSmartyLexer': ('pygments.lexers.templates', 'HTML+Smarty', ('html+smarty',), (), ('text/html+smarty',)),
+    'HttpLexer': ('pygments.lexers.textfmts', 'HTTP', ('http',), (), ()),
+    'HxmlLexer': ('pygments.lexers.haxe', 'Hxml', ('haxeml', 'hxml'), ('*.hxml',), ()),
+    'HyLexer': ('pygments.lexers.lisp', 'Hy', ('hylang', 'hy'), ('*.hy',), ('text/x-hy', 'application/x-hy')),
+    'HybrisLexer': ('pygments.lexers.scripting', 'Hybris', ('hybris',), ('*.hyb',), ('text/x-hybris', 'application/x-hybris')),
+    'IDLLexer': ('pygments.lexers.idl', 'IDL', ('idl',), ('*.pro',), ('text/idl',)),
+    'IconLexer': ('pygments.lexers.unicon', 'Icon', ('icon',), ('*.icon', '*.ICON'), ()),
+    'IdrisLexer': ('pygments.lexers.haskell', 'Idris', ('idris', 'idr'), ('*.idr',), ('text/x-idris',)),
+    'IgorLexer': ('pygments.lexers.igor', 'Igor', ('igor', 'igorpro'), ('*.ipf',), ('text/ipf',)),
+    'Inform6Lexer': ('pygments.lexers.int_fiction', 'Inform 6', ('inform6', 'i6'), ('*.inf',), ()),
+    'Inform6TemplateLexer': ('pygments.lexers.int_fiction', 'Inform 6 template', ('i6t',), ('*.i6t',), ()),
+    'Inform7Lexer': ('pygments.lexers.int_fiction', 'Inform 7', ('inform7', 'i7'), ('*.ni', '*.i7x'), ()),
+    'IniLexer': ('pygments.lexers.configs', 'INI', ('ini', 'cfg', 'dosini'), ('*.ini', '*.cfg', '*.inf', '.editorconfig'), ('text/x-ini', 'text/inf')),
+    'IoLexer': ('pygments.lexers.iolang', 'Io', ('io',), ('*.io',), ('text/x-iosrc',)),
+    'IokeLexer': ('pygments.lexers.jvm', 'Ioke', ('ioke', 'ik'), ('*.ik',), ('text/x-iokesrc',)),
+    'IrcLogsLexer': ('pygments.lexers.textfmts', 'IRC logs', ('irc',), ('*.weechatlog',), ('text/x-irclog',)),
+    'IsabelleLexer': ('pygments.lexers.theorem', 'Isabelle', ('isabelle',), ('*.thy',), ('text/x-isabelle',)),
+    'JLexer': ('pygments.lexers.j', 'J', ('j',), ('*.ijs',), ('text/x-j',)),
+    'JMESPathLexer': ('pygments.lexers.jmespath', 'JMESPath', ('jmespath', 'jp'), ('*.jp',), ()),
+    'JSLTLexer': ('pygments.lexers.jslt', 'JSLT', ('jslt',), ('*.jslt',), ('text/x-jslt',)),
+    'JagsLexer': ('pygments.lexers.modeling', 'JAGS', ('jags',), ('*.jag', '*.bug'), ()),
+    'JanetLexer': ('pygments.lexers.lisp', 'Janet', ('janet',), ('*.janet', '*.jdn'), ('text/x-janet', 'application/x-janet')),
+    'JasminLexer': ('pygments.lexers.jvm', 'Jasmin', ('jasmin', 'jasminxt'), ('*.j',), ()),
+    'JavaLexer': ('pygments.lexers.jvm', 'Java', ('java',), ('*.java',), ('text/x-java',)),
+    'JavascriptDjangoLexer': ('pygments.lexers.templates', 'JavaScript+Django/Jinja', ('javascript+django', 'js+django', 'javascript+jinja', 'js+jinja'), ('*.js.j2', '*.js.jinja2'), ('application/x-javascript+django', 'application/x-javascript+jinja', 'text/x-javascript+django', 'text/x-javascript+jinja', 'text/javascript+django', 'text/javascript+jinja')),
+    'JavascriptErbLexer': ('pygments.lexers.templates', 'JavaScript+Ruby', ('javascript+ruby', 'js+ruby', 'javascript+erb', 'js+erb'), (), ('application/x-javascript+ruby', 'text/x-javascript+ruby', 'text/javascript+ruby')),
+    'JavascriptGenshiLexer': ('pygments.lexers.templates', 'JavaScript+Genshi Text', ('js+genshitext', 'js+genshi', 'javascript+genshitext', 'javascript+genshi'), (), ('application/x-javascript+genshi', 'text/x-javascript+genshi', 'text/javascript+genshi')),
+    'JavascriptLexer': ('pygments.lexers.javascript', 'JavaScript', ('javascript', 'js'), ('*.js', '*.jsm', '*.mjs', '*.cjs'), ('application/javascript', 'application/x-javascript', 'text/x-javascript', 'text/javascript')),
+    'JavascriptPhpLexer': ('pygments.lexers.templates', 'JavaScript+PHP', ('javascript+php', 'js+php'), (), ('application/x-javascript+php', 'text/x-javascript+php', 'text/javascript+php')),
+    'JavascriptSmartyLexer': ('pygments.lexers.templates', 'JavaScript+Smarty', ('javascript+smarty', 'js+smarty'), (), ('application/x-javascript+smarty', 'text/x-javascript+smarty', 'text/javascript+smarty')),
+    'JavascriptUL4Lexer': ('pygments.lexers.ul4', 'Javascript+UL4', ('js+ul4',), ('*.jsul4',), ()),
+    'JclLexer': ('pygments.lexers.scripting', 'JCL', ('jcl',), ('*.jcl',), ('text/x-jcl',)),
+    'JsgfLexer': ('pygments.lexers.grammar_notation', 'JSGF', ('jsgf',), ('*.jsgf',), ('application/jsgf', 'application/x-jsgf', 'text/jsgf')),
+    'Json5Lexer': ('pygments.lexers.json5', 'JSON5', ('json5',), ('*.json5',), ()),
+    'JsonBareObjectLexer': ('pygments.lexers.data', 'JSONBareObject', (), (), ()),
+    'JsonLdLexer': ('pygments.lexers.data', 'JSON-LD', ('jsonld', 'json-ld'), ('*.jsonld',), ('application/ld+json',)),
+    'JsonLexer': ('pygments.lexers.data', 'JSON', ('json', 'json-object'), ('*.json', '*.jsonl', '*.ndjson', 'Pipfile.lock'), ('application/json', 'application/json-object', 'application/x-ndjson', 'application/jsonl', 'application/json-seq')),
+    'JsonnetLexer': ('pygments.lexers.jsonnet', 'Jsonnet', ('jsonnet',), ('*.jsonnet', '*.libsonnet'), ()),
+    'JspLexer': ('pygments.lexers.templates', 'Java Server Page', ('jsp',), ('*.jsp',), ('application/x-jsp',)),
+    'JsxLexer': ('pygments.lexers.jsx', 'JSX', ('jsx', 'react'), ('*.jsx', '*.react'), ('text/jsx', 'text/typescript-jsx')),
+    'JuliaConsoleLexer': ('pygments.lexers.julia', 'Julia console', ('jlcon', 'julia-repl'), (), ()),
+    'JuliaLexer': ('pygments.lexers.julia', 'Julia', ('julia', 'jl'), ('*.jl',), ('text/x-julia', 'application/x-julia')),
+    'JuttleLexer': ('pygments.lexers.javascript', 'Juttle', ('juttle',), ('*.juttle',), ('application/juttle', 'application/x-juttle', 'text/x-juttle', 'text/juttle')),
+    'KLexer': ('pygments.lexers.q', 'K', ('k',), ('*.k',), ()),
+    'KalLexer': ('pygments.lexers.javascript', 'Kal', ('kal',), ('*.kal',), ('text/kal', 'application/kal')),
+    'KconfigLexer': ('pygments.lexers.configs', 'Kconfig', ('kconfig', 'menuconfig', 'linux-config', 'kernel-config'), ('Kconfig*', '*Config.in*', 'external.in*', 'standard-modules.in'), ('text/x-kconfig',)),
+    'KernelLogLexer': ('pygments.lexers.textfmts', 'Kernel log', ('kmsg', 'dmesg'), ('*.kmsg', '*.dmesg'), ()),
+    'KokaLexer': ('pygments.lexers.haskell', 'Koka', ('koka',), ('*.kk', '*.kki'), ('text/x-koka',)),
+    'KotlinLexer': ('pygments.lexers.jvm', 'Kotlin', ('kotlin',), ('*.kt', '*.kts'), ('text/x-kotlin',)),
+    'KuinLexer': ('pygments.lexers.kuin', 'Kuin', ('kuin',), ('*.kn',), ()),
+    'KustoLexer': ('pygments.lexers.kusto', 'Kusto', ('kql', 'kusto'), ('*.kql', '*.kusto', '.csl'), ()),
+    'LSLLexer': ('pygments.lexers.scripting', 'LSL', ('lsl',), ('*.lsl',), ('text/x-lsl',)),
+    'LassoCssLexer': ('pygments.lexers.templates', 'CSS+Lasso', ('css+lasso',), (), ('text/css+lasso',)),
+    'LassoHtmlLexer': ('pygments.lexers.templates', 'HTML+Lasso', ('html+lasso',), (), ('text/html+lasso', 'application/x-httpd-lasso', 'application/x-httpd-lasso[89]')),
+    'LassoJavascriptLexer': ('pygments.lexers.templates', 'JavaScript+Lasso', ('javascript+lasso', 'js+lasso'), (), ('application/x-javascript+lasso', 'text/x-javascript+lasso', 'text/javascript+lasso')),
+    'LassoLexer': ('pygments.lexers.javascript', 'Lasso', ('lasso', 'lassoscript'), ('*.lasso', '*.lasso[89]'), ('text/x-lasso',)),
+    'LassoXmlLexer': ('pygments.lexers.templates', 'XML+Lasso', ('xml+lasso',), (), ('application/xml+lasso',)),
+    'LdaprcLexer': ('pygments.lexers.ldap', 'LDAP configuration file', ('ldapconf', 'ldaprc'), ('.ldaprc', 'ldaprc', 'ldap.conf'), ('text/x-ldapconf',)),
+    'LdifLexer': ('pygments.lexers.ldap', 'LDIF', ('ldif',), ('*.ldif',), ('text/x-ldif',)),
+    'Lean3Lexer': ('pygments.lexers.lean', 'Lean', ('lean', 'lean3'), ('*.lean',), ('text/x-lean', 'text/x-lean3')),
+    'Lean4Lexer': ('pygments.lexers.lean', 'Lean4', ('lean4',), ('*.lean',), ('text/x-lean4',)),
+    'LessCssLexer': ('pygments.lexers.css', 'LessCss', ('less',), ('*.less',), ('text/x-less-css',)),
+    'LighttpdConfLexer': ('pygments.lexers.configs', 'Lighttpd configuration file', ('lighttpd', 'lighty'), ('lighttpd.conf',), ('text/x-lighttpd-conf',)),
+    'LilyPondLexer': ('pygments.lexers.lilypond', 'LilyPond', ('lilypond',), ('*.ly',), ()),
+    'LimboLexer': ('pygments.lexers.inferno', 'Limbo', ('limbo',), ('*.b',), ('text/limbo',)),
+    'LiquidLexer': ('pygments.lexers.templates', 'liquid', ('liquid',), ('*.liquid',), ()),
+    'LiterateAgdaLexer': ('pygments.lexers.haskell', 'Literate Agda', ('literate-agda', 'lagda'), ('*.lagda',), ('text/x-literate-agda',)),
+    'LiterateCryptolLexer': ('pygments.lexers.haskell', 'Literate Cryptol', ('literate-cryptol', 'lcryptol', 'lcry'), ('*.lcry',), ('text/x-literate-cryptol',)),
+    'LiterateHaskellLexer': ('pygments.lexers.haskell', 'Literate Haskell', ('literate-haskell', 'lhaskell', 'lhs'), ('*.lhs',), ('text/x-literate-haskell',)),
+    'LiterateIdrisLexer': ('pygments.lexers.haskell', 'Literate Idris', ('literate-idris', 'lidris', 'lidr'), ('*.lidr',), ('text/x-literate-idris',)),
+    'LiveScriptLexer': ('pygments.lexers.javascript', 'LiveScript', ('livescript', 'live-script'), ('*.ls',), ('text/livescript',)),
+    'LlvmLexer': ('pygments.lexers.asm', 'LLVM', ('llvm',), ('*.ll',), ('text/x-llvm',)),
+    'LlvmMirBodyLexer': ('pygments.lexers.asm', 'LLVM-MIR Body', ('llvm-mir-body',), (), ()),
+    'LlvmMirLexer': ('pygments.lexers.asm', 'LLVM-MIR', ('llvm-mir',), ('*.mir',), ()),
+    'LogosLexer': ('pygments.lexers.objective', 'Logos', ('logos',), ('*.x', '*.xi', '*.xm', '*.xmi'), ('text/x-logos',)),
+    'LogtalkLexer': ('pygments.lexers.prolog', 'Logtalk', ('logtalk',), ('*.lgt', '*.logtalk'), ('text/x-logtalk',)),
+    'LuaLexer': ('pygments.lexers.scripting', 'Lua', ('lua',), ('*.lua', '*.wlua'), ('text/x-lua', 'application/x-lua')),
+    'LuauLexer': ('pygments.lexers.scripting', 'Luau', ('luau',), ('*.luau',), ()),
+    'MCFunctionLexer': ('pygments.lexers.minecraft', 'MCFunction', ('mcfunction', 'mcf'), ('*.mcfunction',), ('text/mcfunction',)),
+    'MCSchemaLexer': ('pygments.lexers.minecraft', 'MCSchema', ('mcschema',), ('*.mcschema',), ('text/mcschema',)),
+    'MIMELexer': ('pygments.lexers.mime', 'MIME', ('mime',), (), ('multipart/mixed', 'multipart/related', 'multipart/alternative')),
+    'MIPSLexer': ('pygments.lexers.mips', 'MIPS', ('mips',), ('*.mips', '*.MIPS'), ()),
+    'MOOCodeLexer': ('pygments.lexers.scripting', 'MOOCode', ('moocode', 'moo'), ('*.moo',), ('text/x-moocode',)),
+    'MSDOSSessionLexer': ('pygments.lexers.shell', 'MSDOS Session', ('doscon',), (), ()),
+    'Macaulay2Lexer': ('pygments.lexers.macaulay2', 'Macaulay2', ('macaulay2',), ('*.m2',), ()),
+    'MakefileLexer': ('pygments.lexers.make', 'Makefile', ('make', 'makefile', 'mf', 'bsdmake'), ('*.mak', '*.mk', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile'), ('text/x-makefile',)),
+    'MakoCssLexer': ('pygments.lexers.templates', 'CSS+Mako', ('css+mako',), (), ('text/css+mako',)),
+    'MakoHtmlLexer': ('pygments.lexers.templates', 'HTML+Mako', ('html+mako',), (), ('text/html+mako',)),
+    'MakoJavascriptLexer': ('pygments.lexers.templates', 'JavaScript+Mako', ('javascript+mako', 'js+mako'), (), ('application/x-javascript+mako', 'text/x-javascript+mako', 'text/javascript+mako')),
+    'MakoLexer': ('pygments.lexers.templates', 'Mako', ('mako',), ('*.mao',), ('application/x-mako',)),
+    'MakoXmlLexer': ('pygments.lexers.templates', 'XML+Mako', ('xml+mako',), (), ('application/xml+mako',)),
+    'MapleLexer': ('pygments.lexers.maple', 'Maple', ('maple',), ('*.mpl', '*.mi', '*.mm'), ('text/x-maple',)),
+    'MaqlLexer': ('pygments.lexers.business', 'MAQL', ('maql',), ('*.maql',), ('text/x-gooddata-maql', 'application/x-gooddata-maql')),
+    'MarkdownLexer': ('pygments.lexers.markup', 'Markdown', ('markdown', 'md'), ('*.md', '*.markdown'), ('text/x-markdown',)),
+    'MaskLexer': ('pygments.lexers.javascript', 'Mask', ('mask',), ('*.mask',), ('text/x-mask',)),
+    'MasonLexer': ('pygments.lexers.templates', 'Mason', ('mason',), ('*.m', '*.mhtml', '*.mc', '*.mi', 'autohandler', 'dhandler'), ('application/x-mason',)),
+    'MathematicaLexer': ('pygments.lexers.algebra', 'Mathematica', ('mathematica', 'mma', 'nb'), ('*.nb', '*.cdf', '*.nbp', '*.ma'), ('application/mathematica', 'application/vnd.wolfram.mathematica', 'application/vnd.wolfram.mathematica.package', 'application/vnd.wolfram.cdf')),
+    'MatlabLexer': ('pygments.lexers.matlab', 'Matlab', ('matlab',), ('*.m',), ('text/matlab',)),
+    'MatlabSessionLexer': ('pygments.lexers.matlab', 'Matlab session', ('matlabsession',), (), ()),
+    'MaximaLexer': ('pygments.lexers.maxima', 'Maxima', ('maxima', 'macsyma'), ('*.mac', '*.max'), ()),
+    'MesonLexer': ('pygments.lexers.meson', 'Meson', ('meson', 'meson.build'), ('meson.build', 'meson_options.txt'), ('text/x-meson',)),
+    'MiniDLexer': ('pygments.lexers.d', 'MiniD', ('minid',), (), ('text/x-minidsrc',)),
+    'MiniScriptLexer': ('pygments.lexers.scripting', 'MiniScript', ('miniscript', 'ms'), ('*.ms',), ('text/x-minicript', 'application/x-miniscript')),
+    'ModelicaLexer': ('pygments.lexers.modeling', 'Modelica', ('modelica',), ('*.mo',), ('text/x-modelica',)),
+    'Modula2Lexer': ('pygments.lexers.modula2', 'Modula-2', ('modula2', 'm2'), ('*.def', '*.mod'), ('text/x-modula2',)),
+    'MoinWikiLexer': ('pygments.lexers.markup', 'MoinMoin/Trac Wiki markup', ('trac-wiki', 'moin'), (), ('text/x-trac-wiki',)),
+    'MojoLexer': ('pygments.lexers.mojo', 'Mojo', ('mojo', '🔥'), ('*.mojo', '*.🔥'), ('text/x-mojo', 'application/x-mojo')),
+    'MonkeyLexer': ('pygments.lexers.basic', 'Monkey', ('monkey',), ('*.monkey',), ('text/x-monkey',)),
+    'MonteLexer': ('pygments.lexers.monte', 'Monte', ('monte',), ('*.mt',), ()),
+    'MoonScriptLexer': ('pygments.lexers.scripting', 'MoonScript', ('moonscript', 'moon'), ('*.moon',), ('text/x-moonscript', 'application/x-moonscript')),
+    'MoselLexer': ('pygments.lexers.mosel', 'Mosel', ('mosel',), ('*.mos',), ()),
+    'MozPreprocCssLexer': ('pygments.lexers.markup', 'CSS+mozpreproc', ('css+mozpreproc',), ('*.css.in',), ()),
+    'MozPreprocHashLexer': ('pygments.lexers.markup', 'mozhashpreproc', ('mozhashpreproc',), (), ()),
+    'MozPreprocJavascriptLexer': ('pygments.lexers.markup', 'Javascript+mozpreproc', ('javascript+mozpreproc',), ('*.js.in',), ()),
+    'MozPreprocPercentLexer': ('pygments.lexers.markup', 'mozpercentpreproc', ('mozpercentpreproc',), (), ()),
+    'MozPreprocXulLexer': ('pygments.lexers.markup', 'XUL+mozpreproc', ('xul+mozpreproc',), ('*.xul.in',), ()),
+    'MqlLexer': ('pygments.lexers.c_like', 'MQL', ('mql', 'mq4', 'mq5', 'mql4', 'mql5'), ('*.mq4', '*.mq5', '*.mqh'), ('text/x-mql',)),
+    'MscgenLexer': ('pygments.lexers.dsls', 'Mscgen', ('mscgen', 'msc'), ('*.msc',), ()),
+    'MuPADLexer': ('pygments.lexers.algebra', 'MuPAD', ('mupad',), ('*.mu',), ()),
+    'MxmlLexer': ('pygments.lexers.actionscript', 'MXML', ('mxml',), ('*.mxml',), ()),
+    'MySqlLexer': ('pygments.lexers.sql', 'MySQL', ('mysql',), (), ('text/x-mysql',)),
+    'MyghtyCssLexer': ('pygments.lexers.templates', 'CSS+Myghty', ('css+myghty',), (), ('text/css+myghty',)),
+    'MyghtyHtmlLexer': ('pygments.lexers.templates', 'HTML+Myghty', ('html+myghty',), (), ('text/html+myghty',)),
+    'MyghtyJavascriptLexer': ('pygments.lexers.templates', 'JavaScript+Myghty', ('javascript+myghty', 'js+myghty'), (), ('application/x-javascript+myghty', 'text/x-javascript+myghty', 'text/javascript+mygthy')),
+    'MyghtyLexer': ('pygments.lexers.templates', 'Myghty', ('myghty',), ('*.myt', 'autodelegate'), ('application/x-myghty',)),
+    'MyghtyXmlLexer': ('pygments.lexers.templates', 'XML+Myghty', ('xml+myghty',), (), ('application/xml+myghty',)),
+    'NCLLexer': ('pygments.lexers.ncl', 'NCL', ('ncl',), ('*.ncl',), ('text/ncl',)),
+    'NSISLexer': ('pygments.lexers.installers', 'NSIS', ('nsis', 'nsi', 'nsh'), ('*.nsi', '*.nsh'), ('text/x-nsis',)),
+    'NasmLexer': ('pygments.lexers.asm', 'NASM', ('nasm',), ('*.asm', '*.ASM', '*.nasm'), ('text/x-nasm',)),
+    'NasmObjdumpLexer': ('pygments.lexers.asm', 'objdump-nasm', ('objdump-nasm',), ('*.objdump-intel',), ('text/x-nasm-objdump',)),
+    'NemerleLexer': ('pygments.lexers.dotnet', 'Nemerle', ('nemerle',), ('*.n',), ('text/x-nemerle',)),
+    'NesCLexer': ('pygments.lexers.c_like', 'nesC', ('nesc',), ('*.nc',), ('text/x-nescsrc',)),
+    'NestedTextLexer': ('pygments.lexers.configs', 'NestedText', ('nestedtext', 'nt'), ('*.nt',), ()),
+    'NewLispLexer': ('pygments.lexers.lisp', 'NewLisp', ('newlisp',), ('*.lsp', '*.nl', '*.kif'), ('text/x-newlisp', 'application/x-newlisp')),
+    'NewspeakLexer': ('pygments.lexers.smalltalk', 'Newspeak', ('newspeak',), ('*.ns2',), ('text/x-newspeak',)),
+    'NginxConfLexer': ('pygments.lexers.configs', 'Nginx configuration file', ('nginx',), ('nginx.conf',), ('text/x-nginx-conf',)),
+    'NimrodLexer': ('pygments.lexers.nimrod', 'Nimrod', ('nimrod', 'nim'), ('*.nim', '*.nimrod'), ('text/x-nim',)),
+    'NitLexer': ('pygments.lexers.nit', 'Nit', ('nit',), ('*.nit',), ()),
+    'NixLexer': ('pygments.lexers.nix', 'Nix', ('nixos', 'nix'), ('*.nix',), ('text/x-nix',)),
+    'NodeConsoleLexer': ('pygments.lexers.javascript', 'Node.js REPL console session', ('nodejsrepl',), (), ('text/x-nodejsrepl',)),
+    'NotmuchLexer': ('pygments.lexers.textfmts', 'Notmuch', ('notmuch',), (), ()),
+    'NuSMVLexer': ('pygments.lexers.smv', 'NuSMV', ('nusmv',), ('*.smv',), ()),
+    'NumPyLexer': ('pygments.lexers.python', 'NumPy', ('numpy',), (), ()),
+    'NumbaIRLexer': ('pygments.lexers.numbair', 'Numba_IR', ('numba_ir', 'numbair'), ('*.numba_ir',), ('text/x-numba_ir', 'text/x-numbair')),
+    'ObjdumpLexer': ('pygments.lexers.asm', 'objdump', ('objdump',), ('*.objdump',), ('text/x-objdump',)),
+    'ObjectiveCLexer': ('pygments.lexers.objective', 'Objective-C', ('objective-c', 'objectivec', 'obj-c', 'objc'), ('*.m', '*.h'), ('text/x-objective-c',)),
+    'ObjectiveCppLexer': ('pygments.lexers.objective', 'Objective-C++', ('objective-c++', 'objectivec++', 'obj-c++', 'objc++'), ('*.mm', '*.hh'), ('text/x-objective-c++',)),
+    'ObjectiveJLexer': ('pygments.lexers.javascript', 'Objective-J', ('objective-j', 'objectivej', 'obj-j', 'objj'), ('*.j',), ('text/x-objective-j',)),
+    'OcamlLexer': ('pygments.lexers.ml', 'OCaml', ('ocaml',), ('*.ml', '*.mli', '*.mll', '*.mly'), ('text/x-ocaml',)),
+    'OctaveLexer': ('pygments.lexers.matlab', 'Octave', ('octave',), ('*.m',), ('text/octave',)),
+    'OdinLexer': ('pygments.lexers.archetype', 'ODIN', ('odin',), ('*.odin',), ('text/odin',)),
+    'OmgIdlLexer': ('pygments.lexers.c_like', 'OMG Interface Definition Language', ('omg-idl',), ('*.idl', '*.pidl'), ()),
+    'OocLexer': ('pygments.lexers.ooc', 'Ooc', ('ooc',), ('*.ooc',), ('text/x-ooc',)),
+    'OpaLexer': ('pygments.lexers.ml', 'Opa', ('opa',), ('*.opa',), ('text/x-opa',)),
+    'OpenEdgeLexer': ('pygments.lexers.business', 'OpenEdge ABL', ('openedge', 'abl', 'progress'), ('*.p', '*.cls'), ('text/x-openedge', 'application/x-openedge')),
+    'OpenScadLexer': ('pygments.lexers.openscad', 'OpenSCAD', ('openscad',), ('*.scad',), ('application/x-openscad',)),
+    'OrgLexer': ('pygments.lexers.markup', 'Org Mode', ('org', 'orgmode', 'org-mode'), ('*.org',), ('text/org',)),
+    'OutputLexer': ('pygments.lexers.special', 'Text output', ('output',), (), ()),
+    'PacmanConfLexer': ('pygments.lexers.configs', 'PacmanConf', ('pacmanconf',), ('pacman.conf',), ()),
+    'PanLexer': ('pygments.lexers.dsls', 'Pan', ('pan',), ('*.pan',), ()),
+    'ParaSailLexer': ('pygments.lexers.parasail', 'ParaSail', ('parasail',), ('*.psi', '*.psl'), ('text/x-parasail',)),
+    'PawnLexer': ('pygments.lexers.pawn', 'Pawn', ('pawn',), ('*.p', '*.pwn', '*.inc'), ('text/x-pawn',)),
+    'PddlLexer': ('pygments.lexers.pddl', 'PDDL', ('pddl',), ('*.pddl',), ()),
+    'PegLexer': ('pygments.lexers.grammar_notation', 'PEG', ('peg',), ('*.peg',), ('text/x-peg',)),
+    'Perl6Lexer': ('pygments.lexers.perl', 'Perl6', ('perl6', 'pl6', 'raku'), ('*.pl', '*.pm', '*.nqp', '*.p6', '*.6pl', '*.p6l', '*.pl6', '*.6pm', '*.p6m', '*.pm6', '*.t', '*.raku', '*.rakumod', '*.rakutest', '*.rakudoc'), ('text/x-perl6', 'application/x-perl6')),
+    'PerlLexer': ('pygments.lexers.perl', 'Perl', ('perl', 'pl'), ('*.pl', '*.pm', '*.t', '*.perl'), ('text/x-perl', 'application/x-perl')),
+    'PhixLexer': ('pygments.lexers.phix', 'Phix', ('phix',), ('*.exw',), ('text/x-phix',)),
+    'PhpLexer': ('pygments.lexers.php', 'PHP', ('php', 'php3', 'php4', 'php5'), ('*.php', '*.php[345]', '*.inc'), ('text/x-php',)),
+    'PigLexer': ('pygments.lexers.jvm', 'Pig', ('pig',), ('*.pig',), ('text/x-pig',)),
+    'PikeLexer': ('pygments.lexers.c_like', 'Pike', ('pike',), ('*.pike', '*.pmod'), ('text/x-pike',)),
+    'PkgConfigLexer': ('pygments.lexers.configs', 'PkgConfig', ('pkgconfig',), ('*.pc',), ()),
+    'PlPgsqlLexer': ('pygments.lexers.sql', 'PL/pgSQL', ('plpgsql',), (), ('text/x-plpgsql',)),
+    'PointlessLexer': ('pygments.lexers.pointless', 'Pointless', ('pointless',), ('*.ptls',), ()),
+    'PonyLexer': ('pygments.lexers.pony', 'Pony', ('pony',), ('*.pony',), ()),
+    'PortugolLexer': ('pygments.lexers.pascal', 'Portugol', ('portugol',), ('*.alg', '*.portugol'), ()),
+    'PostScriptLexer': ('pygments.lexers.graphics', 'PostScript', ('postscript', 'postscr'), ('*.ps', '*.eps'), ('application/postscript',)),
+    'PostgresConsoleLexer': ('pygments.lexers.sql', 'PostgreSQL console (psql)', ('psql', 'postgresql-console', 'postgres-console'), (), ('text/x-postgresql-psql',)),
+    'PostgresExplainLexer': ('pygments.lexers.sql', 'PostgreSQL EXPLAIN dialect', ('postgres-explain',), ('*.explain',), ('text/x-postgresql-explain',)),
+    'PostgresLexer': ('pygments.lexers.sql', 'PostgreSQL SQL dialect', ('postgresql', 'postgres'), (), ('text/x-postgresql',)),
+    'PovrayLexer': ('pygments.lexers.graphics', 'POVRay', ('pov',), ('*.pov', '*.inc'), ('text/x-povray',)),
+    'PowerShellLexer': ('pygments.lexers.shell', 'PowerShell', ('powershell', 'pwsh', 'posh', 'ps1', 'psm1'), ('*.ps1', '*.psm1'), ('text/x-powershell',)),
+    'PowerShellSessionLexer': ('pygments.lexers.shell', 'PowerShell Session', ('pwsh-session', 'ps1con'), (), ()),
+    'PraatLexer': ('pygments.lexers.praat', 'Praat', ('praat',), ('*.praat', '*.proc', '*.psc'), ()),
+    'ProcfileLexer': ('pygments.lexers.procfile', 'Procfile', ('procfile',), ('Procfile',), ()),
+    'PrologLexer': ('pygments.lexers.prolog', 'Prolog', ('prolog',), ('*.ecl', '*.prolog', '*.pro', '*.pl'), ('text/x-prolog',)),
+    'PromQLLexer': ('pygments.lexers.promql', 'PromQL', ('promql',), ('*.promql',), ()),
+    'PromelaLexer': ('pygments.lexers.c_like', 'Promela', ('promela',), ('*.pml', '*.prom', '*.prm', '*.promela', '*.pr', '*.pm'), ('text/x-promela',)),
+    'PropertiesLexer': ('pygments.lexers.configs', 'Properties', ('properties', 'jproperties'), ('*.properties',), ('text/x-java-properties',)),
+    'ProtoBufLexer': ('pygments.lexers.dsls', 'Protocol Buffer', ('protobuf', 'proto'), ('*.proto',), ()),
+    'PrqlLexer': ('pygments.lexers.prql', 'PRQL', ('prql',), ('*.prql',), ('application/prql', 'application/x-prql')),
+    'PsyshConsoleLexer': ('pygments.lexers.php', 'PsySH console session for PHP', ('psysh',), (), ()),
+    'PtxLexer': ('pygments.lexers.ptx', 'PTX', ('ptx',), ('*.ptx',), ('text/x-ptx',)),
+    'PugLexer': ('pygments.lexers.html', 'Pug', ('pug', 'jade'), ('*.pug', '*.jade'), ('text/x-pug', 'text/x-jade')),
+    'PuppetLexer': ('pygments.lexers.dsls', 'Puppet', ('puppet',), ('*.pp',), ()),
+    'PyPyLogLexer': ('pygments.lexers.console', 'PyPy Log', ('pypylog', 'pypy'), ('*.pypylog',), ('application/x-pypylog',)),
+    'Python2Lexer': ('pygments.lexers.python', 'Python 2.x', ('python2', 'py2'), (), ('text/x-python2', 'application/x-python2')),
+    'Python2TracebackLexer': ('pygments.lexers.python', 'Python 2.x Traceback', ('py2tb',), ('*.py2tb',), ('text/x-python2-traceback',)),
+    'PythonConsoleLexer': ('pygments.lexers.python', 'Python console session', ('pycon', 'python-console'), (), ('text/x-python-doctest',)),
+    'PythonLexer': ('pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark', 'pyi'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')),
+    'PythonTracebackLexer': ('pygments.lexers.python', 'Python Traceback', ('pytb', 'py3tb'), ('*.pytb', '*.py3tb'), ('text/x-python-traceback', 'text/x-python3-traceback')),
+    'PythonUL4Lexer': ('pygments.lexers.ul4', 'Python+UL4', ('py+ul4',), ('*.pyul4',), ()),
+    'QBasicLexer': ('pygments.lexers.basic', 'QBasic', ('qbasic', 'basic'), ('*.BAS', '*.bas'), ('text/basic',)),
+    'QLexer': ('pygments.lexers.q', 'Q', ('q',), ('*.q',), ()),
+    'QVToLexer': ('pygments.lexers.qvt', 'QVTO', ('qvto', 'qvt'), ('*.qvto',), ()),
+    'QlikLexer': ('pygments.lexers.qlik', 'Qlik', ('qlik', 'qlikview', 'qliksense', 'qlikscript'), ('*.qvs', '*.qvw'), ()),
+    'QmlLexer': ('pygments.lexers.webmisc', 'QML', ('qml', 'qbs'), ('*.qml', '*.qbs'), ('application/x-qml', 'application/x-qt.qbs+qml')),
+    'RConsoleLexer': ('pygments.lexers.r', 'RConsole', ('rconsole', 'rout'), ('*.Rout',), ()),
+    'RNCCompactLexer': ('pygments.lexers.rnc', 'Relax-NG Compact', ('rng-compact', 'rnc'), ('*.rnc',), ()),
+    'RPMSpecLexer': ('pygments.lexers.installers', 'RPMSpec', ('spec',), ('*.spec',), ('text/x-rpm-spec',)),
+    'RacketLexer': ('pygments.lexers.lisp', 'Racket', ('racket', 'rkt'), ('*.rkt', '*.rktd', '*.rktl'), ('text/x-racket', 'application/x-racket')),
+    'RagelCLexer': ('pygments.lexers.parsers', 'Ragel in C Host', ('ragel-c',), ('*.rl',), ()),
+    'RagelCppLexer': ('pygments.lexers.parsers', 'Ragel in CPP Host', ('ragel-cpp',), ('*.rl',), ()),
+    'RagelDLexer': ('pygments.lexers.parsers', 'Ragel in D Host', ('ragel-d',), ('*.rl',), ()),
+    'RagelEmbeddedLexer': ('pygments.lexers.parsers', 'Embedded Ragel', ('ragel-em',), ('*.rl',), ()),
+    'RagelJavaLexer': ('pygments.lexers.parsers', 'Ragel in Java Host', ('ragel-java',), ('*.rl',), ()),
+    'RagelLexer': ('pygments.lexers.parsers', 'Ragel', ('ragel',), (), ()),
+    'RagelObjectiveCLexer': ('pygments.lexers.parsers', 'Ragel in Objective C Host', ('ragel-objc',), ('*.rl',), ()),
+    'RagelRubyLexer': ('pygments.lexers.parsers', 'Ragel in Ruby Host', ('ragel-ruby', 'ragel-rb'), ('*.rl',), ()),
+    'RawTokenLexer': ('pygments.lexers.special', 'Raw token data', (), (), ('application/x-pygments-tokens',)),
+    'RdLexer': ('pygments.lexers.r', 'Rd', ('rd',), ('*.Rd',), ('text/x-r-doc',)),
+    'ReasonLexer': ('pygments.lexers.ml', 'ReasonML', ('reasonml', 'reason'), ('*.re', '*.rei'), ('text/x-reasonml',)),
+    'RebolLexer': ('pygments.lexers.rebol', 'REBOL', ('rebol',), ('*.r', '*.r3', '*.reb'), ('text/x-rebol',)),
+    'RedLexer': ('pygments.lexers.rebol', 'Red', ('red', 'red/system'), ('*.red', '*.reds'), ('text/x-red', 'text/x-red-system')),
+    'RedcodeLexer': ('pygments.lexers.esoteric', 'Redcode', ('redcode',), ('*.cw',), ()),
+    'RegeditLexer': ('pygments.lexers.configs', 'reg', ('registry',), ('*.reg',), ('text/x-windows-registry',)),
+    'RegoLexer': ('pygments.lexers.rego', 'Rego', ('rego',), ('*.rego',), ('text/x-rego',)),
+    'ResourceLexer': ('pygments.lexers.resource', 'ResourceBundle', ('resourcebundle', 'resource'), (), ()),
+    'RexxLexer': ('pygments.lexers.scripting', 'Rexx', ('rexx', 'arexx'), ('*.rexx', '*.rex', '*.rx', '*.arexx'), ('text/x-rexx',)),
+    'RhtmlLexer': ('pygments.lexers.templates', 'RHTML', ('rhtml', 'html+erb', 'html+ruby'), ('*.rhtml',), ('text/html+ruby',)),
+    'RideLexer': ('pygments.lexers.ride', 'Ride', ('ride',), ('*.ride',), ('text/x-ride',)),
+    'RitaLexer': ('pygments.lexers.rita', 'Rita', ('rita',), ('*.rita',), ('text/rita',)),
+    'RoboconfGraphLexer': ('pygments.lexers.roboconf', 'Roboconf Graph', ('roboconf-graph',), ('*.graph',), ()),
+    'RoboconfInstancesLexer': ('pygments.lexers.roboconf', 'Roboconf Instances', ('roboconf-instances',), ('*.instances',), ()),
+    'RobotFrameworkLexer': ('pygments.lexers.robotframework', 'RobotFramework', ('robotframework',), ('*.robot', '*.resource'), ('text/x-robotframework',)),
+    'RqlLexer': ('pygments.lexers.sql', 'RQL', ('rql',), ('*.rql',), ('text/x-rql',)),
+    'RslLexer': ('pygments.lexers.dsls', 'RSL', ('rsl',), ('*.rsl',), ('text/rsl',)),
+    'RstLexer': ('pygments.lexers.markup', 'reStructuredText', ('restructuredtext', 'rst', 'rest'), ('*.rst', '*.rest'), ('text/x-rst', 'text/prs.fallenstein.rst')),
+    'RtsLexer': ('pygments.lexers.trafficscript', 'TrafficScript', ('trafficscript', 'rts'), ('*.rts',), ()),
+    'RubyConsoleLexer': ('pygments.lexers.ruby', 'Ruby irb session', ('rbcon', 'irb'), (), ('text/x-ruby-shellsession',)),
+    'RubyLexer': ('pygments.lexers.ruby', 'Ruby', ('ruby', 'rb', 'duby'), ('*.rb', '*.rbw', 'Rakefile', '*.rake', '*.gemspec', '*.rbx', '*.duby', 'Gemfile', 'Vagrantfile'), ('text/x-ruby', 'application/x-ruby')),
+    'RustLexer': ('pygments.lexers.rust', 'Rust', ('rust', 'rs'), ('*.rs', '*.rs.in'), ('text/rust', 'text/x-rust')),
+    'SASLexer': ('pygments.lexers.sas', 'SAS', ('sas',), ('*.SAS', '*.sas'), ('text/x-sas', 'text/sas', 'application/x-sas')),
+    'SLexer': ('pygments.lexers.r', 'S', ('splus', 's', 'r'), ('*.S', '*.R', '.Rhistory', '.Rprofile', '.Renviron'), ('text/S-plus', 'text/S', 'text/x-r-source', 'text/x-r', 'text/x-R', 'text/x-r-history', 'text/x-r-profile')),
+    'SMLLexer': ('pygments.lexers.ml', 'Standard ML', ('sml',), ('*.sml', '*.sig', '*.fun'), ('text/x-standardml', 'application/x-standardml')),
+    'SNBTLexer': ('pygments.lexers.minecraft', 'SNBT', ('snbt',), ('*.snbt',), ('text/snbt',)),
+    'SarlLexer': ('pygments.lexers.jvm', 'SARL', ('sarl',), ('*.sarl',), ('text/x-sarl',)),
+    'SassLexer': ('pygments.lexers.css', 'Sass', ('sass',), ('*.sass',), ('text/x-sass',)),
+    'SaviLexer': ('pygments.lexers.savi', 'Savi', ('savi',), ('*.savi',), ()),
+    'ScalaLexer': ('pygments.lexers.jvm', 'Scala', ('scala',), ('*.scala',), ('text/x-scala',)),
+    'ScamlLexer': ('pygments.lexers.html', 'Scaml', ('scaml',), ('*.scaml',), ('text/x-scaml',)),
+    'ScdocLexer': ('pygments.lexers.scdoc', 'scdoc', ('scdoc', 'scd'), ('*.scd', '*.scdoc'), ()),
+    'SchemeLexer': ('pygments.lexers.lisp', 'Scheme', ('scheme', 'scm'), ('*.scm', '*.ss'), ('text/x-scheme', 'application/x-scheme')),
+    'ScilabLexer': ('pygments.lexers.matlab', 'Scilab', ('scilab',), ('*.sci', '*.sce', '*.tst'), ('text/scilab',)),
+    'ScssLexer': ('pygments.lexers.css', 'SCSS', ('scss',), ('*.scss',), ('text/x-scss',)),
+    'SedLexer': ('pygments.lexers.textedit', 'Sed', ('sed', 'gsed', 'ssed'), ('*.sed', '*.[gs]sed'), ('text/x-sed',)),
+    'ShExCLexer': ('pygments.lexers.rdf', 'ShExC', ('shexc', 'shex'), ('*.shex',), ('text/shex',)),
+    'ShenLexer': ('pygments.lexers.lisp', 'Shen', ('shen',), ('*.shen',), ('text/x-shen', 'application/x-shen')),
+    'SieveLexer': ('pygments.lexers.sieve', 'Sieve', ('sieve',), ('*.siv', '*.sieve'), ()),
+    'SilverLexer': ('pygments.lexers.verification', 'Silver', ('silver',), ('*.sil', '*.vpr'), ()),
+    'SingularityLexer': ('pygments.lexers.configs', 'Singularity', ('singularity',), ('*.def', 'Singularity'), ()),
+    'SlashLexer': ('pygments.lexers.slash', 'Slash', ('slash',), ('*.sla',), ()),
+    'SlimLexer': ('pygments.lexers.webmisc', 'Slim', ('slim',), ('*.slim',), ('text/x-slim',)),
+    'SlurmBashLexer': ('pygments.lexers.shell', 'Slurm', ('slurm', 'sbatch'), ('*.sl',), ()),
+    'SmaliLexer': ('pygments.lexers.dalvik', 'Smali', ('smali',), ('*.smali',), ('text/smali',)),
+    'SmalltalkLexer': ('pygments.lexers.smalltalk', 'Smalltalk', ('smalltalk', 'squeak', 'st'), ('*.st',), ('text/x-smalltalk',)),
+    'SmartGameFormatLexer': ('pygments.lexers.sgf', 'SmartGameFormat', ('sgf',), ('*.sgf',), ()),
+    'SmartyLexer': ('pygments.lexers.templates', 'Smarty', ('smarty',), ('*.tpl',), ('application/x-smarty',)),
+    'SmithyLexer': ('pygments.lexers.smithy', 'Smithy', ('smithy',), ('*.smithy',), ()),
+    'SnobolLexer': ('pygments.lexers.snobol', 'Snobol', ('snobol',), ('*.snobol',), ('text/x-snobol',)),
+    'SnowballLexer': ('pygments.lexers.dsls', 'Snowball', ('snowball',), ('*.sbl',), ()),
+    'SolidityLexer': ('pygments.lexers.solidity', 'Solidity', ('solidity',), ('*.sol',), ()),
+    'SoongLexer': ('pygments.lexers.soong', 'Soong', ('androidbp', 'bp', 'soong'), ('Android.bp',), ()),
+    'SophiaLexer': ('pygments.lexers.sophia', 'Sophia', ('sophia',), ('*.aes',), ()),
+    'SourcePawnLexer': ('pygments.lexers.pawn', 'SourcePawn', ('sp',), ('*.sp',), ('text/x-sourcepawn',)),
+    'SourcesListLexer': ('pygments.lexers.installers', 'Debian Sourcelist', ('debsources', 'sourceslist', 'sources.list'), ('sources.list',), ()),
+    'SparqlLexer': ('pygments.lexers.rdf', 'SPARQL', ('sparql',), ('*.rq', '*.sparql'), ('application/sparql-query',)),
+    'SpiceLexer': ('pygments.lexers.spice', 'Spice', ('spice', 'spicelang'), ('*.spice',), ('text/x-spice',)),
+    'SqlJinjaLexer': ('pygments.lexers.templates', 'SQL+Jinja', ('sql+jinja',), ('*.sql', '*.sql.j2', '*.sql.jinja2'), ()),
+    'SqlLexer': ('pygments.lexers.sql', 'SQL', ('sql',), ('*.sql',), ('text/x-sql',)),
+    'SqliteConsoleLexer': ('pygments.lexers.sql', 'sqlite3con', ('sqlite3',), ('*.sqlite3-console',), ('text/x-sqlite3-console',)),
+    'SquidConfLexer': ('pygments.lexers.configs', 'SquidConf', ('squidconf', 'squid.conf', 'squid'), ('squid.conf',), ('text/x-squidconf',)),
+    'SrcinfoLexer': ('pygments.lexers.srcinfo', 'Srcinfo', ('srcinfo',), ('.SRCINFO',), ()),
+    'SspLexer': ('pygments.lexers.templates', 'Scalate Server Page', ('ssp',), ('*.ssp',), ('application/x-ssp',)),
+    'StanLexer': ('pygments.lexers.modeling', 'Stan', ('stan',), ('*.stan',), ()),
+    'StataLexer': ('pygments.lexers.stata', 'Stata', ('stata', 'do'), ('*.do', '*.ado'), ('text/x-stata', 'text/stata', 'application/x-stata')),
+    'SuperColliderLexer': ('pygments.lexers.supercollider', 'SuperCollider', ('supercollider', 'sc'), ('*.sc', '*.scd'), ('application/supercollider', 'text/supercollider')),
+    'SwiftLexer': ('pygments.lexers.objective', 'Swift', ('swift',), ('*.swift',), ('text/x-swift',)),
+    'SwigLexer': ('pygments.lexers.c_like', 'SWIG', ('swig',), ('*.swg', '*.i'), ('text/swig',)),
+    'SystemVerilogLexer': ('pygments.lexers.hdl', 'systemverilog', ('systemverilog', 'sv'), ('*.sv', '*.svh'), ('text/x-systemverilog',)),
+    'SystemdLexer': ('pygments.lexers.configs', 'Systemd', ('systemd',), ('*.service', '*.socket', '*.device', '*.mount', '*.automount', '*.swap', '*.target', '*.path', '*.timer', '*.slice', '*.scope'), ()),
+    'TAPLexer': ('pygments.lexers.testing', 'TAP', ('tap',), ('*.tap',), ()),
+    'TNTLexer': ('pygments.lexers.tnt', 'Typographic Number Theory', ('tnt',), ('*.tnt',), ()),
+    'TOMLLexer': ('pygments.lexers.configs', 'TOML', ('toml',), ('*.toml', 'Pipfile', 'poetry.lock'), ('application/toml',)),
+    'TableGenLexer': ('pygments.lexers.tablegen', 'TableGen', ('tablegen', 'td'), ('*.td',), ()),
+    'TactLexer': ('pygments.lexers.tact', 'Tact', ('tact',), ('*.tact',), ()),
+    'Tads3Lexer': ('pygments.lexers.int_fiction', 'TADS 3', ('tads3',), ('*.t',), ()),
+    'TalLexer': ('pygments.lexers.tal', 'Tal', ('tal', 'uxntal'), ('*.tal',), ('text/x-uxntal',)),
+    'TasmLexer': ('pygments.lexers.asm', 'TASM', ('tasm',), ('*.asm', '*.ASM', '*.tasm'), ('text/x-tasm',)),
+    'TclLexer': ('pygments.lexers.tcl', 'Tcl', ('tcl',), ('*.tcl', '*.rvt'), ('text/x-tcl', 'text/x-script.tcl', 'application/x-tcl')),
+    'TcshLexer': ('pygments.lexers.shell', 'Tcsh', ('tcsh', 'csh'), ('*.tcsh', '*.csh'), ('application/x-csh',)),
+    'TcshSessionLexer': ('pygments.lexers.shell', 'Tcsh Session', ('tcshcon',), (), ()),
+    'TeaTemplateLexer': ('pygments.lexers.templates', 'Tea', ('tea',), ('*.tea',), ('text/x-tea',)),
+    'TealLexer': ('pygments.lexers.teal', 'teal', ('teal',), ('*.teal',), ()),
+    'TeraTermLexer': ('pygments.lexers.teraterm', 'Tera Term macro', ('teratermmacro', 'teraterm', 'ttl'), ('*.ttl',), ('text/x-teratermmacro',)),
+    'TermcapLexer': ('pygments.lexers.configs', 'Termcap', ('termcap',), ('termcap', 'termcap.src'), ()),
+    'TerminfoLexer': ('pygments.lexers.configs', 'Terminfo', ('terminfo',), ('terminfo', 'terminfo.src'), ()),
+    'TerraformLexer': ('pygments.lexers.configs', 'Terraform', ('terraform', 'tf', 'hcl'), ('*.tf', '*.hcl'), ('application/x-tf', 'application/x-terraform')),
+    'TexLexer': ('pygments.lexers.markup', 'TeX', ('tex', 'latex'), ('*.tex', '*.aux', '*.toc'), ('text/x-tex', 'text/x-latex')),
+    'TextLexer': ('pygments.lexers.special', 'Text only', ('text',), ('*.txt',), ('text/plain',)),
+    'ThingsDBLexer': ('pygments.lexers.thingsdb', 'ThingsDB', ('ti', 'thingsdb'), ('*.ti',), ()),
+    'ThriftLexer': ('pygments.lexers.dsls', 'Thrift', ('thrift',), ('*.thrift',), ('application/x-thrift',)),
+    'TiddlyWiki5Lexer': ('pygments.lexers.markup', 'tiddler', ('tid',), ('*.tid',), ('text/vnd.tiddlywiki',)),
+    'TlbLexer': ('pygments.lexers.tlb', 'Tl-b', ('tlb',), ('*.tlb',), ()),
+    'TlsLexer': ('pygments.lexers.tls', 'TLS Presentation Language', ('tls',), (), ()),
+    'TodotxtLexer': ('pygments.lexers.textfmts', 'Todotxt', ('todotxt',), ('todo.txt', '*.todotxt'), ('text/x-todo',)),
+    'TransactSqlLexer': ('pygments.lexers.sql', 'Transact-SQL', ('tsql', 't-sql'), ('*.sql',), ('text/x-tsql',)),
+    'TreetopLexer': ('pygments.lexers.parsers', 'Treetop', ('treetop',), ('*.treetop', '*.tt'), ()),
+    'TsxLexer': ('pygments.lexers.jsx', 'TSX', ('tsx',), ('*.tsx',), ('text/typescript-tsx',)),
+    'TurtleLexer': ('pygments.lexers.rdf', 'Turtle', ('turtle',), ('*.ttl',), ('text/turtle', 'application/x-turtle')),
+    'TwigHtmlLexer': ('pygments.lexers.templates', 'HTML+Twig', ('html+twig',), ('*.twig',), ('text/html+twig',)),
+    'TwigLexer': ('pygments.lexers.templates', 'Twig', ('twig',), (), ('application/x-twig',)),
+    'TypeScriptLexer': ('pygments.lexers.javascript', 'TypeScript', ('typescript', 'ts'), ('*.ts',), ('application/x-typescript', 'text/x-typescript')),
+    'TypoScriptCssDataLexer': ('pygments.lexers.typoscript', 'TypoScriptCssData', ('typoscriptcssdata',), (), ()),
+    'TypoScriptHtmlDataLexer': ('pygments.lexers.typoscript', 'TypoScriptHtmlData', ('typoscripthtmldata',), (), ()),
+    'TypoScriptLexer': ('pygments.lexers.typoscript', 'TypoScript', ('typoscript',), ('*.typoscript',), ('text/x-typoscript',)),
+    'TypstLexer': ('pygments.lexers.typst', 'Typst', ('typst',), ('*.typ',), ('text/x-typst',)),
+    'UL4Lexer': ('pygments.lexers.ul4', 'UL4', ('ul4',), ('*.ul4',), ()),
+    'UcodeLexer': ('pygments.lexers.unicon', 'ucode', ('ucode',), ('*.u', '*.u1', '*.u2'), ()),
+    'UniconLexer': ('pygments.lexers.unicon', 'Unicon', ('unicon',), ('*.icn',), ('text/unicon',)),
+    'UnixConfigLexer': ('pygments.lexers.configs', 'Unix/Linux config files', ('unixconfig', 'linuxconfig'), (), ()),
+    'UrbiscriptLexer': ('pygments.lexers.urbi', 'UrbiScript', ('urbiscript',), ('*.u',), ('application/x-urbiscript',)),
+    'UrlEncodedLexer': ('pygments.lexers.html', 'urlencoded', ('urlencoded',), (), ('application/x-www-form-urlencoded',)),
+    'UsdLexer': ('pygments.lexers.usd', 'USD', ('usd', 'usda'), ('*.usd', '*.usda'), ()),
+    'VBScriptLexer': ('pygments.lexers.basic', 'VBScript', ('vbscript',), ('*.vbs', '*.VBS'), ()),
+    'VCLLexer': ('pygments.lexers.varnish', 'VCL', ('vcl',), ('*.vcl',), ('text/x-vclsrc',)),
+    'VCLSnippetLexer': ('pygments.lexers.varnish', 'VCLSnippets', ('vclsnippets', 'vclsnippet'), (), ('text/x-vclsnippet',)),
+    'VCTreeStatusLexer': ('pygments.lexers.console', 'VCTreeStatus', ('vctreestatus',), (), ()),
+    'VGLLexer': ('pygments.lexers.dsls', 'VGL', ('vgl',), ('*.rpf',), ()),
+    'ValaLexer': ('pygments.lexers.c_like', 'Vala', ('vala', 'vapi'), ('*.vala', '*.vapi'), ('text/x-vala',)),
+    'VbNetAspxLexer': ('pygments.lexers.dotnet', 'aspx-vb', ('aspx-vb',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()),
+    'VbNetLexer': ('pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet', 'lobas', 'oobas', 'sobas', 'visual-basic', 'visualbasic'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')),
+    'VelocityHtmlLexer': ('pygments.lexers.templates', 'HTML+Velocity', ('html+velocity',), (), ('text/html+velocity',)),
+    'VelocityLexer': ('pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()),
+    'VelocityXmlLexer': ('pygments.lexers.templates', 'XML+Velocity', ('xml+velocity',), (), ('application/xml+velocity',)),
+    'VerifpalLexer': ('pygments.lexers.verifpal', 'Verifpal', ('verifpal',), ('*.vp',), ('text/x-verifpal',)),
+    'VerilogLexer': ('pygments.lexers.hdl', 'verilog', ('verilog', 'v'), ('*.v',), ('text/x-verilog',)),
+    'VhdlLexer': ('pygments.lexers.hdl', 'vhdl', ('vhdl',), ('*.vhdl', '*.vhd'), ('text/x-vhdl',)),
+    'VimLexer': ('pygments.lexers.textedit', 'VimL', ('vim',), ('*.vim', '.vimrc', '.exrc', '.gvimrc', '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc'), ('text/x-vim',)),
+    'VisualPrologGrammarLexer': ('pygments.lexers.vip', 'Visual Prolog Grammar', ('visualprologgrammar',), ('*.vipgrm',), ()),
+    'VisualPrologLexer': ('pygments.lexers.vip', 'Visual Prolog', ('visualprolog',), ('*.pro', '*.cl', '*.i', '*.pack', '*.ph'), ()),
+    'VueLexer': ('pygments.lexers.html', 'Vue', ('vue',), ('*.vue',), ()),
+    'VyperLexer': ('pygments.lexers.vyper', 'Vyper', ('vyper',), ('*.vy',), ()),
+    'WDiffLexer': ('pygments.lexers.diff', 'WDiff', ('wdiff',), ('*.wdiff',), ()),
+    'WatLexer': ('pygments.lexers.webassembly', 'WebAssembly', ('wast', 'wat'), ('*.wat', '*.wast'), ()),
+    'WebIDLLexer': ('pygments.lexers.webidl', 'Web IDL', ('webidl',), ('*.webidl',), ()),
+    'WgslLexer': ('pygments.lexers.wgsl', 'WebGPU Shading Language', ('wgsl',), ('*.wgsl',), ('text/wgsl',)),
+    'WhileyLexer': ('pygments.lexers.whiley', 'Whiley', ('whiley',), ('*.whiley',), ('text/x-whiley',)),
+    'WikitextLexer': ('pygments.lexers.markup', 'Wikitext', ('wikitext', 'mediawiki'), (), ('text/x-wiki',)),
+    'WoWTocLexer': ('pygments.lexers.wowtoc', 'World of Warcraft TOC', ('wowtoc',), ('*.toc',), ()),
+    'WrenLexer': ('pygments.lexers.wren', 'Wren', ('wren',), ('*.wren',), ()),
+    'X10Lexer': ('pygments.lexers.x10', 'X10', ('x10', 'xten'), ('*.x10',), ('text/x-x10',)),
+    'XMLUL4Lexer': ('pygments.lexers.ul4', 'XML+UL4', ('xml+ul4',), ('*.xmlul4',), ()),
+    'XQueryLexer': ('pygments.lexers.webmisc', 'XQuery', ('xquery', 'xqy', 'xq', 'xql', 'xqm'), ('*.xqy', '*.xquery', '*.xq', '*.xql', '*.xqm'), ('text/xquery', 'application/xquery')),
+    'XmlDjangoLexer': ('pygments.lexers.templates', 'XML+Django/Jinja', ('xml+django', 'xml+jinja'), ('*.xml.j2', '*.xml.jinja2'), ('application/xml+django', 'application/xml+jinja')),
+    'XmlErbLexer': ('pygments.lexers.templates', 'XML+Ruby', ('xml+ruby', 'xml+erb'), (), ('application/xml+ruby',)),
+    'XmlLexer': ('pygments.lexers.html', 'XML', ('xml',), ('*.xml', '*.xsl', '*.rss', '*.xslt', '*.xsd', '*.wsdl', '*.wsf'), ('text/xml', 'application/xml', 'image/svg+xml', 'application/rss+xml', 'application/atom+xml')),
+    'XmlPhpLexer': ('pygments.lexers.templates', 'XML+PHP', ('xml+php',), (), ('application/xml+php',)),
+    'XmlSmartyLexer': ('pygments.lexers.templates', 'XML+Smarty', ('xml+smarty',), (), ('application/xml+smarty',)),
+    'XorgLexer': ('pygments.lexers.xorg', 'Xorg', ('xorg.conf',), ('xorg.conf',), ()),
+    'XppLexer': ('pygments.lexers.dotnet', 'X++', ('xpp', 'x++'), ('*.xpp',), ()),
+    'XsltLexer': ('pygments.lexers.html', 'XSLT', ('xslt',), ('*.xsl', '*.xslt', '*.xpl'), ('application/xsl+xml', 'application/xslt+xml')),
+    'XtendLexer': ('pygments.lexers.jvm', 'Xtend', ('xtend',), ('*.xtend',), ('text/x-xtend',)),
+    'XtlangLexer': ('pygments.lexers.lisp', 'xtlang', ('extempore',), ('*.xtm',), ()),
+    'YamlJinjaLexer': ('pygments.lexers.templates', 'YAML+Jinja', ('yaml+jinja', 'salt', 'sls'), ('*.sls', '*.yaml.j2', '*.yml.j2', '*.yaml.jinja2', '*.yml.jinja2'), ('text/x-yaml+jinja', 'text/x-sls')),
+    'YamlLexer': ('pygments.lexers.data', 'YAML', ('yaml',), ('*.yaml', '*.yml'), ('text/x-yaml',)),
+    'YangLexer': ('pygments.lexers.yang', 'YANG', ('yang',), ('*.yang',), ('application/yang',)),
+    'YaraLexer': ('pygments.lexers.yara', 'YARA', ('yara', 'yar'), ('*.yar',), ('text/x-yara',)),
+    'ZeekLexer': ('pygments.lexers.dsls', 'Zeek', ('zeek', 'bro'), ('*.zeek', '*.bro'), ()),
+    'ZephirLexer': ('pygments.lexers.php', 'Zephir', ('zephir',), ('*.zep',), ()),
+    'ZigLexer': ('pygments.lexers.zig', 'Zig', ('zig',), ('*.zig',), ('text/zig',)),
+    'apdlexer': ('pygments.lexers.apdlexer', 'ANSYS parametric design language', ('ansys', 'apdl'), ('*.ans',), ()),
+}
diff --git a/.venv/Lib/site-packages/pygments/lexers/_mql_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_mql_builtins.py
new file mode 100644 (file)
index 0000000..181c25d
--- /dev/null
@@ -0,0 +1,1171 @@
+"""
+    pygments.lexers._mql_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Builtins for the MqlLexer.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+types = (
+    'AccountBalance',
+    'AccountCompany',
+    'AccountCredit',
+    'AccountCurrency',
+    'AccountEquity',
+    'AccountFreeMarginCheck',
+    'AccountFreeMarginMode',
+    'AccountFreeMargin',
+    'AccountInfoDouble',
+    'AccountInfoInteger',
+    'AccountInfoString',
+    'AccountLeverage',
+    'AccountMargin',
+    'AccountName',
+    'AccountNumber',
+    'AccountProfit',
+    'AccountServer',
+    'AccountStopoutLevel',
+    'AccountStopoutMode',
+    'Alert',
+    'ArrayBsearch',
+    'ArrayCompare',
+    'ArrayCopyRates',
+    'ArrayCopySeries',
+    'ArrayCopy',
+    'ArrayDimension',
+    'ArrayFill',
+    'ArrayFree',
+    'ArrayGetAsSeries',
+    'ArrayInitialize',
+    'ArrayIsDynamic',
+    'ArrayIsSeries',
+    'ArrayMaximum',
+    'ArrayMinimum',
+    'ArrayRange',
+    'ArrayResize',
+    'ArraySetAsSeries',
+    'ArraySize',
+    'ArraySort',
+    'CharArrayToString',
+    'CharToString',
+    'CharToStr',
+    'CheckPointer',
+    'ColorToARGB',
+    'ColorToString',
+    'Comment',
+    'CopyClose',
+    'CopyHigh',
+    'CopyLow',
+    'CopyOpen',
+    'CopyRates',
+    'CopyRealVolume',
+    'CopySpread',
+    'CopyTickVolume',
+    'CopyTime',
+    'DayOfWeek',
+    'DayOfYear',
+    'Day',
+    'DebugBreak',
+    'Digits',
+    'DoubleToString',
+    'DoubleToStr',
+    'EnumToString',
+    'EventChartCustom',
+    'EventKillTimer',
+    'EventSetMillisecondTimer',
+    'EventSetTimer',
+    'ExpertRemove',
+    'FileClose',
+    'FileCopy',
+    'FileDelete',
+    'FileFindClose',
+    'FileFindFirst',
+    'FileFindNext',
+    'FileFlush',
+    'FileGetInteger',
+    'FileIsEnding',
+    'FileIsExist',
+    'FileIsLineEnding',
+    'FileMove',
+    'FileOpenHistory',
+    'FileOpen',
+    'FileReadArray',
+    'FileReadBool',
+    'FileReadDatetime',
+    'FileReadDouble',
+    'FileReadFloat',
+    'FileReadInteger',
+    'FileReadLong',
+    'FileReadNumber',
+    'FileReadString',
+    'FileReadStruct',
+    'FileSeek',
+    'FileSize',
+    'FileTell',
+    'FileWriteArray',
+    'FileWriteDouble',
+    'FileWriteFloat',
+    'FileWriteInteger',
+    'FileWriteLong',
+    'FileWriteString',
+    'FileWriteStruct',
+    'FileWrite',
+    'FolderClean',
+    'FolderCreate',
+    'FolderDelete',
+    'GetLastError',
+    'GetPointer',
+    'GetTickCount',
+    'GlobalVariableCheck',
+    'GlobalVariableDel',
+    'GlobalVariableGet',
+    'GlobalVariableName',
+    'GlobalVariableSetOnCondition',
+    'GlobalVariableSet',
+    'GlobalVariableTemp',
+    'GlobalVariableTime',
+    'GlobalVariablesDeleteAll',
+    'GlobalVariablesFlush',
+    'GlobalVariablesTotal',
+    'HideTestIndicators',
+    'Hour',
+    'IndicatorBuffers',
+    'IndicatorCounted',
+    'IndicatorDigits',
+    'IndicatorSetDouble',
+    'IndicatorSetInteger',
+    'IndicatorSetString',
+    'IndicatorShortName',
+    'IntegerToString',
+    'IsConnected',
+    'IsDemo',
+    'IsDllsAllowed',
+    'IsExpertEnabled',
+    'IsLibrariesAllowed',
+    'IsOptimization',
+    'IsStopped',
+    'IsTesting',
+    'IsTradeAllowed',
+    'IsTradeContextBusy',
+    'IsVisualMode',
+    'MQLInfoInteger',
+    'MQLInfoString',
+    'MarketInfo',
+    'MathAbs',
+    'MathArccos',
+    'MathArcsin',
+    'MathArctan',
+    'MathCeil',
+    'MathCos',
+    'MathExp',
+    'MathFloor',
+    'MathIsValidNumber',
+    'MathLog',
+    'MathMax',
+    'MathMin',
+    'MathMod',
+    'MathPow',
+    'MathRand',
+    'MathRound',
+    'MathSin',
+    'MathSqrt',
+    'MathSrand',
+    'MathTan',
+    'MessageBox',
+    'Minute',
+    'Month',
+    'NormalizeDouble',
+    'ObjectCreate',
+    'ObjectDelete',
+    'ObjectDescription',
+    'ObjectFind',
+    'ObjectGetDouble',
+    'ObjectGetFiboDescription',
+    'ObjectGetInteger',
+    'ObjectGetShiftByValue',
+    'ObjectGetString',
+    'ObjectGetTimeByValue',
+    'ObjectGetValueByShift',
+    'ObjectGetValueByTime',
+    'ObjectGet',
+    'ObjectMove',
+    'ObjectName',
+    'ObjectSetDouble',
+    'ObjectSetFiboDescription',
+    'ObjectSetInteger',
+    'ObjectSetString',
+    'ObjectSetText',
+    'ObjectSet',
+    'ObjectType',
+    'ObjectsDeleteAll',
+    'ObjectsTotal',
+    'OrderCloseBy',
+    'OrderClosePrice',
+    'OrderCloseTime',
+    'OrderClose',
+    'OrderComment',
+    'OrderCommission',
+    'OrderDelete',
+    'OrderExpiration',
+    'OrderLots',
+    'OrderMagicNumber',
+    'OrderModify',
+    'OrderOpenPrice',
+    'OrderOpenTime',
+    'OrderPrint',
+    'OrderProfit',
+    'OrderSelect',
+    'OrderSend',
+    'OrderStopLoss',
+    'OrderSwap',
+    'OrderSymbol',
+    'OrderTakeProfit',
+    'OrderTicket',
+    'OrderType',
+    'OrdersHistoryTotal',
+    'OrdersTotal',
+    'PeriodSeconds',
+    'Period',
+    'PlaySound',
+    'Point',
+    'PrintFormat',
+    'Print',
+    'RefreshRates',
+    'ResetLastError',
+    'ResourceCreate',
+    'ResourceFree',
+    'ResourceReadImage',
+    'ResourceSave',
+    'Seconds',
+    'SendFTP',
+    'SendMail',
+    'SendNotification',
+    'SeriesInfoInteger',
+    'SetIndexArrow',
+    'SetIndexBuffer',
+    'SetIndexDrawBegin',
+    'SetIndexEmptyValue',
+    'SetIndexLabel',
+    'SetIndexShift',
+    'SetIndexStyle',
+    'SetLevelStyle',
+    'SetLevelValue',
+    'ShortArrayToString',
+    'ShortToString',
+    'Sleep',
+    'StrToDouble',
+    'StrToInteger',
+    'StrToTime',
+    'StringAdd',
+    'StringBufferLen',
+    'StringCompare',
+    'StringConcatenate',
+    'StringFill',
+    'StringFind',
+    'StringFormat',
+    'StringGetCharacter',
+    'StringGetChar',
+    'StringInit',
+    'StringLen',
+    'StringReplace',
+    'StringSetCharacter',
+    'StringSetChar',
+    'StringSplit',
+    'StringSubstr',
+    'StringToCharArray',
+    'StringToColor',
+    'StringToDouble',
+    'StringToInteger',
+    'StringToLower',
+    'StringToShortArray',
+    'StringToTime',
+    'StringToUpper',
+    'StringTrimLeft',
+    'StringTrimRight',
+    'StructToTime',
+    'SymbolInfoDouble',
+    'SymbolInfoInteger',
+    'SymbolInfoSessionQuote',
+    'SymbolInfoSessionTrade',
+    'SymbolInfoString',
+    'SymbolInfoTick',
+    'SymbolIsSynchronized',
+    'SymbolName',
+    'SymbolSelect',
+    'SymbolsTotal',
+    'Symbol',
+    'TerminalClose',
+    'TerminalCompany',
+    'TerminalName',
+    'TerminalPath',
+    'TesterStatistics',
+    'TextGetSize',
+    'TextOut',
+    'TextSetFont',
+    'TimeCurrent',
+    'TimeDayOfWeek',
+    'TimeDayOfYear',
+    'TimeDaylightSavings',
+    'TimeDay',
+    'TimeGMTOffset',
+    'TimeGMT',
+    'TimeHour',
+    'TimeLocal',
+    'TimeMinute',
+    'TimeMonth',
+    'TimeSeconds',
+    'TimeToString',
+    'TimeToStruct',
+    'TimeToStr',
+    'TimeTradeServer',
+    'TimeYear',
+    'UninitializeReason',
+    'WindowBarsPerChart',
+    'WindowExpertName',
+    'WindowFind',
+    'WindowFirstVisibleBar',
+    'WindowHandle',
+    'WindowIsVisible',
+    'WindowOnDropped',
+    'WindowPriceMax',
+    'WindowPriceMin',
+    'WindowPriceOnDropped',
+    'WindowRedraw',
+    'WindowScreenShot',
+    'WindowTimeOnDropped',
+    'WindowXOnDropped',
+    'WindowYOnDropped',
+    'WindowsTotal',
+    'Year',
+    'ZeroMemory',
+    'iAC',
+    'iADX',
+    'iAD',
+    'iAO',
+    'iATR',
+    'iAlligator',
+    'iBWMFI',
+    'iBandsOnArray',
+    'iBands',
+    'iBarShift',
+    'iBars',
+    'iBearsPower',
+    'iBullsPower',
+    'iCCIOnArray',
+    'iCCI',
+    'iClose',
+    'iCustom',
+    'iDeMarker',
+    'iEnvelopesOnArray',
+    'iEnvelopes',
+    'iForce',
+    'iFractals',
+    'iGator',
+    'iHighest',
+    'iHigh',
+    'iIchimoku',
+    'iLowest',
+    'iLow',
+    'iMACD',
+    'iMAOnArray',
+    'iMA',
+    'iMFI',
+    'iMomentumOnArray',
+    'iMomentum',
+    'iOBV',
+    'iOpen',
+    'iOsMA',
+    'iRSIOnArray',
+    'iRSI',
+    'iRVI',
+    'iSAR',
+    'iStdDevOnArray',
+    'iStdDev',
+    'iStochastic',
+    'iTime',
+    'iVolume',
+    'iWPR',
+)
+
+constants = (
+    'ACCOUNT_BALANCE',
+    'ACCOUNT_COMPANY',
+    'ACCOUNT_CREDIT',
+    'ACCOUNT_CURRENCY',
+    'ACCOUNT_EQUITY',
+    'ACCOUNT_FREEMARGIN',
+    'ACCOUNT_LEVERAGE',
+    'ACCOUNT_LIMIT_ORDERS',
+    'ACCOUNT_LOGIN',
+    'ACCOUNT_MARGIN',
+    'ACCOUNT_MARGIN_LEVEL',
+    'ACCOUNT_MARGIN_SO_CALL',
+    'ACCOUNT_MARGIN_SO_MODE',
+    'ACCOUNT_MARGIN_SO_SO',
+    'ACCOUNT_NAME',
+    'ACCOUNT_PROFIT',
+    'ACCOUNT_SERVER',
+    'ACCOUNT_STOPOUT_MODE_MONEY',
+    'ACCOUNT_STOPOUT_MODE_PERCENT',
+    'ACCOUNT_TRADE_ALLOWED',
+    'ACCOUNT_TRADE_EXPERT',
+    'ACCOUNT_TRADE_MODE',
+    'ACCOUNT_TRADE_MODE_CONTEST',
+    'ACCOUNT_TRADE_MODE_DEMO',
+    'ACCOUNT_TRADE_MODE_REAL',
+    'ALIGN_CENTER',
+    'ALIGN_LEFT',
+    'ALIGN_RIGHT',
+    'ANCHOR_BOTTOM',
+    'ANCHOR_CENTER',
+    'ANCHOR_LEFT',
+    'ANCHOR_LEFT_LOWER',
+    'ANCHOR_LEFT_UPPER',
+    'ANCHOR_LOWER',
+    'ANCHOR_RIGHT',
+    'ANCHOR_RIGHT_LOWER',
+    'ANCHOR_RIGHT_UPPER',
+    'ANCHOR_TOP',
+    'ANCHOR_UPPER',
+    'BORDER_FLAT',
+    'BORDER_RAISED',
+    'BORDER_SUNKEN',
+    'CHARTEVENT_CHART_CHANGE',
+    'CHARTEVENT_CLICK',
+    'CHARTEVENT_CUSTOM',
+    'CHARTEVENT_CUSTOM_LAST',
+    'CHARTEVENT_KEYDOWN',
+    'CHARTEVENT_MOUSE_MOVE',
+    'CHARTEVENT_OBJECT_CHANGE',
+    'CHARTEVENT_OBJECT_CLICK',
+    'CHARTEVENT_OBJECT_CREATE',
+    'CHARTEVENT_OBJECT_DELETE',
+    'CHARTEVENT_OBJECT_DRAG',
+    'CHARTEVENT_OBJECT_ENDEDIT',
+    'CHARTS_MAX',
+    'CHART_AUTOSCROLL',
+    'CHART_BARS',
+    'CHART_BEGIN',
+    'CHART_BRING_TO_TOP',
+    'CHART_CANDLES',
+    'CHART_COLOR_ASK',
+    'CHART_COLOR_BACKGROUND',
+    'CHART_COLOR_BID',
+    'CHART_COLOR_CANDLE_BEAR',
+    'CHART_COLOR_CANDLE_BULL',
+    'CHART_COLOR_CHART_DOWN',
+    'CHART_COLOR_CHART_LINE',
+    'CHART_COLOR_CHART_UP',
+    'CHART_COLOR_FOREGROUND',
+    'CHART_COLOR_GRID',
+    'CHART_COLOR_LAST',
+    'CHART_COLOR_STOP_LEVEL',
+    'CHART_COLOR_VOLUME',
+    'CHART_COMMENT',
+    'CHART_CURRENT_POS',
+    'CHART_DRAG_TRADE_LEVELS',
+    'CHART_END',
+    'CHART_EVENT_MOUSE_MOVE',
+    'CHART_EVENT_OBJECT_CREATE',
+    'CHART_EVENT_OBJECT_DELETE',
+    'CHART_FIRST_VISIBLE_BAR',
+    'CHART_FIXED_MAX',
+    'CHART_FIXED_MIN',
+    'CHART_FIXED_POSITION',
+    'CHART_FOREGROUND',
+    'CHART_HEIGHT_IN_PIXELS',
+    'CHART_IS_OBJECT',
+    'CHART_LINE',
+    'CHART_MODE',
+    'CHART_MOUSE_SCROLL',
+    'CHART_POINTS_PER_BAR',
+    'CHART_PRICE_MAX',
+    'CHART_PRICE_MIN',
+    'CHART_SCALEFIX',
+    'CHART_SCALEFIX_11',
+    'CHART_SCALE',
+    'CHART_SCALE_PT_PER_BAR',
+    'CHART_SHIFT',
+    'CHART_SHIFT_SIZE',
+    'CHART_SHOW_ASK_LINE',
+    'CHART_SHOW_BID_LINE',
+    'CHART_SHOW_DATE_SCALE',
+    'CHART_SHOW_GRID',
+    'CHART_SHOW_LAST_LINE',
+    'CHART_SHOW_OBJECT_DESCR',
+    'CHART_SHOW_OHLC',
+    'CHART_SHOW_PERIOD_SEP',
+    'CHART_SHOW_PRICE_SCALE',
+    'CHART_SHOW_TRADE_LEVELS',
+    'CHART_SHOW_VOLUMES',
+    'CHART_VISIBLE_BARS',
+    'CHART_VOLUME_HIDE',
+    'CHART_VOLUME_REAL',
+    'CHART_VOLUME_TICK',
+    'CHART_WIDTH_IN_BARS',
+    'CHART_WIDTH_IN_PIXELS',
+    'CHART_WINDOWS_TOTAL',
+    'CHART_WINDOW_HANDLE',
+    'CHART_WINDOW_IS_VISIBLE',
+    'CHART_WINDOW_YDISTANCE',
+    'CHAR_MAX',
+    'CHAR_MIN',
+    'CLR_NONE',
+    'CORNER_LEFT_LOWER',
+    'CORNER_LEFT_UPPER',
+    'CORNER_RIGHT_LOWER',
+    'CORNER_RIGHT_UPPER',
+    'CP_ACP',
+    'CP_MACCP',
+    'CP_OEMCP',
+    'CP_SYMBOL',
+    'CP_THREAD_ACP',
+    'CP_UTF7',
+    'CP_UTF8',
+    'DBL_DIG',
+    'DBL_EPSILON',
+    'DBL_MANT_DIG',
+    'DBL_MAX',
+    'DBL_MAX_10_EXP',
+    'DBL_MAX_EXP',
+    'DBL_MIN',
+    'DBL_MIN_10_EXP',
+    'DBL_MIN_EXP',
+    'DRAW_ARROW',
+    'DRAW_FILLING',
+    'DRAW_HISTOGRAM',
+    'DRAW_LINE',
+    'DRAW_NONE',
+    'DRAW_SECTION',
+    'DRAW_ZIGZAG',
+    'EMPTY',
+    'EMPTY_VALUE',
+    'ERR_ACCOUNT_DISABLED',
+    'ERR_BROKER_BUSY',
+    'ERR_COMMON_ERROR',
+    'ERR_INVALID_ACCOUNT',
+    'ERR_INVALID_PRICE',
+    'ERR_INVALID_STOPS',
+    'ERR_INVALID_TRADE_PARAMETERS',
+    'ERR_INVALID_TRADE_VOLUME',
+    'ERR_LONG_POSITIONS_ONLY_ALLOWED',
+    'ERR_MALFUNCTIONAL_TRADE',
+    'ERR_MARKET_CLOSED',
+    'ERR_NOT_ENOUGH_MONEY',
+    'ERR_NOT_ENOUGH_RIGHTS',
+    'ERR_NO_CONNECTION',
+    'ERR_NO_ERROR',
+    'ERR_NO_RESULT',
+    'ERR_OFF_QUOTES',
+    'ERR_OLD_VERSION',
+    'ERR_ORDER_LOCKED',
+    'ERR_PRICE_CHANGED',
+    'ERR_REQUOTE',
+    'ERR_SERVER_BUSY',
+    'ERR_TOO_FREQUENT_REQUESTS',
+    'ERR_TOO_MANY_REQUESTS',
+    'ERR_TRADE_CONTEXT_BUSY',
+    'ERR_TRADE_DISABLED',
+    'ERR_TRADE_EXPIRATION_DENIED',
+    'ERR_TRADE_HEDGE_PROHIBITED',
+    'ERR_TRADE_MODIFY_DENIED',
+    'ERR_TRADE_PROHIBITED_BY_FIFO',
+    'ERR_TRADE_TIMEOUT',
+    'ERR_TRADE_TOO_MANY_ORDERS',
+    'FILE_ACCESS_DATE',
+    'FILE_ANSI',
+    'FILE_BIN',
+    'FILE_COMMON',
+    'FILE_CREATE_DATE',
+    'FILE_CSV',
+    'FILE_END',
+    'FILE_EXISTS',
+    'FILE_IS_ANSI',
+    'FILE_IS_BINARY',
+    'FILE_IS_COMMON',
+    'FILE_IS_CSV',
+    'FILE_IS_READABLE',
+    'FILE_IS_TEXT',
+    'FILE_IS_WRITABLE',
+    'FILE_LINE_END',
+    'FILE_MODIFY_DATE',
+    'FILE_POSITION',
+    'FILE_READ',
+    'FILE_REWRITE',
+    'FILE_SHARE_READ',
+    'FILE_SHARE_WRITE',
+    'FILE_SIZE',
+    'FILE_TXT',
+    'FILE_UNICODE',
+    'FILE_WRITE',
+    'FLT_DIG',
+    'FLT_EPSILON',
+    'FLT_MANT_DIG',
+    'FLT_MAX',
+    'FLT_MAX_10_EXP',
+    'FLT_MAX_EXP',
+    'FLT_MIN',
+    'FLT_MIN_10_EXP',
+    'FLT_MIN_EXP',
+    'FRIDAY',
+    'GANN_DOWN_TREND',
+    'GANN_UP_TREND',
+    'IDABORT',
+    'IDCANCEL',
+    'IDCONTINUE',
+    'IDIGNORE',
+    'IDNO',
+    'IDOK',
+    'IDRETRY',
+    'IDTRYAGAIN',
+    'IDYES',
+    'INDICATOR_CALCULATIONS',
+    'INDICATOR_COLOR_INDEX',
+    'INDICATOR_DATA',
+    'INDICATOR_DIGITS',
+    'INDICATOR_HEIGHT',
+    'INDICATOR_LEVELCOLOR',
+    'INDICATOR_LEVELSTYLE',
+    'INDICATOR_LEVELS',
+    'INDICATOR_LEVELTEXT',
+    'INDICATOR_LEVELVALUE',
+    'INDICATOR_LEVELWIDTH',
+    'INDICATOR_MAXIMUM',
+    'INDICATOR_MINIMUM',
+    'INDICATOR_SHORTNAME',
+    'INT_MAX',
+    'INT_MIN',
+    'INVALID_HANDLE',
+    'IS_DEBUG_MODE',
+    'IS_PROFILE_MODE',
+    'LICENSE_DEMO',
+    'LICENSE_FREE',
+    'LICENSE_FULL',
+    'LICENSE_TIME',
+    'LONG_MAX',
+    'LONG_MIN',
+    'MB_ABORTRETRYIGNORE',
+    'MB_CANCELTRYCONTINUE',
+    'MB_DEFBUTTON1',
+    'MB_DEFBUTTON2',
+    'MB_DEFBUTTON3',
+    'MB_DEFBUTTON4',
+    'MB_ICONASTERISK',
+    'MB_ICONERROR',
+    'MB_ICONEXCLAMATION',
+    'MB_ICONHAND',
+    'MB_ICONINFORMATION',
+    'MB_ICONQUESTION',
+    'MB_ICONSTOP',
+    'MB_ICONWARNING',
+    'MB_OKCANCEL',
+    'MB_OK',
+    'MB_RETRYCANCEL',
+    'MB_YESNOCANCEL',
+    'MB_YESNO',
+    'MODE_ASK',
+    'MODE_BID',
+    'MODE_CHINKOUSPAN',
+    'MODE_CLOSE',
+    'MODE_DIGITS',
+    'MODE_EMA',
+    'MODE_EXPIRATION',
+    'MODE_FREEZELEVEL',
+    'MODE_GATORJAW',
+    'MODE_GATORLIPS',
+    'MODE_GATORTEETH',
+    'MODE_HIGH',
+    'MODE_KIJUNSEN',
+    'MODE_LOTSIZE',
+    'MODE_LOTSTEP',
+    'MODE_LOWER',
+    'MODE_LOW',
+    'MODE_LWMA',
+    'MODE_MAIN',
+    'MODE_MARGINCALCMODE',
+    'MODE_MARGINHEDGED',
+    'MODE_MARGININIT',
+    'MODE_MARGINMAINTENANCE',
+    'MODE_MARGINREQUIRED',
+    'MODE_MAXLOT',
+    'MODE_MINLOT',
+    'MODE_MINUSDI',
+    'MODE_OPEN',
+    'MODE_PLUSDI',
+    'MODE_POINT',
+    'MODE_PROFITCALCMODE',
+    'MODE_SENKOUSPANA',
+    'MODE_SENKOUSPANB',
+    'MODE_SIGNAL',
+    'MODE_SMA',
+    'MODE_SMMA',
+    'MODE_SPREAD',
+    'MODE_STARTING',
+    'MODE_STOPLEVEL',
+    'MODE_SWAPLONG',
+    'MODE_SWAPSHORT',
+    'MODE_SWAPTYPE',
+    'MODE_TENKANSEN',
+    'MODE_TICKSIZE',
+    'MODE_TICKVALUE',
+    'MODE_TIME',
+    'MODE_TRADEALLOWED',
+    'MODE_UPPER',
+    'MODE_VOLUME',
+    'MONDAY',
+    'MQL_DEBUG',
+    'MQL_DLLS_ALLOWED',
+    'MQL_FRAME_MODE',
+    'MQL_LICENSE_TYPE',
+    'MQL_OPTIMIZATION',
+    'MQL_PROFILER',
+    'MQL_PROGRAM_NAME',
+    'MQL_PROGRAM_PATH',
+    'MQL_PROGRAM_TYPE',
+    'MQL_TESTER',
+    'MQL_TRADE_ALLOWED',
+    'MQL_VISUAL_MODE',
+    'M_1_PI',
+    'M_2_PI',
+    'M_2_SQRTPI',
+    'M_E',
+    'M_LN2',
+    'M_LN10',
+    'M_LOG2E',
+    'M_LOG10E',
+    'M_PI',
+    'M_PI_2',
+    'M_PI_4',
+    'M_SQRT1_2',
+    'M_SQRT2',
+    'NULL',
+    'OBJPROP_ALIGN',
+    'OBJPROP_ANCHOR',
+    'OBJPROP_ANGLE',
+    'OBJPROP_ARROWCODE',
+    'OBJPROP_BACK',
+    'OBJPROP_BGCOLOR',
+    'OBJPROP_BMPFILE',
+    'OBJPROP_BORDER_COLOR',
+    'OBJPROP_BORDER_TYPE',
+    'OBJPROP_CHART_ID',
+    'OBJPROP_CHART_SCALE',
+    'OBJPROP_COLOR',
+    'OBJPROP_CORNER',
+    'OBJPROP_CREATETIME',
+    'OBJPROP_DATE_SCALE',
+    'OBJPROP_DEVIATION',
+    'OBJPROP_DRAWLINES',
+    'OBJPROP_ELLIPSE',
+    'OBJPROP_FIBOLEVELS',
+    'OBJPROP_FILL',
+    'OBJPROP_FIRSTLEVEL',
+    'OBJPROP_FONTSIZE',
+    'OBJPROP_FONT',
+    'OBJPROP_HIDDEN',
+    'OBJPROP_LEVELCOLOR',
+    'OBJPROP_LEVELSTYLE',
+    'OBJPROP_LEVELS',
+    'OBJPROP_LEVELTEXT',
+    'OBJPROP_LEVELVALUE',
+    'OBJPROP_LEVELWIDTH',
+    'OBJPROP_NAME',
+    'OBJPROP_PERIOD',
+    'OBJPROP_PRICE1',
+    'OBJPROP_PRICE2',
+    'OBJPROP_PRICE3',
+    'OBJPROP_PRICE',
+    'OBJPROP_PRICE_SCALE',
+    'OBJPROP_RAY',
+    'OBJPROP_RAY_RIGHT',
+    'OBJPROP_READONLY',
+    'OBJPROP_SCALE',
+    'OBJPROP_SELECTABLE',
+    'OBJPROP_SELECTED',
+    'OBJPROP_STATE',
+    'OBJPROP_STYLE',
+    'OBJPROP_SYMBOL',
+    'OBJPROP_TEXT',
+    'OBJPROP_TIME1',
+    'OBJPROP_TIME2',
+    'OBJPROP_TIME3',
+    'OBJPROP_TIMEFRAMES',
+    'OBJPROP_TIME',
+    'OBJPROP_TOOLTIP',
+    'OBJPROP_TYPE',
+    'OBJPROP_WIDTH',
+    'OBJPROP_XDISTANCE',
+    'OBJPROP_XOFFSET',
+    'OBJPROP_XSIZE',
+    'OBJPROP_YDISTANCE',
+    'OBJPROP_YOFFSET',
+    'OBJPROP_YSIZE',
+    'OBJPROP_ZORDER',
+    'OBJ_ALL_PERIODS',
+    'OBJ_ARROW',
+    'OBJ_ARROW_BUY',
+    'OBJ_ARROW_CHECK',
+    'OBJ_ARROW_DOWN',
+    'OBJ_ARROW_LEFT_PRICE',
+    'OBJ_ARROW_RIGHT_PRICE',
+    'OBJ_ARROW_SELL',
+    'OBJ_ARROW_STOP',
+    'OBJ_ARROW_THUMB_DOWN',
+    'OBJ_ARROW_THUMB_UP',
+    'OBJ_ARROW_UP',
+    'OBJ_BITMAP',
+    'OBJ_BITMAP_LABEL',
+    'OBJ_BUTTON',
+    'OBJ_CHANNEL',
+    'OBJ_CYCLES',
+    'OBJ_EDIT',
+    'OBJ_ELLIPSE',
+    'OBJ_EVENT',
+    'OBJ_EXPANSION',
+    'OBJ_FIBOARC',
+    'OBJ_FIBOCHANNEL',
+    'OBJ_FIBOFAN',
+    'OBJ_FIBOTIMES',
+    'OBJ_FIBO',
+    'OBJ_GANNFAN',
+    'OBJ_GANNGRID',
+    'OBJ_GANNLINE',
+    'OBJ_HLINE',
+    'OBJ_LABEL',
+    'OBJ_NO_PERIODS',
+    'OBJ_PERIOD_D1',
+    'OBJ_PERIOD_H1',
+    'OBJ_PERIOD_H4',
+    'OBJ_PERIOD_M1',
+    'OBJ_PERIOD_M5',
+    'OBJ_PERIOD_M15',
+    'OBJ_PERIOD_M30',
+    'OBJ_PERIOD_MN1',
+    'OBJ_PERIOD_W1',
+    'OBJ_PITCHFORK',
+    'OBJ_RECTANGLE',
+    'OBJ_RECTANGLE_LABEL',
+    'OBJ_REGRESSION',
+    'OBJ_STDDEVCHANNEL',
+    'OBJ_TEXT',
+    'OBJ_TRENDBYANGLE',
+    'OBJ_TREND',
+    'OBJ_TRIANGLE',
+    'OBJ_VLINE',
+    'OP_BUYLIMIT',
+    'OP_BUYSTOP',
+    'OP_BUY',
+    'OP_SELLLIMIT',
+    'OP_SELLSTOP',
+    'OP_SELL',
+    'PERIOD_CURRENT',
+    'PERIOD_D1',
+    'PERIOD_H1',
+    'PERIOD_H2',
+    'PERIOD_H3',
+    'PERIOD_H4',
+    'PERIOD_H6',
+    'PERIOD_H8',
+    'PERIOD_H12',
+    'PERIOD_M1',
+    'PERIOD_M2',
+    'PERIOD_M3',
+    'PERIOD_M4',
+    'PERIOD_M5',
+    'PERIOD_M6',
+    'PERIOD_M10',
+    'PERIOD_M12',
+    'PERIOD_M15',
+    'PERIOD_M20',
+    'PERIOD_M30',
+    'PERIOD_MN1',
+    'PERIOD_W1',
+    'POINTER_AUTOMATIC',
+    'POINTER_DYNAMIC',
+    'POINTER_INVALID',
+    'PRICE_CLOSE',
+    'PRICE_HIGH',
+    'PRICE_LOW',
+    'PRICE_MEDIAN',
+    'PRICE_OPEN',
+    'PRICE_TYPICAL',
+    'PRICE_WEIGHTED',
+    'PROGRAM_EXPERT',
+    'PROGRAM_INDICATOR',
+    'PROGRAM_SCRIPT',
+    'REASON_ACCOUNT',
+    'REASON_CHARTCHANGE',
+    'REASON_CHARTCLOSE',
+    'REASON_CLOSE',
+    'REASON_INITFAILED',
+    'REASON_PARAMETERS',
+    'REASON_PROGRAM'
+    'REASON_RECOMPILE',
+    'REASON_REMOVE',
+    'REASON_TEMPLATE',
+    'SATURDAY',
+    'SEEK_CUR',
+    'SEEK_END',
+    'SEEK_SET',
+    'SERIES_BARS_COUNT',
+    'SERIES_FIRSTDATE',
+    'SERIES_LASTBAR_DATE',
+    'SERIES_SERVER_FIRSTDATE',
+    'SERIES_SYNCHRONIZED',
+    'SERIES_TERMINAL_FIRSTDATE',
+    'SHORT_MAX',
+    'SHORT_MIN',
+    'STAT_BALANCEDD_PERCENT',
+    'STAT_BALANCEMIN',
+    'STAT_BALANCE_DDREL_PERCENT',
+    'STAT_BALANCE_DD',
+    'STAT_BALANCE_DD_RELATIVE',
+    'STAT_CONLOSSMAX',
+    'STAT_CONLOSSMAX_TRADES',
+    'STAT_CONPROFITMAX',
+    'STAT_CONPROFITMAX_TRADES',
+    'STAT_CUSTOM_ONTESTER',
+    'STAT_DEALS',
+    'STAT_EQUITYDD_PERCENT',
+    'STAT_EQUITYMIN',
+    'STAT_EQUITY_DDREL_PERCENT',
+    'STAT_EQUITY_DD',
+    'STAT_EQUITY_DD_RELATIVE',
+    'STAT_EXPECTED_PAYOFF',
+    'STAT_GROSS_LOSS',
+    'STAT_GROSS_PROFIT',
+    'STAT_INITIAL_DEPOSIT',
+    'STAT_LONG_TRADES',
+    'STAT_LOSSTRADES_AVGCON',
+    'STAT_LOSS_TRADES',
+    'STAT_MAX_CONLOSSES',
+    'STAT_MAX_CONLOSS_TRADES',
+    'STAT_MAX_CONPROFIT_TRADES',
+    'STAT_MAX_CONWINS',
+    'STAT_MAX_LOSSTRADE',
+    'STAT_MAX_PROFITTRADE',
+    'STAT_MIN_MARGINLEVEL',
+    'STAT_PROFITTRADES_AVGCON',
+    'STAT_PROFIT',
+    'STAT_PROFIT_FACTOR',
+    'STAT_PROFIT_LONGTRADES',
+    'STAT_PROFIT_SHORTTRADES',
+    'STAT_PROFIT_TRADES',
+    'STAT_RECOVERY_FACTOR',
+    'STAT_SHARPE_RATIO',
+    'STAT_SHORT_TRADES',
+    'STAT_TRADES',
+    'STAT_WITHDRAWAL',
+    'STO_CLOSECLOSE',
+    'STO_LOWHIGH',
+    'STYLE_DASHDOTDOT',
+    'STYLE_DASHDOT',
+    'STYLE_DASH',
+    'STYLE_DOT',
+    'STYLE_SOLID',
+    'SUNDAY',
+    'SYMBOL_ARROWDOWN',
+    'SYMBOL_ARROWUP',
+    'SYMBOL_CHECKSIGN',
+    'SYMBOL_LEFTPRICE',
+    'SYMBOL_RIGHTPRICE',
+    'SYMBOL_STOPSIGN',
+    'SYMBOL_THUMBSDOWN',
+    'SYMBOL_THUMBSUP',
+    'TERMINAL_BUILD',
+    'TERMINAL_CODEPAGE',
+    'TERMINAL_COMMONDATA_PATH',
+    'TERMINAL_COMPANY',
+    'TERMINAL_CONNECTED',
+    'TERMINAL_CPU_CORES',
+    'TERMINAL_DATA_PATH',
+    'TERMINAL_DISK_SPACE',
+    'TERMINAL_DLLS_ALLOWED',
+    'TERMINAL_EMAIL_ENABLED',
+    'TERMINAL_FTP_ENABLED',
+    'TERMINAL_LANGUAGE',
+    'TERMINAL_MAXBARS',
+    'TERMINAL_MEMORY_AVAILABLE',
+    'TERMINAL_MEMORY_PHYSICAL',
+    'TERMINAL_MEMORY_TOTAL',
+    'TERMINAL_MEMORY_USED',
+    'TERMINAL_NAME',
+    'TERMINAL_OPENCL_SUPPORT',
+    'TERMINAL_PATH',
+    'TERMINAL_TRADE_ALLOWED',
+    'TERMINAL_X64',
+    'THURSDAY',
+    'TRADE_ACTION_DEAL',
+    'TRADE_ACTION_MODIFY',
+    'TRADE_ACTION_PENDING',
+    'TRADE_ACTION_REMOVE',
+    'TRADE_ACTION_SLTP',
+    'TUESDAY',
+    'UCHAR_MAX',
+    'UINT_MAX',
+    'ULONG_MAX',
+    'USHORT_MAX',
+    'VOLUME_REAL',
+    'VOLUME_TICK',
+    'WEDNESDAY',
+    'WHOLE_ARRAY',
+    'WRONG_VALUE',
+    'clrNONE',
+    '__DATETIME__',
+    '__DATE__',
+    '__FILE__',
+    '__FUNCSIG__',
+    '__FUNCTION__',
+    '__LINE__',
+    '__MQL4BUILD__',
+    '__MQLBUILD__',
+    '__PATH__',
+)
+
+colors = (
+    'AliceBlue',
+    'AntiqueWhite',
+    'Aquamarine',
+    'Aqua',
+    'Beige',
+    'Bisque',
+    'Black',
+    'BlanchedAlmond',
+    'BlueViolet',
+    'Blue',
+    'Brown',
+    'BurlyWood',
+    'CadetBlue',
+    'Chartreuse',
+    'Chocolate',
+    'Coral',
+    'CornflowerBlue',
+    'Cornsilk',
+    'Crimson',
+    'DarkBlue',
+    'DarkGoldenrod',
+    'DarkGray',
+    'DarkGreen',
+    'DarkKhaki',
+    'DarkOliveGreen',
+    'DarkOrange',
+    'DarkOrchid',
+    'DarkSalmon',
+    'DarkSeaGreen',
+    'DarkSlateBlue',
+    'DarkSlateGray',
+    'DarkTurquoise',
+    'DarkViolet',
+    'DeepPink',
+    'DeepSkyBlue',
+    'DimGray',
+    'DodgerBlue',
+    'FireBrick',
+    'ForestGreen',
+    'Gainsboro',
+    'Goldenrod',
+    'Gold',
+    'Gray',
+    'GreenYellow',
+    'Green',
+    'Honeydew',
+    'HotPink',
+    'IndianRed',
+    'Indigo',
+    'Ivory',
+    'Khaki',
+    'LavenderBlush',
+    'Lavender',
+    'LawnGreen',
+    'LemonChiffon',
+    'LightBlue',
+    'LightCoral',
+    'LightCyan',
+    'LightGoldenrod',
+    'LightGray',
+    'LightGreen',
+    'LightPink',
+    'LightSalmon',
+    'LightSeaGreen',
+    'LightSkyBlue',
+    'LightSlateGray',
+    'LightSteelBlue',
+    'LightYellow',
+    'LimeGreen',
+    'Lime',
+    'Linen',
+    'Magenta',
+    'Maroon',
+    'MediumAquamarine',
+    'MediumBlue',
+    'MediumOrchid',
+    'MediumPurple',
+    'MediumSeaGreen',
+    'MediumSlateBlue',
+    'MediumSpringGreen',
+    'MediumTurquoise',
+    'MediumVioletRed',
+    'MidnightBlue',
+    'MintCream',
+    'MistyRose',
+    'Moccasin',
+    'NavajoWhite',
+    'Navy',
+    'OldLace',
+    'OliveDrab',
+    'Olive',
+    'OrangeRed',
+    'Orange',
+    'Orchid',
+    'PaleGoldenrod',
+    'PaleGreen',
+    'PaleTurquoise',
+    'PaleVioletRed',
+    'PapayaWhip',
+    'PeachPuff',
+    'Peru',
+    'Pink',
+    'Plum',
+    'PowderBlue',
+    'Purple',
+    'Red',
+    'RosyBrown',
+    'RoyalBlue',
+    'SaddleBrown',
+    'Salmon',
+    'SandyBrown',
+    'SeaGreen',
+    'Seashell',
+    'Sienna',
+    'Silver',
+    'SkyBlue',
+    'SlateBlue',
+    'SlateGray',
+    'Snow',
+    'SpringGreen',
+    'SteelBlue',
+    'Tan',
+    'Teal',
+    'Thistle',
+    'Tomato',
+    'Turquoise',
+    'Violet',
+    'Wheat',
+    'WhiteSmoke',
+    'White',
+    'YellowGreen',
+    'Yellow',
+)
+
+keywords = (
+    'input', '_Digits', '_Point', '_LastError', '_Period', '_RandomSeed',
+    '_StopFlag', '_Symbol', '_UninitReason', 'Ask', 'Bars', 'Bid',
+    'Close', 'Digits', 'High', 'Low', 'Open', 'Point', 'Time',
+    'Volume',
+)
+c_types = (
+    'void', 'char', 'uchar', 'bool', 'short', 'ushort', 'int', 'uint',
+    'color', 'long', 'ulong', 'datetime', 'float', 'double',
+    'string',
+)
diff --git a/.venv/Lib/site-packages/pygments/lexers/_mysql_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_mysql_builtins.py
new file mode 100644 (file)
index 0000000..d4a9099
--- /dev/null
@@ -0,0 +1,1335 @@
+"""
+    pygments.lexers._mysql_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Self-updating data files for the MySQL lexer.
+
+    Run with `python -I` to update.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+MYSQL_CONSTANTS = (
+    'false',
+    'null',
+    'true',
+    'unknown',
+)
+
+
+# At this time, no easily-parsed, definitive list of data types
+# has been found in the MySQL source code or documentation. (The
+# `sql/sql_yacc.yy` file is definitive but is difficult to parse.)
+# Therefore these types are currently maintained manually.
+#
+# Some words in this list -- like "long", "national", "precision",
+# and "varying" -- appear to only occur in combination with other
+# data type keywords. Therefore they are included as separate words
+# even though they do not naturally occur in syntax separately.
+#
+# This list is also used to strip data types out of the list of
+# MySQL keywords, which is automatically updated later in the file.
+#
+MYSQL_DATATYPES = (
+    # Numeric data types
+    'bigint',
+    'bit',
+    'bool',
+    'boolean',
+    'dec',
+    'decimal',
+    'double',
+    'fixed',
+    'float',
+    'float4',
+    'float8',
+    'int',
+    'int1',
+    'int2',
+    'int3',
+    'int4',
+    'int8',
+    'integer',
+    'mediumint',
+    'middleint',
+    'numeric',
+    'precision',
+    'real',
+    'serial',
+    'smallint',
+    'tinyint',
+
+    # Date and time data types
+    'date',
+    'datetime',
+    'time',
+    'timestamp',
+    'year',
+
+    # String data types
+    'binary',
+    'blob',
+    'char',
+    'enum',
+    'long',
+    'longblob',
+    'longtext',
+    'mediumblob',
+    'mediumtext',
+    'national',
+    'nchar',
+    'nvarchar',
+    'set',
+    'text',
+    'tinyblob',
+    'tinytext',
+    'varbinary',
+    'varchar',
+    'varcharacter',
+    'varying',
+
+    # Spatial data types
+    'geometry',
+    'geometrycollection',
+    'linestring',
+    'multilinestring',
+    'multipoint',
+    'multipolygon',
+    'point',
+    'polygon',
+
+    # JSON data types
+    'json',
+)
+
+# Everything below this line is auto-generated from the MySQL source code.
+# Run this file in Python and it will update itself.
+# -----------------------------------------------------------------------------
+
+MYSQL_FUNCTIONS = (
+    'abs',
+    'acos',
+    'adddate',
+    'addtime',
+    'aes_decrypt',
+    'aes_encrypt',
+    'any_value',
+    'asin',
+    'atan',
+    'atan2',
+    'benchmark',
+    'bin',
+    'bin_to_uuid',
+    'bit_and',
+    'bit_count',
+    'bit_length',
+    'bit_or',
+    'bit_xor',
+    'can_access_column',
+    'can_access_database',
+    'can_access_event',
+    'can_access_resource_group',
+    'can_access_routine',
+    'can_access_table',
+    'can_access_trigger',
+    'can_access_user',
+    'can_access_view',
+    'cast',
+    'ceil',
+    'ceiling',
+    'char_length',
+    'character_length',
+    'coercibility',
+    'compress',
+    'concat',
+    'concat_ws',
+    'connection_id',
+    'conv',
+    'convert_cpu_id_mask',
+    'convert_interval_to_user_interval',
+    'convert_tz',
+    'cos',
+    'cot',
+    'count',
+    'crc32',
+    'curdate',
+    'current_role',
+    'curtime',
+    'date_add',
+    'date_format',
+    'date_sub',
+    'datediff',
+    'dayname',
+    'dayofmonth',
+    'dayofweek',
+    'dayofyear',
+    'degrees',
+    'elt',
+    'exp',
+    'export_set',
+    'extract',
+    'extractvalue',
+    'field',
+    'find_in_set',
+    'floor',
+    'format_bytes',
+    'format_pico_time',
+    'found_rows',
+    'from_base64',
+    'from_days',
+    'from_unixtime',
+    'get_dd_column_privileges',
+    'get_dd_create_options',
+    'get_dd_index_private_data',
+    'get_dd_index_sub_part_length',
+    'get_dd_property_key_value',
+    'get_dd_schema_options',
+    'get_dd_tablespace_private_data',
+    'get_lock',
+    'greatest',
+    'group_concat',
+    'gtid_subset',
+    'gtid_subtract',
+    'hex',
+    'icu_version',
+    'ifnull',
+    'inet6_aton',
+    'inet6_ntoa',
+    'inet_aton',
+    'inet_ntoa',
+    'instr',
+    'internal_auto_increment',
+    'internal_avg_row_length',
+    'internal_check_time',
+    'internal_checksum',
+    'internal_data_free',
+    'internal_data_length',
+    'internal_dd_char_length',
+    'internal_get_comment_or_error',
+    'internal_get_dd_column_extra',
+    'internal_get_enabled_role_json',
+    'internal_get_hostname',
+    'internal_get_mandatory_roles_json',
+    'internal_get_partition_nodegroup',
+    'internal_get_username',
+    'internal_get_view_warning_or_error',
+    'internal_index_column_cardinality',
+    'internal_index_length',
+    'internal_is_enabled_role',
+    'internal_is_mandatory_role',
+    'internal_keys_disabled',
+    'internal_max_data_length',
+    'internal_table_rows',
+    'internal_tablespace_autoextend_size',
+    'internal_tablespace_data_free',
+    'internal_tablespace_extent_size',
+    'internal_tablespace_extra',
+    'internal_tablespace_free_extents',
+    'internal_tablespace_id',
+    'internal_tablespace_initial_size',
+    'internal_tablespace_logfile_group_name',
+    'internal_tablespace_logfile_group_number',
+    'internal_tablespace_maximum_size',
+    'internal_tablespace_row_format',
+    'internal_tablespace_status',
+    'internal_tablespace_total_extents',
+    'internal_tablespace_type',
+    'internal_tablespace_version',
+    'internal_update_time',
+    'is_free_lock',
+    'is_ipv4',
+    'is_ipv4_compat',
+    'is_ipv4_mapped',
+    'is_ipv6',
+    'is_used_lock',
+    'is_uuid',
+    'is_visible_dd_object',
+    'isnull',
+    'json_array',
+    'json_array_append',
+    'json_array_insert',
+    'json_arrayagg',
+    'json_contains',
+    'json_contains_path',
+    'json_depth',
+    'json_extract',
+    'json_insert',
+    'json_keys',
+    'json_length',
+    'json_merge',
+    'json_merge_patch',
+    'json_merge_preserve',
+    'json_object',
+    'json_objectagg',
+    'json_overlaps',
+    'json_pretty',
+    'json_quote',
+    'json_remove',
+    'json_replace',
+    'json_schema_valid',
+    'json_schema_validation_report',
+    'json_search',
+    'json_set',
+    'json_storage_free',
+    'json_storage_size',
+    'json_type',
+    'json_unquote',
+    'json_valid',
+    'last_day',
+    'last_insert_id',
+    'lcase',
+    'least',
+    'length',
+    'like_range_max',
+    'like_range_min',
+    'ln',
+    'load_file',
+    'locate',
+    'log',
+    'log10',
+    'log2',
+    'lower',
+    'lpad',
+    'ltrim',
+    'make_set',
+    'makedate',
+    'maketime',
+    'master_pos_wait',
+    'max',
+    'mbrcontains',
+    'mbrcoveredby',
+    'mbrcovers',
+    'mbrdisjoint',
+    'mbrequals',
+    'mbrintersects',
+    'mbroverlaps',
+    'mbrtouches',
+    'mbrwithin',
+    'md5',
+    'mid',
+    'min',
+    'monthname',
+    'name_const',
+    'now',
+    'nullif',
+    'oct',
+    'octet_length',
+    'ord',
+    'period_add',
+    'period_diff',
+    'pi',
+    'position',
+    'pow',
+    'power',
+    'ps_current_thread_id',
+    'ps_thread_id',
+    'quote',
+    'radians',
+    'rand',
+    'random_bytes',
+    'regexp_instr',
+    'regexp_like',
+    'regexp_replace',
+    'regexp_substr',
+    'release_all_locks',
+    'release_lock',
+    'remove_dd_property_key',
+    'reverse',
+    'roles_graphml',
+    'round',
+    'rpad',
+    'rtrim',
+    'sec_to_time',
+    'session_user',
+    'sha',
+    'sha1',
+    'sha2',
+    'sign',
+    'sin',
+    'sleep',
+    'soundex',
+    'source_pos_wait',
+    'space',
+    'sqrt',
+    'st_area',
+    'st_asbinary',
+    'st_asgeojson',
+    'st_astext',
+    'st_aswkb',
+    'st_aswkt',
+    'st_buffer',
+    'st_buffer_strategy',
+    'st_centroid',
+    'st_collect',
+    'st_contains',
+    'st_convexhull',
+    'st_crosses',
+    'st_difference',
+    'st_dimension',
+    'st_disjoint',
+    'st_distance',
+    'st_distance_sphere',
+    'st_endpoint',
+    'st_envelope',
+    'st_equals',
+    'st_exteriorring',
+    'st_frechetdistance',
+    'st_geohash',
+    'st_geomcollfromtext',
+    'st_geomcollfromtxt',
+    'st_geomcollfromwkb',
+    'st_geometrycollectionfromtext',
+    'st_geometrycollectionfromwkb',
+    'st_geometryfromtext',
+    'st_geometryfromwkb',
+    'st_geometryn',
+    'st_geometrytype',
+    'st_geomfromgeojson',
+    'st_geomfromtext',
+    'st_geomfromwkb',
+    'st_hausdorffdistance',
+    'st_interiorringn',
+    'st_intersection',
+    'st_intersects',
+    'st_isclosed',
+    'st_isempty',
+    'st_issimple',
+    'st_isvalid',
+    'st_latfromgeohash',
+    'st_latitude',
+    'st_length',
+    'st_linefromtext',
+    'st_linefromwkb',
+    'st_lineinterpolatepoint',
+    'st_lineinterpolatepoints',
+    'st_linestringfromtext',
+    'st_linestringfromwkb',
+    'st_longfromgeohash',
+    'st_longitude',
+    'st_makeenvelope',
+    'st_mlinefromtext',
+    'st_mlinefromwkb',
+    'st_mpointfromtext',
+    'st_mpointfromwkb',
+    'st_mpolyfromtext',
+    'st_mpolyfromwkb',
+    'st_multilinestringfromtext',
+    'st_multilinestringfromwkb',
+    'st_multipointfromtext',
+    'st_multipointfromwkb',
+    'st_multipolygonfromtext',
+    'st_multipolygonfromwkb',
+    'st_numgeometries',
+    'st_numinteriorring',
+    'st_numinteriorrings',
+    'st_numpoints',
+    'st_overlaps',
+    'st_pointatdistance',
+    'st_pointfromgeohash',
+    'st_pointfromtext',
+    'st_pointfromwkb',
+    'st_pointn',
+    'st_polyfromtext',
+    'st_polyfromwkb',
+    'st_polygonfromtext',
+    'st_polygonfromwkb',
+    'st_simplify',
+    'st_srid',
+    'st_startpoint',
+    'st_swapxy',
+    'st_symdifference',
+    'st_touches',
+    'st_transform',
+    'st_union',
+    'st_validate',
+    'st_within',
+    'st_x',
+    'st_y',
+    'statement_digest',
+    'statement_digest_text',
+    'std',
+    'stddev',
+    'stddev_pop',
+    'stddev_samp',
+    'str_to_date',
+    'strcmp',
+    'subdate',
+    'substr',
+    'substring',
+    'substring_index',
+    'subtime',
+    'sum',
+    'sysdate',
+    'system_user',
+    'tan',
+    'time_format',
+    'time_to_sec',
+    'timediff',
+    'to_base64',
+    'to_days',
+    'to_seconds',
+    'trim',
+    'ucase',
+    'uncompress',
+    'uncompressed_length',
+    'unhex',
+    'unix_timestamp',
+    'updatexml',
+    'upper',
+    'uuid',
+    'uuid_short',
+    'uuid_to_bin',
+    'validate_password_strength',
+    'var_pop',
+    'var_samp',
+    'variance',
+    'version',
+    'wait_for_executed_gtid_set',
+    'wait_until_sql_thread_after_gtids',
+    'weekday',
+    'weekofyear',
+    'yearweek',
+)
+
+
+MYSQL_OPTIMIZER_HINTS = (
+    'bka',
+    'bnl',
+    'derived_condition_pushdown',
+    'dupsweedout',
+    'firstmatch',
+    'group_index',
+    'hash_join',
+    'index',
+    'index_merge',
+    'intoexists',
+    'join_fixed_order',
+    'join_index',
+    'join_order',
+    'join_prefix',
+    'join_suffix',
+    'loosescan',
+    'materialization',
+    'max_execution_time',
+    'merge',
+    'mrr',
+    'no_bka',
+    'no_bnl',
+    'no_derived_condition_pushdown',
+    'no_group_index',
+    'no_hash_join',
+    'no_icp',
+    'no_index',
+    'no_index_merge',
+    'no_join_index',
+    'no_merge',
+    'no_mrr',
+    'no_order_index',
+    'no_range_optimization',
+    'no_semijoin',
+    'no_skip_scan',
+    'order_index',
+    'qb_name',
+    'resource_group',
+    'semijoin',
+    'set_var',
+    'skip_scan',
+    'subquery',
+)
+
+
+MYSQL_KEYWORDS = (
+    'accessible',
+    'account',
+    'action',
+    'active',
+    'add',
+    'admin',
+    'after',
+    'against',
+    'aggregate',
+    'algorithm',
+    'all',
+    'alter',
+    'always',
+    'analyze',
+    'and',
+    'any',
+    'array',
+    'as',
+    'asc',
+    'ascii',
+    'asensitive',
+    'assign_gtids_to_anonymous_transactions',
+    'at',
+    'attribute',
+    'authentication',
+    'auto_increment',
+    'autoextend_size',
+    'avg',
+    'avg_row_length',
+    'backup',
+    'before',
+    'begin',
+    'between',
+    'binlog',
+    'block',
+    'both',
+    'btree',
+    'buckets',
+    'by',
+    'byte',
+    'cache',
+    'call',
+    'cascade',
+    'cascaded',
+    'case',
+    'catalog_name',
+    'chain',
+    'challenge_response',
+    'change',
+    'changed',
+    'channel',
+    'character',
+    'charset',
+    'check',
+    'checksum',
+    'cipher',
+    'class_origin',
+    'client',
+    'clone',
+    'close',
+    'coalesce',
+    'code',
+    'collate',
+    'collation',
+    'column',
+    'column_format',
+    'column_name',
+    'columns',
+    'comment',
+    'commit',
+    'committed',
+    'compact',
+    'completion',
+    'component',
+    'compressed',
+    'compression',
+    'concurrent',
+    'condition',
+    'connection',
+    'consistent',
+    'constraint',
+    'constraint_catalog',
+    'constraint_name',
+    'constraint_schema',
+    'contains',
+    'context',
+    'continue',
+    'convert',
+    'cpu',
+    'create',
+    'cross',
+    'cube',
+    'cume_dist',
+    'current',
+    'current_date',
+    'current_time',
+    'current_timestamp',
+    'current_user',
+    'cursor',
+    'cursor_name',
+    'data',
+    'database',
+    'databases',
+    'datafile',
+    'day',
+    'day_hour',
+    'day_microsecond',
+    'day_minute',
+    'day_second',
+    'deallocate',
+    'declare',
+    'default',
+    'default_auth',
+    'definer',
+    'definition',
+    'delay_key_write',
+    'delayed',
+    'delete',
+    'dense_rank',
+    'desc',
+    'describe',
+    'description',
+    'deterministic',
+    'diagnostics',
+    'directory',
+    'disable',
+    'discard',
+    'disk',
+    'distinct',
+    'distinctrow',
+    'div',
+    'do',
+    'drop',
+    'dual',
+    'dumpfile',
+    'duplicate',
+    'dynamic',
+    'each',
+    'else',
+    'elseif',
+    'empty',
+    'enable',
+    'enclosed',
+    'encryption',
+    'end',
+    'ends',
+    'enforced',
+    'engine',
+    'engine_attribute',
+    'engines',
+    'error',
+    'errors',
+    'escape',
+    'escaped',
+    'event',
+    'events',
+    'every',
+    'except',
+    'exchange',
+    'exclude',
+    'execute',
+    'exists',
+    'exit',
+    'expansion',
+    'expire',
+    'explain',
+    'export',
+    'extended',
+    'extent_size',
+    'factor',
+    'failed_login_attempts',
+    'false',
+    'fast',
+    'faults',
+    'fetch',
+    'fields',
+    'file',
+    'file_block_size',
+    'filter',
+    'finish',
+    'first',
+    'first_value',
+    'flush',
+    'following',
+    'follows',
+    'for',
+    'force',
+    'foreign',
+    'format',
+    'found',
+    'from',
+    'full',
+    'fulltext',
+    'function',
+    'general',
+    'generated',
+    'geomcollection',
+    'get',
+    'get_format',
+    'get_master_public_key',
+    'get_source_public_key',
+    'global',
+    'grant',
+    'grants',
+    'group',
+    'group_replication',
+    'grouping',
+    'groups',
+    'gtid_only',
+    'handler',
+    'hash',
+    'having',
+    'help',
+    'high_priority',
+    'histogram',
+    'history',
+    'host',
+    'hosts',
+    'hour',
+    'hour_microsecond',
+    'hour_minute',
+    'hour_second',
+    'identified',
+    'if',
+    'ignore',
+    'ignore_server_ids',
+    'import',
+    'in',
+    'inactive',
+    'index',
+    'indexes',
+    'infile',
+    'initial',
+    'initial_size',
+    'initiate',
+    'inner',
+    'inout',
+    'insensitive',
+    'insert',
+    'insert_method',
+    'install',
+    'instance',
+    'interval',
+    'into',
+    'invisible',
+    'invoker',
+    'io',
+    'io_after_gtids',
+    'io_before_gtids',
+    'io_thread',
+    'ipc',
+    'is',
+    'isolation',
+    'issuer',
+    'iterate',
+    'join',
+    'json_table',
+    'json_value',
+    'key',
+    'key_block_size',
+    'keyring',
+    'keys',
+    'kill',
+    'lag',
+    'language',
+    'last',
+    'last_value',
+    'lateral',
+    'lead',
+    'leading',
+    'leave',
+    'leaves',
+    'left',
+    'less',
+    'level',
+    'like',
+    'limit',
+    'linear',
+    'lines',
+    'list',
+    'load',
+    'local',
+    'localtime',
+    'localtimestamp',
+    'lock',
+    'locked',
+    'locks',
+    'logfile',
+    'logs',
+    'loop',
+    'low_priority',
+    'master',
+    'master_auto_position',
+    'master_bind',
+    'master_compression_algorithms',
+    'master_connect_retry',
+    'master_delay',
+    'master_heartbeat_period',
+    'master_host',
+    'master_log_file',
+    'master_log_pos',
+    'master_password',
+    'master_port',
+    'master_public_key_path',
+    'master_retry_count',
+    'master_ssl',
+    'master_ssl_ca',
+    'master_ssl_capath',
+    'master_ssl_cert',
+    'master_ssl_cipher',
+    'master_ssl_crl',
+    'master_ssl_crlpath',
+    'master_ssl_key',
+    'master_ssl_verify_server_cert',
+    'master_tls_ciphersuites',
+    'master_tls_version',
+    'master_user',
+    'master_zstd_compression_level',
+    'match',
+    'max_connections_per_hour',
+    'max_queries_per_hour',
+    'max_rows',
+    'max_size',
+    'max_updates_per_hour',
+    'max_user_connections',
+    'maxvalue',
+    'medium',
+    'member',
+    'memory',
+    'merge',
+    'message_text',
+    'microsecond',
+    'migrate',
+    'min_rows',
+    'minute',
+    'minute_microsecond',
+    'minute_second',
+    'mod',
+    'mode',
+    'modifies',
+    'modify',
+    'month',
+    'mutex',
+    'mysql_errno',
+    'name',
+    'names',
+    'natural',
+    'ndb',
+    'ndbcluster',
+    'nested',
+    'network_namespace',
+    'never',
+    'new',
+    'next',
+    'no',
+    'no_wait',
+    'no_write_to_binlog',
+    'nodegroup',
+    'none',
+    'not',
+    'nowait',
+    'nth_value',
+    'ntile',
+    'null',
+    'nulls',
+    'number',
+    'of',
+    'off',
+    'offset',
+    'oj',
+    'old',
+    'on',
+    'one',
+    'only',
+    'open',
+    'optimize',
+    'optimizer_costs',
+    'option',
+    'optional',
+    'optionally',
+    'options',
+    'or',
+    'order',
+    'ordinality',
+    'organization',
+    'others',
+    'out',
+    'outer',
+    'outfile',
+    'over',
+    'owner',
+    'pack_keys',
+    'page',
+    'parser',
+    'partial',
+    'partition',
+    'partitioning',
+    'partitions',
+    'password',
+    'password_lock_time',
+    'path',
+    'percent_rank',
+    'persist',
+    'persist_only',
+    'phase',
+    'plugin',
+    'plugin_dir',
+    'plugins',
+    'port',
+    'precedes',
+    'preceding',
+    'prepare',
+    'preserve',
+    'prev',
+    'primary',
+    'privilege_checks_user',
+    'privileges',
+    'procedure',
+    'process',
+    'processlist',
+    'profile',
+    'profiles',
+    'proxy',
+    'purge',
+    'quarter',
+    'query',
+    'quick',
+    'random',
+    'range',
+    'rank',
+    'read',
+    'read_only',
+    'read_write',
+    'reads',
+    'rebuild',
+    'recover',
+    'recursive',
+    'redo_buffer_size',
+    'redundant',
+    'reference',
+    'references',
+    'regexp',
+    'registration',
+    'relay',
+    'relay_log_file',
+    'relay_log_pos',
+    'relay_thread',
+    'relaylog',
+    'release',
+    'reload',
+    'remove',
+    'rename',
+    'reorganize',
+    'repair',
+    'repeat',
+    'repeatable',
+    'replace',
+    'replica',
+    'replicas',
+    'replicate_do_db',
+    'replicate_do_table',
+    'replicate_ignore_db',
+    'replicate_ignore_table',
+    'replicate_rewrite_db',
+    'replicate_wild_do_table',
+    'replicate_wild_ignore_table',
+    'replication',
+    'require',
+    'require_row_format',
+    'require_table_primary_key_check',
+    'reset',
+    'resignal',
+    'resource',
+    'respect',
+    'restart',
+    'restore',
+    'restrict',
+    'resume',
+    'retain',
+    'return',
+    'returned_sqlstate',
+    'returning',
+    'returns',
+    'reuse',
+    'reverse',
+    'revoke',
+    'right',
+    'rlike',
+    'role',
+    'rollback',
+    'rollup',
+    'rotate',
+    'routine',
+    'row',
+    'row_count',
+    'row_format',
+    'row_number',
+    'rows',
+    'rtree',
+    'savepoint',
+    'schedule',
+    'schema',
+    'schema_name',
+    'schemas',
+    'second',
+    'second_microsecond',
+    'secondary',
+    'secondary_engine',
+    'secondary_engine_attribute',
+    'secondary_load',
+    'secondary_unload',
+    'security',
+    'select',
+    'sensitive',
+    'separator',
+    'serializable',
+    'server',
+    'session',
+    'share',
+    'show',
+    'shutdown',
+    'signal',
+    'signed',
+    'simple',
+    'skip',
+    'slave',
+    'slow',
+    'snapshot',
+    'socket',
+    'some',
+    'soname',
+    'sounds',
+    'source',
+    'source_auto_position',
+    'source_bind',
+    'source_compression_algorithms',
+    'source_connect_retry',
+    'source_connection_auto_failover',
+    'source_delay',
+    'source_heartbeat_period',
+    'source_host',
+    'source_log_file',
+    'source_log_pos',
+    'source_password',
+    'source_port',
+    'source_public_key_path',
+    'source_retry_count',
+    'source_ssl',
+    'source_ssl_ca',
+    'source_ssl_capath',
+    'source_ssl_cert',
+    'source_ssl_cipher',
+    'source_ssl_crl',
+    'source_ssl_crlpath',
+    'source_ssl_key',
+    'source_ssl_verify_server_cert',
+    'source_tls_ciphersuites',
+    'source_tls_version',
+    'source_user',
+    'source_zstd_compression_level',
+    'spatial',
+    'specific',
+    'sql',
+    'sql_after_gtids',
+    'sql_after_mts_gaps',
+    'sql_before_gtids',
+    'sql_big_result',
+    'sql_buffer_result',
+    'sql_calc_found_rows',
+    'sql_no_cache',
+    'sql_small_result',
+    'sql_thread',
+    'sql_tsi_day',
+    'sql_tsi_hour',
+    'sql_tsi_minute',
+    'sql_tsi_month',
+    'sql_tsi_quarter',
+    'sql_tsi_second',
+    'sql_tsi_week',
+    'sql_tsi_year',
+    'sqlexception',
+    'sqlstate',
+    'sqlwarning',
+    'srid',
+    'ssl',
+    'stacked',
+    'start',
+    'starting',
+    'starts',
+    'stats_auto_recalc',
+    'stats_persistent',
+    'stats_sample_pages',
+    'status',
+    'stop',
+    'storage',
+    'stored',
+    'straight_join',
+    'stream',
+    'string',
+    'subclass_origin',
+    'subject',
+    'subpartition',
+    'subpartitions',
+    'super',
+    'suspend',
+    'swaps',
+    'switches',
+    'system',
+    'table',
+    'table_checksum',
+    'table_name',
+    'tables',
+    'tablespace',
+    'temporary',
+    'temptable',
+    'terminated',
+    'than',
+    'then',
+    'thread_priority',
+    'ties',
+    'timestampadd',
+    'timestampdiff',
+    'tls',
+    'to',
+    'trailing',
+    'transaction',
+    'trigger',
+    'triggers',
+    'true',
+    'truncate',
+    'type',
+    'types',
+    'unbounded',
+    'uncommitted',
+    'undefined',
+    'undo',
+    'undo_buffer_size',
+    'undofile',
+    'unicode',
+    'uninstall',
+    'union',
+    'unique',
+    'unknown',
+    'unlock',
+    'unregister',
+    'unsigned',
+    'until',
+    'update',
+    'upgrade',
+    'usage',
+    'use',
+    'use_frm',
+    'user',
+    'user_resources',
+    'using',
+    'utc_date',
+    'utc_time',
+    'utc_timestamp',
+    'validation',
+    'value',
+    'values',
+    'variables',
+    'vcpu',
+    'view',
+    'virtual',
+    'visible',
+    'wait',
+    'warnings',
+    'week',
+    'weight_string',
+    'when',
+    'where',
+    'while',
+    'window',
+    'with',
+    'without',
+    'work',
+    'wrapper',
+    'write',
+    'x509',
+    'xa',
+    'xid',
+    'xml',
+    'xor',
+    'year_month',
+    'zerofill',
+    'zone',
+)
+
+
+if __name__ == '__main__':  # pragma: no cover
+    import re
+    from urllib.request import urlopen
+
+    from pygments.util import format_lines
+
+    # MySQL source code
+    SOURCE_URL = 'https://github.com/mysql/mysql-server/raw/8.0'
+    LEX_URL = SOURCE_URL + '/sql/lex.h'
+    ITEM_CREATE_URL = SOURCE_URL + '/sql/item_create.cc'
+
+
+    def update_myself():
+        # Pull content from lex.h.
+        lex_file = urlopen(LEX_URL).read().decode('utf8', errors='ignore')
+        keywords = parse_lex_keywords(lex_file)
+        functions = parse_lex_functions(lex_file)
+        optimizer_hints = parse_lex_optimizer_hints(lex_file)
+
+        # Parse content in item_create.cc.
+        item_create_file = urlopen(ITEM_CREATE_URL).read().decode('utf8', errors='ignore')
+        functions.update(parse_item_create_functions(item_create_file))
+
+        # Remove data types from the set of keywords.
+        keywords -= set(MYSQL_DATATYPES)
+
+        update_content('MYSQL_FUNCTIONS', tuple(sorted(functions)))
+        update_content('MYSQL_KEYWORDS', tuple(sorted(keywords)))
+        update_content('MYSQL_OPTIMIZER_HINTS', tuple(sorted(optimizer_hints)))
+
+
+    def parse_lex_keywords(f):
+        """Parse keywords in lex.h."""
+
+        results = set()
+        for m in re.finditer(r'{SYM(?:_HK)?\("(?P<keyword>[a-z0-9_]+)",', f, flags=re.I):
+            results.add(m.group('keyword').lower())
+
+        if not results:
+            raise ValueError('No keywords found')
+
+        return results
+
+
+    def parse_lex_optimizer_hints(f):
+        """Parse optimizer hints in lex.h."""
+
+        results = set()
+        for m in re.finditer(r'{SYM_H\("(?P<keyword>[a-z0-9_]+)",', f, flags=re.I):
+            results.add(m.group('keyword').lower())
+
+        if not results:
+            raise ValueError('No optimizer hints found')
+
+        return results
+
+
+    def parse_lex_functions(f):
+        """Parse MySQL function names from lex.h."""
+
+        results = set()
+        for m in re.finditer(r'{SYM_FN?\("(?P<function>[a-z0-9_]+)",', f, flags=re.I):
+            results.add(m.group('function').lower())
+
+        if not results:
+            raise ValueError('No lex functions found')
+
+        return results
+
+
+    def parse_item_create_functions(f):
+        """Parse MySQL function names from item_create.cc."""
+
+        results = set()
+        for m in re.finditer(r'{"(?P<function>[^"]+?)",\s*SQL_F[^(]+?\(', f, flags=re.I):
+            results.add(m.group('function').lower())
+
+        if not results:
+            raise ValueError('No item_create functions found')
+
+        return results
+
+
+    def update_content(field_name, content):
+        """Overwrite this file with content parsed from MySQL's source code."""
+
+        with open(__file__, encoding="utf-8") as f:
+            data = f.read()
+
+        # Line to start/end inserting
+        re_match = re.compile(rf'^{field_name}\s*=\s*\($.*?^\s*\)$', re.M | re.S)
+        m = re_match.search(data)
+        if not m:
+            raise ValueError(f'Could not find an existing definition for {field_name}')
+
+        new_block = format_lines(field_name, content)
+        data = data[:m.start()] + new_block + data[m.end():]
+
+        with open(__file__, 'w', encoding='utf-8', newline='\n') as f:
+            f.write(data)
+
+    update_myself()
diff --git a/.venv/Lib/site-packages/pygments/lexers/_openedge_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_openedge_builtins.py
new file mode 100644 (file)
index 0000000..33a1333
--- /dev/null
@@ -0,0 +1,2600 @@
+"""
+    pygments.lexers._openedge_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Builtin list for the OpenEdgeLexer.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+OPENEDGEKEYWORDS = (
+    'ABS',
+    'ABSO',
+    'ABSOL',
+    'ABSOLU',
+    'ABSOLUT',
+    'ABSOLUTE',
+    'ABSTRACT',
+    'ACCELERATOR',
+    'ACCUM',
+    'ACCUMU',
+    'ACCUMUL',
+    'ACCUMULA',
+    'ACCUMULAT',
+    'ACCUMULATE',
+    'ACTIVE-FORM',
+    'ACTIVE-WINDOW',
+    'ADD',
+    'ADD-BUFFER',
+    'ADD-CALC-COLUMN',
+    'ADD-COLUMNS-FROM',
+    'ADD-EVENTS-PROCEDURE',
+    'ADD-FIELDS-FROM',
+    'ADD-FIRST',
+    'ADD-INDEX-FIELD',
+    'ADD-LAST',
+    'ADD-LIKE-COLUMN',
+    'ADD-LIKE-FIELD',
+    'ADD-LIKE-INDEX',
+    'ADD-NEW-FIELD',
+    'ADD-NEW-INDEX',
+    'ADD-SCHEMA-LOCATION',
+    'ADD-SUPER-PROCEDURE',
+    'ADM-DATA',
+    'ADVISE',
+    'ALERT-BOX',
+    'ALIAS',
+    'ALL',
+    'ALLOW-COLUMN-SEARCHING',
+    'ALLOW-REPLICATION',
+    'ALTER',
+    'ALWAYS-ON-TOP',
+    'AMBIG',
+    'AMBIGU',
+    'AMBIGUO',
+    'AMBIGUOU',
+    'AMBIGUOUS',
+    'ANALYZ',
+    'ANALYZE',
+    'AND',
+    'ANSI-ONLY',
+    'ANY',
+    'ANYWHERE',
+    'APPEND',
+    'APPL-ALERT',
+    'APPL-ALERT-',
+    'APPL-ALERT-B',
+    'APPL-ALERT-BO',
+    'APPL-ALERT-BOX',
+    'APPL-ALERT-BOXE',
+    'APPL-ALERT-BOXES',
+    'APPL-CONTEXT-ID',
+    'APPLICATION',
+    'APPLY',
+    'APPSERVER-INFO',
+    'APPSERVER-PASSWORD',
+    'APPSERVER-USERID',
+    'ARRAY-MESSAGE',
+    'AS',
+    'ASC',
+    'ASCE',
+    'ASCEN',
+    'ASCEND',
+    'ASCENDI',
+    'ASCENDIN',
+    'ASCENDING',
+    'ASK-OVERWRITE',
+    'ASSEMBLY',
+    'ASSIGN',
+    'ASYNC-REQUEST-COUNT',
+    'ASYNC-REQUEST-HANDLE',
+    'ASYNCHRONOUS',
+    'AT',
+    'ATTACHED-PAIRLIST',
+    'ATTR',
+    'ATTR-SPACE',
+    'ATTRI',
+    'ATTRIB',
+    'ATTRIBU',
+    'ATTRIBUT',
+    'AUDIT-CONTROL',
+    'AUDIT-ENABLED',
+    'AUDIT-EVENT-CONTEXT',
+    'AUDIT-POLICY',
+    'AUTHENTICATION-FAILED',
+    'AUTHORIZATION',
+    'AUTO-COMP',
+    'AUTO-COMPL',
+    'AUTO-COMPLE',
+    'AUTO-COMPLET',
+    'AUTO-COMPLETI',
+    'AUTO-COMPLETIO',
+    'AUTO-COMPLETION',
+    'AUTO-END-KEY',
+    'AUTO-ENDKEY',
+    'AUTO-GO',
+    'AUTO-IND',
+    'AUTO-INDE',
+    'AUTO-INDEN',
+    'AUTO-INDENT',
+    'AUTO-RESIZE',
+    'AUTO-RET',
+    'AUTO-RETU',
+    'AUTO-RETUR',
+    'AUTO-RETURN',
+    'AUTO-SYNCHRONIZE',
+    'AUTO-Z',
+    'AUTO-ZA',
+    'AUTO-ZAP',
+    'AUTOMATIC',
+    'AVAIL',
+    'AVAILA',
+    'AVAILAB',
+    'AVAILABL',
+    'AVAILABLE',
+    'AVAILABLE-FORMATS',
+    'AVE',
+    'AVER',
+    'AVERA',
+    'AVERAG',
+    'AVERAGE',
+    'AVG',
+    'BACK',
+    'BACKG',
+    'BACKGR',
+    'BACKGRO',
+    'BACKGROU',
+    'BACKGROUN',
+    'BACKGROUND',
+    'BACKWARD',
+    'BACKWARDS',
+    'BASE64-DECODE',
+    'BASE64-ENCODE',
+    'BASE-ADE',
+    'BASE-KEY',
+    'BATCH',
+    'BATCH-',
+    'BATCH-M',
+    'BATCH-MO',
+    'BATCH-MOD',
+    'BATCH-MODE',
+    'BATCH-SIZE',
+    'BEFORE-H',
+    'BEFORE-HI',
+    'BEFORE-HID',
+    'BEFORE-HIDE',
+    'BEGIN-EVENT-GROUP',
+    'BEGINS',
+    'BELL',
+    'BETWEEN',
+    'BGC',
+    'BGCO',
+    'BGCOL',
+    'BGCOLO',
+    'BGCOLOR',
+    'BIG-ENDIAN',
+    'BINARY',
+    'BIND',
+    'BIND-WHERE',
+    'BLANK',
+    'BLOCK-ITERATION-DISPLAY',
+    'BLOCK-LEVEL',
+    'BORDER-B',
+    'BORDER-BO',
+    'BORDER-BOT',
+    'BORDER-BOTT',
+    'BORDER-BOTTO',
+    'BORDER-BOTTOM-CHARS',
+    'BORDER-BOTTOM-P',
+    'BORDER-BOTTOM-PI',
+    'BORDER-BOTTOM-PIX',
+    'BORDER-BOTTOM-PIXE',
+    'BORDER-BOTTOM-PIXEL',
+    'BORDER-BOTTOM-PIXELS',
+    'BORDER-L',
+    'BORDER-LE',
+    'BORDER-LEF',
+    'BORDER-LEFT',
+    'BORDER-LEFT-',
+    'BORDER-LEFT-C',
+    'BORDER-LEFT-CH',
+    'BORDER-LEFT-CHA',
+    'BORDER-LEFT-CHAR',
+    'BORDER-LEFT-CHARS',
+    'BORDER-LEFT-P',
+    'BORDER-LEFT-PI',
+    'BORDER-LEFT-PIX',
+    'BORDER-LEFT-PIXE',
+    'BORDER-LEFT-PIXEL',
+    'BORDER-LEFT-PIXELS',
+    'BORDER-R',
+    'BORDER-RI',
+    'BORDER-RIG',
+    'BORDER-RIGH',
+    'BORDER-RIGHT',
+    'BORDER-RIGHT-',
+    'BORDER-RIGHT-C',
+    'BORDER-RIGHT-CH',
+    'BORDER-RIGHT-CHA',
+    'BORDER-RIGHT-CHAR',
+    'BORDER-RIGHT-CHARS',
+    'BORDER-RIGHT-P',
+    'BORDER-RIGHT-PI',
+    'BORDER-RIGHT-PIX',
+    'BORDER-RIGHT-PIXE',
+    'BORDER-RIGHT-PIXEL',
+    'BORDER-RIGHT-PIXELS',
+    'BORDER-T',
+    'BORDER-TO',
+    'BORDER-TOP',
+    'BORDER-TOP-',
+    'BORDER-TOP-C',
+    'BORDER-TOP-CH',
+    'BORDER-TOP-CHA',
+    'BORDER-TOP-CHAR',
+    'BORDER-TOP-CHARS',
+    'BORDER-TOP-P',
+    'BORDER-TOP-PI',
+    'BORDER-TOP-PIX',
+    'BORDER-TOP-PIXE',
+    'BORDER-TOP-PIXEL',
+    'BORDER-TOP-PIXELS',
+    'BOX',
+    'BOX-SELECT',
+    'BOX-SELECTA',
+    'BOX-SELECTAB',
+    'BOX-SELECTABL',
+    'BOX-SELECTABLE',
+    'BREAK',
+    'BROWSE',
+    'BUFFER',
+    'BUFFER-CHARS',
+    'BUFFER-COMPARE',
+    'BUFFER-COPY',
+    'BUFFER-CREATE',
+    'BUFFER-DELETE',
+    'BUFFER-FIELD',
+    'BUFFER-HANDLE',
+    'BUFFER-LINES',
+    'BUFFER-NAME',
+    'BUFFER-PARTITION-ID',
+    'BUFFER-RELEASE',
+    'BUFFER-VALUE',
+    'BUTTON',
+    'BUTTONS',
+    'BY',
+    'BY-POINTER',
+    'BY-VARIANT-POINTER',
+    'CACHE',
+    'CACHE-SIZE',
+    'CALL',
+    'CALL-NAME',
+    'CALL-TYPE',
+    'CAN-CREATE',
+    'CAN-DELETE',
+    'CAN-DO',
+    'CAN-DO-DOMAIN-SUPPORT',
+    'CAN-FIND',
+    'CAN-QUERY',
+    'CAN-READ',
+    'CAN-SET',
+    'CAN-WRITE',
+    'CANCEL-BREAK',
+    'CANCEL-BUTTON',
+    'CAPS',
+    'CAREFUL-PAINT',
+    'CASE',
+    'CASE-SEN',
+    'CASE-SENS',
+    'CASE-SENSI',
+    'CASE-SENSIT',
+    'CASE-SENSITI',
+    'CASE-SENSITIV',
+    'CASE-SENSITIVE',
+    'CAST',
+    'CATCH',
+    'CDECL',
+    'CENTER',
+    'CENTERE',
+    'CENTERED',
+    'CHAINED',
+    'CHARACTER',
+    'CHARACTER_LENGTH',
+    'CHARSET',
+    'CHECK',
+    'CHECKED',
+    'CHOOSE',
+    'CHR',
+    'CLASS',
+    'CLASS-TYPE',
+    'CLEAR',
+    'CLEAR-APPL-CONTEXT',
+    'CLEAR-LOG',
+    'CLEAR-SELECT',
+    'CLEAR-SELECTI',
+    'CLEAR-SELECTIO',
+    'CLEAR-SELECTION',
+    'CLEAR-SORT-ARROW',
+    'CLEAR-SORT-ARROWS',
+    'CLIENT-CONNECTION-ID',
+    'CLIENT-PRINCIPAL',
+    'CLIENT-TTY',
+    'CLIENT-TYPE',
+    'CLIENT-WORKSTATION',
+    'CLIPBOARD',
+    'CLOSE',
+    'CLOSE-LOG',
+    'CODE',
+    'CODEBASE-LOCATOR',
+    'CODEPAGE',
+    'CODEPAGE-CONVERT',
+    'COL',
+    'COL-OF',
+    'COLLATE',
+    'COLON',
+    'COLON-ALIGN',
+    'COLON-ALIGNE',
+    'COLON-ALIGNED',
+    'COLOR',
+    'COLOR-TABLE',
+    'COLU',
+    'COLUM',
+    'COLUMN',
+    'COLUMN-BGCOLOR',
+    'COLUMN-DCOLOR',
+    'COLUMN-FGCOLOR',
+    'COLUMN-FONT',
+    'COLUMN-LAB',
+    'COLUMN-LABE',
+    'COLUMN-LABEL',
+    'COLUMN-MOVABLE',
+    'COLUMN-OF',
+    'COLUMN-PFCOLOR',
+    'COLUMN-READ-ONLY',
+    'COLUMN-RESIZABLE',
+    'COLUMN-SCROLLING',
+    'COLUMNS',
+    'COM-HANDLE',
+    'COM-SELF',
+    'COMBO-BOX',
+    'COMMAND',
+    'COMPARES',
+    'COMPILE',
+    'COMPILER',
+    'COMPLETE',
+    'CONFIG-NAME',
+    'CONNECT',
+    'CONNECTED',
+    'CONSTRUCTOR',
+    'CONTAINS',
+    'CONTENTS',
+    'CONTEXT',
+    'CONTEXT-HELP',
+    'CONTEXT-HELP-FILE',
+    'CONTEXT-HELP-ID',
+    'CONTEXT-POPUP',
+    'CONTROL',
+    'CONTROL-BOX',
+    'CONTROL-FRAME',
+    'CONVERT',
+    'CONVERT-3D-COLORS',
+    'CONVERT-TO-OFFS',
+    'CONVERT-TO-OFFSE',
+    'CONVERT-TO-OFFSET',
+    'COPY-DATASET',
+    'COPY-LOB',
+    'COPY-SAX-ATTRIBUTES',
+    'COPY-TEMP-TABLE',
+    'COUNT',
+    'COUNT-OF',
+    'CPCASE',
+    'CPCOLL',
+    'CPINTERNAL',
+    'CPLOG',
+    'CPPRINT',
+    'CPRCODEIN',
+    'CPRCODEOUT',
+    'CPSTREAM',
+    'CPTERM',
+    'CRC-VALUE',
+    'CREATE',
+    'CREATE-LIKE',
+    'CREATE-LIKE-SEQUENTIAL',
+    'CREATE-NODE-NAMESPACE',
+    'CREATE-RESULT-LIST-ENTRY',
+    'CREATE-TEST-FILE',
+    'CURRENT',
+    'CURRENT-CHANGED',
+    'CURRENT-COLUMN',
+    'CURRENT-ENV',
+    'CURRENT-ENVI',
+    'CURRENT-ENVIR',
+    'CURRENT-ENVIRO',
+    'CURRENT-ENVIRON',
+    'CURRENT-ENVIRONM',
+    'CURRENT-ENVIRONME',
+    'CURRENT-ENVIRONMEN',
+    'CURRENT-ENVIRONMENT',
+    'CURRENT-ITERATION',
+    'CURRENT-LANG',
+    'CURRENT-LANGU',
+    'CURRENT-LANGUA',
+    'CURRENT-LANGUAG',
+    'CURRENT-LANGUAGE',
+    'CURRENT-QUERY',
+    'CURRENT-REQUEST-INFO',
+    'CURRENT-RESPONSE-INFO',
+    'CURRENT-RESULT-ROW',
+    'CURRENT-ROW-MODIFIED',
+    'CURRENT-VALUE',
+    'CURRENT-WINDOW',
+    'CURRENT_DATE',
+    'CURS',
+    'CURSO',
+    'CURSOR',
+    'CURSOR-CHAR',
+    'CURSOR-LINE',
+    'CURSOR-OFFSET',
+    'DATA-BIND',
+    'DATA-ENTRY-RET',
+    'DATA-ENTRY-RETU',
+    'DATA-ENTRY-RETUR',
+    'DATA-ENTRY-RETURN',
+    'DATA-REL',
+    'DATA-RELA',
+    'DATA-RELAT',
+    'DATA-RELATI',
+    'DATA-RELATIO',
+    'DATA-RELATION',
+    'DATA-SOURCE',
+    'DATA-SOURCE-COMPLETE-MAP',
+    'DATA-SOURCE-MODIFIED',
+    'DATA-SOURCE-ROWID',
+    'DATA-T',
+    'DATA-TY',
+    'DATA-TYP',
+    'DATA-TYPE',
+    'DATABASE',
+    'DATASERVERS',
+    'DATASET',
+    'DATASET-HANDLE',
+    'DATE',
+    'DATE-F',
+    'DATE-FO',
+    'DATE-FOR',
+    'DATE-FORM',
+    'DATE-FORMA',
+    'DATE-FORMAT',
+    'DAY',
+    'DB-CONTEXT',
+    'DB-REFERENCES',
+    'DBCODEPAGE',
+    'DBCOLLATION',
+    'DBNAME',
+    'DBPARAM',
+    'DBREST',
+    'DBRESTR',
+    'DBRESTRI',
+    'DBRESTRIC',
+    'DBRESTRICT',
+    'DBRESTRICTI',
+    'DBRESTRICTIO',
+    'DBRESTRICTION',
+    'DBRESTRICTIONS',
+    'DBTASKID',
+    'DBTYPE',
+    'DBVERS',
+    'DBVERSI',
+    'DBVERSIO',
+    'DBVERSION',
+    'DCOLOR',
+    'DDE',
+    'DDE-ERROR',
+    'DDE-I',
+    'DDE-ID',
+    'DDE-ITEM',
+    'DDE-NAME',
+    'DDE-TOPIC',
+    'DEBLANK',
+    'DEBU',
+    'DEBUG',
+    'DEBUG-ALERT',
+    'DEBUG-LIST',
+    'DEBUGGER',
+    'DECIMAL',
+    'DECIMALS',
+    'DECLARE',
+    'DECLARE-NAMESPACE',
+    'DECRYPT',
+    'DEFAULT',
+    'DEFAULT-B',
+    'DEFAULT-BU',
+    'DEFAULT-BUFFER-HANDLE',
+    'DEFAULT-BUT',
+    'DEFAULT-BUTT',
+    'DEFAULT-BUTTO',
+    'DEFAULT-BUTTON',
+    'DEFAULT-COMMIT',
+    'DEFAULT-EX',
+    'DEFAULT-EXT',
+    'DEFAULT-EXTE',
+    'DEFAULT-EXTEN',
+    'DEFAULT-EXTENS',
+    'DEFAULT-EXTENSI',
+    'DEFAULT-EXTENSIO',
+    'DEFAULT-EXTENSION',
+    'DEFAULT-NOXL',
+    'DEFAULT-NOXLA',
+    'DEFAULT-NOXLAT',
+    'DEFAULT-NOXLATE',
+    'DEFAULT-VALUE',
+    'DEFAULT-WINDOW',
+    'DEFINE',
+    'DEFINE-USER-EVENT-MANAGER',
+    'DEFINED',
+    'DEL',
+    'DELE',
+    'DELEGATE',
+    'DELET',
+    'DELETE PROCEDURE',
+    'DELETE',
+    'DELETE-CHAR',
+    'DELETE-CHARA',
+    'DELETE-CHARAC',
+    'DELETE-CHARACT',
+    'DELETE-CHARACTE',
+    'DELETE-CHARACTER',
+    'DELETE-CURRENT-ROW',
+    'DELETE-LINE',
+    'DELETE-RESULT-LIST-ENTRY',
+    'DELETE-SELECTED-ROW',
+    'DELETE-SELECTED-ROWS',
+    'DELIMITER',
+    'DESC',
+    'DESCE',
+    'DESCEN',
+    'DESCEND',
+    'DESCENDI',
+    'DESCENDIN',
+    'DESCENDING',
+    'DESELECT-FOCUSED-ROW',
+    'DESELECT-ROWS',
+    'DESELECT-SELECTED-ROW',
+    'DESELECTION',
+    'DESTRUCTOR',
+    'DIALOG-BOX',
+    'DICT',
+    'DICTI',
+    'DICTIO',
+    'DICTION',
+    'DICTIONA',
+    'DICTIONAR',
+    'DICTIONARY',
+    'DIR',
+    'DISABLE',
+    'DISABLE-AUTO-ZAP',
+    'DISABLE-DUMP-TRIGGERS',
+    'DISABLE-LOAD-TRIGGERS',
+    'DISABLED',
+    'DISCON',
+    'DISCONN',
+    'DISCONNE',
+    'DISCONNEC',
+    'DISCONNECT',
+    'DISP',
+    'DISPL',
+    'DISPLA',
+    'DISPLAY',
+    'DISPLAY-MESSAGE',
+    'DISPLAY-T',
+    'DISPLAY-TY',
+    'DISPLAY-TYP',
+    'DISPLAY-TYPE',
+    'DISTINCT',
+    'DO',
+    'DOMAIN-DESCRIPTION',
+    'DOMAIN-NAME',
+    'DOMAIN-TYPE',
+    'DOS',
+    'DOUBLE',
+    'DOWN',
+    'DRAG-ENABLED',
+    'DROP',
+    'DROP-DOWN',
+    'DROP-DOWN-LIST',
+    'DROP-FILE-NOTIFY',
+    'DROP-TARGET',
+    'DS-CLOSE-CURSOR',
+    'DSLOG-MANAGER',
+    'DUMP',
+    'DYNAMIC',
+    'DYNAMIC-ENUM',
+    'DYNAMIC-FUNCTION',
+    'DYNAMIC-INVOKE',
+    'EACH',
+    'ECHO',
+    'EDGE',
+    'EDGE-',
+    'EDGE-C',
+    'EDGE-CH',
+    'EDGE-CHA',
+    'EDGE-CHAR',
+    'EDGE-CHARS',
+    'EDGE-P',
+    'EDGE-PI',
+    'EDGE-PIX',
+    'EDGE-PIXE',
+    'EDGE-PIXEL',
+    'EDGE-PIXELS',
+    'EDIT-CAN-PASTE',
+    'EDIT-CAN-UNDO',
+    'EDIT-CLEAR',
+    'EDIT-COPY',
+    'EDIT-CUT',
+    'EDIT-PASTE',
+    'EDIT-UNDO',
+    'EDITING',
+    'EDITOR',
+    'ELSE',
+    'EMPTY',
+    'EMPTY-TEMP-TABLE',
+    'ENABLE',
+    'ENABLED-FIELDS',
+    'ENCODE',
+    'ENCRYPT',
+    'ENCRYPT-AUDIT-MAC-KEY',
+    'ENCRYPTION-SALT',
+    'END',
+    'END-DOCUMENT',
+    'END-ELEMENT',
+    'END-EVENT-GROUP',
+    'END-FILE-DROP',
+    'END-KEY',
+    'END-MOVE',
+    'END-RESIZE',
+    'END-ROW-RESIZE',
+    'END-USER-PROMPT',
+    'ENDKEY',
+    'ENTERED',
+    'ENTITY-EXPANSION-LIMIT',
+    'ENTRY',
+    'ENUM',
+    'EQ',
+    'ERROR',
+    'ERROR-COL',
+    'ERROR-COLU',
+    'ERROR-COLUM',
+    'ERROR-COLUMN',
+    'ERROR-ROW',
+    'ERROR-STACK-TRACE',
+    'ERROR-STAT',
+    'ERROR-STATU',
+    'ERROR-STATUS',
+    'ESCAPE',
+    'ETIME',
+    'EVENT',
+    'EVENT-GROUP-ID',
+    'EVENT-PROCEDURE',
+    'EVENT-PROCEDURE-CONTEXT',
+    'EVENT-T',
+    'EVENT-TY',
+    'EVENT-TYP',
+    'EVENT-TYPE',
+    'EVENTS',
+    'EXCEPT',
+    'EXCLUSIVE',
+    'EXCLUSIVE-',
+    'EXCLUSIVE-ID',
+    'EXCLUSIVE-L',
+    'EXCLUSIVE-LO',
+    'EXCLUSIVE-LOC',
+    'EXCLUSIVE-LOCK',
+    'EXCLUSIVE-WEB-USER',
+    'EXECUTE',
+    'EXISTS',
+    'EXP',
+    'EXPAND',
+    'EXPANDABLE',
+    'EXPLICIT',
+    'EXPORT',
+    'EXPORT-PRINCIPAL',
+    'EXTENDED',
+    'EXTENT',
+    'EXTERNAL',
+    'FALSE',
+    'FETCH',
+    'FETCH-SELECTED-ROW',
+    'FGC',
+    'FGCO',
+    'FGCOL',
+    'FGCOLO',
+    'FGCOLOR',
+    'FIELD',
+    'FIELDS',
+    'FILE',
+    'FILE-CREATE-DATE',
+    'FILE-CREATE-TIME',
+    'FILE-INFO',
+    'FILE-INFOR',
+    'FILE-INFORM',
+    'FILE-INFORMA',
+    'FILE-INFORMAT',
+    'FILE-INFORMATI',
+    'FILE-INFORMATIO',
+    'FILE-INFORMATION',
+    'FILE-MOD-DATE',
+    'FILE-MOD-TIME',
+    'FILE-NAME',
+    'FILE-OFF',
+    'FILE-OFFS',
+    'FILE-OFFSE',
+    'FILE-OFFSET',
+    'FILE-SIZE',
+    'FILE-TYPE',
+    'FILENAME',
+    'FILL',
+    'FILL-IN',
+    'FILLED',
+    'FILTERS',
+    'FINAL',
+    'FINALLY',
+    'FIND',
+    'FIND-BY-ROWID',
+    'FIND-CASE-SENSITIVE',
+    'FIND-CURRENT',
+    'FIND-FIRST',
+    'FIND-GLOBAL',
+    'FIND-LAST',
+    'FIND-NEXT-OCCURRENCE',
+    'FIND-PREV-OCCURRENCE',
+    'FIND-SELECT',
+    'FIND-UNIQUE',
+    'FIND-WRAP-AROUND',
+    'FINDER',
+    'FIRST',
+    'FIRST-ASYNCH-REQUEST',
+    'FIRST-CHILD',
+    'FIRST-COLUMN',
+    'FIRST-FORM',
+    'FIRST-OBJECT',
+    'FIRST-OF',
+    'FIRST-PROC',
+    'FIRST-PROCE',
+    'FIRST-PROCED',
+    'FIRST-PROCEDU',
+    'FIRST-PROCEDUR',
+    'FIRST-PROCEDURE',
+    'FIRST-SERVER',
+    'FIRST-TAB-I',
+    'FIRST-TAB-IT',
+    'FIRST-TAB-ITE',
+    'FIRST-TAB-ITEM',
+    'FIT-LAST-COLUMN',
+    'FIXED-ONLY',
+    'FLAT-BUTTON',
+    'FLOAT',
+    'FOCUS',
+    'FOCUSED-ROW',
+    'FOCUSED-ROW-SELECTED',
+    'FONT',
+    'FONT-TABLE',
+    'FOR',
+    'FORCE-FILE',
+    'FORE',
+    'FOREG',
+    'FOREGR',
+    'FOREGRO',
+    'FOREGROU',
+    'FOREGROUN',
+    'FOREGROUND',
+    'FORM INPUT',
+    'FORM',
+    'FORM-LONG-INPUT',
+    'FORMA',
+    'FORMAT',
+    'FORMATTE',
+    'FORMATTED',
+    'FORWARD',
+    'FORWARDS',
+    'FRAGMEN',
+    'FRAGMENT',
+    'FRAM',
+    'FRAME',
+    'FRAME-COL',
+    'FRAME-DB',
+    'FRAME-DOWN',
+    'FRAME-FIELD',
+    'FRAME-FILE',
+    'FRAME-INDE',
+    'FRAME-INDEX',
+    'FRAME-LINE',
+    'FRAME-NAME',
+    'FRAME-ROW',
+    'FRAME-SPA',
+    'FRAME-SPAC',
+    'FRAME-SPACI',
+    'FRAME-SPACIN',
+    'FRAME-SPACING',
+    'FRAME-VAL',
+    'FRAME-VALU',
+    'FRAME-VALUE',
+    'FRAME-X',
+    'FRAME-Y',
+    'FREQUENCY',
+    'FROM',
+    'FROM-C',
+    'FROM-CH',
+    'FROM-CHA',
+    'FROM-CHAR',
+    'FROM-CHARS',
+    'FROM-CUR',
+    'FROM-CURR',
+    'FROM-CURRE',
+    'FROM-CURREN',
+    'FROM-CURRENT',
+    'FROM-P',
+    'FROM-PI',
+    'FROM-PIX',
+    'FROM-PIXE',
+    'FROM-PIXEL',
+    'FROM-PIXELS',
+    'FULL-HEIGHT',
+    'FULL-HEIGHT-',
+    'FULL-HEIGHT-C',
+    'FULL-HEIGHT-CH',
+    'FULL-HEIGHT-CHA',
+    'FULL-HEIGHT-CHAR',
+    'FULL-HEIGHT-CHARS',
+    'FULL-HEIGHT-P',
+    'FULL-HEIGHT-PI',
+    'FULL-HEIGHT-PIX',
+    'FULL-HEIGHT-PIXE',
+    'FULL-HEIGHT-PIXEL',
+    'FULL-HEIGHT-PIXELS',
+    'FULL-PATHN',
+    'FULL-PATHNA',
+    'FULL-PATHNAM',
+    'FULL-PATHNAME',
+    'FULL-WIDTH',
+    'FULL-WIDTH-',
+    'FULL-WIDTH-C',
+    'FULL-WIDTH-CH',
+    'FULL-WIDTH-CHA',
+    'FULL-WIDTH-CHAR',
+    'FULL-WIDTH-CHARS',
+    'FULL-WIDTH-P',
+    'FULL-WIDTH-PI',
+    'FULL-WIDTH-PIX',
+    'FULL-WIDTH-PIXE',
+    'FULL-WIDTH-PIXEL',
+    'FULL-WIDTH-PIXELS',
+    'FUNCTION',
+    'FUNCTION-CALL-TYPE',
+    'GATEWAY',
+    'GATEWAYS',
+    'GE',
+    'GENERATE-MD5',
+    'GENERATE-PBE-KEY',
+    'GENERATE-PBE-SALT',
+    'GENERATE-RANDOM-KEY',
+    'GENERATE-UUID',
+    'GET',
+    'GET-ATTR-CALL-TYPE',
+    'GET-ATTRIBUTE-NODE',
+    'GET-BINARY-DATA',
+    'GET-BLUE',
+    'GET-BLUE-',
+    'GET-BLUE-V',
+    'GET-BLUE-VA',
+    'GET-BLUE-VAL',
+    'GET-BLUE-VALU',
+    'GET-BLUE-VALUE',
+    'GET-BROWSE-COLUMN',
+    'GET-BUFFER-HANDLE',
+    'GET-BYTE',
+    'GET-CALLBACK-PROC-CONTEXT',
+    'GET-CALLBACK-PROC-NAME',
+    'GET-CGI-LIST',
+    'GET-CGI-LONG-VALUE',
+    'GET-CGI-VALUE',
+    'GET-CLASS',
+    'GET-CODEPAGES',
+    'GET-COLLATIONS',
+    'GET-CONFIG-VALUE',
+    'GET-CURRENT',
+    'GET-DOUBLE',
+    'GET-DROPPED-FILE',
+    'GET-DYNAMIC',
+    'GET-ERROR-COLUMN',
+    'GET-ERROR-ROW',
+    'GET-FILE',
+    'GET-FILE-NAME',
+    'GET-FILE-OFFSE',
+    'GET-FILE-OFFSET',
+    'GET-FIRST',
+    'GET-FLOAT',
+    'GET-GREEN',
+    'GET-GREEN-',
+    'GET-GREEN-V',
+    'GET-GREEN-VA',
+    'GET-GREEN-VAL',
+    'GET-GREEN-VALU',
+    'GET-GREEN-VALUE',
+    'GET-INDEX-BY-NAMESPACE-NAME',
+    'GET-INDEX-BY-QNAME',
+    'GET-INT64',
+    'GET-ITERATION',
+    'GET-KEY-VAL',
+    'GET-KEY-VALU',
+    'GET-KEY-VALUE',
+    'GET-LAST',
+    'GET-LOCALNAME-BY-INDEX',
+    'GET-LONG',
+    'GET-MESSAGE',
+    'GET-NEXT',
+    'GET-NUMBER',
+    'GET-POINTER-VALUE',
+    'GET-PREV',
+    'GET-PRINTERS',
+    'GET-PROPERTY',
+    'GET-QNAME-BY-INDEX',
+    'GET-RED',
+    'GET-RED-',
+    'GET-RED-V',
+    'GET-RED-VA',
+    'GET-RED-VAL',
+    'GET-RED-VALU',
+    'GET-RED-VALUE',
+    'GET-REPOSITIONED-ROW',
+    'GET-RGB-VALUE',
+    'GET-SELECTED',
+    'GET-SELECTED-',
+    'GET-SELECTED-W',
+    'GET-SELECTED-WI',
+    'GET-SELECTED-WID',
+    'GET-SELECTED-WIDG',
+    'GET-SELECTED-WIDGE',
+    'GET-SELECTED-WIDGET',
+    'GET-SHORT',
+    'GET-SIGNATURE',
+    'GET-SIZE',
+    'GET-STRING',
+    'GET-TAB-ITEM',
+    'GET-TEXT-HEIGHT',
+    'GET-TEXT-HEIGHT-',
+    'GET-TEXT-HEIGHT-C',
+    'GET-TEXT-HEIGHT-CH',
+    'GET-TEXT-HEIGHT-CHA',
+    'GET-TEXT-HEIGHT-CHAR',
+    'GET-TEXT-HEIGHT-CHARS',
+    'GET-TEXT-HEIGHT-P',
+    'GET-TEXT-HEIGHT-PI',
+    'GET-TEXT-HEIGHT-PIX',
+    'GET-TEXT-HEIGHT-PIXE',
+    'GET-TEXT-HEIGHT-PIXEL',
+    'GET-TEXT-HEIGHT-PIXELS',
+    'GET-TEXT-WIDTH',
+    'GET-TEXT-WIDTH-',
+    'GET-TEXT-WIDTH-C',
+    'GET-TEXT-WIDTH-CH',
+    'GET-TEXT-WIDTH-CHA',
+    'GET-TEXT-WIDTH-CHAR',
+    'GET-TEXT-WIDTH-CHARS',
+    'GET-TEXT-WIDTH-P',
+    'GET-TEXT-WIDTH-PI',
+    'GET-TEXT-WIDTH-PIX',
+    'GET-TEXT-WIDTH-PIXE',
+    'GET-TEXT-WIDTH-PIXEL',
+    'GET-TEXT-WIDTH-PIXELS',
+    'GET-TYPE-BY-INDEX',
+    'GET-TYPE-BY-NAMESPACE-NAME',
+    'GET-TYPE-BY-QNAME',
+    'GET-UNSIGNED-LONG',
+    'GET-UNSIGNED-SHORT',
+    'GET-URI-BY-INDEX',
+    'GET-VALUE-BY-INDEX',
+    'GET-VALUE-BY-NAMESPACE-NAME',
+    'GET-VALUE-BY-QNAME',
+    'GET-WAIT-STATE',
+    'GETBYTE',
+    'GLOBAL',
+    'GO-ON',
+    'GO-PEND',
+    'GO-PENDI',
+    'GO-PENDIN',
+    'GO-PENDING',
+    'GRANT',
+    'GRAPHIC-E',
+    'GRAPHIC-ED',
+    'GRAPHIC-EDG',
+    'GRAPHIC-EDGE',
+    'GRID-FACTOR-H',
+    'GRID-FACTOR-HO',
+    'GRID-FACTOR-HOR',
+    'GRID-FACTOR-HORI',
+    'GRID-FACTOR-HORIZ',
+    'GRID-FACTOR-HORIZO',
+    'GRID-FACTOR-HORIZON',
+    'GRID-FACTOR-HORIZONT',
+    'GRID-FACTOR-HORIZONTA',
+    'GRID-FACTOR-HORIZONTAL',
+    'GRID-FACTOR-V',
+    'GRID-FACTOR-VE',
+    'GRID-FACTOR-VER',
+    'GRID-FACTOR-VERT',
+    'GRID-FACTOR-VERTI',
+    'GRID-FACTOR-VERTIC',
+    'GRID-FACTOR-VERTICA',
+    'GRID-FACTOR-VERTICAL',
+    'GRID-SNAP',
+    'GRID-UNIT-HEIGHT',
+    'GRID-UNIT-HEIGHT-',
+    'GRID-UNIT-HEIGHT-C',
+    'GRID-UNIT-HEIGHT-CH',
+    'GRID-UNIT-HEIGHT-CHA',
+    'GRID-UNIT-HEIGHT-CHARS',
+    'GRID-UNIT-HEIGHT-P',
+    'GRID-UNIT-HEIGHT-PI',
+    'GRID-UNIT-HEIGHT-PIX',
+    'GRID-UNIT-HEIGHT-PIXE',
+    'GRID-UNIT-HEIGHT-PIXEL',
+    'GRID-UNIT-HEIGHT-PIXELS',
+    'GRID-UNIT-WIDTH',
+    'GRID-UNIT-WIDTH-',
+    'GRID-UNIT-WIDTH-C',
+    'GRID-UNIT-WIDTH-CH',
+    'GRID-UNIT-WIDTH-CHA',
+    'GRID-UNIT-WIDTH-CHAR',
+    'GRID-UNIT-WIDTH-CHARS',
+    'GRID-UNIT-WIDTH-P',
+    'GRID-UNIT-WIDTH-PI',
+    'GRID-UNIT-WIDTH-PIX',
+    'GRID-UNIT-WIDTH-PIXE',
+    'GRID-UNIT-WIDTH-PIXEL',
+    'GRID-UNIT-WIDTH-PIXELS',
+    'GRID-VISIBLE',
+    'GROUP',
+    'GT',
+    'GUID',
+    'HANDLE',
+    'HANDLER',
+    'HAS-RECORDS',
+    'HAVING',
+    'HEADER',
+    'HEIGHT',
+    'HEIGHT-',
+    'HEIGHT-C',
+    'HEIGHT-CH',
+    'HEIGHT-CHA',
+    'HEIGHT-CHAR',
+    'HEIGHT-CHARS',
+    'HEIGHT-P',
+    'HEIGHT-PI',
+    'HEIGHT-PIX',
+    'HEIGHT-PIXE',
+    'HEIGHT-PIXEL',
+    'HEIGHT-PIXELS',
+    'HELP',
+    'HEX-DECODE',
+    'HEX-ENCODE',
+    'HIDDEN',
+    'HIDE',
+    'HORI',
+    'HORIZ',
+    'HORIZO',
+    'HORIZON',
+    'HORIZONT',
+    'HORIZONTA',
+    'HORIZONTAL',
+    'HOST-BYTE-ORDER',
+    'HTML-CHARSET',
+    'HTML-END-OF-LINE',
+    'HTML-END-OF-PAGE',
+    'HTML-FRAME-BEGIN',
+    'HTML-FRAME-END',
+    'HTML-HEADER-BEGIN',
+    'HTML-HEADER-END',
+    'HTML-TITLE-BEGIN',
+    'HTML-TITLE-END',
+    'HWND',
+    'ICON',
+    'IF',
+    'IMAGE',
+    'IMAGE-DOWN',
+    'IMAGE-INSENSITIVE',
+    'IMAGE-SIZE',
+    'IMAGE-SIZE-C',
+    'IMAGE-SIZE-CH',
+    'IMAGE-SIZE-CHA',
+    'IMAGE-SIZE-CHAR',
+    'IMAGE-SIZE-CHARS',
+    'IMAGE-SIZE-P',
+    'IMAGE-SIZE-PI',
+    'IMAGE-SIZE-PIX',
+    'IMAGE-SIZE-PIXE',
+    'IMAGE-SIZE-PIXEL',
+    'IMAGE-SIZE-PIXELS',
+    'IMAGE-UP',
+    'IMMEDIATE-DISPLAY',
+    'IMPLEMENTS',
+    'IMPORT',
+    'IMPORT-PRINCIPAL',
+    'IN',
+    'IN-HANDLE',
+    'INCREMENT-EXCLUSIVE-ID',
+    'INDEX',
+    'INDEX-HINT',
+    'INDEX-INFORMATION',
+    'INDEXED-REPOSITION',
+    'INDICATOR',
+    'INFO',
+    'INFOR',
+    'INFORM',
+    'INFORMA',
+    'INFORMAT',
+    'INFORMATI',
+    'INFORMATIO',
+    'INFORMATION',
+    'INHERIT-BGC',
+    'INHERIT-BGCO',
+    'INHERIT-BGCOL',
+    'INHERIT-BGCOLO',
+    'INHERIT-BGCOLOR',
+    'INHERIT-FGC',
+    'INHERIT-FGCO',
+    'INHERIT-FGCOL',
+    'INHERIT-FGCOLO',
+    'INHERIT-FGCOLOR',
+    'INHERITS',
+    'INIT',
+    'INITI',
+    'INITIA',
+    'INITIAL',
+    'INITIAL-DIR',
+    'INITIAL-FILTER',
+    'INITIALIZE-DOCUMENT-TYPE',
+    'INITIATE',
+    'INNER-CHARS',
+    'INNER-LINES',
+    'INPUT',
+    'INPUT-O',
+    'INPUT-OU',
+    'INPUT-OUT',
+    'INPUT-OUTP',
+    'INPUT-OUTPU',
+    'INPUT-OUTPUT',
+    'INPUT-VALUE',
+    'INSERT',
+    'INSERT-ATTRIBUTE',
+    'INSERT-B',
+    'INSERT-BA',
+    'INSERT-BAC',
+    'INSERT-BACK',
+    'INSERT-BACKT',
+    'INSERT-BACKTA',
+    'INSERT-BACKTAB',
+    'INSERT-FILE',
+    'INSERT-ROW',
+    'INSERT-STRING',
+    'INSERT-T',
+    'INSERT-TA',
+    'INSERT-TAB',
+    'INT64',
+    'INT',
+    'INTEGER',
+    'INTERFACE',
+    'INTERNAL-ENTRIES',
+    'INTO',
+    'INVOKE',
+    'IS',
+    'IS-ATTR',
+    'IS-ATTR-',
+    'IS-ATTR-S',
+    'IS-ATTR-SP',
+    'IS-ATTR-SPA',
+    'IS-ATTR-SPAC',
+    'IS-ATTR-SPACE',
+    'IS-CLASS',
+    'IS-JSON',
+    'IS-LEAD-BYTE',
+    'IS-OPEN',
+    'IS-PARAMETER-SET',
+    'IS-PARTITIONED',
+    'IS-ROW-SELECTED',
+    'IS-SELECTED',
+    'IS-XML',
+    'ITEM',
+    'ITEMS-PER-ROW',
+    'JOIN',
+    'JOIN-BY-SQLDB',
+    'KBLABEL',
+    'KEEP-CONNECTION-OPEN',
+    'KEEP-FRAME-Z',
+    'KEEP-FRAME-Z-',
+    'KEEP-FRAME-Z-O',
+    'KEEP-FRAME-Z-OR',
+    'KEEP-FRAME-Z-ORD',
+    'KEEP-FRAME-Z-ORDE',
+    'KEEP-FRAME-Z-ORDER',
+    'KEEP-MESSAGES',
+    'KEEP-SECURITY-CACHE',
+    'KEEP-TAB-ORDER',
+    'KEY',
+    'KEY-CODE',
+    'KEY-FUNC',
+    'KEY-FUNCT',
+    'KEY-FUNCTI',
+    'KEY-FUNCTIO',
+    'KEY-FUNCTION',
+    'KEY-LABEL',
+    'KEYCODE',
+    'KEYFUNC',
+    'KEYFUNCT',
+    'KEYFUNCTI',
+    'KEYFUNCTIO',
+    'KEYFUNCTION',
+    'KEYLABEL',
+    'KEYS',
+    'KEYWORD',
+    'KEYWORD-ALL',
+    'LABEL',
+    'LABEL-BGC',
+    'LABEL-BGCO',
+    'LABEL-BGCOL',
+    'LABEL-BGCOLO',
+    'LABEL-BGCOLOR',
+    'LABEL-DC',
+    'LABEL-DCO',
+    'LABEL-DCOL',
+    'LABEL-DCOLO',
+    'LABEL-DCOLOR',
+    'LABEL-FGC',
+    'LABEL-FGCO',
+    'LABEL-FGCOL',
+    'LABEL-FGCOLO',
+    'LABEL-FGCOLOR',
+    'LABEL-FONT',
+    'LABEL-PFC',
+    'LABEL-PFCO',
+    'LABEL-PFCOL',
+    'LABEL-PFCOLO',
+    'LABEL-PFCOLOR',
+    'LABELS',
+    'LABELS-HAVE-COLONS',
+    'LANDSCAPE',
+    'LANGUAGE',
+    'LANGUAGES',
+    'LARGE',
+    'LARGE-TO-SMALL',
+    'LAST',
+    'LAST-ASYNCH-REQUEST',
+    'LAST-BATCH',
+    'LAST-CHILD',
+    'LAST-EVEN',
+    'LAST-EVENT',
+    'LAST-FORM',
+    'LAST-KEY',
+    'LAST-OBJECT',
+    'LAST-OF',
+    'LAST-PROCE',
+    'LAST-PROCED',
+    'LAST-PROCEDU',
+    'LAST-PROCEDUR',
+    'LAST-PROCEDURE',
+    'LAST-SERVER',
+    'LAST-TAB-I',
+    'LAST-TAB-IT',
+    'LAST-TAB-ITE',
+    'LAST-TAB-ITEM',
+    'LASTKEY',
+    'LC',
+    'LDBNAME',
+    'LE',
+    'LEAVE',
+    'LEFT-ALIGN',
+    'LEFT-ALIGNE',
+    'LEFT-ALIGNED',
+    'LEFT-TRIM',
+    'LENGTH',
+    'LIBRARY',
+    'LIKE',
+    'LIKE-SEQUENTIAL',
+    'LINE',
+    'LINE-COUNT',
+    'LINE-COUNTE',
+    'LINE-COUNTER',
+    'LIST-EVENTS',
+    'LIST-ITEM-PAIRS',
+    'LIST-ITEMS',
+    'LIST-PROPERTY-NAMES',
+    'LIST-QUERY-ATTRS',
+    'LIST-SET-ATTRS',
+    'LIST-WIDGETS',
+    'LISTI',
+    'LISTIN',
+    'LISTING',
+    'LITERAL-QUESTION',
+    'LITTLE-ENDIAN',
+    'LOAD',
+    'LOAD-DOMAINS',
+    'LOAD-ICON',
+    'LOAD-IMAGE',
+    'LOAD-IMAGE-DOWN',
+    'LOAD-IMAGE-INSENSITIVE',
+    'LOAD-IMAGE-UP',
+    'LOAD-MOUSE-P',
+    'LOAD-MOUSE-PO',
+    'LOAD-MOUSE-POI',
+    'LOAD-MOUSE-POIN',
+    'LOAD-MOUSE-POINT',
+    'LOAD-MOUSE-POINTE',
+    'LOAD-MOUSE-POINTER',
+    'LOAD-PICTURE',
+    'LOAD-SMALL-ICON',
+    'LOCAL-NAME',
+    'LOCAL-VERSION-INFO',
+    'LOCATOR-COLUMN-NUMBER',
+    'LOCATOR-LINE-NUMBER',
+    'LOCATOR-PUBLIC-ID',
+    'LOCATOR-SYSTEM-ID',
+    'LOCATOR-TYPE',
+    'LOCK-REGISTRATION',
+    'LOCKED',
+    'LOG',
+    'LOG-AUDIT-EVENT',
+    'LOG-MANAGER',
+    'LOGICAL',
+    'LOGIN-EXPIRATION-TIMESTAMP',
+    'LOGIN-HOST',
+    'LOGIN-STATE',
+    'LOGOUT',
+    'LONGCHAR',
+    'LOOKAHEAD',
+    'LOOKUP',
+    'LT',
+    'MACHINE-CLASS',
+    'MANDATORY',
+    'MANUAL-HIGHLIGHT',
+    'MAP',
+    'MARGIN-EXTRA',
+    'MARGIN-HEIGHT',
+    'MARGIN-HEIGHT-',
+    'MARGIN-HEIGHT-C',
+    'MARGIN-HEIGHT-CH',
+    'MARGIN-HEIGHT-CHA',
+    'MARGIN-HEIGHT-CHAR',
+    'MARGIN-HEIGHT-CHARS',
+    'MARGIN-HEIGHT-P',
+    'MARGIN-HEIGHT-PI',
+    'MARGIN-HEIGHT-PIX',
+    'MARGIN-HEIGHT-PIXE',
+    'MARGIN-HEIGHT-PIXEL',
+    'MARGIN-HEIGHT-PIXELS',
+    'MARGIN-WIDTH',
+    'MARGIN-WIDTH-',
+    'MARGIN-WIDTH-C',
+    'MARGIN-WIDTH-CH',
+    'MARGIN-WIDTH-CHA',
+    'MARGIN-WIDTH-CHAR',
+    'MARGIN-WIDTH-CHARS',
+    'MARGIN-WIDTH-P',
+    'MARGIN-WIDTH-PI',
+    'MARGIN-WIDTH-PIX',
+    'MARGIN-WIDTH-PIXE',
+    'MARGIN-WIDTH-PIXEL',
+    'MARGIN-WIDTH-PIXELS',
+    'MARK-NEW',
+    'MARK-ROW-STATE',
+    'MATCHES',
+    'MAX',
+    'MAX-BUTTON',
+    'MAX-CHARS',
+    'MAX-DATA-GUESS',
+    'MAX-HEIGHT',
+    'MAX-HEIGHT-C',
+    'MAX-HEIGHT-CH',
+    'MAX-HEIGHT-CHA',
+    'MAX-HEIGHT-CHAR',
+    'MAX-HEIGHT-CHARS',
+    'MAX-HEIGHT-P',
+    'MAX-HEIGHT-PI',
+    'MAX-HEIGHT-PIX',
+    'MAX-HEIGHT-PIXE',
+    'MAX-HEIGHT-PIXEL',
+    'MAX-HEIGHT-PIXELS',
+    'MAX-ROWS',
+    'MAX-SIZE',
+    'MAX-VAL',
+    'MAX-VALU',
+    'MAX-VALUE',
+    'MAX-WIDTH',
+    'MAX-WIDTH-',
+    'MAX-WIDTH-C',
+    'MAX-WIDTH-CH',
+    'MAX-WIDTH-CHA',
+    'MAX-WIDTH-CHAR',
+    'MAX-WIDTH-CHARS',
+    'MAX-WIDTH-P',
+    'MAX-WIDTH-PI',
+    'MAX-WIDTH-PIX',
+    'MAX-WIDTH-PIXE',
+    'MAX-WIDTH-PIXEL',
+    'MAX-WIDTH-PIXELS',
+    'MAXI',
+    'MAXIM',
+    'MAXIMIZE',
+    'MAXIMU',
+    'MAXIMUM',
+    'MAXIMUM-LEVEL',
+    'MD5-DIGEST',
+    'MEMBER',
+    'MEMPTR-TO-NODE-VALUE',
+    'MENU',
+    'MENU-BAR',
+    'MENU-ITEM',
+    'MENU-K',
+    'MENU-KE',
+    'MENU-KEY',
+    'MENU-M',
+    'MENU-MO',
+    'MENU-MOU',
+    'MENU-MOUS',
+    'MENU-MOUSE',
+    'MENUBAR',
+    'MERGE-BY-FIELD',
+    'MESSAGE',
+    'MESSAGE-AREA',
+    'MESSAGE-AREA-FONT',
+    'MESSAGE-LINES',
+    'METHOD',
+    'MIN',
+    'MIN-BUTTON',
+    'MIN-COLUMN-WIDTH-C',
+    'MIN-COLUMN-WIDTH-CH',
+    'MIN-COLUMN-WIDTH-CHA',
+    'MIN-COLUMN-WIDTH-CHAR',
+    'MIN-COLUMN-WIDTH-CHARS',
+    'MIN-COLUMN-WIDTH-P',
+    'MIN-COLUMN-WIDTH-PI',
+    'MIN-COLUMN-WIDTH-PIX',
+    'MIN-COLUMN-WIDTH-PIXE',
+    'MIN-COLUMN-WIDTH-PIXEL',
+    'MIN-COLUMN-WIDTH-PIXELS',
+    'MIN-HEIGHT',
+    'MIN-HEIGHT-',
+    'MIN-HEIGHT-C',
+    'MIN-HEIGHT-CH',
+    'MIN-HEIGHT-CHA',
+    'MIN-HEIGHT-CHAR',
+    'MIN-HEIGHT-CHARS',
+    'MIN-HEIGHT-P',
+    'MIN-HEIGHT-PI',
+    'MIN-HEIGHT-PIX',
+    'MIN-HEIGHT-PIXE',
+    'MIN-HEIGHT-PIXEL',
+    'MIN-HEIGHT-PIXELS',
+    'MIN-SIZE',
+    'MIN-VAL',
+    'MIN-VALU',
+    'MIN-VALUE',
+    'MIN-WIDTH',
+    'MIN-WIDTH-',
+    'MIN-WIDTH-C',
+    'MIN-WIDTH-CH',
+    'MIN-WIDTH-CHA',
+    'MIN-WIDTH-CHAR',
+    'MIN-WIDTH-CHARS',
+    'MIN-WIDTH-P',
+    'MIN-WIDTH-PI',
+    'MIN-WIDTH-PIX',
+    'MIN-WIDTH-PIXE',
+    'MIN-WIDTH-PIXEL',
+    'MIN-WIDTH-PIXELS',
+    'MINI',
+    'MINIM',
+    'MINIMU',
+    'MINIMUM',
+    'MOD',
+    'MODIFIED',
+    'MODU',
+    'MODUL',
+    'MODULO',
+    'MONTH',
+    'MOUSE',
+    'MOUSE-P',
+    'MOUSE-PO',
+    'MOUSE-POI',
+    'MOUSE-POIN',
+    'MOUSE-POINT',
+    'MOUSE-POINTE',
+    'MOUSE-POINTER',
+    'MOVABLE',
+    'MOVE-AFTER',
+    'MOVE-AFTER-',
+    'MOVE-AFTER-T',
+    'MOVE-AFTER-TA',
+    'MOVE-AFTER-TAB',
+    'MOVE-AFTER-TAB-',
+    'MOVE-AFTER-TAB-I',
+    'MOVE-AFTER-TAB-IT',
+    'MOVE-AFTER-TAB-ITE',
+    'MOVE-AFTER-TAB-ITEM',
+    'MOVE-BEFOR',
+    'MOVE-BEFORE',
+    'MOVE-BEFORE-',
+    'MOVE-BEFORE-T',
+    'MOVE-BEFORE-TA',
+    'MOVE-BEFORE-TAB',
+    'MOVE-BEFORE-TAB-',
+    'MOVE-BEFORE-TAB-I',
+    'MOVE-BEFORE-TAB-IT',
+    'MOVE-BEFORE-TAB-ITE',
+    'MOVE-BEFORE-TAB-ITEM',
+    'MOVE-COL',
+    'MOVE-COLU',
+    'MOVE-COLUM',
+    'MOVE-COLUMN',
+    'MOVE-TO-B',
+    'MOVE-TO-BO',
+    'MOVE-TO-BOT',
+    'MOVE-TO-BOTT',
+    'MOVE-TO-BOTTO',
+    'MOVE-TO-BOTTOM',
+    'MOVE-TO-EOF',
+    'MOVE-TO-T',
+    'MOVE-TO-TO',
+    'MOVE-TO-TOP',
+    'MPE',
+    'MTIME',
+    'MULTI-COMPILE',
+    'MULTIPLE',
+    'MULTIPLE-KEY',
+    'MULTITASKING-INTERVAL',
+    'MUST-EXIST',
+    'NAME',
+    'NAMESPACE-PREFIX',
+    'NAMESPACE-URI',
+    'NATIVE',
+    'NE',
+    'NEEDS-APPSERVER-PROMPT',
+    'NEEDS-PROMPT',
+    'NEW',
+    'NEW-INSTANCE',
+    'NEW-ROW',
+    'NEXT',
+    'NEXT-COLUMN',
+    'NEXT-PROMPT',
+    'NEXT-ROWID',
+    'NEXT-SIBLING',
+    'NEXT-TAB-I',
+    'NEXT-TAB-IT',
+    'NEXT-TAB-ITE',
+    'NEXT-TAB-ITEM',
+    'NEXT-VALUE',
+    'NO',
+    'NO-APPLY',
+    'NO-ARRAY-MESSAGE',
+    'NO-ASSIGN',
+    'NO-ATTR',
+    'NO-ATTR-',
+    'NO-ATTR-L',
+    'NO-ATTR-LI',
+    'NO-ATTR-LIS',
+    'NO-ATTR-LIST',
+    'NO-ATTR-S',
+    'NO-ATTR-SP',
+    'NO-ATTR-SPA',
+    'NO-ATTR-SPAC',
+    'NO-ATTR-SPACE',
+    'NO-AUTO-VALIDATE',
+    'NO-BIND-WHERE',
+    'NO-BOX',
+    'NO-CONSOLE',
+    'NO-CONVERT',
+    'NO-CONVERT-3D-COLORS',
+    'NO-CURRENT-VALUE',
+    'NO-DEBUG',
+    'NO-DRAG',
+    'NO-ECHO',
+    'NO-EMPTY-SPACE',
+    'NO-ERROR',
+    'NO-F',
+    'NO-FI',
+    'NO-FIL',
+    'NO-FILL',
+    'NO-FOCUS',
+    'NO-HELP',
+    'NO-HIDE',
+    'NO-INDEX-HINT',
+    'NO-INHERIT-BGC',
+    'NO-INHERIT-BGCO',
+    'NO-INHERIT-BGCOLOR',
+    'NO-INHERIT-FGC',
+    'NO-INHERIT-FGCO',
+    'NO-INHERIT-FGCOL',
+    'NO-INHERIT-FGCOLO',
+    'NO-INHERIT-FGCOLOR',
+    'NO-JOIN-BY-SQLDB',
+    'NO-LABE',
+    'NO-LABELS',
+    'NO-LOBS',
+    'NO-LOCK',
+    'NO-LOOKAHEAD',
+    'NO-MAP',
+    'NO-MES',
+    'NO-MESS',
+    'NO-MESSA',
+    'NO-MESSAG',
+    'NO-MESSAGE',
+    'NO-PAUSE',
+    'NO-PREFE',
+    'NO-PREFET',
+    'NO-PREFETC',
+    'NO-PREFETCH',
+    'NO-ROW-MARKERS',
+    'NO-SCROLLBAR-VERTICAL',
+    'NO-SEPARATE-CONNECTION',
+    'NO-SEPARATORS',
+    'NO-TAB-STOP',
+    'NO-UND',
+    'NO-UNDE',
+    'NO-UNDER',
+    'NO-UNDERL',
+    'NO-UNDERLI',
+    'NO-UNDERLIN',
+    'NO-UNDERLINE',
+    'NO-UNDO',
+    'NO-VAL',
+    'NO-VALI',
+    'NO-VALID',
+    'NO-VALIDA',
+    'NO-VALIDAT',
+    'NO-VALIDATE',
+    'NO-WAIT',
+    'NO-WORD-WRAP',
+    'NODE-VALUE-TO-MEMPTR',
+    'NONAMESPACE-SCHEMA-LOCATION',
+    'NONE',
+    'NORMALIZE',
+    'NOT',
+    'NOT-ACTIVE',
+    'NOW',
+    'NULL',
+    'NUM-ALI',
+    'NUM-ALIA',
+    'NUM-ALIAS',
+    'NUM-ALIASE',
+    'NUM-ALIASES',
+    'NUM-BUFFERS',
+    'NUM-BUT',
+    'NUM-BUTT',
+    'NUM-BUTTO',
+    'NUM-BUTTON',
+    'NUM-BUTTONS',
+    'NUM-COL',
+    'NUM-COLU',
+    'NUM-COLUM',
+    'NUM-COLUMN',
+    'NUM-COLUMNS',
+    'NUM-COPIES',
+    'NUM-DBS',
+    'NUM-DROPPED-FILES',
+    'NUM-ENTRIES',
+    'NUM-FIELDS',
+    'NUM-FORMATS',
+    'NUM-ITEMS',
+    'NUM-ITERATIONS',
+    'NUM-LINES',
+    'NUM-LOCKED-COL',
+    'NUM-LOCKED-COLU',
+    'NUM-LOCKED-COLUM',
+    'NUM-LOCKED-COLUMN',
+    'NUM-LOCKED-COLUMNS',
+    'NUM-MESSAGES',
+    'NUM-PARAMETERS',
+    'NUM-REFERENCES',
+    'NUM-REPLACED',
+    'NUM-RESULTS',
+    'NUM-SELECTED',
+    'NUM-SELECTED-',
+    'NUM-SELECTED-ROWS',
+    'NUM-SELECTED-W',
+    'NUM-SELECTED-WI',
+    'NUM-SELECTED-WID',
+    'NUM-SELECTED-WIDG',
+    'NUM-SELECTED-WIDGE',
+    'NUM-SELECTED-WIDGET',
+    'NUM-SELECTED-WIDGETS',
+    'NUM-TABS',
+    'NUM-TO-RETAIN',
+    'NUM-VISIBLE-COLUMNS',
+    'NUMERIC',
+    'NUMERIC-F',
+    'NUMERIC-FO',
+    'NUMERIC-FOR',
+    'NUMERIC-FORM',
+    'NUMERIC-FORMA',
+    'NUMERIC-FORMAT',
+    'OCTET-LENGTH',
+    'OF',
+    'OFF',
+    'OK',
+    'OK-CANCEL',
+    'OLD',
+    'ON',
+    'ON-FRAME',
+    'ON-FRAME-',
+    'ON-FRAME-B',
+    'ON-FRAME-BO',
+    'ON-FRAME-BOR',
+    'ON-FRAME-BORD',
+    'ON-FRAME-BORDE',
+    'ON-FRAME-BORDER',
+    'OPEN',
+    'OPSYS',
+    'OPTION',
+    'OR',
+    'ORDERED-JOIN',
+    'ORDINAL',
+    'OS-APPEND',
+    'OS-COMMAND',
+    'OS-COPY',
+    'OS-CREATE-DIR',
+    'OS-DELETE',
+    'OS-DIR',
+    'OS-DRIVE',
+    'OS-DRIVES',
+    'OS-ERROR',
+    'OS-GETENV',
+    'OS-RENAME',
+    'OTHERWISE',
+    'OUTPUT',
+    'OVERLAY',
+    'OVERRIDE',
+    'OWNER',
+    'PAGE',
+    'PAGE-BOT',
+    'PAGE-BOTT',
+    'PAGE-BOTTO',
+    'PAGE-BOTTOM',
+    'PAGE-NUM',
+    'PAGE-NUMB',
+    'PAGE-NUMBE',
+    'PAGE-NUMBER',
+    'PAGE-SIZE',
+    'PAGE-TOP',
+    'PAGE-WID',
+    'PAGE-WIDT',
+    'PAGE-WIDTH',
+    'PAGED',
+    'PARAM',
+    'PARAME',
+    'PARAMET',
+    'PARAMETE',
+    'PARAMETER',
+    'PARENT',
+    'PARSE-STATUS',
+    'PARTIAL-KEY',
+    'PASCAL',
+    'PASSWORD-FIELD',
+    'PATHNAME',
+    'PAUSE',
+    'PBE-HASH-ALG',
+    'PBE-HASH-ALGO',
+    'PBE-HASH-ALGOR',
+    'PBE-HASH-ALGORI',
+    'PBE-HASH-ALGORIT',
+    'PBE-HASH-ALGORITH',
+    'PBE-HASH-ALGORITHM',
+    'PBE-KEY-ROUNDS',
+    'PDBNAME',
+    'PERSIST',
+    'PERSISTE',
+    'PERSISTEN',
+    'PERSISTENT',
+    'PERSISTENT-CACHE-DISABLED',
+    'PFC',
+    'PFCO',
+    'PFCOL',
+    'PFCOLO',
+    'PFCOLOR',
+    'PIXELS',
+    'PIXELS-PER-COL',
+    'PIXELS-PER-COLU',
+    'PIXELS-PER-COLUM',
+    'PIXELS-PER-COLUMN',
+    'PIXELS-PER-ROW',
+    'POPUP-M',
+    'POPUP-ME',
+    'POPUP-MEN',
+    'POPUP-MENU',
+    'POPUP-O',
+    'POPUP-ON',
+    'POPUP-ONL',
+    'POPUP-ONLY',
+    'PORTRAIT',
+    'POSITION',
+    'PRECISION',
+    'PREFER-DATASET',
+    'PREPARE-STRING',
+    'PREPARED',
+    'PREPROC',
+    'PREPROCE',
+    'PREPROCES',
+    'PREPROCESS',
+    'PRESEL',
+    'PRESELE',
+    'PRESELEC',
+    'PRESELECT',
+    'PREV',
+    'PREV-COLUMN',
+    'PREV-SIBLING',
+    'PREV-TAB-I',
+    'PREV-TAB-IT',
+    'PREV-TAB-ITE',
+    'PREV-TAB-ITEM',
+    'PRIMARY',
+    'PRINTER',
+    'PRINTER-CONTROL-HANDLE',
+    'PRINTER-HDC',
+    'PRINTER-NAME',
+    'PRINTER-PORT',
+    'PRINTER-SETUP',
+    'PRIVATE',
+    'PRIVATE-D',
+    'PRIVATE-DA',
+    'PRIVATE-DAT',
+    'PRIVATE-DATA',
+    'PRIVILEGES',
+    'PROC-HA',
+    'PROC-HAN',
+    'PROC-HAND',
+    'PROC-HANDL',
+    'PROC-HANDLE',
+    'PROC-ST',
+    'PROC-STA',
+    'PROC-STAT',
+    'PROC-STATU',
+    'PROC-STATUS',
+    'PROC-TEXT',
+    'PROC-TEXT-BUFFER',
+    'PROCE',
+    'PROCED',
+    'PROCEDU',
+    'PROCEDUR',
+    'PROCEDURE',
+    'PROCEDURE-CALL-TYPE',
+    'PROCEDURE-TYPE',
+    'PROCESS',
+    'PROFILER',
+    'PROGRAM-NAME',
+    'PROGRESS',
+    'PROGRESS-S',
+    'PROGRESS-SO',
+    'PROGRESS-SOU',
+    'PROGRESS-SOUR',
+    'PROGRESS-SOURC',
+    'PROGRESS-SOURCE',
+    'PROMPT',
+    'PROMPT-F',
+    'PROMPT-FO',
+    'PROMPT-FOR',
+    'PROMSGS',
+    'PROPATH',
+    'PROPERTY',
+    'PROTECTED',
+    'PROVERS',
+    'PROVERSI',
+    'PROVERSIO',
+    'PROVERSION',
+    'PROXY',
+    'PROXY-PASSWORD',
+    'PROXY-USERID',
+    'PUBLIC',
+    'PUBLIC-ID',
+    'PUBLISH',
+    'PUBLISHED-EVENTS',
+    'PUT',
+    'PUT-BYTE',
+    'PUT-DOUBLE',
+    'PUT-FLOAT',
+    'PUT-INT64',
+    'PUT-KEY-VAL',
+    'PUT-KEY-VALU',
+    'PUT-KEY-VALUE',
+    'PUT-LONG',
+    'PUT-SHORT',
+    'PUT-STRING',
+    'PUT-UNSIGNED-LONG',
+    'PUTBYTE',
+    'QUERY',
+    'QUERY-CLOSE',
+    'QUERY-OFF-END',
+    'QUERY-OPEN',
+    'QUERY-PREPARE',
+    'QUERY-TUNING',
+    'QUESTION',
+    'QUIT',
+    'QUOTER',
+    'R-INDEX',
+    'RADIO-BUTTONS',
+    'RADIO-SET',
+    'RANDOM',
+    'RAW',
+    'RAW-TRANSFER',
+    'RCODE-INFO',
+    'RCODE-INFOR',
+    'RCODE-INFORM',
+    'RCODE-INFORMA',
+    'RCODE-INFORMAT',
+    'RCODE-INFORMATI',
+    'RCODE-INFORMATIO',
+    'RCODE-INFORMATION',
+    'READ-AVAILABLE',
+    'READ-EXACT-NUM',
+    'READ-FILE',
+    'READ-JSON',
+    'READ-ONLY',
+    'READ-XML',
+    'READ-XMLSCHEMA',
+    'READKEY',
+    'REAL',
+    'RECID',
+    'RECORD-LENGTH',
+    'RECT',
+    'RECTA',
+    'RECTAN',
+    'RECTANG',
+    'RECTANGL',
+    'RECTANGLE',
+    'RECURSIVE',
+    'REFERENCE-ONLY',
+    'REFRESH',
+    'REFRESH-AUDIT-POLICY',
+    'REFRESHABLE',
+    'REGISTER-DOMAIN',
+    'RELEASE',
+    'REMOTE',
+    'REMOVE-EVENTS-PROCEDURE',
+    'REMOVE-SUPER-PROCEDURE',
+    'REPEAT',
+    'REPLACE',
+    'REPLACE-SELECTION-TEXT',
+    'REPOSITION',
+    'REPOSITION-BACKWARD',
+    'REPOSITION-FORWARD',
+    'REPOSITION-MODE',
+    'REPOSITION-TO-ROW',
+    'REPOSITION-TO-ROWID',
+    'REQUEST',
+    'REQUEST-INFO',
+    'RESET',
+    'RESIZA',
+    'RESIZAB',
+    'RESIZABL',
+    'RESIZABLE',
+    'RESIZE',
+    'RESPONSE-INFO',
+    'RESTART-ROW',
+    'RESTART-ROWID',
+    'RETAIN',
+    'RETAIN-SHAPE',
+    'RETRY',
+    'RETRY-CANCEL',
+    'RETURN',
+    'RETURN-ALIGN',
+    'RETURN-ALIGNE',
+    'RETURN-INS',
+    'RETURN-INSE',
+    'RETURN-INSER',
+    'RETURN-INSERT',
+    'RETURN-INSERTE',
+    'RETURN-INSERTED',
+    'RETURN-TO-START-DI',
+    'RETURN-TO-START-DIR',
+    'RETURN-VAL',
+    'RETURN-VALU',
+    'RETURN-VALUE',
+    'RETURN-VALUE-DATA-TYPE',
+    'RETURNS',
+    'REVERSE-FROM',
+    'REVERT',
+    'REVOKE',
+    'RGB-VALUE',
+    'RIGHT-ALIGNED',
+    'RIGHT-TRIM',
+    'ROLES',
+    'ROUND',
+    'ROUTINE-LEVEL',
+    'ROW',
+    'ROW-HEIGHT-CHARS',
+    'ROW-HEIGHT-PIXELS',
+    'ROW-MARKERS',
+    'ROW-OF',
+    'ROW-RESIZABLE',
+    'ROWID',
+    'RULE',
+    'RUN',
+    'RUN-PROCEDURE',
+    'SAVE CACHE',
+    'SAVE',
+    'SAVE-AS',
+    'SAVE-FILE',
+    'SAX-COMPLE',
+    'SAX-COMPLET',
+    'SAX-COMPLETE',
+    'SAX-PARSE',
+    'SAX-PARSE-FIRST',
+    'SAX-PARSE-NEXT',
+    'SAX-PARSER-ERROR',
+    'SAX-RUNNING',
+    'SAX-UNINITIALIZED',
+    'SAX-WRITE-BEGIN',
+    'SAX-WRITE-COMPLETE',
+    'SAX-WRITE-CONTENT',
+    'SAX-WRITE-ELEMENT',
+    'SAX-WRITE-ERROR',
+    'SAX-WRITE-IDLE',
+    'SAX-WRITE-TAG',
+    'SAX-WRITER',
+    'SCHEMA',
+    'SCHEMA-LOCATION',
+    'SCHEMA-MARSHAL',
+    'SCHEMA-PATH',
+    'SCREEN',
+    'SCREEN-IO',
+    'SCREEN-LINES',
+    'SCREEN-VAL',
+    'SCREEN-VALU',
+    'SCREEN-VALUE',
+    'SCROLL',
+    'SCROLL-BARS',
+    'SCROLL-DELTA',
+    'SCROLL-OFFSET',
+    'SCROLL-TO-CURRENT-ROW',
+    'SCROLL-TO-I',
+    'SCROLL-TO-IT',
+    'SCROLL-TO-ITE',
+    'SCROLL-TO-ITEM',
+    'SCROLL-TO-SELECTED-ROW',
+    'SCROLLABLE',
+    'SCROLLBAR-H',
+    'SCROLLBAR-HO',
+    'SCROLLBAR-HOR',
+    'SCROLLBAR-HORI',
+    'SCROLLBAR-HORIZ',
+    'SCROLLBAR-HORIZO',
+    'SCROLLBAR-HORIZON',
+    'SCROLLBAR-HORIZONT',
+    'SCROLLBAR-HORIZONTA',
+    'SCROLLBAR-HORIZONTAL',
+    'SCROLLBAR-V',
+    'SCROLLBAR-VE',
+    'SCROLLBAR-VER',
+    'SCROLLBAR-VERT',
+    'SCROLLBAR-VERTI',
+    'SCROLLBAR-VERTIC',
+    'SCROLLBAR-VERTICA',
+    'SCROLLBAR-VERTICAL',
+    'SCROLLED-ROW-POS',
+    'SCROLLED-ROW-POSI',
+    'SCROLLED-ROW-POSIT',
+    'SCROLLED-ROW-POSITI',
+    'SCROLLED-ROW-POSITIO',
+    'SCROLLED-ROW-POSITION',
+    'SCROLLING',
+    'SDBNAME',
+    'SEAL',
+    'SEAL-TIMESTAMP',
+    'SEARCH',
+    'SEARCH-SELF',
+    'SEARCH-TARGET',
+    'SECTION',
+    'SECURITY-POLICY',
+    'SEEK',
+    'SELECT',
+    'SELECT-ALL',
+    'SELECT-FOCUSED-ROW',
+    'SELECT-NEXT-ROW',
+    'SELECT-PREV-ROW',
+    'SELECT-ROW',
+    'SELECTABLE',
+    'SELECTED',
+    'SELECTION',
+    'SELECTION-END',
+    'SELECTION-LIST',
+    'SELECTION-START',
+    'SELECTION-TEXT',
+    'SELF',
+    'SEND',
+    'SEND-SQL-STATEMENT',
+    'SENSITIVE',
+    'SEPARATE-CONNECTION',
+    'SEPARATOR-FGCOLOR',
+    'SEPARATORS',
+    'SERIALIZABLE',
+    'SERIALIZE-HIDDEN',
+    'SERIALIZE-NAME',
+    'SERVER',
+    'SERVER-CONNECTION-BOUND',
+    'SERVER-CONNECTION-BOUND-REQUEST',
+    'SERVER-CONNECTION-CONTEXT',
+    'SERVER-CONNECTION-ID',
+    'SERVER-OPERATING-MODE',
+    'SESSION',
+    'SESSION-ID',
+    'SET',
+    'SET-APPL-CONTEXT',
+    'SET-ATTR-CALL-TYPE',
+    'SET-ATTRIBUTE-NODE',
+    'SET-BLUE',
+    'SET-BLUE-',
+    'SET-BLUE-V',
+    'SET-BLUE-VA',
+    'SET-BLUE-VAL',
+    'SET-BLUE-VALU',
+    'SET-BLUE-VALUE',
+    'SET-BREAK',
+    'SET-BUFFERS',
+    'SET-CALLBACK',
+    'SET-CLIENT',
+    'SET-COMMIT',
+    'SET-CONTENTS',
+    'SET-CURRENT-VALUE',
+    'SET-DB-CLIENT',
+    'SET-DYNAMIC',
+    'SET-EVENT-MANAGER-OPTION',
+    'SET-GREEN',
+    'SET-GREEN-',
+    'SET-GREEN-V',
+    'SET-GREEN-VA',
+    'SET-GREEN-VAL',
+    'SET-GREEN-VALU',
+    'SET-GREEN-VALUE',
+    'SET-INPUT-SOURCE',
+    'SET-OPTION',
+    'SET-OUTPUT-DESTINATION',
+    'SET-PARAMETER',
+    'SET-POINTER-VALUE',
+    'SET-PROPERTY',
+    'SET-RED',
+    'SET-RED-',
+    'SET-RED-V',
+    'SET-RED-VA',
+    'SET-RED-VAL',
+    'SET-RED-VALU',
+    'SET-RED-VALUE',
+    'SET-REPOSITIONED-ROW',
+    'SET-RGB-VALUE',
+    'SET-ROLLBACK',
+    'SET-SELECTION',
+    'SET-SIZE',
+    'SET-SORT-ARROW',
+    'SET-WAIT-STATE',
+    'SETUSER',
+    'SETUSERI',
+    'SETUSERID',
+    'SHA1-DIGEST',
+    'SHARE',
+    'SHARE-',
+    'SHARE-L',
+    'SHARE-LO',
+    'SHARE-LOC',
+    'SHARE-LOCK',
+    'SHARED',
+    'SHOW-IN-TASKBAR',
+    'SHOW-STAT',
+    'SHOW-STATS',
+    'SIDE-LAB',
+    'SIDE-LABE',
+    'SIDE-LABEL',
+    'SIDE-LABEL-H',
+    'SIDE-LABEL-HA',
+    'SIDE-LABEL-HAN',
+    'SIDE-LABEL-HAND',
+    'SIDE-LABEL-HANDL',
+    'SIDE-LABEL-HANDLE',
+    'SIDE-LABELS',
+    'SIGNATURE',
+    'SILENT',
+    'SIMPLE',
+    'SINGLE',
+    'SINGLE-RUN',
+    'SINGLETON',
+    'SIZE',
+    'SIZE-C',
+    'SIZE-CH',
+    'SIZE-CHA',
+    'SIZE-CHAR',
+    'SIZE-CHARS',
+    'SIZE-P',
+    'SIZE-PI',
+    'SIZE-PIX',
+    'SIZE-PIXE',
+    'SIZE-PIXEL',
+    'SIZE-PIXELS',
+    'SKIP',
+    'SKIP-DELETED-RECORD',
+    'SLIDER',
+    'SMALL-ICON',
+    'SMALL-TITLE',
+    'SMALLINT',
+    'SOME',
+    'SORT',
+    'SORT-ASCENDING',
+    'SORT-NUMBER',
+    'SOURCE',
+    'SOURCE-PROCEDURE',
+    'SPACE',
+    'SQL',
+    'SQRT',
+    'SSL-SERVER-NAME',
+    'STANDALONE',
+    'START',
+    'START-DOCUMENT',
+    'START-ELEMENT',
+    'START-MOVE',
+    'START-RESIZE',
+    'START-ROW-RESIZE',
+    'STATE-DETAIL',
+    'STATIC',
+    'STATUS',
+    'STATUS-AREA',
+    'STATUS-AREA-FONT',
+    'STDCALL',
+    'STOP',
+    'STOP-AFTER',
+    'STOP-PARSING',
+    'STOPPE',
+    'STOPPED',
+    'STORED-PROC',
+    'STORED-PROCE',
+    'STORED-PROCED',
+    'STORED-PROCEDU',
+    'STORED-PROCEDUR',
+    'STORED-PROCEDURE',
+    'STREAM',
+    'STREAM-HANDLE',
+    'STREAM-IO',
+    'STRETCH-TO-FIT',
+    'STRICT',
+    'STRICT-ENTITY-RESOLUTION',
+    'STRING',
+    'STRING-VALUE',
+    'STRING-XREF',
+    'SUB-AVE',
+    'SUB-AVER',
+    'SUB-AVERA',
+    'SUB-AVERAG',
+    'SUB-AVERAGE',
+    'SUB-COUNT',
+    'SUB-MAXIMUM',
+    'SUB-MENU',
+    'SUB-MIN',
+    'SUB-MINIMUM',
+    'SUB-TOTAL',
+    'SUBSCRIBE',
+    'SUBST',
+    'SUBSTI',
+    'SUBSTIT',
+    'SUBSTITU',
+    'SUBSTITUT',
+    'SUBSTITUTE',
+    'SUBSTR',
+    'SUBSTRI',
+    'SUBSTRIN',
+    'SUBSTRING',
+    'SUBTYPE',
+    'SUM',
+    'SUM-MAX',
+    'SUM-MAXI',
+    'SUM-MAXIM',
+    'SUM-MAXIMU',
+    'SUPER',
+    'SUPER-PROCEDURES',
+    'SUPPRESS-NAMESPACE-PROCESSING',
+    'SUPPRESS-W',
+    'SUPPRESS-WA',
+    'SUPPRESS-WAR',
+    'SUPPRESS-WARN',
+    'SUPPRESS-WARNI',
+    'SUPPRESS-WARNIN',
+    'SUPPRESS-WARNING',
+    'SUPPRESS-WARNINGS',
+    'SYMMETRIC-ENCRYPTION-ALGORITHM',
+    'SYMMETRIC-ENCRYPTION-IV',
+    'SYMMETRIC-ENCRYPTION-KEY',
+    'SYMMETRIC-SUPPORT',
+    'SYSTEM-ALERT',
+    'SYSTEM-ALERT-',
+    'SYSTEM-ALERT-B',
+    'SYSTEM-ALERT-BO',
+    'SYSTEM-ALERT-BOX',
+    'SYSTEM-ALERT-BOXE',
+    'SYSTEM-ALERT-BOXES',
+    'SYSTEM-DIALOG',
+    'SYSTEM-HELP',
+    'SYSTEM-ID',
+    'TAB-POSITION',
+    'TAB-STOP',
+    'TABLE',
+    'TABLE-HANDLE',
+    'TABLE-NUMBER',
+    'TABLE-SCAN',
+    'TARGET',
+    'TARGET-PROCEDURE',
+    'TEMP-DIR',
+    'TEMP-DIRE',
+    'TEMP-DIREC',
+    'TEMP-DIRECT',
+    'TEMP-DIRECTO',
+    'TEMP-DIRECTOR',
+    'TEMP-DIRECTORY',
+    'TEMP-TABLE',
+    'TEMP-TABLE-PREPARE',
+    'TERM',
+    'TERMI',
+    'TERMIN',
+    'TERMINA',
+    'TERMINAL',
+    'TERMINATE',
+    'TEXT',
+    'TEXT-CURSOR',
+    'TEXT-SEG-GROW',
+    'TEXT-SELECTED',
+    'THEN',
+    'THIS-OBJECT',
+    'THIS-PROCEDURE',
+    'THREAD-SAFE',
+    'THREE-D',
+    'THROUGH',
+    'THROW',
+    'THRU',
+    'TIC-MARKS',
+    'TIME',
+    'TIME-SOURCE',
+    'TITLE',
+    'TITLE-BGC',
+    'TITLE-BGCO',
+    'TITLE-BGCOL',
+    'TITLE-BGCOLO',
+    'TITLE-BGCOLOR',
+    'TITLE-DC',
+    'TITLE-DCO',
+    'TITLE-DCOL',
+    'TITLE-DCOLO',
+    'TITLE-DCOLOR',
+    'TITLE-FGC',
+    'TITLE-FGCO',
+    'TITLE-FGCOL',
+    'TITLE-FGCOLO',
+    'TITLE-FGCOLOR',
+    'TITLE-FO',
+    'TITLE-FON',
+    'TITLE-FONT',
+    'TO',
+    'TO-ROWID',
+    'TODAY',
+    'TOGGLE-BOX',
+    'TOOLTIP',
+    'TOOLTIPS',
+    'TOP-NAV-QUERY',
+    'TOP-ONLY',
+    'TOPIC',
+    'TOTAL',
+    'TRAILING',
+    'TRANS',
+    'TRANS-INIT-PROCEDURE',
+    'TRANSACTION',
+    'TRANSACTION-MODE',
+    'TRANSPARENT',
+    'TRIGGER',
+    'TRIGGERS',
+    'TRIM',
+    'TRUE',
+    'TRUNC',
+    'TRUNCA',
+    'TRUNCAT',
+    'TRUNCATE',
+    'TYPE',
+    'TYPE-OF',
+    'UNBOX',
+    'UNBUFF',
+    'UNBUFFE',
+    'UNBUFFER',
+    'UNBUFFERE',
+    'UNBUFFERED',
+    'UNDERL',
+    'UNDERLI',
+    'UNDERLIN',
+    'UNDERLINE',
+    'UNDO',
+    'UNFORM',
+    'UNFORMA',
+    'UNFORMAT',
+    'UNFORMATT',
+    'UNFORMATTE',
+    'UNFORMATTED',
+    'UNION',
+    'UNIQUE',
+    'UNIQUE-ID',
+    'UNIQUE-MATCH',
+    'UNIX',
+    'UNLESS-HIDDEN',
+    'UNLOAD',
+    'UNSIGNED-LONG',
+    'UNSUBSCRIBE',
+    'UP',
+    'UPDATE',
+    'UPDATE-ATTRIBUTE',
+    'URL',
+    'URL-DECODE',
+    'URL-ENCODE',
+    'URL-PASSWORD',
+    'URL-USERID',
+    'USE',
+    'USE-DICT-EXPS',
+    'USE-FILENAME',
+    'USE-INDEX',
+    'USE-REVVIDEO',
+    'USE-TEXT',
+    'USE-UNDERLINE',
+    'USE-WIDGET-POOL',
+    'USER',
+    'USER-ID',
+    'USERID',
+    'USING',
+    'V6DISPLAY',
+    'V6FRAME',
+    'VALID-EVENT',
+    'VALID-HANDLE',
+    'VALID-OBJECT',
+    'VALIDATE',
+    'VALIDATE-EXPRESSION',
+    'VALIDATE-MESSAGE',
+    'VALIDATE-SEAL',
+    'VALIDATION-ENABLED',
+    'VALUE',
+    'VALUE-CHANGED',
+    'VALUES',
+    'VAR',
+    'VARI',
+    'VARIA',
+    'VARIAB',
+    'VARIABL',
+    'VARIABLE',
+    'VERBOSE',
+    'VERSION',
+    'VERT',
+    'VERTI',
+    'VERTIC',
+    'VERTICA',
+    'VERTICAL',
+    'VIEW',
+    'VIEW-AS',
+    'VIEW-FIRST-COLUMN-ON-REOPEN',
+    'VIRTUAL-HEIGHT',
+    'VIRTUAL-HEIGHT-',
+    'VIRTUAL-HEIGHT-C',
+    'VIRTUAL-HEIGHT-CH',
+    'VIRTUAL-HEIGHT-CHA',
+    'VIRTUAL-HEIGHT-CHAR',
+    'VIRTUAL-HEIGHT-CHARS',
+    'VIRTUAL-HEIGHT-P',
+    'VIRTUAL-HEIGHT-PI',
+    'VIRTUAL-HEIGHT-PIX',
+    'VIRTUAL-HEIGHT-PIXE',
+    'VIRTUAL-HEIGHT-PIXEL',
+    'VIRTUAL-HEIGHT-PIXELS',
+    'VIRTUAL-WIDTH',
+    'VIRTUAL-WIDTH-',
+    'VIRTUAL-WIDTH-C',
+    'VIRTUAL-WIDTH-CH',
+    'VIRTUAL-WIDTH-CHA',
+    'VIRTUAL-WIDTH-CHAR',
+    'VIRTUAL-WIDTH-CHARS',
+    'VIRTUAL-WIDTH-P',
+    'VIRTUAL-WIDTH-PI',
+    'VIRTUAL-WIDTH-PIX',
+    'VIRTUAL-WIDTH-PIXE',
+    'VIRTUAL-WIDTH-PIXEL',
+    'VIRTUAL-WIDTH-PIXELS',
+    'VISIBLE',
+    'VOID',
+    'WAIT',
+    'WAIT-FOR',
+    'WARNING',
+    'WEB-CONTEXT',
+    'WEEKDAY',
+    'WHEN',
+    'WHERE',
+    'WHILE',
+    'WIDGET',
+    'WIDGET-E',
+    'WIDGET-EN',
+    'WIDGET-ENT',
+    'WIDGET-ENTE',
+    'WIDGET-ENTER',
+    'WIDGET-ID',
+    'WIDGET-L',
+    'WIDGET-LE',
+    'WIDGET-LEA',
+    'WIDGET-LEAV',
+    'WIDGET-LEAVE',
+    'WIDGET-POOL',
+    'WIDTH',
+    'WIDTH-',
+    'WIDTH-C',
+    'WIDTH-CH',
+    'WIDTH-CHA',
+    'WIDTH-CHAR',
+    'WIDTH-CHARS',
+    'WIDTH-P',
+    'WIDTH-PI',
+    'WIDTH-PIX',
+    'WIDTH-PIXE',
+    'WIDTH-PIXEL',
+    'WIDTH-PIXELS',
+    'WINDOW',
+    'WINDOW-MAXIM',
+    'WINDOW-MAXIMI',
+    'WINDOW-MAXIMIZ',
+    'WINDOW-MAXIMIZE',
+    'WINDOW-MAXIMIZED',
+    'WINDOW-MINIM',
+    'WINDOW-MINIMI',
+    'WINDOW-MINIMIZ',
+    'WINDOW-MINIMIZE',
+    'WINDOW-MINIMIZED',
+    'WINDOW-NAME',
+    'WINDOW-NORMAL',
+    'WINDOW-STA',
+    'WINDOW-STAT',
+    'WINDOW-STATE',
+    'WINDOW-SYSTEM',
+    'WITH',
+    'WORD-INDEX',
+    'WORD-WRAP',
+    'WORK-AREA-HEIGHT-PIXELS',
+    'WORK-AREA-WIDTH-PIXELS',
+    'WORK-AREA-X',
+    'WORK-AREA-Y',
+    'WORK-TAB',
+    'WORK-TABL',
+    'WORK-TABLE',
+    'WORKFILE',
+    'WRITE',
+    'WRITE-CDATA',
+    'WRITE-CHARACTERS',
+    'WRITE-COMMENT',
+    'WRITE-DATA-ELEMENT',
+    'WRITE-EMPTY-ELEMENT',
+    'WRITE-ENTITY-REF',
+    'WRITE-EXTERNAL-DTD',
+    'WRITE-FRAGMENT',
+    'WRITE-JSON',
+    'WRITE-MESSAGE',
+    'WRITE-PROCESSING-INSTRUCTION',
+    'WRITE-STATUS',
+    'WRITE-XML',
+    'WRITE-XMLSCHEMA',
+    'X',
+    'X-OF',
+    'XCODE',
+    'XML-DATA-TYPE',
+    'XML-ENTITY-EXPANSION-LIMIT',
+    'XML-NODE-TYPE',
+    'XML-SCHEMA-PATH',
+    'XML-STRICT-ENTITY-RESOLUTION',
+    'XML-SUPPRESS-NAMESPACE-PROCESSING',
+    'XREF',
+    'XREF-XML',
+    'Y',
+    'Y-OF',
+    'YEAR',
+    'YEAR-OFFSET',
+    'YES',
+    'YES-NO',
+    'YES-NO-CANCEL'
+)
diff --git a/.venv/Lib/site-packages/pygments/lexers/_php_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_php_builtins.py
new file mode 100644 (file)
index 0000000..19825fa
--- /dev/null
@@ -0,0 +1,3325 @@
+"""
+    pygments.lexers._php_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file loads the function names and their modules from the
+    php webpage and generates itself.
+
+    Run with `python -I` to regenerate.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+MODULES = {'APCu': ('apcu_add',
+          'apcu_cache_info',
+          'apcu_cas',
+          'apcu_clear_cache',
+          'apcu_dec',
+          'apcu_delete',
+          'apcu_enabled',
+          'apcu_entry',
+          'apcu_exists',
+          'apcu_fetch',
+          'apcu_inc',
+          'apcu_key_info',
+          'apcu_sma_info',
+          'apcu_store'),
+ 'Aliases and deprecated Mysqli': ('mysqli_connect',
+                                   'mysqli_execute',
+                                   'mysqli_get_client_stats',
+                                   'mysqli_get_links_stats',
+                                   'mysqli_report'),
+ 'Apache': ('apache_child_terminate',
+            'apache_get_modules',
+            'apache_get_version',
+            'apache_getenv',
+            'apache_lookup_uri',
+            'apache_note',
+            'apache_request_headers',
+            'apache_response_headers',
+            'apache_setenv',
+            'getallheaders',
+            'virtual'),
+ 'Array': ('array_change_key_case',
+           'array_chunk',
+           'array_column',
+           'array_combine',
+           'array_count_values',
+           'array_diff_assoc',
+           'array_diff_key',
+           'array_diff_uassoc',
+           'array_diff_ukey',
+           'array_diff',
+           'array_fill_keys',
+           'array_fill',
+           'array_filter',
+           'array_flip',
+           'array_intersect_assoc',
+           'array_intersect_key',
+           'array_intersect_uassoc',
+           'array_intersect_ukey',
+           'array_intersect',
+           'array_is_list',
+           'array_key_exists',
+           'array_key_first',
+           'array_key_last',
+           'array_keys',
+           'array_map',
+           'array_merge_recursive',
+           'array_merge',
+           'array_multisort',
+           'array_pad',
+           'array_pop',
+           'array_product',
+           'array_push',
+           'array_rand',
+           'array_reduce',
+           'array_replace_recursive',
+           'array_replace',
+           'array_reverse',
+           'array_search',
+           'array_shift',
+           'array_slice',
+           'array_splice',
+           'array_sum',
+           'array_udiff_assoc',
+           'array_udiff_uassoc',
+           'array_udiff',
+           'array_uintersect_assoc',
+           'array_uintersect_uassoc',
+           'array_uintersect',
+           'array_unique',
+           'array_unshift',
+           'array_values',
+           'array_walk_recursive',
+           'array_walk',
+           'array',
+           'arsort',
+           'asort',
+           'compact',
+           'count',
+           'current',
+           'each',
+           'end',
+           'extract',
+           'in_array',
+           'key_exists',
+           'key',
+           'krsort',
+           'ksort',
+           'list',
+           'natcasesort',
+           'natsort',
+           'next',
+           'pos',
+           'prev',
+           'range',
+           'reset',
+           'rsort',
+           'shuffle',
+           'sizeof',
+           'sort',
+           'uasort',
+           'uksort',
+           'usort'),
+ 'BC Math': ('bcadd',
+             'bccomp',
+             'bcdiv',
+             'bcmod',
+             'bcmul',
+             'bcpow',
+             'bcpowmod',
+             'bcscale',
+             'bcsqrt',
+             'bcsub'),
+ 'Bzip2': ('bzclose',
+           'bzcompress',
+           'bzdecompress',
+           'bzerrno',
+           'bzerror',
+           'bzerrstr',
+           'bzflush',
+           'bzopen',
+           'bzread',
+           'bzwrite'),
+ 'COM': ('com_create_guid',
+         'com_event_sink',
+         'com_get_active_object',
+         'com_load_typelib',
+         'com_message_pump',
+         'com_print_typeinfo',
+         'variant_abs',
+         'variant_add',
+         'variant_and',
+         'variant_cast',
+         'variant_cat',
+         'variant_cmp',
+         'variant_date_from_timestamp',
+         'variant_date_to_timestamp',
+         'variant_div',
+         'variant_eqv',
+         'variant_fix',
+         'variant_get_type',
+         'variant_idiv',
+         'variant_imp',
+         'variant_int',
+         'variant_mod',
+         'variant_mul',
+         'variant_neg',
+         'variant_not',
+         'variant_or',
+         'variant_pow',
+         'variant_round',
+         'variant_set_type',
+         'variant_set',
+         'variant_sub',
+         'variant_xor'),
+ 'CSPRNG': ('random_bytes', 'random_int'),
+ 'CUBRID': ('cubrid_bind',
+            'cubrid_close_prepare',
+            'cubrid_close_request',
+            'cubrid_col_get',
+            'cubrid_col_size',
+            'cubrid_column_names',
+            'cubrid_column_types',
+            'cubrid_commit',
+            'cubrid_connect_with_url',
+            'cubrid_connect',
+            'cubrid_current_oid',
+            'cubrid_disconnect',
+            'cubrid_drop',
+            'cubrid_error_code_facility',
+            'cubrid_error_code',
+            'cubrid_error_msg',
+            'cubrid_execute',
+            'cubrid_fetch',
+            'cubrid_free_result',
+            'cubrid_get_autocommit',
+            'cubrid_get_charset',
+            'cubrid_get_class_name',
+            'cubrid_get_client_info',
+            'cubrid_get_db_parameter',
+            'cubrid_get_query_timeout',
+            'cubrid_get_server_info',
+            'cubrid_get',
+            'cubrid_insert_id',
+            'cubrid_is_instance',
+            'cubrid_lob_close',
+            'cubrid_lob_export',
+            'cubrid_lob_get',
+            'cubrid_lob_send',
+            'cubrid_lob_size',
+            'cubrid_lob2_bind',
+            'cubrid_lob2_close',
+            'cubrid_lob2_export',
+            'cubrid_lob2_import',
+            'cubrid_lob2_new',
+            'cubrid_lob2_read',
+            'cubrid_lob2_seek64',
+            'cubrid_lob2_seek',
+            'cubrid_lob2_size64',
+            'cubrid_lob2_size',
+            'cubrid_lob2_tell64',
+            'cubrid_lob2_tell',
+            'cubrid_lob2_write',
+            'cubrid_lock_read',
+            'cubrid_lock_write',
+            'cubrid_move_cursor',
+            'cubrid_next_result',
+            'cubrid_num_cols',
+            'cubrid_num_rows',
+            'cubrid_pconnect_with_url',
+            'cubrid_pconnect',
+            'cubrid_prepare',
+            'cubrid_put',
+            'cubrid_rollback',
+            'cubrid_schema',
+            'cubrid_seq_drop',
+            'cubrid_seq_insert',
+            'cubrid_seq_put',
+            'cubrid_set_add',
+            'cubrid_set_autocommit',
+            'cubrid_set_db_parameter',
+            'cubrid_set_drop',
+            'cubrid_set_query_timeout',
+            'cubrid_version'),
+ 'Calendar': ('cal_days_in_month',
+              'cal_from_jd',
+              'cal_info',
+              'cal_to_jd',
+              'easter_date',
+              'easter_days',
+              'frenchtojd',
+              'gregoriantojd',
+              'jddayofweek',
+              'jdmonthname',
+              'jdtofrench',
+              'jdtogregorian',
+              'jdtojewish',
+              'jdtojulian',
+              'jdtounix',
+              'jewishtojd',
+              'juliantojd',
+              'unixtojd'),
+ 'Classes/Object': ('__autoload',
+                    'class_alias',
+                    'class_exists',
+                    'enum_exists',
+                    'get_called_class',
+                    'get_class_methods',
+                    'get_class_vars',
+                    'get_class',
+                    'get_declared_classes',
+                    'get_declared_interfaces',
+                    'get_declared_traits',
+                    'get_mangled_object_vars',
+                    'get_object_vars',
+                    'get_parent_class',
+                    'interface_exists',
+                    'is_a',
+                    'is_subclass_of',
+                    'method_exists',
+                    'property_exists',
+                    'trait_exists'),
+ 'Ctype': ('ctype_alnum',
+           'ctype_alpha',
+           'ctype_cntrl',
+           'ctype_digit',
+           'ctype_graph',
+           'ctype_lower',
+           'ctype_print',
+           'ctype_punct',
+           'ctype_space',
+           'ctype_upper',
+           'ctype_xdigit'),
+ 'DBA': ('dba_close',
+         'dba_delete',
+         'dba_exists',
+         'dba_fetch',
+         'dba_firstkey',
+         'dba_handlers',
+         'dba_insert',
+         'dba_key_split',
+         'dba_list',
+         'dba_nextkey',
+         'dba_open',
+         'dba_optimize',
+         'dba_popen',
+         'dba_replace',
+         'dba_sync'),
+ 'DOM': ('dom_import_simplexml',),
+ 'Date/Time': ('checkdate',
+               'date_add',
+               'date_create_from_format',
+               'date_create_immutable_from_format',
+               'date_create_immutable',
+               'date_create',
+               'date_date_set',
+               'date_default_timezone_get',
+               'date_default_timezone_set',
+               'date_diff',
+               'date_format',
+               'date_get_last_errors',
+               'date_interval_create_from_date_string',
+               'date_interval_format',
+               'date_isodate_set',
+               'date_modify',
+               'date_offset_get',
+               'date_parse_from_format',
+               'date_parse',
+               'date_sub',
+               'date_sun_info',
+               'date_sunrise',
+               'date_sunset',
+               'date_time_set',
+               'date_timestamp_get',
+               'date_timestamp_set',
+               'date_timezone_get',
+               'date_timezone_set',
+               'date',
+               'getdate',
+               'gettimeofday',
+               'gmdate',
+               'gmmktime',
+               'gmstrftime',
+               'idate',
+               'localtime',
+               'microtime',
+               'mktime',
+               'strftime',
+               'strptime',
+               'strtotime',
+               'time',
+               'timezone_abbreviations_list',
+               'timezone_identifiers_list',
+               'timezone_location_get',
+               'timezone_name_from_abbr',
+               'timezone_name_get',
+               'timezone_offset_get',
+               'timezone_open',
+               'timezone_transitions_get',
+               'timezone_version_get'),
+ 'Direct IO': ('dio_close',
+               'dio_fcntl',
+               'dio_open',
+               'dio_read',
+               'dio_seek',
+               'dio_stat',
+               'dio_tcsetattr',
+               'dio_truncate',
+               'dio_write'),
+ 'Directory': ('chdir',
+               'chroot',
+               'closedir',
+               'dir',
+               'getcwd',
+               'opendir',
+               'readdir',
+               'rewinddir',
+               'scandir'),
+ 'Eio': ('eio_busy',
+         'eio_cancel',
+         'eio_chmod',
+         'eio_chown',
+         'eio_close',
+         'eio_custom',
+         'eio_dup2',
+         'eio_event_loop',
+         'eio_fallocate',
+         'eio_fchmod',
+         'eio_fchown',
+         'eio_fdatasync',
+         'eio_fstat',
+         'eio_fstatvfs',
+         'eio_fsync',
+         'eio_ftruncate',
+         'eio_futime',
+         'eio_get_event_stream',
+         'eio_get_last_error',
+         'eio_grp_add',
+         'eio_grp_cancel',
+         'eio_grp_limit',
+         'eio_grp',
+         'eio_init',
+         'eio_link',
+         'eio_lstat',
+         'eio_mkdir',
+         'eio_mknod',
+         'eio_nop',
+         'eio_npending',
+         'eio_nready',
+         'eio_nreqs',
+         'eio_nthreads',
+         'eio_open',
+         'eio_poll',
+         'eio_read',
+         'eio_readahead',
+         'eio_readdir',
+         'eio_readlink',
+         'eio_realpath',
+         'eio_rename',
+         'eio_rmdir',
+         'eio_seek',
+         'eio_sendfile',
+         'eio_set_max_idle',
+         'eio_set_max_parallel',
+         'eio_set_max_poll_reqs',
+         'eio_set_max_poll_time',
+         'eio_set_min_parallel',
+         'eio_stat',
+         'eio_statvfs',
+         'eio_symlink',
+         'eio_sync_file_range',
+         'eio_sync',
+         'eio_syncfs',
+         'eio_truncate',
+         'eio_unlink',
+         'eio_utime',
+         'eio_write'),
+ 'Enchant': ('enchant_broker_describe',
+             'enchant_broker_dict_exists',
+             'enchant_broker_free_dict',
+             'enchant_broker_free',
+             'enchant_broker_get_dict_path',
+             'enchant_broker_get_error',
+             'enchant_broker_init',
+             'enchant_broker_list_dicts',
+             'enchant_broker_request_dict',
+             'enchant_broker_request_pwl_dict',
+             'enchant_broker_set_dict_path',
+             'enchant_broker_set_ordering',
+             'enchant_dict_add_to_personal',
+             'enchant_dict_add_to_session',
+             'enchant_dict_add',
+             'enchant_dict_check',
+             'enchant_dict_describe',
+             'enchant_dict_get_error',
+             'enchant_dict_is_added',
+             'enchant_dict_is_in_session',
+             'enchant_dict_quick_check',
+             'enchant_dict_store_replacement',
+             'enchant_dict_suggest'),
+ 'Error Handling': ('debug_backtrace',
+                    'debug_print_backtrace',
+                    'error_clear_last',
+                    'error_get_last',
+                    'error_log',
+                    'error_reporting',
+                    'restore_error_handler',
+                    'restore_exception_handler',
+                    'set_error_handler',
+                    'set_exception_handler',
+                    'trigger_error',
+                    'user_error'),
+ 'Exif': ('exif_imagetype',
+          'exif_read_data',
+          'exif_tagname',
+          'exif_thumbnail',
+          'read_exif_data'),
+ 'Expect': ('expect_expectl', 'expect_popen'),
+ 'FDF': ('fdf_add_doc_javascript',
+         'fdf_add_template',
+         'fdf_close',
+         'fdf_create',
+         'fdf_enum_values',
+         'fdf_errno',
+         'fdf_error',
+         'fdf_get_ap',
+         'fdf_get_attachment',
+         'fdf_get_encoding',
+         'fdf_get_file',
+         'fdf_get_flags',
+         'fdf_get_opt',
+         'fdf_get_status',
+         'fdf_get_value',
+         'fdf_get_version',
+         'fdf_header',
+         'fdf_next_field_name',
+         'fdf_open_string',
+         'fdf_open',
+         'fdf_remove_item',
+         'fdf_save_string',
+         'fdf_save',
+         'fdf_set_ap',
+         'fdf_set_encoding',
+         'fdf_set_file',
+         'fdf_set_flags',
+         'fdf_set_javascript_action',
+         'fdf_set_on_import_javascript',
+         'fdf_set_opt',
+         'fdf_set_status',
+         'fdf_set_submit_form_action',
+         'fdf_set_target_frame',
+         'fdf_set_value',
+         'fdf_set_version'),
+ 'FPM': ('fastcgi_finish_request',),
+ 'FTP': ('ftp_alloc',
+         'ftp_append',
+         'ftp_cdup',
+         'ftp_chdir',
+         'ftp_chmod',
+         'ftp_close',
+         'ftp_connect',
+         'ftp_delete',
+         'ftp_exec',
+         'ftp_fget',
+         'ftp_fput',
+         'ftp_get_option',
+         'ftp_get',
+         'ftp_login',
+         'ftp_mdtm',
+         'ftp_mkdir',
+         'ftp_mlsd',
+         'ftp_nb_continue',
+         'ftp_nb_fget',
+         'ftp_nb_fput',
+         'ftp_nb_get',
+         'ftp_nb_put',
+         'ftp_nlist',
+         'ftp_pasv',
+         'ftp_put',
+         'ftp_pwd',
+         'ftp_quit',
+         'ftp_raw',
+         'ftp_rawlist',
+         'ftp_rename',
+         'ftp_rmdir',
+         'ftp_set_option',
+         'ftp_site',
+         'ftp_size',
+         'ftp_ssl_connect',
+         'ftp_systype'),
+ 'Fann': ('fann_cascadetrain_on_data',
+          'fann_cascadetrain_on_file',
+          'fann_clear_scaling_params',
+          'fann_copy',
+          'fann_create_from_file',
+          'fann_create_shortcut_array',
+          'fann_create_shortcut',
+          'fann_create_sparse_array',
+          'fann_create_sparse',
+          'fann_create_standard_array',
+          'fann_create_standard',
+          'fann_create_train_from_callback',
+          'fann_create_train',
+          'fann_descale_input',
+          'fann_descale_output',
+          'fann_descale_train',
+          'fann_destroy_train',
+          'fann_destroy',
+          'fann_duplicate_train_data',
+          'fann_get_activation_function',
+          'fann_get_activation_steepness',
+          'fann_get_bias_array',
+          'fann_get_bit_fail_limit',
+          'fann_get_bit_fail',
+          'fann_get_cascade_activation_functions_count',
+          'fann_get_cascade_activation_functions',
+          'fann_get_cascade_activation_steepnesses_count',
+          'fann_get_cascade_activation_steepnesses',
+          'fann_get_cascade_candidate_change_fraction',
+          'fann_get_cascade_candidate_limit',
+          'fann_get_cascade_candidate_stagnation_epochs',
+          'fann_get_cascade_max_cand_epochs',
+          'fann_get_cascade_max_out_epochs',
+          'fann_get_cascade_min_cand_epochs',
+          'fann_get_cascade_min_out_epochs',
+          'fann_get_cascade_num_candidate_groups',
+          'fann_get_cascade_num_candidates',
+          'fann_get_cascade_output_change_fraction',
+          'fann_get_cascade_output_stagnation_epochs',
+          'fann_get_cascade_weight_multiplier',
+          'fann_get_connection_array',
+          'fann_get_connection_rate',
+          'fann_get_errno',
+          'fann_get_errstr',
+          'fann_get_layer_array',
+          'fann_get_learning_momentum',
+          'fann_get_learning_rate',
+          'fann_get_MSE',
+          'fann_get_network_type',
+          'fann_get_num_input',
+          'fann_get_num_layers',
+          'fann_get_num_output',
+          'fann_get_quickprop_decay',
+          'fann_get_quickprop_mu',
+          'fann_get_rprop_decrease_factor',
+          'fann_get_rprop_delta_max',
+          'fann_get_rprop_delta_min',
+          'fann_get_rprop_delta_zero',
+          'fann_get_rprop_increase_factor',
+          'fann_get_sarprop_step_error_shift',
+          'fann_get_sarprop_step_error_threshold_factor',
+          'fann_get_sarprop_temperature',
+          'fann_get_sarprop_weight_decay_shift',
+          'fann_get_total_connections',
+          'fann_get_total_neurons',
+          'fann_get_train_error_function',
+          'fann_get_train_stop_function',
+          'fann_get_training_algorithm',
+          'fann_init_weights',
+          'fann_length_train_data',
+          'fann_merge_train_data',
+          'fann_num_input_train_data',
+          'fann_num_output_train_data',
+          'fann_print_error',
+          'fann_randomize_weights',
+          'fann_read_train_from_file',
+          'fann_reset_errno',
+          'fann_reset_errstr',
+          'fann_reset_MSE',
+          'fann_run',
+          'fann_save_train',
+          'fann_save',
+          'fann_scale_input_train_data',
+          'fann_scale_input',
+          'fann_scale_output_train_data',
+          'fann_scale_output',
+          'fann_scale_train_data',
+          'fann_scale_train',
+          'fann_set_activation_function_hidden',
+          'fann_set_activation_function_layer',
+          'fann_set_activation_function_output',
+          'fann_set_activation_function',
+          'fann_set_activation_steepness_hidden',
+          'fann_set_activation_steepness_layer',
+          'fann_set_activation_steepness_output',
+          'fann_set_activation_steepness',
+          'fann_set_bit_fail_limit',
+          'fann_set_callback',
+          'fann_set_cascade_activation_functions',
+          'fann_set_cascade_activation_steepnesses',
+          'fann_set_cascade_candidate_change_fraction',
+          'fann_set_cascade_candidate_limit',
+          'fann_set_cascade_candidate_stagnation_epochs',
+          'fann_set_cascade_max_cand_epochs',
+          'fann_set_cascade_max_out_epochs',
+          'fann_set_cascade_min_cand_epochs',
+          'fann_set_cascade_min_out_epochs',
+          'fann_set_cascade_num_candidate_groups',
+          'fann_set_cascade_output_change_fraction',
+          'fann_set_cascade_output_stagnation_epochs',
+          'fann_set_cascade_weight_multiplier',
+          'fann_set_error_log',
+          'fann_set_input_scaling_params',
+          'fann_set_learning_momentum',
+          'fann_set_learning_rate',
+          'fann_set_output_scaling_params',
+          'fann_set_quickprop_decay',
+          'fann_set_quickprop_mu',
+          'fann_set_rprop_decrease_factor',
+          'fann_set_rprop_delta_max',
+          'fann_set_rprop_delta_min',
+          'fann_set_rprop_delta_zero',
+          'fann_set_rprop_increase_factor',
+          'fann_set_sarprop_step_error_shift',
+          'fann_set_sarprop_step_error_threshold_factor',
+          'fann_set_sarprop_temperature',
+          'fann_set_sarprop_weight_decay_shift',
+          'fann_set_scaling_params',
+          'fann_set_train_error_function',
+          'fann_set_train_stop_function',
+          'fann_set_training_algorithm',
+          'fann_set_weight_array',
+          'fann_set_weight',
+          'fann_shuffle_train_data',
+          'fann_subset_train_data',
+          'fann_test_data',
+          'fann_test',
+          'fann_train_epoch',
+          'fann_train_on_data',
+          'fann_train_on_file',
+          'fann_train'),
+ 'Fileinfo': ('finfo_buffer',
+              'finfo_close',
+              'finfo_file',
+              'finfo_open',
+              'finfo_set_flags',
+              'mime_content_type'),
+ 'Filesystem': ('basename',
+                'chgrp',
+                'chmod',
+                'chown',
+                'clearstatcache',
+                'copy',
+                'dirname',
+                'disk_free_space',
+                'disk_total_space',
+                'diskfreespace',
+                'fclose',
+                'fdatasync',
+                'feof',
+                'fflush',
+                'fgetc',
+                'fgetcsv',
+                'fgets',
+                'fgetss',
+                'file_exists',
+                'file_get_contents',
+                'file_put_contents',
+                'file',
+                'fileatime',
+                'filectime',
+                'filegroup',
+                'fileinode',
+                'filemtime',
+                'fileowner',
+                'fileperms',
+                'filesize',
+                'filetype',
+                'flock',
+                'fnmatch',
+                'fopen',
+                'fpassthru',
+                'fputcsv',
+                'fputs',
+                'fread',
+                'fscanf',
+                'fseek',
+                'fstat',
+                'fsync',
+                'ftell',
+                'ftruncate',
+                'fwrite',
+                'glob',
+                'is_dir',
+                'is_executable',
+                'is_file',
+                'is_link',
+                'is_readable',
+                'is_uploaded_file',
+                'is_writable',
+                'is_writeable',
+                'lchgrp',
+                'lchown',
+                'link',
+                'linkinfo',
+                'lstat',
+                'mkdir',
+                'move_uploaded_file',
+                'parse_ini_file',
+                'parse_ini_string',
+                'pathinfo',
+                'pclose',
+                'popen',
+                'readfile',
+                'readlink',
+                'realpath_cache_get',
+                'realpath_cache_size',
+                'realpath',
+                'rename',
+                'rewind',
+                'rmdir',
+                'set_file_buffer',
+                'stat',
+                'symlink',
+                'tempnam',
+                'tmpfile',
+                'touch',
+                'umask',
+                'unlink'),
+ 'Filter': ('filter_has_var',
+            'filter_id',
+            'filter_input_array',
+            'filter_input',
+            'filter_list',
+            'filter_var_array',
+            'filter_var'),
+ 'Firebird/InterBase': ('fbird_add_user',
+                        'fbird_affected_rows',
+                        'fbird_backup',
+                        'fbird_blob_add',
+                        'fbird_blob_cancel',
+                        'fbird_blob_close',
+                        'fbird_blob_create',
+                        'fbird_blob_echo',
+                        'fbird_blob_get',
+                        'fbird_blob_import',
+                        'fbird_blob_info',
+                        'fbird_blob_open',
+                        'fbird_close',
+                        'fbird_commit_ret',
+                        'fbird_commit',
+                        'fbird_connect',
+                        'fbird_db_info',
+                        'fbird_delete_user',
+                        'fbird_drop_db',
+                        'fbird_errcode',
+                        'fbird_errmsg',
+                        'fbird_execute',
+                        'fbird_fetch_assoc',
+                        'fbird_fetch_object',
+                        'fbird_fetch_row',
+                        'fbird_field_info',
+                        'fbird_free_event_handler',
+                        'fbird_free_query',
+                        'fbird_free_result',
+                        'fbird_gen_id',
+                        'fbird_maintain_db',
+                        'fbird_modify_user',
+                        'fbird_name_result',
+                        'fbird_num_fields',
+                        'fbird_num_params',
+                        'fbird_param_info',
+                        'fbird_pconnect',
+                        'fbird_prepare',
+                        'fbird_query',
+                        'fbird_restore',
+                        'fbird_rollback_ret',
+                        'fbird_rollback',
+                        'fbird_server_info',
+                        'fbird_service_attach',
+                        'fbird_service_detach',
+                        'fbird_set_event_handler',
+                        'fbird_trans',
+                        'fbird_wait_event',
+                        'ibase_add_user',
+                        'ibase_affected_rows',
+                        'ibase_backup',
+                        'ibase_blob_add',
+                        'ibase_blob_cancel',
+                        'ibase_blob_close',
+                        'ibase_blob_create',
+                        'ibase_blob_echo',
+                        'ibase_blob_get',
+                        'ibase_blob_import',
+                        'ibase_blob_info',
+                        'ibase_blob_open',
+                        'ibase_close',
+                        'ibase_commit_ret',
+                        'ibase_commit',
+                        'ibase_connect',
+                        'ibase_db_info',
+                        'ibase_delete_user',
+                        'ibase_drop_db',
+                        'ibase_errcode',
+                        'ibase_errmsg',
+                        'ibase_execute',
+                        'ibase_fetch_assoc',
+                        'ibase_fetch_object',
+                        'ibase_fetch_row',
+                        'ibase_field_info',
+                        'ibase_free_event_handler',
+                        'ibase_free_query',
+                        'ibase_free_result',
+                        'ibase_gen_id',
+                        'ibase_maintain_db',
+                        'ibase_modify_user',
+                        'ibase_name_result',
+                        'ibase_num_fields',
+                        'ibase_num_params',
+                        'ibase_param_info',
+                        'ibase_pconnect',
+                        'ibase_prepare',
+                        'ibase_query',
+                        'ibase_restore',
+                        'ibase_rollback_ret',
+                        'ibase_rollback',
+                        'ibase_server_info',
+                        'ibase_service_attach',
+                        'ibase_service_detach',
+                        'ibase_set_event_handler',
+                        'ibase_trans',
+                        'ibase_wait_event'),
+ 'Function handling': ('call_user_func_array',
+                       'call_user_func',
+                       'create_function',
+                       'forward_static_call_array',
+                       'forward_static_call',
+                       'func_get_arg',
+                       'func_get_args',
+                       'func_num_args',
+                       'function_exists',
+                       'get_defined_functions',
+                       'register_shutdown_function',
+                       'register_tick_function',
+                       'unregister_tick_function'),
+ 'GD and Image': ('gd_info',
+                  'getimagesize',
+                  'getimagesizefromstring',
+                  'image_type_to_extension',
+                  'image_type_to_mime_type',
+                  'image2wbmp',
+                  'imageaffine',
+                  'imageaffinematrixconcat',
+                  'imageaffinematrixget',
+                  'imagealphablending',
+                  'imageantialias',
+                  'imagearc',
+                  'imageavif',
+                  'imagebmp',
+                  'imagechar',
+                  'imagecharup',
+                  'imagecolorallocate',
+                  'imagecolorallocatealpha',
+                  'imagecolorat',
+                  'imagecolorclosest',
+                  'imagecolorclosestalpha',
+                  'imagecolorclosesthwb',
+                  'imagecolordeallocate',
+                  'imagecolorexact',
+                  'imagecolorexactalpha',
+                  'imagecolormatch',
+                  'imagecolorresolve',
+                  'imagecolorresolvealpha',
+                  'imagecolorset',
+                  'imagecolorsforindex',
+                  'imagecolorstotal',
+                  'imagecolortransparent',
+                  'imageconvolution',
+                  'imagecopy',
+                  'imagecopymerge',
+                  'imagecopymergegray',
+                  'imagecopyresampled',
+                  'imagecopyresized',
+                  'imagecreate',
+                  'imagecreatefromavif',
+                  'imagecreatefrombmp',
+                  'imagecreatefromgd2',
+                  'imagecreatefromgd2part',
+                  'imagecreatefromgd',
+                  'imagecreatefromgif',
+                  'imagecreatefromjpeg',
+                  'imagecreatefrompng',
+                  'imagecreatefromstring',
+                  'imagecreatefromtga',
+                  'imagecreatefromwbmp',
+                  'imagecreatefromwebp',
+                  'imagecreatefromxbm',
+                  'imagecreatefromxpm',
+                  'imagecreatetruecolor',
+                  'imagecrop',
+                  'imagecropauto',
+                  'imagedashedline',
+                  'imagedestroy',
+                  'imageellipse',
+                  'imagefill',
+                  'imagefilledarc',
+                  'imagefilledellipse',
+                  'imagefilledpolygon',
+                  'imagefilledrectangle',
+                  'imagefilltoborder',
+                  'imagefilter',
+                  'imageflip',
+                  'imagefontheight',
+                  'imagefontwidth',
+                  'imageftbbox',
+                  'imagefttext',
+                  'imagegammacorrect',
+                  'imagegd2',
+                  'imagegd',
+                  'imagegetclip',
+                  'imagegetinterpolation',
+                  'imagegif',
+                  'imagegrabscreen',
+                  'imagegrabwindow',
+                  'imageinterlace',
+                  'imageistruecolor',
+                  'imagejpeg',
+                  'imagelayereffect',
+                  'imageline',
+                  'imageloadfont',
+                  'imageopenpolygon',
+                  'imagepalettecopy',
+                  'imagepalettetotruecolor',
+                  'imagepng',
+                  'imagepolygon',
+                  'imagerectangle',
+                  'imageresolution',
+                  'imagerotate',
+                  'imagesavealpha',
+                  'imagescale',
+                  'imagesetbrush',
+                  'imagesetclip',
+                  'imagesetinterpolation',
+                  'imagesetpixel',
+                  'imagesetstyle',
+                  'imagesetthickness',
+                  'imagesettile',
+                  'imagestring',
+                  'imagestringup',
+                  'imagesx',
+                  'imagesy',
+                  'imagetruecolortopalette',
+                  'imagettfbbox',
+                  'imagettftext',
+                  'imagetypes',
+                  'imagewbmp',
+                  'imagewebp',
+                  'imagexbm',
+                  'iptcembed',
+                  'iptcparse',
+                  'jpeg2wbmp',
+                  'png2wbmp'),
+ 'GMP': ('gmp_abs',
+         'gmp_add',
+         'gmp_and',
+         'gmp_binomial',
+         'gmp_clrbit',
+         'gmp_cmp',
+         'gmp_com',
+         'gmp_div_q',
+         'gmp_div_qr',
+         'gmp_div_r',
+         'gmp_div',
+         'gmp_divexact',
+         'gmp_export',
+         'gmp_fact',
+         'gmp_gcd',
+         'gmp_gcdext',
+         'gmp_hamdist',
+         'gmp_import',
+         'gmp_init',
+         'gmp_intval',
+         'gmp_invert',
+         'gmp_jacobi',
+         'gmp_kronecker',
+         'gmp_lcm',
+         'gmp_legendre',
+         'gmp_mod',
+         'gmp_mul',
+         'gmp_neg',
+         'gmp_nextprime',
+         'gmp_or',
+         'gmp_perfect_power',
+         'gmp_perfect_square',
+         'gmp_popcount',
+         'gmp_pow',
+         'gmp_powm',
+         'gmp_prob_prime',
+         'gmp_random_bits',
+         'gmp_random_range',
+         'gmp_random_seed',
+         'gmp_random',
+         'gmp_root',
+         'gmp_rootrem',
+         'gmp_scan0',
+         'gmp_scan1',
+         'gmp_setbit',
+         'gmp_sign',
+         'gmp_sqrt',
+         'gmp_sqrtrem',
+         'gmp_strval',
+         'gmp_sub',
+         'gmp_testbit',
+         'gmp_xor'),
+ 'GeoIP': ('geoip_asnum_by_name',
+           'geoip_continent_code_by_name',
+           'geoip_country_code_by_name',
+           'geoip_country_code3_by_name',
+           'geoip_country_name_by_name',
+           'geoip_database_info',
+           'geoip_db_avail',
+           'geoip_db_filename',
+           'geoip_db_get_all_info',
+           'geoip_domain_by_name',
+           'geoip_id_by_name',
+           'geoip_isp_by_name',
+           'geoip_netspeedcell_by_name',
+           'geoip_org_by_name',
+           'geoip_record_by_name',
+           'geoip_region_by_name',
+           'geoip_region_name_by_code',
+           'geoip_setup_custom_directory',
+           'geoip_time_zone_by_country_and_region'),
+ 'Gettext': ('bind_textdomain_codeset',
+             'bindtextdomain',
+             'dcgettext',
+             'dcngettext',
+             'dgettext',
+             'dngettext',
+             'gettext',
+             'ngettext',
+             'textdomain'),
+ 'GnuPG': ('gnupg_adddecryptkey',
+           'gnupg_addencryptkey',
+           'gnupg_addsignkey',
+           'gnupg_cleardecryptkeys',
+           'gnupg_clearencryptkeys',
+           'gnupg_clearsignkeys',
+           'gnupg_decrypt',
+           'gnupg_decryptverify',
+           'gnupg_encrypt',
+           'gnupg_encryptsign',
+           'gnupg_export',
+           'gnupg_getengineinfo',
+           'gnupg_geterror',
+           'gnupg_geterrorinfo',
+           'gnupg_getprotocol',
+           'gnupg_import',
+           'gnupg_init',
+           'gnupg_keyinfo',
+           'gnupg_setarmor',
+           'gnupg_seterrormode',
+           'gnupg_setsignmode',
+           'gnupg_sign',
+           'gnupg_verify'),
+ 'Grapheme': ('grapheme_extract',
+              'grapheme_stripos',
+              'grapheme_stristr',
+              'grapheme_strlen',
+              'grapheme_strpos',
+              'grapheme_strripos',
+              'grapheme_strrpos',
+              'grapheme_strstr',
+              'grapheme_substr'),
+ 'Hash': ('hash_algos',
+          'hash_copy',
+          'hash_equals',
+          'hash_file',
+          'hash_final',
+          'hash_hkdf',
+          'hash_hmac_algos',
+          'hash_hmac_file',
+          'hash_hmac',
+          'hash_init',
+          'hash_pbkdf2',
+          'hash_update_file',
+          'hash_update_stream',
+          'hash_update',
+          'hash'),
+ 'IBM DB2': ('db2_autocommit',
+             'db2_bind_param',
+             'db2_client_info',
+             'db2_close',
+             'db2_column_privileges',
+             'db2_columns',
+             'db2_commit',
+             'db2_conn_error',
+             'db2_conn_errormsg',
+             'db2_connect',
+             'db2_cursor_type',
+             'db2_escape_string',
+             'db2_exec',
+             'db2_execute',
+             'db2_fetch_array',
+             'db2_fetch_assoc',
+             'db2_fetch_both',
+             'db2_fetch_object',
+             'db2_fetch_row',
+             'db2_field_display_size',
+             'db2_field_name',
+             'db2_field_num',
+             'db2_field_precision',
+             'db2_field_scale',
+             'db2_field_type',
+             'db2_field_width',
+             'db2_foreign_keys',
+             'db2_free_result',
+             'db2_free_stmt',
+             'db2_get_option',
+             'db2_last_insert_id',
+             'db2_lob_read',
+             'db2_next_result',
+             'db2_num_fields',
+             'db2_num_rows',
+             'db2_pclose',
+             'db2_pconnect',
+             'db2_prepare',
+             'db2_primary_keys',
+             'db2_procedure_columns',
+             'db2_procedures',
+             'db2_result',
+             'db2_rollback',
+             'db2_server_info',
+             'db2_set_option',
+             'db2_special_columns',
+             'db2_statistics',
+             'db2_stmt_error',
+             'db2_stmt_errormsg',
+             'db2_table_privileges',
+             'db2_tables'),
+ 'IDN': ('idn_to_ascii', 'idn_to_utf8'),
+ 'IMAP': ('imap_8bit',
+          'imap_alerts',
+          'imap_append',
+          'imap_base64',
+          'imap_binary',
+          'imap_body',
+          'imap_bodystruct',
+          'imap_check',
+          'imap_clearflag_full',
+          'imap_close',
+          'imap_create',
+          'imap_createmailbox',
+          'imap_delete',
+          'imap_deletemailbox',
+          'imap_errors',
+          'imap_expunge',
+          'imap_fetch_overview',
+          'imap_fetchbody',
+          'imap_fetchheader',
+          'imap_fetchmime',
+          'imap_fetchstructure',
+          'imap_fetchtext',
+          'imap_gc',
+          'imap_get_quota',
+          'imap_get_quotaroot',
+          'imap_getacl',
+          'imap_getmailboxes',
+          'imap_getsubscribed',
+          'imap_header',
+          'imap_headerinfo',
+          'imap_headers',
+          'imap_last_error',
+          'imap_list',
+          'imap_listmailbox',
+          'imap_listscan',
+          'imap_listsubscribed',
+          'imap_lsub',
+          'imap_mail_compose',
+          'imap_mail_copy',
+          'imap_mail_move',
+          'imap_mail',
+          'imap_mailboxmsginfo',
+          'imap_mime_header_decode',
+          'imap_msgno',
+          'imap_mutf7_to_utf8',
+          'imap_num_msg',
+          'imap_num_recent',
+          'imap_open',
+          'imap_ping',
+          'imap_qprint',
+          'imap_rename',
+          'imap_renamemailbox',
+          'imap_reopen',
+          'imap_rfc822_parse_adrlist',
+          'imap_rfc822_parse_headers',
+          'imap_rfc822_write_address',
+          'imap_savebody',
+          'imap_scan',
+          'imap_scanmailbox',
+          'imap_search',
+          'imap_set_quota',
+          'imap_setacl',
+          'imap_setflag_full',
+          'imap_sort',
+          'imap_status',
+          'imap_subscribe',
+          'imap_thread',
+          'imap_timeout',
+          'imap_uid',
+          'imap_undelete',
+          'imap_unsubscribe',
+          'imap_utf7_decode',
+          'imap_utf7_encode',
+          'imap_utf8_to_mutf7',
+          'imap_utf8'),
+ 'Igbinary': ('igbinary_serialize', 'igbinary_unserialize'),
+ 'Inotify': ('inotify_add_watch',
+             'inotify_init',
+             'inotify_queue_len',
+             'inotify_read',
+             'inotify_rm_watch'),
+ 'JSON': ('json_decode',
+          'json_encode',
+          'json_last_error_msg',
+          'json_last_error'),
+ 'LDAP': ('ldap_8859_to_t61',
+          'ldap_add_ext',
+          'ldap_add',
+          'ldap_bind_ext',
+          'ldap_bind',
+          'ldap_close',
+          'ldap_compare',
+          'ldap_connect',
+          'ldap_control_paged_result_response',
+          'ldap_control_paged_result',
+          'ldap_count_entries',
+          'ldap_count_references',
+          'ldap_delete_ext',
+          'ldap_delete',
+          'ldap_dn2ufn',
+          'ldap_err2str',
+          'ldap_errno',
+          'ldap_error',
+          'ldap_escape',
+          'ldap_exop_passwd',
+          'ldap_exop_refresh',
+          'ldap_exop_whoami',
+          'ldap_exop',
+          'ldap_explode_dn',
+          'ldap_first_attribute',
+          'ldap_first_entry',
+          'ldap_first_reference',
+          'ldap_free_result',
+          'ldap_get_attributes',
+          'ldap_get_dn',
+          'ldap_get_entries',
+          'ldap_get_option',
+          'ldap_get_values_len',
+          'ldap_get_values',
+          'ldap_list',
+          'ldap_mod_add_ext',
+          'ldap_mod_add',
+          'ldap_mod_del_ext',
+          'ldap_mod_del',
+          'ldap_mod_replace_ext',
+          'ldap_mod_replace',
+          'ldap_modify_batch',
+          'ldap_modify',
+          'ldap_next_attribute',
+          'ldap_next_entry',
+          'ldap_next_reference',
+          'ldap_parse_exop',
+          'ldap_parse_reference',
+          'ldap_parse_result',
+          'ldap_read',
+          'ldap_rename_ext',
+          'ldap_rename',
+          'ldap_sasl_bind',
+          'ldap_search',
+          'ldap_set_option',
+          'ldap_set_rebind_proc',
+          'ldap_sort',
+          'ldap_start_tls',
+          'ldap_t61_to_8859',
+          'ldap_unbind'),
+ 'LZF': ('lzf_compress', 'lzf_decompress', 'lzf_optimized_for'),
+ 'Mail': ('ezmlm_hash', 'mail'),
+ 'Mailparse': ('mailparse_determine_best_xfer_encoding',
+               'mailparse_msg_create',
+               'mailparse_msg_extract_part_file',
+               'mailparse_msg_extract_part',
+               'mailparse_msg_extract_whole_part_file',
+               'mailparse_msg_free',
+               'mailparse_msg_get_part_data',
+               'mailparse_msg_get_part',
+               'mailparse_msg_get_structure',
+               'mailparse_msg_parse_file',
+               'mailparse_msg_parse',
+               'mailparse_rfc822_parse_addresses',
+               'mailparse_stream_encode',
+               'mailparse_uudecode_all'),
+ 'Math': ('abs',
+          'acos',
+          'acosh',
+          'asin',
+          'asinh',
+          'atan2',
+          'atan',
+          'atanh',
+          'base_convert',
+          'bindec',
+          'ceil',
+          'cos',
+          'cosh',
+          'decbin',
+          'dechex',
+          'decoct',
+          'deg2rad',
+          'exp',
+          'expm1',
+          'fdiv',
+          'floor',
+          'fmod',
+          'getrandmax',
+          'hexdec',
+          'hypot',
+          'intdiv',
+          'is_finite',
+          'is_infinite',
+          'is_nan',
+          'lcg_value',
+          'log10',
+          'log1p',
+          'log',
+          'max',
+          'min',
+          'mt_getrandmax',
+          'mt_rand',
+          'mt_srand',
+          'octdec',
+          'pi',
+          'pow',
+          'rad2deg',
+          'rand',
+          'round',
+          'sin',
+          'sinh',
+          'sqrt',
+          'srand',
+          'tan',
+          'tanh'),
+ 'Mcrypt': ('mcrypt_create_iv',
+            'mcrypt_decrypt',
+            'mcrypt_enc_get_algorithms_name',
+            'mcrypt_enc_get_block_size',
+            'mcrypt_enc_get_iv_size',
+            'mcrypt_enc_get_key_size',
+            'mcrypt_enc_get_modes_name',
+            'mcrypt_enc_get_supported_key_sizes',
+            'mcrypt_enc_is_block_algorithm_mode',
+            'mcrypt_enc_is_block_algorithm',
+            'mcrypt_enc_is_block_mode',
+            'mcrypt_enc_self_test',
+            'mcrypt_encrypt',
+            'mcrypt_generic_deinit',
+            'mcrypt_generic_init',
+            'mcrypt_generic',
+            'mcrypt_get_block_size',
+            'mcrypt_get_cipher_name',
+            'mcrypt_get_iv_size',
+            'mcrypt_get_key_size',
+            'mcrypt_list_algorithms',
+            'mcrypt_list_modes',
+            'mcrypt_module_close',
+            'mcrypt_module_get_algo_block_size',
+            'mcrypt_module_get_algo_key_size',
+            'mcrypt_module_get_supported_key_sizes',
+            'mcrypt_module_is_block_algorithm_mode',
+            'mcrypt_module_is_block_algorithm',
+            'mcrypt_module_is_block_mode',
+            'mcrypt_module_open',
+            'mcrypt_module_self_test',
+            'mdecrypt_generic'),
+ 'Memcache': ('memcache_debug',),
+ 'Mhash': ('mhash_count',
+           'mhash_get_block_size',
+           'mhash_get_hash_name',
+           'mhash_keygen_s2k',
+           'mhash'),
+ 'Misc.': ('connection_aborted',
+           'connection_status',
+           'constant',
+           'define',
+           'defined',
+           'die',
+           'eval',
+           'exit',
+           'get_browser',
+           '__halt_compiler',
+           'highlight_file',
+           'highlight_string',
+           'hrtime',
+           'ignore_user_abort',
+           'pack',
+           'php_strip_whitespace',
+           'sapi_windows_cp_conv',
+           'sapi_windows_cp_get',
+           'sapi_windows_cp_is_utf8',
+           'sapi_windows_cp_set',
+           'sapi_windows_generate_ctrl_event',
+           'sapi_windows_set_ctrl_handler',
+           'sapi_windows_vt100_support',
+           'show_source',
+           'sleep',
+           'sys_getloadavg',
+           'time_nanosleep',
+           'time_sleep_until',
+           'uniqid',
+           'unpack',
+           'usleep'),
+ 'Multibyte String': ('mb_check_encoding',
+                      'mb_chr',
+                      'mb_convert_case',
+                      'mb_convert_encoding',
+                      'mb_convert_kana',
+                      'mb_convert_variables',
+                      'mb_decode_mimeheader',
+                      'mb_decode_numericentity',
+                      'mb_detect_encoding',
+                      'mb_detect_order',
+                      'mb_encode_mimeheader',
+                      'mb_encode_numericentity',
+                      'mb_encoding_aliases',
+                      'mb_ereg_match',
+                      'mb_ereg_replace_callback',
+                      'mb_ereg_replace',
+                      'mb_ereg_search_getpos',
+                      'mb_ereg_search_getregs',
+                      'mb_ereg_search_init',
+                      'mb_ereg_search_pos',
+                      'mb_ereg_search_regs',
+                      'mb_ereg_search_setpos',
+                      'mb_ereg_search',
+                      'mb_ereg',
+                      'mb_eregi_replace',
+                      'mb_eregi',
+                      'mb_get_info',
+                      'mb_http_input',
+                      'mb_http_output',
+                      'mb_internal_encoding',
+                      'mb_language',
+                      'mb_list_encodings',
+                      'mb_ord',
+                      'mb_output_handler',
+                      'mb_parse_str',
+                      'mb_preferred_mime_name',
+                      'mb_regex_encoding',
+                      'mb_regex_set_options',
+                      'mb_scrub',
+                      'mb_send_mail',
+                      'mb_split',
+                      'mb_str_split',
+                      'mb_strcut',
+                      'mb_strimwidth',
+                      'mb_stripos',
+                      'mb_stristr',
+                      'mb_strlen',
+                      'mb_strpos',
+                      'mb_strrchr',
+                      'mb_strrichr',
+                      'mb_strripos',
+                      'mb_strrpos',
+                      'mb_strstr',
+                      'mb_strtolower',
+                      'mb_strtoupper',
+                      'mb_strwidth',
+                      'mb_substitute_character',
+                      'mb_substr_count',
+                      'mb_substr'),
+ 'MySQL': ('mysql_affected_rows',
+           'mysql_client_encoding',
+           'mysql_close',
+           'mysql_connect',
+           'mysql_create_db',
+           'mysql_data_seek',
+           'mysql_db_name',
+           'mysql_db_query',
+           'mysql_drop_db',
+           'mysql_errno',
+           'mysql_error',
+           'mysql_escape_string',
+           'mysql_fetch_array',
+           'mysql_fetch_assoc',
+           'mysql_fetch_field',
+           'mysql_fetch_lengths',
+           'mysql_fetch_object',
+           'mysql_fetch_row',
+           'mysql_field_flags',
+           'mysql_field_len',
+           'mysql_field_name',
+           'mysql_field_seek',
+           'mysql_field_table',
+           'mysql_field_type',
+           'mysql_free_result',
+           'mysql_get_client_info',
+           'mysql_get_host_info',
+           'mysql_get_proto_info',
+           'mysql_get_server_info',
+           'mysql_info',
+           'mysql_insert_id',
+           'mysql_list_dbs',
+           'mysql_list_fields',
+           'mysql_list_processes',
+           'mysql_list_tables',
+           'mysql_num_fields',
+           'mysql_num_rows',
+           'mysql_pconnect',
+           'mysql_ping',
+           'mysql_query',
+           'mysql_real_escape_string',
+           'mysql_result',
+           'mysql_select_db',
+           'mysql_set_charset',
+           'mysql_stat',
+           'mysql_tablename',
+           'mysql_thread_id',
+           'mysql_unbuffered_query'),
+ 'Mysql_xdevapi': ('expression', 'getSession'),
+ 'Network': ('checkdnsrr',
+             'closelog',
+             'dns_check_record',
+             'dns_get_mx',
+             'dns_get_record',
+             'fsockopen',
+             'gethostbyaddr',
+             'gethostbyname',
+             'gethostbynamel',
+             'gethostname',
+             'getmxrr',
+             'getprotobyname',
+             'getprotobynumber',
+             'getservbyname',
+             'getservbyport',
+             'header_register_callback',
+             'header_remove',
+             'header',
+             'headers_list',
+             'headers_sent',
+             'http_response_code',
+             'inet_ntop',
+             'inet_pton',
+             'ip2long',
+             'long2ip',
+             'net_get_interfaces',
+             'openlog',
+             'pfsockopen',
+             'setcookie',
+             'setrawcookie',
+             'socket_get_status',
+             'socket_set_blocking',
+             'socket_set_timeout',
+             'syslog'),
+ 'OAuth': ('oauth_get_sbs', 'oauth_urlencode'),
+ 'OCI8': ('oci_bind_array_by_name',
+          'oci_bind_by_name',
+          'oci_cancel',
+          'oci_client_version',
+          'oci_close',
+          'oci_commit',
+          'oci_connect',
+          'oci_define_by_name',
+          'oci_error',
+          'oci_execute',
+          'oci_fetch_all',
+          'oci_fetch_array',
+          'oci_fetch_assoc',
+          'oci_fetch_object',
+          'oci_fetch_row',
+          'oci_fetch',
+          'oci_field_is_null',
+          'oci_field_name',
+          'oci_field_precision',
+          'oci_field_scale',
+          'oci_field_size',
+          'oci_field_type_raw',
+          'oci_field_type',
+          'oci_free_descriptor',
+          'oci_free_statement',
+          'oci_get_implicit_resultset',
+          'oci_lob_copy',
+          'oci_lob_is_equal',
+          'oci_new_collection',
+          'oci_new_connect',
+          'oci_new_cursor',
+          'oci_new_descriptor',
+          'oci_num_fields',
+          'oci_num_rows',
+          'oci_parse',
+          'oci_password_change',
+          'oci_pconnect',
+          'oci_register_taf_callback',
+          'oci_result',
+          'oci_rollback',
+          'oci_server_version',
+          'oci_set_action',
+          'oci_set_call_timeout',
+          'oci_set_client_identifier',
+          'oci_set_client_info',
+          'oci_set_db_operation',
+          'oci_set_edition',
+          'oci_set_module_name',
+          'oci_set_prefetch_lob',
+          'oci_set_prefetch',
+          'oci_statement_type',
+          'oci_unregister_taf_callback'),
+ 'ODBC': ('odbc_autocommit',
+          'odbc_binmode',
+          'odbc_close_all',
+          'odbc_close',
+          'odbc_columnprivileges',
+          'odbc_columns',
+          'odbc_commit',
+          'odbc_connect',
+          'odbc_cursor',
+          'odbc_data_source',
+          'odbc_do',
+          'odbc_error',
+          'odbc_errormsg',
+          'odbc_exec',
+          'odbc_execute',
+          'odbc_fetch_array',
+          'odbc_fetch_into',
+          'odbc_fetch_object',
+          'odbc_fetch_row',
+          'odbc_field_len',
+          'odbc_field_name',
+          'odbc_field_num',
+          'odbc_field_precision',
+          'odbc_field_scale',
+          'odbc_field_type',
+          'odbc_foreignkeys',
+          'odbc_free_result',
+          'odbc_gettypeinfo',
+          'odbc_longreadlen',
+          'odbc_next_result',
+          'odbc_num_fields',
+          'odbc_num_rows',
+          'odbc_pconnect',
+          'odbc_prepare',
+          'odbc_primarykeys',
+          'odbc_procedurecolumns',
+          'odbc_procedures',
+          'odbc_result_all',
+          'odbc_result',
+          'odbc_rollback',
+          'odbc_setoption',
+          'odbc_specialcolumns',
+          'odbc_statistics',
+          'odbc_tableprivileges',
+          'odbc_tables'),
+ 'OPcache': ('opcache_compile_file',
+             'opcache_get_configuration',
+             'opcache_get_status',
+             'opcache_invalidate',
+             'opcache_is_script_cached',
+             'opcache_reset'),
+ 'OpenAL': ('openal_buffer_create',
+            'openal_buffer_data',
+            'openal_buffer_destroy',
+            'openal_buffer_get',
+            'openal_buffer_loadwav',
+            'openal_context_create',
+            'openal_context_current',
+            'openal_context_destroy',
+            'openal_context_process',
+            'openal_context_suspend',
+            'openal_device_close',
+            'openal_device_open',
+            'openal_listener_get',
+            'openal_listener_set',
+            'openal_source_create',
+            'openal_source_destroy',
+            'openal_source_get',
+            'openal_source_pause',
+            'openal_source_play',
+            'openal_source_rewind',
+            'openal_source_set',
+            'openal_source_stop',
+            'openal_stream'),
+ 'OpenSSL': ('openssl_cipher_iv_length',
+             'openssl_cms_decrypt',
+             'openssl_cms_encrypt',
+             'openssl_cms_read',
+             'openssl_cms_sign',
+             'openssl_cms_verify',
+             'openssl_csr_export_to_file',
+             'openssl_csr_export',
+             'openssl_csr_get_public_key',
+             'openssl_csr_get_subject',
+             'openssl_csr_new',
+             'openssl_csr_sign',
+             'openssl_decrypt',
+             'openssl_dh_compute_key',
+             'openssl_digest',
+             'openssl_encrypt',
+             'openssl_error_string',
+             'openssl_free_key',
+             'openssl_get_cert_locations',
+             'openssl_get_cipher_methods',
+             'openssl_get_curve_names',
+             'openssl_get_md_methods',
+             'openssl_get_privatekey',
+             'openssl_get_publickey',
+             'openssl_open',
+             'openssl_pbkdf2',
+             'openssl_pkcs12_export_to_file',
+             'openssl_pkcs12_export',
+             'openssl_pkcs12_read',
+             'openssl_pkcs7_decrypt',
+             'openssl_pkcs7_encrypt',
+             'openssl_pkcs7_read',
+             'openssl_pkcs7_sign',
+             'openssl_pkcs7_verify',
+             'openssl_pkey_derive',
+             'openssl_pkey_export_to_file',
+             'openssl_pkey_export',
+             'openssl_pkey_free',
+             'openssl_pkey_get_details',
+             'openssl_pkey_get_private',
+             'openssl_pkey_get_public',
+             'openssl_pkey_new',
+             'openssl_private_decrypt',
+             'openssl_private_encrypt',
+             'openssl_public_decrypt',
+             'openssl_public_encrypt',
+             'openssl_random_pseudo_bytes',
+             'openssl_seal',
+             'openssl_sign',
+             'openssl_spki_export_challenge',
+             'openssl_spki_export',
+             'openssl_spki_new',
+             'openssl_spki_verify',
+             'openssl_verify',
+             'openssl_x509_check_private_key',
+             'openssl_x509_checkpurpose',
+             'openssl_x509_export_to_file',
+             'openssl_x509_export',
+             'openssl_x509_fingerprint',
+             'openssl_x509_free',
+             'openssl_x509_parse',
+             'openssl_x509_read',
+             'openssl_x509_verify'),
+ 'Output Control': ('flush',
+                    'ob_clean',
+                    'ob_end_clean',
+                    'ob_end_flush',
+                    'ob_flush',
+                    'ob_get_clean',
+                    'ob_get_contents',
+                    'ob_get_flush',
+                    'ob_get_length',
+                    'ob_get_level',
+                    'ob_get_status',
+                    'ob_gzhandler',
+                    'ob_implicit_flush',
+                    'ob_list_handlers',
+                    'ob_start',
+                    'output_add_rewrite_var',
+                    'output_reset_rewrite_vars'),
+ 'PCNTL': ('pcntl_alarm',
+           'pcntl_async_signals',
+           'pcntl_errno',
+           'pcntl_exec',
+           'pcntl_fork',
+           'pcntl_get_last_error',
+           'pcntl_getpriority',
+           'pcntl_setpriority',
+           'pcntl_signal_dispatch',
+           'pcntl_signal_get_handler',
+           'pcntl_signal',
+           'pcntl_sigprocmask',
+           'pcntl_sigtimedwait',
+           'pcntl_sigwaitinfo',
+           'pcntl_strerror',
+           'pcntl_wait',
+           'pcntl_waitpid',
+           'pcntl_wexitstatus',
+           'pcntl_wifexited',
+           'pcntl_wifsignaled',
+           'pcntl_wifstopped',
+           'pcntl_wstopsig',
+           'pcntl_wtermsig'),
+ 'PCRE': ('preg_filter',
+          'preg_grep',
+          'preg_last_error_msg',
+          'preg_last_error',
+          'preg_match_all',
+          'preg_match',
+          'preg_quote',
+          'preg_replace_callback_array',
+          'preg_replace_callback',
+          'preg_replace',
+          'preg_split'),
+ 'PHP Options/Info': ('assert_options',
+                      'assert',
+                      'cli_get_process_title',
+                      'cli_set_process_title',
+                      'dl',
+                      'extension_loaded',
+                      'gc_collect_cycles',
+                      'gc_disable',
+                      'gc_enable',
+                      'gc_enabled',
+                      'gc_mem_caches',
+                      'gc_status',
+                      'get_cfg_var',
+                      'get_current_user',
+                      'get_defined_constants',
+                      'get_extension_funcs',
+                      'get_include_path',
+                      'get_included_files',
+                      'get_loaded_extensions',
+                      'get_magic_quotes_gpc',
+                      'get_magic_quotes_runtime',
+                      'get_required_files',
+                      'get_resources',
+                      'getenv',
+                      'getlastmod',
+                      'getmygid',
+                      'getmyinode',
+                      'getmypid',
+                      'getmyuid',
+                      'getopt',
+                      'getrusage',
+                      'ini_alter',
+                      'ini_get_all',
+                      'ini_get',
+                      'ini_restore',
+                      'ini_set',
+                      'memory_get_peak_usage',
+                      'memory_get_usage',
+                      'php_ini_loaded_file',
+                      'php_ini_scanned_files',
+                      'php_sapi_name',
+                      'php_uname',
+                      'phpcredits',
+                      'phpinfo',
+                      'phpversion',
+                      'putenv',
+                      'restore_include_path',
+                      'set_include_path',
+                      'set_time_limit',
+                      'sys_get_temp_dir',
+                      'version_compare',
+                      'zend_thread_id',
+                      'zend_version'),
+ 'POSIX': ('posix_access',
+           'posix_ctermid',
+           'posix_errno',
+           'posix_get_last_error',
+           'posix_getcwd',
+           'posix_getegid',
+           'posix_geteuid',
+           'posix_getgid',
+           'posix_getgrgid',
+           'posix_getgrnam',
+           'posix_getgroups',
+           'posix_getlogin',
+           'posix_getpgid',
+           'posix_getpgrp',
+           'posix_getpid',
+           'posix_getppid',
+           'posix_getpwnam',
+           'posix_getpwuid',
+           'posix_getrlimit',
+           'posix_getsid',
+           'posix_getuid',
+           'posix_initgroups',
+           'posix_isatty',
+           'posix_kill',
+           'posix_mkfifo',
+           'posix_mknod',
+           'posix_setegid',
+           'posix_seteuid',
+           'posix_setgid',
+           'posix_setpgid',
+           'posix_setrlimit',
+           'posix_setsid',
+           'posix_setuid',
+           'posix_strerror',
+           'posix_times',
+           'posix_ttyname',
+           'posix_uname'),
+ 'PS': ('ps_add_bookmark',
+        'ps_add_launchlink',
+        'ps_add_locallink',
+        'ps_add_note',
+        'ps_add_pdflink',
+        'ps_add_weblink',
+        'ps_arc',
+        'ps_arcn',
+        'ps_begin_page',
+        'ps_begin_pattern',
+        'ps_begin_template',
+        'ps_circle',
+        'ps_clip',
+        'ps_close_image',
+        'ps_close',
+        'ps_closepath_stroke',
+        'ps_closepath',
+        'ps_continue_text',
+        'ps_curveto',
+        'ps_delete',
+        'ps_end_page',
+        'ps_end_pattern',
+        'ps_end_template',
+        'ps_fill_stroke',
+        'ps_fill',
+        'ps_findfont',
+        'ps_get_buffer',
+        'ps_get_parameter',
+        'ps_get_value',
+        'ps_hyphenate',
+        'ps_include_file',
+        'ps_lineto',
+        'ps_makespotcolor',
+        'ps_moveto',
+        'ps_new',
+        'ps_open_file',
+        'ps_open_image_file',
+        'ps_open_image',
+        'ps_open_memory_image',
+        'ps_place_image',
+        'ps_rect',
+        'ps_restore',
+        'ps_rotate',
+        'ps_save',
+        'ps_scale',
+        'ps_set_border_color',
+        'ps_set_border_dash',
+        'ps_set_border_style',
+        'ps_set_info',
+        'ps_set_parameter',
+        'ps_set_text_pos',
+        'ps_set_value',
+        'ps_setcolor',
+        'ps_setdash',
+        'ps_setflat',
+        'ps_setfont',
+        'ps_setgray',
+        'ps_setlinecap',
+        'ps_setlinejoin',
+        'ps_setlinewidth',
+        'ps_setmiterlimit',
+        'ps_setoverprintmode',
+        'ps_setpolydash',
+        'ps_shading_pattern',
+        'ps_shading',
+        'ps_shfill',
+        'ps_show_boxed',
+        'ps_show_xy2',
+        'ps_show_xy',
+        'ps_show2',
+        'ps_show',
+        'ps_string_geometry',
+        'ps_stringwidth',
+        'ps_stroke',
+        'ps_symbol_name',
+        'ps_symbol_width',
+        'ps_symbol',
+        'ps_translate'),
+ 'Password Hashing': ('password_algos',
+                      'password_get_info',
+                      'password_hash',
+                      'password_needs_rehash',
+                      'password_verify'),
+ 'PostgreSQL': ('pg_affected_rows',
+                'pg_cancel_query',
+                'pg_client_encoding',
+                'pg_close',
+                'pg_connect_poll',
+                'pg_connect',
+                'pg_connection_busy',
+                'pg_connection_reset',
+                'pg_connection_status',
+                'pg_consume_input',
+                'pg_convert',
+                'pg_copy_from',
+                'pg_copy_to',
+                'pg_dbname',
+                'pg_delete',
+                'pg_end_copy',
+                'pg_escape_bytea',
+                'pg_escape_identifier',
+                'pg_escape_literal',
+                'pg_escape_string',
+                'pg_execute',
+                'pg_fetch_all_columns',
+                'pg_fetch_all',
+                'pg_fetch_array',
+                'pg_fetch_assoc',
+                'pg_fetch_object',
+                'pg_fetch_result',
+                'pg_fetch_row',
+                'pg_field_is_null',
+                'pg_field_name',
+                'pg_field_num',
+                'pg_field_prtlen',
+                'pg_field_size',
+                'pg_field_table',
+                'pg_field_type_oid',
+                'pg_field_type',
+                'pg_flush',
+                'pg_free_result',
+                'pg_get_notify',
+                'pg_get_pid',
+                'pg_get_result',
+                'pg_host',
+                'pg_insert',
+                'pg_last_error',
+                'pg_last_notice',
+                'pg_last_oid',
+                'pg_lo_close',
+                'pg_lo_create',
+                'pg_lo_export',
+                'pg_lo_import',
+                'pg_lo_open',
+                'pg_lo_read_all',
+                'pg_lo_read',
+                'pg_lo_seek',
+                'pg_lo_tell',
+                'pg_lo_truncate',
+                'pg_lo_unlink',
+                'pg_lo_write',
+                'pg_meta_data',
+                'pg_num_fields',
+                'pg_num_rows',
+                'pg_options',
+                'pg_parameter_status',
+                'pg_pconnect',
+                'pg_ping',
+                'pg_port',
+                'pg_prepare',
+                'pg_put_line',
+                'pg_query_params',
+                'pg_query',
+                'pg_result_error_field',
+                'pg_result_error',
+                'pg_result_seek',
+                'pg_result_status',
+                'pg_select',
+                'pg_send_execute',
+                'pg_send_prepare',
+                'pg_send_query_params',
+                'pg_send_query',
+                'pg_set_client_encoding',
+                'pg_set_error_verbosity',
+                'pg_socket',
+                'pg_trace',
+                'pg_transaction_status',
+                'pg_tty',
+                'pg_unescape_bytea',
+                'pg_untrace',
+                'pg_update',
+                'pg_version'),
+ 'Program execution': ('escapeshellarg',
+                       'escapeshellcmd',
+                       'exec',
+                       'passthru',
+                       'proc_close',
+                       'proc_get_status',
+                       'proc_nice',
+                       'proc_open',
+                       'proc_terminate',
+                       'shell_exec',
+                       'system'),
+ 'Pspell': ('pspell_add_to_personal',
+            'pspell_add_to_session',
+            'pspell_check',
+            'pspell_clear_session',
+            'pspell_config_create',
+            'pspell_config_data_dir',
+            'pspell_config_dict_dir',
+            'pspell_config_ignore',
+            'pspell_config_mode',
+            'pspell_config_personal',
+            'pspell_config_repl',
+            'pspell_config_runtogether',
+            'pspell_config_save_repl',
+            'pspell_new_config',
+            'pspell_new_personal',
+            'pspell_new',
+            'pspell_save_wordlist',
+            'pspell_store_replacement',
+            'pspell_suggest'),
+ 'RRD': ('rrd_create',
+         'rrd_error',
+         'rrd_fetch',
+         'rrd_first',
+         'rrd_graph',
+         'rrd_info',
+         'rrd_last',
+         'rrd_lastupdate',
+         'rrd_restore',
+         'rrd_tune',
+         'rrd_update',
+         'rrd_version',
+         'rrd_xport',
+         'rrdc_disconnect'),
+ 'Radius': ('radius_acct_open',
+            'radius_add_server',
+            'radius_auth_open',
+            'radius_close',
+            'radius_config',
+            'radius_create_request',
+            'radius_cvt_addr',
+            'radius_cvt_int',
+            'radius_cvt_string',
+            'radius_demangle_mppe_key',
+            'radius_demangle',
+            'radius_get_attr',
+            'radius_get_tagged_attr_data',
+            'radius_get_tagged_attr_tag',
+            'radius_get_vendor_attr',
+            'radius_put_addr',
+            'radius_put_attr',
+            'radius_put_int',
+            'radius_put_string',
+            'radius_put_vendor_addr',
+            'radius_put_vendor_attr',
+            'radius_put_vendor_int',
+            'radius_put_vendor_string',
+            'radius_request_authenticator',
+            'radius_salt_encrypt_attr',
+            'radius_send_request',
+            'radius_server_secret',
+            'radius_strerror'),
+ 'Rar': ('rar_wrapper_cache_stats',),
+ 'Readline': ('readline_add_history',
+              'readline_callback_handler_install',
+              'readline_callback_handler_remove',
+              'readline_callback_read_char',
+              'readline_clear_history',
+              'readline_completion_function',
+              'readline_info',
+              'readline_list_history',
+              'readline_on_new_line',
+              'readline_read_history',
+              'readline_redisplay',
+              'readline_write_history',
+              'readline'),
+ 'Recode': ('recode_file', 'recode_string', 'recode'),
+ 'RpmInfo': ('rpmaddtag', 'rpmdbinfo', 'rpmdbsearch', 'rpminfo', 'rpmvercmp'),
+ 'SNMP': ('snmp_get_quick_print',
+          'snmp_get_valueretrieval',
+          'snmp_read_mib',
+          'snmp_set_enum_print',
+          'snmp_set_oid_numeric_print',
+          'snmp_set_oid_output_format',
+          'snmp_set_quick_print',
+          'snmp_set_valueretrieval',
+          'snmp2_get',
+          'snmp2_getnext',
+          'snmp2_real_walk',
+          'snmp2_set',
+          'snmp2_walk',
+          'snmp3_get',
+          'snmp3_getnext',
+          'snmp3_real_walk',
+          'snmp3_set',
+          'snmp3_walk',
+          'snmpget',
+          'snmpgetnext',
+          'snmprealwalk',
+          'snmpset',
+          'snmpwalk',
+          'snmpwalkoid'),
+ 'SOAP': ('is_soap_fault', 'use_soap_error_handler'),
+ 'SPL': ('class_implements',
+         'class_parents',
+         'class_uses',
+         'iterator_apply',
+         'iterator_count',
+         'iterator_to_array',
+         'spl_autoload_call',
+         'spl_autoload_extensions',
+         'spl_autoload_functions',
+         'spl_autoload_register',
+         'spl_autoload_unregister',
+         'spl_autoload',
+         'spl_classes',
+         'spl_object_hash',
+         'spl_object_id'),
+ 'SQLSRV': ('sqlsrv_begin_transaction',
+            'sqlsrv_cancel',
+            'sqlsrv_client_info',
+            'sqlsrv_close',
+            'sqlsrv_commit',
+            'sqlsrv_configure',
+            'sqlsrv_connect',
+            'sqlsrv_errors',
+            'sqlsrv_execute',
+            'sqlsrv_fetch_array',
+            'sqlsrv_fetch_object',
+            'sqlsrv_fetch',
+            'sqlsrv_field_metadata',
+            'sqlsrv_free_stmt',
+            'sqlsrv_get_config',
+            'sqlsrv_get_field',
+            'sqlsrv_has_rows',
+            'sqlsrv_next_result',
+            'sqlsrv_num_fields',
+            'sqlsrv_num_rows',
+            'sqlsrv_prepare',
+            'sqlsrv_query',
+            'sqlsrv_rollback',
+            'sqlsrv_rows_affected',
+            'sqlsrv_send_stream_data',
+            'sqlsrv_server_info'),
+ 'SSH2': ('ssh2_auth_agent',
+          'ssh2_auth_hostbased_file',
+          'ssh2_auth_none',
+          'ssh2_auth_password',
+          'ssh2_auth_pubkey_file',
+          'ssh2_connect',
+          'ssh2_disconnect',
+          'ssh2_exec',
+          'ssh2_fetch_stream',
+          'ssh2_fingerprint',
+          'ssh2_forward_accept',
+          'ssh2_forward_listen',
+          'ssh2_methods_negotiated',
+          'ssh2_poll',
+          'ssh2_publickey_add',
+          'ssh2_publickey_init',
+          'ssh2_publickey_list',
+          'ssh2_publickey_remove',
+          'ssh2_scp_recv',
+          'ssh2_scp_send',
+          'ssh2_send_eof',
+          'ssh2_sftp_chmod',
+          'ssh2_sftp_lstat',
+          'ssh2_sftp_mkdir',
+          'ssh2_sftp_readlink',
+          'ssh2_sftp_realpath',
+          'ssh2_sftp_rename',
+          'ssh2_sftp_rmdir',
+          'ssh2_sftp_stat',
+          'ssh2_sftp_symlink',
+          'ssh2_sftp_unlink',
+          'ssh2_sftp',
+          'ssh2_shell',
+          'ssh2_tunnel'),
+ 'SVN': ('svn_add',
+         'svn_auth_get_parameter',
+         'svn_auth_set_parameter',
+         'svn_blame',
+         'svn_cat',
+         'svn_checkout',
+         'svn_cleanup',
+         'svn_client_version',
+         'svn_commit',
+         'svn_delete',
+         'svn_diff',
+         'svn_export',
+         'svn_fs_abort_txn',
+         'svn_fs_apply_text',
+         'svn_fs_begin_txn2',
+         'svn_fs_change_node_prop',
+         'svn_fs_check_path',
+         'svn_fs_contents_changed',
+         'svn_fs_copy',
+         'svn_fs_delete',
+         'svn_fs_dir_entries',
+         'svn_fs_file_contents',
+         'svn_fs_file_length',
+         'svn_fs_is_dir',
+         'svn_fs_is_file',
+         'svn_fs_make_dir',
+         'svn_fs_make_file',
+         'svn_fs_node_created_rev',
+         'svn_fs_node_prop',
+         'svn_fs_props_changed',
+         'svn_fs_revision_prop',
+         'svn_fs_revision_root',
+         'svn_fs_txn_root',
+         'svn_fs_youngest_rev',
+         'svn_import',
+         'svn_log',
+         'svn_ls',
+         'svn_mkdir',
+         'svn_repos_create',
+         'svn_repos_fs_begin_txn_for_commit',
+         'svn_repos_fs_commit_txn',
+         'svn_repos_fs',
+         'svn_repos_hotcopy',
+         'svn_repos_open',
+         'svn_repos_recover',
+         'svn_revert',
+         'svn_status',
+         'svn_update'),
+ 'Scoutapm': ('scoutapm_get_calls', 'scoutapm_list_instrumented_functions'),
+ 'Seaslog': ('seaslog_get_author', 'seaslog_get_version'),
+ 'Semaphore': ('ftok',
+               'msg_get_queue',
+               'msg_queue_exists',
+               'msg_receive',
+               'msg_remove_queue',
+               'msg_send',
+               'msg_set_queue',
+               'msg_stat_queue',
+               'sem_acquire',
+               'sem_get',
+               'sem_release',
+               'sem_remove',
+               'shm_attach',
+               'shm_detach',
+               'shm_get_var',
+               'shm_has_var',
+               'shm_put_var',
+               'shm_remove_var',
+               'shm_remove'),
+ 'Session': ('session_abort',
+             'session_cache_expire',
+             'session_cache_limiter',
+             'session_commit',
+             'session_create_id',
+             'session_decode',
+             'session_destroy',
+             'session_encode',
+             'session_gc',
+             'session_get_cookie_params',
+             'session_id',
+             'session_module_name',
+             'session_name',
+             'session_regenerate_id',
+             'session_register_shutdown',
+             'session_reset',
+             'session_save_path',
+             'session_set_cookie_params',
+             'session_set_save_handler',
+             'session_start',
+             'session_status',
+             'session_unset',
+             'session_write_close'),
+ 'Shared Memory': ('shmop_close',
+                   'shmop_delete',
+                   'shmop_open',
+                   'shmop_read',
+                   'shmop_size',
+                   'shmop_write'),
+ 'SimpleXML': ('simplexml_import_dom',
+               'simplexml_load_file',
+               'simplexml_load_string'),
+ 'Socket': ('socket_accept',
+            'socket_addrinfo_bind',
+            'socket_addrinfo_connect',
+            'socket_addrinfo_explain',
+            'socket_addrinfo_lookup',
+            'socket_bind',
+            'socket_clear_error',
+            'socket_close',
+            'socket_cmsg_space',
+            'socket_connect',
+            'socket_create_listen',
+            'socket_create_pair',
+            'socket_create',
+            'socket_export_stream',
+            'socket_get_option',
+            'socket_getopt',
+            'socket_getpeername',
+            'socket_getsockname',
+            'socket_import_stream',
+            'socket_last_error',
+            'socket_listen',
+            'socket_read',
+            'socket_recv',
+            'socket_recvfrom',
+            'socket_recvmsg',
+            'socket_select',
+            'socket_send',
+            'socket_sendmsg',
+            'socket_sendto',
+            'socket_set_block',
+            'socket_set_nonblock',
+            'socket_set_option',
+            'socket_setopt',
+            'socket_shutdown',
+            'socket_strerror',
+            'socket_write',
+            'socket_wsaprotocol_info_export',
+            'socket_wsaprotocol_info_import',
+            'socket_wsaprotocol_info_release'),
+ 'Sodium': ('sodium_add',
+            'sodium_base642bin',
+            'sodium_bin2base64',
+            'sodium_bin2hex',
+            'sodium_compare',
+            'sodium_crypto_aead_aes256gcm_decrypt',
+            'sodium_crypto_aead_aes256gcm_encrypt',
+            'sodium_crypto_aead_aes256gcm_is_available',
+            'sodium_crypto_aead_aes256gcm_keygen',
+            'sodium_crypto_aead_chacha20poly1305_decrypt',
+            'sodium_crypto_aead_chacha20poly1305_encrypt',
+            'sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
+            'sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
+            'sodium_crypto_aead_chacha20poly1305_ietf_keygen',
+            'sodium_crypto_aead_chacha20poly1305_keygen',
+            'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
+            'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
+            'sodium_crypto_aead_xchacha20poly1305_ietf_keygen',
+            'sodium_crypto_auth_keygen',
+            'sodium_crypto_auth_verify',
+            'sodium_crypto_auth',
+            'sodium_crypto_box_keypair_from_secretkey_and_publickey',
+            'sodium_crypto_box_keypair',
+            'sodium_crypto_box_open',
+            'sodium_crypto_box_publickey_from_secretkey',
+            'sodium_crypto_box_publickey',
+            'sodium_crypto_box_seal_open',
+            'sodium_crypto_box_seal',
+            'sodium_crypto_box_secretkey',
+            'sodium_crypto_box_seed_keypair',
+            'sodium_crypto_box',
+            'sodium_crypto_generichash_final',
+            'sodium_crypto_generichash_init',
+            'sodium_crypto_generichash_keygen',
+            'sodium_crypto_generichash_update',
+            'sodium_crypto_generichash',
+            'sodium_crypto_kdf_derive_from_key',
+            'sodium_crypto_kdf_keygen',
+            'sodium_crypto_kx_client_session_keys',
+            'sodium_crypto_kx_keypair',
+            'sodium_crypto_kx_publickey',
+            'sodium_crypto_kx_secretkey',
+            'sodium_crypto_kx_seed_keypair',
+            'sodium_crypto_kx_server_session_keys',
+            'sodium_crypto_pwhash_scryptsalsa208sha256_str_verify',
+            'sodium_crypto_pwhash_scryptsalsa208sha256_str',
+            'sodium_crypto_pwhash_scryptsalsa208sha256',
+            'sodium_crypto_pwhash_str_needs_rehash',
+            'sodium_crypto_pwhash_str_verify',
+            'sodium_crypto_pwhash_str',
+            'sodium_crypto_pwhash',
+            'sodium_crypto_scalarmult_base',
+            'sodium_crypto_scalarmult',
+            'sodium_crypto_secretbox_keygen',
+            'sodium_crypto_secretbox_open',
+            'sodium_crypto_secretbox',
+            'sodium_crypto_secretstream_xchacha20poly1305_init_pull',
+            'sodium_crypto_secretstream_xchacha20poly1305_init_push',
+            'sodium_crypto_secretstream_xchacha20poly1305_keygen',
+            'sodium_crypto_secretstream_xchacha20poly1305_pull',
+            'sodium_crypto_secretstream_xchacha20poly1305_push',
+            'sodium_crypto_secretstream_xchacha20poly1305_rekey',
+            'sodium_crypto_shorthash_keygen',
+            'sodium_crypto_shorthash',
+            'sodium_crypto_sign_detached',
+            'sodium_crypto_sign_ed25519_pk_to_curve25519',
+            'sodium_crypto_sign_ed25519_sk_to_curve25519',
+            'sodium_crypto_sign_keypair_from_secretkey_and_publickey',
+            'sodium_crypto_sign_keypair',
+            'sodium_crypto_sign_open',
+            'sodium_crypto_sign_publickey_from_secretkey',
+            'sodium_crypto_sign_publickey',
+            'sodium_crypto_sign_secretkey',
+            'sodium_crypto_sign_seed_keypair',
+            'sodium_crypto_sign_verify_detached',
+            'sodium_crypto_sign',
+            'sodium_crypto_stream_keygen',
+            'sodium_crypto_stream_xor',
+            'sodium_crypto_stream',
+            'sodium_hex2bin',
+            'sodium_increment',
+            'sodium_memcmp',
+            'sodium_memzero',
+            'sodium_pad',
+            'sodium_unpad'),
+ 'Solr': ('solr_get_version',),
+ 'Stomp': ('stomp_connect_error', 'stomp_version'),
+ 'Stream': ('stream_bucket_append',
+            'stream_bucket_make_writeable',
+            'stream_bucket_new',
+            'stream_bucket_prepend',
+            'stream_context_create',
+            'stream_context_get_default',
+            'stream_context_get_options',
+            'stream_context_get_params',
+            'stream_context_set_default',
+            'stream_context_set_option',
+            'stream_context_set_params',
+            'stream_copy_to_stream',
+            'stream_filter_append',
+            'stream_filter_prepend',
+            'stream_filter_register',
+            'stream_filter_remove',
+            'stream_get_contents',
+            'stream_get_filters',
+            'stream_get_line',
+            'stream_get_meta_data',
+            'stream_get_transports',
+            'stream_get_wrappers',
+            'stream_is_local',
+            'stream_isatty',
+            'stream_notification_callback',
+            'stream_register_wrapper',
+            'stream_resolve_include_path',
+            'stream_select',
+            'stream_set_blocking',
+            'stream_set_chunk_size',
+            'stream_set_read_buffer',
+            'stream_set_timeout',
+            'stream_set_write_buffer',
+            'stream_socket_accept',
+            'stream_socket_client',
+            'stream_socket_enable_crypto',
+            'stream_socket_get_name',
+            'stream_socket_pair',
+            'stream_socket_recvfrom',
+            'stream_socket_sendto',
+            'stream_socket_server',
+            'stream_socket_shutdown',
+            'stream_supports_lock',
+            'stream_wrapper_register',
+            'stream_wrapper_restore',
+            'stream_wrapper_unregister'),
+ 'String': ('addcslashes',
+            'addslashes',
+            'bin2hex',
+            'chop',
+            'chr',
+            'chunk_split',
+            'convert_cyr_string',
+            'convert_uudecode',
+            'convert_uuencode',
+            'count_chars',
+            'crc32',
+            'crypt',
+            'echo',
+            'explode',
+            'fprintf',
+            'get_html_translation_table',
+            'hebrev',
+            'hebrevc',
+            'hex2bin',
+            'html_entity_decode',
+            'htmlentities',
+            'htmlspecialchars_decode',
+            'htmlspecialchars',
+            'implode',
+            'join',
+            'lcfirst',
+            'levenshtein',
+            'localeconv',
+            'ltrim',
+            'md5_file',
+            'md5',
+            'metaphone',
+            'money_format',
+            'nl_langinfo',
+            'nl2br',
+            'number_format',
+            'ord',
+            'parse_str',
+            'print',
+            'printf',
+            'quoted_printable_decode',
+            'quoted_printable_encode',
+            'quotemeta',
+            'rtrim',
+            'setlocale',
+            'sha1_file',
+            'sha1',
+            'similar_text',
+            'soundex',
+            'sprintf',
+            'sscanf',
+            'str_contains',
+            'str_ends_with',
+            'str_getcsv',
+            'str_ireplace',
+            'str_pad',
+            'str_repeat',
+            'str_replace',
+            'str_rot13',
+            'str_shuffle',
+            'str_split',
+            'str_starts_with',
+            'str_word_count',
+            'strcasecmp',
+            'strchr',
+            'strcmp',
+            'strcoll',
+            'strcspn',
+            'strip_tags',
+            'stripcslashes',
+            'stripos',
+            'stripslashes',
+            'stristr',
+            'strlen',
+            'strnatcasecmp',
+            'strnatcmp',
+            'strncasecmp',
+            'strncmp',
+            'strpbrk',
+            'strpos',
+            'strrchr',
+            'strrev',
+            'strripos',
+            'strrpos',
+            'strspn',
+            'strstr',
+            'strtok',
+            'strtolower',
+            'strtoupper',
+            'strtr',
+            'substr_compare',
+            'substr_count',
+            'substr_replace',
+            'substr',
+            'trim',
+            'ucfirst',
+            'ucwords',
+            'vfprintf',
+            'vprintf',
+            'vsprintf',
+            'wordwrap'),
+ 'Swoole': ('swoole_async_dns_lookup',
+            'swoole_async_read',
+            'swoole_async_readfile',
+            'swoole_async_set',
+            'swoole_async_write',
+            'swoole_async_writefile',
+            'swoole_clear_error',
+            'swoole_client_select',
+            'swoole_cpu_num',
+            'swoole_errno',
+            'swoole_error_log',
+            'swoole_event_add',
+            'swoole_event_defer',
+            'swoole_event_del',
+            'swoole_event_exit',
+            'swoole_event_set',
+            'swoole_event_wait',
+            'swoole_event_write',
+            'swoole_get_local_ip',
+            'swoole_last_error',
+            'swoole_load_module',
+            'swoole_select',
+            'swoole_set_process_name',
+            'swoole_strerror',
+            'swoole_timer_after',
+            'swoole_timer_exists',
+            'swoole_timer_tick',
+            'swoole_version'),
+ 'TCP': ('tcpwrap_check',),
+ 'Taint': ('is_tainted', 'taint', 'untaint'),
+ 'Tidy': ('ob_tidyhandler',
+          'tidy_access_count',
+          'tidy_config_count',
+          'tidy_error_count',
+          'tidy_get_output',
+          'tidy_warning_count'),
+ 'Tokenizer': ('token_get_all', 'token_name'),
+ 'Trader': ('trader_acos',
+            'trader_ad',
+            'trader_add',
+            'trader_adosc',
+            'trader_adx',
+            'trader_adxr',
+            'trader_apo',
+            'trader_aroon',
+            'trader_aroonosc',
+            'trader_asin',
+            'trader_atan',
+            'trader_atr',
+            'trader_avgprice',
+            'trader_bbands',
+            'trader_beta',
+            'trader_bop',
+            'trader_cci',
+            'trader_cdl2crows',
+            'trader_cdl3blackcrows',
+            'trader_cdl3inside',
+            'trader_cdl3linestrike',
+            'trader_cdl3outside',
+            'trader_cdl3starsinsouth',
+            'trader_cdl3whitesoldiers',
+            'trader_cdlabandonedbaby',
+            'trader_cdladvanceblock',
+            'trader_cdlbelthold',
+            'trader_cdlbreakaway',
+            'trader_cdlclosingmarubozu',
+            'trader_cdlconcealbabyswall',
+            'trader_cdlcounterattack',
+            'trader_cdldarkcloudcover',
+            'trader_cdldoji',
+            'trader_cdldojistar',
+            'trader_cdldragonflydoji',
+            'trader_cdlengulfing',
+            'trader_cdleveningdojistar',
+            'trader_cdleveningstar',
+            'trader_cdlgapsidesidewhite',
+            'trader_cdlgravestonedoji',
+            'trader_cdlhammer',
+            'trader_cdlhangingman',
+            'trader_cdlharami',
+            'trader_cdlharamicross',
+            'trader_cdlhighwave',
+            'trader_cdlhikkake',
+            'trader_cdlhikkakemod',
+            'trader_cdlhomingpigeon',
+            'trader_cdlidentical3crows',
+            'trader_cdlinneck',
+            'trader_cdlinvertedhammer',
+            'trader_cdlkicking',
+            'trader_cdlkickingbylength',
+            'trader_cdlladderbottom',
+            'trader_cdllongleggeddoji',
+            'trader_cdllongline',
+            'trader_cdlmarubozu',
+            'trader_cdlmatchinglow',
+            'trader_cdlmathold',
+            'trader_cdlmorningdojistar',
+            'trader_cdlmorningstar',
+            'trader_cdlonneck',
+            'trader_cdlpiercing',
+            'trader_cdlrickshawman',
+            'trader_cdlrisefall3methods',
+            'trader_cdlseparatinglines',
+            'trader_cdlshootingstar',
+            'trader_cdlshortline',
+            'trader_cdlspinningtop',
+            'trader_cdlstalledpattern',
+            'trader_cdlsticksandwich',
+            'trader_cdltakuri',
+            'trader_cdltasukigap',
+            'trader_cdlthrusting',
+            'trader_cdltristar',
+            'trader_cdlunique3river',
+            'trader_cdlupsidegap2crows',
+            'trader_cdlxsidegap3methods',
+            'trader_ceil',
+            'trader_cmo',
+            'trader_correl',
+            'trader_cos',
+            'trader_cosh',
+            'trader_dema',
+            'trader_div',
+            'trader_dx',
+            'trader_ema',
+            'trader_errno',
+            'trader_exp',
+            'trader_floor',
+            'trader_get_compat',
+            'trader_get_unstable_period',
+            'trader_ht_dcperiod',
+            'trader_ht_dcphase',
+            'trader_ht_phasor',
+            'trader_ht_sine',
+            'trader_ht_trendline',
+            'trader_ht_trendmode',
+            'trader_kama',
+            'trader_linearreg_angle',
+            'trader_linearreg_intercept',
+            'trader_linearreg_slope',
+            'trader_linearreg',
+            'trader_ln',
+            'trader_log10',
+            'trader_ma',
+            'trader_macd',
+            'trader_macdext',
+            'trader_macdfix',
+            'trader_mama',
+            'trader_mavp',
+            'trader_max',
+            'trader_maxindex',
+            'trader_medprice',
+            'trader_mfi',
+            'trader_midpoint',
+            'trader_midprice',
+            'trader_min',
+            'trader_minindex',
+            'trader_minmax',
+            'trader_minmaxindex',
+            'trader_minus_di',
+            'trader_minus_dm',
+            'trader_mom',
+            'trader_mult',
+            'trader_natr',
+            'trader_obv',
+            'trader_plus_di',
+            'trader_plus_dm',
+            'trader_ppo',
+            'trader_roc',
+            'trader_rocp',
+            'trader_rocr100',
+            'trader_rocr',
+            'trader_rsi',
+            'trader_sar',
+            'trader_sarext',
+            'trader_set_compat',
+            'trader_set_unstable_period',
+            'trader_sin',
+            'trader_sinh',
+            'trader_sma',
+            'trader_sqrt',
+            'trader_stddev',
+            'trader_stoch',
+            'trader_stochf',
+            'trader_stochrsi',
+            'trader_sub',
+            'trader_sum',
+            'trader_t3',
+            'trader_tan',
+            'trader_tanh',
+            'trader_tema',
+            'trader_trange',
+            'trader_trima',
+            'trader_trix',
+            'trader_tsf',
+            'trader_typprice',
+            'trader_ultosc',
+            'trader_var',
+            'trader_wclprice',
+            'trader_willr',
+            'trader_wma'),
+ 'URL': ('base64_decode',
+         'base64_encode',
+         'get_headers',
+         'get_meta_tags',
+         'http_build_query',
+         'parse_url',
+         'rawurldecode',
+         'rawurlencode',
+         'urldecode',
+         'urlencode'),
+ 'Uopz': ('uopz_add_function',
+          'uopz_allow_exit',
+          'uopz_backup',
+          'uopz_compose',
+          'uopz_copy',
+          'uopz_del_function',
+          'uopz_delete',
+          'uopz_extend',
+          'uopz_flags',
+          'uopz_function',
+          'uopz_get_exit_status',
+          'uopz_get_hook',
+          'uopz_get_mock',
+          'uopz_get_property',
+          'uopz_get_return',
+          'uopz_get_static',
+          'uopz_implement',
+          'uopz_overload',
+          'uopz_redefine',
+          'uopz_rename',
+          'uopz_restore',
+          'uopz_set_hook',
+          'uopz_set_mock',
+          'uopz_set_property',
+          'uopz_set_return',
+          'uopz_set_static',
+          'uopz_undefine',
+          'uopz_unset_hook',
+          'uopz_unset_mock',
+          'uopz_unset_return'),
+ 'Variable handling': ('boolval',
+                       'debug_zval_dump',
+                       'doubleval',
+                       'empty',
+                       'floatval',
+                       'get_debug_type',
+                       'get_defined_vars',
+                       'get_resource_id',
+                       'get_resource_type',
+                       'gettype',
+                       'intval',
+                       'is_array',
+                       'is_bool',
+                       'is_callable',
+                       'is_countable',
+                       'is_double',
+                       'is_float',
+                       'is_int',
+                       'is_integer',
+                       'is_iterable',
+                       'is_long',
+                       'is_null',
+                       'is_numeric',
+                       'is_object',
+                       'is_real',
+                       'is_resource',
+                       'is_scalar',
+                       'is_string',
+                       'isset',
+                       'print_r',
+                       'serialize',
+                       'settype',
+                       'strval',
+                       'unserialize',
+                       'unset',
+                       'var_dump',
+                       'var_export'),
+ 'WDDX': ('wddx_add_vars',
+          'wddx_deserialize',
+          'wddx_packet_end',
+          'wddx_packet_start',
+          'wddx_serialize_value',
+          'wddx_serialize_vars'),
+ 'WinCache': ('wincache_fcache_fileinfo',
+              'wincache_fcache_meminfo',
+              'wincache_lock',
+              'wincache_ocache_fileinfo',
+              'wincache_ocache_meminfo',
+              'wincache_refresh_if_changed',
+              'wincache_rplist_fileinfo',
+              'wincache_rplist_meminfo',
+              'wincache_scache_info',
+              'wincache_scache_meminfo',
+              'wincache_ucache_add',
+              'wincache_ucache_cas',
+              'wincache_ucache_clear',
+              'wincache_ucache_dec',
+              'wincache_ucache_delete',
+              'wincache_ucache_exists',
+              'wincache_ucache_get',
+              'wincache_ucache_inc',
+              'wincache_ucache_info',
+              'wincache_ucache_meminfo',
+              'wincache_ucache_set',
+              'wincache_unlock'),
+ 'XML Parser': ('utf8_decode',
+                'utf8_encode',
+                'xml_error_string',
+                'xml_get_current_byte_index',
+                'xml_get_current_column_number',
+                'xml_get_current_line_number',
+                'xml_get_error_code',
+                'xml_parse_into_struct',
+                'xml_parse',
+                'xml_parser_create_ns',
+                'xml_parser_create',
+                'xml_parser_free',
+                'xml_parser_get_option',
+                'xml_parser_set_option',
+                'xml_set_character_data_handler',
+                'xml_set_default_handler',
+                'xml_set_element_handler',
+                'xml_set_end_namespace_decl_handler',
+                'xml_set_external_entity_ref_handler',
+                'xml_set_notation_decl_handler',
+                'xml_set_object',
+                'xml_set_processing_instruction_handler',
+                'xml_set_start_namespace_decl_handler',
+                'xml_set_unparsed_entity_decl_handler'),
+ 'XML-RPC': ('xmlrpc_decode_request',
+             'xmlrpc_decode',
+             'xmlrpc_encode_request',
+             'xmlrpc_encode',
+             'xmlrpc_get_type',
+             'xmlrpc_is_fault',
+             'xmlrpc_parse_method_descriptions',
+             'xmlrpc_server_add_introspection_data',
+             'xmlrpc_server_call_method',
+             'xmlrpc_server_create',
+             'xmlrpc_server_destroy',
+             'xmlrpc_server_register_introspection_callback',
+             'xmlrpc_server_register_method',
+             'xmlrpc_set_type'),
+ 'Xhprof': ('xhprof_disable',
+            'xhprof_enable',
+            'xhprof_sample_disable',
+            'xhprof_sample_enable'),
+ 'YAZ': ('yaz_addinfo',
+         'yaz_ccl_conf',
+         'yaz_ccl_parse',
+         'yaz_close',
+         'yaz_connect',
+         'yaz_database',
+         'yaz_element',
+         'yaz_errno',
+         'yaz_error',
+         'yaz_es_result',
+         'yaz_es',
+         'yaz_get_option',
+         'yaz_hits',
+         'yaz_itemorder',
+         'yaz_present',
+         'yaz_range',
+         'yaz_record',
+         'yaz_scan_result',
+         'yaz_scan',
+         'yaz_schema',
+         'yaz_search',
+         'yaz_set_option',
+         'yaz_sort',
+         'yaz_syntax',
+         'yaz_wait'),
+ 'Yaml': ('yaml_emit_file',
+          'yaml_emit',
+          'yaml_parse_file',
+          'yaml_parse_url',
+          'yaml_parse'),
+ 'Zip': ('zip_close',
+         'zip_entry_close',
+         'zip_entry_compressedsize',
+         'zip_entry_compressionmethod',
+         'zip_entry_filesize',
+         'zip_entry_name',
+         'zip_entry_open',
+         'zip_entry_read',
+         'zip_open',
+         'zip_read'),
+ 'Zlib': ('deflate_add',
+          'deflate_init',
+          'gzclose',
+          'gzcompress',
+          'gzdecode',
+          'gzdeflate',
+          'gzencode',
+          'gzeof',
+          'gzfile',
+          'gzgetc',
+          'gzgets',
+          'gzgetss',
+          'gzinflate',
+          'gzopen',
+          'gzpassthru',
+          'gzputs',
+          'gzread',
+          'gzrewind',
+          'gzseek',
+          'gztell',
+          'gzuncompress',
+          'gzwrite',
+          'inflate_add',
+          'inflate_get_read_len',
+          'inflate_get_status',
+          'inflate_init',
+          'readgzfile',
+          'zlib_decode',
+          'zlib_encode',
+          'zlib_get_coding_type'),
+ 'ZooKeeper': ('zookeeper_dispatch',),
+ 'cURL': ('curl_close',
+          'curl_copy_handle',
+          'curl_errno',
+          'curl_error',
+          'curl_escape',
+          'curl_exec',
+          'curl_file_create',
+          'curl_getinfo',
+          'curl_init',
+          'curl_multi_add_handle',
+          'curl_multi_close',
+          'curl_multi_errno',
+          'curl_multi_exec',
+          'curl_multi_getcontent',
+          'curl_multi_info_read',
+          'curl_multi_init',
+          'curl_multi_remove_handle',
+          'curl_multi_select',
+          'curl_multi_setopt',
+          'curl_multi_strerror',
+          'curl_pause',
+          'curl_reset',
+          'curl_setopt_array',
+          'curl_setopt',
+          'curl_share_close',
+          'curl_share_errno',
+          'curl_share_init',
+          'curl_share_setopt',
+          'curl_share_strerror',
+          'curl_strerror',
+          'curl_unescape',
+          'curl_version'),
+ 'dBase': ('dbase_add_record',
+           'dbase_close',
+           'dbase_create',
+           'dbase_delete_record',
+           'dbase_get_header_info',
+           'dbase_get_record_with_names',
+           'dbase_get_record',
+           'dbase_numfields',
+           'dbase_numrecords',
+           'dbase_open',
+           'dbase_pack',
+           'dbase_replace_record'),
+ 'iconv': ('iconv_get_encoding',
+           'iconv_mime_decode_headers',
+           'iconv_mime_decode',
+           'iconv_mime_encode',
+           'iconv_set_encoding',
+           'iconv_strlen',
+           'iconv_strpos',
+           'iconv_strrpos',
+           'iconv_substr',
+           'iconv',
+           'ob_iconv_handler'),
+ 'intl': ('intl_error_name',
+          'intl_get_error_code',
+          'intl_get_error_message',
+          'intl_is_failure'),
+ 'libxml': ('libxml_clear_errors',
+            'libxml_disable_entity_loader',
+            'libxml_get_errors',
+            'libxml_get_last_error',
+            'libxml_set_external_entity_loader',
+            'libxml_set_streams_context',
+            'libxml_use_internal_errors'),
+ 'mqseries': ('mqseries_back',
+              'mqseries_begin',
+              'mqseries_close',
+              'mqseries_cmit',
+              'mqseries_conn',
+              'mqseries_connx',
+              'mqseries_disc',
+              'mqseries_get',
+              'mqseries_inq',
+              'mqseries_open',
+              'mqseries_put1',
+              'mqseries_put',
+              'mqseries_set',
+              'mqseries_strerror'),
+ 'phpdbg': ('phpdbg_break_file',
+            'phpdbg_break_function',
+            'phpdbg_break_method',
+            'phpdbg_break_next',
+            'phpdbg_clear',
+            'phpdbg_color',
+            'phpdbg_end_oplog',
+            'phpdbg_exec',
+            'phpdbg_get_executable',
+            'phpdbg_prompt',
+            'phpdbg_start_oplog'),
+ 'runkit7': ('runkit7_constant_add',
+             'runkit7_constant_redefine',
+             'runkit7_constant_remove',
+             'runkit7_function_add',
+             'runkit7_function_copy',
+             'runkit7_function_redefine',
+             'runkit7_function_remove',
+             'runkit7_function_rename',
+             'runkit7_import',
+             'runkit7_method_add',
+             'runkit7_method_copy',
+             'runkit7_method_redefine',
+             'runkit7_method_remove',
+             'runkit7_method_rename',
+             'runkit7_object_id',
+             'runkit7_superglobals',
+             'runkit7_zval_inspect'),
+ 'ssdeep': ('ssdeep_fuzzy_compare',
+            'ssdeep_fuzzy_hash_filename',
+            'ssdeep_fuzzy_hash'),
+ 'var_representation': ('var_representation',),
+ 'win32service': ('win32_continue_service',
+                  'win32_create_service',
+                  'win32_delete_service',
+                  'win32_get_last_control_message',
+                  'win32_pause_service',
+                  'win32_query_service_status',
+                  'win32_send_custom_control',
+                  'win32_set_service_exit_code',
+                  'win32_set_service_exit_mode',
+                  'win32_set_service_status',
+                  'win32_start_service_ctrl_dispatcher',
+                  'win32_start_service',
+                  'win32_stop_service'),
+ 'xattr': ('xattr_get',
+           'xattr_list',
+           'xattr_remove',
+           'xattr_set',
+           'xattr_supported'),
+ 'xdiff': ('xdiff_file_bdiff_size',
+           'xdiff_file_bdiff',
+           'xdiff_file_bpatch',
+           'xdiff_file_diff_binary',
+           'xdiff_file_diff',
+           'xdiff_file_merge3',
+           'xdiff_file_patch_binary',
+           'xdiff_file_patch',
+           'xdiff_file_rabdiff',
+           'xdiff_string_bdiff_size',
+           'xdiff_string_bdiff',
+           'xdiff_string_bpatch',
+           'xdiff_string_diff_binary',
+           'xdiff_string_diff',
+           'xdiff_string_merge3',
+           'xdiff_string_patch_binary',
+           'xdiff_string_patch',
+           'xdiff_string_rabdiff')}
+
+if __name__ == '__main__':  # pragma: no cover
+    import glob
+    import os
+    import pprint
+    import re
+    import shutil
+    import tarfile
+    from urllib.request import urlretrieve
+
+    PHP_MANUAL_URL     = 'http://us3.php.net/distributions/manual/php_manual_en.tar.gz'
+    PHP_MANUAL_DIR     = './php-chunked-xhtml/'
+    PHP_REFERENCE_GLOB = 'ref.*'
+    PHP_FUNCTION_RE    = r'<a href="function\..*?\.html">(.*?)</a>'
+    PHP_MODULE_RE      = '<title>(.*?) Functions</title>'
+
+    def get_php_functions():
+        function_re = re.compile(PHP_FUNCTION_RE)
+        module_re   = re.compile(PHP_MODULE_RE)
+        modules     = {}
+
+        for file in get_php_references():
+            module = ''
+            with open(file, encoding='utf-8') as f:
+                for line in f:
+                    if not module:
+                        search = module_re.search(line)
+                        if search:
+                            module = search.group(1)
+                            modules[module] = []
+
+                    elif 'href="function.' in line:
+                        for match in function_re.finditer(line):
+                            fn = match.group(1)
+                            if '»' not in fn and '«' not in fn and \
+                               '::' not in fn and '\\' not in fn and \
+                               fn not in modules[module]:
+                                modules[module].append(fn)
+
+            if module:
+                # These are dummy manual pages, not actual functions
+                if module == 'Filesystem':
+                    modules[module].remove('delete')
+
+                if not modules[module]:
+                    del modules[module]
+
+        for key in modules:
+            modules[key] = tuple(modules[key])
+        return modules
+
+    def get_php_references():
+        download = urlretrieve(PHP_MANUAL_URL)
+        with tarfile.open(download[0]) as tar:
+            tar.extractall()
+        yield from glob.glob(f"{PHP_MANUAL_DIR}{PHP_REFERENCE_GLOB}")
+        os.remove(download[0])
+
+    def regenerate(filename, modules):
+        with open(filename, encoding='utf-8') as fp:
+            content = fp.read()
+
+        header = content[:content.find('MODULES = {')]
+        footer = content[content.find("if __name__ == '__main__':"):]
+
+        with open(filename, 'w', encoding='utf-8') as fp:
+            fp.write(header)
+            fp.write(f'MODULES = {pprint.pformat(modules)}\n\n')
+            fp.write(footer)
+
+    def run():
+        print('>> Downloading Function Index')
+        modules = get_php_functions()
+        total = sum(len(v) for v in modules.values())
+        print('%d functions found' % total)
+        regenerate(__file__, modules)
+        shutil.rmtree(PHP_MANUAL_DIR)
+
+    run()
diff --git a/.venv/Lib/site-packages/pygments/lexers/_postgres_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_postgres_builtins.py
new file mode 100644 (file)
index 0000000..80bc728
--- /dev/null
@@ -0,0 +1,739 @@
+"""
+    pygments.lexers._postgres_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Self-updating data files for PostgreSQL lexer.
+
+    Run with `python -I` to update itself.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# Autogenerated: please edit them if you like wasting your time.
+
+KEYWORDS = (
+    'ABORT',
+    'ABSOLUTE',
+    'ACCESS',
+    'ACTION',
+    'ADD',
+    'ADMIN',
+    'AFTER',
+    'AGGREGATE',
+    'ALL',
+    'ALSO',
+    'ALTER',
+    'ALWAYS',
+    'ANALYSE',
+    'ANALYZE',
+    'AND',
+    'ANY',
+    'ARRAY',
+    'AS',
+    'ASC',
+    'ASENSITIVE',
+    'ASSERTION',
+    'ASSIGNMENT',
+    'ASYMMETRIC',
+    'AT',
+    'ATOMIC',
+    'ATTACH',
+    'ATTRIBUTE',
+    'AUTHORIZATION',
+    'BACKWARD',
+    'BEFORE',
+    'BEGIN',
+    'BETWEEN',
+    'BIGINT',
+    'BINARY',
+    'BIT',
+    'BOOLEAN',
+    'BOTH',
+    'BREADTH',
+    'BY',
+    'CACHE',
+    'CALL',
+    'CALLED',
+    'CASCADE',
+    'CASCADED',
+    'CASE',
+    'CAST',
+    'CATALOG',
+    'CHAIN',
+    'CHAR',
+    'CHARACTER',
+    'CHARACTERISTICS',
+    'CHECK',
+    'CHECKPOINT',
+    'CLASS',
+    'CLOSE',
+    'CLUSTER',
+    'COALESCE',
+    'COLLATE',
+    'COLLATION',
+    'COLUMN',
+    'COLUMNS',
+    'COMMENT',
+    'COMMENTS',
+    'COMMIT',
+    'COMMITTED',
+    'COMPRESSION',
+    'CONCURRENTLY',
+    'CONFIGURATION',
+    'CONFLICT',
+    'CONNECTION',
+    'CONSTRAINT',
+    'CONSTRAINTS',
+    'CONTENT',
+    'CONTINUE',
+    'CONVERSION',
+    'COPY',
+    'COST',
+    'CREATE',
+    'CROSS',
+    'CSV',
+    'CUBE',
+    'CURRENT',
+    'CURRENT_CATALOG',
+    'CURRENT_DATE',
+    'CURRENT_ROLE',
+    'CURRENT_SCHEMA',
+    'CURRENT_TIME',
+    'CURRENT_TIMESTAMP',
+    'CURRENT_USER',
+    'CURSOR',
+    'CYCLE',
+    'DATA',
+    'DATABASE',
+    'DAY',
+    'DEALLOCATE',
+    'DEC',
+    'DECIMAL',
+    'DECLARE',
+    'DEFAULT',
+    'DEFAULTS',
+    'DEFERRABLE',
+    'DEFERRED',
+    'DEFINER',
+    'DELETE',
+    'DELIMITER',
+    'DELIMITERS',
+    'DEPENDS',
+    'DEPTH',
+    'DESC',
+    'DETACH',
+    'DICTIONARY',
+    'DISABLE',
+    'DISCARD',
+    'DISTINCT',
+    'DO',
+    'DOCUMENT',
+    'DOMAIN',
+    'DOUBLE',
+    'DROP',
+    'EACH',
+    'ELSE',
+    'ENABLE',
+    'ENCODING',
+    'ENCRYPTED',
+    'END',
+    'ENUM',
+    'ESCAPE',
+    'EVENT',
+    'EXCEPT',
+    'EXCLUDE',
+    'EXCLUDING',
+    'EXCLUSIVE',
+    'EXECUTE',
+    'EXISTS',
+    'EXPLAIN',
+    'EXPRESSION',
+    'EXTENSION',
+    'EXTERNAL',
+    'EXTRACT',
+    'FALSE',
+    'FAMILY',
+    'FETCH',
+    'FILTER',
+    'FINALIZE',
+    'FIRST',
+    'FLOAT',
+    'FOLLOWING',
+    'FOR',
+    'FORCE',
+    'FOREIGN',
+    'FORWARD',
+    'FREEZE',
+    'FROM',
+    'FULL',
+    'FUNCTION',
+    'FUNCTIONS',
+    'GENERATED',
+    'GLOBAL',
+    'GRANT',
+    'GRANTED',
+    'GREATEST',
+    'GROUP',
+    'GROUPING',
+    'GROUPS',
+    'HANDLER',
+    'HAVING',
+    'HEADER',
+    'HOLD',
+    'HOUR',
+    'IDENTITY',
+    'IF',
+    'ILIKE',
+    'IMMEDIATE',
+    'IMMUTABLE',
+    'IMPLICIT',
+    'IMPORT',
+    'IN',
+    'INCLUDE',
+    'INCLUDING',
+    'INCREMENT',
+    'INDEX',
+    'INDEXES',
+    'INHERIT',
+    'INHERITS',
+    'INITIALLY',
+    'INLINE',
+    'INNER',
+    'INOUT',
+    'INPUT',
+    'INSENSITIVE',
+    'INSERT',
+    'INSTEAD',
+    'INT',
+    'INTEGER',
+    'INTERSECT',
+    'INTERVAL',
+    'INTO',
+    'INVOKER',
+    'IS',
+    'ISNULL',
+    'ISOLATION',
+    'JOIN',
+    'KEY',
+    'LABEL',
+    'LANGUAGE',
+    'LARGE',
+    'LAST',
+    'LATERAL',
+    'LEADING',
+    'LEAKPROOF',
+    'LEAST',
+    'LEFT',
+    'LEVEL',
+    'LIKE',
+    'LIMIT',
+    'LISTEN',
+    'LOAD',
+    'LOCAL',
+    'LOCALTIME',
+    'LOCALTIMESTAMP',
+    'LOCATION',
+    'LOCK',
+    'LOCKED',
+    'LOGGED',
+    'MAPPING',
+    'MATCH',
+    'MATERIALIZED',
+    'MAXVALUE',
+    'METHOD',
+    'MINUTE',
+    'MINVALUE',
+    'MODE',
+    'MONTH',
+    'MOVE',
+    'NAME',
+    'NAMES',
+    'NATIONAL',
+    'NATURAL',
+    'NCHAR',
+    'NEW',
+    'NEXT',
+    'NFC',
+    'NFD',
+    'NFKC',
+    'NFKD',
+    'NO',
+    'NONE',
+    'NORMALIZE',
+    'NORMALIZED',
+    'NOT',
+    'NOTHING',
+    'NOTIFY',
+    'NOTNULL',
+    'NOWAIT',
+    'NULL',
+    'NULLIF',
+    'NULLS',
+    'NUMERIC',
+    'OBJECT',
+    'OF',
+    'OFF',
+    'OFFSET',
+    'OIDS',
+    'OLD',
+    'ON',
+    'ONLY',
+    'OPERATOR',
+    'OPTION',
+    'OPTIONS',
+    'OR',
+    'ORDER',
+    'ORDINALITY',
+    'OTHERS',
+    'OUT',
+    'OUTER',
+    'OVER',
+    'OVERLAPS',
+    'OVERLAY',
+    'OVERRIDING',
+    'OWNED',
+    'OWNER',
+    'PARALLEL',
+    'PARSER',
+    'PARTIAL',
+    'PARTITION',
+    'PASSING',
+    'PASSWORD',
+    'PLACING',
+    'PLANS',
+    'POLICY',
+    'POSITION',
+    'PRECEDING',
+    'PRECISION',
+    'PREPARE',
+    'PREPARED',
+    'PRESERVE',
+    'PRIMARY',
+    'PRIOR',
+    'PRIVILEGES',
+    'PROCEDURAL',
+    'PROCEDURE',
+    'PROCEDURES',
+    'PROGRAM',
+    'PUBLICATION',
+    'QUOTE',
+    'RANGE',
+    'READ',
+    'REAL',
+    'REASSIGN',
+    'RECHECK',
+    'RECURSIVE',
+    'REF',
+    'REFERENCES',
+    'REFERENCING',
+    'REFRESH',
+    'REINDEX',
+    'RELATIVE',
+    'RELEASE',
+    'RENAME',
+    'REPEATABLE',
+    'REPLACE',
+    'REPLICA',
+    'RESET',
+    'RESTART',
+    'RESTRICT',
+    'RETURN',
+    'RETURNING',
+    'RETURNS',
+    'REVOKE',
+    'RIGHT',
+    'ROLE',
+    'ROLLBACK',
+    'ROLLUP',
+    'ROUTINE',
+    'ROUTINES',
+    'ROW',
+    'ROWS',
+    'RULE',
+    'SAVEPOINT',
+    'SCHEMA',
+    'SCHEMAS',
+    'SCROLL',
+    'SEARCH',
+    'SECOND',
+    'SECURITY',
+    'SELECT',
+    'SEQUENCE',
+    'SEQUENCES',
+    'SERIALIZABLE',
+    'SERVER',
+    'SESSION',
+    'SESSION_USER',
+    'SET',
+    'SETOF',
+    'SETS',
+    'SHARE',
+    'SHOW',
+    'SIMILAR',
+    'SIMPLE',
+    'SKIP',
+    'SMALLINT',
+    'SNAPSHOT',
+    'SOME',
+    'SQL',
+    'STABLE',
+    'STANDALONE',
+    'START',
+    'STATEMENT',
+    'STATISTICS',
+    'STDIN',
+    'STDOUT',
+    'STORAGE',
+    'STORED',
+    'STRICT',
+    'STRIP',
+    'SUBSCRIPTION',
+    'SUBSTRING',
+    'SUPPORT',
+    'SYMMETRIC',
+    'SYSID',
+    'SYSTEM',
+    'TABLE',
+    'TABLES',
+    'TABLESAMPLE',
+    'TABLESPACE',
+    'TEMP',
+    'TEMPLATE',
+    'TEMPORARY',
+    'TEXT',
+    'THEN',
+    'TIES',
+    'TIME',
+    'TIMESTAMP',
+    'TO',
+    'TRAILING',
+    'TRANSACTION',
+    'TRANSFORM',
+    'TREAT',
+    'TRIGGER',
+    'TRIM',
+    'TRUE',
+    'TRUNCATE',
+    'TRUSTED',
+    'TYPE',
+    'TYPES',
+    'UESCAPE',
+    'UNBOUNDED',
+    'UNCOMMITTED',
+    'UNENCRYPTED',
+    'UNION',
+    'UNIQUE',
+    'UNKNOWN',
+    'UNLISTEN',
+    'UNLOGGED',
+    'UNTIL',
+    'UPDATE',
+    'USER',
+    'USING',
+    'VACUUM',
+    'VALID',
+    'VALIDATE',
+    'VALIDATOR',
+    'VALUE',
+    'VALUES',
+    'VARCHAR',
+    'VARIADIC',
+    'VARYING',
+    'VERBOSE',
+    'VERSION',
+    'VIEW',
+    'VIEWS',
+    'VOLATILE',
+    'WHEN',
+    'WHERE',
+    'WHITESPACE',
+    'WINDOW',
+    'WITH',
+    'WITHIN',
+    'WITHOUT',
+    'WORK',
+    'WRAPPER',
+    'WRITE',
+    'XML',
+    'XMLATTRIBUTES',
+    'XMLCONCAT',
+    'XMLELEMENT',
+    'XMLEXISTS',
+    'XMLFOREST',
+    'XMLNAMESPACES',
+    'XMLPARSE',
+    'XMLPI',
+    'XMLROOT',
+    'XMLSERIALIZE',
+    'XMLTABLE',
+    'YEAR',
+    'YES',
+    'ZONE',
+)
+
+DATATYPES = (
+    'bigint',
+    'bigserial',
+    'bit',
+    'bit varying',
+    'bool',
+    'boolean',
+    'box',
+    'bytea',
+    'char',
+    'character',
+    'character varying',
+    'cidr',
+    'circle',
+    'date',
+    'decimal',
+    'double precision',
+    'float4',
+    'float8',
+    'inet',
+    'int',
+    'int2',
+    'int4',
+    'int8',
+    'integer',
+    'interval',
+    'json',
+    'jsonb',
+    'line',
+    'lseg',
+    'macaddr',
+    'macaddr8',
+    'money',
+    'numeric',
+    'path',
+    'pg_lsn',
+    'pg_snapshot',
+    'point',
+    'polygon',
+    'real',
+    'serial',
+    'serial2',
+    'serial4',
+    'serial8',
+    'smallint',
+    'smallserial',
+    'text',
+    'time',
+    'timestamp',
+    'timestamptz',
+    'timetz',
+    'tsquery',
+    'tsvector',
+    'txid_snapshot',
+    'uuid',
+    'varbit',
+    'varchar',
+    'with time zone',
+    'without time zone',
+    'xml',
+)
+
+PSEUDO_TYPES = (
+    'any',
+    'anyarray',
+    'anycompatible',
+    'anycompatiblearray',
+    'anycompatiblemultirange',
+    'anycompatiblenonarray',
+    'anycompatiblerange',
+    'anyelement',
+    'anyenum',
+    'anymultirange',
+    'anynonarray',
+    'anyrange',
+    'cstring',
+    'event_trigger',
+    'fdw_handler',
+    'index_am_handler',
+    'internal',
+    'language_handler',
+    'pg_ddl_command',
+    'record',
+    'table_am_handler',
+    'trigger',
+    'tsm_handler',
+    'unknown',
+    'void',
+)
+
+# Remove 'trigger' from types
+PSEUDO_TYPES = tuple(sorted(set(PSEUDO_TYPES) - set(map(str.lower, KEYWORDS))))
+
+PLPGSQL_KEYWORDS = (
+    'ALIAS', 'CONSTANT', 'DIAGNOSTICS', 'ELSIF', 'EXCEPTION', 'EXIT',
+    'FOREACH', 'GET', 'LOOP', 'NOTICE', 'OPEN', 'PERFORM', 'QUERY', 'RAISE',
+    'RETURN', 'REVERSE', 'SQLSTATE', 'WHILE',
+)
+
+# Most of these keywords are from ExplainNode function
+# in src/backend/commands/explain.c
+
+EXPLAIN_KEYWORDS = (
+    'Aggregate',
+    'Append',
+    'Bitmap Heap Scan',
+    'Bitmap Index Scan',
+    'BitmapAnd',
+    'BitmapOr',
+    'CTE Scan',
+    'Custom Scan',
+    'Delete',
+    'Foreign Scan',
+    'Function Scan',
+    'Gather Merge',
+    'Gather',
+    'Group',
+    'GroupAggregate',
+    'Hash Join',
+    'Hash',
+    'HashAggregate',
+    'Incremental Sort',
+    'Index Only Scan',
+    'Index Scan',
+    'Insert',
+    'Limit',
+    'LockRows',
+    'Materialize',
+    'Memoize',
+    'Merge Append',
+    'Merge Join',
+    'Merge',
+    'MixedAggregate',
+    'Named Tuplestore Scan',
+    'Nested Loop',
+    'ProjectSet',
+    'Recursive Union',
+    'Result',
+    'Sample Scan',
+    'Seq Scan',
+    'SetOp',
+    'Sort',
+    'SubPlan',
+    'Subquery Scan',
+    'Table Function Scan',
+    'Tid Range Scan',
+    'Tid Scan',
+    'Unique',
+    'Update',
+    'Values Scan',
+    'WindowAgg',
+    'WorkTable Scan',
+)
+
+
+if __name__ == '__main__':  # pragma: no cover
+    import re
+    from urllib.request import urlopen
+
+    from pygments.util import format_lines
+
+    # One man's constant is another man's variable.
+    SOURCE_URL = 'https://github.com/postgres/postgres/raw/master'
+    KEYWORDS_URL = SOURCE_URL + '/src/include/parser/kwlist.h'
+    DATATYPES_URL = SOURCE_URL + '/doc/src/sgml/datatype.sgml'
+
+    def update_myself():
+        content = urlopen(DATATYPES_URL).read().decode('utf-8', errors='ignore')
+        data_file = list(content.splitlines())
+        datatypes = parse_datatypes(data_file)
+        pseudos = parse_pseudos(data_file)
+
+        content = urlopen(KEYWORDS_URL).read().decode('utf-8', errors='ignore')
+        keywords = parse_keywords(content)
+
+        update_consts(__file__, 'DATATYPES', datatypes)
+        update_consts(__file__, 'PSEUDO_TYPES', pseudos)
+        update_consts(__file__, 'KEYWORDS', keywords)
+
+    def parse_keywords(f):
+        kw = []
+        for m in re.finditer(r'PG_KEYWORD\("(.+?)"', f):
+            kw.append(m.group(1).upper())
+
+        if not kw:
+            raise ValueError('no keyword found')
+
+        kw.sort()
+        return kw
+
+    def parse_datatypes(f):
+        dt = set()
+        for line in f:
+            if '<sect1' in line:
+                break
+            if '<entry><type>' not in line:
+                continue
+
+            # Parse a string such as
+            # time [ (<replaceable>p</replaceable>) ] [ without time zone ]
+            # into types "time" and "without time zone"
+
+            # remove all the tags
+            line = re.sub("<replaceable>[^<]+</replaceable>", "", line)
+            line = re.sub("<[^>]+>", "", line)
+
+            # Drop the parts containing braces
+            for tmp in [t for tmp in line.split('[')
+                        for t in tmp.split(']') if "(" not in t]:
+                for t in tmp.split(','):
+                    t = t.strip()
+                    if not t:
+                        continue
+                    dt.add(" ".join(t.split()))
+
+        dt = list(dt)
+        dt.sort()
+        return dt
+
+    def parse_pseudos(f):
+        dt = []
+        re_start = re.compile(r'\s*<table id="datatype-pseudotypes-table">')
+        re_entry = re.compile(r'\s*<entry><type>(.+?)</type></entry>')
+        re_end = re.compile(r'\s*</table>')
+
+        f = iter(f)
+        for line in f:
+            if re_start.match(line) is not None:
+                break
+        else:
+            raise ValueError('pseudo datatypes table not found')
+
+        for line in f:
+            m = re_entry.match(line)
+            if m is not None:
+                dt.append(m.group(1))
+
+            if re_end.match(line) is not None:
+                break
+        else:
+            raise ValueError('end of pseudo datatypes table not found')
+
+        if not dt:
+            raise ValueError('pseudo datatypes not found')
+
+        dt.sort()
+        return dt
+
+    def update_consts(filename, constname, content):
+        with open(filename, encoding='utf-8') as f:
+            data = f.read()
+
+        # Line to start/end inserting
+        re_match = re.compile(rf'^{constname}\s*=\s*\($.*?^\s*\)$', re.M | re.S)
+        m = re_match.search(data)
+        if not m:
+            raise ValueError(f'Could not find existing definition for {constname}')
+
+        new_block = format_lines(constname, content)
+        data = data[:m.start()] + new_block + data[m.end():]
+
+        with open(filename, 'w', encoding='utf-8', newline='\n') as f:
+            f.write(data)
+
+    update_myself()
diff --git a/.venv/Lib/site-packages/pygments/lexers/_qlik_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_qlik_builtins.py
new file mode 100644 (file)
index 0000000..c2fe0cf
--- /dev/null
@@ -0,0 +1,666 @@
+"""
+    pygments.lexers._qlik_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Qlik builtins.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# operators
+#   see https://help.qlik.com/en-US/sense/August2021/Subsystems/Hub/Content/Sense_Hub/Scripting/Operators/operators.htm
+OPERATORS_LIST = {
+    "words": [
+        # Bit operators
+        "bitnot",
+        "bitand",
+        "bitor",
+        "bitxor",
+        # Logical operators
+        "and",
+        "or",
+        "not",
+        "xor",
+        # Relational operators
+        "precedes",
+        "follows",
+        # String operators
+        "like",
+    ],
+    "symbols": [
+        # Bit operators
+        ">>",
+        "<<",
+        # Logical operators
+        # Numeric operators
+        "+",
+        "-",
+        "/",
+        "*",
+        # Relational operators
+        "<",
+        "<=",
+        ">",
+        ">=",
+        "=",
+        "<>",
+        # String operators
+        "&",
+    ],
+}
+
+# SCRIPT STATEMENTS
+#   see https://help.qlik.com/en-US/sense/August2021/Subsystems/Hub/Content/Sense_Hub/Scripting/
+STATEMENT_LIST = [
+    # control statements
+    "for",
+    "each",
+    "in",
+    "next",
+    "do",
+    "while",
+    "until",
+    "unless",
+    "loop",
+    "return",
+    "switch",
+    "case",
+    "default",
+    "if",
+    "else",
+    "endif",
+    "then",
+    "end",
+    "exit",
+    "script",
+    "switch",
+    # prefixes
+    "Add",
+    "Buffer",
+    "Concatenate",
+    "Crosstable",
+    "First",
+    "Generic",
+    "Hierarchy",
+    "HierarchyBelongsTo",
+    "Inner",
+    "IntervalMatch",
+    "Join",
+    "Keep",
+    "Left",
+    "Mapping",
+    "Merge",
+    "NoConcatenate",
+    "Outer",
+    "Partial reload",
+    "Replace",
+    "Right",
+    "Sample",
+    "Semantic",
+    "Unless",
+    "When",
+    # regular statements
+    "Alias",  # alias ... as ...
+    "as",
+    "AutoNumber",
+    "Binary",
+    "Comment field",  # comment fields ... using ...
+    "Comment fields",  # comment field ... with ...
+    "using",
+    "with",
+    "Comment table",  # comment table ... with ...
+    "Comment tables",  # comment tables ... using ...
+    "Connect",
+    "ODBC",  # ODBC CONNECT TO ...
+    "OLEBD",  # OLEDB CONNECT TO ...
+    "CUSTOM",  # CUSTOM CONNECT TO ...
+    "LIB",  # LIB CONNECT TO ...
+    "Declare",
+    "Derive",
+    "From",
+    "explicit",
+    "implicit",
+    "Direct Query",
+    "dimension",
+    "measure",
+    "Directory",
+    "Disconnect",
+    "Drop field",
+    "Drop fields",
+    "Drop table",
+    "Drop tables",
+    "Execute",
+    "FlushLog",
+    "Force",
+    "capitalization",
+    "case upper",
+    "case lower",
+    "case mixed",
+    "Load",
+    "distinct",
+    "from",
+    "inline",
+    "resident",
+    "from_field",
+    "autogenerate",
+    "extension",
+    "where",
+    "group by",
+    "order by",
+    "asc",
+    "desc",
+    "Let",
+    "Loosen Table",
+    "Map",
+    "NullAsNull",
+    "NullAsValue",
+    "Qualify",
+    "Rem",
+    "Rename field",
+    "Rename fields",
+    "Rename table",
+    "Rename tables",
+    "Search",
+    "include",
+    "exclude",
+    "Section",
+    "access",
+    "application",
+    "Select",
+    "Set",
+    "Sleep",
+    "SQL",
+    "SQLColumns",
+    "SQLTables",
+    "SQLTypes",
+    "Star",
+    "Store",
+    "Tag",
+    "Trace",
+    "Unmap",
+    "Unqualify",
+    "Untag",
+    # Qualifiers
+    "total",
+]
+
+# Script functions
+#    see https://help.qlik.com/en-US/sense/August2021/Subsystems/Hub/Content/Sense_Hub/Scripting/functions-in-scripts-chart-expressions.htm
+SCRIPT_FUNCTIONS = [
+    # Basic aggregation functions in the data load script
+    "FirstSortedValue",
+    "Max",
+    "Min",
+    "Mode",
+    "Only",
+    "Sum",
+    # Counter aggregation functions in the data load script
+    "Count",
+    "MissingCount",
+    "NullCount",
+    "NumericCount",
+    "TextCount",
+    # Financial aggregation functions in the data load script
+    "IRR",
+    "XIRR",
+    "NPV",
+    "XNPV",
+    # Statistical aggregation functions in the data load script
+    "Avg",
+    "Correl",
+    "Fractile",
+    "FractileExc",
+    "Kurtosis",
+    "LINEST_B" "LINEST_df",
+    "LINEST_f",
+    "LINEST_m",
+    "LINEST_r2",
+    "LINEST_seb",
+    "LINEST_sem",
+    "LINEST_sey",
+    "LINEST_ssreg",
+    "Linest_ssresid",
+    "Median",
+    "Skew",
+    "Stdev",
+    "Sterr",
+    "STEYX",
+    # Statistical test functions
+    "Chi2Test_chi2",
+    "Chi2Test_df",
+    "Chi2Test_p",
+    # Two independent samples t-tests
+    "ttest_conf",
+    "ttest_df",
+    "ttest_dif",
+    "ttest_lower",
+    "ttest_sig",
+    "ttest_sterr",
+    "ttest_t",
+    "ttest_upper",
+    # Two independent weighted samples t-tests
+    "ttestw_conf",
+    "ttestw_df",
+    "ttestw_dif",
+    "ttestw_lower",
+    "ttestw_sig",
+    "ttestw_sterr",
+    "ttestw_t",
+    "ttestw_upper",
+    # One sample t-tests
+    "ttest1_conf",
+    "ttest1_df",
+    "ttest1_dif",
+    "ttest1_lower",
+    "ttest1_sig",
+    "ttest1_sterr",
+    "ttest1_t",
+    "ttest1_upper",
+    # One weighted sample t-tests
+    "ttest1w_conf",
+    "ttest1w_df",
+    "ttest1w_dif",
+    "ttest1w_lower",
+    "ttest1w_sig",
+    "ttest1w_sterr",
+    "ttest1w_t",
+    "ttest1w_upper",
+    # One column format functions
+    "ztest_conf",
+    "ztest_dif",
+    "ztest_sig",
+    "ztest_sterr",
+    "ztest_z",
+    "ztest_lower",
+    "ztest_upper",
+    # Weighted two-column format functions
+    "ztestw_conf",
+    "ztestw_dif",
+    "ztestw_lower",
+    "ztestw_sig",
+    "ztestw_sterr",
+    "ztestw_upper",
+    "ztestw_z",
+    # String aggregation functions in the data load script
+    "Concat",
+    "FirstValue",
+    "LastValue",
+    "MaxString",
+    "MinString",
+    # Synthetic dimension functions
+    "ValueList",
+    "ValueLoop",
+    # Color functions
+    "ARGB",
+    "HSL",
+    "RGB",
+    "Color",
+    "Colormix1",
+    "Colormix2",
+    "SysColor",
+    "ColorMapHue",
+    "ColorMapJet",
+    "black",
+    "blue",
+    "brown",
+    "cyan",
+    "darkgray",
+    "green",
+    "lightblue",
+    "lightcyan",
+    "lightgray",
+    "lightgreen",
+    "lightmagenta",
+    "lightred",
+    "magenta",
+    "red",
+    "white",
+    "yellow",
+    # Conditional functions
+    "alt",
+    "class",
+    "coalesce",
+    "if",
+    "match",
+    "mixmatch",
+    "pick",
+    "wildmatch",
+    # Counter functions
+    "autonumber",
+    "autonumberhash128",
+    "autonumberhash256",
+    "IterNo",
+    "RecNo",
+    "RowNo",
+    # Integer expressions of time
+    "second",
+    "minute",
+    "hour",
+    "day",
+    "week",
+    "month",
+    "year",
+    "weekyear",
+    "weekday",
+    # Timestamp functions
+    "now",
+    "today",
+    "LocalTime",
+    # Make functions
+    "makedate",
+    "makeweekdate",
+    "maketime",
+    # Other date functions
+    "AddMonths",
+    "AddYears",
+    "yeartodate",
+    # Timezone functions
+    "timezone",
+    "GMT",
+    "UTC",
+    "daylightsaving",
+    "converttolocaltime",
+    # Set time functions
+    "setdateyear",
+    "setdateyearmonth",
+    # In... functions
+    "inyear",
+    "inyeartodate",
+    "inquarter",
+    "inquartertodate",
+    "inmonth",
+    "inmonthtodate",
+    "inmonths",
+    "inmonthstodate",
+    "inweek",
+    "inweektodate",
+    "inlunarweek",
+    "inlunarweektodate",
+    "inday",
+    "indaytotime",
+    # Start ... end functions
+    "yearstart",
+    "yearend",
+    "yearname",
+    "quarterstart",
+    "quarterend",
+    "quartername",
+    "monthstart",
+    "monthend",
+    "monthname",
+    "monthsstart",
+    "monthsend",
+    "monthsname",
+    "weekstart",
+    "weekend",
+    "weekname",
+    "lunarweekstart",
+    "lunarweekend",
+    "lunarweekname",
+    "daystart",
+    "dayend",
+    "dayname",
+    # Day numbering functions
+    "age",
+    "networkdays",
+    "firstworkdate",
+    "lastworkdate",
+    "daynumberofyear",
+    "daynumberofquarter",
+    # Exponential and logarithmic
+    "exp",
+    "log",
+    "log10",
+    "pow",
+    "sqr",
+    "sqrt",
+    # Count functions
+    "GetAlternativeCount",
+    "GetExcludedCount",
+    "GetNotSelectedCount",
+    "GetPossibleCount",
+    "GetSelectedCount",
+    # Field and selection functions
+    "GetCurrentSelections",
+    "GetFieldSelections",
+    "GetObjectDimension",
+    "GetObjectField",
+    "GetObjectMeasure",
+    # File functions
+    "Attribute",
+    "ConnectString",
+    "FileBaseName",
+    "FileDir",
+    "FileExtension",
+    "FileName",
+    "FilePath",
+    "FileSize",
+    "FileTime",
+    "GetFolderPath",
+    "QvdCreateTime",
+    "QvdFieldName",
+    "QvdNoOfFields",
+    "QvdNoOfRecords",
+    "QvdTableName",
+    # Financial functions
+    "FV",
+    "nPer",
+    "Pmt",
+    "PV",
+    "Rate",
+    # Formatting functions
+    "ApplyCodepage",
+    "Date",
+    "Dual",
+    "Interval",
+    "Money",
+    "Num",
+    "Time",
+    "Timestamp",
+    # General numeric functions
+    "bitcount",
+    "div",
+    "fabs",
+    "fact",
+    "frac",
+    "sign",
+    # Combination and permutation functions
+    "combin",
+    "permut",
+    # Modulo functions
+    "fmod",
+    "mod",
+    # Parity functions
+    "even",
+    "odd",
+    # Rounding functions
+    "ceil",
+    "floor",
+    "round",
+    # Geospatial functions
+    "GeoAggrGeometry",
+    "GeoBoundingBox",
+    "GeoCountVertex",
+    "GeoInvProjectGeometry",
+    "GeoProjectGeometry",
+    "GeoReduceGeometry",
+    "GeoGetBoundingBox",
+    "GeoGetPolygonCenter",
+    "GeoMakePoint",
+    "GeoProject",
+    # Interpretation functions
+    "Date#",
+    "Interval#",
+    "Money#",
+    "Num#",
+    "Text",
+    "Time#",
+    "Timestamp#",
+    # Field functions
+    "FieldIndex",
+    "FieldValue",
+    "FieldValueCount",
+    # Inter-record functions in the data load script
+    "Exists",
+    "LookUp",
+    "Peek",
+    "Previous",
+    # Logical functions
+    "IsNum",
+    "IsText",
+    # Mapping functions
+    "ApplyMap",
+    "MapSubstring",
+    # Mathematical functions
+    "e",
+    "false",
+    "pi",
+    "rand",
+    "true",
+    # NULL functions
+    "EmptyIsNull",
+    "IsNull",
+    "Null",
+    # Basic range functions
+    "RangeMax",
+    "RangeMaxString",
+    "RangeMin",
+    "RangeMinString",
+    "RangeMode",
+    "RangeOnly",
+    "RangeSum",
+    # Counter range functions
+    "RangeCount",
+    "RangeMissingCount",
+    "RangeNullCount",
+    "RangeNumericCount",
+    "RangeTextCount",
+    # Statistical range functions
+    "RangeAvg",
+    "RangeCorrel",
+    "RangeFractile",
+    "RangeKurtosis",
+    "RangeSkew",
+    "RangeStdev",
+    # Financial range functions
+    "RangeIRR",
+    "RangeNPV",
+    "RangeXIRR",
+    "RangeXNPV",
+    # Statistical distribution
+    "CHIDIST",
+    "CHIINV",
+    "NORMDIST",
+    "NORMINV",
+    "TDIST",
+    "TINV",
+    "FDIST",
+    "FINV",
+    # String functions
+    "Capitalize",
+    "Chr",
+    "Evaluate",
+    "FindOneOf",
+    "Hash128",
+    "Hash160",
+    "Hash256",
+    "Index",
+    "KeepChar",
+    "Left",
+    "Len",
+    "LevenshteinDist",
+    "Lower",
+    "LTrim",
+    "Mid",
+    "Ord",
+    "PurgeChar",
+    "Repeat",
+    "Replace",
+    "Right",
+    "RTrim",
+    "SubField",
+    "SubStringCount",
+    "TextBetween",
+    "Trim",
+    "Upper",
+    # System functions
+    "Author",
+    "ClientPlatform",
+    "ComputerName",
+    "DocumentName",
+    "DocumentPath",
+    "DocumentTitle",
+    "EngineVersion",
+    "GetCollationLocale",
+    "GetObjectField",
+    "GetRegistryString",
+    "IsPartialReload",
+    "OSUser",
+    "ProductVersion",
+    "ReloadTime",
+    "StateName",
+    # Table functions
+    "FieldName",
+    "FieldNumber",
+    "NoOfFields",
+    "NoOfRows",
+    "NoOfTables",
+    "TableName",
+    "TableNumber",
+]
+
+# System variables and constants
+# see https://help.qlik.com/en-US/sense/August2021/Subsystems/Hub/Content/Sense_Hub/Scripting/work-with-variables-in-data-load-editor.htm
+CONSTANT_LIST = [
+    # System Variables
+    "floppy",
+    "cd",
+    "include",
+    "must_include",
+    "hideprefix",
+    "hidesuffix",
+    "qvpath",
+    "qvroot",
+    "QvWorkPath",
+    "QvWorkRoot",
+    "StripComments",
+    "Verbatim",
+    "OpenUrlTimeout",
+    "WinPath",
+    "WinRoot",
+    "CollationLocale",
+    "CreateSearchIndexOnReload",
+    # value handling variables
+    "NullDisplay",
+    "NullInterpret",
+    "NullValue",
+    "OtherSymbol",
+    # Currency formatting
+    "MoneyDecimalSep",
+    "MoneyFormat",
+    "MoneyThousandSep",
+    # Number formatting
+    "DecimalSep",
+    "ThousandSep",
+    "NumericalAbbreviation",
+    # Time formatting
+    "DateFormat",
+    "TimeFormat",
+    "TimestampFormat",
+    "MonthNames",
+    "LongMonthNames",
+    "DayNames",
+    "LongDayNames",
+    "FirstWeekDay",
+    "BrokenWeeks",
+    "ReferenceDay",
+    "FirstMonthOfYear",
+    # Error variables
+    "errormode",
+    "scripterror",
+    "scripterrorcount",
+    "scripterrorlist",
+    # Other
+    "null",
+]
diff --git a/.venv/Lib/site-packages/pygments/lexers/_scheme_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_scheme_builtins.py
new file mode 100644 (file)
index 0000000..c35a533
--- /dev/null
@@ -0,0 +1,1609 @@
+"""
+    pygments.lexers._scheme_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Scheme builtins.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# Autogenerated by external/scheme-builtins-generator.scm
+# using Guile 3.0.5.130-5a1e7.
+
+scheme_keywords = {
+    "*unspecified*",
+    "...",
+    "=>",
+    "@",
+    "@@",
+    "_",
+    "add-to-load-path",
+    "and",
+    "begin",
+    "begin-deprecated",
+    "case",
+    "case-lambda",
+    "case-lambda*",
+    "cond",
+    "cond-expand",
+    "current-filename",
+    "current-source-location",
+    "debug-set!",
+    "define",
+    "define*",
+    "define-inlinable",
+    "define-library",
+    "define-macro",
+    "define-module",
+    "define-once",
+    "define-option-interface",
+    "define-private",
+    "define-public",
+    "define-record-type",
+    "define-syntax",
+    "define-syntax-parameter",
+    "define-syntax-rule",
+    "define-values",
+    "defmacro",
+    "defmacro-public",
+    "delay",
+    "do",
+    "else",
+    "eval-when",
+    "export",
+    "export!",
+    "export-syntax",
+    "false-if-exception",
+    "identifier-syntax",
+    "if",
+    "import",
+    "include",
+    "include-ci",
+    "include-from-path",
+    "include-library-declarations",
+    "lambda",
+    "lambda*",
+    "let",
+    "let*",
+    "let*-values",
+    "let-syntax",
+    "let-values",
+    "letrec",
+    "letrec*",
+    "letrec-syntax",
+    "library",
+    "load",
+    "match",
+    "match-lambda",
+    "match-lambda*",
+    "match-let",
+    "match-let*",
+    "match-letrec",
+    "or",
+    "parameterize",
+    "print-set!",
+    "quasiquote",
+    "quasisyntax",
+    "quote",
+    "quote-syntax",
+    "re-export",
+    "re-export-syntax",
+    "read-set!",
+    "require-extension",
+    "set!",
+    "start-stack",
+    "syntax",
+    "syntax-case",
+    "syntax-error",
+    "syntax-parameterize",
+    "syntax-rules",
+    "unless",
+    "unquote",
+    "unquote-splicing",
+    "unsyntax",
+    "unsyntax-splicing",
+    "use-modules",
+    "when",
+    "while",
+    "with-ellipsis",
+    "with-fluids",
+    "with-syntax",
+    "λ",
+}
+
+scheme_builtins = {
+    "$sc-dispatch",
+    "%char-set-dump",
+    "%get-pre-modules-obarray",
+    "%get-stack-size",
+    "%global-site-dir",
+    "%init-rdelim-builtins",
+    "%init-rw-builtins",
+    "%library-dir",
+    "%load-announce",
+    "%load-hook",
+    "%make-void-port",
+    "%package-data-dir",
+    "%port-property",
+    "%print-module",
+    "%resolve-variable",
+    "%search-load-path",
+    "%set-port-property!",
+    "%site-ccache-dir",
+    "%site-dir",
+    "%start-stack",
+    "%string-dump",
+    "%symbol-dump",
+    "%warn-auto-compilation-enabled",
+    "*",
+    "+",
+    "-",
+    "->bool",
+    "->char-set",
+    "/",
+    "1+",
+    "1-",
+    "<",
+    "<=",
+    "=",
+    ">",
+    ">=",
+    "abort-to-prompt",
+    "abort-to-prompt*",
+    "abs",
+    "absolute-file-name?",
+    "accept",
+    "access?",
+    "acons",
+    "acos",
+    "acosh",
+    "add-hook!",
+    "addrinfo:addr",
+    "addrinfo:canonname",
+    "addrinfo:fam",
+    "addrinfo:flags",
+    "addrinfo:protocol",
+    "addrinfo:socktype",
+    "adjust-port-revealed!",
+    "alarm",
+    "alist-cons",
+    "alist-copy",
+    "alist-delete",
+    "alist-delete!",
+    "allocate-struct",
+    "and-map",
+    "and=>",
+    "angle",
+    "any",
+    "append",
+    "append!",
+    "append-map",
+    "append-map!",
+    "append-reverse",
+    "append-reverse!",
+    "apply",
+    "array->list",
+    "array-cell-ref",
+    "array-cell-set!",
+    "array-contents",
+    "array-copy!",
+    "array-copy-in-order!",
+    "array-dimensions",
+    "array-equal?",
+    "array-fill!",
+    "array-for-each",
+    "array-in-bounds?",
+    "array-index-map!",
+    "array-length",
+    "array-map!",
+    "array-map-in-order!",
+    "array-rank",
+    "array-ref",
+    "array-set!",
+    "array-shape",
+    "array-slice",
+    "array-slice-for-each",
+    "array-slice-for-each-in-order",
+    "array-type",
+    "array-type-code",
+    "array?",
+    "ash",
+    "asin",
+    "asinh",
+    "assert-load-verbosity",
+    "assoc",
+    "assoc-ref",
+    "assoc-remove!",
+    "assoc-set!",
+    "assq",
+    "assq-ref",
+    "assq-remove!",
+    "assq-set!",
+    "assv",
+    "assv-ref",
+    "assv-remove!",
+    "assv-set!",
+    "atan",
+    "atanh",
+    "autoload-done!",
+    "autoload-done-or-in-progress?",
+    "autoload-in-progress!",
+    "backtrace",
+    "basename",
+    "batch-mode?",
+    "beautify-user-module!",
+    "bind",
+    "bind-textdomain-codeset",
+    "bindtextdomain",
+    "bit-count",
+    "bit-count*",
+    "bit-extract",
+    "bit-invert!",
+    "bit-position",
+    "bit-set*!",
+    "bitvector",
+    "bitvector->list",
+    "bitvector-bit-clear?",
+    "bitvector-bit-set?",
+    "bitvector-clear-all-bits!",
+    "bitvector-clear-bit!",
+    "bitvector-clear-bits!",
+    "bitvector-count",
+    "bitvector-count-bits",
+    "bitvector-fill!",
+    "bitvector-flip-all-bits!",
+    "bitvector-length",
+    "bitvector-position",
+    "bitvector-ref",
+    "bitvector-set!",
+    "bitvector-set-all-bits!",
+    "bitvector-set-bit!",
+    "bitvector-set-bits!",
+    "bitvector?",
+    "boolean?",
+    "bound-identifier=?",
+    "break",
+    "break!",
+    "caaaar",
+    "caaadr",
+    "caaar",
+    "caadar",
+    "caaddr",
+    "caadr",
+    "caar",
+    "cadaar",
+    "cadadr",
+    "cadar",
+    "caddar",
+    "cadddr",
+    "caddr",
+    "cadr",
+    "call-with-blocked-asyncs",
+    "call-with-current-continuation",
+    "call-with-deferred-observers",
+    "call-with-include-port",
+    "call-with-input-file",
+    "call-with-input-string",
+    "call-with-module-autoload-lock",
+    "call-with-output-file",
+    "call-with-output-string",
+    "call-with-port",
+    "call-with-prompt",
+    "call-with-unblocked-asyncs",
+    "call-with-values",
+    "call/cc",
+    "canonicalize-path",
+    "car",
+    "car+cdr",
+    "catch",
+    "cdaaar",
+    "cdaadr",
+    "cdaar",
+    "cdadar",
+    "cdaddr",
+    "cdadr",
+    "cdar",
+    "cddaar",
+    "cddadr",
+    "cddar",
+    "cdddar",
+    "cddddr",
+    "cdddr",
+    "cddr",
+    "cdr",
+    "ceiling",
+    "ceiling-quotient",
+    "ceiling-remainder",
+    "ceiling/",
+    "centered-quotient",
+    "centered-remainder",
+    "centered/",
+    "char->integer",
+    "char-alphabetic?",
+    "char-ci<=?",
+    "char-ci<?",
+    "char-ci=?",
+    "char-ci>=?",
+    "char-ci>?",
+    "char-downcase",
+    "char-general-category",
+    "char-is-both?",
+    "char-lower-case?",
+    "char-numeric?",
+    "char-ready?",
+    "char-set",
+    "char-set->list",
+    "char-set->string",
+    "char-set-adjoin",
+    "char-set-adjoin!",
+    "char-set-any",
+    "char-set-complement",
+    "char-set-complement!",
+    "char-set-contains?",
+    "char-set-copy",
+    "char-set-count",
+    "char-set-cursor",
+    "char-set-cursor-next",
+    "char-set-delete",
+    "char-set-delete!",
+    "char-set-diff+intersection",
+    "char-set-diff+intersection!",
+    "char-set-difference",
+    "char-set-difference!",
+    "char-set-every",
+    "char-set-filter",
+    "char-set-filter!",
+    "char-set-fold",
+    "char-set-for-each",
+    "char-set-hash",
+    "char-set-intersection",
+    "char-set-intersection!",
+    "char-set-map",
+    "char-set-ref",
+    "char-set-size",
+    "char-set-unfold",
+    "char-set-unfold!",
+    "char-set-union",
+    "char-set-union!",
+    "char-set-xor",
+    "char-set-xor!",
+    "char-set<=",
+    "char-set=",
+    "char-set?",
+    "char-titlecase",
+    "char-upcase",
+    "char-upper-case?",
+    "char-whitespace?",
+    "char<=?",
+    "char<?",
+    "char=?",
+    "char>=?",
+    "char>?",
+    "char?",
+    "chdir",
+    "chmod",
+    "chown",
+    "chroot",
+    "circular-list",
+    "circular-list?",
+    "close",
+    "close-fdes",
+    "close-input-port",
+    "close-output-port",
+    "close-port",
+    "closedir",
+    "command-line",
+    "complex?",
+    "compose",
+    "concatenate",
+    "concatenate!",
+    "cond-expand-provide",
+    "connect",
+    "cons",
+    "cons*",
+    "cons-source",
+    "const",
+    "convert-assignment",
+    "copy-file",
+    "copy-random-state",
+    "copy-tree",
+    "cos",
+    "cosh",
+    "count",
+    "crypt",
+    "ctermid",
+    "current-dynamic-state",
+    "current-error-port",
+    "current-input-port",
+    "current-language",
+    "current-load-port",
+    "current-module",
+    "current-output-port",
+    "current-time",
+    "current-warning-port",
+    "datum->random-state",
+    "datum->syntax",
+    "debug-disable",
+    "debug-enable",
+    "debug-options",
+    "debug-options-interface",
+    "default-duplicate-binding-handler",
+    "default-duplicate-binding-procedures",
+    "default-prompt-tag",
+    "define!",
+    "define-module*",
+    "defined?",
+    "delete",
+    "delete!",
+    "delete-duplicates",
+    "delete-duplicates!",
+    "delete-file",
+    "delete1!",
+    "delq",
+    "delq!",
+    "delq1!",
+    "delv",
+    "delv!",
+    "delv1!",
+    "denominator",
+    "directory-stream?",
+    "dirname",
+    "display",
+    "display-application",
+    "display-backtrace",
+    "display-error",
+    "dotted-list?",
+    "doubly-weak-hash-table?",
+    "drain-input",
+    "drop",
+    "drop-right",
+    "drop-right!",
+    "drop-while",
+    "dup",
+    "dup->fdes",
+    "dup->inport",
+    "dup->outport",
+    "dup->port",
+    "dup2",
+    "duplicate-port",
+    "dynamic-call",
+    "dynamic-func",
+    "dynamic-link",
+    "dynamic-object?",
+    "dynamic-pointer",
+    "dynamic-state?",
+    "dynamic-unlink",
+    "dynamic-wind",
+    "effective-version",
+    "eighth",
+    "end-of-char-set?",
+    "endgrent",
+    "endhostent",
+    "endnetent",
+    "endprotoent",
+    "endpwent",
+    "endservent",
+    "ensure-batch-mode!",
+    "environ",
+    "eof-object?",
+    "eq?",
+    "equal?",
+    "eqv?",
+    "error",
+    "euclidean-quotient",
+    "euclidean-remainder",
+    "euclidean/",
+    "eval",
+    "eval-string",
+    "even?",
+    "every",
+    "exact->inexact",
+    "exact-integer-sqrt",
+    "exact-integer?",
+    "exact?",
+    "exception-accessor",
+    "exception-args",
+    "exception-kind",
+    "exception-predicate",
+    "exception-type?",
+    "exception?",
+    "execl",
+    "execle",
+    "execlp",
+    "exit",
+    "exp",
+    "expt",
+    "f32vector",
+    "f32vector->list",
+    "f32vector-length",
+    "f32vector-ref",
+    "f32vector-set!",
+    "f32vector?",
+    "f64vector",
+    "f64vector->list",
+    "f64vector-length",
+    "f64vector-ref",
+    "f64vector-set!",
+    "f64vector?",
+    "fcntl",
+    "fdes->inport",
+    "fdes->outport",
+    "fdes->ports",
+    "fdopen",
+    "fifth",
+    "file-encoding",
+    "file-exists?",
+    "file-is-directory?",
+    "file-name-separator?",
+    "file-port?",
+    "file-position",
+    "file-set-position",
+    "fileno",
+    "filter",
+    "filter!",
+    "filter-map",
+    "find",
+    "find-tail",
+    "finite?",
+    "first",
+    "flock",
+    "floor",
+    "floor-quotient",
+    "floor-remainder",
+    "floor/",
+    "fluid->parameter",
+    "fluid-bound?",
+    "fluid-ref",
+    "fluid-ref*",
+    "fluid-set!",
+    "fluid-thread-local?",
+    "fluid-unset!",
+    "fluid?",
+    "flush-all-ports",
+    "fold",
+    "fold-right",
+    "for-each",
+    "force",
+    "force-output",
+    "format",
+    "fourth",
+    "frame-address",
+    "frame-arguments",
+    "frame-dynamic-link",
+    "frame-instruction-pointer",
+    "frame-previous",
+    "frame-procedure-name",
+    "frame-return-address",
+    "frame-source",
+    "frame-stack-pointer",
+    "frame?",
+    "free-identifier=?",
+    "fsync",
+    "ftell",
+    "gai-strerror",
+    "gc",
+    "gc-disable",
+    "gc-dump",
+    "gc-enable",
+    "gc-run-time",
+    "gc-stats",
+    "gcd",
+    "generate-temporaries",
+    "gensym",
+    "get-internal-real-time",
+    "get-internal-run-time",
+    "get-output-string",
+    "get-print-state",
+    "getaddrinfo",
+    "getaffinity",
+    "getcwd",
+    "getegid",
+    "getenv",
+    "geteuid",
+    "getgid",
+    "getgr",
+    "getgrent",
+    "getgrgid",
+    "getgrnam",
+    "getgroups",
+    "gethost",
+    "gethostbyaddr",
+    "gethostbyname",
+    "gethostent",
+    "gethostname",
+    "getitimer",
+    "getlogin",
+    "getnet",
+    "getnetbyaddr",
+    "getnetbyname",
+    "getnetent",
+    "getpass",
+    "getpeername",
+    "getpgrp",
+    "getpid",
+    "getppid",
+    "getpriority",
+    "getproto",
+    "getprotobyname",
+    "getprotobynumber",
+    "getprotoent",
+    "getpw",
+    "getpwent",
+    "getpwnam",
+    "getpwuid",
+    "getrlimit",
+    "getserv",
+    "getservbyname",
+    "getservbyport",
+    "getservent",
+    "getsid",
+    "getsockname",
+    "getsockopt",
+    "gettext",
+    "gettimeofday",
+    "getuid",
+    "gmtime",
+    "group:gid",
+    "group:mem",
+    "group:name",
+    "group:passwd",
+    "hash",
+    "hash-clear!",
+    "hash-count",
+    "hash-create-handle!",
+    "hash-fold",
+    "hash-for-each",
+    "hash-for-each-handle",
+    "hash-get-handle",
+    "hash-map->list",
+    "hash-ref",
+    "hash-remove!",
+    "hash-set!",
+    "hash-table?",
+    "hashq",
+    "hashq-create-handle!",
+    "hashq-get-handle",
+    "hashq-ref",
+    "hashq-remove!",
+    "hashq-set!",
+    "hashv",
+    "hashv-create-handle!",
+    "hashv-get-handle",
+    "hashv-ref",
+    "hashv-remove!",
+    "hashv-set!",
+    "hashx-create-handle!",
+    "hashx-get-handle",
+    "hashx-ref",
+    "hashx-remove!",
+    "hashx-set!",
+    "hook->list",
+    "hook-empty?",
+    "hook?",
+    "hostent:addr-list",
+    "hostent:addrtype",
+    "hostent:aliases",
+    "hostent:length",
+    "hostent:name",
+    "identifier?",
+    "identity",
+    "imag-part",
+    "in-vicinity",
+    "include-deprecated-features",
+    "inet-lnaof",
+    "inet-makeaddr",
+    "inet-netof",
+    "inet-ntop",
+    "inet-pton",
+    "inexact->exact",
+    "inexact?",
+    "inf",
+    "inf?",
+    "inherit-print-state",
+    "input-port?",
+    "install-r6rs!",
+    "install-r7rs!",
+    "integer->char",
+    "integer-expt",
+    "integer-length",
+    "integer?",
+    "interaction-environment",
+    "iota",
+    "isatty?",
+    "issue-deprecation-warning",
+    "keyword->symbol",
+    "keyword-like-symbol->keyword",
+    "keyword?",
+    "kill",
+    "kw-arg-ref",
+    "last",
+    "last-pair",
+    "lcm",
+    "length",
+    "length+",
+    "link",
+    "list",
+    "list->array",
+    "list->bitvector",
+    "list->char-set",
+    "list->char-set!",
+    "list->f32vector",
+    "list->f64vector",
+    "list->s16vector",
+    "list->s32vector",
+    "list->s64vector",
+    "list->s8vector",
+    "list->string",
+    "list->symbol",
+    "list->typed-array",
+    "list->u16vector",
+    "list->u32vector",
+    "list->u64vector",
+    "list->u8vector",
+    "list->vector",
+    "list-cdr-ref",
+    "list-cdr-set!",
+    "list-copy",
+    "list-head",
+    "list-index",
+    "list-ref",
+    "list-set!",
+    "list-tabulate",
+    "list-tail",
+    "list=",
+    "list?",
+    "listen",
+    "load-compiled",
+    "load-extension",
+    "load-from-path",
+    "load-in-vicinity",
+    "load-user-init",
+    "local-define",
+    "local-define-module",
+    "local-ref",
+    "local-ref-module",
+    "local-remove",
+    "local-set!",
+    "localtime",
+    "log",
+    "log10",
+    "logand",
+    "logbit?",
+    "logcount",
+    "logior",
+    "lognot",
+    "logtest",
+    "logxor",
+    "lookup-duplicates-handlers",
+    "lset-adjoin",
+    "lset-diff+intersection",
+    "lset-diff+intersection!",
+    "lset-difference",
+    "lset-difference!",
+    "lset-intersection",
+    "lset-intersection!",
+    "lset-union",
+    "lset-union!",
+    "lset-xor",
+    "lset-xor!",
+    "lset<=",
+    "lset=",
+    "lstat",
+    "macro-binding",
+    "macro-name",
+    "macro-transformer",
+    "macro-type",
+    "macro?",
+    "macroexpand",
+    "macroexpanded?",
+    "magnitude",
+    "major-version",
+    "make-array",
+    "make-autoload-interface",
+    "make-bitvector",
+    "make-doubly-weak-hash-table",
+    "make-exception",
+    "make-exception-from-throw",
+    "make-exception-type",
+    "make-f32vector",
+    "make-f64vector",
+    "make-fluid",
+    "make-fresh-user-module",
+    "make-generalized-vector",
+    "make-guardian",
+    "make-hash-table",
+    "make-hook",
+    "make-list",
+    "make-module",
+    "make-modules-in",
+    "make-mutable-parameter",
+    "make-object-property",
+    "make-parameter",
+    "make-polar",
+    "make-procedure-with-setter",
+    "make-promise",
+    "make-prompt-tag",
+    "make-record-type",
+    "make-rectangular",
+    "make-regexp",
+    "make-s16vector",
+    "make-s32vector",
+    "make-s64vector",
+    "make-s8vector",
+    "make-shared-array",
+    "make-socket-address",
+    "make-soft-port",
+    "make-srfi-4-vector",
+    "make-stack",
+    "make-string",
+    "make-struct-layout",
+    "make-struct/no-tail",
+    "make-struct/simple",
+    "make-symbol",
+    "make-syntax-transformer",
+    "make-thread-local-fluid",
+    "make-typed-array",
+    "make-u16vector",
+    "make-u32vector",
+    "make-u64vector",
+    "make-u8vector",
+    "make-unbound-fluid",
+    "make-undefined-variable",
+    "make-variable",
+    "make-variable-transformer",
+    "make-vector",
+    "make-vtable",
+    "make-weak-key-hash-table",
+    "make-weak-value-hash-table",
+    "map",
+    "map!",
+    "map-in-order",
+    "max",
+    "member",
+    "memoize-expression",
+    "memoized-typecode",
+    "memq",
+    "memv",
+    "merge",
+    "merge!",
+    "micro-version",
+    "min",
+    "minor-version",
+    "mkdir",
+    "mkdtemp",
+    "mknod",
+    "mkstemp",
+    "mkstemp!",
+    "mktime",
+    "module-add!",
+    "module-autoload!",
+    "module-binder",
+    "module-bound?",
+    "module-call-observers",
+    "module-clear!",
+    "module-constructor",
+    "module-declarative?",
+    "module-defer-observers",
+    "module-define!",
+    "module-define-submodule!",
+    "module-defined?",
+    "module-duplicates-handlers",
+    "module-ensure-local-variable!",
+    "module-export!",
+    "module-export-all!",
+    "module-filename",
+    "module-for-each",
+    "module-generate-unique-id!",
+    "module-gensym",
+    "module-import-interface",
+    "module-import-obarray",
+    "module-kind",
+    "module-local-variable",
+    "module-locally-bound?",
+    "module-make-local-var!",
+    "module-map",
+    "module-modified",
+    "module-name",
+    "module-next-unique-id",
+    "module-obarray",
+    "module-obarray-get-handle",
+    "module-obarray-ref",
+    "module-obarray-remove!",
+    "module-obarray-set!",
+    "module-observe",
+    "module-observe-weak",
+    "module-observers",
+    "module-public-interface",
+    "module-re-export!",
+    "module-ref",
+    "module-ref-submodule",
+    "module-remove!",
+    "module-replace!",
+    "module-replacements",
+    "module-reverse-lookup",
+    "module-search",
+    "module-set!",
+    "module-submodule-binder",
+    "module-submodules",
+    "module-symbol-binding",
+    "module-symbol-interned?",
+    "module-symbol-local-binding",
+    "module-symbol-locally-interned?",
+    "module-transformer",
+    "module-unobserve",
+    "module-use!",
+    "module-use-interfaces!",
+    "module-uses",
+    "module-variable",
+    "module-version",
+    "module-weak-observers",
+    "module?",
+    "modulo",
+    "modulo-expt",
+    "move->fdes",
+    "nan",
+    "nan?",
+    "negate",
+    "negative?",
+    "nested-define!",
+    "nested-define-module!",
+    "nested-ref",
+    "nested-ref-module",
+    "nested-remove!",
+    "nested-set!",
+    "netent:addrtype",
+    "netent:aliases",
+    "netent:name",
+    "netent:net",
+    "newline",
+    "ngettext",
+    "nice",
+    "nil?",
+    "ninth",
+    "noop",
+    "not",
+    "not-pair?",
+    "null-environment",
+    "null-list?",
+    "null?",
+    "number->string",
+    "number?",
+    "numerator",
+    "object->string",
+    "object-address",
+    "object-properties",
+    "object-property",
+    "odd?",
+    "open",
+    "open-fdes",
+    "open-file",
+    "open-input-file",
+    "open-input-string",
+    "open-io-file",
+    "open-output-file",
+    "open-output-string",
+    "opendir",
+    "or-map",
+    "output-port?",
+    "pair-fold",
+    "pair-fold-right",
+    "pair-for-each",
+    "pair?",
+    "parameter-converter",
+    "parameter-fluid",
+    "parameter?",
+    "parse-path",
+    "parse-path-with-ellipsis",
+    "partition",
+    "partition!",
+    "passwd:dir",
+    "passwd:gecos",
+    "passwd:gid",
+    "passwd:name",
+    "passwd:passwd",
+    "passwd:shell",
+    "passwd:uid",
+    "pause",
+    "peek",
+    "peek-char",
+    "pipe",
+    "pk",
+    "port->fdes",
+    "port-closed?",
+    "port-column",
+    "port-conversion-strategy",
+    "port-encoding",
+    "port-filename",
+    "port-for-each",
+    "port-line",
+    "port-mode",
+    "port-revealed",
+    "port-with-print-state",
+    "port?",
+    "positive?",
+    "primitive-_exit",
+    "primitive-eval",
+    "primitive-exit",
+    "primitive-fork",
+    "primitive-load",
+    "primitive-load-path",
+    "primitive-move->fdes",
+    "primitive-read",
+    "print-disable",
+    "print-enable",
+    "print-exception",
+    "print-options",
+    "print-options-interface",
+    "procedure",
+    "procedure-documentation",
+    "procedure-minimum-arity",
+    "procedure-name",
+    "procedure-properties",
+    "procedure-property",
+    "procedure-source",
+    "procedure-with-setter?",
+    "procedure?",
+    "process-use-modules",
+    "program-arguments",
+    "promise?",
+    "proper-list?",
+    "protoent:aliases",
+    "protoent:name",
+    "protoent:proto",
+    "provide",
+    "provided?",
+    "purify-module!",
+    "putenv",
+    "quit",
+    "quotient",
+    "raise",
+    "raise-exception",
+    "random",
+    "random-state->datum",
+    "random-state-from-platform",
+    "random:exp",
+    "random:hollow-sphere!",
+    "random:normal",
+    "random:normal-vector!",
+    "random:solid-sphere!",
+    "random:uniform",
+    "rational?",
+    "rationalize",
+    "read",
+    "read-char",
+    "read-disable",
+    "read-enable",
+    "read-hash-extend",
+    "read-hash-procedure",
+    "read-hash-procedures",
+    "read-options",
+    "read-options-interface",
+    "read-syntax",
+    "readdir",
+    "readlink",
+    "real-part",
+    "real?",
+    "record-accessor",
+    "record-constructor",
+    "record-modifier",
+    "record-predicate",
+    "record-type-constructor",
+    "record-type-descriptor",
+    "record-type-extensible?",
+    "record-type-fields",
+    "record-type-has-parent?",
+    "record-type-mutable-fields",
+    "record-type-name",
+    "record-type-opaque?",
+    "record-type-parent",
+    "record-type-parents",
+    "record-type-properties",
+    "record-type-uid",
+    "record-type?",
+    "record?",
+    "recv!",
+    "recvfrom!",
+    "redirect-port",
+    "reduce",
+    "reduce-right",
+    "regexp-exec",
+    "regexp?",
+    "release-port-handle",
+    "reload-module",
+    "remainder",
+    "remove",
+    "remove!",
+    "remove-hook!",
+    "rename-file",
+    "repl-reader",
+    "reset-hook!",
+    "resolve-interface",
+    "resolve-module",
+    "resolve-r6rs-interface",
+    "restore-signals",
+    "restricted-vector-sort!",
+    "reverse",
+    "reverse!",
+    "reverse-list->string",
+    "rewinddir",
+    "rmdir",
+    "round",
+    "round-ash",
+    "round-quotient",
+    "round-remainder",
+    "round/",
+    "run-hook",
+    "s16vector",
+    "s16vector->list",
+    "s16vector-length",
+    "s16vector-ref",
+    "s16vector-set!",
+    "s16vector?",
+    "s32vector",
+    "s32vector->list",
+    "s32vector-length",
+    "s32vector-ref",
+    "s32vector-set!",
+    "s32vector?",
+    "s64vector",
+    "s64vector->list",
+    "s64vector-length",
+    "s64vector-ref",
+    "s64vector-set!",
+    "s64vector?",
+    "s8vector",
+    "s8vector->list",
+    "s8vector-length",
+    "s8vector-ref",
+    "s8vector-set!",
+    "s8vector?",
+    "save-module-excursion",
+    "scheme-report-environment",
+    "scm-error",
+    "search-path",
+    "second",
+    "seed->random-state",
+    "seek",
+    "select",
+    "self-evaluating?",
+    "send",
+    "sendfile",
+    "sendto",
+    "servent:aliases",
+    "servent:name",
+    "servent:port",
+    "servent:proto",
+    "set-autoloaded!",
+    "set-car!",
+    "set-cdr!",
+    "set-current-dynamic-state",
+    "set-current-error-port",
+    "set-current-input-port",
+    "set-current-module",
+    "set-current-output-port",
+    "set-exception-printer!",
+    "set-module-binder!",
+    "set-module-declarative?!",
+    "set-module-duplicates-handlers!",
+    "set-module-filename!",
+    "set-module-kind!",
+    "set-module-name!",
+    "set-module-next-unique-id!",
+    "set-module-obarray!",
+    "set-module-observers!",
+    "set-module-public-interface!",
+    "set-module-submodule-binder!",
+    "set-module-submodules!",
+    "set-module-transformer!",
+    "set-module-uses!",
+    "set-module-version!",
+    "set-object-properties!",
+    "set-object-property!",
+    "set-port-column!",
+    "set-port-conversion-strategy!",
+    "set-port-encoding!",
+    "set-port-filename!",
+    "set-port-line!",
+    "set-port-revealed!",
+    "set-procedure-minimum-arity!",
+    "set-procedure-properties!",
+    "set-procedure-property!",
+    "set-program-arguments",
+    "set-source-properties!",
+    "set-source-property!",
+    "set-struct-vtable-name!",
+    "set-symbol-property!",
+    "set-tm:gmtoff",
+    "set-tm:hour",
+    "set-tm:isdst",
+    "set-tm:mday",
+    "set-tm:min",
+    "set-tm:mon",
+    "set-tm:sec",
+    "set-tm:wday",
+    "set-tm:yday",
+    "set-tm:year",
+    "set-tm:zone",
+    "setaffinity",
+    "setegid",
+    "setenv",
+    "seteuid",
+    "setgid",
+    "setgr",
+    "setgrent",
+    "setgroups",
+    "sethost",
+    "sethostent",
+    "sethostname",
+    "setitimer",
+    "setlocale",
+    "setnet",
+    "setnetent",
+    "setpgid",
+    "setpriority",
+    "setproto",
+    "setprotoent",
+    "setpw",
+    "setpwent",
+    "setrlimit",
+    "setserv",
+    "setservent",
+    "setsid",
+    "setsockopt",
+    "setter",
+    "setuid",
+    "setvbuf",
+    "seventh",
+    "shared-array-increments",
+    "shared-array-offset",
+    "shared-array-root",
+    "shutdown",
+    "sigaction",
+    "simple-exceptions",
+    "simple-format",
+    "sin",
+    "sinh",
+    "sixth",
+    "sleep",
+    "sloppy-assoc",
+    "sloppy-assq",
+    "sloppy-assv",
+    "sockaddr:addr",
+    "sockaddr:fam",
+    "sockaddr:flowinfo",
+    "sockaddr:path",
+    "sockaddr:port",
+    "sockaddr:scopeid",
+    "socket",
+    "socketpair",
+    "sort",
+    "sort!",
+    "sort-list",
+    "sort-list!",
+    "sorted?",
+    "source-properties",
+    "source-property",
+    "span",
+    "span!",
+    "split-at",
+    "split-at!",
+    "sqrt",
+    "stable-sort",
+    "stable-sort!",
+    "stack-id",
+    "stack-length",
+    "stack-ref",
+    "stack?",
+    "stat",
+    "stat:atime",
+    "stat:atimensec",
+    "stat:blksize",
+    "stat:blocks",
+    "stat:ctime",
+    "stat:ctimensec",
+    "stat:dev",
+    "stat:gid",
+    "stat:ino",
+    "stat:mode",
+    "stat:mtime",
+    "stat:mtimensec",
+    "stat:nlink",
+    "stat:perms",
+    "stat:rdev",
+    "stat:size",
+    "stat:type",
+    "stat:uid",
+    "status:exit-val",
+    "status:stop-sig",
+    "status:term-sig",
+    "strerror",
+    "strftime",
+    "string",
+    "string->char-set",
+    "string->char-set!",
+    "string->list",
+    "string->number",
+    "string->symbol",
+    "string-any",
+    "string-any-c-code",
+    "string-append",
+    "string-append/shared",
+    "string-bytes-per-char",
+    "string-capitalize",
+    "string-capitalize!",
+    "string-ci->symbol",
+    "string-ci<",
+    "string-ci<=",
+    "string-ci<=?",
+    "string-ci<>",
+    "string-ci<?",
+    "string-ci=",
+    "string-ci=?",
+    "string-ci>",
+    "string-ci>=",
+    "string-ci>=?",
+    "string-ci>?",
+    "string-compare",
+    "string-compare-ci",
+    "string-concatenate",
+    "string-concatenate-reverse",
+    "string-concatenate-reverse/shared",
+    "string-concatenate/shared",
+    "string-contains",
+    "string-contains-ci",
+    "string-copy",
+    "string-copy!",
+    "string-count",
+    "string-delete",
+    "string-downcase",
+    "string-downcase!",
+    "string-drop",
+    "string-drop-right",
+    "string-every",
+    "string-every-c-code",
+    "string-fill!",
+    "string-filter",
+    "string-fold",
+    "string-fold-right",
+    "string-for-each",
+    "string-for-each-index",
+    "string-hash",
+    "string-hash-ci",
+    "string-index",
+    "string-index-right",
+    "string-join",
+    "string-length",
+    "string-map",
+    "string-map!",
+    "string-normalize-nfc",
+    "string-normalize-nfd",
+    "string-normalize-nfkc",
+    "string-normalize-nfkd",
+    "string-null?",
+    "string-pad",
+    "string-pad-right",
+    "string-prefix-ci?",
+    "string-prefix-length",
+    "string-prefix-length-ci",
+    "string-prefix?",
+    "string-ref",
+    "string-replace",
+    "string-reverse",
+    "string-reverse!",
+    "string-rindex",
+    "string-set!",
+    "string-skip",
+    "string-skip-right",
+    "string-split",
+    "string-suffix-ci?",
+    "string-suffix-length",
+    "string-suffix-length-ci",
+    "string-suffix?",
+    "string-tabulate",
+    "string-take",
+    "string-take-right",
+    "string-titlecase",
+    "string-titlecase!",
+    "string-tokenize",
+    "string-trim",
+    "string-trim-both",
+    "string-trim-right",
+    "string-unfold",
+    "string-unfold-right",
+    "string-upcase",
+    "string-upcase!",
+    "string-utf8-length",
+    "string-xcopy!",
+    "string<",
+    "string<=",
+    "string<=?",
+    "string<>",
+    "string<?",
+    "string=",
+    "string=?",
+    "string>",
+    "string>=",
+    "string>=?",
+    "string>?",
+    "string?",
+    "strptime",
+    "struct-layout",
+    "struct-ref",
+    "struct-ref/unboxed",
+    "struct-set!",
+    "struct-set!/unboxed",
+    "struct-vtable",
+    "struct-vtable-name",
+    "struct-vtable?",
+    "struct?",
+    "substring",
+    "substring-fill!",
+    "substring-move!",
+    "substring/copy",
+    "substring/read-only",
+    "substring/shared",
+    "supports-source-properties?",
+    "symbol",
+    "symbol->keyword",
+    "symbol->string",
+    "symbol-append",
+    "symbol-fref",
+    "symbol-fset!",
+    "symbol-hash",
+    "symbol-interned?",
+    "symbol-pref",
+    "symbol-prefix-proc",
+    "symbol-property",
+    "symbol-property-remove!",
+    "symbol-pset!",
+    "symbol?",
+    "symlink",
+    "sync",
+    "syntax->datum",
+    "syntax-source",
+    "syntax-violation",
+    "system",
+    "system*",
+    "system-async-mark",
+    "system-error-errno",
+    "system-file-name-convention",
+    "take",
+    "take!",
+    "take-right",
+    "take-while",
+    "take-while!",
+    "tan",
+    "tanh",
+    "tcgetpgrp",
+    "tcsetpgrp",
+    "tenth",
+    "textdomain",
+    "third",
+    "throw",
+    "thunk?",
+    "times",
+    "tm:gmtoff",
+    "tm:hour",
+    "tm:isdst",
+    "tm:mday",
+    "tm:min",
+    "tm:mon",
+    "tm:sec",
+    "tm:wday",
+    "tm:yday",
+    "tm:year",
+    "tm:zone",
+    "tmpfile",
+    "tmpnam",
+    "tms:clock",
+    "tms:cstime",
+    "tms:cutime",
+    "tms:stime",
+    "tms:utime",
+    "transpose-array",
+    "truncate",
+    "truncate-file",
+    "truncate-quotient",
+    "truncate-remainder",
+    "truncate/",
+    "try-load-module",
+    "try-module-autoload",
+    "ttyname",
+    "typed-array?",
+    "tzset",
+    "u16vector",
+    "u16vector->list",
+    "u16vector-length",
+    "u16vector-ref",
+    "u16vector-set!",
+    "u16vector?",
+    "u32vector",
+    "u32vector->list",
+    "u32vector-length",
+    "u32vector-ref",
+    "u32vector-set!",
+    "u32vector?",
+    "u64vector",
+    "u64vector->list",
+    "u64vector-length",
+    "u64vector-ref",
+    "u64vector-set!",
+    "u64vector?",
+    "u8vector",
+    "u8vector->list",
+    "u8vector-length",
+    "u8vector-ref",
+    "u8vector-set!",
+    "u8vector?",
+    "ucs-range->char-set",
+    "ucs-range->char-set!",
+    "umask",
+    "uname",
+    "unfold",
+    "unfold-right",
+    "unmemoize-expression",
+    "unread-char",
+    "unread-string",
+    "unsetenv",
+    "unspecified?",
+    "unzip1",
+    "unzip2",
+    "unzip3",
+    "unzip4",
+    "unzip5",
+    "use-srfis",
+    "user-modules-declarative?",
+    "using-readline?",
+    "usleep",
+    "utime",
+    "utsname:machine",
+    "utsname:nodename",
+    "utsname:release",
+    "utsname:sysname",
+    "utsname:version",
+    "values",
+    "variable-bound?",
+    "variable-ref",
+    "variable-set!",
+    "variable-unset!",
+    "variable?",
+    "vector",
+    "vector->list",
+    "vector-copy",
+    "vector-fill!",
+    "vector-length",
+    "vector-move-left!",
+    "vector-move-right!",
+    "vector-ref",
+    "vector-set!",
+    "vector?",
+    "version",
+    "version-matches?",
+    "waitpid",
+    "warn",
+    "weak-key-hash-table?",
+    "weak-value-hash-table?",
+    "with-continuation-barrier",
+    "with-dynamic-state",
+    "with-error-to-file",
+    "with-error-to-port",
+    "with-error-to-string",
+    "with-exception-handler",
+    "with-fluid*",
+    "with-fluids*",
+    "with-input-from-file",
+    "with-input-from-port",
+    "with-input-from-string",
+    "with-output-to-file",
+    "with-output-to-port",
+    "with-output-to-string",
+    "with-throw-handler",
+    "write",
+    "write-char",
+    "xcons",
+    "xsubstring",
+    "zero?",
+    "zip",
+}
+
diff --git a/.venv/Lib/site-packages/pygments/lexers/_scilab_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_scilab_builtins.py
new file mode 100644 (file)
index 0000000..af49b46
--- /dev/null
@@ -0,0 +1,3093 @@
+"""
+    pygments.lexers._scilab_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Builtin list for the ScilabLexer.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# Autogenerated
+
+commands_kw = (
+    'abort',
+    'apropos',
+    'break',
+    'case',
+    'catch',
+    'continue',
+    'do',
+    'else',
+    'elseif',
+    'end',
+    'endfunction',
+    'for',
+    'function',
+    'help',
+    'if',
+    'pause',
+    'quit',
+    'select',
+    'then',
+    'try',
+    'while',
+)
+
+functions_kw = (
+    '!!_invoke_',
+    '%H5Object_e',
+    '%H5Object_fieldnames',
+    '%H5Object_p',
+    '%XMLAttr_6',
+    '%XMLAttr_e',
+    '%XMLAttr_i_XMLElem',
+    '%XMLAttr_length',
+    '%XMLAttr_p',
+    '%XMLAttr_size',
+    '%XMLDoc_6',
+    '%XMLDoc_e',
+    '%XMLDoc_i_XMLList',
+    '%XMLDoc_p',
+    '%XMLElem_6',
+    '%XMLElem_e',
+    '%XMLElem_i_XMLDoc',
+    '%XMLElem_i_XMLElem',
+    '%XMLElem_i_XMLList',
+    '%XMLElem_p',
+    '%XMLList_6',
+    '%XMLList_e',
+    '%XMLList_i_XMLElem',
+    '%XMLList_i_XMLList',
+    '%XMLList_length',
+    '%XMLList_p',
+    '%XMLList_size',
+    '%XMLNs_6',
+    '%XMLNs_e',
+    '%XMLNs_i_XMLElem',
+    '%XMLNs_p',
+    '%XMLSet_6',
+    '%XMLSet_e',
+    '%XMLSet_length',
+    '%XMLSet_p',
+    '%XMLSet_size',
+    '%XMLValid_p',
+    '%_EClass_6',
+    '%_EClass_e',
+    '%_EClass_p',
+    '%_EObj_0',
+    '%_EObj_1__EObj',
+    '%_EObj_1_b',
+    '%_EObj_1_c',
+    '%_EObj_1_i',
+    '%_EObj_1_s',
+    '%_EObj_2__EObj',
+    '%_EObj_2_b',
+    '%_EObj_2_c',
+    '%_EObj_2_i',
+    '%_EObj_2_s',
+    '%_EObj_3__EObj',
+    '%_EObj_3_b',
+    '%_EObj_3_c',
+    '%_EObj_3_i',
+    '%_EObj_3_s',
+    '%_EObj_4__EObj',
+    '%_EObj_4_b',
+    '%_EObj_4_c',
+    '%_EObj_4_i',
+    '%_EObj_4_s',
+    '%_EObj_5',
+    '%_EObj_6',
+    '%_EObj_a__EObj',
+    '%_EObj_a_b',
+    '%_EObj_a_c',
+    '%_EObj_a_i',
+    '%_EObj_a_s',
+    '%_EObj_d__EObj',
+    '%_EObj_d_b',
+    '%_EObj_d_c',
+    '%_EObj_d_i',
+    '%_EObj_d_s',
+    '%_EObj_disp',
+    '%_EObj_e',
+    '%_EObj_g__EObj',
+    '%_EObj_g_b',
+    '%_EObj_g_c',
+    '%_EObj_g_i',
+    '%_EObj_g_s',
+    '%_EObj_h__EObj',
+    '%_EObj_h_b',
+    '%_EObj_h_c',
+    '%_EObj_h_i',
+    '%_EObj_h_s',
+    '%_EObj_i__EObj',
+    '%_EObj_j__EObj',
+    '%_EObj_j_b',
+    '%_EObj_j_c',
+    '%_EObj_j_i',
+    '%_EObj_j_s',
+    '%_EObj_k__EObj',
+    '%_EObj_k_b',
+    '%_EObj_k_c',
+    '%_EObj_k_i',
+    '%_EObj_k_s',
+    '%_EObj_l__EObj',
+    '%_EObj_l_b',
+    '%_EObj_l_c',
+    '%_EObj_l_i',
+    '%_EObj_l_s',
+    '%_EObj_m__EObj',
+    '%_EObj_m_b',
+    '%_EObj_m_c',
+    '%_EObj_m_i',
+    '%_EObj_m_s',
+    '%_EObj_n__EObj',
+    '%_EObj_n_b',
+    '%_EObj_n_c',
+    '%_EObj_n_i',
+    '%_EObj_n_s',
+    '%_EObj_o__EObj',
+    '%_EObj_o_b',
+    '%_EObj_o_c',
+    '%_EObj_o_i',
+    '%_EObj_o_s',
+    '%_EObj_p',
+    '%_EObj_p__EObj',
+    '%_EObj_p_b',
+    '%_EObj_p_c',
+    '%_EObj_p_i',
+    '%_EObj_p_s',
+    '%_EObj_q__EObj',
+    '%_EObj_q_b',
+    '%_EObj_q_c',
+    '%_EObj_q_i',
+    '%_EObj_q_s',
+    '%_EObj_r__EObj',
+    '%_EObj_r_b',
+    '%_EObj_r_c',
+    '%_EObj_r_i',
+    '%_EObj_r_s',
+    '%_EObj_s__EObj',
+    '%_EObj_s_b',
+    '%_EObj_s_c',
+    '%_EObj_s_i',
+    '%_EObj_s_s',
+    '%_EObj_t',
+    '%_EObj_x__EObj',
+    '%_EObj_x_b',
+    '%_EObj_x_c',
+    '%_EObj_x_i',
+    '%_EObj_x_s',
+    '%_EObj_y__EObj',
+    '%_EObj_y_b',
+    '%_EObj_y_c',
+    '%_EObj_y_i',
+    '%_EObj_y_s',
+    '%_EObj_z__EObj',
+    '%_EObj_z_b',
+    '%_EObj_z_c',
+    '%_EObj_z_i',
+    '%_EObj_z_s',
+    '%_eigs',
+    '%_load',
+    '%b_1__EObj',
+    '%b_2__EObj',
+    '%b_3__EObj',
+    '%b_4__EObj',
+    '%b_a__EObj',
+    '%b_d__EObj',
+    '%b_g__EObj',
+    '%b_h__EObj',
+    '%b_i_XMLList',
+    '%b_i__EObj',
+    '%b_j__EObj',
+    '%b_k__EObj',
+    '%b_l__EObj',
+    '%b_m__EObj',
+    '%b_n__EObj',
+    '%b_o__EObj',
+    '%b_p__EObj',
+    '%b_q__EObj',
+    '%b_r__EObj',
+    '%b_s__EObj',
+    '%b_x__EObj',
+    '%b_y__EObj',
+    '%b_z__EObj',
+    '%c_1__EObj',
+    '%c_2__EObj',
+    '%c_3__EObj',
+    '%c_4__EObj',
+    '%c_a__EObj',
+    '%c_d__EObj',
+    '%c_g__EObj',
+    '%c_h__EObj',
+    '%c_i_XMLAttr',
+    '%c_i_XMLDoc',
+    '%c_i_XMLElem',
+    '%c_i_XMLList',
+    '%c_i__EObj',
+    '%c_j__EObj',
+    '%c_k__EObj',
+    '%c_l__EObj',
+    '%c_m__EObj',
+    '%c_n__EObj',
+    '%c_o__EObj',
+    '%c_p__EObj',
+    '%c_q__EObj',
+    '%c_r__EObj',
+    '%c_s__EObj',
+    '%c_x__EObj',
+    '%c_y__EObj',
+    '%c_z__EObj',
+    '%ce_i_XMLList',
+    '%fptr_i_XMLList',
+    '%h_i_XMLList',
+    '%hm_i_XMLList',
+    '%i_1__EObj',
+    '%i_2__EObj',
+    '%i_3__EObj',
+    '%i_4__EObj',
+    '%i_a__EObj',
+    '%i_abs',
+    '%i_cumprod',
+    '%i_cumsum',
+    '%i_d__EObj',
+    '%i_diag',
+    '%i_g__EObj',
+    '%i_h__EObj',
+    '%i_i_XMLList',
+    '%i_i__EObj',
+    '%i_j__EObj',
+    '%i_k__EObj',
+    '%i_l__EObj',
+    '%i_m__EObj',
+    '%i_matrix',
+    '%i_max',
+    '%i_maxi',
+    '%i_min',
+    '%i_mini',
+    '%i_mput',
+    '%i_n__EObj',
+    '%i_o__EObj',
+    '%i_p',
+    '%i_p__EObj',
+    '%i_prod',
+    '%i_q__EObj',
+    '%i_r__EObj',
+    '%i_s__EObj',
+    '%i_sum',
+    '%i_tril',
+    '%i_triu',
+    '%i_x__EObj',
+    '%i_y__EObj',
+    '%i_z__EObj',
+    '%ip_i_XMLList',
+    '%l_i_XMLList',
+    '%l_i__EObj',
+    '%lss_i_XMLList',
+    '%mc_i_XMLList',
+    '%msp_full',
+    '%msp_i_XMLList',
+    '%msp_spget',
+    '%p_i_XMLList',
+    '%ptr_i_XMLList',
+    '%r_i_XMLList',
+    '%s_1__EObj',
+    '%s_2__EObj',
+    '%s_3__EObj',
+    '%s_4__EObj',
+    '%s_a__EObj',
+    '%s_d__EObj',
+    '%s_g__EObj',
+    '%s_h__EObj',
+    '%s_i_XMLList',
+    '%s_i__EObj',
+    '%s_j__EObj',
+    '%s_k__EObj',
+    '%s_l__EObj',
+    '%s_m__EObj',
+    '%s_n__EObj',
+    '%s_o__EObj',
+    '%s_p__EObj',
+    '%s_q__EObj',
+    '%s_r__EObj',
+    '%s_s__EObj',
+    '%s_x__EObj',
+    '%s_y__EObj',
+    '%s_z__EObj',
+    '%sp_i_XMLList',
+    '%spb_i_XMLList',
+    '%st_i_XMLList',
+    'Calendar',
+    'ClipBoard',
+    'Matplot',
+    'Matplot1',
+    'PlaySound',
+    'TCL_DeleteInterp',
+    'TCL_DoOneEvent',
+    'TCL_EvalFile',
+    'TCL_EvalStr',
+    'TCL_ExistArray',
+    'TCL_ExistInterp',
+    'TCL_ExistVar',
+    'TCL_GetVar',
+    'TCL_GetVersion',
+    'TCL_SetVar',
+    'TCL_UnsetVar',
+    'TCL_UpVar',
+    '_',
+    '_code2str',
+    '_d',
+    '_str2code',
+    'about',
+    'abs',
+    'acos',
+    'addModulePreferences',
+    'addcolor',
+    'addf',
+    'addhistory',
+    'addinter',
+    'addlocalizationdomain',
+    'amell',
+    'and',
+    'argn',
+    'arl2_ius',
+    'ascii',
+    'asin',
+    'atan',
+    'backslash',
+    'balanc',
+    'banner',
+    'base2dec',
+    'basename',
+    'bdiag',
+    'beep',
+    'besselh',
+    'besseli',
+    'besselj',
+    'besselk',
+    'bessely',
+    'beta',
+    'bezout',
+    'bfinit',
+    'blkfc1i',
+    'blkslvi',
+    'bool2s',
+    'browsehistory',
+    'browsevar',
+    'bsplin3val',
+    'buildDoc',
+    'buildouttb',
+    'bvode',
+    'c_link',
+    'call',
+    'callblk',
+    'captions',
+    'cd',
+    'cdfbet',
+    'cdfbin',
+    'cdfchi',
+    'cdfchn',
+    'cdff',
+    'cdffnc',
+    'cdfgam',
+    'cdfnbn',
+    'cdfnor',
+    'cdfpoi',
+    'cdft',
+    'ceil',
+    'champ',
+    'champ1',
+    'chdir',
+    'chol',
+    'clc',
+    'clean',
+    'clear',
+    'clearfun',
+    'clearglobal',
+    'closeEditor',
+    'closeEditvar',
+    'closeXcos',
+    'code2str',
+    'coeff',
+    'color',
+    'comp',
+    'completion',
+    'conj',
+    'contour2di',
+    'contr',
+    'conv2',
+    'convstr',
+    'copy',
+    'copyfile',
+    'corr',
+    'cos',
+    'coserror',
+    'createdir',
+    'cshep2d',
+    'csvDefault',
+    'csvIsnum',
+    'csvRead',
+    'csvStringToDouble',
+    'csvTextScan',
+    'csvWrite',
+    'ctree2',
+    'ctree3',
+    'ctree4',
+    'cumprod',
+    'cumsum',
+    'curblock',
+    'curblockc',
+    'daskr',
+    'dasrt',
+    'dassl',
+    'data2sig',
+    'datatipCreate',
+    'datatipManagerMode',
+    'datatipMove',
+    'datatipRemove',
+    'datatipSetDisplay',
+    'datatipSetInterp',
+    'datatipSetOrientation',
+    'datatipSetStyle',
+    'datatipToggle',
+    'dawson',
+    'dct',
+    'debug',
+    'dec2base',
+    'deff',
+    'definedfields',
+    'degree',
+    'delbpt',
+    'delete',
+    'deletefile',
+    'delip',
+    'delmenu',
+    'det',
+    'dgettext',
+    'dhinf',
+    'diag',
+    'diary',
+    'diffobjs',
+    'disp',
+    'dispbpt',
+    'displayhistory',
+    'disposefftwlibrary',
+    'dlgamma',
+    'dnaupd',
+    'dneupd',
+    'double',
+    'drawaxis',
+    'drawlater',
+    'drawnow',
+    'driver',
+    'dsaupd',
+    'dsearch',
+    'dseupd',
+    'dst',
+    'duplicate',
+    'editvar',
+    'emptystr',
+    'end_scicosim',
+    'ereduc',
+    'erf',
+    'erfc',
+    'erfcx',
+    'erfi',
+    'errcatch',
+    'errclear',
+    'error',
+    'eval_cshep2d',
+    'exec',
+    'execstr',
+    'exists',
+    'exit',
+    'exp',
+    'expm',
+    'exportUI',
+    'export_to_hdf5',
+    'eye',
+    'fadj2sp',
+    'fec',
+    'feval',
+    'fft',
+    'fftw',
+    'fftw_flags',
+    'fftw_forget_wisdom',
+    'fftwlibraryisloaded',
+    'figure',
+    'file',
+    'filebrowser',
+    'fileext',
+    'fileinfo',
+    'fileparts',
+    'filesep',
+    'find',
+    'findBD',
+    'findfiles',
+    'fire_closing_finished',
+    'floor',
+    'format',
+    'fort',
+    'fprintfMat',
+    'freq',
+    'frexp',
+    'fromc',
+    'fromjava',
+    'fscanfMat',
+    'fsolve',
+    'fstair',
+    'full',
+    'fullpath',
+    'funcprot',
+    'funptr',
+    'gamma',
+    'gammaln',
+    'geom3d',
+    'get',
+    'getURL',
+    'get_absolute_file_path',
+    'get_fftw_wisdom',
+    'getblocklabel',
+    'getcallbackobject',
+    'getdate',
+    'getdebuginfo',
+    'getdefaultlanguage',
+    'getdrives',
+    'getdynlibext',
+    'getenv',
+    'getfield',
+    'gethistory',
+    'gethistoryfile',
+    'getinstalledlookandfeels',
+    'getio',
+    'getlanguage',
+    'getlongpathname',
+    'getlookandfeel',
+    'getmd5',
+    'getmemory',
+    'getmodules',
+    'getos',
+    'getpid',
+    'getrelativefilename',
+    'getscicosvars',
+    'getscilabmode',
+    'getshortpathname',
+    'gettext',
+    'getvariablesonstack',
+    'getversion',
+    'glist',
+    'global',
+    'glue',
+    'grand',
+    'graphicfunction',
+    'grayplot',
+    'grep',
+    'gsort',
+    'gstacksize',
+    'h5attr',
+    'h5close',
+    'h5cp',
+    'h5dataset',
+    'h5dump',
+    'h5exists',
+    'h5flush',
+    'h5get',
+    'h5group',
+    'h5isArray',
+    'h5isAttr',
+    'h5isCompound',
+    'h5isFile',
+    'h5isGroup',
+    'h5isList',
+    'h5isRef',
+    'h5isSet',
+    'h5isSpace',
+    'h5isType',
+    'h5isVlen',
+    'h5label',
+    'h5ln',
+    'h5ls',
+    'h5mount',
+    'h5mv',
+    'h5open',
+    'h5read',
+    'h5readattr',
+    'h5rm',
+    'h5umount',
+    'h5write',
+    'h5writeattr',
+    'havewindow',
+    'helpbrowser',
+    'hess',
+    'hinf',
+    'historymanager',
+    'historysize',
+    'host',
+    'htmlDump',
+    'htmlRead',
+    'htmlReadStr',
+    'htmlWrite',
+    'iconvert',
+    'ieee',
+    'ilib_verbose',
+    'imag',
+    'impl',
+    'import_from_hdf5',
+    'imult',
+    'inpnvi',
+    'int',
+    'int16',
+    'int2d',
+    'int32',
+    'int3d',
+    'int8',
+    'interp',
+    'interp2d',
+    'interp3d',
+    'intg',
+    'intppty',
+    'inttype',
+    'inv',
+    'invoke_lu',
+    'is_handle_valid',
+    'is_hdf5_file',
+    'isalphanum',
+    'isascii',
+    'isdef',
+    'isdigit',
+    'isdir',
+    'isequal',
+    'isequalbitwise',
+    'iserror',
+    'isfile',
+    'isglobal',
+    'isletter',
+    'isnum',
+    'isreal',
+    'iswaitingforinput',
+    'jallowClassReloading',
+    'jarray',
+    'jautoTranspose',
+    'jautoUnwrap',
+    'javaclasspath',
+    'javalibrarypath',
+    'jcast',
+    'jcompile',
+    'jconvMatrixMethod',
+    'jcreatejar',
+    'jdeff',
+    'jdisableTrace',
+    'jenableTrace',
+    'jexists',
+    'jgetclassname',
+    'jgetfield',
+    'jgetfields',
+    'jgetinfo',
+    'jgetmethods',
+    'jimport',
+    'jinvoke',
+    'jinvoke_db',
+    'jnewInstance',
+    'jremove',
+    'jsetfield',
+    'junwrap',
+    'junwraprem',
+    'jwrap',
+    'jwrapinfloat',
+    'kron',
+    'lasterror',
+    'ldiv',
+    'ldivf',
+    'legendre',
+    'length',
+    'lib',
+    'librarieslist',
+    'libraryinfo',
+    'light',
+    'linear_interpn',
+    'lines',
+    'link',
+    'linmeq',
+    'list',
+    'listvar_in_hdf5',
+    'load',
+    'loadGui',
+    'loadScicos',
+    'loadXcos',
+    'loadfftwlibrary',
+    'loadhistory',
+    'log',
+    'log1p',
+    'lsq',
+    'lsq_splin',
+    'lsqrsolve',
+    'lsslist',
+    'lstcat',
+    'lstsize',
+    'ltitr',
+    'lu',
+    'ludel',
+    'lufact',
+    'luget',
+    'lusolve',
+    'macr2lst',
+    'macr2tree',
+    'matfile_close',
+    'matfile_listvar',
+    'matfile_open',
+    'matfile_varreadnext',
+    'matfile_varwrite',
+    'matrix',
+    'max',
+    'maxfiles',
+    'mclearerr',
+    'mclose',
+    'meof',
+    'merror',
+    'messagebox',
+    'mfprintf',
+    'mfscanf',
+    'mget',
+    'mgeti',
+    'mgetl',
+    'mgetstr',
+    'min',
+    'mlist',
+    'mode',
+    'model2blk',
+    'mopen',
+    'move',
+    'movefile',
+    'mprintf',
+    'mput',
+    'mputl',
+    'mputstr',
+    'mscanf',
+    'mseek',
+    'msprintf',
+    'msscanf',
+    'mtell',
+    'mtlb_mode',
+    'mtlb_sparse',
+    'mucomp',
+    'mulf',
+    'name2rgb',
+    'nearfloat',
+    'newaxes',
+    'newest',
+    'newfun',
+    'nnz',
+    'norm',
+    'notify',
+    'number_properties',
+    'ode',
+    'odedc',
+    'ones',
+    'openged',
+    'opentk',
+    'optim',
+    'or',
+    'ordmmd',
+    'parallel_concurrency',
+    'parallel_run',
+    'param3d',
+    'param3d1',
+    'part',
+    'pathconvert',
+    'pathsep',
+    'phase_simulation',
+    'plot2d',
+    'plot2d1',
+    'plot2d2',
+    'plot2d3',
+    'plot2d4',
+    'plot3d',
+    'plot3d1',
+    'plotbrowser',
+    'pointer_xproperty',
+    'poly',
+    'ppol',
+    'pppdiv',
+    'predef',
+    'preferences',
+    'print',
+    'printf',
+    'printfigure',
+    'printsetupbox',
+    'prod',
+    'progressionbar',
+    'prompt',
+    'pwd',
+    'qld',
+    'qp_solve',
+    'qr',
+    'raise_window',
+    'rand',
+    'rankqr',
+    'rat',
+    'rcond',
+    'rdivf',
+    'read',
+    'read4b',
+    'read_csv',
+    'readb',
+    'readgateway',
+    'readmps',
+    'real',
+    'realtime',
+    'realtimeinit',
+    'regexp',
+    'relocate_handle',
+    'remez',
+    'removeModulePreferences',
+    'removedir',
+    'removelinehistory',
+    'res_with_prec',
+    'resethistory',
+    'residu',
+    'resume',
+    'return',
+    'ricc',
+    'rlist',
+    'roots',
+    'rotate_axes',
+    'round',
+    'rpem',
+    'rtitr',
+    'rubberbox',
+    'save',
+    'saveGui',
+    'saveafterncommands',
+    'saveconsecutivecommands',
+    'savehistory',
+    'schur',
+    'sci_haltscicos',
+    'sci_tree2',
+    'sci_tree3',
+    'sci_tree4',
+    'sciargs',
+    'scicos_debug',
+    'scicos_debug_count',
+    'scicos_time',
+    'scicosim',
+    'scinotes',
+    'sctree',
+    'semidef',
+    'set',
+    'set_blockerror',
+    'set_fftw_wisdom',
+    'set_xproperty',
+    'setbpt',
+    'setdefaultlanguage',
+    'setenv',
+    'setfield',
+    'sethistoryfile',
+    'setlanguage',
+    'setlookandfeel',
+    'setmenu',
+    'sfact',
+    'sfinit',
+    'show_window',
+    'sident',
+    'sig2data',
+    'sign',
+    'simp',
+    'simp_mode',
+    'sin',
+    'size',
+    'slash',
+    'sleep',
+    'sorder',
+    'sparse',
+    'spchol',
+    'spcompack',
+    'spec',
+    'spget',
+    'splin',
+    'splin2d',
+    'splin3d',
+    'splitURL',
+    'spones',
+    'sprintf',
+    'sqrt',
+    'stacksize',
+    'str2code',
+    'strcat',
+    'strchr',
+    'strcmp',
+    'strcspn',
+    'strindex',
+    'string',
+    'stringbox',
+    'stripblanks',
+    'strncpy',
+    'strrchr',
+    'strrev',
+    'strsplit',
+    'strspn',
+    'strstr',
+    'strsubst',
+    'strtod',
+    'strtok',
+    'subf',
+    'sum',
+    'svd',
+    'swap_handles',
+    'symfcti',
+    'syredi',
+    'system_getproperty',
+    'system_setproperty',
+    'ta2lpd',
+    'tan',
+    'taucs_chdel',
+    'taucs_chfact',
+    'taucs_chget',
+    'taucs_chinfo',
+    'taucs_chsolve',
+    'tempname',
+    'testmatrix',
+    'timer',
+    'tlist',
+    'tohome',
+    'tokens',
+    'toolbar',
+    'toprint',
+    'tr_zer',
+    'tril',
+    'triu',
+    'type',
+    'typename',
+    'uiDisplayTree',
+    'uicontextmenu',
+    'uicontrol',
+    'uigetcolor',
+    'uigetdir',
+    'uigetfile',
+    'uigetfont',
+    'uimenu',
+    'uint16',
+    'uint32',
+    'uint8',
+    'uipopup',
+    'uiputfile',
+    'uiwait',
+    'ulink',
+    'umf_ludel',
+    'umf_lufact',
+    'umf_luget',
+    'umf_luinfo',
+    'umf_lusolve',
+    'umfpack',
+    'unglue',
+    'unix',
+    'unsetmenu',
+    'unzoom',
+    'updatebrowsevar',
+    'usecanvas',
+    'useeditor',
+    'user',
+    'var2vec',
+    'varn',
+    'vec2var',
+    'waitbar',
+    'warnBlockByUID',
+    'warning',
+    'what',
+    'where',
+    'whereis',
+    'who',
+    'winsid',
+    'with_module',
+    'writb',
+    'write',
+    'write4b',
+    'write_csv',
+    'x_choose',
+    'x_choose_modeless',
+    'x_dialog',
+    'x_mdialog',
+    'xarc',
+    'xarcs',
+    'xarrows',
+    'xchange',
+    'xchoicesi',
+    'xclick',
+    'xcos',
+    'xcosAddToolsMenu',
+    'xcosConfigureXmlFile',
+    'xcosDiagramToScilab',
+    'xcosPalCategoryAdd',
+    'xcosPalDelete',
+    'xcosPalDisable',
+    'xcosPalEnable',
+    'xcosPalGenerateIcon',
+    'xcosPalGet',
+    'xcosPalLoad',
+    'xcosPalMove',
+    'xcosSimulationStarted',
+    'xcosUpdateBlock',
+    'xdel',
+    'xend',
+    'xfarc',
+    'xfarcs',
+    'xfpoly',
+    'xfpolys',
+    'xfrect',
+    'xget',
+    'xgetmouse',
+    'xgraduate',
+    'xgrid',
+    'xinit',
+    'xlfont',
+    'xls_open',
+    'xls_read',
+    'xmlAddNs',
+    'xmlAppend',
+    'xmlAsNumber',
+    'xmlAsText',
+    'xmlDTD',
+    'xmlDelete',
+    'xmlDocument',
+    'xmlDump',
+    'xmlElement',
+    'xmlFormat',
+    'xmlGetNsByHref',
+    'xmlGetNsByPrefix',
+    'xmlGetOpenDocs',
+    'xmlIsValidObject',
+    'xmlName',
+    'xmlNs',
+    'xmlRead',
+    'xmlReadStr',
+    'xmlRelaxNG',
+    'xmlRemove',
+    'xmlSchema',
+    'xmlSetAttributes',
+    'xmlValidate',
+    'xmlWrite',
+    'xmlXPath',
+    'xname',
+    'xpause',
+    'xpoly',
+    'xpolys',
+    'xrect',
+    'xrects',
+    'xs2bmp',
+    'xs2emf',
+    'xs2eps',
+    'xs2gif',
+    'xs2jpg',
+    'xs2pdf',
+    'xs2png',
+    'xs2ppm',
+    'xs2ps',
+    'xs2svg',
+    'xsegs',
+    'xset',
+    'xstring',
+    'xstringb',
+    'xtitle',
+    'zeros',
+    'znaupd',
+    'zneupd',
+    'zoom_rect',
+)
+
+macros_kw = (
+    '!_deff_wrapper',
+    '%0_i_st',
+    '%3d_i_h',
+    '%Block_xcosUpdateBlock',
+    '%TNELDER_p',
+    '%TNELDER_string',
+    '%TNMPLOT_p',
+    '%TNMPLOT_string',
+    '%TOPTIM_p',
+    '%TOPTIM_string',
+    '%TSIMPLEX_p',
+    '%TSIMPLEX_string',
+    '%_EVoid_p',
+    '%_gsort',
+    '%_listvarinfile',
+    '%_rlist',
+    '%_save',
+    '%_sodload',
+    '%_strsplit',
+    '%_unwrap',
+    '%ar_p',
+    '%asn',
+    '%b_a_b',
+    '%b_a_s',
+    '%b_c_s',
+    '%b_c_spb',
+    '%b_cumprod',
+    '%b_cumsum',
+    '%b_d_s',
+    '%b_diag',
+    '%b_e',
+    '%b_f_s',
+    '%b_f_spb',
+    '%b_g_s',
+    '%b_g_spb',
+    '%b_grand',
+    '%b_h_s',
+    '%b_h_spb',
+    '%b_i_b',
+    '%b_i_ce',
+    '%b_i_h',
+    '%b_i_hm',
+    '%b_i_s',
+    '%b_i_sp',
+    '%b_i_spb',
+    '%b_i_st',
+    '%b_iconvert',
+    '%b_l_b',
+    '%b_l_s',
+    '%b_m_b',
+    '%b_m_s',
+    '%b_matrix',
+    '%b_n_hm',
+    '%b_o_hm',
+    '%b_p_s',
+    '%b_prod',
+    '%b_r_b',
+    '%b_r_s',
+    '%b_s_b',
+    '%b_s_s',
+    '%b_string',
+    '%b_sum',
+    '%b_tril',
+    '%b_triu',
+    '%b_x_b',
+    '%b_x_s',
+    '%bicg',
+    '%bicgstab',
+    '%c_a_c',
+    '%c_b_c',
+    '%c_b_s',
+    '%c_diag',
+    '%c_dsearch',
+    '%c_e',
+    '%c_eye',
+    '%c_f_s',
+    '%c_grand',
+    '%c_i_c',
+    '%c_i_ce',
+    '%c_i_h',
+    '%c_i_hm',
+    '%c_i_lss',
+    '%c_i_r',
+    '%c_i_s',
+    '%c_i_st',
+    '%c_matrix',
+    '%c_n_l',
+    '%c_n_st',
+    '%c_o_l',
+    '%c_o_st',
+    '%c_ones',
+    '%c_rand',
+    '%c_tril',
+    '%c_triu',
+    '%cblock_c_cblock',
+    '%cblock_c_s',
+    '%cblock_e',
+    '%cblock_f_cblock',
+    '%cblock_p',
+    '%cblock_size',
+    '%ce_6',
+    '%ce_c_ce',
+    '%ce_e',
+    '%ce_f_ce',
+    '%ce_i_ce',
+    '%ce_i_s',
+    '%ce_i_st',
+    '%ce_matrix',
+    '%ce_p',
+    '%ce_size',
+    '%ce_string',
+    '%ce_t',
+    '%cgs',
+    '%champdat_i_h',
+    '%choose',
+    '%diagram_xcos',
+    '%dir_p',
+    '%fptr_i_st',
+    '%grand_perm',
+    '%grayplot_i_h',
+    '%h_i_st',
+    '%hmS_k_hmS_generic',
+    '%hm_1_hm',
+    '%hm_1_s',
+    '%hm_2_hm',
+    '%hm_2_s',
+    '%hm_3_hm',
+    '%hm_3_s',
+    '%hm_4_hm',
+    '%hm_4_s',
+    '%hm_5',
+    '%hm_a_hm',
+    '%hm_a_r',
+    '%hm_a_s',
+    '%hm_abs',
+    '%hm_and',
+    '%hm_bool2s',
+    '%hm_c_hm',
+    '%hm_ceil',
+    '%hm_conj',
+    '%hm_cos',
+    '%hm_cumprod',
+    '%hm_cumsum',
+    '%hm_d_hm',
+    '%hm_d_s',
+    '%hm_degree',
+    '%hm_dsearch',
+    '%hm_e',
+    '%hm_exp',
+    '%hm_eye',
+    '%hm_f_hm',
+    '%hm_find',
+    '%hm_floor',
+    '%hm_g_hm',
+    '%hm_grand',
+    '%hm_gsort',
+    '%hm_h_hm',
+    '%hm_i_b',
+    '%hm_i_ce',
+    '%hm_i_h',
+    '%hm_i_hm',
+    '%hm_i_i',
+    '%hm_i_p',
+    '%hm_i_r',
+    '%hm_i_s',
+    '%hm_i_st',
+    '%hm_iconvert',
+    '%hm_imag',
+    '%hm_int',
+    '%hm_isnan',
+    '%hm_isreal',
+    '%hm_j_hm',
+    '%hm_j_s',
+    '%hm_k_hm',
+    '%hm_k_s',
+    '%hm_log',
+    '%hm_m_p',
+    '%hm_m_r',
+    '%hm_m_s',
+    '%hm_matrix',
+    '%hm_max',
+    '%hm_mean',
+    '%hm_median',
+    '%hm_min',
+    '%hm_n_b',
+    '%hm_n_c',
+    '%hm_n_hm',
+    '%hm_n_i',
+    '%hm_n_p',
+    '%hm_n_s',
+    '%hm_o_b',
+    '%hm_o_c',
+    '%hm_o_hm',
+    '%hm_o_i',
+    '%hm_o_p',
+    '%hm_o_s',
+    '%hm_ones',
+    '%hm_or',
+    '%hm_p',
+    '%hm_prod',
+    '%hm_q_hm',
+    '%hm_r_s',
+    '%hm_rand',
+    '%hm_real',
+    '%hm_round',
+    '%hm_s',
+    '%hm_s_hm',
+    '%hm_s_r',
+    '%hm_s_s',
+    '%hm_sign',
+    '%hm_sin',
+    '%hm_size',
+    '%hm_sqrt',
+    '%hm_stdev',
+    '%hm_string',
+    '%hm_sum',
+    '%hm_x_hm',
+    '%hm_x_p',
+    '%hm_x_s',
+    '%hm_zeros',
+    '%i_1_s',
+    '%i_2_s',
+    '%i_3_s',
+    '%i_4_s',
+    '%i_Matplot',
+    '%i_a_i',
+    '%i_a_s',
+    '%i_and',
+    '%i_ascii',
+    '%i_b_s',
+    '%i_bezout',
+    '%i_champ',
+    '%i_champ1',
+    '%i_contour',
+    '%i_contour2d',
+    '%i_d_i',
+    '%i_d_s',
+    '%i_dsearch',
+    '%i_e',
+    '%i_fft',
+    '%i_g_i',
+    '%i_gcd',
+    '%i_grand',
+    '%i_h_i',
+    '%i_i_ce',
+    '%i_i_h',
+    '%i_i_hm',
+    '%i_i_i',
+    '%i_i_s',
+    '%i_i_st',
+    '%i_j_i',
+    '%i_j_s',
+    '%i_l_s',
+    '%i_lcm',
+    '%i_length',
+    '%i_m_i',
+    '%i_m_s',
+    '%i_mfprintf',
+    '%i_mprintf',
+    '%i_msprintf',
+    '%i_n_s',
+    '%i_o_s',
+    '%i_or',
+    '%i_p_i',
+    '%i_p_s',
+    '%i_plot2d',
+    '%i_plot2d1',
+    '%i_plot2d2',
+    '%i_q_s',
+    '%i_r_i',
+    '%i_r_s',
+    '%i_round',
+    '%i_s_i',
+    '%i_s_s',
+    '%i_sign',
+    '%i_string',
+    '%i_x_i',
+    '%i_x_s',
+    '%ip_a_s',
+    '%ip_i_st',
+    '%ip_m_s',
+    '%ip_n_ip',
+    '%ip_o_ip',
+    '%ip_p',
+    '%ip_part',
+    '%ip_s_s',
+    '%ip_string',
+    '%k',
+    '%l_i_h',
+    '%l_i_s',
+    '%l_i_st',
+    '%l_isequal',
+    '%l_n_c',
+    '%l_n_l',
+    '%l_n_m',
+    '%l_n_p',
+    '%l_n_s',
+    '%l_n_st',
+    '%l_o_c',
+    '%l_o_l',
+    '%l_o_m',
+    '%l_o_p',
+    '%l_o_s',
+    '%l_o_st',
+    '%lss_a_lss',
+    '%lss_a_p',
+    '%lss_a_r',
+    '%lss_a_s',
+    '%lss_c_lss',
+    '%lss_c_p',
+    '%lss_c_r',
+    '%lss_c_s',
+    '%lss_e',
+    '%lss_eye',
+    '%lss_f_lss',
+    '%lss_f_p',
+    '%lss_f_r',
+    '%lss_f_s',
+    '%lss_i_ce',
+    '%lss_i_lss',
+    '%lss_i_p',
+    '%lss_i_r',
+    '%lss_i_s',
+    '%lss_i_st',
+    '%lss_inv',
+    '%lss_l_lss',
+    '%lss_l_p',
+    '%lss_l_r',
+    '%lss_l_s',
+    '%lss_m_lss',
+    '%lss_m_p',
+    '%lss_m_r',
+    '%lss_m_s',
+    '%lss_n_lss',
+    '%lss_n_p',
+    '%lss_n_r',
+    '%lss_n_s',
+    '%lss_norm',
+    '%lss_o_lss',
+    '%lss_o_p',
+    '%lss_o_r',
+    '%lss_o_s',
+    '%lss_ones',
+    '%lss_r_lss',
+    '%lss_r_p',
+    '%lss_r_r',
+    '%lss_r_s',
+    '%lss_rand',
+    '%lss_s',
+    '%lss_s_lss',
+    '%lss_s_p',
+    '%lss_s_r',
+    '%lss_s_s',
+    '%lss_size',
+    '%lss_t',
+    '%lss_v_lss',
+    '%lss_v_p',
+    '%lss_v_r',
+    '%lss_v_s',
+    '%lt_i_s',
+    '%m_n_l',
+    '%m_o_l',
+    '%mc_i_h',
+    '%mc_i_s',
+    '%mc_i_st',
+    '%mc_n_st',
+    '%mc_o_st',
+    '%mc_string',
+    '%mps_p',
+    '%mps_string',
+    '%msp_a_s',
+    '%msp_abs',
+    '%msp_e',
+    '%msp_find',
+    '%msp_i_s',
+    '%msp_i_st',
+    '%msp_length',
+    '%msp_m_s',
+    '%msp_maxi',
+    '%msp_n_msp',
+    '%msp_nnz',
+    '%msp_o_msp',
+    '%msp_p',
+    '%msp_sparse',
+    '%msp_spones',
+    '%msp_t',
+    '%p_a_lss',
+    '%p_a_r',
+    '%p_c_lss',
+    '%p_c_r',
+    '%p_cumprod',
+    '%p_cumsum',
+    '%p_d_p',
+    '%p_d_r',
+    '%p_d_s',
+    '%p_det',
+    '%p_e',
+    '%p_f_lss',
+    '%p_f_r',
+    '%p_grand',
+    '%p_i_ce',
+    '%p_i_h',
+    '%p_i_hm',
+    '%p_i_lss',
+    '%p_i_p',
+    '%p_i_r',
+    '%p_i_s',
+    '%p_i_st',
+    '%p_inv',
+    '%p_j_s',
+    '%p_k_p',
+    '%p_k_r',
+    '%p_k_s',
+    '%p_l_lss',
+    '%p_l_p',
+    '%p_l_r',
+    '%p_l_s',
+    '%p_m_hm',
+    '%p_m_lss',
+    '%p_m_r',
+    '%p_matrix',
+    '%p_n_l',
+    '%p_n_lss',
+    '%p_n_r',
+    '%p_o_l',
+    '%p_o_lss',
+    '%p_o_r',
+    '%p_o_sp',
+    '%p_p_s',
+    '%p_part',
+    '%p_prod',
+    '%p_q_p',
+    '%p_q_r',
+    '%p_q_s',
+    '%p_r_lss',
+    '%p_r_p',
+    '%p_r_r',
+    '%p_r_s',
+    '%p_s_lss',
+    '%p_s_r',
+    '%p_simp',
+    '%p_string',
+    '%p_sum',
+    '%p_v_lss',
+    '%p_v_p',
+    '%p_v_r',
+    '%p_v_s',
+    '%p_x_hm',
+    '%p_x_r',
+    '%p_y_p',
+    '%p_y_r',
+    '%p_y_s',
+    '%p_z_p',
+    '%p_z_r',
+    '%p_z_s',
+    '%pcg',
+    '%plist_p',
+    '%plist_string',
+    '%r_0',
+    '%r_a_hm',
+    '%r_a_lss',
+    '%r_a_p',
+    '%r_a_r',
+    '%r_a_s',
+    '%r_c_lss',
+    '%r_c_p',
+    '%r_c_r',
+    '%r_c_s',
+    '%r_clean',
+    '%r_cumprod',
+    '%r_cumsum',
+    '%r_d_p',
+    '%r_d_r',
+    '%r_d_s',
+    '%r_det',
+    '%r_diag',
+    '%r_e',
+    '%r_eye',
+    '%r_f_lss',
+    '%r_f_p',
+    '%r_f_r',
+    '%r_f_s',
+    '%r_i_ce',
+    '%r_i_hm',
+    '%r_i_lss',
+    '%r_i_p',
+    '%r_i_r',
+    '%r_i_s',
+    '%r_i_st',
+    '%r_inv',
+    '%r_j_s',
+    '%r_k_p',
+    '%r_k_r',
+    '%r_k_s',
+    '%r_l_lss',
+    '%r_l_p',
+    '%r_l_r',
+    '%r_l_s',
+    '%r_m_hm',
+    '%r_m_lss',
+    '%r_m_p',
+    '%r_m_r',
+    '%r_m_s',
+    '%r_matrix',
+    '%r_n_lss',
+    '%r_n_p',
+    '%r_n_r',
+    '%r_n_s',
+    '%r_norm',
+    '%r_o_lss',
+    '%r_o_p',
+    '%r_o_r',
+    '%r_o_s',
+    '%r_ones',
+    '%r_p',
+    '%r_p_s',
+    '%r_prod',
+    '%r_q_p',
+    '%r_q_r',
+    '%r_q_s',
+    '%r_r_lss',
+    '%r_r_p',
+    '%r_r_r',
+    '%r_r_s',
+    '%r_rand',
+    '%r_s',
+    '%r_s_hm',
+    '%r_s_lss',
+    '%r_s_p',
+    '%r_s_r',
+    '%r_s_s',
+    '%r_simp',
+    '%r_size',
+    '%r_string',
+    '%r_sum',
+    '%r_t',
+    '%r_tril',
+    '%r_triu',
+    '%r_v_lss',
+    '%r_v_p',
+    '%r_v_r',
+    '%r_v_s',
+    '%r_varn',
+    '%r_x_p',
+    '%r_x_r',
+    '%r_x_s',
+    '%r_y_p',
+    '%r_y_r',
+    '%r_y_s',
+    '%r_z_p',
+    '%r_z_r',
+    '%r_z_s',
+    '%s_1_hm',
+    '%s_1_i',
+    '%s_2_hm',
+    '%s_2_i',
+    '%s_3_hm',
+    '%s_3_i',
+    '%s_4_hm',
+    '%s_4_i',
+    '%s_5',
+    '%s_a_b',
+    '%s_a_hm',
+    '%s_a_i',
+    '%s_a_ip',
+    '%s_a_lss',
+    '%s_a_msp',
+    '%s_a_r',
+    '%s_a_sp',
+    '%s_and',
+    '%s_b_i',
+    '%s_b_s',
+    '%s_bezout',
+    '%s_c_b',
+    '%s_c_cblock',
+    '%s_c_lss',
+    '%s_c_r',
+    '%s_c_sp',
+    '%s_d_b',
+    '%s_d_i',
+    '%s_d_p',
+    '%s_d_r',
+    '%s_d_sp',
+    '%s_e',
+    '%s_f_b',
+    '%s_f_cblock',
+    '%s_f_lss',
+    '%s_f_r',
+    '%s_f_sp',
+    '%s_g_b',
+    '%s_g_s',
+    '%s_gcd',
+    '%s_grand',
+    '%s_h_b',
+    '%s_h_s',
+    '%s_i_b',
+    '%s_i_c',
+    '%s_i_ce',
+    '%s_i_h',
+    '%s_i_hm',
+    '%s_i_i',
+    '%s_i_lss',
+    '%s_i_p',
+    '%s_i_r',
+    '%s_i_s',
+    '%s_i_sp',
+    '%s_i_spb',
+    '%s_i_st',
+    '%s_j_i',
+    '%s_k_hm',
+    '%s_k_p',
+    '%s_k_r',
+    '%s_k_sp',
+    '%s_l_b',
+    '%s_l_hm',
+    '%s_l_i',
+    '%s_l_lss',
+    '%s_l_p',
+    '%s_l_r',
+    '%s_l_s',
+    '%s_l_sp',
+    '%s_lcm',
+    '%s_m_b',
+    '%s_m_hm',
+    '%s_m_i',
+    '%s_m_ip',
+    '%s_m_lss',
+    '%s_m_msp',
+    '%s_m_r',
+    '%s_matrix',
+    '%s_n_hm',
+    '%s_n_i',
+    '%s_n_l',
+    '%s_n_lss',
+    '%s_n_r',
+    '%s_n_st',
+    '%s_o_hm',
+    '%s_o_i',
+    '%s_o_l',
+    '%s_o_lss',
+    '%s_o_r',
+    '%s_o_st',
+    '%s_or',
+    '%s_p_b',
+    '%s_p_i',
+    '%s_pow',
+    '%s_q_hm',
+    '%s_q_i',
+    '%s_q_p',
+    '%s_q_r',
+    '%s_q_sp',
+    '%s_r_b',
+    '%s_r_i',
+    '%s_r_lss',
+    '%s_r_p',
+    '%s_r_r',
+    '%s_r_s',
+    '%s_r_sp',
+    '%s_s_b',
+    '%s_s_hm',
+    '%s_s_i',
+    '%s_s_ip',
+    '%s_s_lss',
+    '%s_s_r',
+    '%s_s_sp',
+    '%s_simp',
+    '%s_v_lss',
+    '%s_v_p',
+    '%s_v_r',
+    '%s_v_s',
+    '%s_x_b',
+    '%s_x_hm',
+    '%s_x_i',
+    '%s_x_r',
+    '%s_y_p',
+    '%s_y_r',
+    '%s_y_sp',
+    '%s_z_p',
+    '%s_z_r',
+    '%s_z_sp',
+    '%sn',
+    '%sp_a_s',
+    '%sp_a_sp',
+    '%sp_and',
+    '%sp_c_s',
+    '%sp_ceil',
+    '%sp_conj',
+    '%sp_cos',
+    '%sp_cumprod',
+    '%sp_cumsum',
+    '%sp_d_s',
+    '%sp_d_sp',
+    '%sp_det',
+    '%sp_diag',
+    '%sp_e',
+    '%sp_exp',
+    '%sp_f_s',
+    '%sp_floor',
+    '%sp_grand',
+    '%sp_gsort',
+    '%sp_i_ce',
+    '%sp_i_h',
+    '%sp_i_s',
+    '%sp_i_sp',
+    '%sp_i_st',
+    '%sp_int',
+    '%sp_inv',
+    '%sp_k_s',
+    '%sp_k_sp',
+    '%sp_l_s',
+    '%sp_l_sp',
+    '%sp_length',
+    '%sp_max',
+    '%sp_min',
+    '%sp_norm',
+    '%sp_or',
+    '%sp_p_s',
+    '%sp_prod',
+    '%sp_q_s',
+    '%sp_q_sp',
+    '%sp_r_s',
+    '%sp_r_sp',
+    '%sp_round',
+    '%sp_s_s',
+    '%sp_s_sp',
+    '%sp_sin',
+    '%sp_sqrt',
+    '%sp_string',
+    '%sp_sum',
+    '%sp_tril',
+    '%sp_triu',
+    '%sp_y_s',
+    '%sp_y_sp',
+    '%sp_z_s',
+    '%sp_z_sp',
+    '%spb_and',
+    '%spb_c_b',
+    '%spb_cumprod',
+    '%spb_cumsum',
+    '%spb_diag',
+    '%spb_e',
+    '%spb_f_b',
+    '%spb_g_b',
+    '%spb_g_spb',
+    '%spb_h_b',
+    '%spb_h_spb',
+    '%spb_i_b',
+    '%spb_i_ce',
+    '%spb_i_h',
+    '%spb_i_st',
+    '%spb_or',
+    '%spb_prod',
+    '%spb_sum',
+    '%spb_tril',
+    '%spb_triu',
+    '%st_6',
+    '%st_c_st',
+    '%st_e',
+    '%st_f_st',
+    '%st_i_b',
+    '%st_i_c',
+    '%st_i_fptr',
+    '%st_i_h',
+    '%st_i_i',
+    '%st_i_ip',
+    '%st_i_lss',
+    '%st_i_msp',
+    '%st_i_p',
+    '%st_i_r',
+    '%st_i_s',
+    '%st_i_sp',
+    '%st_i_spb',
+    '%st_i_st',
+    '%st_matrix',
+    '%st_n_c',
+    '%st_n_l',
+    '%st_n_mc',
+    '%st_n_p',
+    '%st_n_s',
+    '%st_o_c',
+    '%st_o_l',
+    '%st_o_mc',
+    '%st_o_p',
+    '%st_o_s',
+    '%st_o_tl',
+    '%st_p',
+    '%st_size',
+    '%st_string',
+    '%st_t',
+    '%ticks_i_h',
+    '%xls_e',
+    '%xls_p',
+    '%xlssheet_e',
+    '%xlssheet_p',
+    '%xlssheet_size',
+    '%xlssheet_string',
+    'DominationRank',
+    'G_make',
+    'IsAScalar',
+    'NDcost',
+    'OS_Version',
+    'PlotSparse',
+    'ReadHBSparse',
+    'TCL_CreateSlave',
+    'abcd',
+    'abinv',
+    'accept_func_default',
+    'accept_func_vfsa',
+    'acf',
+    'acosd',
+    'acosh',
+    'acoshm',
+    'acosm',
+    'acot',
+    'acotd',
+    'acoth',
+    'acsc',
+    'acscd',
+    'acsch',
+    'add_demo',
+    'add_help_chapter',
+    'add_module_help_chapter',
+    'add_param',
+    'add_profiling',
+    'adj2sp',
+    'aff2ab',
+    'ana_style',
+    'analpf',
+    'analyze',
+    'aplat',
+    'arhnk',
+    'arl2',
+    'arma2p',
+    'arma2ss',
+    'armac',
+    'armax',
+    'armax1',
+    'arobasestring2strings',
+    'arsimul',
+    'ascii2string',
+    'asciimat',
+    'asec',
+    'asecd',
+    'asech',
+    'asind',
+    'asinh',
+    'asinhm',
+    'asinm',
+    'assert_checkalmostequal',
+    'assert_checkequal',
+    'assert_checkerror',
+    'assert_checkfalse',
+    'assert_checkfilesequal',
+    'assert_checktrue',
+    'assert_comparecomplex',
+    'assert_computedigits',
+    'assert_cond2reltol',
+    'assert_cond2reqdigits',
+    'assert_generror',
+    'atand',
+    'atanh',
+    'atanhm',
+    'atanm',
+    'atomsAutoload',
+    'atomsAutoloadAdd',
+    'atomsAutoloadDel',
+    'atomsAutoloadList',
+    'atomsCategoryList',
+    'atomsCheckModule',
+    'atomsDepTreeShow',
+    'atomsGetConfig',
+    'atomsGetInstalled',
+    'atomsGetInstalledPath',
+    'atomsGetLoaded',
+    'atomsGetLoadedPath',
+    'atomsInstall',
+    'atomsIsInstalled',
+    'atomsIsLoaded',
+    'atomsList',
+    'atomsLoad',
+    'atomsQuit',
+    'atomsRemove',
+    'atomsRepositoryAdd',
+    'atomsRepositoryDel',
+    'atomsRepositoryList',
+    'atomsRestoreConfig',
+    'atomsSaveConfig',
+    'atomsSearch',
+    'atomsSetConfig',
+    'atomsShow',
+    'atomsSystemInit',
+    'atomsSystemUpdate',
+    'atomsTest',
+    'atomsUpdate',
+    'atomsVersion',
+    'augment',
+    'auread',
+    'auwrite',
+    'balreal',
+    'bench_run',
+    'bilin',
+    'bilt',
+    'bin2dec',
+    'binomial',
+    'bitand',
+    'bitcmp',
+    'bitget',
+    'bitor',
+    'bitset',
+    'bitxor',
+    'black',
+    'blanks',
+    'bloc2exp',
+    'bloc2ss',
+    'block_parameter_error',
+    'bode',
+    'bode_asymp',
+    'bstap',
+    'buttmag',
+    'bvodeS',
+    'bytecode',
+    'bytecodewalk',
+    'cainv',
+    'calendar',
+    'calerf',
+    'calfrq',
+    'canon',
+    'casc',
+    'cat',
+    'cat_code',
+    'cb_m2sci_gui',
+    'ccontrg',
+    'cell',
+    'cell2mat',
+    'cellstr',
+    'center',
+    'cepstrum',
+    'cfspec',
+    'char',
+    'chart',
+    'cheb1mag',
+    'cheb2mag',
+    'check_gateways',
+    'check_modules_xml',
+    'check_versions',
+    'chepol',
+    'chfact',
+    'chsolve',
+    'classmarkov',
+    'clean_help',
+    'clock',
+    'cls2dls',
+    'cmb_lin',
+    'cmndred',
+    'cmoment',
+    'coding_ga_binary',
+    'coding_ga_identity',
+    'coff',
+    'coffg',
+    'colcomp',
+    'colcompr',
+    'colinout',
+    'colregul',
+    'companion',
+    'complex',
+    'compute_initial_temp',
+    'cond',
+    'cond2sp',
+    'condestsp',
+    'configure_msifort',
+    'configure_msvc',
+    'conjgrad',
+    'cont_frm',
+    'cont_mat',
+    'contrss',
+    'conv',
+    'convert_to_float',
+    'convertindex',
+    'convol',
+    'convol2d',
+    'copfac',
+    'correl',
+    'cosd',
+    'cosh',
+    'coshm',
+    'cosm',
+    'cotd',
+    'cotg',
+    'coth',
+    'cothm',
+    'cov',
+    'covar',
+    'createXConfiguration',
+    'createfun',
+    'createstruct',
+    'cross',
+    'crossover_ga_binary',
+    'crossover_ga_default',
+    'csc',
+    'cscd',
+    'csch',
+    'csgn',
+    'csim',
+    'cspect',
+    'ctr_gram',
+    'czt',
+    'dae',
+    'daeoptions',
+    'damp',
+    'datafit',
+    'date',
+    'datenum',
+    'datevec',
+    'dbphi',
+    'dcf',
+    'ddp',
+    'dec2bin',
+    'dec2hex',
+    'dec2oct',
+    'del_help_chapter',
+    'del_module_help_chapter',
+    'demo_begin',
+    'demo_choose',
+    'demo_compiler',
+    'demo_end',
+    'demo_file_choice',
+    'demo_folder_choice',
+    'demo_function_choice',
+    'demo_gui',
+    'demo_run',
+    'demo_viewCode',
+    'denom',
+    'derivat',
+    'derivative',
+    'des2ss',
+    'des2tf',
+    'detectmsifort64tools',
+    'detectmsvc64tools',
+    'determ',
+    'detr',
+    'detrend',
+    'devtools_run_builder',
+    'dhnorm',
+    'diff',
+    'diophant',
+    'dir',
+    'dirname',
+    'dispfiles',
+    'dllinfo',
+    'dscr',
+    'dsimul',
+    'dt_ility',
+    'dtsi',
+    'edit',
+    'edit_error',
+    'editor',
+    'eigenmarkov',
+    'eigs',
+    'ell1mag',
+    'enlarge_shape',
+    'entropy',
+    'eomday',
+    'epred',
+    'eqfir',
+    'eqiir',
+    'equil',
+    'equil1',
+    'erfinv',
+    'etime',
+    'eval',
+    'evans',
+    'evstr',
+    'example_run',
+    'expression2code',
+    'extract_help_examples',
+    'factor',
+    'factorial',
+    'factors',
+    'faurre',
+    'ffilt',
+    'fft2',
+    'fftshift',
+    'fieldnames',
+    'filt_sinc',
+    'filter',
+    'findABCD',
+    'findAC',
+    'findBDK',
+    'findR',
+    'find_freq',
+    'find_links',
+    'find_scicos_version',
+    'findm',
+    'findmsifortcompiler',
+    'findmsvccompiler',
+    'findx0BD',
+    'firstnonsingleton',
+    'fix',
+    'fixedpointgcd',
+    'flipdim',
+    'flts',
+    'fminsearch',
+    'formatBlackTip',
+    'formatBodeMagTip',
+    'formatBodePhaseTip',
+    'formatGainplotTip',
+    'formatHallModuleTip',
+    'formatHallPhaseTip',
+    'formatNicholsGainTip',
+    'formatNicholsPhaseTip',
+    'formatNyquistTip',
+    'formatPhaseplotTip',
+    'formatSgridDampingTip',
+    'formatSgridFreqTip',
+    'formatZgridDampingTip',
+    'formatZgridFreqTip',
+    'format_txt',
+    'fourplan',
+    'frep2tf',
+    'freson',
+    'frfit',
+    'frmag',
+    'fseek_origin',
+    'fsfirlin',
+    'fspec',
+    'fspecg',
+    'fstabst',
+    'ftest',
+    'ftuneq',
+    'fullfile',
+    'fullrf',
+    'fullrfk',
+    'fun2string',
+    'g_margin',
+    'gainplot',
+    'gamitg',
+    'gcare',
+    'gcd',
+    'gencompilationflags_unix',
+    'generateBlockImage',
+    'generateBlockImages',
+    'generic_i_ce',
+    'generic_i_h',
+    'generic_i_hm',
+    'generic_i_s',
+    'generic_i_st',
+    'genlib',
+    'genmarkov',
+    'geomean',
+    'getDiagramVersion',
+    'getModelicaPath',
+    'getPreferencesValue',
+    'get_file_path',
+    'get_function_path',
+    'get_param',
+    'get_profile',
+    'get_scicos_version',
+    'getd',
+    'getscilabkeywords',
+    'getshell',
+    'gettklib',
+    'gfare',
+    'gfrancis',
+    'givens',
+    'glever',
+    'gmres',
+    'group',
+    'gschur',
+    'gspec',
+    'gtild',
+    'h2norm',
+    'h_cl',
+    'h_inf',
+    'h_inf_st',
+    'h_norm',
+    'hallchart',
+    'halt',
+    'hank',
+    'hankelsv',
+    'harmean',
+    'haveacompiler',
+    'head_comments',
+    'help_from_sci',
+    'help_skeleton',
+    'hermit',
+    'hex2dec',
+    'hilb',
+    'hilbert',
+    'histc',
+    'horner',
+    'householder',
+    'hrmt',
+    'htrianr',
+    'hypermat',
+    'idct',
+    'idst',
+    'ifft',
+    'ifftshift',
+    'iir',
+    'iirgroup',
+    'iirlp',
+    'iirmod',
+    'ilib_build',
+    'ilib_build_jar',
+    'ilib_compile',
+    'ilib_for_link',
+    'ilib_gen_Make',
+    'ilib_gen_Make_unix',
+    'ilib_gen_cleaner',
+    'ilib_gen_gateway',
+    'ilib_gen_loader',
+    'ilib_include_flag',
+    'ilib_mex_build',
+    'im_inv',
+    'importScicosDiagram',
+    'importScicosPal',
+    'importXcosDiagram',
+    'imrep2ss',
+    'ind2sub',
+    'inistate',
+    'init_ga_default',
+    'init_param',
+    'initial_scicos_tables',
+    'input',
+    'instruction2code',
+    'intc',
+    'intdec',
+    'integrate',
+    'interp1',
+    'interpln',
+    'intersect',
+    'intl',
+    'intsplin',
+    'inttrap',
+    'inv_coeff',
+    'invr',
+    'invrs',
+    'invsyslin',
+    'iqr',
+    'isLeapYear',
+    'is_absolute_path',
+    'is_param',
+    'iscell',
+    'iscellstr',
+    'iscolumn',
+    'isempty',
+    'isfield',
+    'isinf',
+    'ismatrix',
+    'isnan',
+    'isrow',
+    'isscalar',
+    'issparse',
+    'issquare',
+    'isstruct',
+    'isvector',
+    'jmat',
+    'justify',
+    'kalm',
+    'karmarkar',
+    'kernel',
+    'kpure',
+    'krac2',
+    'kroneck',
+    'lattn',
+    'lattp',
+    'launchtest',
+    'lcf',
+    'lcm',
+    'lcmdiag',
+    'leastsq',
+    'leqe',
+    'leqr',
+    'lev',
+    'levin',
+    'lex_sort',
+    'lft',
+    'lin',
+    'lin2mu',
+    'lincos',
+    'lindquist',
+    'linf',
+    'linfn',
+    'linsolve',
+    'linspace',
+    'list2vec',
+    'list_param',
+    'listfiles',
+    'listfunctions',
+    'listvarinfile',
+    'lmisolver',
+    'lmitool',
+    'loadXcosLibs',
+    'loadmatfile',
+    'loadwave',
+    'log10',
+    'log2',
+    'logm',
+    'logspace',
+    'lqe',
+    'lqg',
+    'lqg2stan',
+    'lqg_ltr',
+    'lqr',
+    'ls',
+    'lyap',
+    'm2sci_gui',
+    'm_circle',
+    'macglov',
+    'macrovar',
+    'mad',
+    'makecell',
+    'manedit',
+    'mapsound',
+    'markp2ss',
+    'matfile2sci',
+    'mdelete',
+    'mean',
+    'meanf',
+    'median',
+    'members',
+    'mese',
+    'meshgrid',
+    'mfft',
+    'mfile2sci',
+    'minreal',
+    'minss',
+    'mkdir',
+    'modulo',
+    'moment',
+    'mrfit',
+    'msd',
+    'mstr2sci',
+    'mtlb',
+    'mtlb_0',
+    'mtlb_a',
+    'mtlb_all',
+    'mtlb_any',
+    'mtlb_axes',
+    'mtlb_axis',
+    'mtlb_beta',
+    'mtlb_box',
+    'mtlb_choices',
+    'mtlb_close',
+    'mtlb_colordef',
+    'mtlb_cond',
+    'mtlb_cov',
+    'mtlb_cumprod',
+    'mtlb_cumsum',
+    'mtlb_dec2hex',
+    'mtlb_delete',
+    'mtlb_diag',
+    'mtlb_diff',
+    'mtlb_dir',
+    'mtlb_double',
+    'mtlb_e',
+    'mtlb_echo',
+    'mtlb_error',
+    'mtlb_eval',
+    'mtlb_exist',
+    'mtlb_eye',
+    'mtlb_false',
+    'mtlb_fft',
+    'mtlb_fftshift',
+    'mtlb_filter',
+    'mtlb_find',
+    'mtlb_findstr',
+    'mtlb_fliplr',
+    'mtlb_fopen',
+    'mtlb_format',
+    'mtlb_fprintf',
+    'mtlb_fread',
+    'mtlb_fscanf',
+    'mtlb_full',
+    'mtlb_fwrite',
+    'mtlb_get',
+    'mtlb_grid',
+    'mtlb_hold',
+    'mtlb_i',
+    'mtlb_ifft',
+    'mtlb_image',
+    'mtlb_imp',
+    'mtlb_int16',
+    'mtlb_int32',
+    'mtlb_int8',
+    'mtlb_is',
+    'mtlb_isa',
+    'mtlb_isfield',
+    'mtlb_isletter',
+    'mtlb_isspace',
+    'mtlb_l',
+    'mtlb_legendre',
+    'mtlb_linspace',
+    'mtlb_logic',
+    'mtlb_logical',
+    'mtlb_loglog',
+    'mtlb_lower',
+    'mtlb_max',
+    'mtlb_mean',
+    'mtlb_median',
+    'mtlb_mesh',
+    'mtlb_meshdom',
+    'mtlb_min',
+    'mtlb_more',
+    'mtlb_num2str',
+    'mtlb_ones',
+    'mtlb_pcolor',
+    'mtlb_plot',
+    'mtlb_prod',
+    'mtlb_qr',
+    'mtlb_qz',
+    'mtlb_rand',
+    'mtlb_randn',
+    'mtlb_rcond',
+    'mtlb_realmax',
+    'mtlb_realmin',
+    'mtlb_s',
+    'mtlb_semilogx',
+    'mtlb_semilogy',
+    'mtlb_setstr',
+    'mtlb_size',
+    'mtlb_sort',
+    'mtlb_sortrows',
+    'mtlb_sprintf',
+    'mtlb_sscanf',
+    'mtlb_std',
+    'mtlb_strcmp',
+    'mtlb_strcmpi',
+    'mtlb_strfind',
+    'mtlb_strrep',
+    'mtlb_subplot',
+    'mtlb_sum',
+    'mtlb_t',
+    'mtlb_toeplitz',
+    'mtlb_tril',
+    'mtlb_triu',
+    'mtlb_true',
+    'mtlb_type',
+    'mtlb_uint16',
+    'mtlb_uint32',
+    'mtlb_uint8',
+    'mtlb_upper',
+    'mtlb_var',
+    'mtlb_zeros',
+    'mu2lin',
+    'mutation_ga_binary',
+    'mutation_ga_default',
+    'mvcorrel',
+    'mvvacov',
+    'nancumsum',
+    'nand2mean',
+    'nanmax',
+    'nanmean',
+    'nanmeanf',
+    'nanmedian',
+    'nanmin',
+    'nanreglin',
+    'nanstdev',
+    'nansum',
+    'narsimul',
+    'ndgrid',
+    'ndims',
+    'nehari',
+    'neigh_func_csa',
+    'neigh_func_default',
+    'neigh_func_fsa',
+    'neigh_func_vfsa',
+    'neldermead_cget',
+    'neldermead_configure',
+    'neldermead_costf',
+    'neldermead_defaultoutput',
+    'neldermead_destroy',
+    'neldermead_function',
+    'neldermead_get',
+    'neldermead_log',
+    'neldermead_new',
+    'neldermead_restart',
+    'neldermead_search',
+    'neldermead_updatesimp',
+    'nextpow2',
+    'nfreq',
+    'nicholschart',
+    'nlev',
+    'nmplot_cget',
+    'nmplot_configure',
+    'nmplot_contour',
+    'nmplot_destroy',
+    'nmplot_function',
+    'nmplot_get',
+    'nmplot_historyplot',
+    'nmplot_log',
+    'nmplot_new',
+    'nmplot_outputcmd',
+    'nmplot_restart',
+    'nmplot_search',
+    'nmplot_simplexhistory',
+    'noisegen',
+    'nonreg_test_run',
+    'now',
+    'nthroot',
+    'null',
+    'num2cell',
+    'numderivative',
+    'numdiff',
+    'numer',
+    'nyquist',
+    'nyquistfrequencybounds',
+    'obs_gram',
+    'obscont',
+    'observer',
+    'obsv_mat',
+    'obsvss',
+    'oct2dec',
+    'odeoptions',
+    'optim_ga',
+    'optim_moga',
+    'optim_nsga',
+    'optim_nsga2',
+    'optim_sa',
+    'optimbase_cget',
+    'optimbase_checkbounds',
+    'optimbase_checkcostfun',
+    'optimbase_checkx0',
+    'optimbase_configure',
+    'optimbase_destroy',
+    'optimbase_function',
+    'optimbase_get',
+    'optimbase_hasbounds',
+    'optimbase_hasconstraints',
+    'optimbase_hasnlcons',
+    'optimbase_histget',
+    'optimbase_histset',
+    'optimbase_incriter',
+    'optimbase_isfeasible',
+    'optimbase_isinbounds',
+    'optimbase_isinnonlincons',
+    'optimbase_log',
+    'optimbase_logshutdown',
+    'optimbase_logstartup',
+    'optimbase_new',
+    'optimbase_outputcmd',
+    'optimbase_outstruct',
+    'optimbase_proj2bnds',
+    'optimbase_set',
+    'optimbase_stoplog',
+    'optimbase_terminate',
+    'optimget',
+    'optimplotfunccount',
+    'optimplotfval',
+    'optimplotx',
+    'optimset',
+    'optimsimplex_center',
+    'optimsimplex_check',
+    'optimsimplex_compsomefv',
+    'optimsimplex_computefv',
+    'optimsimplex_deltafv',
+    'optimsimplex_deltafvmax',
+    'optimsimplex_destroy',
+    'optimsimplex_dirmat',
+    'optimsimplex_fvmean',
+    'optimsimplex_fvstdev',
+    'optimsimplex_fvvariance',
+    'optimsimplex_getall',
+    'optimsimplex_getallfv',
+    'optimsimplex_getallx',
+    'optimsimplex_getfv',
+    'optimsimplex_getn',
+    'optimsimplex_getnbve',
+    'optimsimplex_getve',
+    'optimsimplex_getx',
+    'optimsimplex_gradientfv',
+    'optimsimplex_log',
+    'optimsimplex_new',
+    'optimsimplex_reflect',
+    'optimsimplex_setall',
+    'optimsimplex_setallfv',
+    'optimsimplex_setallx',
+    'optimsimplex_setfv',
+    'optimsimplex_setn',
+    'optimsimplex_setnbve',
+    'optimsimplex_setve',
+    'optimsimplex_setx',
+    'optimsimplex_shrink',
+    'optimsimplex_size',
+    'optimsimplex_sort',
+    'optimsimplex_xbar',
+    'orth',
+    'output_ga_default',
+    'output_moga_default',
+    'output_nsga2_default',
+    'output_nsga_default',
+    'p_margin',
+    'pack',
+    'pareto_filter',
+    'parrot',
+    'pbig',
+    'pca',
+    'pcg',
+    'pdiv',
+    'pen2ea',
+    'pencan',
+    'pencost',
+    'penlaur',
+    'perctl',
+    'perl',
+    'perms',
+    'permute',
+    'pertrans',
+    'pfactors',
+    'pfss',
+    'phasemag',
+    'phaseplot',
+    'phc',
+    'pinv',
+    'playsnd',
+    'plotprofile',
+    'plzr',
+    'pmodulo',
+    'pol2des',
+    'pol2str',
+    'polar',
+    'polfact',
+    'prbs_a',
+    'prettyprint',
+    'primes',
+    'princomp',
+    'profile',
+    'proj',
+    'projsl',
+    'projspec',
+    'psmall',
+    'pspect',
+    'qmr',
+    'qpsolve',
+    'quart',
+    'quaskro',
+    'rafiter',
+    'randpencil',
+    'range',
+    'rank',
+    'readxls',
+    'recompilefunction',
+    'recons',
+    'reglin',
+    'regress',
+    'remezb',
+    'remove_param',
+    'remove_profiling',
+    'repfreq',
+    'replace_Ix_by_Fx',
+    'repmat',
+    'reset_profiling',
+    'resize_matrix',
+    'returntoscilab',
+    'rhs2code',
+    'ric_desc',
+    'riccati',
+    'rmdir',
+    'routh_t',
+    'rowcomp',
+    'rowcompr',
+    'rowinout',
+    'rowregul',
+    'rowshuff',
+    'rref',
+    'sample',
+    'samplef',
+    'samwr',
+    'savematfile',
+    'savewave',
+    'scanf',
+    'sci2exp',
+    'sciGUI_init',
+    'sci_sparse',
+    'scicos_getvalue',
+    'scicos_simulate',
+    'scicos_workspace_init',
+    'scisptdemo',
+    'scitest',
+    'sdiff',
+    'sec',
+    'secd',
+    'sech',
+    'selection_ga_elitist',
+    'selection_ga_random',
+    'sensi',
+    'setPreferencesValue',
+    'set_param',
+    'setdiff',
+    'sgrid',
+    'show_margins',
+    'show_pca',
+    'showprofile',
+    'signm',
+    'sinc',
+    'sincd',
+    'sind',
+    'sinh',
+    'sinhm',
+    'sinm',
+    'sm2des',
+    'sm2ss',
+    'smga',
+    'smooth',
+    'solve',
+    'sound',
+    'soundsec',
+    'sp2adj',
+    'spaninter',
+    'spanplus',
+    'spantwo',
+    'specfact',
+    'speye',
+    'sprand',
+    'spzeros',
+    'sqroot',
+    'sqrtm',
+    'squarewave',
+    'squeeze',
+    'srfaur',
+    'srkf',
+    'ss2des',
+    'ss2ss',
+    'ss2tf',
+    'sskf',
+    'ssprint',
+    'ssrand',
+    'st_deviation',
+    'st_i_generic',
+    'st_ility',
+    'stabil',
+    'statgain',
+    'stdev',
+    'stdevf',
+    'steadycos',
+    'strange',
+    'strcmpi',
+    'struct',
+    'sub2ind',
+    'sva',
+    'svplot',
+    'sylm',
+    'sylv',
+    'sysconv',
+    'sysdiag',
+    'sysfact',
+    'syslin',
+    'syssize',
+    'system',
+    'systmat',
+    'tabul',
+    'tand',
+    'tanh',
+    'tanhm',
+    'tanm',
+    'tbx_build_blocks',
+    'tbx_build_cleaner',
+    'tbx_build_gateway',
+    'tbx_build_gateway_clean',
+    'tbx_build_gateway_loader',
+    'tbx_build_help',
+    'tbx_build_help_loader',
+    'tbx_build_loader',
+    'tbx_build_localization',
+    'tbx_build_macros',
+    'tbx_build_pal_loader',
+    'tbx_build_src',
+    'tbx_builder',
+    'tbx_builder_gateway',
+    'tbx_builder_gateway_lang',
+    'tbx_builder_help',
+    'tbx_builder_help_lang',
+    'tbx_builder_macros',
+    'tbx_builder_src',
+    'tbx_builder_src_lang',
+    'tbx_generate_pofile',
+    'temp_law_csa',
+    'temp_law_default',
+    'temp_law_fsa',
+    'temp_law_huang',
+    'temp_law_vfsa',
+    'test_clean',
+    'test_on_columns',
+    'test_run',
+    'test_run_level',
+    'testexamples',
+    'tf2des',
+    'tf2ss',
+    'thrownan',
+    'tic',
+    'time_id',
+    'toc',
+    'toeplitz',
+    'tokenpos',
+    'toolboxes',
+    'trace',
+    'trans',
+    'translatepaths',
+    'tree2code',
+    'trfmod',
+    'trianfml',
+    'trimmean',
+    'trisolve',
+    'trzeros',
+    'typeof',
+    'ui_observer',
+    'union',
+    'unique',
+    'unit_test_run',
+    'unix_g',
+    'unix_s',
+    'unix_w',
+    'unix_x',
+    'unobs',
+    'unpack',
+    'unwrap',
+    'variance',
+    'variancef',
+    'vec2list',
+    'vectorfind',
+    'ver',
+    'warnobsolete',
+    'wavread',
+    'wavwrite',
+    'wcenter',
+    'weekday',
+    'wfir',
+    'wfir_gui',
+    'whereami',
+    'who_user',
+    'whos',
+    'wiener',
+    'wigner',
+    'window',
+    'winlist',
+    'with_javasci',
+    'with_macros_source',
+    'with_modelica_compiler',
+    'with_tk',
+    'xcorr',
+    'xcosBlockEval',
+    'xcosBlockInterface',
+    'xcosCodeGeneration',
+    'xcosConfigureModelica',
+    'xcosPal',
+    'xcosPalAdd',
+    'xcosPalAddBlock',
+    'xcosPalExport',
+    'xcosPalGenerateAllIcons',
+    'xcosShowBlockWarning',
+    'xcosValidateBlockSet',
+    'xcosValidateCompareBlock',
+    'xcos_compile',
+    'xcos_debug_gui',
+    'xcos_run',
+    'xcos_simulate',
+    'xcov',
+    'xmltochm',
+    'xmltoformat',
+    'xmltohtml',
+    'xmltojar',
+    'xmltopdf',
+    'xmltops',
+    'xmltoweb',
+    'yulewalk',
+    'zeropen',
+    'zgrid',
+    'zpbutt',
+    'zpch1',
+    'zpch2',
+    'zpell',
+)
+
+variables_kw = (
+    '$',
+    '%F',
+    '%T',
+    '%e',
+    '%eps',
+    '%f',
+    '%fftw',
+    '%gui',
+    '%i',
+    '%inf',
+    '%io',
+    '%modalWarning',
+    '%nan',
+    '%pi',
+    '%s',
+    '%t',
+    '%tk',
+    '%toolboxes',
+    '%toolboxes_dir',
+    '%z',
+    'PWD',
+    'SCI',
+    'SCIHOME',
+    'TMPDIR',
+    'arnoldilib',
+    'assertlib',
+    'atomslib',
+    'cacsdlib',
+    'compatibility_functilib',
+    'corelib',
+    'data_structureslib',
+    'demo_toolslib',
+    'development_toolslib',
+    'differential_equationlib',
+    'dynamic_linklib',
+    'elementary_functionslib',
+    'enull',
+    'evoid',
+    'external_objectslib',
+    'fd',
+    'fileiolib',
+    'functionslib',
+    'genetic_algorithmslib',
+    'helptoolslib',
+    'home',
+    'integerlib',
+    'interpolationlib',
+    'iolib',
+    'jnull',
+    'jvoid',
+    'linear_algebralib',
+    'm2scilib',
+    'matiolib',
+    'modules_managerlib',
+    'neldermeadlib',
+    'optimbaselib',
+    'optimizationlib',
+    'optimsimplexlib',
+    'output_streamlib',
+    'overloadinglib',
+    'parameterslib',
+    'polynomialslib',
+    'preferenceslib',
+    'randliblib',
+    'scicos_autolib',
+    'scicos_utilslib',
+    'scinoteslib',
+    'signal_processinglib',
+    'simulated_annealinglib',
+    'soundlib',
+    'sparselib',
+    'special_functionslib',
+    'spreadsheetlib',
+    'statisticslib',
+    'stringlib',
+    'tclscilib',
+    'timelib',
+    'umfpacklib',
+    'xcoslib',
+)
+
+
+if __name__ == '__main__':  # pragma: no cover
+    import subprocess
+    from pygments.util import format_lines, duplicates_removed
+
+    mapping = {'variables': 'builtin'}
+
+    def extract_completion(var_type):
+        s = subprocess.Popen(['scilab', '-nwni'], stdin=subprocess.PIPE,
+                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        output = s.communicate(f'''\
+fd = mopen("/dev/stderr", "wt");
+mputl(strcat(completion("", "{var_type}"), "||"), fd);
+mclose(fd)\n''')
+        if '||' not in output[1]:
+            raise Exception(output[0])
+        # Invalid DISPLAY causes this to be output:
+        text = output[1].strip()
+        if text.startswith('Error: unable to open display \n'):
+            text = text[len('Error: unable to open display \n'):]
+        return text.split('||')
+
+    new_data = {}
+    seen = set()  # only keep first type for a given word
+    for t in ('functions', 'commands', 'macros', 'variables'):
+        new_data[t] = duplicates_removed(extract_completion(t), seen)
+        seen.update(set(new_data[t]))
+
+
+    with open(__file__, encoding='utf-8') as f:
+        content = f.read()
+
+    header = content[:content.find('# Autogenerated')]
+    footer = content[content.find("if __name__ == '__main__':"):]
+
+    with open(__file__, 'w', encoding='utf-8') as f:
+        f.write(header)
+        f.write('# Autogenerated\n\n')
+        for k, v in sorted(new_data.items()):
+            f.write(format_lines(k + '_kw', v) + '\n\n')
+        f.write(footer)
diff --git a/.venv/Lib/site-packages/pygments/lexers/_sourcemod_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_sourcemod_builtins.py
new file mode 100644 (file)
index 0000000..c98478c
--- /dev/null
@@ -0,0 +1,1151 @@
+"""
+    pygments.lexers._sourcemod_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file contains the names of SourceMod functions.
+
+    Do not edit the FUNCTIONS list by hand.
+
+    Run with `python -I` to regenerate.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+FUNCTIONS = (
+    'OnEntityCreated',
+    'OnEntityDestroyed',
+    'OnGetGameDescription',
+    'OnLevelInit',
+    'SDKHook',
+    'SDKHookEx',
+    'SDKUnhook',
+    'SDKHooks_TakeDamage',
+    'SDKHooks_DropWeapon',
+    'TopMenuHandler',
+    'CreateTopMenu',
+    'LoadTopMenuConfig',
+    'AddToTopMenu',
+    'GetTopMenuInfoString',
+    'GetTopMenuObjName',
+    'RemoveFromTopMenu',
+    'DisplayTopMenu',
+    'DisplayTopMenuCategory',
+    'FindTopMenuCategory',
+    'SetTopMenuTitleCaching',
+    'OnAdminMenuCreated',
+    'OnAdminMenuReady',
+    'GetAdminTopMenu',
+    'AddTargetsToMenu',
+    'AddTargetsToMenu2',
+    'RedisplayAdminMenu',
+    'TEHook',
+    'AddTempEntHook',
+    'RemoveTempEntHook',
+    'TE_Start',
+    'TE_IsValidProp',
+    'TE_WriteNum',
+    'TE_ReadNum',
+    'TE_WriteFloat',
+    'TE_ReadFloat',
+    'TE_WriteVector',
+    'TE_ReadVector',
+    'TE_WriteAngles',
+    'TE_WriteFloatArray',
+    'TE_Send',
+    'TE_WriteEncodedEnt',
+    'TE_SendToAll',
+    'TE_SendToClient',
+    'CreateKeyValues',
+    'KvSetString',
+    'KvSetNum',
+    'KvSetUInt64',
+    'KvSetFloat',
+    'KvSetColor',
+    'KvSetVector',
+    'KvGetString',
+    'KvGetNum',
+    'KvGetFloat',
+    'KvGetColor',
+    'KvGetUInt64',
+    'KvGetVector',
+    'KvJumpToKey',
+    'KvJumpToKeySymbol',
+    'KvGotoFirstSubKey',
+    'KvGotoNextKey',
+    'KvSavePosition',
+    'KvDeleteKey',
+    'KvDeleteThis',
+    'KvGoBack',
+    'KvRewind',
+    'KvGetSectionName',
+    'KvSetSectionName',
+    'KvGetDataType',
+    'KeyValuesToFile',
+    'FileToKeyValues',
+    'StringToKeyValues',
+    'KvSetEscapeSequences',
+    'KvNodesInStack',
+    'KvCopySubkeys',
+    'KvFindKeyById',
+    'KvGetNameSymbol',
+    'KvGetSectionSymbol',
+    'TE_SetupSparks',
+    'TE_SetupSmoke',
+    'TE_SetupDust',
+    'TE_SetupMuzzleFlash',
+    'TE_SetupMetalSparks',
+    'TE_SetupEnergySplash',
+    'TE_SetupArmorRicochet',
+    'TE_SetupGlowSprite',
+    'TE_SetupExplosion',
+    'TE_SetupBloodSprite',
+    'TE_SetupBeamRingPoint',
+    'TE_SetupBeamPoints',
+    'TE_SetupBeamLaser',
+    'TE_SetupBeamRing',
+    'TE_SetupBeamFollow',
+    'HookEvent',
+    'HookEventEx',
+    'UnhookEvent',
+    'CreateEvent',
+    'FireEvent',
+    'CancelCreatedEvent',
+    'GetEventBool',
+    'SetEventBool',
+    'GetEventInt',
+    'SetEventInt',
+    'GetEventFloat',
+    'SetEventFloat',
+    'GetEventString',
+    'SetEventString',
+    'GetEventName',
+    'SetEventBroadcast',
+    'GetUserMessageType',
+    'GetUserMessageId',
+    'GetUserMessageName',
+    'StartMessage',
+    'StartMessageEx',
+    'EndMessage',
+    'MsgHook',
+    'MsgPostHook',
+    'HookUserMessage',
+    'UnhookUserMessage',
+    'StartMessageAll',
+    'StartMessageOne',
+    'InactivateClient',
+    'ReconnectClient',
+    'GetMaxEntities',
+    'GetEntityCount',
+    'IsValidEntity',
+    'IsValidEdict',
+    'IsEntNetworkable',
+    'CreateEdict',
+    'RemoveEdict',
+    'GetEdictFlags',
+    'SetEdictFlags',
+    'GetEdictClassname',
+    'GetEntityNetClass',
+    'ChangeEdictState',
+    'GetEntData',
+    'SetEntData',
+    'GetEntDataFloat',
+    'SetEntDataFloat',
+    'GetEntDataEnt2',
+    'SetEntDataEnt2',
+    'GetEntDataVector',
+    'SetEntDataVector',
+    'GetEntDataString',
+    'SetEntDataString',
+    'FindSendPropOffs',
+    'FindSendPropInfo',
+    'FindDataMapOffs',
+    'FindDataMapInfo',
+    'GetEntSendPropOffs',
+    'GetEntProp',
+    'SetEntProp',
+    'GetEntPropFloat',
+    'SetEntPropFloat',
+    'GetEntPropEnt',
+    'SetEntPropEnt',
+    'GetEntPropVector',
+    'SetEntPropVector',
+    'GetEntPropString',
+    'SetEntPropString',
+    'GetEntPropArraySize',
+    'GetEntDataArray',
+    'SetEntDataArray',
+    'GetEntityAddress',
+    'GetEntityClassname',
+    'float',
+    'FloatMul',
+    'FloatDiv',
+    'FloatAdd',
+    'FloatSub',
+    'FloatFraction',
+    'RoundToZero',
+    'RoundToCeil',
+    'RoundToFloor',
+    'RoundToNearest',
+    'FloatCompare',
+    'SquareRoot',
+    'Pow',
+    'Exponential',
+    'Logarithm',
+    'Sine',
+    'Cosine',
+    'Tangent',
+    'FloatAbs',
+    'ArcTangent',
+    'ArcCosine',
+    'ArcSine',
+    'ArcTangent2',
+    'RoundFloat',
+    'operator%',
+    'DegToRad',
+    'RadToDeg',
+    'GetURandomInt',
+    'GetURandomFloat',
+    'SetURandomSeed',
+    'SetURandomSeedSimple',
+    'RemovePlayerItem',
+    'GivePlayerItem',
+    'GetPlayerWeaponSlot',
+    'IgniteEntity',
+    'ExtinguishEntity',
+    'TeleportEntity',
+    'ForcePlayerSuicide',
+    'SlapPlayer',
+    'FindEntityByClassname',
+    'GetClientEyeAngles',
+    'CreateEntityByName',
+    'DispatchSpawn',
+    'DispatchKeyValue',
+    'DispatchKeyValueFloat',
+    'DispatchKeyValueVector',
+    'GetClientAimTarget',
+    'GetTeamCount',
+    'GetTeamName',
+    'GetTeamScore',
+    'SetTeamScore',
+    'GetTeamClientCount',
+    'SetEntityModel',
+    'GetPlayerDecalFile',
+    'GetPlayerJingleFile',
+    'GetServerNetStats',
+    'EquipPlayerWeapon',
+    'ActivateEntity',
+    'SetClientInfo',
+    'GivePlayerAmmo',
+    'SetClientListeningFlags',
+    'GetClientListeningFlags',
+    'SetListenOverride',
+    'GetListenOverride',
+    'IsClientMuted',
+    'TR_GetPointContents',
+    'TR_GetPointContentsEnt',
+    'TR_TraceRay',
+    'TR_TraceHull',
+    'TR_TraceRayFilter',
+    'TR_TraceHullFilter',
+    'TR_TraceRayEx',
+    'TR_TraceHullEx',
+    'TR_TraceRayFilterEx',
+    'TR_TraceHullFilterEx',
+    'TR_GetFraction',
+    'TR_GetEndPosition',
+    'TR_GetEntityIndex',
+    'TR_DidHit',
+    'TR_GetHitGroup',
+    'TR_GetPlaneNormal',
+    'TR_PointOutsideWorld',
+    'SortIntegers',
+    'SortFloats',
+    'SortStrings',
+    'SortFunc1D',
+    'SortCustom1D',
+    'SortCustom2D',
+    'SortADTArray',
+    'SortFuncADTArray',
+    'SortADTArrayCustom',
+    'CompileRegex',
+    'MatchRegex',
+    'GetRegexSubString',
+    'SimpleRegexMatch',
+    'TF2_GetPlayerClass',
+    'TF2_SetPlayerClass',
+    'TF2_RemoveWeaponSlot',
+    'TF2_RemoveAllWeapons',
+    'TF2_IsPlayerInCondition',
+    'TF2_GetObjectType',
+    'TF2_GetObjectMode',
+    'NominateMap',
+    'RemoveNominationByMap',
+    'RemoveNominationByOwner',
+    'GetExcludeMapList',
+    'GetNominatedMapList',
+    'CanMapChooserStartVote',
+    'InitiateMapChooserVote',
+    'HasEndOfMapVoteFinished',
+    'EndOfMapVoteEnabled',
+    'OnNominationRemoved',
+    'OnMapVoteStarted',
+    'CreateTimer',
+    'KillTimer',
+    'TriggerTimer',
+    'GetTickedTime',
+    'GetMapTimeLeft',
+    'GetMapTimeLimit',
+    'ExtendMapTimeLimit',
+    'GetTickInterval',
+    'OnMapTimeLeftChanged',
+    'IsServerProcessing',
+    'CreateDataTimer',
+    'ByteCountToCells',
+    'CreateArray',
+    'ClearArray',
+    'CloneArray',
+    'ResizeArray',
+    'GetArraySize',
+    'PushArrayCell',
+    'PushArrayString',
+    'PushArrayArray',
+    'GetArrayCell',
+    'GetArrayString',
+    'GetArrayArray',
+    'SetArrayCell',
+    'SetArrayString',
+    'SetArrayArray',
+    'ShiftArrayUp',
+    'RemoveFromArray',
+    'SwapArrayItems',
+    'FindStringInArray',
+    'FindValueInArray',
+    'ProcessTargetString',
+    'ReplyToTargetError',
+    'MultiTargetFilter',
+    'AddMultiTargetFilter',
+    'RemoveMultiTargetFilter',
+    'OnBanClient',
+    'OnBanIdentity',
+    'OnRemoveBan',
+    'BanClient',
+    'BanIdentity',
+    'RemoveBan',
+    'CreateTrie',
+    'SetTrieValue',
+    'SetTrieArray',
+    'SetTrieString',
+    'GetTrieValue',
+    'GetTrieArray',
+    'GetTrieString',
+    'RemoveFromTrie',
+    'ClearTrie',
+    'GetTrieSize',
+    'GetFunctionByName',
+    'CreateGlobalForward',
+    'CreateForward',
+    'GetForwardFunctionCount',
+    'AddToForward',
+    'RemoveFromForward',
+    'RemoveAllFromForward',
+    'Call_StartForward',
+    'Call_StartFunction',
+    'Call_PushCell',
+    'Call_PushCellRef',
+    'Call_PushFloat',
+    'Call_PushFloatRef',
+    'Call_PushArray',
+    'Call_PushArrayEx',
+    'Call_PushString',
+    'Call_PushStringEx',
+    'Call_Finish',
+    'Call_Cancel',
+    'NativeCall',
+    'CreateNative',
+    'ThrowNativeError',
+    'GetNativeStringLength',
+    'GetNativeString',
+    'SetNativeString',
+    'GetNativeCell',
+    'GetNativeCellRef',
+    'SetNativeCellRef',
+    'GetNativeArray',
+    'SetNativeArray',
+    'FormatNativeString',
+    'RequestFrameCallback',
+    'RequestFrame',
+    'OnRebuildAdminCache',
+    'DumpAdminCache',
+    'AddCommandOverride',
+    'GetCommandOverride',
+    'UnsetCommandOverride',
+    'CreateAdmGroup',
+    'FindAdmGroup',
+    'SetAdmGroupAddFlag',
+    'GetAdmGroupAddFlag',
+    'GetAdmGroupAddFlags',
+    'SetAdmGroupImmuneFrom',
+    'GetAdmGroupImmuneCount',
+    'GetAdmGroupImmuneFrom',
+    'AddAdmGroupCmdOverride',
+    'GetAdmGroupCmdOverride',
+    'RegisterAuthIdentType',
+    'CreateAdmin',
+    'GetAdminUsername',
+    'BindAdminIdentity',
+    'SetAdminFlag',
+    'GetAdminFlag',
+    'GetAdminFlags',
+    'AdminInheritGroup',
+    'GetAdminGroupCount',
+    'GetAdminGroup',
+    'SetAdminPassword',
+    'GetAdminPassword',
+    'FindAdminByIdentity',
+    'RemoveAdmin',
+    'FlagBitsToBitArray',
+    'FlagBitArrayToBits',
+    'FlagArrayToBits',
+    'FlagBitsToArray',
+    'FindFlagByName',
+    'FindFlagByChar',
+    'FindFlagChar',
+    'ReadFlagString',
+    'CanAdminTarget',
+    'CreateAuthMethod',
+    'SetAdmGroupImmunityLevel',
+    'GetAdmGroupImmunityLevel',
+    'SetAdminImmunityLevel',
+    'GetAdminImmunityLevel',
+    'FlagToBit',
+    'BitToFlag',
+    'ServerCommand',
+    'ServerCommandEx',
+    'InsertServerCommand',
+    'ServerExecute',
+    'ClientCommand',
+    'FakeClientCommand',
+    'FakeClientCommandEx',
+    'PrintToServer',
+    'PrintToConsole',
+    'ReplyToCommand',
+    'GetCmdReplySource',
+    'SetCmdReplySource',
+    'IsChatTrigger',
+    'ShowActivity2',
+    'ShowActivity',
+    'ShowActivityEx',
+    'FormatActivitySource',
+    'SrvCmd',
+    'RegServerCmd',
+    'ConCmd',
+    'RegConsoleCmd',
+    'RegAdminCmd',
+    'GetCmdArgs',
+    'GetCmdArg',
+    'GetCmdArgString',
+    'CreateConVar',
+    'FindConVar',
+    'ConVarChanged',
+    'HookConVarChange',
+    'UnhookConVarChange',
+    'GetConVarBool',
+    'SetConVarBool',
+    'GetConVarInt',
+    'SetConVarInt',
+    'GetConVarFloat',
+    'SetConVarFloat',
+    'GetConVarString',
+    'SetConVarString',
+    'ResetConVar',
+    'GetConVarDefault',
+    'GetConVarFlags',
+    'SetConVarFlags',
+    'GetConVarBounds',
+    'SetConVarBounds',
+    'GetConVarName',
+    'QueryClientConVar',
+    'GetCommandIterator',
+    'ReadCommandIterator',
+    'CheckCommandAccess',
+    'CheckAccess',
+    'IsValidConVarChar',
+    'GetCommandFlags',
+    'SetCommandFlags',
+    'FindFirstConCommand',
+    'FindNextConCommand',
+    'SendConVarValue',
+    'AddServerTag',
+    'RemoveServerTag',
+    'CommandListener',
+    'AddCommandListener',
+    'RemoveCommandListener',
+    'CommandExists',
+    'OnClientSayCommand',
+    'OnClientSayCommand_Post',
+    'TF2_IgnitePlayer',
+    'TF2_RespawnPlayer',
+    'TF2_RegeneratePlayer',
+    'TF2_AddCondition',
+    'TF2_RemoveCondition',
+    'TF2_SetPlayerPowerPlay',
+    'TF2_DisguisePlayer',
+    'TF2_RemovePlayerDisguise',
+    'TF2_StunPlayer',
+    'TF2_MakeBleed',
+    'TF2_GetClass',
+    'TF2_CalcIsAttackCritical',
+    'TF2_OnIsHolidayActive',
+    'TF2_IsHolidayActive',
+    'TF2_IsPlayerInDuel',
+    'TF2_RemoveWearable',
+    'TF2_OnConditionAdded',
+    'TF2_OnConditionRemoved',
+    'TF2_OnWaitingForPlayersStart',
+    'TF2_OnWaitingForPlayersEnd',
+    'TF2_OnPlayerTeleport',
+    'SQL_Connect',
+    'SQL_DefConnect',
+    'SQL_ConnectCustom',
+    'SQLite_UseDatabase',
+    'SQL_CheckConfig',
+    'SQL_GetDriver',
+    'SQL_ReadDriver',
+    'SQL_GetDriverIdent',
+    'SQL_GetDriverProduct',
+    'SQL_SetCharset',
+    'SQL_GetAffectedRows',
+    'SQL_GetInsertId',
+    'SQL_GetError',
+    'SQL_EscapeString',
+    'SQL_QuoteString',
+    'SQL_FastQuery',
+    'SQL_Query',
+    'SQL_PrepareQuery',
+    'SQL_FetchMoreResults',
+    'SQL_HasResultSet',
+    'SQL_GetRowCount',
+    'SQL_GetFieldCount',
+    'SQL_FieldNumToName',
+    'SQL_FieldNameToNum',
+    'SQL_FetchRow',
+    'SQL_MoreRows',
+    'SQL_Rewind',
+    'SQL_FetchString',
+    'SQL_FetchFloat',
+    'SQL_FetchInt',
+    'SQL_IsFieldNull',
+    'SQL_FetchSize',
+    'SQL_BindParamInt',
+    'SQL_BindParamFloat',
+    'SQL_BindParamString',
+    'SQL_Execute',
+    'SQL_LockDatabase',
+    'SQL_UnlockDatabase',
+    'SQLTCallback',
+    'SQL_IsSameConnection',
+    'SQL_TConnect',
+    'SQL_TQuery',
+    'SQL_CreateTransaction',
+    'SQL_AddQuery',
+    'SQLTxnSuccess',
+    'SQLTxnFailure',
+    'SQL_ExecuteTransaction',
+    'CloseHandle',
+    'CloneHandle',
+    'MenuHandler',
+    'CreateMenu',
+    'DisplayMenu',
+    'DisplayMenuAtItem',
+    'AddMenuItem',
+    'InsertMenuItem',
+    'RemoveMenuItem',
+    'RemoveAllMenuItems',
+    'GetMenuItem',
+    'GetMenuSelectionPosition',
+    'GetMenuItemCount',
+    'SetMenuPagination',
+    'GetMenuPagination',
+    'GetMenuStyle',
+    'SetMenuTitle',
+    'GetMenuTitle',
+    'CreatePanelFromMenu',
+    'GetMenuExitButton',
+    'SetMenuExitButton',
+    'GetMenuExitBackButton',
+    'SetMenuExitBackButton',
+    'SetMenuNoVoteButton',
+    'CancelMenu',
+    'GetMenuOptionFlags',
+    'SetMenuOptionFlags',
+    'IsVoteInProgress',
+    'CancelVote',
+    'VoteMenu',
+    'VoteMenuToAll',
+    'VoteHandler',
+    'SetVoteResultCallback',
+    'CheckVoteDelay',
+    'IsClientInVotePool',
+    'RedrawClientVoteMenu',
+    'GetMenuStyleHandle',
+    'CreatePanel',
+    'CreateMenuEx',
+    'GetClientMenu',
+    'CancelClientMenu',
+    'GetMaxPageItems',
+    'GetPanelStyle',
+    'SetPanelTitle',
+    'DrawPanelItem',
+    'DrawPanelText',
+    'CanPanelDrawFlags',
+    'SetPanelKeys',
+    'SendPanelToClient',
+    'GetPanelTextRemaining',
+    'GetPanelCurrentKey',
+    'SetPanelCurrentKey',
+    'RedrawMenuItem',
+    'InternalShowMenu',
+    'GetMenuVoteInfo',
+    'IsNewVoteAllowed',
+    'PrefetchSound',
+    'EmitAmbientSound',
+    'FadeClientVolume',
+    'StopSound',
+    'EmitSound',
+    'EmitSentence',
+    'GetDistGainFromSoundLevel',
+    'AmbientSHook',
+    'NormalSHook',
+    'AddAmbientSoundHook',
+    'AddNormalSoundHook',
+    'RemoveAmbientSoundHook',
+    'RemoveNormalSoundHook',
+    'EmitSoundToClient',
+    'EmitSoundToAll',
+    'ATTN_TO_SNDLEVEL',
+    'GetGameSoundParams',
+    'EmitGameSound',
+    'EmitAmbientGameSound',
+    'EmitGameSoundToClient',
+    'EmitGameSoundToAll',
+    'PrecacheScriptSound',
+    'strlen',
+    'StrContains',
+    'strcmp',
+    'strncmp',
+    'StrEqual',
+    'strcopy',
+    'Format',
+    'FormatEx',
+    'VFormat',
+    'StringToInt',
+    'StringToIntEx',
+    'IntToString',
+    'StringToFloat',
+    'StringToFloatEx',
+    'FloatToString',
+    'BreakString',
+    'TrimString',
+    'SplitString',
+    'ReplaceString',
+    'ReplaceStringEx',
+    'GetCharBytes',
+    'IsCharAlpha',
+    'IsCharNumeric',
+    'IsCharSpace',
+    'IsCharMB',
+    'IsCharUpper',
+    'IsCharLower',
+    'StripQuotes',
+    'CharToUpper',
+    'CharToLower',
+    'FindCharInString',
+    'StrCat',
+    'ExplodeString',
+    'ImplodeStrings',
+    'GetVectorLength',
+    'GetVectorDistance',
+    'GetVectorDotProduct',
+    'GetVectorCrossProduct',
+    'NormalizeVector',
+    'GetAngleVectors',
+    'GetVectorAngles',
+    'GetVectorVectors',
+    'AddVectors',
+    'SubtractVectors',
+    'ScaleVector',
+    'NegateVector',
+    'MakeVectorFromPoints',
+    'BaseComm_IsClientGagged',
+    'BaseComm_IsClientMuted',
+    'BaseComm_SetClientGag',
+    'BaseComm_SetClientMute',
+    'FormatUserLogText',
+    'FindPluginByFile',
+    'FindTarget',
+    'AcceptEntityInput',
+    'SetVariantBool',
+    'SetVariantString',
+    'SetVariantInt',
+    'SetVariantFloat',
+    'SetVariantVector3D',
+    'SetVariantPosVector3D',
+    'SetVariantColor',
+    'SetVariantEntity',
+    'GameRules_GetProp',
+    'GameRules_SetProp',
+    'GameRules_GetPropFloat',
+    'GameRules_SetPropFloat',
+    'GameRules_GetPropEnt',
+    'GameRules_SetPropEnt',
+    'GameRules_GetPropVector',
+    'GameRules_SetPropVector',
+    'GameRules_GetPropString',
+    'GameRules_SetPropString',
+    'GameRules_GetRoundState',
+    'OnClientConnect',
+    'OnClientConnected',
+    'OnClientPutInServer',
+    'OnClientDisconnect',
+    'OnClientDisconnect_Post',
+    'OnClientCommand',
+    'OnClientSettingsChanged',
+    'OnClientAuthorized',
+    'OnClientPreAdminCheck',
+    'OnClientPostAdminFilter',
+    'OnClientPostAdminCheck',
+    'GetMaxClients',
+    'GetMaxHumanPlayers',
+    'GetClientCount',
+    'GetClientName',
+    'GetClientIP',
+    'GetClientAuthString',
+    'GetClientAuthId',
+    'GetSteamAccountID',
+    'GetClientUserId',
+    'IsClientConnected',
+    'IsClientInGame',
+    'IsClientInKickQueue',
+    'IsClientAuthorized',
+    'IsFakeClient',
+    'IsClientSourceTV',
+    'IsClientReplay',
+    'IsClientObserver',
+    'IsPlayerAlive',
+    'GetClientInfo',
+    'GetClientTeam',
+    'SetUserAdmin',
+    'GetUserAdmin',
+    'AddUserFlags',
+    'RemoveUserFlags',
+    'SetUserFlagBits',
+    'GetUserFlagBits',
+    'CanUserTarget',
+    'RunAdminCacheChecks',
+    'NotifyPostAdminCheck',
+    'CreateFakeClient',
+    'SetFakeClientConVar',
+    'GetClientHealth',
+    'GetClientModel',
+    'GetClientWeapon',
+    'GetClientMaxs',
+    'GetClientMins',
+    'GetClientAbsAngles',
+    'GetClientAbsOrigin',
+    'GetClientArmor',
+    'GetClientDeaths',
+    'GetClientFrags',
+    'GetClientDataRate',
+    'IsClientTimingOut',
+    'GetClientTime',
+    'GetClientLatency',
+    'GetClientAvgLatency',
+    'GetClientAvgLoss',
+    'GetClientAvgChoke',
+    'GetClientAvgData',
+    'GetClientAvgPackets',
+    'GetClientOfUserId',
+    'KickClient',
+    'KickClientEx',
+    'ChangeClientTeam',
+    'GetClientSerial',
+    'GetClientFromSerial',
+    'FindStringTable',
+    'GetNumStringTables',
+    'GetStringTableNumStrings',
+    'GetStringTableMaxStrings',
+    'GetStringTableName',
+    'FindStringIndex',
+    'ReadStringTable',
+    'GetStringTableDataLength',
+    'GetStringTableData',
+    'SetStringTableData',
+    'AddToStringTable',
+    'LockStringTables',
+    'AddFileToDownloadsTable',
+    'GetEntityFlags',
+    'SetEntityFlags',
+    'GetEntityMoveType',
+    'SetEntityMoveType',
+    'GetEntityRenderMode',
+    'SetEntityRenderMode',
+    'GetEntityRenderFx',
+    'SetEntityRenderFx',
+    'SetEntityRenderColor',
+    'GetEntityGravity',
+    'SetEntityGravity',
+    'SetEntityHealth',
+    'GetClientButtons',
+    'EntityOutput',
+    'HookEntityOutput',
+    'UnhookEntityOutput',
+    'HookSingleEntityOutput',
+    'UnhookSingleEntityOutput',
+    'SMC_CreateParser',
+    'SMC_ParseFile',
+    'SMC_GetErrorString',
+    'SMC_ParseStart',
+    'SMC_SetParseStart',
+    'SMC_ParseEnd',
+    'SMC_SetParseEnd',
+    'SMC_NewSection',
+    'SMC_KeyValue',
+    'SMC_EndSection',
+    'SMC_SetReaders',
+    'SMC_RawLine',
+    'SMC_SetRawLine',
+    'BfWriteBool',
+    'BfWriteByte',
+    'BfWriteChar',
+    'BfWriteShort',
+    'BfWriteWord',
+    'BfWriteNum',
+    'BfWriteFloat',
+    'BfWriteString',
+    'BfWriteEntity',
+    'BfWriteAngle',
+    'BfWriteCoord',
+    'BfWriteVecCoord',
+    'BfWriteVecNormal',
+    'BfWriteAngles',
+    'BfReadBool',
+    'BfReadByte',
+    'BfReadChar',
+    'BfReadShort',
+    'BfReadWord',
+    'BfReadNum',
+    'BfReadFloat',
+    'BfReadString',
+    'BfReadEntity',
+    'BfReadAngle',
+    'BfReadCoord',
+    'BfReadVecCoord',
+    'BfReadVecNormal',
+    'BfReadAngles',
+    'BfGetNumBytesLeft',
+    'CreateProfiler',
+    'StartProfiling',
+    'StopProfiling',
+    'GetProfilerTime',
+    'OnPluginStart',
+    'AskPluginLoad2',
+    'OnPluginEnd',
+    'OnPluginPauseChange',
+    'OnGameFrame',
+    'OnMapStart',
+    'OnMapEnd',
+    'OnConfigsExecuted',
+    'OnAutoConfigsBuffered',
+    'OnAllPluginsLoaded',
+    'GetMyHandle',
+    'GetPluginIterator',
+    'MorePlugins',
+    'ReadPlugin',
+    'GetPluginStatus',
+    'GetPluginFilename',
+    'IsPluginDebugging',
+    'GetPluginInfo',
+    'FindPluginByNumber',
+    'SetFailState',
+    'ThrowError',
+    'GetTime',
+    'FormatTime',
+    'LoadGameConfigFile',
+    'GameConfGetOffset',
+    'GameConfGetKeyValue',
+    'GameConfGetAddress',
+    'GetSysTickCount',
+    'AutoExecConfig',
+    'RegPluginLibrary',
+    'LibraryExists',
+    'GetExtensionFileStatus',
+    'OnLibraryAdded',
+    'OnLibraryRemoved',
+    'ReadMapList',
+    'SetMapListCompatBind',
+    'OnClientFloodCheck',
+    'OnClientFloodResult',
+    'CanTestFeatures',
+    'GetFeatureStatus',
+    'RequireFeature',
+    'LoadFromAddress',
+    'StoreToAddress',
+    'CreateStack',
+    'PushStackCell',
+    'PushStackString',
+    'PushStackArray',
+    'PopStackCell',
+    'PopStackString',
+    'PopStackArray',
+    'IsStackEmpty',
+    'PopStack',
+    'OnPlayerRunCmd',
+    'BuildPath',
+    'OpenDirectory',
+    'ReadDirEntry',
+    'OpenFile',
+    'DeleteFile',
+    'ReadFileLine',
+    'ReadFile',
+    'ReadFileString',
+    'WriteFile',
+    'WriteFileString',
+    'WriteFileLine',
+    'ReadFileCell',
+    'WriteFileCell',
+    'IsEndOfFile',
+    'FileSeek',
+    'FilePosition',
+    'FileExists',
+    'RenameFile',
+    'DirExists',
+    'FileSize',
+    'FlushFile',
+    'RemoveDir',
+    'CreateDirectory',
+    'GetFileTime',
+    'LogToOpenFile',
+    'LogToOpenFileEx',
+    'PbReadInt',
+    'PbReadFloat',
+    'PbReadBool',
+    'PbReadString',
+    'PbReadColor',
+    'PbReadAngle',
+    'PbReadVector',
+    'PbReadVector2D',
+    'PbGetRepeatedFieldCount',
+    'PbSetInt',
+    'PbSetFloat',
+    'PbSetBool',
+    'PbSetString',
+    'PbSetColor',
+    'PbSetAngle',
+    'PbSetVector',
+    'PbSetVector2D',
+    'PbAddInt',
+    'PbAddFloat',
+    'PbAddBool',
+    'PbAddString',
+    'PbAddColor',
+    'PbAddAngle',
+    'PbAddVector',
+    'PbAddVector2D',
+    'PbRemoveRepeatedFieldValue',
+    'PbReadMessage',
+    'PbReadRepeatedMessage',
+    'PbAddMessage',
+    'SetNextMap',
+    'GetNextMap',
+    'ForceChangeLevel',
+    'GetMapHistorySize',
+    'GetMapHistory',
+    'GeoipCode2',
+    'GeoipCode3',
+    'GeoipCountry',
+    'MarkNativeAsOptional',
+    'RegClientCookie',
+    'FindClientCookie',
+    'SetClientCookie',
+    'GetClientCookie',
+    'SetAuthIdCookie',
+    'AreClientCookiesCached',
+    'OnClientCookiesCached',
+    'CookieMenuHandler',
+    'SetCookiePrefabMenu',
+    'SetCookieMenuItem',
+    'ShowCookieMenu',
+    'GetCookieIterator',
+    'ReadCookieIterator',
+    'GetCookieAccess',
+    'GetClientCookieTime',
+    'LoadTranslations',
+    'SetGlobalTransTarget',
+    'GetClientLanguage',
+    'GetServerLanguage',
+    'GetLanguageCount',
+    'GetLanguageInfo',
+    'SetClientLanguage',
+    'GetLanguageByCode',
+    'GetLanguageByName',
+    'CS_OnBuyCommand',
+    'CS_OnCSWeaponDrop',
+    'CS_OnGetWeaponPrice',
+    'CS_OnTerminateRound',
+    'CS_RespawnPlayer',
+    'CS_SwitchTeam',
+    'CS_DropWeapon',
+    'CS_TerminateRound',
+    'CS_GetTranslatedWeaponAlias',
+    'CS_GetWeaponPrice',
+    'CS_GetClientClanTag',
+    'CS_SetClientClanTag',
+    'CS_GetTeamScore',
+    'CS_SetTeamScore',
+    'CS_GetMVPCount',
+    'CS_SetMVPCount',
+    'CS_GetClientContributionScore',
+    'CS_SetClientContributionScore',
+    'CS_GetClientAssists',
+    'CS_SetClientAssists',
+    'CS_AliasToWeaponID',
+    'CS_WeaponIDToAlias',
+    'CS_IsValidWeaponID',
+    'CS_UpdateClientModel',
+    'LogToGame',
+    'SetRandomSeed',
+    'GetRandomFloat',
+    'GetRandomInt',
+    'IsMapValid',
+    'IsDedicatedServer',
+    'GetEngineTime',
+    'GetGameTime',
+    'GetGameTickCount',
+    'GetGameDescription',
+    'GetGameFolderName',
+    'GetCurrentMap',
+    'PrecacheModel',
+    'PrecacheSentenceFile',
+    'PrecacheDecal',
+    'PrecacheGeneric',
+    'IsModelPrecached',
+    'IsDecalPrecached',
+    'IsGenericPrecached',
+    'PrecacheSound',
+    'IsSoundPrecached',
+    'CreateDialog',
+    'GetEngineVersion',
+    'PrintToChat',
+    'PrintToChatAll',
+    'PrintCenterText',
+    'PrintCenterTextAll',
+    'PrintHintText',
+    'PrintHintTextToAll',
+    'ShowVGUIPanel',
+    'CreateHudSynchronizer',
+    'SetHudTextParams',
+    'SetHudTextParamsEx',
+    'ShowSyncHudText',
+    'ClearSyncHud',
+    'ShowHudText',
+    'ShowMOTDPanel',
+    'DisplayAskConnectBox',
+    'EntIndexToEntRef',
+    'EntRefToEntIndex',
+    'MakeCompatEntRef',
+    'SetClientViewEntity',
+    'SetLightStyle',
+    'GetClientEyePosition',
+    'CreateDataPack',
+    'WritePackCell',
+    'WritePackFloat',
+    'WritePackString',
+    'ReadPackCell',
+    'ReadPackFloat',
+    'ReadPackString',
+    'ResetPack',
+    'GetPackPosition',
+    'SetPackPosition',
+    'IsPackReadable',
+    'LogMessage',
+    'LogToFile',
+    'LogToFileEx',
+    'LogAction',
+    'LogError',
+    'OnLogAction',
+    'GameLogHook',
+    'AddGameLogHook',
+    'RemoveGameLogHook',
+    'FindTeamByName',
+    'StartPrepSDKCall',
+    'PrepSDKCall_SetVirtual',
+    'PrepSDKCall_SetSignature',
+    'PrepSDKCall_SetAddress',
+    'PrepSDKCall_SetFromConf',
+    'PrepSDKCall_SetReturnInfo',
+    'PrepSDKCall_AddParameter',
+    'EndPrepSDKCall',
+    'SDKCall',
+    'GetPlayerResourceEntity',
+)
+
+
+if __name__ == '__main__':  # pragma: no cover
+    import re
+    from urllib.request import FancyURLopener
+
+    from pygments.util import format_lines
+
+    class Opener(FancyURLopener):
+        version = 'Mozilla/5.0 (Pygments Sourcemod Builtins Update)'
+
+    opener = Opener()
+
+    def get_version():
+        f = opener.open('http://docs.sourcemod.net/api/index.php')
+        r = re.compile(r'SourceMod v\.<b>([\d\.]+(?:-\w+)?)</td>')
+        for line in f:
+            m = r.search(line.decode())
+            if m is not None:
+                return m.groups()[0]
+        raise ValueError('No version in api docs')
+
+    def get_sm_functions():
+        f = opener.open('http://docs.sourcemod.net/api/SMfuncs.js')
+        r = re.compile(r'SMfunctions\[\d+\] = Array \("(?:public )?([^,]+)",".+"\);')
+        functions = []
+        for line in f:
+            m = r.match(line.decode())
+            if m is not None:
+                functions.append(m.groups()[0])
+        return functions
+
+    def regenerate(filename, natives):
+        with open(filename, encoding='utf-8') as fp:
+            content = fp.read()
+
+        header = content[:content.find('FUNCTIONS = (')]
+        footer = content[content.find("if __name__ == '__main__':")-1:]
+
+
+        with open(filename, 'w', encoding='utf-8') as fp:
+            fp.write(header)
+            fp.write(format_lines('FUNCTIONS', natives))
+            fp.write('\n\n' + footer)
+
+    def run():
+        version = get_version()
+        print(f'> Downloading function index for SourceMod {version}')
+        functions = get_sm_functions()
+        print('> %d functions found:' % len(functions))
+
+        functionlist = []
+        for full_function_name in functions:
+            print(f'>> {full_function_name}')
+            functionlist.append(full_function_name)
+
+        regenerate(__file__, functionlist)
+
+
+    run()
diff --git a/.venv/Lib/site-packages/pygments/lexers/_stan_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_stan_builtins.py
new file mode 100644 (file)
index 0000000..8db10c3
--- /dev/null
@@ -0,0 +1,648 @@
+"""
+    pygments.lexers._stan_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file contains the names of functions for Stan used by
+    ``pygments.lexers.math.StanLexer. This is for Stan language version 2.29.0.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+KEYWORDS = (
+    'break',
+    'continue',
+    'else',
+    'for',
+    'if',
+    'in',
+    'print',
+    'reject',
+    'return',
+    'while',
+)
+
+TYPES = (
+    'cholesky_factor_corr',
+    'cholesky_factor_cov',
+    'corr_matrix',
+    'cov_matrix',
+    'int',
+    'matrix',
+    'ordered',
+    'positive_ordered',
+    'real',
+    'row_vector',
+    'simplex',
+    'unit_vector',
+    'vector',
+    'void',
+    'array',
+    'complex'
+)
+
+FUNCTIONS = (
+    'abs',
+    'acos',
+    'acosh',
+    'add_diag',
+    'algebra_solver',
+    'algebra_solver_newton',
+    'append_array',
+    'append_col',
+    'append_row',
+    'arg',
+    'asin',
+    'asinh',
+    'atan',
+    'atan2',
+    'atanh',
+    'bernoulli_cdf',
+    'bernoulli_lccdf',
+    'bernoulli_lcdf',
+    'bernoulli_logit_glm_lpmf',
+    'bernoulli_logit_glm_lupmf',
+    'bernoulli_logit_glm_rng',
+    'bernoulli_logit_lpmf',
+    'bernoulli_logit_lupmf',
+    'bernoulli_logit_rng',
+    'bernoulli_lpmf',
+    'bernoulli_lupmf',
+    'bernoulli_rng',
+    'bessel_first_kind',
+    'bessel_second_kind',
+    'beta',
+    'beta_binomial_cdf',
+    'beta_binomial_lccdf',
+    'beta_binomial_lcdf',
+    'beta_binomial_lpmf',
+    'beta_binomial_lupmf',
+    'beta_binomial_rng',
+    'beta_cdf',
+    'beta_lccdf',
+    'beta_lcdf',
+    'beta_lpdf',
+    'beta_lupdf',
+    'beta_proportion_lccdf',
+    'beta_proportion_lcdf',
+    'beta_proportion_rng',
+    'beta_rng',
+    'binary_log_loss',
+    'binomial_cdf',
+    'binomial_coefficient_log',
+    'binomial_lccdf',
+    'binomial_lcdf',
+    'binomial_logit_lpmf',
+    'binomial_logit_lupmf',
+    'binomial_lpmf',
+    'binomial_lupmf',
+    'binomial_rng',
+    'block',
+    'categorical_logit_glm_lpmf',
+    'categorical_logit_glm_lupmf',
+    'categorical_logit_lpmf',
+    'categorical_logit_lupmf',
+    'categorical_logit_rng',
+    'categorical_lpmf',
+    'categorical_lupmf',
+    'categorical_rng',
+    'cauchy_cdf',
+    'cauchy_lccdf',
+    'cauchy_lcdf',
+    'cauchy_lpdf',
+    'cauchy_lupdf',
+    'cauchy_rng',
+    'cbrt',
+    'ceil',
+    'chi_square_cdf',
+    'chi_square_lccdf',
+    'chi_square_lcdf',
+    'chi_square_lpdf',
+    'chi_square_lupdf',
+    'chi_square_rng',
+    'chol2inv',
+    'cholesky_decompose',
+    'choose',
+    'col',
+    'cols',
+    'columns_dot_product',
+    'columns_dot_self',
+    'conj',
+    'cos',
+    'cosh',
+    'cov_exp_quad',
+    'crossprod',
+    'csr_extract_u',
+    'csr_extract_v',
+    'csr_extract_w',
+    'csr_matrix_times_vector',
+    'csr_to_dense_matrix',
+    'cumulative_sum',
+    'dae',
+    'dae_tol',
+    'determinant',
+    'diag_matrix',
+    'diag_post_multiply',
+    'diag_pre_multiply',
+    'diagonal',
+    'digamma',
+    'dims',
+    'dirichlet_lpdf',
+    'dirichlet_lupdf',
+    'dirichlet_rng',
+    'discrete_range_cdf',
+    'discrete_range_lccdf',
+    'discrete_range_lcdf',
+    'discrete_range_lpmf',
+    'discrete_range_lupmf',
+    'discrete_range_rng',
+    'distance',
+    'dot_product',
+    'dot_self',
+    'double_exponential_cdf',
+    'double_exponential_lccdf',
+    'double_exponential_lcdf',
+    'double_exponential_lpdf',
+    'double_exponential_lupdf',
+    'double_exponential_rng',
+    'e',
+    'eigenvalues_sym',
+    'eigenvectors_sym',
+    'erf',
+    'erfc',
+    'exp',
+    'exp2',
+    'exp_mod_normal_cdf',
+    'exp_mod_normal_lccdf',
+    'exp_mod_normal_lcdf',
+    'exp_mod_normal_lpdf',
+    'exp_mod_normal_lupdf',
+    'exp_mod_normal_rng',
+    'expm1',
+    'exponential_cdf',
+    'exponential_lccdf',
+    'exponential_lcdf',
+    'exponential_lpdf',
+    'exponential_lupdf',
+    'exponential_rng',
+    'fabs',
+    'falling_factorial',
+    'fdim',
+    'floor',
+    'fma',
+    'fmax',
+    'fmin',
+    'fmod',
+    'frechet_cdf',
+    'frechet_lccdf',
+    'frechet_lcdf',
+    'frechet_lpdf',
+    'frechet_lupdf',
+    'frechet_rng',
+    'gamma_cdf',
+    'gamma_lccdf',
+    'gamma_lcdf',
+    'gamma_lpdf',
+    'gamma_lupdf',
+    'gamma_p',
+    'gamma_q',
+    'gamma_rng',
+    'gaussian_dlm_obs_lpdf',
+    'gaussian_dlm_obs_lupdf',
+    'generalized_inverse',
+    'get_imag',
+    'get_lp',
+    'get_real',
+    'gumbel_cdf',
+    'gumbel_lccdf',
+    'gumbel_lcdf',
+    'gumbel_lpdf',
+    'gumbel_lupdf',
+    'gumbel_rng',
+    'head',
+    'hmm_hidden_state_prob',
+    'hmm_latent_rng',
+    'hmm_marginal',
+    'hypergeometric_lpmf',
+    'hypergeometric_lupmf',
+    'hypergeometric_rng',
+    'hypot',
+    'identity_matrix',
+    'inc_beta',
+    'int_step',
+    'integrate_1d',
+    'integrate_ode',
+    'integrate_ode_adams',
+    'integrate_ode_bdf',
+    'integrate_ode_rk45',
+    'inv',
+    'inv_chi_square_cdf',
+    'inv_chi_square_lccdf',
+    'inv_chi_square_lcdf',
+    'inv_chi_square_lpdf',
+    'inv_chi_square_lupdf',
+    'inv_chi_square_rng',
+    'inv_cloglog',
+    'inv_erfc',
+    'inv_gamma_cdf',
+    'inv_gamma_lccdf',
+    'inv_gamma_lcdf',
+    'inv_gamma_lpdf',
+    'inv_gamma_lupdf',
+    'inv_gamma_rng',
+    'inv_logit',
+    'inv_Phi',
+    'inv_sqrt',
+    'inv_square',
+    'inv_wishart_lpdf',
+    'inv_wishart_lupdf',
+    'inv_wishart_rng',
+    'inverse',
+    'inverse_spd',
+    'is_inf',
+    'is_nan',
+    'lambert_w0',
+    'lambert_wm1',
+    'lbeta',
+    'lchoose',
+    'ldexp',
+    'lgamma',
+    'linspaced_array',
+    'linspaced_int_array',
+    'linspaced_row_vector',
+    'linspaced_vector',
+    'lkj_corr_cholesky_lpdf',
+    'lkj_corr_cholesky_lupdf',
+    'lkj_corr_cholesky_rng',
+    'lkj_corr_lpdf',
+    'lkj_corr_lupdf',
+    'lkj_corr_rng',
+    'lmgamma',
+    'lmultiply',
+    'log',
+    'log10',
+    'log1m',
+    'log1m_exp',
+    'log1m_inv_logit',
+    'log1p',
+    'log1p_exp',
+    'log2',
+    'log_determinant',
+    'log_diff_exp',
+    'log_falling_factorial',
+    'log_inv_logit',
+    'log_inv_logit_diff',
+    'log_mix',
+    'log_modified_bessel_first_kind',
+    'log_rising_factorial',
+    'log_softmax',
+    'log_sum_exp',
+    'logistic_cdf',
+    'logistic_lccdf',
+    'logistic_lcdf',
+    'logistic_lpdf',
+    'logistic_lupdf',
+    'logistic_rng',
+    'logit',
+    'loglogistic_cdf',
+    'loglogistic_lpdf',
+    'loglogistic_rng',
+    'lognormal_cdf',
+    'lognormal_lccdf',
+    'lognormal_lcdf',
+    'lognormal_lpdf',
+    'lognormal_lupdf',
+    'lognormal_rng',
+    'machine_precision',
+    'map_rect',
+    'matrix_exp',
+    'matrix_exp_multiply',
+    'matrix_power',
+    'max',
+    'mdivide_left_spd',
+    'mdivide_left_tri_low',
+    'mdivide_right_spd',
+    'mdivide_right_tri_low',
+    'mean',
+    'min',
+    'modified_bessel_first_kind',
+    'modified_bessel_second_kind',
+    'multi_gp_cholesky_lpdf',
+    'multi_gp_cholesky_lupdf',
+    'multi_gp_lpdf',
+    'multi_gp_lupdf',
+    'multi_normal_cholesky_lpdf',
+    'multi_normal_cholesky_lupdf',
+    'multi_normal_cholesky_rng',
+    'multi_normal_lpdf',
+    'multi_normal_lupdf',
+    'multi_normal_prec_lpdf',
+    'multi_normal_prec_lupdf',
+    'multi_normal_rng',
+    'multi_student_t_lpdf',
+    'multi_student_t_lupdf',
+    'multi_student_t_rng',
+    'multinomial_logit_lpmf',
+    'multinomial_logit_lupmf',
+    'multinomial_logit_rng',
+    'multinomial_lpmf',
+    'multinomial_lupmf',
+    'multinomial_rng',
+    'multiply_log',
+    'multiply_lower_tri_self_transpose',
+    'neg_binomial_2_cdf',
+    'neg_binomial_2_lccdf',
+    'neg_binomial_2_lcdf',
+    'neg_binomial_2_log_glm_lpmf',
+    'neg_binomial_2_log_glm_lupmf',
+    'neg_binomial_2_log_lpmf',
+    'neg_binomial_2_log_lupmf',
+    'neg_binomial_2_log_rng',
+    'neg_binomial_2_lpmf',
+    'neg_binomial_2_lupmf',
+    'neg_binomial_2_rng',
+    'neg_binomial_cdf',
+    'neg_binomial_lccdf',
+    'neg_binomial_lcdf',
+    'neg_binomial_lpmf',
+    'neg_binomial_lupmf',
+    'neg_binomial_rng',
+    'negative_infinity',
+    'norm',
+    'normal_cdf',
+    'normal_id_glm_lpdf',
+    'normal_id_glm_lupdf',
+    'normal_lccdf',
+    'normal_lcdf',
+    'normal_lpdf',
+    'normal_lupdf',
+    'normal_rng',
+    'not_a_number',
+    'num_elements',
+    'ode_adams',
+    'ode_adams_tol',
+    'ode_adjoint_tol_ctl',
+    'ode_bdf',
+    'ode_bdf_tol',
+    'ode_ckrk',
+    'ode_ckrk_tol',
+    'ode_rk45',
+    'ode_rk45_tol',
+    'one_hot_array',
+    'one_hot_int_array',
+    'one_hot_row_vector',
+    'one_hot_vector',
+    'ones_array',
+    'ones_int_array',
+    'ones_row_vector',
+    'ones_vector',
+    'ordered_logistic_glm_lpmf',
+    'ordered_logistic_glm_lupmf',
+    'ordered_logistic_lpmf',
+    'ordered_logistic_lupmf',
+    'ordered_logistic_rng',
+    'ordered_probit_lpmf',
+    'ordered_probit_lupmf',
+    'ordered_probit_rng',
+    'owens_t',
+    'pareto_cdf',
+    'pareto_lccdf',
+    'pareto_lcdf',
+    'pareto_lpdf',
+    'pareto_lupdf',
+    'pareto_rng',
+    'pareto_type_2_cdf',
+    'pareto_type_2_lccdf',
+    'pareto_type_2_lcdf',
+    'pareto_type_2_lpdf',
+    'pareto_type_2_lupdf',
+    'pareto_type_2_rng',
+    'Phi',
+    'Phi_approx',
+    'pi',
+    'poisson_cdf',
+    'poisson_lccdf',
+    'poisson_lcdf',
+    'poisson_log_glm_lpmf',
+    'poisson_log_glm_lupmf',
+    'poisson_log_lpmf',
+    'poisson_log_lupmf',
+    'poisson_log_rng',
+    'poisson_lpmf',
+    'poisson_lupmf',
+    'poisson_rng',
+    'polar',
+    'positive_infinity',
+    'pow',
+    'print',
+    'prod',
+    'proj',
+    'qr_Q',
+    'qr_R',
+    'qr_thin_Q',
+    'qr_thin_R',
+    'quad_form',
+    'quad_form_diag',
+    'quad_form_sym',
+    'quantile',
+    'rank',
+    'rayleigh_cdf',
+    'rayleigh_lccdf',
+    'rayleigh_lcdf',
+    'rayleigh_lpdf',
+    'rayleigh_lupdf',
+    'rayleigh_rng',
+    'reduce_sum',
+    'reject',
+    'rep_array',
+    'rep_matrix',
+    'rep_row_vector',
+    'rep_vector',
+    'reverse',
+    'rising_factorial',
+    'round',
+    'row',
+    'rows',
+    'rows_dot_product',
+    'rows_dot_self',
+    'scale_matrix_exp_multiply',
+    'scaled_inv_chi_square_cdf',
+    'scaled_inv_chi_square_lccdf',
+    'scaled_inv_chi_square_lcdf',
+    'scaled_inv_chi_square_lpdf',
+    'scaled_inv_chi_square_lupdf',
+    'scaled_inv_chi_square_rng',
+    'sd',
+    'segment',
+    'sin',
+    'singular_values',
+    'sinh',
+    'size',
+    'skew_double_exponential_cdf',
+    'skew_double_exponential_lccdf',
+    'skew_double_exponential_lcdf',
+    'skew_double_exponential_lpdf',
+    'skew_double_exponential_lupdf',
+    'skew_double_exponential_rng',
+    'skew_normal_cdf',
+    'skew_normal_lccdf',
+    'skew_normal_lcdf',
+    'skew_normal_lpdf',
+    'skew_normal_lupdf',
+    'skew_normal_rng',
+    'softmax',
+    'sort_asc',
+    'sort_desc',
+    'sort_indices_asc',
+    'sort_indices_desc',
+    'sqrt',
+    'sqrt2',
+    'square',
+    'squared_distance',
+    'std_normal_cdf',
+    'std_normal_lccdf',
+    'std_normal_lcdf',
+    'std_normal_lpdf',
+    'std_normal_lupdf',
+    'std_normal_rng',
+    'step',
+    'student_t_cdf',
+    'student_t_lccdf',
+    'student_t_lcdf',
+    'student_t_lpdf',
+    'student_t_lupdf',
+    'student_t_rng',
+    'sub_col',
+    'sub_row',
+    'sum',
+    'svd_U',
+    'svd_V',
+    'symmetrize_from_lower_tri',
+    'tail',
+    'tan',
+    'tanh',
+    'target',
+    'tcrossprod',
+    'tgamma',
+    'to_array_1d',
+    'to_array_2d',
+    'to_complex',
+    'to_matrix',
+    'to_row_vector',
+    'to_vector',
+    'trace',
+    'trace_gen_quad_form',
+    'trace_quad_form',
+    'trigamma',
+    'trunc',
+    'uniform_cdf',
+    'uniform_lccdf',
+    'uniform_lcdf',
+    'uniform_lpdf',
+    'uniform_lupdf',
+    'uniform_rng',
+    'uniform_simplex',
+    'variance',
+    'von_mises_cdf',
+    'von_mises_lccdf',
+    'von_mises_lcdf',
+    'von_mises_lpdf',
+    'von_mises_lupdf',
+    'von_mises_rng',
+    'weibull_cdf',
+    'weibull_lccdf',
+    'weibull_lcdf',
+    'weibull_lpdf',
+    'weibull_lupdf',
+    'weibull_rng',
+    'wiener_lpdf',
+    'wiener_lupdf',
+    'wishart_lpdf',
+    'wishart_lupdf',
+    'wishart_rng',
+    'zeros_array',
+    'zeros_int_array',
+    'zeros_row_vector'
+)
+
+DISTRIBUTIONS = (
+    'bernoulli',
+    'bernoulli_logit',
+    'bernoulli_logit_glm',
+    'beta',
+    'beta_binomial',
+    'binomial',
+    'binomial_logit',
+    'categorical',
+    'categorical_logit',
+    'categorical_logit_glm',
+    'cauchy',
+    'chi_square',
+    'dirichlet',
+    'discrete_range',
+    'double_exponential',
+    'exp_mod_normal',
+    'exponential',
+    'frechet',
+    'gamma',
+    'gaussian_dlm_obs',
+    'gumbel',
+    'hypergeometric',
+    'inv_chi_square',
+    'inv_gamma',
+    'inv_wishart',
+    'lkj_corr',
+    'lkj_corr_cholesky',
+    'logistic',
+    'loglogistic',
+    'lognormal',
+    'multi_gp',
+    'multi_gp_cholesky',
+    'multi_normal',
+    'multi_normal_cholesky',
+    'multi_normal_prec',
+    'multi_student_t',
+    'multinomial',
+    'multinomial_logit',
+    'neg_binomial',
+    'neg_binomial_2',
+    'neg_binomial_2_log',
+    'neg_binomial_2_log_glm',
+    'normal',
+    'normal_id_glm',
+    'ordered_logistic',
+    'ordered_logistic_glm',
+    'ordered_probit',
+    'pareto',
+    'pareto_type_2',
+    'poisson',
+    'poisson_log',
+    'poisson_log_glm',
+    'rayleigh',
+    'scaled_inv_chi_square',
+    'skew_double_exponential',
+    'skew_normal',
+    'std_normal',
+    'student_t',
+    'uniform',
+    'von_mises',
+    'weibull',
+    'wiener',
+    'wishart',
+)
+
+RESERVED = (
+    'repeat',
+    'until',
+    'then',
+    'true',
+    'false',
+    'var',
+    'struct',
+    'typedef',
+    'export',
+    'auto',
+    'extern',
+    'var',
+    'static',
+)
diff --git a/.venv/Lib/site-packages/pygments/lexers/_stata_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_stata_builtins.py
new file mode 100644 (file)
index 0000000..6a36f04
--- /dev/null
@@ -0,0 +1,457 @@
+"""
+    pygments.lexers._stata_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Builtins for Stata
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+builtins_special = (
+    "if", "in", "using", "replace", "by", "gen", "generate"
+)
+
+builtins_base = (
+    "if", "else", "in", "foreach", "for", "forv", "forva",
+    "forval", "forvalu", "forvalue", "forvalues", "by", "bys",
+    "bysort", "quietly", "qui", "about", "ac",
+    "ac_7", "acprplot", "acprplot_7", "adjust", "ado", "adopath",
+    "adoupdate", "alpha", "ameans", "an", "ano", "anov", "anova",
+    "anova_estat", "anova_terms", "anovadef", "aorder", "ap", "app",
+    "appe", "appen", "append", "arch", "arch_dr", "arch_estat",
+    "arch_p", "archlm", "areg", "areg_p", "args", "arima",
+    "arima_dr", "arima_estat", "arima_p", "as", "asmprobit",
+    "asmprobit_estat", "asmprobit_lf", "asmprobit_mfx__dlg",
+    "asmprobit_p", "ass", "asse", "asser", "assert", "avplot",
+    "avplot_7", "avplots", "avplots_7", "bcskew0", "bgodfrey",
+    "binreg", "bip0_lf", "biplot", "bipp_lf", "bipr_lf",
+    "bipr_p", "biprobit", "bitest", "bitesti", "bitowt", "blogit",
+    "bmemsize", "boot", "bootsamp", "bootstrap", "bootstrap_8",
+    "boxco_l", "boxco_p", "boxcox", "boxcox_6", "boxcox_p",
+    "bprobit", "br", "break", "brier", "bro", "brow", "brows",
+    "browse", "brr", "brrstat", "bs", "bs_7", "bsampl_w",
+    "bsample", "bsample_7", "bsqreg", "bstat", "bstat_7", "bstat_8",
+    "bstrap", "bstrap_7", "ca", "ca_estat", "ca_p", "cabiplot",
+    "camat", "canon", "canon_8", "canon_8_p", "canon_estat",
+    "canon_p", "cap", "caprojection", "capt", "captu", "captur",
+    "capture", "cat", "cc", "cchart", "cchart_7", "cci",
+    "cd", "censobs_table", "centile", "cf", "char", "chdir",
+    "checkdlgfiles", "checkestimationsample", "checkhlpfiles",
+    "checksum", "chelp", "ci", "cii", "cl", "class", "classutil",
+    "clear", "cli", "clis", "clist", "clo", "clog", "clog_lf",
+    "clog_p", "clogi", "clogi_sw", "clogit", "clogit_lf",
+    "clogit_p", "clogitp", "clogl_sw", "cloglog", "clonevar",
+    "clslistarray", "cluster", "cluster_measures", "cluster_stop",
+    "cluster_tree", "cluster_tree_8", "clustermat", "cmdlog",
+    "cnr", "cnre", "cnreg", "cnreg_p", "cnreg_sw", "cnsreg",
+    "codebook", "collaps4", "collapse", "colormult_nb",
+    "colormult_nw", "compare", "compress", "conf", "confi",
+    "confir", "confirm", "conren", "cons", "const", "constr",
+    "constra", "constrai", "constrain", "constraint", "continue",
+    "contract", "copy", "copyright", "copysource", "cor", "corc",
+    "corr", "corr2data", "corr_anti", "corr_kmo", "corr_smc",
+    "corre", "correl", "correla", "correlat", "correlate",
+    "corrgram", "cou", "coun", "count", "cox", "cox_p", "cox_sw",
+    "coxbase", "coxhaz", "coxvar", "cprplot", "cprplot_7",
+    "crc", "cret", "cretu", "cretur", "creturn", "cross", "cs",
+    "cscript", "cscript_log", "csi", "ct", "ct_is", "ctset",
+    "ctst_5", "ctst_st", "cttost", "cumsp", "cumsp_7", "cumul",
+    "cusum", "cusum_7", "cutil", "d", "datasig", "datasign",
+    "datasigna", "datasignat", "datasignatu", "datasignatur",
+    "datasignature", "datetof", "db", "dbeta", "de", "dec",
+    "deco", "decod", "decode", "deff", "des", "desc", "descr",
+    "descri", "describ", "describe", "destring", "dfbeta",
+    "dfgls", "dfuller", "di", "di_g", "dir", "dirstats", "dis",
+    "discard", "disp", "disp_res", "disp_s", "displ", "displa",
+    "display", "distinct", "do", "doe", "doed", "doedi",
+    "doedit", "dotplot", "dotplot_7", "dprobit", "drawnorm",
+    "drop", "ds", "ds_util", "dstdize", "duplicates", "durbina",
+    "dwstat", "dydx", "e", "ed", "edi", "edit", "egen",
+    "eivreg", "emdef", "end", "en", "enc", "enco", "encod", "encode",
+    "eq", "erase", "ereg", "ereg_lf", "ereg_p", "ereg_sw",
+    "ereghet", "ereghet_glf", "ereghet_glf_sh", "ereghet_gp",
+    "ereghet_ilf", "ereghet_ilf_sh", "ereghet_ip", "eret",
+    "eretu", "eretur", "ereturn", "err", "erro", "error", "est",
+    "est_cfexist", "est_cfname", "est_clickable", "est_expand",
+    "est_hold", "est_table", "est_unhold", "est_unholdok",
+    "estat", "estat_default", "estat_summ", "estat_vce_only",
+    "esti", "estimates", "etodow", "etof", "etomdy", "ex",
+    "exi", "exit", "expand", "expandcl", "fac", "fact", "facto",
+    "factor", "factor_estat", "factor_p", "factor_pca_rotated",
+    "factor_rotate", "factormat", "fcast", "fcast_compute",
+    "fcast_graph", "fdades", "fdadesc", "fdadescr", "fdadescri",
+    "fdadescrib", "fdadescribe", "fdasav", "fdasave", "fdause",
+    "fh_st", "open", "read", "close",
+    "file", "filefilter", "fillin", "find_hlp_file", "findfile",
+    "findit", "findit_7", "fit", "fl", "fli", "flis", "flist",
+    "for5_0", "form", "forma", "format", "fpredict", "frac_154",
+    "frac_adj", "frac_chk", "frac_cox", "frac_ddp", "frac_dis",
+    "frac_dv", "frac_in", "frac_mun", "frac_pp", "frac_pq",
+    "frac_pv", "frac_wgt", "frac_xo", "fracgen", "fracplot",
+    "fracplot_7", "fracpoly", "fracpred", "fron_ex", "fron_hn",
+    "fron_p", "fron_tn", "fron_tn2", "frontier", "ftodate", "ftoe",
+    "ftomdy", "ftowdate", "g", "gamhet_glf", "gamhet_gp",
+    "gamhet_ilf", "gamhet_ip", "gamma", "gamma_d2", "gamma_p",
+    "gamma_sw", "gammahet", "gdi_hexagon", "gdi_spokes", "ge",
+    "gen", "gene", "gener", "genera", "generat", "generate",
+    "genrank", "genstd", "genvmean", "gettoken", "gl", "gladder",
+    "gladder_7", "glim_l01", "glim_l02", "glim_l03", "glim_l04",
+    "glim_l05", "glim_l06", "glim_l07", "glim_l08", "glim_l09",
+    "glim_l10", "glim_l11", "glim_l12", "glim_lf", "glim_mu",
+    "glim_nw1", "glim_nw2", "glim_nw3", "glim_p", "glim_v1",
+    "glim_v2", "glim_v3", "glim_v4", "glim_v5", "glim_v6",
+    "glim_v7", "glm", "glm_6", "glm_p", "glm_sw", "glmpred", "glo",
+    "glob", "globa", "global", "glogit", "glogit_8", "glogit_p",
+    "gmeans", "gnbre_lf", "gnbreg", "gnbreg_5", "gnbreg_p",
+    "gomp_lf", "gompe_sw", "gomper_p", "gompertz", "gompertzhet",
+    "gomphet_glf", "gomphet_glf_sh", "gomphet_gp", "gomphet_ilf",
+    "gomphet_ilf_sh", "gomphet_ip", "gphdot", "gphpen",
+    "gphprint", "gprefs", "gprobi_p", "gprobit", "gprobit_8", "gr",
+    "gr7", "gr_copy", "gr_current", "gr_db", "gr_describe",
+    "gr_dir", "gr_draw", "gr_draw_replay", "gr_drop", "gr_edit",
+    "gr_editviewopts", "gr_example", "gr_example2", "gr_export",
+    "gr_print", "gr_qscheme", "gr_query", "gr_read", "gr_rename",
+    "gr_replay", "gr_save", "gr_set", "gr_setscheme", "gr_table",
+    "gr_undo", "gr_use", "graph", "graph7", "grebar", "greigen",
+    "greigen_7", "greigen_8", "grmeanby", "grmeanby_7",
+    "gs_fileinfo", "gs_filetype", "gs_graphinfo", "gs_stat",
+    "gsort", "gwood", "h", "hadimvo", "hareg", "hausman",
+    "haver", "he", "heck_d2", "heckma_p", "heckman", "heckp_lf",
+    "heckpr_p", "heckprob", "hel", "help", "hereg", "hetpr_lf",
+    "hetpr_p", "hetprob", "hettest", "hexdump", "hilite",
+    "hist", "hist_7", "histogram", "hlogit", "hlu", "hmeans",
+    "hotel", "hotelling", "hprobit", "hreg", "hsearch", "icd9",
+    "icd9_ff", "icd9p", "iis", "impute", "imtest", "inbase",
+    "include", "inf", "infi", "infil", "infile", "infix", "inp",
+    "inpu", "input", "ins", "insheet", "insp", "inspe",
+    "inspec", "inspect", "integ", "inten", "intreg", "intreg_7",
+    "intreg_p", "intrg2_ll", "intrg_ll", "intrg_ll2", "ipolate",
+    "iqreg", "ir", "irf", "irf_create", "irfm", "iri", "is_svy",
+    "is_svysum", "isid", "istdize", "ivprob_1_lf", "ivprob_lf",
+    "ivprobit", "ivprobit_p", "ivreg", "ivreg_footnote",
+    "ivtob_1_lf", "ivtob_lf", "ivtobit", "ivtobit_p", "jackknife",
+    "jacknife", "jknife", "jknife_6", "jknife_8", "jkstat",
+    "joinby", "kalarma1", "kap", "kap_3", "kapmeier", "kappa",
+    "kapwgt", "kdensity", "kdensity_7", "keep", "ksm", "ksmirnov",
+    "ktau", "kwallis", "l", "la", "lab", "labe", "label",
+    "labelbook", "ladder", "levels", "levelsof", "leverage",
+    "lfit", "lfit_p", "li", "lincom", "line", "linktest",
+    "lis", "list", "lloghet_glf", "lloghet_glf_sh", "lloghet_gp",
+    "lloghet_ilf", "lloghet_ilf_sh", "lloghet_ip", "llogi_sw",
+    "llogis_p", "llogist", "llogistic", "llogistichet",
+    "lnorm_lf", "lnorm_sw", "lnorma_p", "lnormal", "lnormalhet",
+    "lnormhet_glf", "lnormhet_glf_sh", "lnormhet_gp",
+    "lnormhet_ilf", "lnormhet_ilf_sh", "lnormhet_ip", "lnskew0",
+    "loadingplot", "loc", "loca", "local", "log", "logi",
+    "logis_lf", "logistic", "logistic_p", "logit", "logit_estat",
+    "logit_p", "loglogs", "logrank", "loneway", "lookfor",
+    "lookup", "lowess", "lowess_7", "lpredict", "lrecomp", "lroc",
+    "lroc_7", "lrtest", "ls", "lsens", "lsens_7", "lsens_x",
+    "lstat", "ltable", "ltable_7", "ltriang", "lv", "lvr2plot",
+    "lvr2plot_7", "m", "ma", "mac", "macr", "macro", "makecns",
+    "man", "manova", "manova_estat", "manova_p", "manovatest",
+    "mantel", "mark", "markin", "markout", "marksample", "mat",
+    "mat_capp", "mat_order", "mat_put_rr", "mat_rapp", "mata",
+    "mata_clear", "mata_describe", "mata_drop", "mata_matdescribe",
+    "mata_matsave", "mata_matuse", "mata_memory", "mata_mlib",
+    "mata_mosave", "mata_rename", "mata_which", "matalabel",
+    "matcproc", "matlist", "matname", "matr", "matri",
+    "matrix", "matrix_input__dlg", "matstrik", "mcc", "mcci",
+    "md0_", "md1_", "md1debug_", "md2_", "md2debug_", "mds",
+    "mds_estat", "mds_p", "mdsconfig", "mdslong", "mdsmat",
+    "mdsshepard", "mdytoe", "mdytof", "me_derd", "mean",
+    "means", "median", "memory", "memsize", "meqparse", "mer",
+    "merg", "merge", "mfp", "mfx", "mhelp", "mhodds", "minbound",
+    "mixed_ll", "mixed_ll_reparm", "mkassert", "mkdir",
+    "mkmat", "mkspline", "ml", "ml_5", "ml_adjs", "ml_bhhhs",
+    "ml_c_d", "ml_check", "ml_clear", "ml_cnt", "ml_debug",
+    "ml_defd", "ml_e0", "ml_e0_bfgs", "ml_e0_cycle", "ml_e0_dfp",
+    "ml_e0i", "ml_e1", "ml_e1_bfgs", "ml_e1_bhhh", "ml_e1_cycle",
+    "ml_e1_dfp", "ml_e2", "ml_e2_cycle", "ml_ebfg0", "ml_ebfr0",
+    "ml_ebfr1", "ml_ebh0q", "ml_ebhh0", "ml_ebhr0", "ml_ebr0i",
+    "ml_ecr0i", "ml_edfp0", "ml_edfr0", "ml_edfr1", "ml_edr0i",
+    "ml_eds", "ml_eer0i", "ml_egr0i", "ml_elf", "ml_elf_bfgs",
+    "ml_elf_bhhh", "ml_elf_cycle", "ml_elf_dfp", "ml_elfi",
+    "ml_elfs", "ml_enr0i", "ml_enrr0", "ml_erdu0", "ml_erdu0_bfgs",
+    "ml_erdu0_bhhh", "ml_erdu0_bhhhq", "ml_erdu0_cycle",
+    "ml_erdu0_dfp", "ml_erdu0_nrbfgs", "ml_exde", "ml_footnote",
+    "ml_geqnr", "ml_grad0", "ml_graph", "ml_hbhhh", "ml_hd0",
+    "ml_hold", "ml_init", "ml_inv", "ml_log", "ml_max",
+    "ml_mlout", "ml_mlout_8", "ml_model", "ml_nb0", "ml_opt",
+    "ml_p", "ml_plot", "ml_query", "ml_rdgrd", "ml_repor",
+    "ml_s_e", "ml_score", "ml_searc", "ml_technique", "ml_unhold",
+    "mleval", "mlf_", "mlmatbysum", "mlmatsum", "mlog", "mlogi",
+    "mlogit", "mlogit_footnote", "mlogit_p", "mlopts", "mlsum",
+    "mlvecsum", "mnl0_", "mor", "more", "mov", "move", "mprobit",
+    "mprobit_lf", "mprobit_p", "mrdu0_", "mrdu1_", "mvdecode",
+    "mvencode", "mvreg", "mvreg_estat", "n", "nbreg",
+    "nbreg_al", "nbreg_lf", "nbreg_p", "nbreg_sw", "nestreg", "net",
+    "newey", "newey_7", "newey_p", "news", "nl", "nl_7", "nl_9",
+    "nl_9_p", "nl_p", "nl_p_7", "nlcom", "nlcom_p", "nlexp2",
+    "nlexp2_7", "nlexp2a", "nlexp2a_7", "nlexp3", "nlexp3_7",
+    "nlgom3", "nlgom3_7", "nlgom4", "nlgom4_7", "nlinit", "nllog3",
+    "nllog3_7", "nllog4", "nllog4_7", "nlog_rd", "nlogit",
+    "nlogit_p", "nlogitgen", "nlogittree", "nlpred", "no",
+    "nobreak", "noi", "nois", "noisi", "noisil", "noisily", "note",
+    "notes", "notes_dlg", "nptrend", "numlabel", "numlist", "odbc",
+    "old_ver", "olo", "olog", "ologi", "ologi_sw", "ologit",
+    "ologit_p", "ologitp", "on", "one", "onew", "onewa", "oneway",
+    "op_colnm", "op_comp", "op_diff", "op_inv", "op_str", "opr",
+    "opro", "oprob", "oprob_sw", "oprobi", "oprobi_p", "oprobit",
+    "oprobitp", "opts_exclusive", "order", "orthog", "orthpoly",
+    "ou", "out", "outf", "outfi", "outfil", "outfile", "outs",
+    "outsh", "outshe", "outshee", "outsheet", "ovtest", "pac",
+    "pac_7", "palette", "parse", "parse_dissim", "pause", "pca",
+    "pca_8", "pca_display", "pca_estat", "pca_p", "pca_rotate",
+    "pcamat", "pchart", "pchart_7", "pchi", "pchi_7", "pcorr",
+    "pctile", "pentium", "pergram", "pergram_7", "permute",
+    "permute_8", "personal", "peto_st", "pkcollapse", "pkcross",
+    "pkequiv", "pkexamine", "pkexamine_7", "pkshape", "pksumm",
+    "pksumm_7", "pl", "plo", "plot", "plugin", "pnorm",
+    "pnorm_7", "poisgof", "poiss_lf", "poiss_sw", "poisso_p",
+    "poisson", "poisson_estat", "post", "postclose", "postfile",
+    "postutil", "pperron", "pr", "prais", "prais_e", "prais_e2",
+    "prais_p", "predict", "predictnl", "preserve", "print",
+    "pro", "prob", "probi", "probit", "probit_estat", "probit_p",
+    "proc_time", "procoverlay", "procrustes", "procrustes_estat",
+    "procrustes_p", "profiler", "prog", "progr", "progra",
+    "program", "prop", "proportion", "prtest", "prtesti", "pwcorr",
+    "pwd", "q", "s", "qby", "qbys", "qchi", "qchi_7", "qladder",
+    "qladder_7", "qnorm", "qnorm_7", "qqplot", "qqplot_7", "qreg",
+    "qreg_c", "qreg_p", "qreg_sw", "qu", "quadchk", "quantile",
+    "quantile_7", "que", "quer", "query", "range", "ranksum",
+    "ratio", "rchart", "rchart_7", "rcof", "recast", "reclink",
+    "recode", "reg", "reg3", "reg3_p", "regdw", "regr", "regre",
+    "regre_p2", "regres", "regres_p", "regress", "regress_estat",
+    "regriv_p", "remap", "ren", "rena", "renam", "rename",
+    "renpfix", "repeat", "replace", "report", "reshape",
+    "restore", "ret", "retu", "retur", "return", "rm", "rmdir",
+    "robvar", "roccomp", "roccomp_7", "roccomp_8", "rocf_lf",
+    "rocfit", "rocfit_8", "rocgold", "rocplot", "rocplot_7",
+    "roctab", "roctab_7", "rolling", "rologit", "rologit_p",
+    "rot", "rota", "rotat", "rotate", "rotatemat", "rreg",
+    "rreg_p", "ru", "run", "runtest", "rvfplot", "rvfplot_7",
+    "rvpplot", "rvpplot_7", "sa", "safesum", "sample",
+    "sampsi", "sav", "save", "savedresults", "saveold", "sc",
+    "sca", "scal", "scala", "scalar", "scatter", "scm_mine",
+    "sco", "scob_lf", "scob_p", "scobi_sw", "scobit", "scor",
+    "score", "scoreplot", "scoreplot_help", "scree", "screeplot",
+    "screeplot_help", "sdtest", "sdtesti", "se", "search",
+    "separate", "seperate", "serrbar", "serrbar_7", "serset", "set",
+    "set_defaults", "sfrancia", "sh", "she", "shel", "shell",
+    "shewhart", "shewhart_7", "signestimationsample", "signrank",
+    "signtest", "simul", "simul_7", "simulate", "simulate_8",
+    "sktest", "sleep", "slogit", "slogit_d2", "slogit_p", "smooth",
+    "snapspan", "so", "sor", "sort", "spearman", "spikeplot",
+    "spikeplot_7", "spikeplt", "spline_x", "split", "sqreg",
+    "sqreg_p", "sret", "sretu", "sretur", "sreturn", "ssc", "st",
+    "st_ct", "st_hc", "st_hcd", "st_hcd_sh", "st_is", "st_issys",
+    "st_note", "st_promo", "st_set", "st_show", "st_smpl",
+    "st_subid", "stack", "statsby", "statsby_8", "stbase", "stci",
+    "stci_7", "stcox", "stcox_estat", "stcox_fr", "stcox_fr_ll",
+    "stcox_p", "stcox_sw", "stcoxkm", "stcoxkm_7", "stcstat",
+    "stcurv", "stcurve", "stcurve_7", "stdes", "stem", "stepwise",
+    "stereg", "stfill", "stgen", "stir", "stjoin", "stmc", "stmh",
+    "stphplot", "stphplot_7", "stphtest", "stphtest_7",
+    "stptime", "strate", "strate_7", "streg", "streg_sw", "streset",
+    "sts", "sts_7", "stset", "stsplit", "stsum", "sttocc",
+    "sttoct", "stvary", "stweib", "su", "suest", "suest_8",
+    "sum", "summ", "summa", "summar", "summari", "summariz",
+    "summarize", "sunflower", "sureg", "survcurv", "survsum",
+    "svar", "svar_p", "svmat", "svy", "svy_disp", "svy_dreg",
+    "svy_est", "svy_est_7", "svy_estat", "svy_get", "svy_gnbreg_p",
+    "svy_head", "svy_header", "svy_heckman_p", "svy_heckprob_p",
+    "svy_intreg_p", "svy_ivreg_p", "svy_logistic_p", "svy_logit_p",
+    "svy_mlogit_p", "svy_nbreg_p", "svy_ologit_p", "svy_oprobit_p",
+    "svy_poisson_p", "svy_probit_p", "svy_regress_p", "svy_sub",
+    "svy_sub_7", "svy_x", "svy_x_7", "svy_x_p", "svydes",
+    "svydes_8", "svygen", "svygnbreg", "svyheckman", "svyheckprob",
+    "svyintreg", "svyintreg_7", "svyintrg", "svyivreg", "svylc",
+    "svylog_p", "svylogit", "svymarkout", "svymarkout_8",
+    "svymean", "svymlog", "svymlogit", "svynbreg", "svyolog",
+    "svyologit", "svyoprob", "svyoprobit", "svyopts",
+    "svypois", "svypois_7", "svypoisson", "svyprobit", "svyprobt",
+    "svyprop", "svyprop_7", "svyratio", "svyreg", "svyreg_p",
+    "svyregress", "svyset", "svyset_7", "svyset_8", "svytab",
+    "svytab_7", "svytest", "svytotal", "sw", "sw_8", "swcnreg",
+    "swcox", "swereg", "swilk", "swlogis", "swlogit",
+    "swologit", "swoprbt", "swpois", "swprobit", "swqreg",
+    "swtobit", "swweib", "symmetry", "symmi", "symplot",
+    "symplot_7", "syntax", "sysdescribe", "sysdir", "sysuse",
+    "szroeter", "ta", "tab", "tab1", "tab2", "tab_or", "tabd",
+    "tabdi", "tabdis", "tabdisp", "tabi", "table", "tabodds",
+    "tabodds_7", "tabstat", "tabu", "tabul", "tabula", "tabulat",
+    "tabulate", "te", "tempfile", "tempname", "tempvar", "tes",
+    "test", "testnl", "testparm", "teststd", "tetrachoric",
+    "time_it", "timer", "tis", "tob", "tobi", "tobit", "tobit_p",
+    "tobit_sw", "token", "tokeni", "tokeniz", "tokenize",
+    "tostring", "total", "translate", "translator", "transmap",
+    "treat_ll", "treatr_p", "treatreg", "trim", "trnb_cons",
+    "trnb_mean", "trpoiss_d2", "trunc_ll", "truncr_p", "truncreg",
+    "tsappend", "tset", "tsfill", "tsline", "tsline_ex",
+    "tsreport", "tsrevar", "tsrline", "tsset", "tssmooth",
+    "tsunab", "ttest", "ttesti", "tut_chk", "tut_wait", "tutorial",
+    "tw", "tware_st", "two", "twoway", "twoway__fpfit_serset",
+    "twoway__function_gen", "twoway__histogram_gen",
+    "twoway__ipoint_serset", "twoway__ipoints_serset",
+    "twoway__kdensity_gen", "twoway__lfit_serset",
+    "twoway__normgen_gen", "twoway__pci_serset",
+    "twoway__qfit_serset", "twoway__scatteri_serset",
+    "twoway__sunflower_gen", "twoway_ksm_serset", "ty", "typ",
+    "type", "typeof", "u", "unab", "unabbrev", "unabcmd",
+    "update", "us", "use", "uselabel", "var", "var_mkcompanion",
+    "var_p", "varbasic", "varfcast", "vargranger", "varirf",
+    "varirf_add", "varirf_cgraph", "varirf_create", "varirf_ctable",
+    "varirf_describe", "varirf_dir", "varirf_drop", "varirf_erase",
+    "varirf_graph", "varirf_ograph", "varirf_rename", "varirf_set",
+    "varirf_table", "varlist", "varlmar", "varnorm", "varsoc",
+    "varstable", "varstable_w", "varstable_w2", "varwle",
+    "vce", "vec", "vec_fevd", "vec_mkphi", "vec_p", "vec_p_w",
+    "vecirf_create", "veclmar", "veclmar_w", "vecnorm",
+    "vecnorm_w", "vecrank", "vecstable", "verinst", "vers",
+    "versi", "versio", "version", "view", "viewsource", "vif",
+    "vwls", "wdatetof", "webdescribe", "webseek", "webuse",
+    "weib1_lf", "weib2_lf", "weib_lf", "weib_lf0", "weibhet_glf",
+    "weibhet_glf_sh", "weibhet_glfa", "weibhet_glfa_sh",
+    "weibhet_gp", "weibhet_ilf", "weibhet_ilf_sh", "weibhet_ilfa",
+    "weibhet_ilfa_sh", "weibhet_ip", "weibu_sw", "weibul_p",
+    "weibull", "weibull_c", "weibull_s", "weibullhet",
+    "wh", "whelp", "whi", "which", "whil", "while", "wilc_st",
+    "wilcoxon", "win", "wind", "windo", "window", "winexec",
+    "wntestb", "wntestb_7", "wntestq", "xchart", "xchart_7",
+    "xcorr", "xcorr_7", "xi", "xi_6", "xmlsav", "xmlsave",
+    "xmluse", "xpose", "xsh", "xshe", "xshel", "xshell",
+    "xt_iis", "xt_tis", "xtab_p", "xtabond", "xtbin_p",
+    "xtclog", "xtcloglog", "xtcloglog_8", "xtcloglog_d2",
+    "xtcloglog_pa_p", "xtcloglog_re_p", "xtcnt_p", "xtcorr",
+    "xtdata", "xtdes", "xtfront_p", "xtfrontier", "xtgee",
+    "xtgee_elink", "xtgee_estat", "xtgee_makeivar", "xtgee_p",
+    "xtgee_plink", "xtgls", "xtgls_p", "xthaus", "xthausman",
+    "xtht_p", "xthtaylor", "xtile", "xtint_p", "xtintreg",
+    "xtintreg_8", "xtintreg_d2", "xtintreg_p", "xtivp_1",
+    "xtivp_2", "xtivreg", "xtline", "xtline_ex", "xtlogit",
+    "xtlogit_8", "xtlogit_d2", "xtlogit_fe_p", "xtlogit_pa_p",
+    "xtlogit_re_p", "xtmixed", "xtmixed_estat", "xtmixed_p",
+    "xtnb_fe", "xtnb_lf", "xtnbreg", "xtnbreg_pa_p",
+    "xtnbreg_refe_p", "xtpcse", "xtpcse_p", "xtpois", "xtpoisson",
+    "xtpoisson_d2", "xtpoisson_pa_p", "xtpoisson_refe_p", "xtpred",
+    "xtprobit", "xtprobit_8", "xtprobit_d2", "xtprobit_re_p",
+    "xtps_fe", "xtps_lf", "xtps_ren", "xtps_ren_8", "xtrar_p",
+    "xtrc", "xtrc_p", "xtrchh", "xtrefe_p", "xtreg", "xtreg_be",
+    "xtreg_fe", "xtreg_ml", "xtreg_pa_p", "xtreg_re",
+    "xtregar", "xtrere_p", "xtset", "xtsf_ll", "xtsf_llti",
+    "xtsum", "xttab", "xttest0", "xttobit", "xttobit_8",
+    "xttobit_p", "xttrans", "yx", "yxview__barlike_draw",
+    "yxview_area_draw", "yxview_bar_draw", "yxview_dot_draw",
+    "yxview_dropline_draw", "yxview_function_draw",
+    "yxview_iarrow_draw", "yxview_ilabels_draw",
+    "yxview_normal_draw", "yxview_pcarrow_draw",
+    "yxview_pcbarrow_draw", "yxview_pccapsym_draw",
+    "yxview_pcscatter_draw", "yxview_pcspike_draw",
+    "yxview_rarea_draw", "yxview_rbar_draw", "yxview_rbarm_draw",
+    "yxview_rcap_draw", "yxview_rcapsym_draw",
+    "yxview_rconnected_draw", "yxview_rline_draw",
+    "yxview_rscatter_draw", "yxview_rspike_draw",
+    "yxview_spike_draw", "yxview_sunflower_draw", "zap_s", "zinb",
+    "zinb_llf", "zinb_plf", "zip", "zip_llf", "zip_p", "zip_plf",
+    "zt_ct_5", "zt_hc_5", "zt_hcd_5", "zt_is_5", "zt_iss_5",
+    "zt_sho_5", "zt_smp_5", "ztbase_5", "ztcox_5", "ztdes_5",
+    "ztereg_5", "ztfill_5", "ztgen_5", "ztir_5", "ztjoin_5", "ztnb",
+    "ztnb_p", "ztp", "ztp_p", "zts_5", "ztset_5", "ztspli_5",
+    "ztsum_5", "zttoct_5", "ztvary_5", "ztweib_5"
+)
+
+
+
+builtins_functions = (
+    "abbrev", "abs", "acos", "acosh", "asin", "asinh", "atan",
+    "atan2", "atanh", "autocode", "betaden", "binomial",
+    "binomialp", "binomialtail", "binormal", "bofd",
+    "byteorder", "c", "_caller", "cauchy", "cauchyden",
+    "cauchytail", "Cdhms", "ceil", "char", "chi2", "chi2den",
+    "chi2tail", "Chms", "chop", "cholesky", "clip", "Clock",
+    "clock", "cloglog", "Cmdyhms", "Cofc", "cofC", "Cofd", "cofd",
+    "coleqnumb", "collatorlocale", "collatorversion",
+    "colnfreeparms", "colnumb", "colsof", "comb", "cond", "corr",
+    "cos", "cosh", "daily", "date", "day", "det", "dgammapda",
+    "dgammapdada", "dgammapdadx", "dgammapdx", "dgammapdxdx",
+    "dhms", "diag", "diag0cnt", "digamma", "dofb", "dofC", "dofc",
+    "dofh", "dofm", "dofq", "dofw", "dofy", "dow", "doy",
+    "dunnettprob", "e", "el", "esample", "epsdouble", "epsfloat",
+    "exp", "expm1", "exponential", "exponentialden",
+    "exponentialtail", "F", "Fden", "fileexists", "fileread",
+    "filereaderror", "filewrite", "float", "floor", "fmtwidth",
+    "frval", "_frval", "Ftail", "gammaden", "gammap", "gammaptail",
+    "get", "hadamard", "halfyear", "halfyearly", "has_eprop", "hh",
+    "hhC", "hms", "hofd", "hours", "hypergeometric",
+    "hypergeometricp", "I", "ibeta", "ibetatail", "igaussian",
+    "igaussianden", "igaussiantail", "indexnot", "inlist",
+    "inrange", "int", "inv", "invbinomial", "invbinomialtail",
+    "invcauchy", "invcauchytail", "invchi2", "invchi2tail",
+    "invcloglog", "invdunnettprob", "invexponential",
+    "invexponentialtail", "invF", "invFtail", "invgammap",
+    "invgammaptail", "invibeta", "invibetatail", "invigaussian",
+    "invigaussiantail", "invlaplace", "invlaplacetail",
+    "invlogisticp", "invlogisticsp", "invlogisticmsp",
+    "invlogistictailp", "invlogistictailsp", "invlogistictailmsp",
+    "invlogit", "invnbinomial", "invnbinomialtail", "invnchi2",
+    "invnchi2tail", "invnF", "invnFtail", "invnibeta",
+    "invnormal", "invnt", "invnttail", "invpoisson",
+    "invpoissontail", "invsym", "invt", "invttail", "invtukeyprob",
+    "invweibullabp", "invweibullabgp", "invweibullphabp",
+    "invweibullphabgp", "invweibullphtailabp",
+    "invweibullphtailabgp", "invweibulltailabp",
+    "invweibulltailabgp", "irecode", "issymmetric", "J", "laplace",
+    "laplaceden", "laplacetail", "ln", "ln1m", "ln1p", "lncauchyden",
+    "lnfactorial", "lngamma", "lnigammaden", "lnigaussianden",
+    "lniwishartden", "lnlaplaceden", "lnmvnormalden", "lnnormal",
+    "lnnormalden", "lnnormaldenxs", "lnnormaldenxms", "lnwishartden",
+    "log", "log10", "log1m", "log1p", "logisticx", "logisticsx",
+    "logisticmsx", "logisticdenx", "logisticdensx", "logisticdenmsx",
+    "logistictailx", "logistictailsx", "logistictailmsx", "logit",
+    "matmissing", "matrix", "matuniform", "max", "maxbyte",
+    "maxdouble", "maxfloat", "maxint", "maxlong", "mdy", "mdyhms",
+    "mi", "min", "minbyte", "mindouble", "minfloat", "minint",
+    "minlong", "minutes", "missing", "mm", "mmC", "mod", "mofd",
+    "month", "monthly", "mreldif", "msofhours", "msofminutes",
+    "msofseconds", "nbetaden", "nbinomial", "nbinomialp",
+    "nbinomialtail", "nchi2", "nchi2den", "nchi2tail", "nF",
+    "nFden", "nFtail", "nibeta", "normal", "normalden",
+    "normaldenxs", "normaldenxms", "npnchi2", "npnF", "npnt",
+    "nt", "ntden", "nttail", "nullmat", "plural", "plurals1",
+    "poisson", "poissonp", "poissontail", "qofd", "quarter",
+    "quarterly", "r", "rbeta", "rbinomial", "rcauchy", "rchi2",
+    "recode", "real", "regexm", "regexr", "regexs", "reldif",
+    "replay", "return", "rexponential", "rgamma", "rhypergeometric",
+    "rigaussian", "rlaplace", "rlogistic", "rlogistics",
+    "rlogisticms", "rnbinomial", "rnormal", "rnormalm", "rnormalms",
+    "round", "roweqnumb", "rownfreeparms", "rownumb", "rowsof",
+    "rpoisson", "rt", "runiform", "runiformab", "runiformint",
+    "rweibullab", "rweibullabg", "rweibullphab", "rweibullphabg",
+    "s", "scalar", "seconds", "sign", "sin", "sinh",
+    "smallestdouble", "soundex", "soundex_nara", "sqrt", "ss",
+    "ssC", "strcat", "strdup", "string", "stringns", "stritrim",
+    "strlen", "strlower", "strltrim", "strmatch", "strofreal",
+    "strofrealns", "strpos", "strproper", "strreverse", "strrpos",
+    "strrtrim", "strtoname", "strtrim", "strupper", "subinstr",
+    "subinword", "substr", "sum", "sweep", "t", "tan", "tanh",
+    "tC", "tc", "td", "tden", "th", "tin", "tm", "tobytes", "tq",
+    "trace", "trigamma", "trunc", "ttail", "tukeyprob", "tw",
+    "twithin", "uchar", "udstrlen", "udsubstr", "uisdigit",
+    "uisletter", "ustrcompare", "ustrfix", "ustrfrom",
+    "ustrinvalidcnt", "ustrleft", "ustrlen", "ustrlower",
+    "ustrltrim", "ustrnormalize", "ustrpos", "ustrregexm",
+    "ustrregexra", "ustrregexrf", "ustrregexs", "ustrreverse",
+    "ustrright", "ustrrpos", "ustrrtrim", "ustrsortkey",
+    "ustrtitle", "ustrto", "ustrtohex", "ustrtoname",
+    "ustrtrim", "ustrunescape", "ustrupper", "ustrword",
+    "ustrwordcount", "usubinstr", "usubstr", "vec", "vecdiag",
+    "week", "weekly", "weibullabx", "weibullabgx", "weibulldenabx",
+    "weibulldenabgx", "weibullphabx", "weibullphabgx",
+    "weibullphdenabx", "weibullphdenabgx", "weibullphtailabx",
+    "weibullphtailabgx", "weibulltailabx", "weibulltailabgx",
+    "wofd", "word", "wordbreaklocale", "wordcount",
+    "year", "yearly", "yh", "ym", "yofd", "yq", "yw" 
+)
diff --git a/.venv/Lib/site-packages/pygments/lexers/_tsql_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_tsql_builtins.py
new file mode 100644 (file)
index 0000000..6fa1a1f
--- /dev/null
@@ -0,0 +1,1003 @@
+"""
+    pygments.lexers._tsql_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    These are manually translated lists from https://msdn.microsoft.com.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# See https://msdn.microsoft.com/en-us/library/ms174986.aspx.
+OPERATORS = (
+    '!<',
+    '!=',
+    '!>',
+    '<',
+    '<=',
+    '<>',
+    '=',
+    '>',
+    '>=',
+    '+',
+    '+=',
+    '-',
+    '-=',
+    '*',
+    '*=',
+    '/',
+    '/=',
+    '%',
+    '%=',
+    '&',
+    '&=',
+    '|',
+    '|=',
+    '^',
+    '^=',
+    '~',
+    '::',
+)
+
+OPERATOR_WORDS = (
+    'all',
+    'and',
+    'any',
+    'between',
+    'except',
+    'exists',
+    'in',
+    'intersect',
+    'like',
+    'not',
+    'or',
+    'some',
+    'union',
+)
+
+_KEYWORDS_SERVER = (
+    'add',
+    'all',
+    'alter',
+    'and',
+    'any',
+    'as',
+    'asc',
+    'authorization',
+    'backup',
+    'begin',
+    'between',
+    'break',
+    'browse',
+    'bulk',
+    'by',
+    'cascade',
+    'case',
+    'catch',
+    'check',
+    'checkpoint',
+    'close',
+    'clustered',
+    'coalesce',
+    'collate',
+    'column',
+    'commit',
+    'compute',
+    'constraint',
+    'contains',
+    'containstable',
+    'continue',
+    'convert',
+    'create',
+    'cross',
+    'current',
+    'current_date',
+    'current_time',
+    'current_timestamp',
+    'current_user',
+    'cursor',
+    'database',
+    'dbcc',
+    'deallocate',
+    'declare',
+    'default',
+    'delete',
+    'deny',
+    'desc',
+    'disk',
+    'distinct',
+    'distributed',
+    'double',
+    'drop',
+    'dump',
+    'else',
+    'end',
+    'errlvl',
+    'escape',
+    'except',
+    'exec',
+    'execute',
+    'exists',
+    'exit',
+    'external',
+    'fetch',
+    'file',
+    'fillfactor',
+    'for',
+    'foreign',
+    'freetext',
+    'freetexttable',
+    'from',
+    'full',
+    'function',
+    'goto',
+    'grant',
+    'group',
+    'having',
+    'holdlock',
+    'identity',
+    'identity_insert',
+    'identitycol',
+    'if',
+    'in',
+    'index',
+    'inner',
+    'insert',
+    'intersect',
+    'into',
+    'is',
+    'join',
+    'key',
+    'kill',
+    'left',
+    'like',
+    'lineno',
+    'load',
+    'merge',
+    'national',
+    'nocheck',
+    'nonclustered',
+    'not',
+    'null',
+    'nullif',
+    'of',
+    'off',
+    'offsets',
+    'on',
+    'open',
+    'opendatasource',
+    'openquery',
+    'openrowset',
+    'openxml',
+    'option',
+    'or',
+    'order',
+    'outer',
+    'over',
+    'percent',
+    'pivot',
+    'plan',
+    'precision',
+    'primary',
+    'print',
+    'proc',
+    'procedure',
+    'public',
+    'raiserror',
+    'read',
+    'readtext',
+    'reconfigure',
+    'references',
+    'replication',
+    'restore',
+    'restrict',
+    'return',
+    'revert',
+    'revoke',
+    'right',
+    'rollback',
+    'rowcount',
+    'rowguidcol',
+    'rule',
+    'save',
+    'schema',
+    'securityaudit',
+    'select',
+    'semantickeyphrasetable',
+    'semanticsimilaritydetailstable',
+    'semanticsimilaritytable',
+    'session_user',
+    'set',
+    'setuser',
+    'shutdown',
+    'some',
+    'statistics',
+    'system_user',
+    'table',
+    'tablesample',
+    'textsize',
+    'then',
+    'throw',
+    'to',
+    'top',
+    'tran',
+    'transaction',
+    'trigger',
+    'truncate',
+    'try',
+    'try_convert',
+    'tsequal',
+    'union',
+    'unique',
+    'unpivot',
+    'update',
+    'updatetext',
+    'use',
+    'user',
+    'values',
+    'varying',
+    'view',
+    'waitfor',
+    'when',
+    'where',
+    'while',
+    'with',
+    'within',
+    'writetext',
+)
+
+_KEYWORDS_FUTURE = (
+    'absolute',
+    'action',
+    'admin',
+    'after',
+    'aggregate',
+    'alias',
+    'allocate',
+    'are',
+    'array',
+    'asensitive',
+    'assertion',
+    'asymmetric',
+    'at',
+    'atomic',
+    'before',
+    'binary',
+    'bit',
+    'blob',
+    'boolean',
+    'both',
+    'breadth',
+    'call',
+    'called',
+    'cardinality',
+    'cascaded',
+    'cast',
+    'catalog',
+    'char',
+    'character',
+    'class',
+    'clob',
+    'collation',
+    'collect',
+    'completion',
+    'condition',
+    'connect',
+    'connection',
+    'constraints',
+    'constructor',
+    'corr',
+    'corresponding',
+    'covar_pop',
+    'covar_samp',
+    'cube',
+    'cume_dist',
+    'current_catalog',
+    'current_default_transform_group',
+    'current_path',
+    'current_role',
+    'current_schema',
+    'current_transform_group_for_type',
+    'cycle',
+    'data',
+    'date',
+    'day',
+    'dec',
+    'decimal',
+    'deferrable',
+    'deferred',
+    'depth',
+    'deref',
+    'describe',
+    'descriptor',
+    'destroy',
+    'destructor',
+    'deterministic',
+    'diagnostics',
+    'dictionary',
+    'disconnect',
+    'domain',
+    'dynamic',
+    'each',
+    'element',
+    'end-exec',
+    'equals',
+    'every',
+    'exception',
+    'false',
+    'filter',
+    'first',
+    'float',
+    'found',
+    'free',
+    'fulltexttable',
+    'fusion',
+    'general',
+    'get',
+    'global',
+    'go',
+    'grouping',
+    'hold',
+    'host',
+    'hour',
+    'ignore',
+    'immediate',
+    'indicator',
+    'initialize',
+    'initially',
+    'inout',
+    'input',
+    'int',
+    'integer',
+    'intersection',
+    'interval',
+    'isolation',
+    'iterate',
+    'language',
+    'large',
+    'last',
+    'lateral',
+    'leading',
+    'less',
+    'level',
+    'like_regex',
+    'limit',
+    'ln',
+    'local',
+    'localtime',
+    'localtimestamp',
+    'locator',
+    'map',
+    'match',
+    'member',
+    'method',
+    'minute',
+    'mod',
+    'modifies',
+    'modify',
+    'module',
+    'month',
+    'multiset',
+    'names',
+    'natural',
+    'nchar',
+    'nclob',
+    'new',
+    'next',
+    'no',
+    'none',
+    'normalize',
+    'numeric',
+    'object',
+    'occurrences_regex',
+    'old',
+    'only',
+    'operation',
+    'ordinality',
+    'out',
+    'output',
+    'overlay',
+    'pad',
+    'parameter',
+    'parameters',
+    'partial',
+    'partition',
+    'path',
+    'percent_rank',
+    'percentile_cont',
+    'percentile_disc',
+    'position_regex',
+    'postfix',
+    'prefix',
+    'preorder',
+    'prepare',
+    'preserve',
+    'prior',
+    'privileges',
+    'range',
+    'reads',
+    'real',
+    'recursive',
+    'ref',
+    'referencing',
+    'regr_avgx',
+    'regr_avgy',
+    'regr_count',
+    'regr_intercept',
+    'regr_r2',
+    'regr_slope',
+    'regr_sxx',
+    'regr_sxy',
+    'regr_syy',
+    'relative',
+    'release',
+    'result',
+    'returns',
+    'role',
+    'rollup',
+    'routine',
+    'row',
+    'rows',
+    'savepoint',
+    'scope',
+    'scroll',
+    'search',
+    'second',
+    'section',
+    'sensitive',
+    'sequence',
+    'session',
+    'sets',
+    'similar',
+    'size',
+    'smallint',
+    'space',
+    'specific',
+    'specifictype',
+    'sql',
+    'sqlexception',
+    'sqlstate',
+    'sqlwarning',
+    'start',
+    'state',
+    'statement',
+    'static',
+    'stddev_pop',
+    'stddev_samp',
+    'structure',
+    'submultiset',
+    'substring_regex',
+    'symmetric',
+    'system',
+    'temporary',
+    'terminate',
+    'than',
+    'time',
+    'timestamp',
+    'timezone_hour',
+    'timezone_minute',
+    'trailing',
+    'translate_regex',
+    'translation',
+    'treat',
+    'true',
+    'uescape',
+    'under',
+    'unknown',
+    'unnest',
+    'usage',
+    'using',
+    'value',
+    'var_pop',
+    'var_samp',
+    'varchar',
+    'variable',
+    'whenever',
+    'width_bucket',
+    'window',
+    'within',
+    'without',
+    'work',
+    'write',
+    'xmlagg',
+    'xmlattributes',
+    'xmlbinary',
+    'xmlcast',
+    'xmlcomment',
+    'xmlconcat',
+    'xmldocument',
+    'xmlelement',
+    'xmlexists',
+    'xmlforest',
+    'xmliterate',
+    'xmlnamespaces',
+    'xmlparse',
+    'xmlpi',
+    'xmlquery',
+    'xmlserialize',
+    'xmltable',
+    'xmltext',
+    'xmlvalidate',
+    'year',
+    'zone',
+)
+
+_KEYWORDS_ODBC = (
+    'absolute',
+    'action',
+    'ada',
+    'add',
+    'all',
+    'allocate',
+    'alter',
+    'and',
+    'any',
+    'are',
+    'as',
+    'asc',
+    'assertion',
+    'at',
+    'authorization',
+    'avg',
+    'begin',
+    'between',
+    'bit',
+    'bit_length',
+    'both',
+    'by',
+    'cascade',
+    'cascaded',
+    'case',
+    'cast',
+    'catalog',
+    'char',
+    'char_length',
+    'character',
+    'character_length',
+    'check',
+    'close',
+    'coalesce',
+    'collate',
+    'collation',
+    'column',
+    'commit',
+    'connect',
+    'connection',
+    'constraint',
+    'constraints',
+    'continue',
+    'convert',
+    'corresponding',
+    'count',
+    'create',
+    'cross',
+    'current',
+    'current_date',
+    'current_time',
+    'current_timestamp',
+    'current_user',
+    'cursor',
+    'date',
+    'day',
+    'deallocate',
+    'dec',
+    'decimal',
+    'declare',
+    'default',
+    'deferrable',
+    'deferred',
+    'delete',
+    'desc',
+    'describe',
+    'descriptor',
+    'diagnostics',
+    'disconnect',
+    'distinct',
+    'domain',
+    'double',
+    'drop',
+    'else',
+    'end',
+    'end-exec',
+    'escape',
+    'except',
+    'exception',
+    'exec',
+    'execute',
+    'exists',
+    'external',
+    'extract',
+    'false',
+    'fetch',
+    'first',
+    'float',
+    'for',
+    'foreign',
+    'fortran',
+    'found',
+    'from',
+    'full',
+    'get',
+    'global',
+    'go',
+    'goto',
+    'grant',
+    'group',
+    'having',
+    'hour',
+    'identity',
+    'immediate',
+    'in',
+    'include',
+    'index',
+    'indicator',
+    'initially',
+    'inner',
+    'input',
+    'insensitive',
+    'insert',
+    'int',
+    'integer',
+    'intersect',
+    'interval',
+    'into',
+    'is',
+    'isolation',
+    'join',
+    'key',
+    'language',
+    'last',
+    'leading',
+    'left',
+    'level',
+    'like',
+    'local',
+    'lower',
+    'match',
+    'max',
+    'min',
+    'minute',
+    'module',
+    'month',
+    'names',
+    'national',
+    'natural',
+    'nchar',
+    'next',
+    'no',
+    'none',
+    'not',
+    'null',
+    'nullif',
+    'numeric',
+    'octet_length',
+    'of',
+    'on',
+    'only',
+    'open',
+    'option',
+    'or',
+    'order',
+    'outer',
+    'output',
+    'overlaps',
+    'pad',
+    'partial',
+    'pascal',
+    'position',
+    'precision',
+    'prepare',
+    'preserve',
+    'primary',
+    'prior',
+    'privileges',
+    'procedure',
+    'public',
+    'read',
+    'real',
+    'references',
+    'relative',
+    'restrict',
+    'revoke',
+    'right',
+    'rollback',
+    'rows',
+    'schema',
+    'scroll',
+    'second',
+    'section',
+    'select',
+    'session',
+    'session_user',
+    'set',
+    'size',
+    'smallint',
+    'some',
+    'space',
+    'sql',
+    'sqlca',
+    'sqlcode',
+    'sqlerror',
+    'sqlstate',
+    'sqlwarning',
+    'substring',
+    'sum',
+    'system_user',
+    'table',
+    'temporary',
+    'then',
+    'time',
+    'timestamp',
+    'timezone_hour',
+    'timezone_minute',
+    'to',
+    'trailing',
+    'transaction',
+    'translate',
+    'translation',
+    'trim',
+    'true',
+    'union',
+    'unique',
+    'unknown',
+    'update',
+    'upper',
+    'usage',
+    'user',
+    'using',
+    'value',
+    'values',
+    'varchar',
+    'varying',
+    'view',
+    'when',
+    'whenever',
+    'where',
+    'with',
+    'work',
+    'write',
+    'year',
+    'zone',
+)
+
+# See https://msdn.microsoft.com/en-us/library/ms189822.aspx.
+KEYWORDS = sorted(set(_KEYWORDS_FUTURE + _KEYWORDS_ODBC + _KEYWORDS_SERVER))
+
+# See https://msdn.microsoft.com/en-us/library/ms187752.aspx.
+TYPES = (
+    'bigint',
+    'binary',
+    'bit',
+    'char',
+    'cursor',
+    'date',
+    'datetime',
+    'datetime2',
+    'datetimeoffset',
+    'decimal',
+    'float',
+    'hierarchyid',
+    'image',
+    'int',
+    'money',
+    'nchar',
+    'ntext',
+    'numeric',
+    'nvarchar',
+    'real',
+    'smalldatetime',
+    'smallint',
+    'smallmoney',
+    'sql_variant',
+    'table',
+    'text',
+    'time',
+    'timestamp',
+    'tinyint',
+    'uniqueidentifier',
+    'varbinary',
+    'varchar',
+    'xml',
+)
+
+# See https://msdn.microsoft.com/en-us/library/ms174318.aspx.
+FUNCTIONS = (
+    '$partition',
+    'abs',
+    'acos',
+    'app_name',
+    'applock_mode',
+    'applock_test',
+    'ascii',
+    'asin',
+    'assemblyproperty',
+    'atan',
+    'atn2',
+    'avg',
+    'binary_checksum',
+    'cast',
+    'ceiling',
+    'certencoded',
+    'certprivatekey',
+    'char',
+    'charindex',
+    'checksum',
+    'checksum_agg',
+    'choose',
+    'col_length',
+    'col_name',
+    'columnproperty',
+    'compress',
+    'concat',
+    'connectionproperty',
+    'context_info',
+    'convert',
+    'cos',
+    'cot',
+    'count',
+    'count_big',
+    'current_request_id',
+    'current_timestamp',
+    'current_transaction_id',
+    'current_user',
+    'cursor_status',
+    'database_principal_id',
+    'databasepropertyex',
+    'dateadd',
+    'datediff',
+    'datediff_big',
+    'datefromparts',
+    'datename',
+    'datepart',
+    'datetime2fromparts',
+    'datetimefromparts',
+    'datetimeoffsetfromparts',
+    'day',
+    'db_id',
+    'db_name',
+    'decompress',
+    'degrees',
+    'dense_rank',
+    'difference',
+    'eomonth',
+    'error_line',
+    'error_message',
+    'error_number',
+    'error_procedure',
+    'error_severity',
+    'error_state',
+    'exp',
+    'file_id',
+    'file_idex',
+    'file_name',
+    'filegroup_id',
+    'filegroup_name',
+    'filegroupproperty',
+    'fileproperty',
+    'floor',
+    'format',
+    'formatmessage',
+    'fulltextcatalogproperty',
+    'fulltextserviceproperty',
+    'get_filestream_transaction_context',
+    'getansinull',
+    'getdate',
+    'getutcdate',
+    'grouping',
+    'grouping_id',
+    'has_perms_by_name',
+    'host_id',
+    'host_name',
+    'iif',
+    'index_col',
+    'indexkey_property',
+    'indexproperty',
+    'is_member',
+    'is_rolemember',
+    'is_srvrolemember',
+    'isdate',
+    'isjson',
+    'isnull',
+    'isnumeric',
+    'json_modify',
+    'json_query',
+    'json_value',
+    'left',
+    'len',
+    'log',
+    'log10',
+    'lower',
+    'ltrim',
+    'max',
+    'min',
+    'min_active_rowversion',
+    'month',
+    'nchar',
+    'newid',
+    'newsequentialid',
+    'ntile',
+    'object_definition',
+    'object_id',
+    'object_name',
+    'object_schema_name',
+    'objectproperty',
+    'objectpropertyex',
+    'opendatasource',
+    'openjson',
+    'openquery',
+    'openrowset',
+    'openxml',
+    'original_db_name',
+    'original_login',
+    'parse',
+    'parsename',
+    'patindex',
+    'permissions',
+    'pi',
+    'power',
+    'pwdcompare',
+    'pwdencrypt',
+    'quotename',
+    'radians',
+    'rand',
+    'rank',
+    'replace',
+    'replicate',
+    'reverse',
+    'right',
+    'round',
+    'row_number',
+    'rowcount_big',
+    'rtrim',
+    'schema_id',
+    'schema_name',
+    'scope_identity',
+    'serverproperty',
+    'session_context',
+    'session_user',
+    'sign',
+    'sin',
+    'smalldatetimefromparts',
+    'soundex',
+    'sp_helplanguage',
+    'space',
+    'sqrt',
+    'square',
+    'stats_date',
+    'stdev',
+    'stdevp',
+    'str',
+    'string_escape',
+    'string_split',
+    'stuff',
+    'substring',
+    'sum',
+    'suser_id',
+    'suser_name',
+    'suser_sid',
+    'suser_sname',
+    'switchoffset',
+    'sysdatetime',
+    'sysdatetimeoffset',
+    'system_user',
+    'sysutcdatetime',
+    'tan',
+    'textptr',
+    'textvalid',
+    'timefromparts',
+    'todatetimeoffset',
+    'try_cast',
+    'try_convert',
+    'try_parse',
+    'type_id',
+    'type_name',
+    'typeproperty',
+    'unicode',
+    'upper',
+    'user_id',
+    'user_name',
+    'var',
+    'varp',
+    'xact_state',
+    'year',
+)
diff --git a/.venv/Lib/site-packages/pygments/lexers/_usd_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_usd_builtins.py
new file mode 100644 (file)
index 0000000..b0530a2
--- /dev/null
@@ -0,0 +1,112 @@
+"""
+    pygments.lexers._usd_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    A collection of known USD-related keywords, attributes, and types.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+COMMON_ATTRIBUTES = [
+    "extent",
+    "xformOpOrder",
+]
+
+KEYWORDS = [
+    "class",
+    "clips",
+    "custom",
+    "customData",
+    "def",
+    "dictionary",
+    "inherits",
+    "over",
+    "payload",
+    "references",
+    "rel",
+    "subLayers",
+    "timeSamples",
+    "uniform",
+    "variantSet",
+    "variantSets",
+    "variants",
+]
+
+OPERATORS = [
+    "add",
+    "append",
+    "delete",
+    "prepend",
+    "reorder",
+]
+
+SPECIAL_NAMES = [
+    "active",
+    "apiSchemas",
+    "defaultPrim",
+    "elementSize",
+    "endTimeCode",
+    "hidden",
+    "instanceable",
+    "interpolation",
+    "kind",
+    "startTimeCode",
+    "upAxis",
+]
+
+TYPES = [
+    "asset",
+    "bool",
+    "color3d",
+    "color3f",
+    "color3h",
+    "color4d",
+    "color4f",
+    "color4h",
+    "double",
+    "double2",
+    "double3",
+    "double4",
+    "float",
+    "float2",
+    "float3",
+    "float4",
+    "frame4d",
+    "half",
+    "half2",
+    "half3",
+    "half4",
+    "int",
+    "int2",
+    "int3",
+    "int4",
+    "keyword",
+    "matrix2d",
+    "matrix3d",
+    "matrix4d",
+    "normal3d",
+    "normal3f",
+    "normal3h",
+    "point3d",
+    "point3f",
+    "point3h",
+    "quatd",
+    "quatf",
+    "quath",
+    "string",
+    "syn",
+    "token",
+    "uchar",
+    "uchar2",
+    "uchar3",
+    "uchar4",
+    "uint",
+    "uint2",
+    "uint3",
+    "uint4",
+    "usdaType",
+    "vector3d",
+    "vector3f",
+    "vector3h",
+]
diff --git a/.venv/Lib/site-packages/pygments/lexers/_vbscript_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_vbscript_builtins.py
new file mode 100644 (file)
index 0000000..b1ae0ef
--- /dev/null
@@ -0,0 +1,279 @@
+"""
+    pygments.lexers._vbscript_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    These are manually translated lists from
+    http://www.indusoft.com/pdf/VBScript%20Reference.pdf.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+KEYWORDS = [
+    'ByRef',
+    'ByVal',
+    # dim: special rule
+    'call',
+    'case',
+    'class',
+    # const: special rule
+    'do',
+    'each',
+    'else',
+    'elseif',
+    'end',
+    'erase',
+    'execute',
+    'function',
+    'exit',
+    'for',
+    'function',
+    'GetRef',
+    'global',
+    'if',
+    'let',
+    'loop',
+    'next',
+    'new',
+    # option: special rule
+    'private',
+    'public',
+    'redim',
+    'select',
+    'set',
+    'sub',
+    'then',
+    'wend',
+    'while',
+    'with',
+]
+
+BUILTIN_FUNCTIONS = [
+    'Abs',
+    'Array',
+    'Asc',
+    'Atn',
+    'CBool',
+    'CByte',
+    'CCur',
+    'CDate',
+    'CDbl',
+    'Chr',
+    'CInt',
+    'CLng',
+    'Cos',
+    'CreateObject',
+    'CSng',
+    'CStr',
+    'Date',
+    'DateAdd',
+    'DateDiff',
+    'DatePart',
+    'DateSerial',
+    'DateValue',
+    'Day',
+    'Eval',
+    'Exp',
+    'Filter',
+    'Fix',
+    'FormatCurrency',
+    'FormatDateTime',
+    'FormatNumber',
+    'FormatPercent',
+    'GetObject',
+    'GetLocale',
+    'Hex',
+    'Hour',
+    'InStr',
+    'inStrRev',
+    'Int',
+    'IsArray',
+    'IsDate',
+    'IsEmpty',
+    'IsNull',
+    'IsNumeric',
+    'IsObject',
+    'Join',
+    'LBound',
+    'LCase',
+    'Left',
+    'Len',
+    'LoadPicture',
+    'Log',
+    'LTrim',
+    'Mid',
+    'Minute',
+    'Month',
+    'MonthName',
+    'MsgBox',
+    'Now',
+    'Oct',
+    'Randomize',
+    'RegExp',
+    'Replace',
+    'RGB',
+    'Right',
+    'Rnd',
+    'Round',
+    'RTrim',
+    'ScriptEngine',
+    'ScriptEngineBuildVersion',
+    'ScriptEngineMajorVersion',
+    'ScriptEngineMinorVersion',
+    'Second',
+    'SetLocale',
+    'Sgn',
+    'Space',
+    'Split',
+    'Sqr',
+    'StrComp',
+    'String',
+    'StrReverse',
+    'Tan',
+    'Time',
+    'Timer',
+    'TimeSerial',
+    'TimeValue',
+    'Trim',
+    'TypeName',
+    'UBound',
+    'UCase',
+    'VarType',
+    'Weekday',
+    'WeekdayName',
+    'Year',
+]
+
+BUILTIN_VARIABLES = [
+    'Debug',
+    'Dictionary',
+    'Drive',
+    'Drives',
+    'Err',
+    'File',
+    'Files',
+    'FileSystemObject',
+    'Folder',
+    'Folders',
+    'Match',
+    'Matches',
+    'RegExp',
+    'Submatches',
+    'TextStream',
+]
+
+OPERATORS = [
+    '+',
+    '-',
+    '*',
+    '/',
+    '\\',
+    '^',
+    '|',
+    '<',
+    '<=',
+    '>',
+    '>=',
+    '=',
+    '<>',
+    '&',
+    '$',
+]
+
+OPERATOR_WORDS = [
+    'mod',
+    'and',
+    'or',
+    'xor',
+    'eqv',
+    'imp',
+    'is',
+    'not',
+]
+
+BUILTIN_CONSTANTS = [
+    'False',
+    'True',
+    'vbAbort',
+    'vbAbortRetryIgnore',
+    'vbApplicationModal',
+    'vbArray',
+    'vbBinaryCompare',
+    'vbBlack',
+    'vbBlue',
+    'vbBoole',
+    'vbByte',
+    'vbCancel',
+    'vbCr',
+    'vbCritical',
+    'vbCrLf',
+    'vbCurrency',
+    'vbCyan',
+    'vbDataObject',
+    'vbDate',
+    'vbDefaultButton1',
+    'vbDefaultButton2',
+    'vbDefaultButton3',
+    'vbDefaultButton4',
+    'vbDouble',
+    'vbEmpty',
+    'vbError',
+    'vbExclamation',
+    'vbFalse',
+    'vbFirstFullWeek',
+    'vbFirstJan1',
+    'vbFormFeed',
+    'vbFriday',
+    'vbGeneralDate',
+    'vbGreen',
+    'vbIgnore',
+    'vbInformation',
+    'vbInteger',
+    'vbLf',
+    'vbLong',
+    'vbLongDate',
+    'vbLongTime',
+    'vbMagenta',
+    'vbMonday',
+    'vbMsgBoxHelpButton',
+    'vbMsgBoxRight',
+    'vbMsgBoxRtlReading',
+    'vbMsgBoxSetForeground',
+    'vbNewLine',
+    'vbNo',
+    'vbNull',
+    'vbNullChar',
+    'vbNullString',
+    'vbObject',
+    'vbObjectError',
+    'vbOK',
+    'vbOKCancel',
+    'vbOKOnly',
+    'vbQuestion',
+    'vbRed',
+    'vbRetry',
+    'vbRetryCancel',
+    'vbSaturday',
+    'vbShortDate',
+    'vbShortTime',
+    'vbSingle',
+    'vbString',
+    'vbSunday',
+    'vbSystemModal',
+    'vbTab',
+    'vbTextCompare',
+    'vbThursday',
+    'vbTrue',
+    'vbTuesday',
+    'vbUseDefault',
+    'vbUseSystem',
+    'vbUseSystem',
+    'vbVariant',
+    'vbVerticalTab',
+    'vbWednesday',
+    'vbWhite',
+    'vbYellow',
+    'vbYes',
+    'vbYesNo',
+    'vbYesNoCancel',
+]
diff --git a/.venv/Lib/site-packages/pygments/lexers/_vim_builtins.py b/.venv/Lib/site-packages/pygments/lexers/_vim_builtins.py
new file mode 100644 (file)
index 0000000..abbbf99
--- /dev/null
@@ -0,0 +1,1938 @@
+"""
+    pygments.lexers._vim_builtins
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    This file is autogenerated by scripts/get_vimkw.py
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# Split up in multiple functions so it's importable by jython, which has a
+# per-method size limit.
+
+def _getauto():
+    var = (
+        ('BufAdd','BufAdd'),
+        ('BufCreate','BufCreate'),
+        ('BufDelete','BufDelete'),
+        ('BufEnter','BufEnter'),
+        ('BufFilePost','BufFilePost'),
+        ('BufFilePre','BufFilePre'),
+        ('BufHidden','BufHidden'),
+        ('BufLeave','BufLeave'),
+        ('BufNew','BufNew'),
+        ('BufNewFile','BufNewFile'),
+        ('BufRead','BufRead'),
+        ('BufReadCmd','BufReadCmd'),
+        ('BufReadPost','BufReadPost'),
+        ('BufReadPre','BufReadPre'),
+        ('BufUnload','BufUnload'),
+        ('BufWinEnter','BufWinEnter'),
+        ('BufWinLeave','BufWinLeave'),
+        ('BufWipeout','BufWipeout'),
+        ('BufWrite','BufWrite'),
+        ('BufWriteCmd','BufWriteCmd'),
+        ('BufWritePost','BufWritePost'),
+        ('BufWritePre','BufWritePre'),
+        ('Cmd','Cmd'),
+        ('CmdwinEnter','CmdwinEnter'),
+        ('CmdwinLeave','CmdwinLeave'),
+        ('ColorScheme','ColorScheme'),
+        ('CompleteDone','CompleteDone'),
+        ('CursorHold','CursorHold'),
+        ('CursorHoldI','CursorHoldI'),
+        ('CursorMoved','CursorMoved'),
+        ('CursorMovedI','CursorMovedI'),
+        ('EncodingChanged','EncodingChanged'),
+        ('FileAppendCmd','FileAppendCmd'),
+        ('FileAppendPost','FileAppendPost'),
+        ('FileAppendPre','FileAppendPre'),
+        ('FileChangedRO','FileChangedRO'),
+        ('FileChangedShell','FileChangedShell'),
+        ('FileChangedShellPost','FileChangedShellPost'),
+        ('FileEncoding','FileEncoding'),
+        ('FileReadCmd','FileReadCmd'),
+        ('FileReadPost','FileReadPost'),
+        ('FileReadPre','FileReadPre'),
+        ('FileType','FileType'),
+        ('FileWriteCmd','FileWriteCmd'),
+        ('FileWritePost','FileWritePost'),
+        ('FileWritePre','FileWritePre'),
+        ('FilterReadPost','FilterReadPost'),
+        ('FilterReadPre','FilterReadPre'),
+        ('FilterWritePost','FilterWritePost'),
+        ('FilterWritePre','FilterWritePre'),
+        ('FocusGained','FocusGained'),
+        ('FocusLost','FocusLost'),
+        ('FuncUndefined','FuncUndefined'),
+        ('GUIEnter','GUIEnter'),
+        ('GUIFailed','GUIFailed'),
+        ('InsertChange','InsertChange'),
+        ('InsertCharPre','InsertCharPre'),
+        ('InsertEnter','InsertEnter'),
+        ('InsertLeave','InsertLeave'),
+        ('MenuPopup','MenuPopup'),
+        ('QuickFixCmdPost','QuickFixCmdPost'),
+        ('QuickFixCmdPre','QuickFixCmdPre'),
+        ('QuitPre','QuitPre'),
+        ('RemoteReply','RemoteReply'),
+        ('SessionLoadPost','SessionLoadPost'),
+        ('ShellCmdPost','ShellCmdPost'),
+        ('ShellFilterPost','ShellFilterPost'),
+        ('SourceCmd','SourceCmd'),
+        ('SourcePre','SourcePre'),
+        ('SpellFileMissing','SpellFileMissing'),
+        ('StdinReadPost','StdinReadPost'),
+        ('StdinReadPre','StdinReadPre'),
+        ('SwapExists','SwapExists'),
+        ('Syntax','Syntax'),
+        ('TabEnter','TabEnter'),
+        ('TabLeave','TabLeave'),
+        ('TermChanged','TermChanged'),
+        ('TermResponse','TermResponse'),
+        ('TextChanged','TextChanged'),
+        ('TextChangedI','TextChangedI'),
+        ('User','User'),
+        ('UserGettingBored','UserGettingBored'),
+        ('VimEnter','VimEnter'),
+        ('VimLeave','VimLeave'),
+        ('VimLeavePre','VimLeavePre'),
+        ('VimResized','VimResized'),
+        ('WinEnter','WinEnter'),
+        ('WinLeave','WinLeave'),
+        ('event','event'),
+    )
+    return var
+auto = _getauto()
+
+def _getcommand():
+    var = (
+        ('a','a'),
+        ('ab','ab'),
+        ('abc','abclear'),
+        ('abo','aboveleft'),
+        ('al','all'),
+        ('ar','ar'),
+        ('ar','args'),
+        ('arga','argadd'),
+        ('argd','argdelete'),
+        ('argdo','argdo'),
+        ('arge','argedit'),
+        ('argg','argglobal'),
+        ('argl','arglocal'),
+        ('argu','argument'),
+        ('as','ascii'),
+        ('au','au'),
+        ('b','buffer'),
+        ('bN','bNext'),
+        ('ba','ball'),
+        ('bad','badd'),
+        ('bd','bdelete'),
+        ('bel','belowright'),
+        ('bf','bfirst'),
+        ('bl','blast'),
+        ('bm','bmodified'),
+        ('bn','bnext'),
+        ('bo','botright'),
+        ('bp','bprevious'),
+        ('br','br'),
+        ('br','brewind'),
+        ('brea','break'),
+        ('breaka','breakadd'),
+        ('breakd','breakdel'),
+        ('breakl','breaklist'),
+        ('bro','browse'),
+        ('bu','bu'),
+        ('buf','buf'),
+        ('bufdo','bufdo'),
+        ('buffers','buffers'),
+        ('bun','bunload'),
+        ('bw','bwipeout'),
+        ('c','c'),
+        ('c','change'),
+        ('cN','cN'),
+        ('cN','cNext'),
+        ('cNf','cNf'),
+        ('cNf','cNfile'),
+        ('cabc','cabclear'),
+        ('cad','cad'),
+        ('cad','caddexpr'),
+        ('caddb','caddbuffer'),
+        ('caddf','caddfile'),
+        ('cal','call'),
+        ('cat','catch'),
+        ('cb','cbuffer'),
+        ('cc','cc'),
+        ('ccl','cclose'),
+        ('cd','cd'),
+        ('ce','center'),
+        ('cex','cexpr'),
+        ('cf','cfile'),
+        ('cfir','cfirst'),
+        ('cg','cgetfile'),
+        ('cgetb','cgetbuffer'),
+        ('cgete','cgetexpr'),
+        ('changes','changes'),
+        ('chd','chdir'),
+        ('che','checkpath'),
+        ('checkt','checktime'),
+        ('cl','cl'),
+        ('cl','clist'),
+        ('cla','clast'),
+        ('clo','close'),
+        ('cmapc','cmapclear'),
+        ('cn','cn'),
+        ('cn','cnext'),
+        ('cnew','cnewer'),
+        ('cnf','cnf'),
+        ('cnf','cnfile'),
+        ('co','copy'),
+        ('col','colder'),
+        ('colo','colorscheme'),
+        ('com','com'),
+        ('comc','comclear'),
+        ('comp','compiler'),
+        ('con','con'),
+        ('con','continue'),
+        ('conf','confirm'),
+        ('cope','copen'),
+        ('cp','cprevious'),
+        ('cpf','cpfile'),
+        ('cq','cquit'),
+        ('cr','crewind'),
+        ('cs','cs'),
+        ('cscope','cscope'),
+        ('cstag','cstag'),
+        ('cuna','cunabbrev'),
+        ('cw','cwindow'),
+        ('d','d'),
+        ('d','delete'),
+        ('de','de'),
+        ('debug','debug'),
+        ('debugg','debuggreedy'),
+        ('del','del'),
+        ('delc','delcommand'),
+        ('delel','delel'),
+        ('delep','delep'),
+        ('deletel','deletel'),
+        ('deletep','deletep'),
+        ('deletl','deletl'),
+        ('deletp','deletp'),
+        ('delf','delf'),
+        ('delf','delfunction'),
+        ('dell','dell'),
+        ('delm','delmarks'),
+        ('delp','delp'),
+        ('dep','dep'),
+        ('di','di'),
+        ('di','display'),
+        ('diffg','diffget'),
+        ('diffo','diffoff'),
+        ('diffp','diffpatch'),
+        ('diffpu','diffput'),
+        ('diffs','diffsplit'),
+        ('difft','diffthis'),
+        ('diffu','diffupdate'),
+        ('dig','dig'),
+        ('dig','digraphs'),
+        ('dir','dir'),
+        ('dj','djump'),
+        ('dl','dl'),
+        ('dli','dlist'),
+        ('do','do'),
+        ('doau','doau'),
+        ('dp','dp'),
+        ('dr','drop'),
+        ('ds','dsearch'),
+        ('dsp','dsplit'),
+        ('e','e'),
+        ('e','edit'),
+        ('ea','ea'),
+        ('earlier','earlier'),
+        ('ec','ec'),
+        ('echoe','echoerr'),
+        ('echom','echomsg'),
+        ('echon','echon'),
+        ('el','else'),
+        ('elsei','elseif'),
+        ('em','emenu'),
+        ('en','en'),
+        ('en','endif'),
+        ('endf','endf'),
+        ('endf','endfunction'),
+        ('endfo','endfor'),
+        ('endfun','endfun'),
+        ('endt','endtry'),
+        ('endw','endwhile'),
+        ('ene','enew'),
+        ('ex','ex'),
+        ('exi','exit'),
+        ('exu','exusage'),
+        ('f','f'),
+        ('f','file'),
+        ('files','files'),
+        ('filet','filet'),
+        ('filetype','filetype'),
+        ('fin','fin'),
+        ('fin','find'),
+        ('fina','finally'),
+        ('fini','finish'),
+        ('fir','first'),
+        ('fix','fixdel'),
+        ('fo','fold'),
+        ('foldc','foldclose'),
+        ('foldd','folddoopen'),
+        ('folddoc','folddoclosed'),
+        ('foldo','foldopen'),
+        ('for','for'),
+        ('fu','fu'),
+        ('fu','function'),
+        ('fun','fun'),
+        ('g','g'),
+        ('go','goto'),
+        ('gr','grep'),
+        ('grepa','grepadd'),
+        ('gui','gui'),
+        ('gvim','gvim'),
+        ('h','h'),
+        ('h','help'),
+        ('ha','hardcopy'),
+        ('helpf','helpfind'),
+        ('helpg','helpgrep'),
+        ('helpt','helptags'),
+        ('hi','hi'),
+        ('hid','hide'),
+        ('his','history'),
+        ('i','i'),
+        ('ia','ia'),
+        ('iabc','iabclear'),
+        ('if','if'),
+        ('ij','ijump'),
+        ('il','ilist'),
+        ('imapc','imapclear'),
+        ('in','in'),
+        ('intro','intro'),
+        ('is','isearch'),
+        ('isp','isplit'),
+        ('iuna','iunabbrev'),
+        ('j','join'),
+        ('ju','jumps'),
+        ('k','k'),
+        ('kee','keepmarks'),
+        ('keepa','keepa'),
+        ('keepalt','keepalt'),
+        ('keepj','keepjumps'),
+        ('keepp','keeppatterns'),
+        ('l','l'),
+        ('l','list'),
+        ('lN','lN'),
+        ('lN','lNext'),
+        ('lNf','lNf'),
+        ('lNf','lNfile'),
+        ('la','la'),
+        ('la','last'),
+        ('lad','lad'),
+        ('lad','laddexpr'),
+        ('laddb','laddbuffer'),
+        ('laddf','laddfile'),
+        ('lan','lan'),
+        ('lan','language'),
+        ('lat','lat'),
+        ('later','later'),
+        ('lb','lbuffer'),
+        ('lc','lcd'),
+        ('lch','lchdir'),
+        ('lcl','lclose'),
+        ('lcs','lcs'),
+        ('lcscope','lcscope'),
+        ('le','left'),
+        ('lefta','leftabove'),
+        ('lex','lexpr'),
+        ('lf','lfile'),
+        ('lfir','lfirst'),
+        ('lg','lgetfile'),
+        ('lgetb','lgetbuffer'),
+        ('lgete','lgetexpr'),
+        ('lgr','lgrep'),
+        ('lgrepa','lgrepadd'),
+        ('lh','lhelpgrep'),
+        ('ll','ll'),
+        ('lla','llast'),
+        ('lli','llist'),
+        ('lmak','lmake'),
+        ('lmapc','lmapclear'),
+        ('lne','lne'),
+        ('lne','lnext'),
+        ('lnew','lnewer'),
+        ('lnf','lnf'),
+        ('lnf','lnfile'),
+        ('lo','lo'),
+        ('lo','loadview'),
+        ('loadk','loadk'),
+        ('loadkeymap','loadkeymap'),
+        ('loc','lockmarks'),
+        ('lockv','lockvar'),
+        ('lol','lolder'),
+        ('lop','lopen'),
+        ('lp','lprevious'),
+        ('lpf','lpfile'),
+        ('lr','lrewind'),
+        ('ls','ls'),
+        ('lt','ltag'),
+        ('lua','lua'),
+        ('luado','luado'),
+        ('luafile','luafile'),
+        ('lv','lvimgrep'),
+        ('lvimgrepa','lvimgrepadd'),
+        ('lw','lwindow'),
+        ('m','move'),
+        ('ma','ma'),
+        ('ma','mark'),
+        ('mak','make'),
+        ('marks','marks'),
+        ('mat','match'),
+        ('menut','menut'),
+        ('menut','menutranslate'),
+        ('mes','mes'),
+        ('messages','messages'),
+        ('mk','mk'),
+        ('mk','mkexrc'),
+        ('mks','mksession'),
+        ('mksp','mkspell'),
+        ('mkv','mkv'),
+        ('mkv','mkvimrc'),
+        ('mkvie','mkview'),
+        ('mo','mo'),
+        ('mod','mode'),
+        ('mz','mz'),
+        ('mz','mzscheme'),
+        ('mzf','mzfile'),
+        ('n','n'),
+        ('n','next'),
+        ('nb','nbkey'),
+        ('nbc','nbclose'),
+        ('nbs','nbstart'),
+        ('ne','ne'),
+        ('new','new'),
+        ('nmapc','nmapclear'),
+        ('noa','noa'),
+        ('noautocmd','noautocmd'),
+        ('noh','nohlsearch'),
+        ('nu','number'),
+        ('o','o'),
+        ('o','open'),
+        ('ol','oldfiles'),
+        ('omapc','omapclear'),
+        ('on','only'),
+        ('opt','options'),
+        ('ownsyntax','ownsyntax'),
+        ('p','p'),
+        ('p','print'),
+        ('pc','pclose'),
+        ('pe','pe'),
+        ('pe','perl'),
+        ('ped','pedit'),
+        ('perld','perldo'),
+        ('po','pop'),
+        ('popu','popu'),
+        ('popu','popup'),
+        ('pp','ppop'),
+        ('pr','pr'),
+        ('pre','preserve'),
+        ('prev','previous'),
+        ('pro','pro'),
+        ('prof','profile'),
+        ('profd','profdel'),
+        ('promptf','promptfind'),
+        ('promptr','promptrepl'),
+        ('ps','psearch'),
+        ('ptN','ptN'),
+        ('ptN','ptNext'),
+        ('pta','ptag'),
+        ('ptf','ptfirst'),
+        ('ptj','ptjump'),
+        ('ptl','ptlast'),
+        ('ptn','ptn'),
+        ('ptn','ptnext'),
+        ('ptp','ptprevious'),
+        ('ptr','ptrewind'),
+        ('pts','ptselect'),
+        ('pu','put'),
+        ('pw','pwd'),
+        ('py','py'),
+        ('py','python'),
+        ('py3','py3'),
+        ('py3','py3'),
+        ('py3do','py3do'),
+        ('pydo','pydo'),
+        ('pyf','pyfile'),
+        ('python3','python3'),
+        ('q','q'),
+        ('q','quit'),
+        ('qa','qall'),
+        ('quita','quitall'),
+        ('r','r'),
+        ('r','read'),
+        ('re','re'),
+        ('rec','recover'),
+        ('red','red'),
+        ('red','redo'),
+        ('redi','redir'),
+        ('redr','redraw'),
+        ('redraws','redrawstatus'),
+        ('reg','registers'),
+        ('res','resize'),
+        ('ret','retab'),
+        ('retu','return'),
+        ('rew','rewind'),
+        ('ri','right'),
+        ('rightb','rightbelow'),
+        ('ru','ru'),
+        ('ru','runtime'),
+        ('rub','ruby'),
+        ('rubyd','rubydo'),
+        ('rubyf','rubyfile'),
+        ('rundo','rundo'),
+        ('rv','rviminfo'),
+        ('sN','sNext'),
+        ('sa','sargument'),
+        ('sal','sall'),
+        ('san','sandbox'),
+        ('sav','saveas'),
+        ('sb','sbuffer'),
+        ('sbN','sbNext'),
+        ('sba','sball'),
+        ('sbf','sbfirst'),
+        ('sbl','sblast'),
+        ('sbm','sbmodified'),
+        ('sbn','sbnext'),
+        ('sbp','sbprevious'),
+        ('sbr','sbrewind'),
+        ('scrip','scrip'),
+        ('scrip','scriptnames'),
+        ('scripte','scriptencoding'),
+        ('scs','scs'),
+        ('scscope','scscope'),
+        ('se','set'),
+        ('setf','setfiletype'),
+        ('setg','setglobal'),
+        ('setl','setlocal'),
+        ('sf','sfind'),
+        ('sfir','sfirst'),
+        ('sh','shell'),
+        ('si','si'),
+        ('sig','sig'),
+        ('sign','sign'),
+        ('sil','silent'),
+        ('sim','simalt'),
+        ('sl','sl'),
+        ('sl','sleep'),
+        ('sla','slast'),
+        ('sm','smagic'),
+        ('sm','smap'),
+        ('sme','sme'),
+        ('smenu','smenu'),
+        ('sn','snext'),
+        ('sni','sniff'),
+        ('sno','snomagic'),
+        ('snoreme','snoreme'),
+        ('snoremenu','snoremenu'),
+        ('so','so'),
+        ('so','source'),
+        ('sor','sort'),
+        ('sp','split'),
+        ('spe','spe'),
+        ('spe','spellgood'),
+        ('spelld','spelldump'),
+        ('spelli','spellinfo'),
+        ('spellr','spellrepall'),
+        ('spellu','spellundo'),
+        ('spellw','spellwrong'),
+        ('spr','sprevious'),
+        ('sre','srewind'),
+        ('st','st'),
+        ('st','stop'),
+        ('sta','stag'),
+        ('star','star'),
+        ('star','startinsert'),
+        ('start','start'),
+        ('startg','startgreplace'),
+        ('startr','startreplace'),
+        ('stj','stjump'),
+        ('stopi','stopinsert'),
+        ('sts','stselect'),
+        ('sun','sunhide'),
+        ('sunme','sunme'),
+        ('sunmenu','sunmenu'),
+        ('sus','suspend'),
+        ('sv','sview'),
+        ('sw','swapname'),
+        ('sy','sy'),
+        ('syn','syn'),
+        ('sync','sync'),
+        ('syncbind','syncbind'),
+        ('syntime','syntime'),
+        ('t','t'),
+        ('tN','tN'),
+        ('tN','tNext'),
+        ('ta','ta'),
+        ('ta','tag'),
+        ('tab','tab'),
+        ('tabN','tabN'),
+        ('tabN','tabNext'),
+        ('tabc','tabclose'),
+        ('tabd','tabdo'),
+        ('tabe','tabedit'),
+        ('tabf','tabfind'),
+        ('tabfir','tabfirst'),
+        ('tabl','tablast'),
+        ('tabm','tabmove'),
+        ('tabn','tabnext'),
+        ('tabnew','tabnew'),
+        ('tabo','tabonly'),
+        ('tabp','tabprevious'),
+        ('tabr','tabrewind'),
+        ('tabs','tabs'),
+        ('tags','tags'),
+        ('tc','tcl'),
+        ('tcld','tcldo'),
+        ('tclf','tclfile'),
+        ('te','tearoff'),
+        ('tf','tfirst'),
+        ('th','throw'),
+        ('tj','tjump'),
+        ('tl','tlast'),
+        ('tm','tm'),
+        ('tm','tmenu'),
+        ('tn','tn'),
+        ('tn','tnext'),
+        ('to','topleft'),
+        ('tp','tprevious'),
+        ('tr','tr'),
+        ('tr','trewind'),
+        ('try','try'),
+        ('ts','tselect'),
+        ('tu','tu'),
+        ('tu','tunmenu'),
+        ('u','u'),
+        ('u','undo'),
+        ('un','un'),
+        ('una','unabbreviate'),
+        ('undoj','undojoin'),
+        ('undol','undolist'),
+        ('unh','unhide'),
+        ('unl','unl'),
+        ('unlo','unlockvar'),
+        ('uns','unsilent'),
+        ('up','update'),
+        ('v','v'),
+        ('ve','ve'),
+        ('ve','version'),
+        ('verb','verbose'),
+        ('vert','vertical'),
+        ('vi','vi'),
+        ('vi','visual'),
+        ('vie','view'),
+        ('vim','vimgrep'),
+        ('vimgrepa','vimgrepadd'),
+        ('viu','viusage'),
+        ('vmapc','vmapclear'),
+        ('vne','vnew'),
+        ('vs','vsplit'),
+        ('w','w'),
+        ('w','write'),
+        ('wN','wNext'),
+        ('wa','wall'),
+        ('wh','while'),
+        ('win','win'),
+        ('win','winsize'),
+        ('winc','wincmd'),
+        ('windo','windo'),
+        ('winp','winpos'),
+        ('wn','wnext'),
+        ('wp','wprevious'),
+        ('wq','wq'),
+        ('wqa','wqall'),
+        ('ws','wsverb'),
+        ('wundo','wundo'),
+        ('wv','wviminfo'),
+        ('x','x'),
+        ('x','xit'),
+        ('xa','xall'),
+        ('xmapc','xmapclear'),
+        ('xme','xme'),
+        ('xmenu','xmenu'),
+        ('xnoreme','xnoreme'),
+        ('xnoremenu','xnoremenu'),
+        ('xunme','xunme'),
+        ('xunmenu','xunmenu'),
+        ('xwininfo','xwininfo'),
+        ('y','yank'),
+    )
+    return var
+command = _getcommand()
+
+def _getoption():
+    var = (
+        ('acd','acd'),
+        ('ai','ai'),
+        ('akm','akm'),
+        ('al','al'),
+        ('aleph','aleph'),
+        ('allowrevins','allowrevins'),
+        ('altkeymap','altkeymap'),
+        ('ambiwidth','ambiwidth'),
+        ('ambw','ambw'),
+        ('anti','anti'),
+        ('antialias','antialias'),
+        ('ar','ar'),
+        ('arab','arab'),
+        ('arabic','arabic'),
+        ('arabicshape','arabicshape'),
+        ('ari','ari'),
+        ('arshape','arshape'),
+        ('autochdir','autochdir'),
+        ('autoindent','autoindent'),
+        ('autoread','autoread'),
+        ('autowrite','autowrite'),
+        ('autowriteall','autowriteall'),
+        ('aw','aw'),
+        ('awa','awa'),
+        ('background','background'),
+        ('backspace','backspace'),
+        ('backup','backup'),
+        ('backupcopy','backupcopy'),
+        ('backupdir','backupdir'),
+        ('backupext','backupext'),
+        ('backupskip','backupskip'),
+        ('balloondelay','balloondelay'),
+        ('ballooneval','ballooneval'),
+        ('balloonexpr','balloonexpr'),
+        ('bdir','bdir'),
+        ('bdlay','bdlay'),
+        ('beval','beval'),
+        ('bex','bex'),
+        ('bexpr','bexpr'),
+        ('bg','bg'),
+        ('bh','bh'),
+        ('bin','bin'),
+        ('binary','binary'),
+        ('biosk','biosk'),
+        ('bioskey','bioskey'),
+        ('bk','bk'),
+        ('bkc','bkc'),
+        ('bl','bl'),
+        ('bomb','bomb'),
+        ('breakat','breakat'),
+        ('brk','brk'),
+        ('browsedir','browsedir'),
+        ('bs','bs'),
+        ('bsdir','bsdir'),
+        ('bsk','bsk'),
+        ('bt','bt'),
+        ('bufhidden','bufhidden'),
+        ('buflisted','buflisted'),
+        ('buftype','buftype'),
+        ('casemap','casemap'),
+        ('cb','cb'),
+        ('cc','cc'),
+        ('ccv','ccv'),
+        ('cd','cd'),
+        ('cdpath','cdpath'),
+        ('cedit','cedit'),
+        ('cf','cf'),
+        ('cfu','cfu'),
+        ('ch','ch'),
+        ('charconvert','charconvert'),
+        ('ci','ci'),
+        ('cin','cin'),
+        ('cindent','cindent'),
+        ('cink','cink'),
+        ('cinkeys','cinkeys'),
+        ('cino','cino'),
+        ('cinoptions','cinoptions'),
+        ('cinw','cinw'),
+        ('cinwords','cinwords'),
+        ('clipboard','clipboard'),
+        ('cmdheight','cmdheight'),
+        ('cmdwinheight','cmdwinheight'),
+        ('cmp','cmp'),
+        ('cms','cms'),
+        ('co','co'),
+        ('cocu','cocu'),
+        ('cole','cole'),
+        ('colorcolumn','colorcolumn'),
+        ('columns','columns'),
+        ('com','com'),
+        ('comments','comments'),
+        ('commentstring','commentstring'),
+        ('compatible','compatible'),
+        ('complete','complete'),
+        ('completefunc','completefunc'),
+        ('completeopt','completeopt'),
+        ('concealcursor','concealcursor'),
+        ('conceallevel','conceallevel'),
+        ('confirm','confirm'),
+        ('consk','consk'),
+        ('conskey','conskey'),
+        ('copyindent','copyindent'),
+        ('cot','cot'),
+        ('cp','cp'),
+        ('cpo','cpo'),
+        ('cpoptions','cpoptions'),
+        ('cpt','cpt'),
+        ('crb','crb'),
+        ('cryptmethod','cryptmethod'),
+        ('cscopepathcomp','cscopepathcomp'),
+        ('cscopeprg','cscopeprg'),
+        ('cscopequickfix','cscopequickfix'),
+        ('cscoperelative','cscoperelative'),
+        ('cscopetag','cscopetag'),
+        ('cscopetagorder','cscopetagorder'),
+        ('cscopeverbose','cscopeverbose'),
+        ('cspc','cspc'),
+        ('csprg','csprg'),
+        ('csqf','csqf'),
+        ('csre','csre'),
+        ('cst','cst'),
+        ('csto','csto'),
+        ('csverb','csverb'),
+        ('cuc','cuc'),
+        ('cul','cul'),
+        ('cursorbind','cursorbind'),
+        ('cursorcolumn','cursorcolumn'),
+        ('cursorline','cursorline'),
+        ('cwh','cwh'),
+        ('debug','debug'),
+        ('deco','deco'),
+        ('def','def'),
+        ('define','define'),
+        ('delcombine','delcombine'),
+        ('dex','dex'),
+        ('dg','dg'),
+        ('dict','dict'),
+        ('dictionary','dictionary'),
+        ('diff','diff'),
+        ('diffexpr','diffexpr'),
+        ('diffopt','diffopt'),
+        ('digraph','digraph'),
+        ('dip','dip'),
+        ('dir','dir'),
+        ('directory','directory'),
+        ('display','display'),
+        ('dy','dy'),
+        ('ea','ea'),
+        ('ead','ead'),
+        ('eadirection','eadirection'),
+        ('eb','eb'),
+        ('ed','ed'),
+        ('edcompatible','edcompatible'),
+        ('ef','ef'),
+        ('efm','efm'),
+        ('ei','ei'),
+        ('ek','ek'),
+        ('enc','enc'),
+        ('encoding','encoding'),
+        ('endofline','endofline'),
+        ('eol','eol'),
+        ('ep','ep'),
+        ('equalalways','equalalways'),
+        ('equalprg','equalprg'),
+        ('errorbells','errorbells'),
+        ('errorfile','errorfile'),
+        ('errorformat','errorformat'),
+        ('esckeys','esckeys'),
+        ('et','et'),
+        ('eventignore','eventignore'),
+        ('ex','ex'),
+        ('expandtab','expandtab'),
+        ('exrc','exrc'),
+        ('fcl','fcl'),
+        ('fcs','fcs'),
+        ('fdc','fdc'),
+        ('fde','fde'),
+        ('fdi','fdi'),
+        ('fdl','fdl'),
+        ('fdls','fdls'),
+        ('fdm','fdm'),
+        ('fdn','fdn'),
+        ('fdo','fdo'),
+        ('fdt','fdt'),
+        ('fen','fen'),
+        ('fenc','fenc'),
+        ('fencs','fencs'),
+        ('fex','fex'),
+        ('ff','ff'),
+        ('ffs','ffs'),
+        ('fic','fic'),
+        ('fileencoding','fileencoding'),
+        ('fileencodings','fileencodings'),
+        ('fileformat','fileformat'),
+        ('fileformats','fileformats'),
+        ('fileignorecase','fileignorecase'),
+        ('filetype','filetype'),
+        ('fillchars','fillchars'),
+        ('fk','fk'),
+        ('fkmap','fkmap'),
+        ('flp','flp'),
+        ('fml','fml'),
+        ('fmr','fmr'),
+        ('fo','fo'),
+        ('foldclose','foldclose'),
+        ('foldcolumn','foldcolumn'),
+        ('foldenable','foldenable'),
+        ('foldexpr','foldexpr'),
+        ('foldignore','foldignore'),
+        ('foldlevel','foldlevel'),
+        ('foldlevelstart','foldlevelstart'),
+        ('foldmarker','foldmarker'),
+        ('foldmethod','foldmethod'),
+        ('foldminlines','foldminlines'),
+        ('foldnestmax','foldnestmax'),
+        ('foldopen','foldopen'),
+        ('foldtext','foldtext'),
+        ('formatexpr','formatexpr'),
+        ('formatlistpat','formatlistpat'),
+        ('formatoptions','formatoptions'),
+        ('formatprg','formatprg'),
+        ('fp','fp'),
+        ('fs','fs'),
+        ('fsync','fsync'),
+        ('ft','ft'),
+        ('gcr','gcr'),
+        ('gd','gd'),
+        ('gdefault','gdefault'),
+        ('gfm','gfm'),
+        ('gfn','gfn'),
+        ('gfs','gfs'),
+        ('gfw','gfw'),
+        ('ghr','ghr'),
+        ('go','go'),
+        ('gp','gp'),
+        ('grepformat','grepformat'),
+        ('grepprg','grepprg'),
+        ('gtl','gtl'),
+        ('gtt','gtt'),
+        ('guicursor','guicursor'),
+        ('guifont','guifont'),
+        ('guifontset','guifontset'),
+        ('guifontwide','guifontwide'),
+        ('guiheadroom','guiheadroom'),
+        ('guioptions','guioptions'),
+        ('guipty','guipty'),
+        ('guitablabel','guitablabel'),
+        ('guitabtooltip','guitabtooltip'),
+        ('helpfile','helpfile'),
+        ('helpheight','helpheight'),
+        ('helplang','helplang'),
+        ('hf','hf'),
+        ('hh','hh'),
+        ('hi','hi'),
+        ('hid','hid'),
+        ('hidden','hidden'),
+        ('highlight','highlight'),
+        ('history','history'),
+        ('hk','hk'),
+        ('hkmap','hkmap'),
+        ('hkmapp','hkmapp'),
+        ('hkp','hkp'),
+        ('hl','hl'),
+        ('hlg','hlg'),
+        ('hls','hls'),
+        ('hlsearch','hlsearch'),
+        ('ic','ic'),
+        ('icon','icon'),
+        ('iconstring','iconstring'),
+        ('ignorecase','ignorecase'),
+        ('im','im'),
+        ('imactivatefunc','imactivatefunc'),
+        ('imactivatekey','imactivatekey'),
+        ('imaf','imaf'),
+        ('imak','imak'),
+        ('imc','imc'),
+        ('imcmdline','imcmdline'),
+        ('imd','imd'),
+        ('imdisable','imdisable'),
+        ('imi','imi'),
+        ('iminsert','iminsert'),
+        ('ims','ims'),
+        ('imsearch','imsearch'),
+        ('imsf','imsf'),
+        ('imstatusfunc','imstatusfunc'),
+        ('inc','inc'),
+        ('include','include'),
+        ('includeexpr','includeexpr'),
+        ('incsearch','incsearch'),
+        ('inde','inde'),
+        ('indentexpr','indentexpr'),
+        ('indentkeys','indentkeys'),
+        ('indk','indk'),
+        ('inex','inex'),
+        ('inf','inf'),
+        ('infercase','infercase'),
+        ('inoremap','inoremap'),
+        ('insertmode','insertmode'),
+        ('invacd','invacd'),
+        ('invai','invai'),
+        ('invakm','invakm'),
+        ('invallowrevins','invallowrevins'),
+        ('invaltkeymap','invaltkeymap'),
+        ('invanti','invanti'),
+        ('invantialias','invantialias'),
+        ('invar','invar'),
+        ('invarab','invarab'),
+        ('invarabic','invarabic'),
+        ('invarabicshape','invarabicshape'),
+        ('invari','invari'),
+        ('invarshape','invarshape'),
+        ('invautochdir','invautochdir'),
+        ('invautoindent','invautoindent'),
+        ('invautoread','invautoread'),
+        ('invautowrite','invautowrite'),
+        ('invautowriteall','invautowriteall'),
+        ('invaw','invaw'),
+        ('invawa','invawa'),
+        ('invbackup','invbackup'),
+        ('invballooneval','invballooneval'),
+        ('invbeval','invbeval'),
+        ('invbin','invbin'),
+        ('invbinary','invbinary'),
+        ('invbiosk','invbiosk'),
+        ('invbioskey','invbioskey'),
+        ('invbk','invbk'),
+        ('invbl','invbl'),
+        ('invbomb','invbomb'),
+        ('invbuflisted','invbuflisted'),
+        ('invcf','invcf'),
+        ('invci','invci'),
+        ('invcin','invcin'),
+        ('invcindent','invcindent'),
+        ('invcompatible','invcompatible'),
+        ('invconfirm','invconfirm'),
+        ('invconsk','invconsk'),
+        ('invconskey','invconskey'),
+        ('invcopyindent','invcopyindent'),
+        ('invcp','invcp'),
+        ('invcrb','invcrb'),
+        ('invcscoperelative','invcscoperelative'),
+        ('invcscopetag','invcscopetag'),
+        ('invcscopeverbose','invcscopeverbose'),
+        ('invcsre','invcsre'),
+        ('invcst','invcst'),
+        ('invcsverb','invcsverb'),
+        ('invcuc','invcuc'),
+        ('invcul','invcul'),
+        ('invcursorbind','invcursorbind'),
+        ('invcursorcolumn','invcursorcolumn'),
+        ('invcursorline','invcursorline'),
+        ('invdeco','invdeco'),
+        ('invdelcombine','invdelcombine'),
+        ('invdg','invdg'),
+        ('invdiff','invdiff'),
+        ('invdigraph','invdigraph'),
+        ('invea','invea'),
+        ('inveb','inveb'),
+        ('inved','inved'),
+        ('invedcompatible','invedcompatible'),
+        ('invek','invek'),
+        ('invendofline','invendofline'),
+        ('inveol','inveol'),
+        ('invequalalways','invequalalways'),
+        ('inverrorbells','inverrorbells'),
+        ('invesckeys','invesckeys'),
+        ('invet','invet'),
+        ('invex','invex'),
+        ('invexpandtab','invexpandtab'),
+        ('invexrc','invexrc'),
+        ('invfen','invfen'),
+        ('invfic','invfic'),
+        ('invfileignorecase','invfileignorecase'),
+        ('invfk','invfk'),
+        ('invfkmap','invfkmap'),
+        ('invfoldenable','invfoldenable'),
+        ('invgd','invgd'),
+        ('invgdefault','invgdefault'),
+        ('invguipty','invguipty'),
+        ('invhid','invhid'),
+        ('invhidden','invhidden'),
+        ('invhk','invhk'),
+        ('invhkmap','invhkmap'),
+        ('invhkmapp','invhkmapp'),
+        ('invhkp','invhkp'),
+        ('invhls','invhls'),
+        ('invhlsearch','invhlsearch'),
+        ('invic','invic'),
+        ('invicon','invicon'),
+        ('invignorecase','invignorecase'),
+        ('invim','invim'),
+        ('invimc','invimc'),
+        ('invimcmdline','invimcmdline'),
+        ('invimd','invimd'),
+        ('invimdisable','invimdisable'),
+        ('invincsearch','invincsearch'),
+        ('invinf','invinf'),
+        ('invinfercase','invinfercase'),
+        ('invinsertmode','invinsertmode'),
+        ('invis','invis'),
+        ('invjoinspaces','invjoinspaces'),
+        ('invjs','invjs'),
+        ('invlazyredraw','invlazyredraw'),
+        ('invlbr','invlbr'),
+        ('invlinebreak','invlinebreak'),
+        ('invlisp','invlisp'),
+        ('invlist','invlist'),
+        ('invloadplugins','invloadplugins'),
+        ('invlpl','invlpl'),
+        ('invlz','invlz'),
+        ('invma','invma'),
+        ('invmacatsui','invmacatsui'),
+        ('invmagic','invmagic'),
+        ('invmh','invmh'),
+        ('invml','invml'),
+        ('invmod','invmod'),
+        ('invmodeline','invmodeline'),
+        ('invmodifiable','invmodifiable'),
+        ('invmodified','invmodified'),
+        ('invmore','invmore'),
+        ('invmousef','invmousef'),
+        ('invmousefocus','invmousefocus'),
+        ('invmousehide','invmousehide'),
+        ('invnu','invnu'),
+        ('invnumber','invnumber'),
+        ('invodev','invodev'),
+        ('invopendevice','invopendevice'),
+        ('invpaste','invpaste'),
+        ('invpi','invpi'),
+        ('invpreserveindent','invpreserveindent'),
+        ('invpreviewwindow','invpreviewwindow'),
+        ('invprompt','invprompt'),
+        ('invpvw','invpvw'),
+        ('invreadonly','invreadonly'),
+        ('invrelativenumber','invrelativenumber'),
+        ('invremap','invremap'),
+        ('invrestorescreen','invrestorescreen'),
+        ('invrevins','invrevins'),
+        ('invri','invri'),
+        ('invrightleft','invrightleft'),
+        ('invrl','invrl'),
+        ('invrnu','invrnu'),
+        ('invro','invro'),
+        ('invrs','invrs'),
+        ('invru','invru'),
+        ('invruler','invruler'),
+        ('invsb','invsb'),
+        ('invsc','invsc'),
+        ('invscb','invscb'),
+        ('invscrollbind','invscrollbind'),
+        ('invscs','invscs'),
+        ('invsecure','invsecure'),
+        ('invsft','invsft'),
+        ('invshellslash','invshellslash'),
+        ('invshelltemp','invshelltemp'),
+        ('invshiftround','invshiftround'),
+        ('invshortname','invshortname'),
+        ('invshowcmd','invshowcmd'),
+        ('invshowfulltag','invshowfulltag'),
+        ('invshowmatch','invshowmatch'),
+        ('invshowmode','invshowmode'),
+        ('invsi','invsi'),
+        ('invsm','invsm'),
+        ('invsmartcase','invsmartcase'),
+        ('invsmartindent','invsmartindent'),
+        ('invsmarttab','invsmarttab'),
+        ('invsmd','invsmd'),
+        ('invsn','invsn'),
+        ('invsol','invsol'),
+        ('invspell','invspell'),
+        ('invsplitbelow','invsplitbelow'),
+        ('invsplitright','invsplitright'),
+        ('invspr','invspr'),
+        ('invsr','invsr'),
+        ('invssl','invssl'),
+        ('invsta','invsta'),
+        ('invstartofline','invstartofline'),
+        ('invstmp','invstmp'),
+        ('invswapfile','invswapfile'),
+        ('invswf','invswf'),
+        ('invta','invta'),
+        ('invtagbsearch','invtagbsearch'),
+        ('invtagrelative','invtagrelative'),
+        ('invtagstack','invtagstack'),
+        ('invtbi','invtbi'),
+        ('invtbidi','invtbidi'),
+        ('invtbs','invtbs'),
+        ('invtermbidi','invtermbidi'),
+        ('invterse','invterse'),
+        ('invtextauto','invtextauto'),
+        ('invtextmode','invtextmode'),
+        ('invtf','invtf'),
+        ('invtgst','invtgst'),
+        ('invtildeop','invtildeop'),
+        ('invtimeout','invtimeout'),
+        ('invtitle','invtitle'),
+        ('invto','invto'),
+        ('invtop','invtop'),
+        ('invtr','invtr'),
+        ('invttimeout','invttimeout'),
+        ('invttybuiltin','invttybuiltin'),
+        ('invttyfast','invttyfast'),
+        ('invtx','invtx'),
+        ('invudf','invudf'),
+        ('invundofile','invundofile'),
+        ('invvb','invvb'),
+        ('invvisualbell','invvisualbell'),
+        ('invwa','invwa'),
+        ('invwarn','invwarn'),
+        ('invwb','invwb'),
+        ('invweirdinvert','invweirdinvert'),
+        ('invwfh','invwfh'),
+        ('invwfw','invwfw'),
+        ('invwic','invwic'),
+        ('invwildignorecase','invwildignorecase'),
+        ('invwildmenu','invwildmenu'),
+        ('invwinfixheight','invwinfixheight'),
+        ('invwinfixwidth','invwinfixwidth'),
+        ('invwiv','invwiv'),
+        ('invwmnu','invwmnu'),
+        ('invwrap','invwrap'),
+        ('invwrapscan','invwrapscan'),
+        ('invwrite','invwrite'),
+        ('invwriteany','invwriteany'),
+        ('invwritebackup','invwritebackup'),
+        ('invws','invws'),
+        ('is','is'),
+        ('isf','isf'),
+        ('isfname','isfname'),
+        ('isi','isi'),
+        ('isident','isident'),
+        ('isk','isk'),
+        ('iskeyword','iskeyword'),
+        ('isp','isp'),
+        ('isprint','isprint'),
+        ('joinspaces','joinspaces'),
+        ('js','js'),
+        ('key','key'),
+        ('keymap','keymap'),
+        ('keymodel','keymodel'),
+        ('keywordprg','keywordprg'),
+        ('km','km'),
+        ('kmp','kmp'),
+        ('kp','kp'),
+        ('langmap','langmap'),
+        ('langmenu','langmenu'),
+        ('laststatus','laststatus'),
+        ('lazyredraw','lazyredraw'),
+        ('lbr','lbr'),
+        ('lcs','lcs'),
+        ('linebreak','linebreak'),
+        ('lines','lines'),
+        ('linespace','linespace'),
+        ('lisp','lisp'),
+        ('lispwords','lispwords'),
+        ('list','list'),
+        ('listchars','listchars'),
+        ('lm','lm'),
+        ('lmap','lmap'),
+        ('loadplugins','loadplugins'),
+        ('lpl','lpl'),
+        ('ls','ls'),
+        ('lsp','lsp'),
+        ('lw','lw'),
+        ('lz','lz'),
+        ('ma','ma'),
+        ('macatsui','macatsui'),
+        ('magic','magic'),
+        ('makeef','makeef'),
+        ('makeprg','makeprg'),
+        ('mat','mat'),
+        ('matchpairs','matchpairs'),
+        ('matchtime','matchtime'),
+        ('maxcombine','maxcombine'),
+        ('maxfuncdepth','maxfuncdepth'),
+        ('maxmapdepth','maxmapdepth'),
+        ('maxmem','maxmem'),
+        ('maxmempattern','maxmempattern'),
+        ('maxmemtot','maxmemtot'),
+        ('mco','mco'),
+        ('mef','mef'),
+        ('menuitems','menuitems'),
+        ('mfd','mfd'),
+        ('mh','mh'),
+        ('mis','mis'),
+        ('mkspellmem','mkspellmem'),
+        ('ml','ml'),
+        ('mls','mls'),
+        ('mm','mm'),
+        ('mmd','mmd'),
+        ('mmp','mmp'),
+        ('mmt','mmt'),
+        ('mod','mod'),
+        ('modeline','modeline'),
+        ('modelines','modelines'),
+        ('modifiable','modifiable'),
+        ('modified','modified'),
+        ('more','more'),
+        ('mouse','mouse'),
+        ('mousef','mousef'),
+        ('mousefocus','mousefocus'),
+        ('mousehide','mousehide'),
+        ('mousem','mousem'),
+        ('mousemodel','mousemodel'),
+        ('mouses','mouses'),
+        ('mouseshape','mouseshape'),
+        ('mouset','mouset'),
+        ('mousetime','mousetime'),
+        ('mp','mp'),
+        ('mps','mps'),
+        ('msm','msm'),
+        ('mzq','mzq'),
+        ('mzquantum','mzquantum'),
+        ('nf','nf'),
+        ('nnoremap','nnoremap'),
+        ('noacd','noacd'),
+        ('noai','noai'),
+        ('noakm','noakm'),
+        ('noallowrevins','noallowrevins'),
+        ('noaltkeymap','noaltkeymap'),
+        ('noanti','noanti'),
+        ('noantialias','noantialias'),
+        ('noar','noar'),
+        ('noarab','noarab'),
+        ('noarabic','noarabic'),
+        ('noarabicshape','noarabicshape'),
+        ('noari','noari'),
+        ('noarshape','noarshape'),
+        ('noautochdir','noautochdir'),
+        ('noautoindent','noautoindent'),
+        ('noautoread','noautoread'),
+        ('noautowrite','noautowrite'),
+        ('noautowriteall','noautowriteall'),
+        ('noaw','noaw'),
+        ('noawa','noawa'),
+        ('nobackup','nobackup'),
+        ('noballooneval','noballooneval'),
+        ('nobeval','nobeval'),
+        ('nobin','nobin'),
+        ('nobinary','nobinary'),
+        ('nobiosk','nobiosk'),
+        ('nobioskey','nobioskey'),
+        ('nobk','nobk'),
+        ('nobl','nobl'),
+        ('nobomb','nobomb'),
+        ('nobuflisted','nobuflisted'),
+        ('nocf','nocf'),
+        ('noci','noci'),
+        ('nocin','nocin'),
+        ('nocindent','nocindent'),
+        ('nocompatible','nocompatible'),
+        ('noconfirm','noconfirm'),
+        ('noconsk','noconsk'),
+        ('noconskey','noconskey'),
+        ('nocopyindent','nocopyindent'),
+        ('nocp','nocp'),
+        ('nocrb','nocrb'),
+        ('nocscoperelative','nocscoperelative'),
+        ('nocscopetag','nocscopetag'),
+        ('nocscopeverbose','nocscopeverbose'),
+        ('nocsre','nocsre'),
+        ('nocst','nocst'),
+        ('nocsverb','nocsverb'),
+        ('nocuc','nocuc'),
+        ('nocul','nocul'),
+        ('nocursorbind','nocursorbind'),
+        ('nocursorcolumn','nocursorcolumn'),
+        ('nocursorline','nocursorline'),
+        ('nodeco','nodeco'),
+        ('nodelcombine','nodelcombine'),
+        ('nodg','nodg'),
+        ('nodiff','nodiff'),
+        ('nodigraph','nodigraph'),
+        ('noea','noea'),
+        ('noeb','noeb'),
+        ('noed','noed'),
+        ('noedcompatible','noedcompatible'),
+        ('noek','noek'),
+        ('noendofline','noendofline'),
+        ('noeol','noeol'),
+        ('noequalalways','noequalalways'),
+        ('noerrorbells','noerrorbells'),
+        ('noesckeys','noesckeys'),
+        ('noet','noet'),
+        ('noex','noex'),
+        ('noexpandtab','noexpandtab'),
+        ('noexrc','noexrc'),
+        ('nofen','nofen'),
+        ('nofic','nofic'),
+        ('nofileignorecase','nofileignorecase'),
+        ('nofk','nofk'),
+        ('nofkmap','nofkmap'),
+        ('nofoldenable','nofoldenable'),
+        ('nogd','nogd'),
+        ('nogdefault','nogdefault'),
+        ('noguipty','noguipty'),
+        ('nohid','nohid'),
+        ('nohidden','nohidden'),
+        ('nohk','nohk'),
+        ('nohkmap','nohkmap'),
+        ('nohkmapp','nohkmapp'),
+        ('nohkp','nohkp'),
+        ('nohls','nohls'),
+        ('nohlsearch','nohlsearch'),
+        ('noic','noic'),
+        ('noicon','noicon'),
+        ('noignorecase','noignorecase'),
+        ('noim','noim'),
+        ('noimc','noimc'),
+        ('noimcmdline','noimcmdline'),
+        ('noimd','noimd'),
+        ('noimdisable','noimdisable'),
+        ('noincsearch','noincsearch'),
+        ('noinf','noinf'),
+        ('noinfercase','noinfercase'),
+        ('noinsertmode','noinsertmode'),
+        ('nois','nois'),
+        ('nojoinspaces','nojoinspaces'),
+        ('nojs','nojs'),
+        ('nolazyredraw','nolazyredraw'),
+        ('nolbr','nolbr'),
+        ('nolinebreak','nolinebreak'),
+        ('nolisp','nolisp'),
+        ('nolist','nolist'),
+        ('noloadplugins','noloadplugins'),
+        ('nolpl','nolpl'),
+        ('nolz','nolz'),
+        ('noma','noma'),
+        ('nomacatsui','nomacatsui'),
+        ('nomagic','nomagic'),
+        ('nomh','nomh'),
+        ('noml','noml'),
+        ('nomod','nomod'),
+        ('nomodeline','nomodeline'),
+        ('nomodifiable','nomodifiable'),
+        ('nomodified','nomodified'),
+        ('nomore','nomore'),
+        ('nomousef','nomousef'),
+        ('nomousefocus','nomousefocus'),
+        ('nomousehide','nomousehide'),
+        ('nonu','nonu'),
+        ('nonumber','nonumber'),
+        ('noodev','noodev'),
+        ('noopendevice','noopendevice'),
+        ('nopaste','nopaste'),
+        ('nopi','nopi'),
+        ('nopreserveindent','nopreserveindent'),
+        ('nopreviewwindow','nopreviewwindow'),
+        ('noprompt','noprompt'),
+        ('nopvw','nopvw'),
+        ('noreadonly','noreadonly'),
+        ('norelativenumber','norelativenumber'),
+        ('noremap','noremap'),
+        ('norestorescreen','norestorescreen'),
+        ('norevins','norevins'),
+        ('nori','nori'),
+        ('norightleft','norightleft'),
+        ('norl','norl'),
+        ('nornu','nornu'),
+        ('noro','noro'),
+        ('nors','nors'),
+        ('noru','noru'),
+        ('noruler','noruler'),
+        ('nosb','nosb'),
+        ('nosc','nosc'),
+        ('noscb','noscb'),
+        ('noscrollbind','noscrollbind'),
+        ('noscs','noscs'),
+        ('nosecure','nosecure'),
+        ('nosft','nosft'),
+        ('noshellslash','noshellslash'),
+        ('noshelltemp','noshelltemp'),
+        ('noshiftround','noshiftround'),
+        ('noshortname','noshortname'),
+        ('noshowcmd','noshowcmd'),
+        ('noshowfulltag','noshowfulltag'),
+        ('noshowmatch','noshowmatch'),
+        ('noshowmode','noshowmode'),
+        ('nosi','nosi'),
+        ('nosm','nosm'),
+        ('nosmartcase','nosmartcase'),
+        ('nosmartindent','nosmartindent'),
+        ('nosmarttab','nosmarttab'),
+        ('nosmd','nosmd'),
+        ('nosn','nosn'),
+        ('nosol','nosol'),
+        ('nospell','nospell'),
+        ('nosplitbelow','nosplitbelow'),
+        ('nosplitright','nosplitright'),
+        ('nospr','nospr'),
+        ('nosr','nosr'),
+        ('nossl','nossl'),
+        ('nosta','nosta'),
+        ('nostartofline','nostartofline'),
+        ('nostmp','nostmp'),
+        ('noswapfile','noswapfile'),
+        ('noswf','noswf'),
+        ('nota','nota'),
+        ('notagbsearch','notagbsearch'),
+        ('notagrelative','notagrelative'),
+        ('notagstack','notagstack'),
+        ('notbi','notbi'),
+        ('notbidi','notbidi'),
+        ('notbs','notbs'),
+        ('notermbidi','notermbidi'),
+        ('noterse','noterse'),
+        ('notextauto','notextauto'),
+        ('notextmode','notextmode'),
+        ('notf','notf'),
+        ('notgst','notgst'),
+        ('notildeop','notildeop'),
+        ('notimeout','notimeout'),
+        ('notitle','notitle'),
+        ('noto','noto'),
+        ('notop','notop'),
+        ('notr','notr'),
+        ('nottimeout','nottimeout'),
+        ('nottybuiltin','nottybuiltin'),
+        ('nottyfast','nottyfast'),
+        ('notx','notx'),
+        ('noudf','noudf'),
+        ('noundofile','noundofile'),
+        ('novb','novb'),
+        ('novisualbell','novisualbell'),
+        ('nowa','nowa'),
+        ('nowarn','nowarn'),
+        ('nowb','nowb'),
+        ('noweirdinvert','noweirdinvert'),
+        ('nowfh','nowfh'),
+        ('nowfw','nowfw'),
+        ('nowic','nowic'),
+        ('nowildignorecase','nowildignorecase'),
+        ('nowildmenu','nowildmenu'),
+        ('nowinfixheight','nowinfixheight'),
+        ('nowinfixwidth','nowinfixwidth'),
+        ('nowiv','nowiv'),
+        ('nowmnu','nowmnu'),
+        ('nowrap','nowrap'),
+        ('nowrapscan','nowrapscan'),
+        ('nowrite','nowrite'),
+        ('nowriteany','nowriteany'),
+        ('nowritebackup','nowritebackup'),
+        ('nows','nows'),
+        ('nrformats','nrformats'),
+        ('nu','nu'),
+        ('number','number'),
+        ('numberwidth','numberwidth'),
+        ('nuw','nuw'),
+        ('odev','odev'),
+        ('oft','oft'),
+        ('ofu','ofu'),
+        ('omnifunc','omnifunc'),
+        ('opendevice','opendevice'),
+        ('operatorfunc','operatorfunc'),
+        ('opfunc','opfunc'),
+        ('osfiletype','osfiletype'),
+        ('pa','pa'),
+        ('para','para'),
+        ('paragraphs','paragraphs'),
+        ('paste','paste'),
+        ('pastetoggle','pastetoggle'),
+        ('patchexpr','patchexpr'),
+        ('patchmode','patchmode'),
+        ('path','path'),
+        ('pdev','pdev'),
+        ('penc','penc'),
+        ('pex','pex'),
+        ('pexpr','pexpr'),
+        ('pfn','pfn'),
+        ('ph','ph'),
+        ('pheader','pheader'),
+        ('pi','pi'),
+        ('pm','pm'),
+        ('pmbcs','pmbcs'),
+        ('pmbfn','pmbfn'),
+        ('popt','popt'),
+        ('preserveindent','preserveindent'),
+        ('previewheight','previewheight'),
+        ('previewwindow','previewwindow'),
+        ('printdevice','printdevice'),
+        ('printencoding','printencoding'),
+        ('printexpr','printexpr'),
+        ('printfont','printfont'),
+        ('printheader','printheader'),
+        ('printmbcharset','printmbcharset'),
+        ('printmbfont','printmbfont'),
+        ('printoptions','printoptions'),
+        ('prompt','prompt'),
+        ('pt','pt'),
+        ('pumheight','pumheight'),
+        ('pvh','pvh'),
+        ('pvw','pvw'),
+        ('qe','qe'),
+        ('quoteescape','quoteescape'),
+        ('rdt','rdt'),
+        ('re','re'),
+        ('readonly','readonly'),
+        ('redrawtime','redrawtime'),
+        ('regexpengine','regexpengine'),
+        ('relativenumber','relativenumber'),
+        ('remap','remap'),
+        ('report','report'),
+        ('restorescreen','restorescreen'),
+        ('revins','revins'),
+        ('ri','ri'),
+        ('rightleft','rightleft'),
+        ('rightleftcmd','rightleftcmd'),
+        ('rl','rl'),
+        ('rlc','rlc'),
+        ('rnu','rnu'),
+        ('ro','ro'),
+        ('rs','rs'),
+        ('rtp','rtp'),
+        ('ru','ru'),
+        ('ruf','ruf'),
+        ('ruler','ruler'),
+        ('rulerformat','rulerformat'),
+        ('runtimepath','runtimepath'),
+        ('sb','sb'),
+        ('sbo','sbo'),
+        ('sbr','sbr'),
+        ('sc','sc'),
+        ('scb','scb'),
+        ('scr','scr'),
+        ('scroll','scroll'),
+        ('scrollbind','scrollbind'),
+        ('scrolljump','scrolljump'),
+        ('scrolloff','scrolloff'),
+        ('scrollopt','scrollopt'),
+        ('scs','scs'),
+        ('sect','sect'),
+        ('sections','sections'),
+        ('secure','secure'),
+        ('sel','sel'),
+        ('selection','selection'),
+        ('selectmode','selectmode'),
+        ('sessionoptions','sessionoptions'),
+        ('sft','sft'),
+        ('sh','sh'),
+        ('shcf','shcf'),
+        ('shell','shell'),
+        ('shellcmdflag','shellcmdflag'),
+        ('shellpipe','shellpipe'),
+        ('shellquote','shellquote'),
+        ('shellredir','shellredir'),
+        ('shellslash','shellslash'),
+        ('shelltemp','shelltemp'),
+        ('shelltype','shelltype'),
+        ('shellxescape','shellxescape'),
+        ('shellxquote','shellxquote'),
+        ('shiftround','shiftround'),
+        ('shiftwidth','shiftwidth'),
+        ('shm','shm'),
+        ('shortmess','shortmess'),
+        ('shortname','shortname'),
+        ('showbreak','showbreak'),
+        ('showcmd','showcmd'),
+        ('showfulltag','showfulltag'),
+        ('showmatch','showmatch'),
+        ('showmode','showmode'),
+        ('showtabline','showtabline'),
+        ('shq','shq'),
+        ('si','si'),
+        ('sidescroll','sidescroll'),
+        ('sidescrolloff','sidescrolloff'),
+        ('siso','siso'),
+        ('sj','sj'),
+        ('slm','slm'),
+        ('sm','sm'),
+        ('smartcase','smartcase'),
+        ('smartindent','smartindent'),
+        ('smarttab','smarttab'),
+        ('smc','smc'),
+        ('smd','smd'),
+        ('sn','sn'),
+        ('so','so'),
+        ('softtabstop','softtabstop'),
+        ('sol','sol'),
+        ('sp','sp'),
+        ('spc','spc'),
+        ('spell','spell'),
+        ('spellcapcheck','spellcapcheck'),
+        ('spellfile','spellfile'),
+        ('spelllang','spelllang'),
+        ('spellsuggest','spellsuggest'),
+        ('spf','spf'),
+        ('spl','spl'),
+        ('splitbelow','splitbelow'),
+        ('splitright','splitright'),
+        ('spr','spr'),
+        ('sps','sps'),
+        ('sr','sr'),
+        ('srr','srr'),
+        ('ss','ss'),
+        ('ssl','ssl'),
+        ('ssop','ssop'),
+        ('st','st'),
+        ('sta','sta'),
+        ('stal','stal'),
+        ('startofline','startofline'),
+        ('statusline','statusline'),
+        ('stl','stl'),
+        ('stmp','stmp'),
+        ('sts','sts'),
+        ('su','su'),
+        ('sua','sua'),
+        ('suffixes','suffixes'),
+        ('suffixesadd','suffixesadd'),
+        ('sw','sw'),
+        ('swapfile','swapfile'),
+        ('swapsync','swapsync'),
+        ('swb','swb'),
+        ('swf','swf'),
+        ('switchbuf','switchbuf'),
+        ('sws','sws'),
+        ('sxe','sxe'),
+        ('sxq','sxq'),
+        ('syn','syn'),
+        ('synmaxcol','synmaxcol'),
+        ('syntax','syntax'),
+        ('t_AB','t_AB'),
+        ('t_AF','t_AF'),
+        ('t_AL','t_AL'),
+        ('t_CS','t_CS'),
+        ('t_CV','t_CV'),
+        ('t_Ce','t_Ce'),
+        ('t_Co','t_Co'),
+        ('t_Cs','t_Cs'),
+        ('t_DL','t_DL'),
+        ('t_EI','t_EI'),
+        ('t_F1','t_F1'),
+        ('t_F2','t_F2'),
+        ('t_F3','t_F3'),
+        ('t_F4','t_F4'),
+        ('t_F5','t_F5'),
+        ('t_F6','t_F6'),
+        ('t_F7','t_F7'),
+        ('t_F8','t_F8'),
+        ('t_F9','t_F9'),
+        ('t_IE','t_IE'),
+        ('t_IS','t_IS'),
+        ('t_K1','t_K1'),
+        ('t_K3','t_K3'),
+        ('t_K4','t_K4'),
+        ('t_K5','t_K5'),
+        ('t_K6','t_K6'),
+        ('t_K7','t_K7'),
+        ('t_K8','t_K8'),
+        ('t_K9','t_K9'),
+        ('t_KA','t_KA'),
+        ('t_KB','t_KB'),
+        ('t_KC','t_KC'),
+        ('t_KD','t_KD'),
+        ('t_KE','t_KE'),
+        ('t_KF','t_KF'),
+        ('t_KG','t_KG'),
+        ('t_KH','t_KH'),
+        ('t_KI','t_KI'),
+        ('t_KJ','t_KJ'),
+        ('t_KK','t_KK'),
+        ('t_KL','t_KL'),
+        ('t_RI','t_RI'),
+        ('t_RV','t_RV'),
+        ('t_SI','t_SI'),
+        ('t_Sb','t_Sb'),
+        ('t_Sf','t_Sf'),
+        ('t_WP','t_WP'),
+        ('t_WS','t_WS'),
+        ('t_ZH','t_ZH'),
+        ('t_ZR','t_ZR'),
+        ('t_al','t_al'),
+        ('t_bc','t_bc'),
+        ('t_cd','t_cd'),
+        ('t_ce','t_ce'),
+        ('t_cl','t_cl'),
+        ('t_cm','t_cm'),
+        ('t_cs','t_cs'),
+        ('t_da','t_da'),
+        ('t_db','t_db'),
+        ('t_dl','t_dl'),
+        ('t_fs','t_fs'),
+        ('t_k1','t_k1'),
+        ('t_k2','t_k2'),
+        ('t_k3','t_k3'),
+        ('t_k4','t_k4'),
+        ('t_k5','t_k5'),
+        ('t_k6','t_k6'),
+        ('t_k7','t_k7'),
+        ('t_k8','t_k8'),
+        ('t_k9','t_k9'),
+        ('t_kB','t_kB'),
+        ('t_kD','t_kD'),
+        ('t_kI','t_kI'),
+        ('t_kN','t_kN'),
+        ('t_kP','t_kP'),
+        ('t_kb','t_kb'),
+        ('t_kd','t_kd'),
+        ('t_ke','t_ke'),
+        ('t_kh','t_kh'),
+        ('t_kl','t_kl'),
+        ('t_kr','t_kr'),
+        ('t_ks','t_ks'),
+        ('t_ku','t_ku'),
+        ('t_le','t_le'),
+        ('t_mb','t_mb'),
+        ('t_md','t_md'),
+        ('t_me','t_me'),
+        ('t_mr','t_mr'),
+        ('t_ms','t_ms'),
+        ('t_nd','t_nd'),
+        ('t_op','t_op'),
+        ('t_se','t_se'),
+        ('t_so','t_so'),
+        ('t_sr','t_sr'),
+        ('t_te','t_te'),
+        ('t_ti','t_ti'),
+        ('t_ts','t_ts'),
+        ('t_u7','t_u7'),
+        ('t_ue','t_ue'),
+        ('t_us','t_us'),
+        ('t_ut','t_ut'),
+        ('t_vb','t_vb'),
+        ('t_ve','t_ve'),
+        ('t_vi','t_vi'),
+        ('t_vs','t_vs'),
+        ('t_xs','t_xs'),
+        ('ta','ta'),
+        ('tabline','tabline'),
+        ('tabpagemax','tabpagemax'),
+        ('tabstop','tabstop'),
+        ('tag','tag'),
+        ('tagbsearch','tagbsearch'),
+        ('taglength','taglength'),
+        ('tagrelative','tagrelative'),
+        ('tags','tags'),
+        ('tagstack','tagstack'),
+        ('tal','tal'),
+        ('tb','tb'),
+        ('tbi','tbi'),
+        ('tbidi','tbidi'),
+        ('tbis','tbis'),
+        ('tbs','tbs'),
+        ('tenc','tenc'),
+        ('term','term'),
+        ('termbidi','termbidi'),
+        ('termencoding','termencoding'),
+        ('terse','terse'),
+        ('textauto','textauto'),
+        ('textmode','textmode'),
+        ('textwidth','textwidth'),
+        ('tf','tf'),
+        ('tgst','tgst'),
+        ('thesaurus','thesaurus'),
+        ('tildeop','tildeop'),
+        ('timeout','timeout'),
+        ('timeoutlen','timeoutlen'),
+        ('title','title'),
+        ('titlelen','titlelen'),
+        ('titleold','titleold'),
+        ('titlestring','titlestring'),
+        ('tl','tl'),
+        ('tm','tm'),
+        ('to','to'),
+        ('toolbar','toolbar'),
+        ('toolbariconsize','toolbariconsize'),
+        ('top','top'),
+        ('tpm','tpm'),
+        ('tr','tr'),
+        ('ts','ts'),
+        ('tsl','tsl'),
+        ('tsr','tsr'),
+        ('ttimeout','ttimeout'),
+        ('ttimeoutlen','ttimeoutlen'),
+        ('ttm','ttm'),
+        ('tty','tty'),
+        ('ttybuiltin','ttybuiltin'),
+        ('ttyfast','ttyfast'),
+        ('ttym','ttym'),
+        ('ttymouse','ttymouse'),
+        ('ttyscroll','ttyscroll'),
+        ('ttytype','ttytype'),
+        ('tw','tw'),
+        ('tx','tx'),
+        ('uc','uc'),
+        ('udf','udf'),
+        ('udir','udir'),
+        ('ul','ul'),
+        ('undodir','undodir'),
+        ('undofile','undofile'),
+        ('undolevels','undolevels'),
+        ('undoreload','undoreload'),
+        ('updatecount','updatecount'),
+        ('updatetime','updatetime'),
+        ('ur','ur'),
+        ('ut','ut'),
+        ('vb','vb'),
+        ('vbs','vbs'),
+        ('vdir','vdir'),
+        ('ve','ve'),
+        ('verbose','verbose'),
+        ('verbosefile','verbosefile'),
+        ('vfile','vfile'),
+        ('vi','vi'),
+        ('viewdir','viewdir'),
+        ('viewoptions','viewoptions'),
+        ('viminfo','viminfo'),
+        ('virtualedit','virtualedit'),
+        ('visualbell','visualbell'),
+        ('vnoremap','vnoremap'),
+        ('vop','vop'),
+        ('wa','wa'),
+        ('wak','wak'),
+        ('warn','warn'),
+        ('wb','wb'),
+        ('wc','wc'),
+        ('wcm','wcm'),
+        ('wd','wd'),
+        ('weirdinvert','weirdinvert'),
+        ('wfh','wfh'),
+        ('wfw','wfw'),
+        ('wh','wh'),
+        ('whichwrap','whichwrap'),
+        ('wi','wi'),
+        ('wic','wic'),
+        ('wig','wig'),
+        ('wildchar','wildchar'),
+        ('wildcharm','wildcharm'),
+        ('wildignore','wildignore'),
+        ('wildignorecase','wildignorecase'),
+        ('wildmenu','wildmenu'),
+        ('wildmode','wildmode'),
+        ('wildoptions','wildoptions'),
+        ('wim','wim'),
+        ('winaltkeys','winaltkeys'),
+        ('window','window'),
+        ('winfixheight','winfixheight'),
+        ('winfixwidth','winfixwidth'),
+        ('winheight','winheight'),
+        ('winminheight','winminheight'),
+        ('winminwidth','winminwidth'),
+        ('winwidth','winwidth'),
+        ('wiv','wiv'),
+        ('wiw','wiw'),
+        ('wm','wm'),
+        ('wmh','wmh'),
+        ('wmnu','wmnu'),
+        ('wmw','wmw'),
+        ('wop','wop'),
+        ('wrap','wrap'),
+        ('wrapmargin','wrapmargin'),
+        ('wrapscan','wrapscan'),
+        ('write','write'),
+        ('writeany','writeany'),
+        ('writebackup','writebackup'),
+        ('writedelay','writedelay'),
+        ('ws','ws'),
+        ('ww','ww'),
+    )
+    return var
+option = _getoption()
+
diff --git a/.venv/Lib/site-packages/pygments/lexers/actionscript.py b/.venv/Lib/site-packages/pygments/lexers/actionscript.py
new file mode 100644 (file)
index 0000000..3a6ba42
--- /dev/null
@@ -0,0 +1,243 @@
+"""
+    pygments.lexers.actionscript
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for ActionScript and MXML.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, using, this, words, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['ActionScriptLexer', 'ActionScript3Lexer', 'MxmlLexer']
+
+
+class ActionScriptLexer(RegexLexer):
+    """
+    For ActionScript source code.
+    """
+
+    name = 'ActionScript'
+    aliases = ['actionscript', 'as']
+    filenames = ['*.as']
+    mimetypes = ['application/x-actionscript', 'text/x-actionscript',
+                 'text/actionscript']
+    url = 'https://en.wikipedia.org/wiki/ActionScript'
+    version_added = '0.9'
+
+    flags = re.DOTALL
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'/(\\\\|\\[^\\]|[^/\\\n])*/[gim]*', String.Regex),
+            (r'[~^*!%&<>|+=:;,/?\\-]+', Operator),
+            (r'[{}\[\]();.]+', Punctuation),
+            (words((
+                'case', 'default', 'for', 'each', 'in', 'while', 'do', 'break',
+                'return', 'continue', 'if', 'else', 'throw', 'try', 'catch',
+                'var', 'with', 'new', 'typeof', 'arguments', 'instanceof', 'this',
+                'switch'), suffix=r'\b'),
+             Keyword),
+            (words((
+                'class', 'public', 'final', 'internal', 'native', 'override', 'private',
+                'protected', 'static', 'import', 'extends', 'implements', 'interface',
+                'intrinsic', 'return', 'super', 'dynamic', 'function', 'const', 'get',
+                'namespace', 'package', 'set'), suffix=r'\b'),
+             Keyword.Declaration),
+            (r'(true|false|null|NaN|Infinity|-Infinity|undefined|Void)\b',
+             Keyword.Constant),
+            (words((
+                'Accessibility', 'AccessibilityProperties', 'ActionScriptVersion',
+                'ActivityEvent', 'AntiAliasType', 'ApplicationDomain', 'AsBroadcaster', 'Array',
+                'AsyncErrorEvent', 'AVM1Movie', 'BevelFilter', 'Bitmap', 'BitmapData',
+                'BitmapDataChannel', 'BitmapFilter', 'BitmapFilterQuality', 'BitmapFilterType',
+                'BlendMode', 'BlurFilter', 'Boolean', 'ByteArray', 'Camera', 'Capabilities', 'CapsStyle',
+                'Class', 'Color', 'ColorMatrixFilter', 'ColorTransform', 'ContextMenu',
+                'ContextMenuBuiltInItems', 'ContextMenuEvent', 'ContextMenuItem',
+                'ConvultionFilter', 'CSMSettings', 'DataEvent', 'Date', 'DefinitionError',
+                'DeleteObjectSample', 'Dictionary', 'DisplacmentMapFilter', 'DisplayObject',
+                'DisplacmentMapFilterMode', 'DisplayObjectContainer', 'DropShadowFilter',
+                'Endian', 'EOFError', 'Error', 'ErrorEvent', 'EvalError', 'Event', 'EventDispatcher',
+                'EventPhase', 'ExternalInterface', 'FileFilter', 'FileReference',
+                'FileReferenceList', 'FocusDirection', 'FocusEvent', 'Font', 'FontStyle', 'FontType',
+                'FrameLabel', 'FullScreenEvent', 'Function', 'GlowFilter', 'GradientBevelFilter',
+                'GradientGlowFilter', 'GradientType', 'Graphics', 'GridFitType', 'HTTPStatusEvent',
+                'IBitmapDrawable', 'ID3Info', 'IDataInput', 'IDataOutput', 'IDynamicPropertyOutput'
+                'IDynamicPropertyWriter', 'IEventDispatcher', 'IExternalizable',
+                'IllegalOperationError', 'IME', 'IMEConversionMode', 'IMEEvent', 'int',
+                'InteractiveObject', 'InterpolationMethod', 'InvalidSWFError', 'InvokeEvent',
+                'IOError', 'IOErrorEvent', 'JointStyle', 'Key', 'Keyboard', 'KeyboardEvent', 'KeyLocation',
+                'LineScaleMode', 'Loader', 'LoaderContext', 'LoaderInfo', 'LoadVars', 'LocalConnection',
+                'Locale', 'Math', 'Matrix', 'MemoryError', 'Microphone', 'MorphShape', 'Mouse', 'MouseEvent',
+                'MovieClip', 'MovieClipLoader', 'Namespace', 'NetConnection', 'NetStatusEvent',
+                'NetStream', 'NewObjectSample', 'Number', 'Object', 'ObjectEncoding', 'PixelSnapping',
+                'Point', 'PrintJob', 'PrintJobOptions', 'PrintJobOrientation', 'ProgressEvent', 'Proxy',
+                'QName', 'RangeError', 'Rectangle', 'ReferenceError', 'RegExp', 'Responder', 'Sample',
+                'Scene', 'ScriptTimeoutError', 'Security', 'SecurityDomain', 'SecurityError',
+                'SecurityErrorEvent', 'SecurityPanel', 'Selection', 'Shape', 'SharedObject',
+                'SharedObjectFlushStatus', 'SimpleButton', 'Socket', 'Sound', 'SoundChannel',
+                'SoundLoaderContext', 'SoundMixer', 'SoundTransform', 'SpreadMethod', 'Sprite',
+                'StackFrame', 'StackOverflowError', 'Stage', 'StageAlign', 'StageDisplayState',
+                'StageQuality', 'StageScaleMode', 'StaticText', 'StatusEvent', 'String', 'StyleSheet',
+                'SWFVersion', 'SyncEvent', 'SyntaxError', 'System', 'TextColorType', 'TextField',
+                'TextFieldAutoSize', 'TextFieldType', 'TextFormat', 'TextFormatAlign',
+                'TextLineMetrics', 'TextRenderer', 'TextSnapshot', 'Timer', 'TimerEvent', 'Transform',
+                'TypeError', 'uint', 'URIError', 'URLLoader', 'URLLoaderDataFormat', 'URLRequest',
+                'URLRequestHeader', 'URLRequestMethod', 'URLStream', 'URLVariabeles', 'VerifyError',
+                'Video', 'XML', 'XMLDocument', 'XMLList', 'XMLNode', 'XMLNodeType', 'XMLSocket',
+                'XMLUI'), suffix=r'\b'),
+             Name.Builtin),
+            (words((
+                'decodeURI', 'decodeURIComponent', 'encodeURI', 'escape', 'eval', 'isFinite', 'isNaN',
+                'isXMLName', 'clearInterval', 'fscommand', 'getTimer', 'getURL', 'getVersion',
+                'parseFloat', 'parseInt', 'setInterval', 'trace', 'updateAfterEvent',
+                'unescape'), suffix=r'\b'),
+             Name.Function),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ]
+    }
+
+    def analyse_text(text):
+        """This is only used to disambiguate between ActionScript and
+        ActionScript3. We return 0 here; the ActionScript3 lexer will match
+        AS3 variable definitions and that will hopefully suffice."""
+        return 0
+
+class ActionScript3Lexer(RegexLexer):
+    """
+    For ActionScript 3 source code.
+    """
+
+    name = 'ActionScript 3'
+    url = 'https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/index.html'
+    aliases = ['actionscript3', 'as3']
+    filenames = ['*.as']
+    mimetypes = ['application/x-actionscript3', 'text/x-actionscript3',
+                 'text/actionscript3']
+    version_added = '0.11'
+
+    identifier = r'[$a-zA-Z_]\w*'
+    typeidentifier = identifier + r'(?:\.<\w+>)?'
+
+    flags = re.DOTALL | re.MULTILINE
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'(function\s+)(' + identifier + r')(\s*)(\()',
+             bygroups(Keyword.Declaration, Name.Function, Text, Operator),
+             'funcparams'),
+            (r'(var|const)(\s+)(' + identifier + r')(\s*)(:)(\s*)(' +
+             typeidentifier + r')',
+             bygroups(Keyword.Declaration, Whitespace, Name, Whitespace, Punctuation, Whitespace,
+                      Keyword.Type)),
+            (r'(import|package)(\s+)((?:' + identifier + r'|\.)+)(\s*)',
+             bygroups(Keyword, Whitespace, Name.Namespace, Whitespace)),
+            (r'(new)(\s+)(' + typeidentifier + r')(\s*)(\()',
+             bygroups(Keyword, Whitespace, Keyword.Type, Whitespace, Operator)),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'/(\\\\|\\[^\\]|[^\\\n])*/[gisx]*', String.Regex),
+            (r'(\.)(' + identifier + r')', bygroups(Operator, Name.Attribute)),
+            (r'(case|default|for|each|in|while|do|break|return|continue|if|else|'
+             r'throw|try|catch|with|new|typeof|arguments|instanceof|this|'
+             r'switch|import|include|as|is)\b',
+             Keyword),
+            (r'(class|public|final|internal|native|override|private|protected|'
+             r'static|import|extends|implements|interface|intrinsic|return|super|'
+             r'dynamic|function|const|get|namespace|package|set)\b',
+             Keyword.Declaration),
+            (r'(true|false|null|NaN|Infinity|-Infinity|undefined|void)\b',
+             Keyword.Constant),
+            (r'(decodeURI|decodeURIComponent|encodeURI|escape|eval|isFinite|isNaN|'
+             r'isXMLName|clearInterval|fscommand|getTimer|getURL|getVersion|'
+             r'isFinite|parseFloat|parseInt|setInterval|trace|updateAfterEvent|'
+             r'unescape)\b', Name.Function),
+            (identifier, Name),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'[~^*!%&<>|+=:;,/?\\{}\[\]().-]+', Operator),
+        ],
+        'funcparams': [
+            (r'\s+', Whitespace),
+            (r'(\s*)(\.\.\.)?(' + identifier + r')(\s*)(:)(\s*)(' +
+             typeidentifier + r'|\*)(\s*)',
+             bygroups(Whitespace, Punctuation, Name, Whitespace, Operator, Whitespace,
+                      Keyword.Type, Whitespace), 'defval'),
+            (r'\)', Operator, 'type')
+        ],
+        'type': [
+            (r'(\s*)(:)(\s*)(' + typeidentifier + r'|\*)',
+             bygroups(Whitespace, Operator, Whitespace, Keyword.Type), '#pop:2'),
+            (r'\s+', Text, '#pop:2'),
+            default('#pop:2')
+        ],
+        'defval': [
+            (r'(=)(\s*)([^(),]+)(\s*)(,?)',
+             bygroups(Operator, Whitespace, using(this), Whitespace, Operator), '#pop'),
+            (r',', Operator, '#pop'),
+            default('#pop')
+        ]
+    }
+
+    def analyse_text(text):
+        if re.match(r'\w+\s*:\s*\w', text):
+            return 0.3
+        return 0
+
+
+class MxmlLexer(RegexLexer):
+    """
+    For MXML markup.
+    Nested AS3 in <script> tags is highlighted by the appropriate lexer.
+    """
+    flags = re.MULTILINE | re.DOTALL
+    name = 'MXML'
+    aliases = ['mxml']
+    filenames = ['*.mxml']
+    url = 'https://en.wikipedia.org/wiki/MXML'
+    version_added = '1.1'
+
+    tokens = {
+        'root': [
+            ('[^<&]+', Text),
+            (r'&\S*?;', Name.Entity),
+            (r'(\<\!\[CDATA\[)(.*?)(\]\]\>)',
+             bygroups(String, using(ActionScript3Lexer), String)),
+            ('<!--', Comment, 'comment'),
+            (r'<\?.*?\?>', Comment.Preproc),
+            ('<![^>]*>', Comment.Preproc),
+            (r'<\s*[\w:.-]+', Name.Tag, 'tag'),
+            (r'<\s*/\s*[\w:.-]+\s*>', Name.Tag),
+        ],
+        'comment': [
+            ('[^-]+', Comment),
+            ('-->', Comment, '#pop'),
+            ('-', Comment),
+        ],
+        'tag': [
+            (r'\s+', Whitespace),
+            (r'[\w.:-]+\s*=', Name.Attribute, 'attr'),
+            (r'/?\s*>', Name.Tag, '#pop'),
+        ],
+        'attr': [
+            (r'\s+', Whitespace),
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/ada.py b/.venv/Lib/site-packages/pygments/lexers/ada.py
new file mode 100644 (file)
index 0000000..cb286ca
--- /dev/null
@@ -0,0 +1,144 @@
+"""
+    pygments.lexers.ada
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Ada family languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, words, using, this, \
+    default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+from pygments.lexers._ada_builtins import KEYWORD_LIST, BUILTIN_LIST
+
+__all__ = ['AdaLexer']
+
+
+class AdaLexer(RegexLexer):
+    """
+    For Ada source code.
+    """
+
+    name = 'Ada'
+    aliases = ['ada', 'ada95', 'ada2005']
+    filenames = ['*.adb', '*.ads', '*.ada']
+    mimetypes = ['text/x-ada']
+    url = 'https://www.adaic.org'
+    version_added = '1.3'
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'--.*?\n', Comment.Single),
+            (r'[^\S\n]+', Text),
+            (r'function|procedure|entry', Keyword.Declaration, 'subprogram'),
+            (r'(subtype|type)(\s+)(\w+)',
+             bygroups(Keyword.Declaration, Text, Keyword.Type), 'type_def'),
+            (r'task|protected', Keyword.Declaration),
+            (r'(subtype)(\s+)', bygroups(Keyword.Declaration, Text)),
+            (r'(end)(\s+)', bygroups(Keyword.Reserved, Text), 'end'),
+            (r'(pragma)(\s+)(\w+)', bygroups(Keyword.Reserved, Text,
+                                             Comment.Preproc)),
+            (r'(true|false|null)\b', Keyword.Constant),
+            # builtin types
+            (words(BUILTIN_LIST, suffix=r'\b'), Keyword.Type),
+            (r'(and(\s+then)?|in|mod|not|or(\s+else)|rem)\b', Operator.Word),
+            (r'generic|private', Keyword.Declaration),
+            (r'package', Keyword.Declaration, 'package'),
+            (r'array\b', Keyword.Reserved, 'array_def'),
+            (r'(with|use)(\s+)', bygroups(Keyword.Namespace, Text), 'import'),
+            (r'(\w+)(\s*)(:)(\s*)(constant)',
+             bygroups(Name.Constant, Text, Punctuation, Text,
+                      Keyword.Reserved)),
+            (r'<<\w+>>', Name.Label),
+            (r'(\w+)(\s*)(:)(\s*)(declare|begin|loop|for|while)',
+             bygroups(Name.Label, Text, Punctuation, Text, Keyword.Reserved)),
+            # keywords
+            (words(KEYWORD_LIST, prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+            (r'"[^"]*"', String),
+            include('attribute'),
+            include('numbers'),
+            (r"'[^']'", String.Character),
+            (r'(\w+)(\s*|[(,])', bygroups(Name, using(this))),
+            (r"(<>|=>|:=|@|[\[\]]|[()|:;,.'])", Punctuation),
+            (r'[*<>+=/&-]', Operator),
+            (r'\n+', Text),
+        ],
+        'numbers': [
+            (r'[0-9_]+#[0-9a-f_\.]+#', Number.Hex),
+            (r'[0-9_]+\.[0-9_]*', Number.Float),
+            (r'[0-9_]+', Number.Integer),
+        ],
+        'attribute': [
+            (r"(')(\w+)", bygroups(Punctuation, Name.Attribute)),
+        ],
+        'subprogram': [
+            (r'\(', Punctuation, ('#pop', 'formal_part')),
+            (r';', Punctuation, '#pop'),
+            (r'is\b', Keyword.Reserved, '#pop'),
+            (r'"[^"]+"|\w+', Name.Function),
+            include('root'),
+        ],
+        'end': [
+            ('(if|case|record|loop|select)', Keyword.Reserved),
+            (r'"[^"]+"|[\w.]+', Name.Function),
+            (r'\s+', Text),
+            (';', Punctuation, '#pop'),
+        ],
+        'type_def': [
+            (r';', Punctuation, '#pop'),
+            (r'\(', Punctuation, 'formal_part'),
+            (r'\[', Punctuation, 'formal_part'),
+            (r'with|and|use', Keyword.Reserved),
+            (r'array\b', Keyword.Reserved, ('#pop', 'array_def')),
+            (r'record\b', Keyword.Reserved, ('record_def')),
+            (r'(null record)(;)', bygroups(Keyword.Reserved, Punctuation), '#pop'),
+            include('root'),
+        ],
+        'array_def': [
+            (r';', Punctuation, '#pop'),
+            (r'(\w+)(\s+)(range)', bygroups(Keyword.Type, Text, Keyword.Reserved)),
+            include('root'),
+        ],
+        'record_def': [
+            (r'end record', Keyword.Reserved, '#pop'),
+            include('root'),
+        ],
+        'import': [
+            # TODO: use Name.Namespace if appropriate.  This needs
+            # work to disinguish imports from aspects.
+            (r'[\w.]+', Name, '#pop'),
+            default('#pop'),
+        ],
+        'formal_part': [
+            (r'\)', Punctuation, '#pop'),
+            (r'\]', Punctuation, '#pop'),
+            (r'\w+', Name.Variable),
+            (r',|:[^=]', Punctuation),
+            (r'(in|not|null|out|access)\b', Keyword.Reserved),
+            include('root'),
+        ],
+        'package': [
+            ('body', Keyword.Declaration),
+            (r'is\s+new|renames', Keyword.Reserved),
+            ('is', Keyword.Reserved, '#pop'),
+            (';', Punctuation, '#pop'),
+            (r'\(', Punctuation, 'package_instantiation'),
+            (r'([\w.]+)', Name.Class),
+            include('root'),
+        ],
+        'package_instantiation': [
+            (r'("[^"]+"|\w+)(\s+)(=>)', bygroups(Name.Variable, Text, Punctuation)),
+            (r'[\w.\'"]', Text),
+            (r'\)', Punctuation, '#pop'),
+            include('root'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/agile.py b/.venv/Lib/site-packages/pygments/lexers/agile.py
new file mode 100644 (file)
index 0000000..cb22a13
--- /dev/null
@@ -0,0 +1,25 @@
+"""
+    pygments.lexers.agile
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexer classes previously contained in this module.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# ruff: noqa: F401
+
+from pygments.lexers.lisp import SchemeLexer
+from pygments.lexers.jvm import IokeLexer, ClojureLexer
+from pygments.lexers.python import PythonLexer, PythonConsoleLexer, \
+    PythonTracebackLexer, Python3Lexer, Python3TracebackLexer, DgLexer
+from pygments.lexers.ruby import RubyLexer, RubyConsoleLexer, FancyLexer
+from pygments.lexers.perl import PerlLexer, Perl6Lexer
+from pygments.lexers.d import CrocLexer, MiniDLexer
+from pygments.lexers.iolang import IoLexer
+from pygments.lexers.tcl import TclLexer
+from pygments.lexers.factor import FactorLexer
+from pygments.lexers.scripting import LuaLexer, MoonScriptLexer
+
+__all__ = []
diff --git a/.venv/Lib/site-packages/pygments/lexers/algebra.py b/.venv/Lib/site-packages/pygments/lexers/algebra.py
new file mode 100644 (file)
index 0000000..a899cfe
--- /dev/null
@@ -0,0 +1,299 @@
+"""
+    pygments.lexers.algebra
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for computer algebra systems.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, do_insertions, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+
+__all__ = ['GAPLexer', 'GAPConsoleLexer', 'MathematicaLexer', 'MuPADLexer',
+           'BCLexer']
+
+
+class GAPLexer(RegexLexer):
+    """
+    For GAP source code.
+    """
+    name = 'GAP'
+    url = 'https://www.gap-system.org'
+    aliases = ['gap']
+    filenames = ['*.g', '*.gd', '*.gi', '*.gap']
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            (r'#.*$', Comment.Single),
+            (r'"(?:[^"\\]|\\.)*"', String),
+            (r'\(|\)|\[|\]|\{|\}', Punctuation),
+            (r'''(?x)\b(?:
+                if|then|elif|else|fi|
+                for|while|do|od|
+                repeat|until|
+                break|continue|
+                function|local|return|end|
+                rec|
+                quit|QUIT|
+                IsBound|Unbind|
+                TryNextMethod|
+                Info|Assert
+              )\b''', Keyword),
+            (r'''(?x)\b(?:
+                true|false|fail|infinity
+              )\b''',
+             Name.Constant),
+            (r'''(?x)\b(?:
+                (Declare|Install)([A-Z][A-Za-z]+)|
+                   BindGlobal|BIND_GLOBAL
+              )\b''',
+             Name.Builtin),
+            (r'\.|,|:=|;|=|\+|-|\*|/|\^|>|<', Operator),
+            (r'''(?x)\b(?:
+                and|or|not|mod|in
+              )\b''',
+             Operator.Word),
+            (r'''(?x)
+              (?:\w+|`[^`]*`)
+              (?:::\w+|`[^`]*`)*''', Name.Variable),
+            (r'[0-9]+(?:\.[0-9]*)?(?:e[0-9]+)?', Number),
+            (r'\.[0-9]+(?:e[0-9]+)?', Number),
+            (r'.', Text)
+        ],
+    }
+
+    def analyse_text(text):
+        score = 0.0
+
+        # Declaration part
+        if re.search(
+            r"(InstallTrueMethod|Declare(Attribute|Category|Filter|Operation" +
+            r"|GlobalFunction|Synonym|SynonymAttr|Property))", text
+        ):
+            score += 0.7
+
+        # Implementation part
+        if re.search(
+            r"(DeclareRepresentation|Install(GlobalFunction|Method|" +
+            r"ImmediateMethod|OtherMethod)|New(Family|Type)|Objectify)", text
+        ):
+            score += 0.7
+
+        return min(score, 1.0)
+
+
+class GAPConsoleLexer(Lexer):
+    """
+    For GAP console sessions. Modeled after JuliaConsoleLexer.
+    """
+    name = 'GAP session'
+    aliases = ['gap-console', 'gap-repl']
+    filenames = ['*.tst']
+    url = 'https://www.gap-system.org'
+    version_added = '2.14'
+    _example = "gap-repl/euclidean.tst"
+
+    def get_tokens_unprocessed(self, text):
+        gaplexer = GAPLexer(**self.options)
+        start = 0
+        curcode = ''
+        insertions = []
+        output = False
+        error = False
+
+        for line in text.splitlines(keepends=True):
+            if line.startswith('gap> ') or line.startswith('brk> '):
+                insertions.append((len(curcode), [(0, Generic.Prompt, line[:5])]))
+                curcode += line[5:]
+                output = False
+                error = False
+            elif not output and line.startswith('> '):
+                insertions.append((len(curcode), [(0, Generic.Prompt, line[:2])]))
+                curcode += line[2:]
+            else:
+                if curcode:
+                    yield from do_insertions(
+                        insertions, gaplexer.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+                if line.startswith('Error, ') or error:
+                    yield start, Generic.Error, line
+                    error = True
+                else:
+                    yield start, Generic.Output, line
+                output = True
+            start += len(line)
+
+        if curcode:
+            yield from do_insertions(
+                insertions, gaplexer.get_tokens_unprocessed(curcode))
+
+    # the following is needed to distinguish Scilab and GAP .tst files
+    def analyse_text(text):
+        # GAP prompts are a dead give away, although hypothetical;y a
+        # file in another language could be trying to compare a variable
+        # "gap" as in "gap> 0.1". But that this should happen at the
+        # start of a line seems unlikely...
+        if re.search(r"^gap> ", text):
+            return 0.9
+        else:
+            return 0.0
+
+
+class MathematicaLexer(RegexLexer):
+    """
+    Lexer for Mathematica source code.
+    """
+    name = 'Mathematica'
+    url = 'http://www.wolfram.com/mathematica/'
+    aliases = ['mathematica', 'mma', 'nb']
+    filenames = ['*.nb', '*.cdf', '*.nbp', '*.ma']
+    mimetypes = ['application/mathematica',
+                 'application/vnd.wolfram.mathematica',
+                 'application/vnd.wolfram.mathematica.package',
+                 'application/vnd.wolfram.cdf']
+    version_added = '2.0'
+
+    # http://reference.wolfram.com/mathematica/guide/Syntax.html
+    operators = (
+        ";;", "=", "=.", "!=" "==", ":=", "->", ":>", "/.", "+", "-", "*", "/",
+        "^", "&&", "||", "!", "<>", "|", "/;", "?", "@", "//", "/@", "@@",
+        "@@@", "~~", "===", "&", "<", ">", "<=", ">=",
+    )
+
+    punctuation = (",", ";", "(", ")", "[", "]", "{", "}")
+
+    def _multi_escape(entries):
+        return '({})'.format('|'.join(re.escape(entry) for entry in entries))
+
+    tokens = {
+        'root': [
+            (r'(?s)\(\*.*?\*\)', Comment),
+
+            (r'([a-zA-Z]+[A-Za-z0-9]*`)', Name.Namespace),
+            (r'([A-Za-z0-9]*_+[A-Za-z0-9]*)', Name.Variable),
+            (r'#\d*', Name.Variable),
+            (r'([a-zA-Z]+[a-zA-Z0-9]*)', Name),
+
+            (r'-?\d+\.\d*', Number.Float),
+            (r'-?\d*\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+
+            (words(operators), Operator),
+            (words(punctuation), Punctuation),
+            (r'".*?"', String),
+            (r'\s+', Text.Whitespace),
+        ],
+    }
+
+
+class MuPADLexer(RegexLexer):
+    """
+    A MuPAD lexer.
+    Contributed by Christopher Creutzig <christopher@creutzig.de>.
+    """
+    name = 'MuPAD'
+    url = 'http://www.mupad.com'
+    aliases = ['mupad']
+    filenames = ['*.mu']
+    version_added = '0.8'
+
+    tokens = {
+        'root': [
+            (r'//.*?$', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'"(?:[^"\\]|\\.)*"', String),
+            (r'\(|\)|\[|\]|\{|\}', Punctuation),
+            (r'''(?x)\b(?:
+                next|break|end|
+                axiom|end_axiom|category|end_category|domain|end_domain|inherits|
+                if|%if|then|elif|else|end_if|
+                case|of|do|otherwise|end_case|
+                while|end_while|
+                repeat|until|end_repeat|
+                for|from|to|downto|step|end_for|
+                proc|local|option|save|begin|end_proc|
+                delete|frame
+              )\b''', Keyword),
+            (r'''(?x)\b(?:
+                DOM_ARRAY|DOM_BOOL|DOM_COMPLEX|DOM_DOMAIN|DOM_EXEC|DOM_EXPR|
+                DOM_FAIL|DOM_FLOAT|DOM_FRAME|DOM_FUNC_ENV|DOM_HFARRAY|DOM_IDENT|
+                DOM_INT|DOM_INTERVAL|DOM_LIST|DOM_NIL|DOM_NULL|DOM_POLY|DOM_PROC|
+                DOM_PROC_ENV|DOM_RAT|DOM_SET|DOM_STRING|DOM_TABLE|DOM_VAR
+              )\b''', Name.Class),
+            (r'''(?x)\b(?:
+                PI|EULER|E|CATALAN|
+                NIL|FAIL|undefined|infinity|
+                TRUE|FALSE|UNKNOWN
+              )\b''',
+             Name.Constant),
+            (r'\b(?:dom|procname)\b', Name.Builtin.Pseudo),
+            (r'\.|,|:|;|=|\+|-|\*|/|\^|@|>|<|\$|\||!|\'|%|~=', Operator),
+            (r'''(?x)\b(?:
+                and|or|not|xor|
+                assuming|
+                div|mod|
+                union|minus|intersect|in|subset
+              )\b''',
+             Operator.Word),
+            (r'\b(?:I|RDN_INF|RD_NINF|RD_NAN)\b', Number),
+            # (r'\b(?:adt|linalg|newDomain|hold)\b', Name.Builtin),
+            (r'''(?x)
+              ((?:[a-zA-Z_#][\w#]*|`[^`]*`)
+              (?:::[a-zA-Z_#][\w#]*|`[^`]*`)*)(\s*)([(])''',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'''(?x)
+              (?:[a-zA-Z_#][\w#]*|`[^`]*`)
+              (?:::[a-zA-Z_#][\w#]*|`[^`]*`)*''', Name.Variable),
+            (r'[0-9]+(?:\.[0-9]*)?(?:e[0-9]+)?', Number),
+            (r'\.[0-9]+(?:e[0-9]+)?', Number),
+            (r'\s+', Whitespace),
+            (r'.', Text)
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+    }
+
+
+class BCLexer(RegexLexer):
+    """
+    A BC lexer.
+    """
+    name = 'BC'
+    url = 'https://www.gnu.org/software/bc/'
+    aliases = ['bc']
+    filenames = ['*.bc']
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'"(?:[^"\\]|\\.)*"', String),
+            (r'[{}();,]', Punctuation),
+            (words(('if', 'else', 'while', 'for', 'break', 'continue',
+                    'halt', 'return', 'define', 'auto', 'print', 'read',
+                    'length', 'scale', 'sqrt', 'limits', 'quit',
+                    'warranty'), suffix=r'\b'), Keyword),
+            (r'\+\+|--|\|\||&&|'
+             r'([-<>+*%\^/!=])=?', Operator),
+            # bc doesn't support exponential
+            (r'[0-9]+(\.[0-9]*)?', Number),
+            (r'\.[0-9]+', Number),
+            (r'.', Text)
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/ambient.py b/.venv/Lib/site-packages/pygments/lexers/ambient.py
new file mode 100644 (file)
index 0000000..3862eb0
--- /dev/null
@@ -0,0 +1,75 @@
+"""
+    pygments.lexers.ambient
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for AmbientTalk language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words, bygroups
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['AmbientTalkLexer']
+
+
+class AmbientTalkLexer(RegexLexer):
+    """
+    Lexer for AmbientTalk source code.
+    """
+    name = 'AmbientTalk'
+    url = 'https://code.google.com/p/ambienttalk'
+    filenames = ['*.at']
+    aliases = ['ambienttalk', 'ambienttalk/2', 'at']
+    mimetypes = ['text/x-ambienttalk']
+    version_added = '2.0'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    builtin = words(('if:', 'then:', 'else:', 'when:', 'whenever:', 'discovered:',
+                     'disconnected:', 'reconnected:', 'takenOffline:', 'becomes:',
+                     'export:', 'as:', 'object:', 'actor:', 'mirror:', 'taggedAs:',
+                     'mirroredBy:', 'is:'))
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'(def|deftype|import|alias|exclude)\b', Keyword),
+            (builtin, Name.Builtin),
+            (r'(true|false|nil)\b', Keyword.Constant),
+            (r'(~|lobby|jlobby|/)\.', Keyword.Constant, 'namespace'),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r'\|', Punctuation, 'arglist'),
+            (r'<:|[*^!%&<>+=,./?-]|:=', Operator),
+            (r"`[a-zA-Z_]\w*", String.Symbol),
+            (r"[a-zA-Z_]\w*:", Name.Function),
+            (r"[{}()\[\];`]", Punctuation),
+            (r'(self|super)\b', Name.Variable.Instance),
+            (r"[a-zA-Z_]\w*", Name.Variable),
+            (r"@[a-zA-Z_]\w*", Name.Class),
+            (r"@\[", Name.Class, 'annotations'),
+            include('numbers'),
+        ],
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+', Number.Integer)
+        ],
+        'namespace': [
+            (r'[a-zA-Z_]\w*\.', Name.Namespace),
+            (r'[a-zA-Z_]\w*:', Name.Function, '#pop'),
+            (r'[a-zA-Z_]\w*(?!\.)', Name.Function, '#pop')
+        ],
+        'annotations': [
+            (r"(.*?)\]", Name.Class, '#pop')
+        ],
+        'arglist': [
+            (r'\|', Punctuation, '#pop'),
+            (r'(\s*)(,)(\s*)', bygroups(Whitespace, Punctuation, Whitespace)),
+            (r'[a-zA-Z_]\w*', Name.Variable),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/amdgpu.py b/.venv/Lib/site-packages/pygments/lexers/amdgpu.py
new file mode 100644 (file)
index 0000000..c97ad61
--- /dev/null
@@ -0,0 +1,54 @@
+"""
+    pygments.lexers.amdgpu
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the AMDGPU ISA assembly.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Name, Text, Keyword, Whitespace, Number, Comment
+
+import re
+
+__all__ = ['AMDGPULexer']
+
+
+class AMDGPULexer(RegexLexer):
+    """
+    For AMD GPU assembly.
+    """
+    name = 'AMDGPU'
+    aliases = ['amdgpu']
+    filenames = ['*.isa']
+    url = 'https://gpuopen.com/amd-isa-documentation'
+    version_added = '2.8'
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'[\r\n]+', Text),
+            (r'(([a-z_0-9])*:([a-z_0-9])*)', Name.Attribute),
+            (r'(\[|\]|\(|\)|,|\:|\&)', Text),
+            (r'([;#]|//).*?\n', Comment.Single),
+            (r'((s_)?(scratch|ds|buffer|flat|image)_[a-z0-9_]+)', Keyword.Reserved),
+            (r'(_lo|_hi)', Name.Variable),
+            (r'(vmcnt|lgkmcnt|expcnt)', Name.Attribute),
+            (r'(attr[0-9].[a-z])', Name.Attribute),
+            (words((
+                'op', 'vaddr', 'vdata', 'off', 'soffset', 'srsrc', 'format',
+                'offset', 'offen', 'idxen', 'glc', 'dlc', 'slc', 'tfe', 'lds',
+                'lit', 'unorm'), suffix=r'\b'), Name.Attribute),
+            (r'(label_[a-z0-9]+)', Keyword),
+            (r'(_L[0-9]*)', Name.Variable),
+            (r'(s|v)_[a-z0-9_]+', Keyword),
+            (r'(v[0-9.]+|vcc|exec|v)', Name.Variable),
+            (r's[0-9.]+|s', Name.Variable),
+            (r'[0-9]+\.[^0-9]+', Number.Float),
+            (r'(0[xX][a-z0-9]+)|([0-9]+)', Number.Integer)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/ampl.py b/.venv/Lib/site-packages/pygments/lexers/ampl.py
new file mode 100644 (file)
index 0000000..bc4082b
--- /dev/null
@@ -0,0 +1,87 @@
+"""
+    pygments.lexers.ampl
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the AMPL language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, using, this, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['AmplLexer']
+
+
+class AmplLexer(RegexLexer):
+    """
+    For AMPL source code.
+    """
+    name = 'Ampl'
+    url = 'http://ampl.com/'
+    aliases = ['ampl']
+    filenames = ['*.run']
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Whitespace),
+            (r'#.*?\n', Comment.Single),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (words((
+                'call', 'cd', 'close', 'commands', 'data', 'delete', 'display',
+                'drop', 'end', 'environ', 'exit', 'expand', 'include', 'load',
+                'model', 'objective', 'option', 'problem', 'purge', 'quit',
+                'redeclare', 'reload', 'remove', 'reset', 'restore', 'shell',
+                'show', 'solexpand', 'solution', 'solve', 'update', 'unload',
+                'xref', 'coeff', 'coef', 'cover', 'obj', 'interval', 'default',
+                'from', 'to', 'to_come', 'net_in', 'net_out', 'dimen',
+                'dimension', 'check', 'complements', 'write', 'function',
+                'pipe', 'format', 'if', 'then', 'else', 'in', 'while', 'repeat',
+                'for'), suffix=r'\b'), Keyword.Reserved),
+            (r'(integer|binary|symbolic|ordered|circular|reversed|INOUT|IN|OUT|LOCAL)',
+             Keyword.Type),
+            (r'\".*?\"', String.Double),
+            (r'\'.*?\'', String.Single),
+            (r'[()\[\]{},;:]+', Punctuation),
+            (r'\b(\w+)(\.)(astatus|init0|init|lb0|lb1|lb2|lb|lrc|'
+             r'lslack|rc|relax|slack|sstatus|status|ub0|ub1|ub2|'
+             r'ub|urc|uslack|val)',
+             bygroups(Name.Variable, Punctuation, Keyword.Reserved)),
+            (r'(set|param|var|arc|minimize|maximize|subject to|s\.t\.|subj to|'
+             r'node|table|suffix|read table|write table)(\s+)(\w+)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Variable)),
+            (r'(param)(\s*)(:)(\s*)(\w+)(\s*)(:)(\s*)((\w|\s)+)',
+             bygroups(Keyword.Declaration, Whitespace, Punctuation, Whitespace,
+                      Name.Variable, Whitespace, Punctuation, Whitespace, Name.Variable)),
+            (r'(let|fix|unfix)(\s*)((?:\{.*\})?)(\s*)(\w+)',
+             bygroups(Keyword.Declaration, Whitespace, using(this), Whitespace,
+                      Name.Variable)),
+            (words((
+                'abs', 'acos', 'acosh', 'alias', 'asin', 'asinh', 'atan', 'atan2',
+                'atanh', 'ceil', 'ctime', 'cos', 'exp', 'floor', 'log', 'log10',
+                'max', 'min', 'precision', 'round', 'sin', 'sinh', 'sqrt', 'tan',
+                'tanh', 'time', 'trunc', 'Beta', 'Cauchy', 'Exponential', 'Gamma',
+                'Irand224', 'Normal', 'Normal01', 'Poisson', 'Uniform', 'Uniform01',
+                'num', 'num0', 'ichar', 'char', 'length', 'substr', 'sprintf',
+                'match', 'sub', 'gsub', 'print', 'printf', 'next', 'nextw', 'prev',
+                'prevw', 'first', 'last', 'ord', 'ord0', 'card', 'arity',
+                'indexarity'), prefix=r'\b', suffix=r'\b'), Name.Builtin),
+            (r'(\+|\-|\*|/|\*\*|=|<=|>=|==|\||\^|<|>|\!|\.\.|:=|\&|\!=|<<|>>)',
+             Operator),
+            (words((
+                'or', 'exists', 'forall', 'and', 'in', 'not', 'within', 'union',
+                'diff', 'difference', 'symdiff', 'inter', 'intersect',
+                'intersection', 'cross', 'setof', 'by', 'less', 'sum', 'prod',
+                'product', 'div', 'mod'), suffix=r'\b'),
+             Keyword.Reserved),  # Operator.Name but not enough emphasized with that
+            (r'(\d+\.(?!\.)\d*|\.(?!.)\d+)([eE][+-]?\d+)?', Number.Float),
+            (r'\d+([eE][+-]?\d+)?', Number.Integer),
+            (r'[+-]?Infinity', Number.Integer),
+            (r'(\w+|(\.(?!\.)))', Text)
+        ]
+
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/apdlexer.py b/.venv/Lib/site-packages/pygments/lexers/apdlexer.py
new file mode 100644 (file)
index 0000000..98beedf
--- /dev/null
@@ -0,0 +1,593 @@
+"""
+    pygments.lexers.apdlexer
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for ANSYS Parametric Design Language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words, default
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    String, Generic, Punctuation, Whitespace, Escape
+
+__all__ = ['apdlexer']
+
+
+class apdlexer(RegexLexer):
+    """
+    For APDL source code.
+    """
+    name = 'ANSYS parametric design language'
+    aliases = ['ansys', 'apdl']
+    filenames = ['*.ans']
+    url = 'https://www.ansys.com'
+    version_added = '2.9'
+
+    flags = re.IGNORECASE
+
+    # list of elements
+    elafunb = ("SURF152", "SURF153", "SURF154", "SURF156", "SHELL157",
+               "SURF159", "LINK160", "BEAM161", "PLANE162",
+               "SHELL163", "SOLID164", "COMBI165", "MASS166",
+               "LINK167", "SOLID168", "TARGE169", "TARGE170",
+               "CONTA171", "CONTA172", "CONTA173", "CONTA174",
+               "CONTA175", "CONTA176", "CONTA177", "CONTA178",
+               "PRETS179", "LINK180", "SHELL181", "PLANE182",
+               "PLANE183", "MPC184", "SOLID185", "SOLID186",
+               "SOLID187", "BEAM188", "BEAM189", "SOLSH190",
+               "INTER192", "INTER193", "INTER194", "INTER195",
+               "MESH200", "FOLLW201", "INTER202", "INTER203",
+               "INTER204", "INTER205", "SHELL208", "SHELL209",
+               "CPT212", "CPT213", "COMBI214", "CPT215", "CPT216",
+               "CPT217", "FLUID220", "FLUID221", "PLANE223",
+               "SOLID226", "SOLID227", "PLANE230", "SOLID231",
+               "SOLID232", "PLANE233", "SOLID236", "SOLID237",
+               "PLANE238", "SOLID239", "SOLID240", "HSFLD241",
+               "HSFLD242", "SURF251", "SURF252", "REINF263",
+               "REINF264", "REINF265", "SOLID272", "SOLID273",
+               "SOLID278", "SOLID279", "SHELL281", "SOLID285",
+               "PIPE288", "PIPE289", "ELBOW290", "USER300", "BEAM3",
+               "BEAM4", "BEAM23", "BEAM24", "BEAM44", "BEAM54",
+               "COMBIN7", "FLUID79", "FLUID80", "FLUID81", "FLUID141",
+               "FLUID142", "INFIN9", "INFIN47", "PLANE13", "PLANE25",
+               "PLANE42", "PLANE53", "PLANE67", "PLANE82", "PLANE83",
+               "PLANE145", "PLANE146", "CONTAC12", "CONTAC52",
+               "LINK1", "LINK8", "LINK10", "LINK32", "PIPE16",
+               "PIPE17", "PIPE18", "PIPE20", "PIPE59", "PIPE60",
+               "SHELL41", "SHELL43", "SHELL57", "SHELL63", "SHELL91",
+               "SHELL93", "SHELL99", "SHELL150", "SOLID5", "SOLID45",
+               "SOLID46", "SOLID65", "SOLID69", "SOLID92", "SOLID95",
+               "SOLID117", "SOLID127", "SOLID128", "SOLID147",
+               "SOLID148", "SOLID191", "VISCO88", "VISCO89",
+               "VISCO106", "VISCO107", "VISCO108", "TRANS109")
+
+    elafunc = ("PGRAPH", "/VT", "VTIN", "VTRFIL", "VTTEMP", "PGRSET",
+               "VTCLR", "VTMETH", "VTRSLT", "VTVMOD", "PGSELE",
+               "VTDISC", "VTMP", "VTSEC", "PGWRITE", "VTEVAL", "VTOP",
+               "VTSFE", "POUTRES", "VTFREQ", "VTPOST", "VTSL",
+               "FLDATA1-40", "HFPCSWP", "MSDATA", "MSVARY", "QFACT",
+               "FLOCHECK", "HFPOWER", "MSMASS", "PERI", "SPADP",
+               "FLREAD", "HFPORT", "MSMETH", "PLFSS", "SPARM",
+               "FLOTRAN", "HFSCAT", "MSMIR", "PLSCH", "SPFSS",
+               "HFADP", "ICE", "MSNOMF", "PLSYZ", "SPICE", "HFARRAY",
+               "ICEDELE", "MSPROP", "PLTD", "SPSCAN", "HFDEEM",
+               "ICELIST", "MSQUAD", "PLTLINE", "SPSWP", "HFEIGOPT",
+               "ICVFRC", "MSRELAX", "PLVFRC", "HFEREFINE", "LPRT",
+               "MSSOLU", "/PICE", "HFMODPRT", "MSADV", "MSSPEC",
+               "PLWAVE", "HFPA", "MSCAP", "MSTERM", "PRSYZ")
+
+    elafund = ("*VOPER", "VOVLAP", "*VPLOT", "VPLOT", "VPTN", "*VPUT",
+               "VPUT", "*VREAD", "VROTAT", "VSBA", "VSBV", "VSBW",
+               "/VSCALE", "*VSCFUN", "VSEL", "VSLA", "*VSTAT", "VSUM",
+               "VSWEEP", "VSYMM", "VTRAN", "VTYPE", "/VUP", "*VWRITE",
+               "/WAIT", "WAVES", "WERASE", "WFRONT", "/WINDOW",
+               "WMID", "WMORE", "WPAVE", "WPCSYS", "WPLANE", "WPOFFS",
+               "WPROTA", "WPSTYL", "WRFULL", "WRITE", "WRITEMAP",
+               "*WRK", "WSORT", "WSPRINGS", "WSTART", "WTBCREATE",
+               "XFDATA", "XFENRICH", "XFLIST", "/XFRM", "/XRANGE",
+               "XVAR", "/YRANGE", "/ZOOM", "/WB", "XMLO", "/XML",
+               "CNTR", "EBLOCK", "CMBLOCK", "NBLOCK", "/TRACK",
+               "CWZPLOT", "~EUI", "NELE", "EALL", "NALL", "FLITEM",
+               "LSLN", "PSOLVE", "ASLN", "/VERIFY", "/SSS", "~CFIN",
+               "*EVAL", "*MOONEY", "/RUNSTAT", "ALPFILL",
+               "ARCOLLAPSE", "ARDETACH", "ARFILL", "ARMERGE",
+               "ARSPLIT", "FIPLOT", "GAPFINISH", "GAPLIST",
+               "GAPMERGE", "GAPOPT", "GAPPLOT", "LNCOLLAPSE",
+               "LNDETACH", "LNFILL", "LNMERGE", "LNSPLIT", "PCONV",
+               "PLCONV", "PEMOPTS", "PEXCLUDE", "PINCLUDE", "PMETH",
+               "/PMETH", "PMOPTS", "PPLOT", "PPRANGE", "PRCONV",
+               "PRECISION", "RALL", "RFILSZ", "RITER", "RMEMRY",
+               "RSPEED", "RSTAT", "RTIMST", "/RUNST", "RWFRNT",
+               "SARPLOT", "SHSD", "SLPPLOT", "SLSPLOT", "VCVFILL",
+               "/OPT", "OPEQN", "OPFACT", "OPFRST", "OPGRAD",
+               "OPKEEP", "OPLOOP", "OPPRNT", "OPRAND", "OPSUBP",
+               "OPSWEEP", "OPTYPE", "OPUSER", "OPVAR", "OPADD",
+               "OPCLR", "OPDEL", "OPMAKE", "OPSEL", "OPANL", "OPDATA",
+               "OPRESU", "OPSAVE", "OPEXE", "OPLFA", "OPLGR",
+               "OPLIST", "OPLSW", "OPRFA", "OPRGR", "OPRSW",
+               "PILECALC", "PILEDISPSET", "PILEGEN", "PILELOAD",
+               "PILEMASS", "PILERUN", "PILESEL", "PILESTIF",
+               "PLVAROPT", "PRVAROPT", "TOCOMP", "TODEF", "TOFREQ",
+               "TOTYPE", "TOVAR", "TOEXE", "TOLOOP", "TOGRAPH",
+               "TOLIST", "TOPLOT", "TOPRINT", "TOSTAT", "TZAMESH",
+               "TZDELE", "TZEGEN", "XVAROPT", "PGSAVE", "SOLCONTROL",
+               "TOTAL", "VTGEOM", "VTREAL", "VTSTAT")
+
+    elafune = ("/ANUM", "AOFFST", "AOVLAP", "APLOT", "APPEND", "APTN",
+               "ARCLEN", "ARCTRM", "AREAS", "AREFINE", "AREMESH",
+               "AREVERSE", "AROTAT", "ARSCALE", "ARSYM", "ASBA",
+               "ASBL", "ASBV", "ASBW", "ASCRES", "ASEL", "ASIFILE",
+               "*ASK", "ASKIN", "ASLL", "ASLV", "ASOL", "/ASSIGN",
+               "ASUB", "ASUM", "ATAN", "ATRAN", "ATYPE", "/AUTO",
+               "AUTOTS", "/AUX2", "/AUX3", "/AUX12", "/AUX15",
+               "AVPRIN", "AVRES", "AWAVE", "/AXLAB", "*AXPY",
+               "/BATCH", "BCSOPTION", "BETAD", "BF", "BFA", "BFADELE",
+               "BFALIST", "BFCUM", "BFDELE", "BFE", "BFECUM",
+               "BFEDELE", "BFELIST", "BFESCAL", "BFINT", "BFK",
+               "BFKDELE", "BFKLIST", "BFL", "BFLDELE", "BFLIST",
+               "BFLLIST", "BFSCALE", "BFTRAN", "BFUNIF", "BFV",
+               "BFVDELE", "BFVLIST", "BIOOPT", "BIOT", "BLC4", "BLC5",
+               "BLOCK", "BOOL", "BOPTN", "BSAX", "BSMD", "BSM1",
+               "BSM2", "BSPLIN", "BSS1", "BSS2", "BSTE", "BSTQ",
+               "BTOL", "BUCOPT", "C", "CALC", "CAMPBELL", "CBDOF",
+               "CBMD", "CBMX", "CBTE", "CBTMP", "CDOPT", "CDREAD",
+               "CDWRITE", "CE", "CECHECK", "CECMOD", "CECYC",
+               "CEDELE", "CEINTF", "CELIST", "CENTER", "CEQN",
+               "CERIG", "CESGEN", "CFACT", "*CFCLOS", "*CFOPEN",
+               "*CFWRITE", "/CFORMAT", "CGLOC", "CGOMGA", "CGROW",
+               "CHECK", "CHKMSH", "CINT", "CIRCLE", "CISOL",
+               "/CLABEL", "/CLEAR", "CLOCAL", "CLOG", "/CLOG",
+               "CLRMSHLN", "CM", "CMACEL", "/CMAP", "CMATRIX",
+               "CMDELE", "CMDOMEGA", "CMEDIT", "CMGRP", "CMLIST",
+               "CMMOD", "CMOMEGA", "CMPLOT", "CMROTATE", "CMSEL",
+               "CMSFILE", "CMSOPT", "CMWRITE", "CNCHECK", "CNKMOD",
+               "CNTR", "CNVTOL", "/COLOR", "*COMP", "COMBINE",
+               "COMPRESS", "CON4", "CONE", "/CONFIG", "CONJUG",
+               "/CONTOUR", "/COPY", "CORIOLIS", "COUPLE", "COVAL",
+               "CP", "CPCYC", "CPDELE", "CPINTF", "/CPLANE", "CPLGEN",
+               "CPLIST", "CPMERGE", "CPNGEN", "CPSGEN", "CQC",
+               "*CREATE", "CRPLIM", "CS", "CSCIR", "CSDELE", "CSKP",
+               "CSLIST", "CSWPLA", "CSYS", "/CTYPE", "CURR2D",
+               "CUTCONTROL", "/CVAL", "CVAR", "/CWD", "CYCCALC",
+               "/CYCEXPAND", "CYCFILES", "CYCFREQ", "*CYCLE",
+               "CYCLIC", "CYCOPT", "CYCPHASE", "CYCSPEC", "CYL4",
+               "CYL5", "CYLIND", "CZDEL", "CZMESH", "D", "DA",
+               "DADELE", "DALIST", "DAMORPH", "DATA", "DATADEF",
+               "DCGOMG", "DCUM", "DCVSWP", "DDASPEC", "DDELE",
+               "DDOPTION", "DEACT", "DEFINE", "*DEL", "DELETE",
+               "/DELETE", "DELTIM", "DELTIME", "DEMORPH", "DERIV", "DESIZE",
+               "DESOL", "DETAB", "/DEVDISP", "/DEVICE", "/DFLAB",
+               "DFLX", "DFSWAVE", "DIG", "DIGIT", "*DIM",
+               "/DIRECTORY", "DISPLAY", "/DIST", "DJ", "DJDELE",
+               "DJLIST", "DK", "DKDELE", "DKLIST", "DL", "DLDELE",
+               "DLIST", "DLLIST", "*DMAT", "DMOVE", "DMPEXT",
+               "DMPOPTION", "DMPRAT", "DMPSTR", "DNSOL", "*DO", "DOF",
+               "DOFSEL", "DOMEGA", "*DOT", "*DOWHILE", "DSCALE",
+               "/DSCALE", "DSET", "DSPOPTION", "DSUM", "DSURF",
+               "DSYM", "DSYS", "DTRAN", "DUMP", "/DV3D", "DVAL",
+               "DVMORPH", "DYNOPT", "E", "EALIVE", "EDADAPT", "EDALE",
+               "EDASMP", "EDBOUND", "EDBX", "EDBVIS", "EDCADAPT",
+               "EDCGEN", "EDCLIST", "EDCMORE", "EDCNSTR", "EDCONTACT",
+               "EDCPU", "EDCRB", "EDCSC", "EDCTS", "EDCURVE",
+               "EDDAMP", "EDDBL", "EDDC", "EDDRELAX", "EDDUMP",
+               "EDELE", "EDENERGY", "EDFPLOT", "EDGCALE", "/EDGE",
+               "EDHGLS", "EDHIST", "EDHTIME", "EDINT", "EDIPART",
+               "EDIS", "EDLCS", "EDLOAD", "EDMP", "EDNB", "EDNDTSD",
+               "EDNROT", "EDOPT", "EDOUT", "EDPART", "EDPC", "EDPL",
+               "EDPVEL", "EDRC", "EDRD", "EDREAD", "EDRI", "EDRST",
+               "EDRUN", "EDSHELL", "EDSOLV", "EDSP", "EDSTART",
+               "EDTERM", "EDTP", "EDVEL", "EDWELD", "EDWRITE",
+               "EEXTRUDE", "/EFACET", "EGEN", "*EIGEN", "EINFIN",
+               "EINTF", "EKILL", "ELBOW", "ELEM", "ELIST", "*ELSE",
+               "*ELSEIF", "EMAGERR", "EMATWRITE", "EMF", "EMFT",
+               "EMID", "EMIS", "EMODIF", "EMORE", "EMSYM", "EMTGEN",
+               "EMUNIT", "EN", "*END", "*ENDDO", "*ENDIF",
+               "ENDRELEASE", "ENERSOL", "ENGEN", "ENORM", "ENSYM",
+               "EORIENT", "EPLOT", "EQSLV", "ERASE", "/ERASE",
+               "EREAD", "EREFINE", "EREINF", "ERESX", "ERNORM",
+               "ERRANG", "ESCHECK", "ESEL", "/ESHAPE", "ESIZE",
+               "ESLA", "ESLL", "ESLN", "ESLV", "ESOL", "ESORT",
+               "ESSOLV", "ESTIF", "ESURF", "ESYM", "ESYS", "ET",
+               "ETABLE", "ETCHG", "ETCONTROL", "ETDELE", "ETLIST",
+               "ETYPE", "EUSORT", "EWRITE", "*EXIT", "/EXIT", "EXP",
+               "EXPAND", "/EXPAND", "EXPASS", "*EXPORT", "EXPROFILE",
+               "EXPSOL", "EXTOPT", "EXTREM", "EXUNIT", "F", "/FACET",
+               "FATIGUE", "FC", "FCCHECK", "FCDELE", "FCLIST", "FCUM",
+               "FCTYP", "FDELE", "/FDELE", "FE", "FEBODY", "FECONS",
+               "FEFOR", "FELIST", "FESURF", "*FFT", "FILE",
+               "FILEAUX2", "FILEAUX3", "FILEDISP", "FILL", "FILLDATA",
+               "/FILNAME", "FINISH", "FITEM", "FJ", "FJDELE",
+               "FJLIST", "FK", "FKDELE", "FKLIST", "FL", "FLIST",
+               "FLLIST", "FLST", "FLUXV", "FLUREAD", "FMAGBC",
+               "FMAGSUM", "/FOCUS", "FOR2D", "FORCE", "FORM",
+               "/FORMAT", "FP", "FPLIST", "*FREE", "FREQ", "FRQSCL",
+               "FS", "FSCALE", "FSDELE", "FSLIST", "FSNODE", "FSPLOT",
+               "FSSECT", "FSSPARM", "FSUM", "FTCALC", "FTRAN",
+               "FTSIZE", "FTWRITE", "FTYPE", "FVMESH", "GAP", "GAPF",
+               "GAUGE", "GCDEF", "GCGEN", "/GCMD", "/GCOLUMN",
+               "GENOPT", "GEOM", "GEOMETRY", "*GET", "/GFILE",
+               "/GFORMAT", "/GLINE", "/GMARKER", "GMATRIX", "GMFACE",
+               "*GO", "/GO", "/GOLIST", "/GOPR", "GP", "GPDELE",
+               "GPLIST", "GPLOT", "/GRAPHICS", "/GRESUME", "/GRID",
+               "/GROPT", "GRP", "/GRTYP", "/GSAVE", "GSBDATA",
+               "GSGDATA", "GSLIST", "GSSOL", "/GST", "GSUM", "/GTHK",
+               "/GTYPE", "HARFRQ", "/HBC", "HBMAT", "/HEADER", "HELP",
+               "HELPDISP", "HEMIOPT", "HFANG", "HFSYM", "HMAGSOLV",
+               "HPGL", "HPTCREATE", "HPTDELETE", "HRCPLX", "HREXP",
+               "HROPT", "HROCEAN", "HROUT", "IC", "ICDELE", "ICLIST",
+               "/ICLWID", "/ICSCALE", "*IF", "IGESIN", "IGESOUT",
+               "/IMAGE", "IMAGIN", "IMESH", "IMMED", "IMPD",
+               "INISTATE", "*INIT", "/INPUT", "/INQUIRE", "INRES",
+               "INRTIA", "INT1", "INTSRF", "IOPTN", "IRLF", "IRLIST",
+               "*ITENGINE", "JPEG", "JSOL", "K", "KATT", "KBC",
+               "KBETW", "KCALC", "KCENTER", "KCLEAR", "KDELE",
+               "KDIST", "KEEP", "KESIZE", "KEYOPT", "KEYPTS", "KEYW",
+               "KFILL", "KGEN", "KL", "KLIST", "KMESH", "KMODIF",
+               "KMOVE", "KNODE", "KPLOT", "KPSCALE", "KREFINE",
+               "KSCALE", "KSCON", "KSEL", "KSLL", "KSLN", "KSUM",
+               "KSYMM", "KTRAN", "KUSE", "KWPAVE", "KWPLAN", "L",
+               "L2ANG", "L2TAN", "LANG", "LARC", "/LARC", "LAREA",
+               "LARGE", "LATT", "LAYER", "LAYERP26", "LAYLIST",
+               "LAYPLOT", "LCABS", "LCASE", "LCCALC", "LCCAT",
+               "LCDEF", "LCFACT", "LCFILE", "LCLEAR", "LCOMB",
+               "LCOPER", "LCSEL", "LCSL", "LCSUM", "LCWRITE",
+               "LCZERO", "LDELE", "LDIV", "LDRAG", "LDREAD", "LESIZE",
+               "LEXTND", "LFILLT", "LFSURF", "LGEN", "LGLUE",
+               "LGWRITE", "/LIGHT", "LINA", "LINE", "/LINE", "LINES",
+               "LINL", "LINP", "LINV", "LIST", "*LIST", "LLIST",
+               "LMATRIX", "LMESH", "LNSRCH", "LOCAL", "LOVLAP",
+               "LPLOT", "LPTN", "LREFINE", "LREVERSE", "LROTAT",
+               "LSBA", "*LSBAC", "LSBL", "LSBV", "LSBW", "LSCLEAR",
+               "LSDELE", "*LSDUMP", "LSEL", "*LSENGINE", "*LSFACTOR",
+               "LSLA", "LSLK", "LSOPER", "/LSPEC", "LSREAD",
+               "*LSRESTORE", "LSSCALE", "LSSOLVE", "LSTR", "LSUM",
+               "LSWRITE", "/LSYMBOL", "LSYMM", "LTAN", "LTRAN",
+               "LUMPM", "LVSCALE", "LWPLAN", "M", "MADAPT", "MAGOPT",
+               "MAGSOLV", "/MAIL", "MAP", "/MAP", "MAP2DTO3D",
+               "MAPSOLVE", "MAPVAR", "MASTER", "MAT", "MATER",
+               "MCHECK", "MDAMP", "MDELE", "MDPLOT", "MEMM", "/MENU",
+               "MESHING", "MFANALYSIS", "MFBUCKET", "MFCALC", "MFCI",
+               "MFCLEAR", "MFCMMAND", "MFCONV", "MFDTIME", "MFELEM",
+               "MFEM", "MFEXTER", "MFFNAME", "MFFR", "MFIMPORT",
+               "MFINTER", "MFITER", "MFLCOMM", "MFLIST", "MFMAP",
+               "MFORDER", "MFOUTPUT", "*MFOURI", "MFPSIMUL", "MFRC",
+               "MFRELAX", "MFRSTART", "MFSORDER", "MFSURFACE",
+               "MFTIME", "MFTOL", "*MFUN", "MFVOLUME", "MFWRITE",
+               "MGEN", "MIDTOL", "/MKDIR", "MLIST", "MMASS", "MMF",
+               "MODCONT", "MODE", "MODIFY", "MODMSH", "MODSELOPTION",
+               "MODOPT", "MONITOR", "*MOPER", "MOPT", "MORPH", "MOVE",
+               "MP", "MPAMOD", "MPCHG", "MPCOPY", "MPDATA", "MPDELE",
+               "MPDRES", "/MPLIB", "MPLIST", "MPPLOT", "MPREAD",
+               "MPRINT", "MPTEMP", "MPTGEN", "MPTRES", "MPWRITE",
+               "/MREP", "MSAVE", "*MSG", "MSHAPE", "MSHCOPY",
+               "MSHKEY", "MSHMID", "MSHPATTERN", "MSOLVE", "/MSTART",
+               "MSTOLE", "*MULT", "*MWRITE", "MXPAND", "N", "NANG",
+               "NAXIS", "NCNV", "NDELE", "NDIST", "NDSURF", "NEQIT",
+               "/NERR", "NFORCE", "NGEN", "NKPT", "NLADAPTIVE",
+               "NLDIAG", "NLDPOST", "NLGEOM", "NLHIST", "NLIST",
+               "NLMESH", "NLOG", "NLOPT", "NMODIF", "NOCOLOR",
+               "NODES", "/NOERASE", "/NOLIST", "NOOFFSET", "NOORDER",
+               "/NOPR", "NORA", "NORL", "/NORMAL", "NPLOT", "NPRINT",
+               "NREAD", "NREFINE", "NRLSUM", "*NRM", "NROPT",
+               "NROTAT", "NRRANG", "NSCALE", "NSEL", "NSLA", "NSLE",
+               "NSLK", "NSLL", "NSLV", "NSMOOTH", "NSOL", "NSORT",
+               "NSTORE", "NSUBST", "NSVR", "NSYM", "/NUMBER",
+               "NUMCMP", "NUMEXP", "NUMMRG", "NUMOFF", "NUMSTR",
+               "NUMVAR", "NUSORT", "NWPAVE", "NWPLAN", "NWRITE",
+               "OCDATA", "OCDELETE", "OCLIST", "OCREAD", "OCTABLE",
+               "OCTYPE", "OCZONE", "OMEGA", "OPERATE", "OPNCONTROL",
+               "OUTAERO", "OUTOPT", "OUTPR", "/OUTPUT", "OUTRES",
+               "OVCHECK", "PADELE", "/PAGE", "PAGET", "PAPUT",
+               "PARESU", "PARTSEL", "PARRES", "PARSAV", "PASAVE",
+               "PATH", "PAUSE", "/PBC", "/PBF", "PCALC", "PCGOPT",
+               "PCIRC", "/PCIRCLE", "/PCOPY", "PCROSS", "PDANL",
+               "PDCDF", "PDCFLD", "PDCLR", "PDCMAT", "PDCORR",
+               "PDDMCS", "PDDOEL", "PDEF", "PDEXE", "PDHIST",
+               "PDINQR", "PDLHS", "PDMETH", "PDOT", "PDPINV",
+               "PDPLOT", "PDPROB", "PDRESU", "PDROPT", "/PDS",
+               "PDSAVE", "PDSCAT", "PDSENS", "PDSHIS", "PDUSER",
+               "PDVAR", "PDWRITE", "PERBC2D", "PERTURB", "PFACT",
+               "PHYSICS", "PIVCHECK", "PLCAMP", "PLCFREQ", "PLCHIST",
+               "PLCINT", "PLCPLX", "PLCRACK", "PLDISP", "PLESOL",
+               "PLETAB", "PLFAR", "PLF2D", "PLGEOM", "PLLS", "PLMAP",
+               "PLMC", "PLNEAR", "PLNSOL", "/PLOPTS", "PLORB", "PLOT",
+               "PLOTTING", "PLPAGM", "PLPATH", "PLSECT", "PLST",
+               "PLTIME", "PLTRAC", "PLVAR", "PLVECT", "PLZZ",
+               "/PMACRO", "PMAP", "PMGTRAN", "PMLOPT", "PMLSIZE",
+               "/PMORE", "PNGR", "/PNUM", "POINT", "POLY", "/POLYGON",
+               "/POST1", "/POST26", "POWERH", "PPATH", "PRANGE",
+               "PRAS", "PRCAMP", "PRCINT", "PRCPLX", "PRED",
+               "PRENERGY", "/PREP7", "PRERR", "PRESOL", "PRETAB",
+               "PRFAR", "PRI2", "PRIM", "PRINT", "*PRINT", "PRISM",
+               "PRITER", "PRJSOL", "PRNEAR", "PRNLD", "PRNSOL",
+               "PROD", "PRORB", "PRPATH", "PRRFOR", "PRRSOL",
+               "PRSCONTROL", "PRSECT", "PRTIME", "PRVAR", "PRVECT",
+               "PSCONTROL", "PSCR", "PSDCOM", "PSDFRQ", "PSDGRAPH",
+               "PSDRES", "PSDSPL", "PSDUNIT", "PSDVAL", "PSDWAV",
+               "/PSEARCH", "PSEL", "/PSF", "PSMAT", "PSMESH",
+               "/PSPEC", "/PSTATUS", "PSTRES", "/PSYMB", "PTR",
+               "PTXY", "PVECT", "/PWEDGE", "QDVAL", "QRDOPT", "QSOPT",
+               "QUAD", "/QUIT", "QUOT", "R", "RACE", "RADOPT",
+               "RAPPND", "RATE", "/RATIO", "RBE3", "RCON", "RCYC",
+               "RDEC", "RDELE", "READ", "REAL", "REALVAR", "RECTNG",
+               "REMESH", "/RENAME", "REORDER", "*REPEAT", "/REPLOT",
+               "RESCOMBINE", "RESCONTROL", "RESET", "/RESET", "RESP",
+               "RESUME", "RESVEC", "RESWRITE", "*RETURN", "REXPORT",
+               "REZONE", "RFORCE", "/RGB", "RIGID", "RIGRESP",
+               "RIMPORT", "RLIST", "RMALIST", "RMANL", "RMASTER",
+               "RMCAP", "RMCLIST", "/RMDIR", "RMFLVEC", "RMLVSCALE",
+               "RMMLIST", "RMMRANGE", "RMMSELECT", "RMNDISP",
+               "RMNEVEC", "RMODIF", "RMORE", "RMPORDER", "RMRESUME",
+               "RMRGENERATE", "RMROPTIONS", "RMRPLOT", "RMRSTATUS",
+               "RMSAVE", "RMSMPLE", "RMUSE", "RMXPORT", "ROCK",
+               "ROSE", "RPOLY", "RPR4", "RPRISM", "RPSD", "RSFIT",
+               "RSOPT", "RSPLIT", "RSPLOT", "RSPRNT", "RSSIMS",
+               "RSTMAC", "RSTOFF", "RSURF", "RSYMM", "RSYS", "RTHICK",
+               "SABS", "SADD", "SALLOW", "SAVE", "SBCLIST", "SBCTRAN",
+               "SDELETE", "SE", "SECCONTROL", "SECDATA",
+               "SECFUNCTION", "SECJOINT", "/SECLIB", "SECLOCK",
+               "SECMODIF", "SECNUM", "SECOFFSET", "SECPLOT",
+               "SECREAD", "SECSTOP", "SECTYPE", "SECWRITE", "SED",
+               "SEDLIST", "SEEXP", "/SEG", "SEGEN", "SELIST", "SELM",
+               "SELTOL", "SENERGY", "SEOPT", "SESYMM", "*SET", "SET",
+               "SETFGAP", "SETRAN", "SEXP", "SF", "SFA", "SFACT",
+               "SFADELE", "SFALIST", "SFBEAM", "SFCALC", "SFCUM",
+               "SFDELE", "SFE", "SFEDELE", "SFELIST", "SFFUN",
+               "SFGRAD", "SFL", "SFLDELE", "SFLEX", "SFLIST",
+               "SFLLIST", "SFSCALE", "SFTRAN", "/SHADE", "SHELL",
+               "/SHOW", "/SHOWDISP", "SHPP", "/SHRINK", "SLIST",
+               "SLOAD", "SMALL", "*SMAT", "SMAX", "/SMBC", "SMBODY",
+               "SMCONS", "SMFOR", "SMIN", "SMOOTH", "SMRTSIZE",
+               "SMSURF", "SMULT", "SNOPTION", "SOLU", "/SOLU",
+               "SOLUOPT", "SOLVE", "SORT", "SOURCE", "SPACE",
+               "SPCNOD", "SPCTEMP", "SPDAMP", "SPEC", "SPFREQ",
+               "SPGRAPH", "SPH4", "SPH5", "SPHERE", "SPLINE", "SPLOT",
+               "SPMWRITE", "SPOINT", "SPOPT", "SPREAD", "SPTOPT",
+               "SPOWER", "SPUNIT", "SPVAL", "SQRT", "*SREAD", "SRSS",
+               "SSBT", "/SSCALE", "SSLN", "SSMT", "SSPA", "SSPB",
+               "SSPD", "SSPE", "SSPM", "SSUM", "SSTATE", "STABILIZE",
+               "STAOPT", "STAT", "*STATUS", "/STATUS", "STEF",
+               "STORE", "SUBOPT", "SUBSET", "SUCALC",
+               "SUCR", "SUDEL", "SUEVAL", "SUGET", "SUMAP", "SUMTYPE",
+               "SUPL", "SUPR", "SURESU", "SUSAVE", "SUSEL", "SUVECT",
+               "SV", "SVPLOT", "SVTYP", "SWADD", "SWDEL", "SWGEN",
+               "SWLIST", "SYNCHRO", "/SYP", "/SYS", "TALLOW",
+               "TARGET", "*TAXIS", "TB", "TBCOPY", "TBDATA", "TBDELE",
+               "TBEO", "TBIN", "TBFIELD", "TBFT", "TBLE", "TBLIST",
+               "TBMODIF", "TBPLOT", "TBPT", "TBTEMP", "TCHG", "/TEE",
+               "TERM", "THEXPAND", "THOPT", "TIFF", "TIME",
+               "TIMERANGE", "TIMINT", "TIMP", "TINTP",
+               "/TLABEL", "TOFFST", "*TOPER", "TORQ2D", "TORQC2D",
+               "TORQSUM", "TORUS", "TRANS", "TRANSFER", "*TREAD",
+               "TREF", "/TRIAD", "/TRLCY", "TRNOPT", "TRPDEL",
+               "TRPLIS", "TRPOIN", "TRTIME", "TSHAP", "/TSPEC",
+               "TSRES", "TUNIF", "TVAR", "/TXTRE", "/TYPE", "TYPE",
+               "/UCMD", "/UDOC", "/UI", "UIMP", "/UIS", "*ULIB", "/UPF",
+               "UNDELETE", "UNDO", "/UNITS", "UNPAUSE", "UPCOORD",
+               "UPGEOM", "*USE", "/USER", "USRCAL", "USRDOF",
+               "USRELEM", "V", "V2DOPT", "VA", "*VABS", "VADD",
+               "VARDEL", "VARNAM", "VATT", "VCLEAR", "*VCOL",
+               "/VCONE", "VCROSS", "*VCUM", "VDDAM", "VDELE", "VDGL",
+               "VDOT", "VDRAG", "*VEC", "*VEDIT", "VEORIENT", "VEXT",
+               "*VFACT", "*VFILL", "VFOPT", "VFQUERY", "VFSM",
+               "*VFUN", "VGEN", "*VGET", "VGET", "VGLUE", "/VIEW",
+               "VIMP", "VINP", "VINV", "*VITRP", "*VLEN", "VLIST",
+               "VLSCALE", "*VMASK", "VMESH", "VOFFST", "VOLUMES")
+
+    # list of in-built () functions
+    elafunf = ("NX()", "NY()", "NZ()", "KX()", "KY()", "KZ()", "LX()",
+               "LY()", "LZ()", "LSX()", "LSY()", "LSZ()", "NODE()",
+               "KP()", "DISTND()", "DISTKP()", "DISTEN()", "ANGLEN()",
+               "ANGLEK()", "NNEAR()", "KNEAR()", "ENEARN()",
+               "AREAND()", "AREAKP()", "ARNODE()", "NORMNX()",
+               "NORMNY()", "NORMNZ()", "NORMKX()", "NORMKY()",
+               "NORMKZ()", "ENEXTN()", "NELEM()", "NODEDOF()",
+               "ELADJ()", "NDFACE()", "NMFACE()", "ARFACE()", "UX()",
+               "UY()", "UZ()", "ROTX()", "ROTY()", "ROTZ()", "TEMP()",
+               "PRES()", "VX()", "VY()", "VZ()", "ENKE()", "ENDS()",
+               "VOLT()", "MAG()", "AX()", "AY()", "AZ()",
+               "VIRTINQR()", "KWGET()", "VALCHR()", "VALHEX()",
+               "CHRHEX()", "STRFILL()", "STRCOMP()", "STRPOS()",
+               "STRLENG()", "UPCASE()", "LWCASE()", "JOIN()",
+               "SPLIT()", "ABS()", "SIGN()", "CXABS()", "EXP()",
+               "LOG()", "LOG10()", "SQRT()", "NINT()", "MOD()",
+               "RAND()", "GDIS()", "SIN()", "COS()", "TAN()",
+               "SINH()", "COSH()", "TANH()", "ASIN()", "ACOS()",
+               "ATAN()", "ATAN2()")
+
+    elafung = ("NSEL()", "ESEL()", "KSEL()", "LSEL()", "ASEL()",
+               "VSEL()", "NDNEXT()", "ELNEXT()", "KPNEXT()",
+               "LSNEXT()", "ARNEXT()", "VLNEXT()", "CENTRX()",
+               "CENTRY()", "CENTRZ()")
+
+    elafunh = ("~CAT5IN", "~CATIAIN", "~PARAIN", "~PROEIN", "~SATIN",
+               "~UGIN", "A", "AADD", "AATT", "ABEXTRACT", "*ABBR",
+               "ABBRES", "ABBSAV", "ABS", "ACCAT", "ACCOPTION",
+               "ACEL", "ACLEAR", "ADAMS", "ADAPT", "ADD", "ADDAM",
+               "ADELE", "ADGL", "ADRAG", "AESIZE", "AFILLT", "AFLIST",
+               "AFSURF", "*AFUN", "AGEN", "AGLUE", "AINA", "AINP",
+               "AINV", "AL", "ALIST", "ALLSEL", "ALPHAD", "AMAP",
+               "AMESH", "/AN3D", "ANCNTR", "ANCUT", "ANCYC", "ANDATA",
+               "ANDSCL", "ANDYNA", "/ANFILE", "ANFLOW", "/ANGLE",
+               "ANHARM", "ANIM", "ANISOS", "ANMODE", "ANMRES",
+               "/ANNOT", "ANORM", "ANPRES", "ANSOL", "ANSTOAQWA",
+               "ANSTOASAS", "ANTIME", "ANTYPE")
+
+    special = ("/COM", "/TITLE", "STITLE")
+
+    elements = ("SOLID5",
+                "LINK11",
+                "PLANE13",
+                "COMBIN14",
+                "MASS2",
+                "PLANE25",
+                "MATRIX27",
+                "FLUID29",
+                "FLUID30",
+                "LINK31",
+                "LINK33",
+                "LINK34",
+                "PLANE35",
+                "SOURC36",
+                "COMBIN37",
+                "FLUID38",
+                "COMBIN39",
+                "COMBIN40",
+                "INFIN47",
+                "MATRIX50",
+                "PLANE55",
+                "SHELL61",
+                "LINK68",
+                "SOLID70",
+                "MASS71",
+                "PLANE75",
+                "PLANE77",
+                "PLANE78",
+                "PLANE83",
+                "SOLID87",
+                "SOLID90",
+                "CIRCU94",
+                "SOLID96",
+                "SOLID98",
+                "INFIN110",
+                "INFIN111",
+                "FLUID116",
+                "PLANE121",
+                "SOLID122",
+                "SOLID123",
+                "CIRCU124",
+                "CIRCU125",
+                "TRANS126",
+                "FLUID129",
+                "FLUID130",
+                "SHELL131",
+                "SHELL132",
+                "FLUID136",
+                "FLUID138",
+                "FLUID139",
+                "SURF151",
+                "SURF152",
+                "SURF153",
+                "SURF154",
+                "SURF155",
+                "SURF156",
+                "SHELL157",
+                "SURF159",
+                "TARGE169",
+                "TARGE170",
+                "CONTA172",
+                "CONTA174",
+                "CONTA175",
+                "CONTA177",
+                "CONTA178",
+                "PRETS179",
+                "LINK180",
+                "SHELL181",
+                "PLANE182",
+                "PLANE183",
+                "MPC184",
+                "SOLID185",
+                "SOLID186",
+                "SOLID187",
+                "BEAM188",
+                "BEAM189",
+                "SOLSH190",
+                "INTER192",
+                "INTER193",
+                "INTER194",
+                "INTER195",
+                "MESH200",
+                "FOLLW201",
+                "INTER202",
+                "INTER203",
+                "INTER204",
+                "INTER205",
+                "SHELL208",
+                "SHELL209",
+                "CPT212",
+                "CPT213",
+                "COMBI214",
+                "CPT215",
+                "CPT216",
+                "CPT217",
+                "FLUID218",
+                "FLUID220",
+                "FLUID221",
+                "PLANE222",
+                "PLANE223",
+                "SOLID225",
+                "SOLID226",
+                "SOLID227",
+                "PLANE230",
+                "SOLID231",
+                "SOLID232",
+                "PLANE233",
+                "SOLID236",
+                "SOLID237",
+                "PLANE238",
+                "SOLID239",
+                "SOLID240",
+                "HSFLD241",
+                "HSFLD242",
+                "COMBI250",
+                "SURF251",
+                "SURF252",
+                "INFIN257",
+                "REINF263",
+                "REINF264",
+                "REINF265",
+                "SOLID272",
+                "SOLID273",
+                "SOLID278",
+                "SOLID279",
+                "CABLE280",
+                "SHELL281",
+                "SOLID285",
+                "PIPE288",
+                "PIPE289",
+                "ELBOW290",
+                "SOLID291",
+                "PLANE292",
+                "PLANE293",
+                "USER300")
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Whitespace),
+            (words((elafunb+elafunc+elafund+elafune+elafunh+special), suffix=r'\b'), Keyword, 'non-keyword'),
+            default('non-keyword'),
+        ],
+        'non-keyword': [
+            (r'!.*\n', Comment, '#pop'),
+            (r'%.*?%', Escape),
+            include('strings'),
+            include('nums'),
+            (words((elafunf+elafung), suffix=r'\b'), Name.Builtin),
+            (words((elements), suffix=r'\b'), Name.Property),
+            include('core'),
+            (r'AR[0-9]+', Name.Variable.Instance),
+            (r'[a-z_][a-z0-9_]*', Name.Variable),
+            (r'\n+', Whitespace, '#pop'),
+            (r'[^\S\n]+', Whitespace),
+        ],
+        'core': [
+            # Operators
+            (r'(\*\*|\*|\+|-|\/|<|>|<=|>=|==|\/=|=|\(|\))', Operator),
+            (r'/EOF', Generic.Emph),
+            (r'[\.(),:&;]', Punctuation),
+        ],
+        'strings': [
+            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
+            (r"(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r'[$%]', String.Symbol),
+        ],
+        'nums': [
+            (r'[+-]?\d*\.\d+([efEF][-+]?\d+)?', Number.Float), # with dot
+            (r'([+-]?\d+([efEF][-+]?\d+))', Number.Float), # With scientific notation
+            (r'\b\d+(?![.ef])', Number.Integer), # integer simple
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/apl.py b/.venv/Lib/site-packages/pygments/lexers/apl.py
new file mode 100644 (file)
index 0000000..a2ee3f4
--- /dev/null
@@ -0,0 +1,103 @@
+"""
+    pygments.lexers.apl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for APL.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['APLLexer']
+
+
+class APLLexer(RegexLexer):
+    """
+    A simple APL lexer.
+    """
+    name = 'APL'
+    url = 'https://en.m.wikipedia.org/wiki/APL_(programming_language)'
+    aliases = ['apl']
+    filenames = [
+        '*.apl', '*.aplf', '*.aplo', '*.apln',  
+        '*.aplc', '*.apli', '*.dyalog',
+    ]
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            # Whitespace
+            # ==========
+            (r'\s+', Whitespace),
+            #
+            # Comment
+            # =======
+            # '⍝' is traditional; '#' is supported by GNU APL and NGN (but not Dyalog)
+            (r'[⍝#].*$', Comment.Single),
+            #
+            # Strings
+            # =======
+            (r'\'((\'\')|[^\'])*\'', String.Single),
+            (r'"(("")|[^"])*"', String.Double),  # supported by NGN APL
+            #
+            # Punctuation
+            # ===========
+            # This token type is used for diamond and parenthesis
+            # but not for bracket and ; (see below)
+            (r'[⋄◇()]', Punctuation),
+            #
+            # Array indexing
+            # ==============
+            # Since this token type is very important in APL, it is not included in
+            # the punctuation token type but rather in the following one
+            (r'[\[\];]', String.Regex),
+            #
+            # Distinguished names
+            # ===================
+            # following IBM APL2 standard
+            (r'⎕[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*', Name.Function),
+            #
+            # Labels
+            # ======
+            # following IBM APL2 standard
+            # (r'[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*:', Name.Label),
+            #
+            # Variables
+            # =========
+            # following IBM APL2 standard (with a leading _ ok for GNU APL and Dyalog)
+            (r'[A-Za-zΔ∆⍙_][A-Za-zΔ∆⍙_¯0-9]*', Name.Variable),     
+            #
+            # Numbers
+            # =======
+            (r'¯?(0[Xx][0-9A-Fa-f]+|[0-9]*\.?[0-9]+([Ee][+¯]?[0-9]+)?|¯|∞)'
+             r'([Jj]¯?(0[Xx][0-9A-Fa-f]+|[0-9]*\.?[0-9]+([Ee][+¯]?[0-9]+)?|¯|∞))?',
+             Number),
+            #
+            # Operators
+            # ==========
+            (r'[\.\\\/⌿⍀¨⍣⍨⍠⍤∘⌸&⌶@⌺⍥⍛⍢]', Name.Attribute),  # closest token type
+            (r'[+\-×÷⌈⌊∣|⍳?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⌸⍯↗⊆⊇⍸√⌾…⍮]',
+             Operator),
+            #
+            # Constant
+            # ========
+            (r'⍬', Name.Constant),
+            #
+            # Quad symbol
+            # ===========
+            (r'[⎕⍞]', Name.Variable.Global),
+            #
+            # Arrows left/right
+            # =================
+            (r'[←→]', Keyword.Declaration),
+            #
+            # D-Fn
+            # ====
+            (r'[⍺⍵⍶⍹∇:]', Name.Builtin.Pseudo),
+            (r'[{}]', Keyword.Type),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/archetype.py b/.venv/Lib/site-packages/pygments/lexers/archetype.py
new file mode 100644 (file)
index 0000000..47f34af
--- /dev/null
@@ -0,0 +1,315 @@
+"""
+    pygments.lexers.archetype
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Archetype-related syntaxes, including ODIN, ADL and cADL.
+
+    For uses of this syntax, see the openEHR archetypes <http://www.openEHR.org/ckm>
+
+    Contributed by Thomas Beale <https://github.com/wolandscat>,
+    <https://bitbucket.org/thomas_beale>.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, using, default
+from pygments.token import Text, Comment, Name, Literal, Number, String, \
+    Punctuation, Keyword, Operator, Generic, Whitespace
+
+__all__ = ['OdinLexer', 'CadlLexer', 'AdlLexer']
+
+
+class AtomsLexer(RegexLexer):
+    """
+    Lexer for Values used in ADL and ODIN.
+
+    .. versionadded:: 2.1
+    """
+
+    tokens = {
+        # ----- pseudo-states for inclusion -----
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'([ \t]*)(--.*)$', bygroups(Whitespace, Comment)),
+        ],
+        'archetype_id': [
+            (r'([ \t]*)(([a-zA-Z]\w+(\.[a-zA-Z]\w+)*::)?[a-zA-Z]\w+(-[a-zA-Z]\w+){2}'
+             r'\.\w+[\w-]*\.v\d+(\.\d+){,2}((-[a-z]+)(\.\d+)?)?)',
+             bygroups(Whitespace, Name.Decorator)),
+        ],
+        'date_constraints': [
+            # ISO 8601-based date/time constraints
+            (r'[Xx?YyMmDdHhSs\d]{2,4}([:-][Xx?YyMmDdHhSs\d]{2}){2}', Literal.Date),
+            # ISO 8601-based duration constraints + optional trailing slash
+            (r'(P[YyMmWwDd]+(T[HhMmSs]+)?|PT[HhMmSs]+)/?', Literal.Date),
+        ],
+        'ordered_values': [
+            # ISO 8601 date with optional 'T' ligature
+            (r'\d{4}-\d{2}-\d{2}T?', Literal.Date),
+            # ISO 8601 time
+            (r'\d{2}:\d{2}:\d{2}(\.\d+)?([+-]\d{4}|Z)?', Literal.Date),
+            # ISO 8601 duration
+            (r'P((\d*(\.\d+)?[YyMmWwDd]){1,3}(T(\d*(\.\d+)?[HhMmSs]){,3})?|'
+             r'T(\d*(\.\d+)?[HhMmSs]){,3})', Literal.Date),
+            (r'[+-]?(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+', Number.Float),
+            (r'[+-]?\d*\.\d+%?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[+-]?\d+%?', Number.Integer),
+        ],
+        'values': [
+            include('ordered_values'),
+            (r'([Tt]rue|[Ff]alse)', Literal),
+            (r'"', String, 'string'),
+            (r"'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'[a-z][a-z0-9+.-]*:', Literal, 'uri'),
+            # term code
+            (r'(\[)(\w[\w-]*(?:\([^)\n]+\))?)(::)(\w[\w-]*)(\])',
+             bygroups(Punctuation, Name.Decorator, Punctuation, Name.Decorator,
+                      Punctuation)),
+            (r'\|', Punctuation, 'interval'),
+            # list continuation
+            (r'\.\.\.', Punctuation),
+        ],
+        'constraint_values': [
+            (r'(\[)(\w[\w-]*(?:\([^)\n]+\))?)(::)',
+             bygroups(Punctuation, Name.Decorator, Punctuation), 'adl14_code_constraint'),
+            # ADL 1.4 ordinal constraint
+            (r'(\d*)(\|)(\[\w[\w-]*::\w[\w-]*\])((?:[,;])?)',
+             bygroups(Number, Punctuation, Name.Decorator, Punctuation)),
+            include('date_constraints'),
+            include('values'),
+        ],
+
+        # ----- real states -----
+        'string': [
+            ('"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|'
+             r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape),
+            # all other characters
+            (r'[^\\"]+', String),
+            # stray backslash
+            (r'\\', String),
+        ],
+        'uri': [
+            # effective URI terminators
+            (r'[,>\s]', Punctuation, '#pop'),
+            (r'[^>\s,]+', Literal),
+        ],
+        'interval': [
+            (r'\|', Punctuation, '#pop'),
+            include('ordered_values'),
+            (r'\.\.', Punctuation),
+            (r'[<>=] *', Punctuation),
+            # handle +/-
+            (r'\+/-', Punctuation),
+            (r'\s+', Whitespace),
+        ],
+        'any_code': [
+            include('archetype_id'),
+            # if it is a code
+            (r'[a-z_]\w*[0-9.]+(@[^\]]+)?', Name.Decorator),
+            # if it is tuple with attribute names
+            (r'[a-z_]\w*', Name.Class),
+            # if it is an integer, i.e. Xpath child index
+            (r'[0-9]+', Text),
+            (r'\|', Punctuation, 'code_rubric'),
+            (r'\]', Punctuation, '#pop'),
+            # handle use_archetype statement
+            (r'(\s*)(,)(\s*)', bygroups(Whitespace, Punctuation, Whitespace)),
+        ],
+        'code_rubric': [
+            (r'\|', Punctuation, '#pop'),
+            (r'[^|]+', String),
+        ],
+        'adl14_code_constraint': [
+            (r'\]', Punctuation, '#pop'),
+            (r'\|', Punctuation, 'code_rubric'),
+            (r'(\w[\w-]*)([;,]?)', bygroups(Name.Decorator, Punctuation)),
+            include('whitespace'),
+        ],
+    }
+
+
+class OdinLexer(AtomsLexer):
+    """
+    Lexer for ODIN syntax.
+    """
+    name = 'ODIN'
+    aliases = ['odin']
+    filenames = ['*.odin']
+    mimetypes = ['text/odin']
+    url = 'https://github.com/openEHR/odin'
+    version_added = '2.1'
+
+    tokens = {
+        'path': [
+            (r'>', Punctuation, '#pop'),
+            # attribute name
+            (r'[a-z_]\w*', Name.Class),
+            (r'/', Punctuation),
+            (r'\[', Punctuation, 'key'),
+            (r'(\s*)(,)(\s*)', bygroups(Whitespace, Punctuation, Whitespace), '#pop'),
+            (r'\s+', Whitespace, '#pop'),
+        ],
+        'key': [
+            include('values'),
+            (r'\]', Punctuation, '#pop'),
+        ],
+        'type_cast': [
+            (r'\)', Punctuation, '#pop'),
+            (r'[^)]+',  Name.Class),
+        ],
+        'root': [
+            include('whitespace'),
+            (r'([Tt]rue|[Ff]alse)', Literal),
+            include('values'),
+            # x-ref path
+            (r'/', Punctuation, 'path'),
+            # x-ref path starting with key
+            (r'\[', Punctuation, 'key'),
+            # attribute name
+            (r'[a-z_]\w*', Name.Class),
+            (r'=', Operator),
+            (r'\(', Punctuation, 'type_cast'),
+            (r',', Punctuation),
+            (r'<', Punctuation),
+            (r'>', Punctuation),
+            (r';', Punctuation),
+        ],
+    }
+
+
+class CadlLexer(AtomsLexer):
+    """
+    Lexer for cADL syntax.
+    """
+    name = 'cADL'
+    aliases = ['cadl']
+    filenames = ['*.cadl']
+    url = 'https://specifications.openehr.org/releases/AM/latest/ADL2.html#_cadl_constraint_adl'
+    version_added = '2.1'
+
+    tokens = {
+        'path': [
+            # attribute name
+            (r'[a-z_]\w*', Name.Class),
+            (r'/', Punctuation),
+            (r'\[', Punctuation, 'any_code'),
+            (r'\s+', Punctuation, '#pop'),
+        ],
+        'root': [
+            include('whitespace'),
+            (r'(cardinality|existence|occurrences|group|include|exclude|'
+             r'allow_archetype|use_archetype|use_node)\W', Keyword.Type),
+            (r'(and|or|not|there_exists|xor|implies|for_all)\W', Keyword.Type),
+            (r'(after|before|closed)\W', Keyword.Type),
+            (r'(not)\W', Operator),
+            (r'(matches|is_in)\W', Operator),
+            # is_in / not is_in char
+            ('(\u2208|\u2209)', Operator),
+            # there_exists / not there_exists / for_all / and / or
+            ('(\u2203|\u2204|\u2200|\u2227|\u2228|\u22BB|\223C)',
+             Operator),
+            # regex in slot or as string constraint
+            (r'(\{)(\s*)(/[^}]+/)(\s*)(\})',
+             bygroups(Punctuation, Whitespace, String.Regex, Whitespace, Punctuation)),
+            # regex in slot or as string constraint
+            (r'(\{)(\s*)(\^[^}]+\^)(\s*)(\})',
+             bygroups(Punctuation, Whitespace, String.Regex, Whitespace, Punctuation)),
+            (r'/', Punctuation, 'path'),
+            # for cardinality etc
+            (r'(\{)((?:\d+\.\.)?(?:\d+|\*))'
+             r'((?:\s*;\s*(?:ordered|unordered|unique)){,2})(\})',
+             bygroups(Punctuation, Number, Number, Punctuation)),
+            # [{ is start of a tuple value
+            (r'\[\{', Punctuation),
+            (r'\}\]', Punctuation),
+            (r'\{', Punctuation),
+            (r'\}', Punctuation),
+            include('constraint_values'),
+            # type name
+            (r'[A-Z]\w+(<[A-Z]\w+([A-Za-z_<>]*)>)?',  Name.Class),
+            # attribute name
+            (r'[a-z_]\w*', Name.Class),
+            (r'\[', Punctuation, 'any_code'),
+            (r'(~|//|\\\\|\+|-|/|\*|\^|!=|=|<=|>=|<|>]?)', Operator),
+            (r'\(', Punctuation),
+            (r'\)', Punctuation),
+            # for lists of values
+            (r',', Punctuation),
+            (r'"', String, 'string'),
+            # for assumed value
+            (r';', Punctuation),
+        ],
+    }
+
+
+class AdlLexer(AtomsLexer):
+    """
+    Lexer for ADL syntax.
+    """
+
+    name = 'ADL'
+    aliases = ['adl']
+    filenames = ['*.adl', '*.adls', '*.adlf', '*.adlx']
+    url = 'https://specifications.openehr.org/releases/AM/latest/ADL2.html'
+    version_added = '2.1'
+
+    tokens = {
+        'whitespace': [
+            # blank line ends
+            (r'\s*\n', Whitespace),
+            # comment-only line
+            (r'^([ \t]*)(--.*)$', bygroups(Whitespace, Comment)),
+        ],
+        'odin_section': [
+            # repeating the following two rules from the root state enable multi-line
+            # strings that start in the first column to be dealt with
+            (r'^(language|description|ontology|terminology|annotations|'
+             r'component_terminologies|revision_history)([ \t]*\n)',
+             bygroups(Generic.Heading, Whitespace)),
+            (r'^(definition)([ \t]*\n)', bygroups(Generic.Heading, Whitespace), 'cadl_section'),
+            (r'^([ \t]*|[ \t]+.*)\n', using(OdinLexer)),
+            (r'^([^"]*")(>[ \t]*\n)', bygroups(String, Punctuation)),
+            # template overlay delimiter
+            (r'^----------*\n', Text, '#pop'),
+            (r'^.*\n', String),
+            default('#pop'),
+        ],
+        'cadl_section': [
+            (r'^([ \t]*|[ \t]+.*)\n', using(CadlLexer)),
+            default('#pop'),
+        ],
+        'rules_section': [
+            (r'^[ \t]+.*\n', using(CadlLexer)),
+            default('#pop'),
+        ],
+        'metadata': [
+            (r'\)', Punctuation, '#pop'),
+            (r';', Punctuation),
+            (r'([Tt]rue|[Ff]alse)', Literal),
+            # numbers and version ids
+            (r'\d+(\.\d+)*', Literal),
+            # Guids
+            (r'(\d|[a-fA-F])+(-(\d|[a-fA-F])+){3,}', Literal),
+            (r'\w+', Name.Class),
+            (r'"', String, 'string'),
+            (r'=', Operator),
+            (r'[ \t]+', Whitespace),
+            default('#pop'),
+        ],
+        'root': [
+            (r'^(archetype|template_overlay|operational_template|template|'
+             r'speciali[sz]e)', Generic.Heading),
+            (r'^(language|description|ontology|terminology|annotations|'
+             r'component_terminologies|revision_history)[ \t]*\n',
+             Generic.Heading, 'odin_section'),
+            (r'^(definition)[ \t]*\n', Generic.Heading, 'cadl_section'),
+            (r'^(rules)[ \t]*\n', Generic.Heading, 'rules_section'),
+            include('archetype_id'),
+            (r'([ \t]*)(\()', bygroups(Whitespace, Punctuation), 'metadata'),
+            include('whitespace'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/arrow.py b/.venv/Lib/site-packages/pygments/lexers/arrow.py
new file mode 100644 (file)
index 0000000..e686cf1
--- /dev/null
@@ -0,0 +1,116 @@
+"""
+    pygments.lexers.arrow
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Arrow.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, default, include
+from pygments.token import Text, Operator, Keyword, Punctuation, Name, \
+    String, Number, Whitespace
+
+__all__ = ['ArrowLexer']
+
+TYPES = r'\b(int|bool|char)((?:\[\])*)(?=\s+)'
+IDENT = r'([a-zA-Z_][a-zA-Z0-9_]*)'
+DECL = TYPES + r'(\s+)' + IDENT
+
+
+class ArrowLexer(RegexLexer):
+    """
+    Lexer for Arrow
+    """
+
+    name = 'Arrow'
+    url = 'https://pypi.org/project/py-arrow-lang/'
+    aliases = ['arrow']
+    filenames = ['*.arw']
+    version_added = '2.7'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'^[|\s]+', Punctuation),
+            include('blocks'),
+            include('statements'),
+            include('expressions'),
+        ],
+        'blocks': [
+            (r'(function)(\n+)(/-->)(\s*)' +
+             DECL +  # 4 groups
+             r'(\()', bygroups(
+                 Keyword.Reserved, Whitespace, Punctuation,
+                 Whitespace, Keyword.Type, Punctuation, Whitespace,
+                 Name.Function, Punctuation
+             ), 'fparams'),
+            (r'/-->$|\\-->$|/--<|\\--<|\^', Punctuation),
+        ],
+        'statements': [
+            (DECL, bygroups(Keyword.Type, Punctuation, Text, Name.Variable)),
+            (r'\[', Punctuation, 'index'),
+            (r'=', Operator),
+            (r'require|main', Keyword.Reserved),
+            (r'print', Keyword.Reserved, 'print'),
+        ],
+        'expressions': [
+            (r'\s+', Whitespace),
+            (r'[0-9]+', Number.Integer),
+            (r'true|false', Keyword.Constant),
+            (r"'", String.Char, 'char'),
+            (r'"', String.Double, 'string'),
+            (r'\{', Punctuation, 'array'),
+            (r'==|!=|<|>|\+|-|\*|/|%', Operator),
+            (r'and|or|not|length', Operator.Word),
+            (r'(input)(\s+)(int|char\[\])', bygroups(
+                Keyword.Reserved, Whitespace, Keyword.Type
+            )),
+            (IDENT + r'(\()', bygroups(
+                Name.Function, Punctuation
+            ), 'fargs'),
+            (IDENT, Name.Variable),
+            (r'\[', Punctuation, 'index'),
+            (r'\(', Punctuation, 'expressions'),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'print': [
+            include('expressions'),
+            (r',', Punctuation),
+            default('#pop'),
+        ],
+        'fparams': [
+            (DECL, bygroups(Keyword.Type, Punctuation, Whitespace, Name.Variable)),
+            (r',', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'escape': [
+            (r'\\(["\\/abfnrtv]|[0-9]{1,3}|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})',
+             String.Escape),
+        ],
+        'char': [
+            (r"'", String.Char, '#pop'),
+            include('escape'),
+            (r"[^'\\]", String.Char),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            include('escape'),
+            (r'[^"\\]+', String.Double),
+        ],
+        'array': [
+            include('expressions'),
+            (r'\}', Punctuation, '#pop'),
+            (r',', Punctuation),
+        ],
+        'fargs': [
+            include('expressions'),
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation),
+        ],
+        'index': [
+            include('expressions'),
+            (r'\]', Punctuation, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/arturo.py b/.venv/Lib/site-packages/pygments/lexers/arturo.py
new file mode 100644 (file)
index 0000000..82fc089
--- /dev/null
@@ -0,0 +1,249 @@
+"""
+    pygments.lexers.arturo
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Arturo language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, do_insertions, include, \
+    this, using, words
+from pygments.token import Comment, Error, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text
+
+from pygments.util import ClassNotFound, get_bool_opt
+
+__all__ = ['ArturoLexer']
+
+
+class ArturoLexer(RegexLexer):
+    """
+    For Arturo source code.
+
+    See `Arturo's Github <https://github.com/arturo-lang/arturo>`_
+    and `Arturo's Website <https://arturo-lang.io/>`_.
+    """
+
+    name = 'Arturo'
+    aliases = ['arturo', 'art']
+    filenames = ['*.art']
+    url = 'https://arturo-lang.io/'
+    version_added = '2.14'
+
+    def __init__(self, **options):
+        self.handle_annotateds = get_bool_opt(options, 'handle_annotateds',
+                                              True)
+        RegexLexer.__init__(self, **options)
+
+    def handle_annotated_strings(self, match):
+        """Adds syntax from another languages inside annotated strings
+
+        match args:
+            1:open_string,
+            2:exclamation_mark,
+            3:lang_name,
+            4:space_or_newline,
+            5:code,
+            6:close_string
+        """
+        from pygments.lexers import get_lexer_by_name
+
+        # Header's section
+        yield match.start(1), String.Double,   match.group(1)
+        yield match.start(2), String.Interpol, match.group(2)
+        yield match.start(3), String.Interpol, match.group(3)
+        yield match.start(4), Text.Whitespace, match.group(4)
+
+        lexer = None
+        if self.handle_annotateds:
+            try:
+                lexer = get_lexer_by_name(match.group(3).strip())
+            except ClassNotFound:
+                pass
+        code = match.group(5)
+
+        if lexer is None:
+            yield match.group(5), String, code
+        else:
+            yield from do_insertions([], lexer.get_tokens_unprocessed(code))
+
+        yield match.start(6), String.Double, match.group(6)
+
+    tokens = {
+        'root': [
+            (r';.*?$', Comment.Single),
+            (r'^((\s#!)|(#!)).*?$', Comment.Hashbang),
+
+            # Constants
+            (words(('false', 'true', 'maybe'),      # boolean
+                   suffix=r'\b'), Name.Constant),
+            (words(('this', 'init'),                # class related keywords
+                   prefix=r'\b', suffix=r'\b\??:?'), Name.Builtin.Pseudo),
+            (r'`.`', String.Char),                  # character
+            (r'\\\w+\b\??:?', Name.Property),       # array index
+            (r'#\w+', Name.Constant),               # color
+            (r'\b[0-9]+\.[0-9]+', Number.Float),    # float
+            (r'\b[0-9]+', Number.Integer),          # integer
+            (r'\w+\b\??:', Name.Label),             # label
+            # Note: Literals can be labeled too
+            (r'\'(?:\w+\b\??:?)', Keyword.Declaration),  # literal
+            (r'\:\w+', Keyword.Type),               # type
+            # Note: Attributes can be labeled too
+            (r'\.\w+\??:?', Name.Attribute),        # attributes
+
+            # Switch structure
+            (r'(\()(.*?)(\)\?)',
+             bygroups(Punctuation, using(this), Punctuation)),
+
+            # Single Line Strings
+            (r'"',   String.Double, 'inside-simple-string'),
+            (r'»',   String.Single, 'inside-smart-string'),
+            (r'«««', String.Double, 'inside-safe-string'),
+            (r'\{\/', String.Single, 'inside-regex-string'),
+
+            # Multi Line Strings
+            (r'\{\:', String.Double, 'inside-curly-verb-string'),
+            (r'(\{)(\!)(\w+)(\s|\n)([\w\W]*?)(^\})', handle_annotated_strings),
+            (r'\{', String.Single, 'inside-curly-string'),
+            (r'\-{3,}', String.Single, 'inside-eof-string'),
+
+            include('builtin-functions'),
+
+            # Operators
+            (r'[()[\],]', Punctuation),
+            (words(('->', '==>', '|', '::', '@', '#',  # sugar syntax
+                    '$', '&', '!', '!!', './')), Name.Decorator),
+            (words(('<:', ':>', ':<', '>:', '<\\', '<>', '<', '>',
+                    'ø', '∞',
+                    '+', '-', '*', '~', '=', '^', '%', '/', '//',
+                    '==>', '<=>', '<==>',
+                    '=>>', '<<=>>', '<<==>>',
+                    '-->', '<->', '<-->',
+                    '=|', '|=', '-:', ':-',
+                    '_', '.', '..', '\\')), Operator),
+
+            (r'\b\w+', Name),
+            (r'\s+', Text.Whitespace),
+            (r'.+$', Error),
+        ],
+
+        'inside-interpol': [
+            (r'\|', String.Interpol, '#pop'),
+            (r'[^|]+', using(this)),
+        ],
+        'inside-template': [
+            (r'\|\|\>', String.Interpol, '#pop'),
+            (r'[^|]+', using(this)),
+        ],
+        'string-escape': [
+            (words(('\\\\', '\\n', '\\t', '\\"')), String.Escape),
+        ],
+
+        'inside-simple-string': [
+            include('string-escape'),
+            (r'\|', String.Interpol, 'inside-interpol'),        # Interpolation
+            (r'\<\|\|', String.Interpol, 'inside-template'),    # Templates
+            (r'"', String.Double, '#pop'),   # Closing Quote
+            (r'[^|"]+', String)              # String Content
+        ],
+        'inside-smart-string': [
+            include('string-escape'),
+            (r'\|', String.Interpol, 'inside-interpol'),        # Interpolation
+            (r'\<\|\|', String.Interpol, 'inside-template'),    # Templates
+            (r'\n', String.Single, '#pop'),  # Closing Quote
+            (r'[^|\n]+', String)             # String Content
+        ],
+        'inside-safe-string': [
+            include('string-escape'),
+            (r'\|', String.Interpol, 'inside-interpol'),        # Interpolation
+            (r'\<\|\|', String.Interpol, 'inside-template'),    # Templates
+            (r'»»»', String.Double, '#pop'),    # Closing Quote
+            (r'[^|»]+', String)                 # String Content
+        ],
+        'inside-regex-string': [
+            (r'\\[sSwWdDbBZApPxucItnvfr0]+', String.Escape),
+            (r'\|', String.Interpol, 'inside-interpol'),        # Interpolation
+            (r'\<\|\|', String.Interpol, 'inside-template'),    # Templates
+            (r'\/\}', String.Single, '#pop'),  # Closing Quote
+            (r'[^|\/]+', String.Regex),        # String Content
+        ],
+        'inside-curly-verb-string': [
+            include('string-escape'),
+            (r'\|', String.Interpol, 'inside-interpol'),        # Interpolation
+            (r'\<\|\|', String.Interpol, 'inside-template'),    # Templates
+            (r'\:\}', String.Double, '#pop'),  # Closing Quote
+            (r'[^|<:]+', String),              # String Content
+        ],
+        'inside-curly-string': [
+            include('string-escape'),
+            (r'\|', String.Interpol, 'inside-interpol'),        # Interpolation
+            (r'\<\|\|', String.Interpol, 'inside-template'),    # Templates
+            (r'\}', String.Single, '#pop'),   # Closing Quote
+            (r'[^|<}]+', String),             # String Content
+        ],
+        'inside-eof-string': [
+            include('string-escape'),
+            (r'\|', String.Interpol, 'inside-interpol'),        # Interpolation
+            (r'\<\|\|', String.Interpol, 'inside-template'),    # Templates
+            (r'\Z', String.Single, '#pop'),   # Closing Quote
+            (r'[^|<]+', String),              # String Content
+        ],
+
+        'builtin-functions': [
+            (words((
+                'all', 'and', 'any', 'ascii', 'attr', 'attribute',
+                'attributeLabel', 'binary', 'block' 'char', 'contains',
+                'database', 'date', 'dictionary', 'empty', 'equal', 'even',
+                'every', 'exists', 'false', 'floatin', 'function', 'greater',
+                'greaterOrEqual', 'if', 'in', 'inline', 'integer', 'is',
+                'key', 'label', 'leap', 'less', 'lessOrEqual', 'literal',
+                'logical', 'lower', 'nand', 'negative', 'nor', 'not',
+                'notEqual', 'null', 'numeric', 'odd', 'or', 'path',
+                'pathLabel', 'positive', 'prefix', 'prime', 'set', 'some',
+                'sorted', 'standalone', 'string', 'subset', 'suffix',
+                'superset', 'ymbol', 'true', 'try', 'type', 'unless', 'upper',
+                'when', 'whitespace', 'word', 'xnor', 'xor', 'zero',
+            ), prefix=r'\b', suffix=r'\b\?'), Name.Builtin),
+            (words((
+                'abs', 'acos', 'acosh', 'acsec', 'acsech', 'actan', 'actanh',
+                'add', 'after', 'alphabet', 'and', 'angle', 'append', 'arg',
+                'args', 'arity', 'array', 'as', 'asec', 'asech', 'asin',
+                'asinh', 'atan', 'atan2', 'atanh', 'attr', 'attrs', 'average',
+                'before', 'benchmark', 'blend', 'break', 'builtins1',
+                'builtins2', 'call', 'capitalize', 'case', 'ceil', 'chop',
+                'chunk', 'clear', 'close', 'cluster', 'color', 'combine',
+                'conj', 'continue', 'copy', 'cos', 'cosh', 'couple', 'csec',
+                'csech', 'ctan', 'ctanh', 'cursor', 'darken', 'dec', 'decode',
+                'decouple', 'define', 'delete', 'desaturate', 'deviation',
+                'dictionary', 'difference', 'digest', 'digits', 'div', 'do',
+                'download', 'drop', 'dup', 'e', 'else', 'empty', 'encode',
+                'ensure', 'env', 'epsilon', 'escape', 'execute', 'exit', 'exp',
+                'extend', 'extract', 'factors', 'false', 'fdiv', 'filter',
+                'first', 'flatten', 'floor', 'fold', 'from', 'function',
+                'gamma', 'gcd', 'get', 'goto', 'hash', 'help', 'hypot', 'if',
+                'in', 'inc', 'indent', 'index', 'infinity', 'info', 'input',
+                'insert', 'inspect', 'intersection', 'invert', 'join', 'keys',
+                'kurtosis', 'last', 'let', 'levenshtein', 'lighten', 'list',
+                'ln', 'log', 'loop', 'lower', 'mail', 'map', 'match', 'max',
+                'maybe', 'median', 'min', 'mod', 'module', 'mul', 'nand',
+                'neg', 'new', 'nor', 'normalize', 'not', 'now', 'null', 'open',
+                'or', 'outdent', 'pad', 'panic', 'path', 'pause',
+                'permissions', 'permutate', 'pi', 'pop', 'pow', 'powerset',
+                'powmod', 'prefix', 'print', 'prints', 'process', 'product',
+                'query', 'random', 'range', 'read', 'relative', 'remove',
+                'rename', 'render', 'repeat', 'replace', 'request', 'return',
+                'reverse', 'round', 'sample', 'saturate', 'script', 'sec',
+                'sech', 'select', 'serve', 'set', 'shl', 'shr', 'shuffle',
+                'sin', 'sinh', 'size', 'skewness', 'slice', 'sort', 'split',
+                'sqrt', 'squeeze', 'stack', 'strip', 'sub', 'suffix', 'sum',
+                'switch', 'symbols', 'symlink', 'sys', 'take', 'tan', 'tanh',
+                'terminal', 'to', 'true', 'truncate', 'try', 'type', 'union',
+                'unique', 'unless', 'until', 'unzip', 'upper', 'values', 'var',
+                'variance', 'volume', 'webview', 'while', 'with', 'wordwrap',
+                'write', 'xnor', 'xor', 'zip'
+            ), prefix=r'\b', suffix=r'\b'), Name.Builtin)
+        ],
+
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/asc.py b/.venv/Lib/site-packages/pygments/lexers/asc.py
new file mode 100644 (file)
index 0000000..243c996
--- /dev/null
@@ -0,0 +1,55 @@
+"""
+    pygments.lexers.asc
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for various ASCII armored files.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+import re
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Comment, Generic, Name, Operator, String, Whitespace
+
+__all__ = ['AscLexer']
+
+
+class AscLexer(RegexLexer):
+    """
+    Lexer for ASCII armored files, containing `-----BEGIN/END ...-----` wrapped
+    base64 data.
+    """
+    name = 'ASCII armored'
+    aliases = ['asc', 'pem']
+    filenames = [
+        '*.asc',  # PGP; *.gpg, *.pgp, and *.sig too, but those can be binary
+        '*.pem',  # X.509; *.cer, *.crt, *.csr, and key etc too, but those can be binary
+        'id_dsa', 'id_ecdsa', 'id_ecdsa_sk', 'id_ed25519', 'id_ed25519_sk',
+        'id_rsa',  # SSH private keys
+    ]
+    mimetypes = ['application/pgp-keys', 'application/pgp-encrypted',
+                 'application/pgp-signature', 'application/pem-certificate-chain']
+    url = 'https://www.openpgp.org'
+    version_added = '2.10'
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'^-----BEGIN [^\n]+-----$', Generic.Heading, 'data'),
+            (r'\S+', Comment),
+        ],
+        'data': [
+            (r'\s+', Whitespace),
+            (r'^([^:]+)(:)([ \t]+)(.*)',
+             bygroups(Name.Attribute, Operator, Whitespace, String)),
+            (r'^-----END [^\n]+-----$', Generic.Heading, 'root'),
+            (r'\S+', String),
+        ],
+    }
+
+    def analyse_text(text):
+        if re.search(r'^-----BEGIN [^\n]+-----\r?\n', text):
+            return True
diff --git a/.venv/Lib/site-packages/pygments/lexers/asm.py b/.venv/Lib/site-packages/pygments/lexers/asm.py
new file mode 100644 (file)
index 0000000..74f4a5a
--- /dev/null
@@ -0,0 +1,1051 @@
+"""
+    pygments.lexers.asm
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for assembly languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, words, \
+    DelegatingLexer, default
+from pygments.lexers.c_cpp import CppLexer, CLexer
+from pygments.lexers.d import DLexer
+from pygments.token import Text, Name, Number, String, Comment, Punctuation, \
+    Other, Keyword, Operator, Whitespace
+
+__all__ = ['GasLexer', 'ObjdumpLexer', 'DObjdumpLexer', 'CppObjdumpLexer',
+           'CObjdumpLexer', 'HsailLexer', 'LlvmLexer', 'LlvmMirBodyLexer',
+           'LlvmMirLexer', 'NasmLexer', 'NasmObjdumpLexer', 'TasmLexer',
+           'Ca65Lexer', 'Dasm16Lexer']
+
+
+class GasLexer(RegexLexer):
+    """
+    For Gas (AT&T) assembly code.
+    """
+    name = 'GAS'
+    aliases = ['gas', 'asm']
+    filenames = ['*.s', '*.S']
+    mimetypes = ['text/x-gas']
+    url = 'https://www.gnu.org/software/binutils'
+    version_added = ''
+
+    #: optional Comment or Whitespace
+    string = r'"(\\"|[^"])*"'
+    char = r'[\w$.@-]'
+    identifier = r'(?:[a-zA-Z$_]' + char + r'*|\.' + char + '+)'
+    number = r'(?:0[xX][a-fA-F0-9]+|#?-?\d+)'
+    register = '%' + identifier + r'\b'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            (identifier + ':', Name.Label),
+            (r'\.' + identifier, Name.Attribute, 'directive-args'),
+            (r'lock|rep(n?z)?|data\d+', Name.Attribute),
+            (identifier, Name.Function, 'instruction-args'),
+            (r'[\r\n]+', Text)
+        ],
+        'directive-args': [
+            (identifier, Name.Constant),
+            (string, String),
+            ('@' + identifier, Name.Attribute),
+            (number, Number.Integer),
+            (register, Name.Variable),
+            (r'[\r\n]+', Whitespace, '#pop'),
+            (r'([;#]|//).*?\n', Comment.Single, '#pop'),
+            (r'/[*].*?[*]/', Comment.Multiline),
+            (r'/[*].*?\n[\w\W]*?[*]/', Comment.Multiline, '#pop'),
+
+            include('punctuation'),
+            include('whitespace')
+        ],
+        'instruction-args': [
+            # For objdump-disassembled code, shouldn't occur in
+            # actual assembler input
+            ('([a-z0-9]+)( )(<)('+identifier+')(>)',
+                bygroups(Number.Hex, Text, Punctuation, Name.Constant,
+                         Punctuation)),
+            ('([a-z0-9]+)( )(<)('+identifier+')([-+])('+number+')(>)',
+                bygroups(Number.Hex, Text, Punctuation, Name.Constant,
+                         Punctuation, Number.Integer, Punctuation)),
+
+            # Address constants
+            (identifier, Name.Constant),
+            (number, Number.Integer),
+            # Registers
+            (register, Name.Variable),
+            # Numeric constants
+            ('$'+number, Number.Integer),
+            (r"$'(.|\\')'", String.Char),
+            (r'[\r\n]+', Whitespace, '#pop'),
+            (r'([;#]|//).*?\n', Comment.Single, '#pop'),
+            (r'/[*].*?[*]/', Comment.Multiline),
+            (r'/[*].*?\n[\w\W]*?[*]/', Comment.Multiline, '#pop'),
+
+            include('punctuation'),
+            include('whitespace')
+        ],
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'([;#]|//).*?\n', Comment.Single),
+            (r'/[*][\w\W]*?[*]/', Comment.Multiline)
+        ],
+        'punctuation': [
+            (r'[-*,.()\[\]!:{}]+', Punctuation)
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\.(text|data|section)', text, re.M):
+            return True
+        elif re.search(r'^\.\w+', text, re.M):
+            return 0.1
+
+
+def _objdump_lexer_tokens(asm_lexer):
+    """
+    Common objdump lexer tokens to wrap an ASM lexer.
+    """
+    hex_re = r'[0-9A-Za-z]'
+    return {
+        'root': [
+            # File name & format:
+            ('(.*?)(:)( +file format )(.*?)$',
+                bygroups(Name.Label, Punctuation, Text, String)),
+            # Section header
+            ('(Disassembly of section )(.*?)(:)$',
+                bygroups(Text, Name.Label, Punctuation)),
+            # Function labels
+            # (With offset)
+            ('('+hex_re+'+)( )(<)(.*?)([-+])(0[xX][A-Za-z0-9]+)(>:)$',
+                bygroups(Number.Hex, Whitespace, Punctuation, Name.Function,
+                         Punctuation, Number.Hex, Punctuation)),
+            # (Without offset)
+            ('('+hex_re+'+)( )(<)(.*?)(>:)$',
+                bygroups(Number.Hex, Whitespace, Punctuation, Name.Function,
+                         Punctuation)),
+            # Code line with disassembled instructions
+            ('( *)('+hex_re+r'+:)(\t)((?:'+hex_re+hex_re+' )+)( *\t)([a-zA-Z].*?)$',
+                bygroups(Whitespace, Name.Label, Whitespace, Number.Hex, Whitespace,
+                         using(asm_lexer))),
+            # Code line without raw instructions (objdump --no-show-raw-insn)
+            ('( *)('+hex_re+r'+:)( *\t)([a-zA-Z].*?)$',
+                bygroups(Whitespace, Name.Label, Whitespace,
+                         using(asm_lexer))),
+            # Code line with ascii
+            ('( *)('+hex_re+r'+:)(\t)((?:'+hex_re+hex_re+' )+)( *)(.*?)$',
+                bygroups(Whitespace, Name.Label, Whitespace, Number.Hex, Whitespace, String)),
+            # Continued code line, only raw opcodes without disassembled
+            # instruction
+            ('( *)('+hex_re+r'+:)(\t)((?:'+hex_re+hex_re+' )+)$',
+                bygroups(Whitespace, Name.Label, Whitespace, Number.Hex)),
+            # Skipped a few bytes
+            (r'\t\.\.\.$', Text),
+            # Relocation line
+            # (With offset)
+            (r'(\t\t\t)('+hex_re+r'+:)( )([^\t]+)(\t)(.*?)([-+])(0x'+hex_re+'+)$',
+                bygroups(Whitespace, Name.Label, Whitespace, Name.Property, Whitespace,
+                         Name.Constant, Punctuation, Number.Hex)),
+            # (Without offset)
+            (r'(\t\t\t)('+hex_re+r'+:)( )([^\t]+)(\t)(.*?)$',
+                bygroups(Whitespace, Name.Label, Whitespace, Name.Property, Whitespace,
+                         Name.Constant)),
+            (r'[^\n]+\n', Other)
+        ]
+    }
+
+
+class ObjdumpLexer(RegexLexer):
+    """
+    For the output of ``objdump -dr``.
+    """
+    name = 'objdump'
+    aliases = ['objdump']
+    filenames = ['*.objdump']
+    mimetypes = ['text/x-objdump']
+    url = 'https://www.gnu.org/software/binutils'
+    version_added = ''
+
+    tokens = _objdump_lexer_tokens(GasLexer)
+
+
+class DObjdumpLexer(DelegatingLexer):
+    """
+    For the output of ``objdump -Sr`` on compiled D files.
+    """
+    name = 'd-objdump'
+    aliases = ['d-objdump']
+    filenames = ['*.d-objdump']
+    mimetypes = ['text/x-d-objdump']
+    url = 'https://www.gnu.org/software/binutils'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(DLexer, ObjdumpLexer, **options)
+
+
+class CppObjdumpLexer(DelegatingLexer):
+    """
+    For the output of ``objdump -Sr`` on compiled C++ files.
+    """
+    name = 'cpp-objdump'
+    aliases = ['cpp-objdump', 'c++-objdumb', 'cxx-objdump']
+    filenames = ['*.cpp-objdump', '*.c++-objdump', '*.cxx-objdump']
+    mimetypes = ['text/x-cpp-objdump']
+    url = 'https://www.gnu.org/software/binutils'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(CppLexer, ObjdumpLexer, **options)
+
+
+class CObjdumpLexer(DelegatingLexer):
+    """
+    For the output of ``objdump -Sr`` on compiled C files.
+    """
+    name = 'c-objdump'
+    aliases = ['c-objdump']
+    filenames = ['*.c-objdump']
+    mimetypes = ['text/x-c-objdump']
+    url = 'https://www.gnu.org/software/binutils'
+    version_added = ''
+
+
+    def __init__(self, **options):
+        super().__init__(CLexer, ObjdumpLexer, **options)
+
+
+class HsailLexer(RegexLexer):
+    """
+    For HSAIL assembly code.
+    """
+    name = 'HSAIL'
+    aliases = ['hsail', 'hsa']
+    filenames = ['*.hsail']
+    mimetypes = ['text/x-hsail']
+    url = 'https://en.wikipedia.org/wiki/Heterogeneous_System_Architecture#HSA_Intermediate_Layer'
+    version_added = '2.2'
+
+    string = r'"[^"]*?"'
+    identifier = r'[a-zA-Z_][\w.]*'
+    # Registers
+    register_number = r'[0-9]+'
+    register = r'(\$(c|s|d|q)' + register_number + r')\b'
+    # Qualifiers
+    alignQual = r'(align\(\d+\))'
+    widthQual = r'(width\((\d+|all)\))'
+    allocQual = r'(alloc\(agent\))'
+    # Instruction Modifiers
+    roundingMod = (r'((_ftz)?(_up|_down|_zero|_near))')
+    datatypeMod = (r'_('
+                   # packedTypes
+                   r'u8x4|s8x4|u16x2|s16x2|u8x8|s8x8|u16x4|s16x4|u32x2|s32x2|'
+                   r'u8x16|s8x16|u16x8|s16x8|u32x4|s32x4|u64x2|s64x2|'
+                   r'f16x2|f16x4|f16x8|f32x2|f32x4|f64x2|'
+                   # baseTypes
+                   r'u8|s8|u16|s16|u32|s32|u64|s64|'
+                   r'b128|b8|b16|b32|b64|b1|'
+                   r'f16|f32|f64|'
+                   # opaqueType
+                   r'roimg|woimg|rwimg|samp|sig32|sig64)')
+
+    # Numeric Constant
+    float = r'((\d+\.)|(\d*\.\d+))[eE][+-]?\d+'
+    hexfloat = r'0[xX](([0-9a-fA-F]+\.[0-9a-fA-F]*)|([0-9a-fA-F]*\.[0-9a-fA-F]+))[pP][+-]?\d+'
+    ieeefloat = r'0((h|H)[0-9a-fA-F]{4}|(f|F)[0-9a-fA-F]{8}|(d|D)[0-9a-fA-F]{16})'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+
+            (string, String),
+
+            (r'@' + identifier + ':?', Name.Label),
+
+            (register, Name.Variable.Anonymous),
+
+            include('keyword'),
+
+            (r'&' + identifier, Name.Variable.Global),
+            (r'%' + identifier, Name.Variable),
+
+            (hexfloat, Number.Hex),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (ieeefloat, Number.Float),
+            (float, Number.Float),
+            (r'\d+', Number.Integer),
+
+            (r'[=<>{}\[\]()*.,:;!]|x\b', Punctuation)
+        ],
+        'whitespace': [
+            (r'(\n|\s)+', Whitespace),
+        ],
+        'comments': [
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single),
+        ],
+        'keyword': [
+            # Types
+            (r'kernarg' + datatypeMod, Keyword.Type),
+
+            # Regular keywords
+            (r'\$(full|base|small|large|default|zero|near)', Keyword),
+            (words((
+                'module', 'extension', 'pragma', 'prog', 'indirect', 'signature',
+                'decl', 'kernel', 'function', 'enablebreakexceptions',
+                'enabledetectexceptions', 'maxdynamicgroupsize', 'maxflatgridsize',
+                'maxflatworkgroupsize', 'requireddim', 'requiredgridsize',
+                'requiredworkgroupsize', 'requirenopartialworkgroups'),
+                suffix=r'\b'), Keyword),
+
+            # instructions
+            (roundingMod, Keyword),
+            (datatypeMod, Keyword),
+            (r'_(' + alignQual + '|' + widthQual + ')', Keyword),
+            (r'_kernarg', Keyword),
+            (r'(nop|imagefence)\b', Keyword),
+            (words((
+                'cleardetectexcept', 'clock', 'cuid', 'debugtrap', 'dim',
+                'getdetectexcept', 'groupbaseptr', 'kernargbaseptr', 'laneid',
+                'maxcuid', 'maxwaveid', 'packetid', 'setdetectexcept', 'waveid',
+                'workitemflatabsid', 'workitemflatid', 'nullptr', 'abs', 'bitrev',
+                'currentworkgroupsize', 'currentworkitemflatid', 'fract', 'ncos',
+                'neg', 'nexp2', 'nlog2', 'nrcp', 'nrsqrt', 'nsin', 'nsqrt',
+                'gridgroups', 'gridsize', 'not', 'sqrt', 'workgroupid',
+                'workgroupsize', 'workitemabsid', 'workitemid', 'ceil', 'floor',
+                'rint', 'trunc', 'add', 'bitmask', 'borrow', 'carry', 'copysign',
+                'div', 'rem', 'sub', 'shl', 'shr', 'and', 'or', 'xor', 'unpackhi',
+                'unpacklo', 'max', 'min', 'fma', 'mad', 'bitextract', 'bitselect',
+                'shuffle', 'cmov', 'bitalign', 'bytealign', 'lerp', 'nfma', 'mul',
+                'mulhi', 'mul24hi', 'mul24', 'mad24', 'mad24hi', 'bitinsert',
+                'combine', 'expand', 'lda', 'mov', 'pack', 'unpack', 'packcvt',
+                'unpackcvt', 'sad', 'sementp', 'ftos', 'stof', 'cmp', 'ld', 'st',
+                '_eq', '_ne', '_lt', '_le', '_gt', '_ge', '_equ', '_neu', '_ltu',
+                '_leu', '_gtu', '_geu', '_num', '_nan', '_seq', '_sne', '_slt',
+                '_sle', '_sgt', '_sge', '_snum', '_snan', '_sequ', '_sneu', '_sltu',
+                '_sleu', '_sgtu', '_sgeu', 'atomic', '_ld', '_st', '_cas', '_add',
+                '_and', '_exch', '_max', '_min', '_or', '_sub', '_wrapdec',
+                '_wrapinc', '_xor', 'ret', 'cvt', '_readonly', '_kernarg', '_global',
+                'br', 'cbr', 'sbr', '_scacq', '_screl', '_scar', '_rlx', '_wave',
+                '_wg', '_agent', '_system', 'ldimage', 'stimage', '_v2', '_v3', '_v4',
+                '_1d', '_2d', '_3d', '_1da', '_2da', '_1db', '_2ddepth', '_2dadepth',
+                '_width', '_height', '_depth', '_array', '_channelorder',
+                '_channeltype', 'querysampler', '_coord', '_filter', '_addressing',
+                'barrier', 'wavebarrier', 'initfbar', 'joinfbar', 'waitfbar',
+                'arrivefbar', 'leavefbar', 'releasefbar', 'ldf', 'activelaneid',
+                'activelanecount', 'activelanemask', 'activelanepermute', 'call',
+                'scall', 'icall', 'alloca', 'packetcompletionsig',
+                'addqueuewriteindex', 'casqueuewriteindex', 'ldqueuereadindex',
+                'stqueuereadindex', 'readonly', 'global', 'private', 'group',
+                'spill', 'arg', '_upi', '_downi', '_zeroi', '_neari', '_upi_sat',
+                '_downi_sat', '_zeroi_sat', '_neari_sat', '_supi', '_sdowni',
+                '_szeroi', '_sneari', '_supi_sat', '_sdowni_sat', '_szeroi_sat',
+                '_sneari_sat', '_pp', '_ps', '_sp', '_ss', '_s', '_p', '_pp_sat',
+                '_ps_sat', '_sp_sat', '_ss_sat', '_s_sat', '_p_sat')), Keyword),
+
+            # Integer types
+            (r'i[1-9]\d*', Keyword)
+        ]
+    }
+
+
+class LlvmLexer(RegexLexer):
+    """
+    For LLVM assembly code.
+    """
+    name = 'LLVM'
+    url = 'https://llvm.org/docs/LangRef.html'
+    aliases = ['llvm']
+    filenames = ['*.ll']
+    mimetypes = ['text/x-llvm']
+    version_added = ''
+
+    #: optional Comment or Whitespace
+    string = r'"[^"]*?"'
+    identifier = r'([-a-zA-Z$._][\w\-$.]*|' + string + ')'
+    block_label = r'(' + identifier + r'|(\d+))'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+
+            # Before keywords, because keywords are valid label names :(...
+            (block_label + r'\s*:', Name.Label),
+
+            include('keyword'),
+
+            (r'%' + identifier, Name.Variable),
+            (r'@' + identifier, Name.Variable.Global),
+            (r'%\d+', Name.Variable.Anonymous),
+            (r'@\d+', Name.Variable.Global),
+            (r'#\d+', Name.Variable.Global),
+            (r'!' + identifier, Name.Variable),
+            (r'!\d+', Name.Variable.Anonymous),
+            (r'c?' + string, String),
+
+            (r'0[xX][KLMHR]?[a-fA-F0-9]+', Number),
+            (r'-?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?', Number),
+
+            (r'[=<>{}\[\]()*.,!]|x\b', Punctuation)
+        ],
+        'whitespace': [
+            (r'(\n|\s+)+', Whitespace),
+            (r';.*?\n', Comment)
+        ],
+        'keyword': [
+            # Regular keywords
+            (words((
+                'aarch64_sve_vector_pcs', 'aarch64_vector_pcs', 'acq_rel',
+                'acquire', 'add', 'addrspace', 'addrspacecast', 'afn', 'alias',
+                'aliasee', 'align', 'alignLog2', 'alignstack', 'alloca',
+                'allocsize', 'allOnes', 'alwaysinline', 'alwaysInline',
+                'amdgpu_cs', 'amdgpu_es', 'amdgpu_gfx', 'amdgpu_gs',
+                'amdgpu_hs', 'amdgpu_kernel', 'amdgpu_ls', 'amdgpu_ps',
+                'amdgpu_vs', 'and', 'any', 'anyregcc', 'appending', 'arcp',
+                'argmemonly', 'args', 'arm_aapcs_vfpcc', 'arm_aapcscc',
+                'arm_apcscc', 'ashr', 'asm', 'atomic', 'atomicrmw',
+                'attributes', 'available_externally', 'avr_intrcc',
+                'avr_signalcc', 'bit', 'bitcast', 'bitMask', 'blockaddress',
+                'blockcount', 'br', 'branchFunnel', 'builtin', 'byArg',
+                'byref', 'byte', 'byteArray', 'byval', 'c', 'call', 'callbr',
+                'callee', 'caller', 'calls', 'canAutoHide', 'catch',
+                'catchpad', 'catchret', 'catchswitch', 'cc', 'ccc',
+                'cfguard_checkcc', 'cleanup', 'cleanuppad', 'cleanupret',
+                'cmpxchg', 'cold', 'coldcc', 'comdat', 'common', 'constant',
+                'contract', 'convergent', 'critical', 'cxx_fast_tlscc',
+                'datalayout', 'declare', 'default', 'define', 'deplibs',
+                'dereferenceable', 'dereferenceable_or_null', 'distinct',
+                'dllexport', 'dllimport', 'dso_local', 'dso_local_equivalent',
+                'dso_preemptable', 'dsoLocal', 'eq', 'exact', 'exactmatch',
+                'extern_weak', 'external', 'externally_initialized',
+                'extractelement', 'extractvalue', 'fadd', 'false', 'fast',
+                'fastcc', 'fcmp', 'fdiv', 'fence', 'filter', 'flags', 'fmul',
+                'fneg', 'fpext', 'fptosi', 'fptoui', 'fptrunc', 'freeze',
+                'frem', 'from', 'fsub', 'funcFlags', 'function', 'gc',
+                'getelementptr', 'ghccc', 'global', 'guid', 'gv', 'hash',
+                'hhvm_ccc', 'hhvmcc', 'hidden', 'hot', 'hotness', 'icmp',
+                'ifunc', 'inaccessiblemem_or_argmemonly',
+                'inaccessiblememonly', 'inalloca', 'inbounds', 'indir',
+                'indirectbr', 'info', 'initialexec', 'inline', 'inlineBits',
+                'inlinehint', 'inrange', 'inreg', 'insertelement',
+                'insertvalue', 'insts', 'intel_ocl_bicc', 'inteldialect',
+                'internal', 'inttoptr', 'invoke', 'jumptable', 'kind',
+                'landingpad', 'largest', 'linkage', 'linkonce', 'linkonce_odr',
+                'live', 'load', 'local_unnamed_addr', 'localdynamic',
+                'localexec', 'lshr', 'max', 'metadata', 'min', 'minsize',
+                'module', 'monotonic', 'msp430_intrcc', 'mul', 'mustprogress',
+                'musttail', 'naked', 'name', 'nand', 'ne', 'nest', 'ninf',
+                'nnan', 'noalias', 'nobuiltin', 'nocallback', 'nocapture',
+                'nocf_check', 'noduplicate', 'noduplicates', 'nofree',
+                'noimplicitfloat', 'noinline', 'noInline', 'nomerge', 'none',
+                'nonlazybind', 'nonnull', 'noprofile', 'norecurse',
+                'noRecurse', 'noredzone', 'noreturn', 'nosync', 'notail',
+                'notEligibleToImport', 'noundef', 'nounwind', 'nsw',
+                'nsz', 'null', 'null_pointer_is_valid', 'nuw', 'oeq', 'offset',
+                'oge', 'ogt', 'ole', 'olt', 'one', 'opaque', 'optforfuzzing',
+                'optnone', 'optsize', 'or', 'ord', 'param', 'params',
+                'partition', 'path', 'personality', 'phi', 'poison',
+                'preallocated', 'prefix', 'preserve_allcc', 'preserve_mostcc',
+                'private', 'prologue', 'protected', 'ptrtoint', 'ptx_device',
+                'ptx_kernel', 'readnone', 'readNone', 'readonly', 'readOnly',
+                'reassoc', 'refs', 'relbf', 'release', 'resByArg', 'resume',
+                'ret', 'returnDoesNotAlias', 'returned', 'returns_twice',
+                'safestack', 'samesize', 'sanitize_address',
+                'sanitize_hwaddress', 'sanitize_memory', 'sanitize_memtag',
+                'sanitize_thread', 'sdiv', 'section', 'select', 'seq_cst',
+                'sext', 'sge', 'sgt', 'shadowcallstack', 'shl',
+                'shufflevector', 'sideeffect', 'signext', 'single',
+                'singleImpl', 'singleImplName', 'sitofp', 'sizeM1',
+                'sizeM1BitWidth', 'sle', 'slt', 'source_filename',
+                'speculatable', 'speculative_load_hardening', 'spir_func',
+                'spir_kernel', 'splat', 'srem', 'sret', 'ssp', 'sspreq',
+                'sspstrong', 'store', 'strictfp', 'sub', 'summaries',
+                'summary', 'swiftcc', 'swifterror', 'swiftself', 'switch',
+                'syncscope', 'tail', 'tailcc', 'target', 'thread_local', 'to',
+                'token', 'triple', 'true', 'trunc', 'type',
+                'typeCheckedLoadConstVCalls', 'typeCheckedLoadVCalls',
+                'typeid', 'typeidCompatibleVTable', 'typeIdInfo',
+                'typeTestAssumeConstVCalls', 'typeTestAssumeVCalls',
+                'typeTestRes', 'typeTests', 'udiv', 'ueq', 'uge', 'ugt',
+                'uitofp', 'ule', 'ult', 'umax', 'umin', 'undef', 'une',
+                'uniformRetVal', 'uniqueRetVal', 'unknown', 'unnamed_addr',
+                'uno', 'unordered', 'unreachable', 'unsat', 'unwind', 'urem',
+                'uselistorder', 'uselistorder_bb', 'uwtable', 'va_arg',
+                'varFlags', 'variable', 'vcall_visibility', 'vFuncId',
+                'virtFunc', 'virtualConstProp', 'void', 'volatile', 'vscale',
+                'vTableFuncs', 'weak', 'weak_odr', 'webkit_jscc', 'win64cc',
+                'within', 'wpdRes', 'wpdResolutions', 'writeonly', 'x',
+                'x86_64_sysvcc', 'x86_fastcallcc', 'x86_intrcc', 'x86_mmx',
+                'x86_regcallcc', 'x86_stdcallcc', 'x86_thiscallcc',
+                'x86_vectorcallcc', 'xchg', 'xor', 'zeroext',
+                'zeroinitializer', 'zext', 'immarg', 'willreturn'),
+                suffix=r'\b'), Keyword),
+
+            # Types
+            (words(('void', 'half', 'bfloat', 'float', 'double', 'fp128',
+                    'x86_fp80', 'ppc_fp128', 'label', 'metadata', 'x86_mmx',
+                    'x86_amx', 'token', 'ptr')),
+                   Keyword.Type),
+
+            # Integer types
+            (r'i[1-9]\d*', Keyword.Type)
+        ]
+    }
+
+
+class LlvmMirBodyLexer(RegexLexer):
+    """
+    For LLVM MIR examples without the YAML wrapper.
+    """
+    name = 'LLVM-MIR Body'
+    url = 'https://llvm.org/docs/MIRLangRef.html'
+    aliases = ['llvm-mir-body']
+    filenames = []
+    mimetypes = []
+    version_added = '2.6'
+
+    tokens = {
+        'root': [
+            # Attributes on basic blocks
+            (words(('liveins', 'successors'), suffix=':'), Keyword),
+            # Basic Block Labels
+            (r'bb\.[0-9]+(\.[a-zA-Z0-9_.-]+)?( \(address-taken\))?:', Name.Label),
+            (r'bb\.[0-9]+ \(%[a-zA-Z0-9_.-]+\)( \(address-taken\))?:', Name.Label),
+            (r'%bb\.[0-9]+(\.\w+)?', Name.Label),
+            # Stack references
+            (r'%stack\.[0-9]+(\.\w+\.addr)?', Name),
+            # Subreg indices
+            (r'%subreg\.\w+', Name),
+            # Virtual registers
+            (r'%[a-zA-Z0-9_]+ *', Name.Variable, 'vreg'),
+            # Reference to LLVM-IR global
+            include('global'),
+            # Reference to Intrinsic
+            (r'intrinsic\(\@[a-zA-Z0-9_.]+\)', Name.Variable.Global),
+            # Comparison predicates
+            (words(('eq', 'ne', 'sgt', 'sge', 'slt', 'sle', 'ugt', 'uge', 'ult',
+                    'ule'), prefix=r'intpred\(', suffix=r'\)'), Name.Builtin),
+            (words(('oeq', 'one', 'ogt', 'oge', 'olt', 'ole', 'ugt', 'uge',
+                    'ult', 'ule'), prefix=r'floatpred\(', suffix=r'\)'),
+             Name.Builtin),
+            # Physical registers
+            (r'\$\w+', String.Single),
+            # Assignment operator
+            (r'=', Operator),
+            # gMIR Opcodes
+            (r'(G_ANYEXT|G_[SZ]EXT|G_SEXT_INREG|G_TRUNC|G_IMPLICIT_DEF|G_PHI|'
+             r'G_FRAME_INDEX|G_GLOBAL_VALUE|G_INTTOPTR|G_PTRTOINT|G_BITCAST|'
+             r'G_CONSTANT|G_FCONSTANT|G_VASTART|G_VAARG|G_CTLZ|G_CTLZ_ZERO_UNDEF|'
+             r'G_CTTZ|G_CTTZ_ZERO_UNDEF|G_CTPOP|G_BSWAP|G_BITREVERSE|'
+             r'G_ADDRSPACE_CAST|G_BLOCK_ADDR|G_JUMP_TABLE|G_DYN_STACKALLOC|'
+             r'G_ADD|G_SUB|G_MUL|G_[SU]DIV|G_[SU]REM|G_AND|G_OR|G_XOR|G_SHL|'
+             r'G_[LA]SHR|G_[IF]CMP|G_SELECT|G_GEP|G_PTR_MASK|G_SMIN|G_SMAX|'
+             r'G_UMIN|G_UMAX|G_[US]ADDO|G_[US]ADDE|G_[US]SUBO|G_[US]SUBE|'
+             r'G_[US]MULO|G_[US]MULH|G_FNEG|G_FPEXT|G_FPTRUNC|G_FPTO[US]I|'
+             r'G_[US]ITOFP|G_FABS|G_FCOPYSIGN|G_FCANONICALIZE|G_FMINNUM|'
+             r'G_FMAXNUM|G_FMINNUM_IEEE|G_FMAXNUM_IEEE|G_FMINIMUM|G_FMAXIMUM|'
+             r'G_FADD|G_FSUB|G_FMUL|G_FMA|G_FMAD|G_FDIV|G_FREM|G_FPOW|G_FEXP|'
+             r'G_FEXP2|G_FLOG|G_FLOG2|G_FLOG10|G_FCEIL|G_FCOS|G_FSIN|G_FSQRT|'
+             r'G_FFLOOR|G_FRINT|G_FNEARBYINT|G_INTRINSIC_TRUNC|'
+             r'G_INTRINSIC_ROUND|G_LOAD|G_[ZS]EXTLOAD|G_INDEXED_LOAD|'
+             r'G_INDEXED_[ZS]EXTLOAD|G_STORE|G_INDEXED_STORE|'
+             r'G_ATOMIC_CMPXCHG_WITH_SUCCESS|G_ATOMIC_CMPXCHG|'
+             r'G_ATOMICRMW_(XCHG|ADD|SUB|AND|NAND|OR|XOR|MAX|MIN|UMAX|UMIN|FADD|'
+                           r'FSUB)'
+             r'|G_FENCE|G_EXTRACT|G_UNMERGE_VALUES|G_INSERT|G_MERGE_VALUES|'
+             r'G_BUILD_VECTOR|G_BUILD_VECTOR_TRUNC|G_CONCAT_VECTORS|'
+             r'G_INTRINSIC|G_INTRINSIC_W_SIDE_EFFECTS|G_BR|G_BRCOND|'
+             r'G_BRINDIRECT|G_BRJT|G_INSERT_VECTOR_ELT|G_EXTRACT_VECTOR_ELT|'
+             r'G_SHUFFLE_VECTOR)\b',
+             Name.Builtin),
+            # Target independent opcodes
+            (r'(COPY|PHI|INSERT_SUBREG|EXTRACT_SUBREG|REG_SEQUENCE)\b',
+             Name.Builtin),
+            # Flags
+            (words(('killed', 'implicit')), Keyword),
+            # ConstantInt values
+            (r'(i[0-9]+)( +)', bygroups(Keyword.Type, Whitespace), 'constantint'),
+            # ConstantFloat values
+            (r'(half|float|double) +', Keyword.Type, 'constantfloat'),
+            # Bare immediates
+            include('integer'),
+            # MMO's
+            (r'(::)( *)', bygroups(Operator, Whitespace), 'mmo'),
+            # MIR Comments
+            (r';.*', Comment),
+            # If we get here, assume it's a target instruction
+            (r'[a-zA-Z0-9_]+', Name),
+            # Everything else that isn't highlighted
+            (r'[(), \n]+', Text),
+        ],
+        # The integer constant from a ConstantInt value
+        'constantint': [
+            include('integer'),
+            (r'(?=.)', Text, '#pop'),
+        ],
+        # The floating point constant from a ConstantFloat value
+        'constantfloat': [
+            include('float'),
+            (r'(?=.)', Text, '#pop'),
+        ],
+        'vreg': [
+            # The bank or class if there is one
+            (r'( *)(:(?!:))', bygroups(Whitespace, Keyword), ('#pop', 'vreg_bank_or_class')),
+            # The LLT if there is one
+            (r'( *)(\()', bygroups(Whitespace, Text), 'vreg_type'),
+            (r'(?=.)', Text, '#pop'),
+        ],
+        'vreg_bank_or_class': [
+            # The unassigned bank/class
+            (r'( *)(_)', bygroups(Whitespace, Name.Variable.Magic)),
+            (r'( *)([a-zA-Z0-9_]+)', bygroups(Whitespace, Name.Variable)),
+            # The LLT if there is one
+            (r'( *)(\()', bygroups(Whitespace, Text), 'vreg_type'),
+            (r'(?=.)', Text, '#pop'),
+        ],
+        'vreg_type': [
+            # Scalar and pointer types
+            (r'( *)([sp][0-9]+)', bygroups(Whitespace, Keyword.Type)),
+            (r'( *)(<[0-9]+ *x *[sp][0-9]+>)', bygroups(Whitespace, Keyword.Type)),
+            (r'\)', Text, '#pop'),
+            (r'(?=.)', Text, '#pop'),
+        ],
+        'mmo': [
+            (r'\(', Text),
+            (r' +', Whitespace),
+            (words(('load', 'store', 'on', 'into', 'from', 'align', 'monotonic',
+                    'acquire', 'release', 'acq_rel', 'seq_cst')),
+             Keyword),
+            # IR references
+            (r'%ir\.[a-zA-Z0-9_.-]+', Name),
+            (r'%ir-block\.[a-zA-Z0-9_.-]+', Name),
+            (r'[-+]', Operator),
+            include('integer'),
+            include('global'),
+            (r',', Punctuation),
+            (r'\), \(', Text),
+            (r'\)', Text, '#pop'),
+        ],
+        'integer': [(r'-?[0-9]+', Number.Integer),],
+        'float': [(r'-?[0-9]+\.[0-9]+(e[+-][0-9]+)?', Number.Float)],
+        'global': [(r'\@[a-zA-Z0-9_.]+', Name.Variable.Global)],
+    }
+
+
+class LlvmMirLexer(RegexLexer):
+    """
+    Lexer for the overall LLVM MIR document format.
+
+    MIR is a human readable serialization format that's used to represent LLVM's
+    machine specific intermediate representation. It allows LLVM's developers to
+    see the state of the compilation process at various points, as well as test
+    individual pieces of the compiler.
+    """
+    name = 'LLVM-MIR'
+    url = 'https://llvm.org/docs/MIRLangRef.html'
+    aliases = ['llvm-mir']
+    filenames = ['*.mir']
+    version_added = '2.6'
+
+    tokens = {
+        'root': [
+            # Comments are hashes at the YAML level
+            (r'#.*', Comment),
+            # Documents starting with | are LLVM-IR
+            (r'--- \|$', Keyword, 'llvm_ir'),
+            # Other documents are MIR
+            (r'---', Keyword, 'llvm_mir'),
+            # Consume everything else in one token for efficiency
+            (r'[^-#]+|.', Text),
+        ],
+        'llvm_ir': [
+            # Documents end with '...' or '---'
+            (r'(\.\.\.|(?=---))', Keyword, '#pop'),
+            # Delegate to the LlvmLexer
+            (r'((?:.|\n)+?)(?=(\.\.\.|---))', bygroups(using(LlvmLexer))),
+        ],
+        'llvm_mir': [
+            # Comments are hashes at the YAML level
+            (r'#.*', Comment),
+            # Documents end with '...' or '---'
+            (r'(\.\.\.|(?=---))', Keyword, '#pop'),
+            # Handle the simple attributes
+            (r'name:', Keyword, 'name'),
+            (words(('alignment', ),
+                   suffix=':'), Keyword, 'number'),
+            (words(('legalized', 'regBankSelected', 'tracksRegLiveness',
+                    'selected', 'exposesReturnsTwice'),
+                   suffix=':'), Keyword, 'boolean'),
+            # Handle the attributes don't highlight inside
+            (words(('registers', 'stack', 'fixedStack', 'liveins', 'frameInfo',
+                    'machineFunctionInfo'),
+                   suffix=':'), Keyword),
+            # Delegate the body block to the LlvmMirBodyLexer
+            (r'body: *\|', Keyword, 'llvm_mir_body'),
+            # Consume everything else
+            (r'.+', Text),
+            (r'\n', Whitespace),
+        ],
+        'name': [
+            (r'[^\n]+', Name),
+            default('#pop'),
+        ],
+        'boolean': [
+            (r' *(true|false)', Name.Builtin),
+            default('#pop'),
+        ],
+        'number': [
+            (r' *[0-9]+', Number),
+            default('#pop'),
+        ],
+        'llvm_mir_body': [
+            # Documents end with '...' or '---'.
+            # We have to pop llvm_mir_body and llvm_mir
+            (r'(\.\.\.|(?=---))', Keyword, '#pop:2'),
+            # Delegate the body block to the LlvmMirBodyLexer
+            (r'((?:.|\n)+?)(?=\.\.\.|---)', bygroups(using(LlvmMirBodyLexer))),
+            # The '...' is optional. If we didn't already find it then it isn't
+            # there. There might be a '---' instead though.
+            (r'(?!\.\.\.|---)((?:.|\n)+)', bygroups(using(LlvmMirBodyLexer))),
+        ],
+    }
+
+
+class NasmLexer(RegexLexer):
+    """
+    For Nasm (Intel) assembly code.
+    """
+    name = 'NASM'
+    aliases = ['nasm']
+    filenames = ['*.asm', '*.ASM', '*.nasm']
+    mimetypes = ['text/x-nasm']
+    url = 'https://nasm.us'
+    version_added = ''
+
+    # Tasm uses the same file endings, but TASM is not as common as NASM, so
+    # we prioritize NASM higher by default
+    priority = 1.0
+
+    identifier = r'[a-z$._?][\w$.?#@~]*'
+    hexn = r'(?:0x[0-9a-f]+|$0[0-9a-f]*|[0-9]+[0-9a-f]*h)'
+    octn = r'[0-7]+q'
+    binn = r'[01]+b'
+    decn = r'[0-9]+'
+    floatn = decn + r'\.e?' + decn
+    string = r'"(\\"|[^"\n])*"|' + r"'(\\'|[^'\n])*'|" + r"`(\\`|[^`\n])*`"
+    declkw = r'(?:res|d)[bwdqt]|times'
+    register = (r'(r[0-9][0-5]?[bwd]?|'
+                r'[a-d][lh]|[er]?[a-d]x|[er]?[sb]p|[er]?[sd]i|[c-gs]s|st[0-7]|'
+                r'mm[0-7]|cr[0-4]|dr[0-367]|tr[3-7]|k[0-7]|'
+                r'[xyz]mm(?:[12][0-9]?|3[01]?|[04-9]))\b')
+    wordop = r'seg|wrt|strict|rel|abs'
+    type = r'byte|[dq]?word'
+    # Directives must be followed by whitespace, otherwise CPU will match
+    # cpuid for instance.
+    directives = (r'(?:BITS|USE16|USE32|SECTION|SEGMENT|ABSOLUTE|EXTERN|GLOBAL|'
+                  r'ORG|ALIGN|STRUC|ENDSTRUC|COMMON|CPU|GROUP|UPPERCASE|IMPORT|'
+                  r'EXPORT|LIBRARY|MODULE)(?=\s)')
+
+    flags = re.IGNORECASE | re.MULTILINE
+    tokens = {
+        'root': [
+            (r'^\s*%', Comment.Preproc, 'preproc'),
+            include('whitespace'),
+            (identifier + ':', Name.Label),
+            (rf'({identifier})(\s+)(equ)',
+                bygroups(Name.Constant, Whitespace, Keyword.Declaration),
+                'instruction-args'),
+            (directives, Keyword, 'instruction-args'),
+            (declkw, Keyword.Declaration, 'instruction-args'),
+            (identifier, Name.Function, 'instruction-args'),
+            (r'[\r\n]+', Whitespace)
+        ],
+        'instruction-args': [
+            (string, String),
+            (hexn, Number.Hex),
+            (octn, Number.Oct),
+            (binn, Number.Bin),
+            (floatn, Number.Float),
+            (decn, Number.Integer),
+            include('punctuation'),
+            (register, Name.Builtin),
+            (identifier, Name.Variable),
+            (r'[\r\n]+', Whitespace, '#pop'),
+            include('whitespace')
+        ],
+        'preproc': [
+            (r'[^;\n]+', Comment.Preproc),
+            (r';.*?\n', Comment.Single, '#pop'),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'[ \t]+', Whitespace),
+            (r';.*', Comment.Single),
+            (r'#.*', Comment.Single)
+        ],
+        'punctuation': [
+            (r'[,{}():\[\]]+', Punctuation),
+            (r'[&|^<>+*/%~-]+', Operator),
+            (r'[$]+', Keyword.Constant),
+            (wordop, Operator.Word),
+            (type, Keyword.Type)
+        ],
+    }
+
+    def analyse_text(text):
+        # Probably TASM
+        if re.match(r'PROC', text, re.IGNORECASE):
+            return False
+
+
+class NasmObjdumpLexer(ObjdumpLexer):
+    """
+    For the output of ``objdump -d -M intel``.
+    """
+    name = 'objdump-nasm'
+    aliases = ['objdump-nasm']
+    filenames = ['*.objdump-intel']
+    mimetypes = ['text/x-nasm-objdump']
+    url = 'https://www.gnu.org/software/binutils'
+    version_added = '2.0'
+
+    tokens = _objdump_lexer_tokens(NasmLexer)
+
+
+class TasmLexer(RegexLexer):
+    """
+    For Tasm (Turbo Assembler) assembly code.
+    """
+    name = 'TASM'
+    aliases = ['tasm']
+    filenames = ['*.asm', '*.ASM', '*.tasm']
+    mimetypes = ['text/x-tasm']
+    url = 'https://en.wikipedia.org/wiki/Turbo_Assembler'
+    version_added = ''
+
+    identifier = r'[@a-z$._?][\w$.?#@~]*'
+    hexn = r'(?:0x[0-9a-f]+|$0[0-9a-f]*|[0-9]+[0-9a-f]*h)'
+    octn = r'[0-7]+q'
+    binn = r'[01]+b'
+    decn = r'[0-9]+'
+    floatn = decn + r'\.e?' + decn
+    string = r'"(\\"|[^"\n])*"|' + r"'(\\'|[^'\n])*'|" + r"`(\\`|[^`\n])*`"
+    declkw = r'(?:res|d)[bwdqt]|times'
+    register = (r'(r[0-9][0-5]?[bwd]|'
+                r'[a-d][lh]|[er]?[a-d]x|[er]?[sb]p|[er]?[sd]i|[c-gs]s|st[0-7]|'
+                r'mm[0-7]|cr[0-4]|dr[0-367]|tr[3-7])\b')
+    wordop = r'seg|wrt|strict'
+    type = r'byte|[dq]?word'
+    directives = (r'BITS|USE16|USE32|SECTION|SEGMENT|ABSOLUTE|EXTERN|GLOBAL|'
+                  r'ORG|ALIGN|STRUC|ENDSTRUC|ENDS|COMMON|CPU|GROUP|UPPERCASE|INCLUDE|'
+                  r'EXPORT|LIBRARY|MODULE|PROC|ENDP|USES|ARG|DATASEG|UDATASEG|END|IDEAL|'
+                  r'P386|MODEL|ASSUME|CODESEG|SIZE')
+    # T[A-Z][a-z] is more of a convention. Lexer should filter out STRUC definitions
+    # and then 'add' them to datatype somehow.
+    datatype = (r'db|dd|dw|T[A-Z][a-z]+')
+
+    flags = re.IGNORECASE | re.MULTILINE
+    tokens = {
+        'root': [
+            (r'^\s*%', Comment.Preproc, 'preproc'),
+            include('whitespace'),
+            (identifier + ':', Name.Label),
+            (directives, Keyword, 'instruction-args'),
+            (rf'({identifier})(\s+)({datatype})',
+                bygroups(Name.Constant, Whitespace, Keyword.Declaration),
+                'instruction-args'),
+            (declkw, Keyword.Declaration, 'instruction-args'),
+            (identifier, Name.Function, 'instruction-args'),
+            (r'[\r\n]+', Whitespace)
+        ],
+        'instruction-args': [
+            (string, String),
+            (hexn, Number.Hex),
+            (octn, Number.Oct),
+            (binn, Number.Bin),
+            (floatn, Number.Float),
+            (decn, Number.Integer),
+            include('punctuation'),
+            (register, Name.Builtin),
+            (identifier, Name.Variable),
+            # Do not match newline when it's preceded by a backslash
+            (r'(\\)(\s*)(;.*)([\r\n])',
+             bygroups(Text, Whitespace, Comment.Single, Whitespace)),
+            (r'[\r\n]+', Whitespace, '#pop'),
+            include('whitespace')
+        ],
+        'preproc': [
+            (r'[^;\n]+', Comment.Preproc),
+            (r';.*?\n', Comment.Single, '#pop'),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'whitespace': [
+            (r'[\n\r]', Whitespace),
+            (r'(\\)([\n\r])', bygroups(Text, Whitespace)),
+            (r'[ \t]+', Whitespace),
+            (r';.*', Comment.Single)
+        ],
+        'punctuation': [
+            (r'[,():\[\]]+', Punctuation),
+            (r'[&|^<>+*=/%~-]+', Operator),
+            (r'[$]+', Keyword.Constant),
+            (wordop, Operator.Word),
+            (type, Keyword.Type)
+        ],
+    }
+
+    def analyse_text(text):
+        # See above
+        if re.match(r'PROC', text, re.I):
+            return True
+
+
+class Ca65Lexer(RegexLexer):
+    """
+    For ca65 assembler sources.
+    """
+    name = 'ca65 assembler'
+    aliases = ['ca65']
+    filenames = ['*.s']
+    url = 'https://cc65.github.io'
+    version_added = '1.6'
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r';.*', Comment.Single),
+            (r'\s+', Whitespace),
+            (r'[a-z_.@$][\w.@$]*:', Name.Label),
+            (r'((ld|st)[axy]|(in|de)[cxy]|asl|lsr|ro[lr]|adc|sbc|cmp|cp[xy]'
+             r'|cl[cvdi]|se[cdi]|jmp|jsr|bne|beq|bpl|bmi|bvc|bvs|bcc|bcs'
+             r'|p[lh][ap]|rt[is]|brk|nop|ta[xy]|t[xy]a|txs|tsx|and|ora|eor'
+             r'|bit)\b', Keyword),
+            (r'\.\w+', Keyword.Pseudo),
+            (r'[-+~*/^&|!<>=]', Operator),
+            (r'"[^"\n]*.', String),
+            (r"'[^'\n]*.", String.Char),
+            (r'\$[0-9a-f]+|[0-9a-f]+h\b', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'%[01]+', Number.Bin),
+            (r'[#,.:()=\[\]]', Punctuation),
+            (r'[a-z_.@$][\w.@$]*', Name),
+        ]
+    }
+
+    def analyse_text(self, text):
+        # comments in GAS start with "#"
+        if re.search(r'^\s*;', text, re.MULTILINE):
+            return 0.9
+
+
+class Dasm16Lexer(RegexLexer):
+    """
+    For DCPU-16 Assembly.
+    """
+    name = 'DASM16'
+    url = 'http://0x10c.com/doc/dcpu-16.txt'
+    aliases = ['dasm16']
+    filenames = ['*.dasm16', '*.dasm']
+    mimetypes = ['text/x-dasm16']
+    version_added = '2.4'
+
+    INSTRUCTIONS = [
+        'SET',
+        'ADD', 'SUB',
+        'MUL', 'MLI',
+        'DIV', 'DVI',
+        'MOD', 'MDI',
+        'AND', 'BOR', 'XOR',
+        'SHR', 'ASR', 'SHL',
+        'IFB', 'IFC', 'IFE', 'IFN', 'IFG', 'IFA', 'IFL', 'IFU',
+        'ADX', 'SBX',
+        'STI', 'STD',
+        'JSR',
+        'INT', 'IAG', 'IAS', 'RFI', 'IAQ', 'HWN', 'HWQ', 'HWI',
+    ]
+
+    REGISTERS = [
+        'A', 'B', 'C',
+        'X', 'Y', 'Z',
+        'I', 'J',
+        'SP', 'PC', 'EX',
+        'POP', 'PEEK', 'PUSH'
+    ]
+
+    # Regexes yo
+    char = r'[a-zA-Z0-9_$@.]'
+    identifier = r'(?:[a-zA-Z$_]' + char + r'*|\.' + char + '+)'
+    number = r'[+-]?(?:0[xX][a-zA-Z0-9]+|\d+)'
+    binary_number = r'0b[01_]+'
+    instruction = r'(?i)(' + '|'.join(INSTRUCTIONS) + ')'
+    single_char = r"'\\?" + char + "'"
+    string = r'"(\\"|[^"])*"'
+
+    def guess_identifier(lexer, match):
+        ident = match.group(0)
+        klass = Name.Variable if ident.upper() in lexer.REGISTERS else Name.Label
+        yield match.start(), klass, ident
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            (':' + identifier, Name.Label),
+            (identifier + ':', Name.Label),
+            (instruction, Name.Function, 'instruction-args'),
+            (r'\.' + identifier, Name.Function, 'data-args'),
+            (r'[\r\n]+', Whitespace)
+        ],
+
+        'numeric' : [
+            (binary_number, Number.Integer),
+            (number, Number.Integer),
+            (single_char, String),
+        ],
+
+        'arg' : [
+            (identifier, guess_identifier),
+            include('numeric')
+        ],
+
+        'deref' : [
+            (r'\+', Punctuation),
+            (r'\]', Punctuation, '#pop'),
+            include('arg'),
+            include('whitespace')
+        ],
+
+        'instruction-line' : [
+            (r'[\r\n]+', Whitespace, '#pop'),
+            (r';.*?$', Comment, '#pop'),
+            include('whitespace')
+        ],
+
+        'instruction-args': [
+            (r',', Punctuation),
+            (r'\[', Punctuation, 'deref'),
+            include('arg'),
+            include('instruction-line')
+        ],
+
+        'data-args' : [
+            (r',', Punctuation),
+            include('numeric'),
+            (string, String),
+            include('instruction-line')
+        ],
+
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r';.*?\n', Comment)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/asn1.py b/.venv/Lib/site-packages/pygments/lexers/asn1.py
new file mode 100644 (file)
index 0000000..6c7861b
--- /dev/null
@@ -0,0 +1,178 @@
+"""
+    pygments.lexers.asn1
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexers for ASN.1.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.token import  Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+from pygments.lexer import RegexLexer, words, bygroups
+
+__all__ = ['Asn1Lexer']
+
+SINGLE_WORD_KEYWORDS = [
+    "ENCODED",
+    "ABSTRACT-SYNTAX",
+    "END",
+    "APPLICATION",
+    "EXPLICIT",
+    "IMPLICIT",
+    "AUTOMATIC",
+    "TAGS",
+    "BEGIN",
+    "EXTENSIBILITY",
+    "BY",
+    "FROM",
+    "COMPONENT",
+    "UNIVERSAL",
+    "COMPONENTS",
+    "CONSTRAINED",
+    "IMPLIED",
+    "DEFINITIONS",
+    "INCLUDES",
+    "PRIVATE",
+    "WITH",
+    "OF",
+]
+
+OPERATOR_WORDS = [
+    "EXCEPT",
+    "UNION",
+    "INTERSECTION",
+]
+
+SINGLE_WORD_NAMESPACE_KEYWORDS = [
+    "EXPORTS",
+    "IMPORTS",
+]
+
+MULTI_WORDS_DECLARATIONS = [
+    "SEQUENCE OF",
+    "SET OF",
+    "INSTANCE OF",
+    "WITH SYNTAX",
+]
+
+SINGLE_WORDS_DECLARATIONS = [
+    "SIZE",
+    "SEQUENCE",
+    "SET",
+    "CLASS",
+    "UNIQUE",
+    "DEFAULT",
+    "CHOICE",
+    "PATTERN",
+    "OPTIONAL",
+    "PRESENT",
+    "ABSENT",
+    "CONTAINING",
+    "ENUMERATED",
+    "ALL",
+]
+
+TWO_WORDS_TYPES = [
+    "OBJECT IDENTIFIER",
+    "BIT STRING",
+    "OCTET STRING",
+    "CHARACTER STRING",
+    "EMBEDDED PDV",
+]
+
+SINGLE_WORD_TYPES = [
+    "RELATIVE-OID",
+    "TYPE-IDENTIFIER",
+    "ObjectDescriptor",
+    "IA5String",
+    "INTEGER",
+    "ISO646String",
+    "T61String",
+    "BMPString",
+    "NumericString",
+    "TeletexString",
+    "GeneralizedTime",
+    "REAL",
+    "BOOLEAN",
+    "GeneralString",
+    "GraphicString",
+    "UniversalString",
+    "UTCTime",
+    "VisibleString",
+    "UTF8String",
+    "PrintableString",
+    "VideotexString",
+    "EXTERNAL",
+]
+
+
+def word_sequences(tokens):
+    return "(" + '|'.join(token.replace(' ', r'\s+') for token in tokens) + r')\b'
+
+
+class Asn1Lexer(RegexLexer):
+
+    """
+    Lexer for ASN.1 module definition
+    """
+
+    flags = re.MULTILINE
+
+    name = 'ASN.1'
+    aliases = ['asn1']
+    filenames = ["*.asn1"]
+    url = "https://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf"
+    version_added = '2.16'
+
+    tokens = {
+       'root': [
+            # Whitespace:
+            (r'\s+', Whitespace),
+            # Comments:
+            (r'--.*$', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+            #  Numbers:
+            (r'\d+\.\d*([eE][-+]?\d+)?', Number.Float),
+            (r'\d+', Number.Integer),
+            # Identifier:
+            (r"&?[a-z][-a-zA-Z0-9]*[a-zA-Z0-9]\b", Name.Variable),
+            # Constants:
+            (words(("TRUE", "FALSE", "NULL", "MINUS-INFINITY", "PLUS-INFINITY", "MIN", "MAX"), suffix=r'\b'), Keyword.Constant),
+            # Builtin types:
+            (word_sequences(TWO_WORDS_TYPES), Keyword.Type),
+            (words(SINGLE_WORD_TYPES, suffix=r'\b'), Keyword.Type),
+            # Other keywords:
+            (r"EXPORTS\s+ALL\b", Keyword.Namespace),
+            (words(SINGLE_WORD_NAMESPACE_KEYWORDS, suffix=r'\b'), Operator.Namespace),
+            (word_sequences(MULTI_WORDS_DECLARATIONS), Keyword.Declaration),
+            (words(SINGLE_WORDS_DECLARATIONS, suffix=r'\b'), Keyword.Declaration),
+            (words(OPERATOR_WORDS, suffix=r'\b'), Operator.Word),
+            (words(SINGLE_WORD_KEYWORDS), Keyword),
+            # Type identifier:
+            (r"&?[A-Z][-a-zA-Z0-9]*[a-zA-Z0-9]\b", Name.Type),
+            # Operators:
+            (r"(::=|\.\.\.|\.\.|\[\[|\]\]|\||\^)", Operator),
+            # Punctuation:
+            (r"(\.|,|\{|\}|\(|\)|\[|\])", Punctuation),
+            # String:
+            (r'"', String, 'string'),
+            # Binary string:
+            (r"('[01 ]*')(B)\b", bygroups(String, String.Affix)),
+            (r"('[0-9A-F ]*')(H)\b",bygroups(String, String.Affix)),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'string': [
+            (r'""', String),
+            (r'"', String, "#pop"),
+            (r'[^"]', String),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/automation.py b/.venv/Lib/site-packages/pygments/lexers/automation.py
new file mode 100644 (file)
index 0000000..4e9c678
--- /dev/null
@@ -0,0 +1,379 @@
+"""
+    pygments.lexers.automation
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for automation scripting languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, combined
+from pygments.token import Text, Comment, Operator, Name, String, \
+    Number, Punctuation, Generic
+
+__all__ = ['AutohotkeyLexer', 'AutoItLexer']
+
+
+class AutohotkeyLexer(RegexLexer):
+    """
+    For autohotkey source code.
+    """
+    name = 'autohotkey'
+    url = 'http://www.autohotkey.com/'
+    aliases = ['autohotkey', 'ahk']
+    filenames = ['*.ahk', '*.ahkl']
+    mimetypes = ['text/x-autohotkey']
+    version_added = '1.4'
+
+    tokens = {
+        'root': [
+            (r'^(\s*)(/\*)', bygroups(Text, Comment.Multiline), 'incomment'),
+            (r'^(\s*)(\()', bygroups(Text, Generic), 'incontinuation'),
+            (r'\s+;.*?$', Comment.Single),
+            (r'^;.*?$', Comment.Single),
+            (r'[]{}(),;[]', Punctuation),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            (r'\%[a-zA-Z_#@$][\w#@$]*\%', Name.Variable),
+            (r'!=|==|:=|\.=|<<|>>|[-~+/*%=<>&^|?:!.]', Operator),
+            include('commands'),
+            include('labels'),
+            include('builtInFunctions'),
+            include('builtInVariables'),
+            (r'"', String, combined('stringescape', 'dqs')),
+            include('numbers'),
+            (r'[a-zA-Z_#@$][\w#@$]*', Name),
+            (r'\\|\'', Text),
+            (r'\`([,%`abfnrtv\-+;])', String.Escape),
+            include('garbage'),
+        ],
+        'incomment': [
+            (r'^\s*\*/', Comment.Multiline, '#pop'),
+            (r'[^*]+', Comment.Multiline),
+            (r'\*', Comment.Multiline)
+        ],
+        'incontinuation': [
+            (r'^\s*\)', Generic, '#pop'),
+            (r'[^)]', Generic),
+            (r'[)]', Generic),
+        ],
+        'commands': [
+            (r'(?i)^(\s*)(global|local|static|'
+             r'#AllowSameLineComments|#ClipboardTimeout|#CommentFlag|'
+             r'#ErrorStdOut|#EscapeChar|#HotkeyInterval|#HotkeyModifierTimeout|'
+             r'#Hotstring|#IfWinActive|#IfWinExist|#IfWinNotActive|'
+             r'#IfWinNotExist|#IncludeAgain|#Include|#InstallKeybdHook|'
+             r'#InstallMouseHook|#KeyHistory|#LTrim|#MaxHotkeysPerInterval|'
+             r'#MaxMem|#MaxThreads|#MaxThreadsBuffer|#MaxThreadsPerHotkey|'
+             r'#NoEnv|#NoTrayIcon|#Persistent|#SingleInstance|#UseHook|'
+             r'#WinActivateForce|AutoTrim|BlockInput|Break|Click|ClipWait|'
+             r'Continue|Control|ControlClick|ControlFocus|ControlGetFocus|'
+             r'ControlGetPos|ControlGetText|ControlGet|ControlMove|ControlSend|'
+             r'ControlSendRaw|ControlSetText|CoordMode|Critical|'
+             r'DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|'
+             r'DriveSpaceFree|Edit|Else|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|'
+             r'EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|'
+             r'FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|'
+             r'FileDelete|FileGetAttrib|FileGetShortcut|FileGetSize|'
+             r'FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|'
+             r'FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|'
+             r'FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|'
+             r'FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|'
+             r'GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|'
+             r'GuiControlGet|Hotkey|IfEqual|IfExist|IfGreaterOrEqual|IfGreater|'
+             r'IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|'
+             r'IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|'
+             r'IfWinNotExist|If |ImageSearch|IniDelete|IniRead|IniWrite|'
+             r'InputBox|Input|KeyHistory|KeyWait|ListHotkeys|ListLines|'
+             r'ListVars|Loop|Menu|MouseClickDrag|MouseClick|MouseGetPos|'
+             r'MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|'
+             r'PixelSearch|PostMessage|Process|Progress|Random|RegDelete|'
+             r'RegRead|RegWrite|Reload|Repeat|Return|RunAs|RunWait|Run|'
+             r'SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|Send|'
+             r'SetBatchLines|SetCapslockState|SetControlDelay|'
+             r'SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|'
+             r'SetMouseDelay|SetNumlockState|SetScrollLockState|'
+             r'SetStoreCapslockMode|SetTimer|SetTitleMatchMode|'
+             r'SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|'
+             r'SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|'
+             r'SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|'
+             r'SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|'
+             r'StringGetPos|StringLeft|StringLen|StringLower|StringMid|'
+             r'StringReplace|StringRight|StringSplit|StringTrimLeft|'
+             r'StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|'
+             r'Transform|TrayTip|URLDownloadToFile|While|WinActivate|'
+             r'WinActivateBottom|WinClose|WinGetActiveStats|WinGetActiveTitle|'
+             r'WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinGet|WinHide|'
+             r'WinKill|WinMaximize|WinMenuSelectItem|WinMinimizeAllUndo|'
+             r'WinMinimizeAll|WinMinimize|WinMove|WinRestore|WinSetTitle|'
+             r'WinSet|WinShow|WinWaitActive|WinWaitClose|WinWaitNotActive|'
+             r'WinWait)\b', bygroups(Text, Name.Builtin)),
+        ],
+        'builtInFunctions': [
+            (r'(?i)(Abs|ACos|Asc|ASin|ATan|Ceil|Chr|Cos|DllCall|Exp|FileExist|'
+             r'Floor|GetKeyState|IL_Add|IL_Create|IL_Destroy|InStr|IsFunc|'
+             r'IsLabel|Ln|Log|LV_Add|LV_Delete|LV_DeleteCol|LV_GetCount|'
+             r'LV_GetNext|LV_GetText|LV_Insert|LV_InsertCol|LV_Modify|'
+             r'LV_ModifyCol|LV_SetImageList|Mod|NumGet|NumPut|OnMessage|'
+             r'RegExMatch|RegExReplace|RegisterCallback|Round|SB_SetIcon|'
+             r'SB_SetParts|SB_SetText|Sin|Sqrt|StrLen|SubStr|Tan|TV_Add|'
+             r'TV_Delete|TV_GetChild|TV_GetCount|TV_GetNext|TV_Get|'
+             r'TV_GetParent|TV_GetPrev|TV_GetSelection|TV_GetText|TV_Modify|'
+             r'VarSetCapacity|WinActive|WinExist|Object|ComObjActive|'
+             r'ComObjArray|ComObjEnwrap|ComObjUnwrap|ComObjParameter|'
+             r'ComObjType|ComObjConnect|ComObjCreate|ComObjGet|ComObjError|'
+             r'ComObjValue|Insert|MinIndex|MaxIndex|Remove|SetCapacity|'
+             r'GetCapacity|GetAddress|_NewEnum|FileOpen|Read|Write|ReadLine|'
+             r'WriteLine|ReadNumType|WriteNumType|RawRead|RawWrite|Seek|Tell|'
+             r'Close|Next|IsObject|StrPut|StrGet|Trim|LTrim|RTrim)\b',
+             Name.Function),
+        ],
+        'builtInVariables': [
+            (r'(?i)(A_AhkPath|A_AhkVersion|A_AppData|A_AppDataCommon|'
+             r'A_AutoTrim|A_BatchLines|A_CaretX|A_CaretY|A_ComputerName|'
+             r'A_ControlDelay|A_Cursor|A_DDDD|A_DDD|A_DD|A_DefaultMouseSpeed|'
+             r'A_Desktop|A_DesktopCommon|A_DetectHiddenText|'
+             r'A_DetectHiddenWindows|A_EndChar|A_EventInfo|A_ExitReason|'
+             r'A_FormatFloat|A_FormatInteger|A_Gui|A_GuiEvent|A_GuiControl|'
+             r'A_GuiControlEvent|A_GuiHeight|A_GuiWidth|A_GuiX|A_GuiY|A_Hour|'
+             r'A_IconFile|A_IconHidden|A_IconNumber|A_IconTip|A_Index|'
+             r'A_IPAddress1|A_IPAddress2|A_IPAddress3|A_IPAddress4|A_ISAdmin|'
+             r'A_IsCompiled|A_IsCritical|A_IsPaused|A_IsSuspended|A_KeyDelay|'
+             r'A_Language|A_LastError|A_LineFile|A_LineNumber|A_LoopField|'
+             r'A_LoopFileAttrib|A_LoopFileDir|A_LoopFileExt|A_LoopFileFullPath|'
+             r'A_LoopFileLongPath|A_LoopFileName|A_LoopFileShortName|'
+             r'A_LoopFileShortPath|A_LoopFileSize|A_LoopFileSizeKB|'
+             r'A_LoopFileSizeMB|A_LoopFileTimeAccessed|A_LoopFileTimeCreated|'
+             r'A_LoopFileTimeModified|A_LoopReadLine|A_LoopRegKey|'
+             r'A_LoopRegName|A_LoopRegSubkey|A_LoopRegTimeModified|'
+             r'A_LoopRegType|A_MDAY|A_Min|A_MM|A_MMM|A_MMMM|A_Mon|A_MouseDelay|'
+             r'A_MSec|A_MyDocuments|A_Now|A_NowUTC|A_NumBatchLines|A_OSType|'
+             r'A_OSVersion|A_PriorHotkey|A_ProgramFiles|A_Programs|'
+             r'A_ProgramsCommon|A_ScreenHeight|A_ScreenWidth|A_ScriptDir|'
+             r'A_ScriptFullPath|A_ScriptName|A_Sec|A_Space|A_StartMenu|'
+             r'A_StartMenuCommon|A_Startup|A_StartupCommon|A_StringCaseSense|'
+             r'A_Tab|A_Temp|A_ThisFunc|A_ThisHotkey|A_ThisLabel|A_ThisMenu|'
+             r'A_ThisMenuItem|A_ThisMenuItemPos|A_TickCount|A_TimeIdle|'
+             r'A_TimeIdlePhysical|A_TimeSincePriorHotkey|A_TimeSinceThisHotkey|'
+             r'A_TitleMatchMode|A_TitleMatchModeSpeed|A_UserName|A_WDay|'
+             r'A_WinDelay|A_WinDir|A_WorkingDir|A_YDay|A_YEAR|A_YWeek|A_YYYY|'
+             r'Clipboard|ClipboardAll|ComSpec|ErrorLevel|ProgramFiles|True|'
+             r'False|A_IsUnicode|A_FileEncoding|A_OSVersion|A_PtrSize)\b',
+             Name.Variable),
+        ],
+        'labels': [
+            # hotkeys and labels
+            # technically, hotkey names are limited to named keys and buttons
+            (r'(^\s*)([^:\s("]+?:{1,2})', bygroups(Text, Name.Label)),
+            (r'(^\s*)(::[^:\s]+?::)', bygroups(Text, Name.Label)),
+        ],
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+', Number.Float),
+            (r'0\d+', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+', Number.Integer)
+        ],
+        'stringescape': [
+            (r'\"\"|\`([,%`abfnrtv])', String.Escape),
+        ],
+        'strings': [
+            (r'[^"\n]+', String),
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            include('strings')
+        ],
+        'garbage': [
+            (r'[^\S\n]', Text),
+            # (r'.', Text),      # no cheating
+        ],
+    }
+
+
+class AutoItLexer(RegexLexer):
+    """
+    For AutoIt files.
+
+    AutoIt is a freeware BASIC-like scripting language
+    designed for automating the Windows GUI and general scripting
+    """
+    name = 'AutoIt'
+    url = 'http://www.autoitscript.com/site/autoit/'
+    aliases = ['autoit']
+    filenames = ['*.au3']
+    mimetypes = ['text/x-autoit']
+    version_added = '1.6'
+
+    # Keywords, functions, macros from au3.keywords.properties
+    # which can be found in AutoIt installed directory, e.g.
+    # c:\Program Files (x86)\AutoIt3\SciTE\au3.keywords.properties
+
+    keywords = """\
+    #include-once #include #endregion #forcedef #forceref #region
+    and byref case continueloop dim do else elseif endfunc endif
+    endselect exit exitloop for func global
+    if local next not or return select step
+    then to until wend while exit""".split()
+
+    functions = """\
+    abs acos adlibregister adlibunregister asc ascw asin assign atan
+    autoitsetoption autoitwingettitle autoitwinsettitle beep binary binarylen
+    binarymid binarytostring bitand bitnot bitor bitrotate bitshift bitxor
+    blockinput break call cdtray ceiling chr chrw clipget clipput consoleread
+    consolewrite consolewriteerror controlclick controlcommand controldisable
+    controlenable controlfocus controlgetfocus controlgethandle controlgetpos
+    controlgettext controlhide controllistview controlmove controlsend
+    controlsettext controlshow controltreeview cos dec dircopy dircreate
+    dirgetsize dirmove dirremove dllcall dllcalladdress dllcallbackfree
+    dllcallbackgetptr dllcallbackregister dllclose dllopen dllstructcreate
+    dllstructgetdata dllstructgetptr dllstructgetsize dllstructsetdata
+    drivegetdrive drivegetfilesystem drivegetlabel drivegetserial drivegettype
+    drivemapadd drivemapdel drivemapget drivesetlabel drivespacefree
+    drivespacetotal drivestatus envget envset envupdate eval execute exp
+    filechangedir fileclose filecopy filecreatentfslink filecreateshortcut
+    filedelete fileexists filefindfirstfile filefindnextfile fileflush
+    filegetattrib filegetencoding filegetlongname filegetpos filegetshortcut
+    filegetshortname filegetsize filegettime filegetversion fileinstall filemove
+    fileopen fileopendialog fileread filereadline filerecycle filerecycleempty
+    filesavedialog fileselectfolder filesetattrib filesetpos filesettime
+    filewrite filewriteline floor ftpsetproxy guicreate guictrlcreateavi
+    guictrlcreatebutton guictrlcreatecheckbox guictrlcreatecombo
+    guictrlcreatecontextmenu guictrlcreatedate guictrlcreatedummy
+    guictrlcreateedit guictrlcreategraphic guictrlcreategroup guictrlcreateicon
+    guictrlcreateinput guictrlcreatelabel guictrlcreatelist
+    guictrlcreatelistview guictrlcreatelistviewitem guictrlcreatemenu
+    guictrlcreatemenuitem guictrlcreatemonthcal guictrlcreateobj
+    guictrlcreatepic guictrlcreateprogress guictrlcreateradio
+    guictrlcreateslider guictrlcreatetab guictrlcreatetabitem
+    guictrlcreatetreeview guictrlcreatetreeviewitem guictrlcreateupdown
+    guictrldelete guictrlgethandle guictrlgetstate guictrlread guictrlrecvmsg
+    guictrlregisterlistviewsort guictrlsendmsg guictrlsendtodummy
+    guictrlsetbkcolor guictrlsetcolor guictrlsetcursor guictrlsetdata
+    guictrlsetdefbkcolor guictrlsetdefcolor guictrlsetfont guictrlsetgraphic
+    guictrlsetimage guictrlsetlimit guictrlsetonevent guictrlsetpos
+    guictrlsetresizing guictrlsetstate guictrlsetstyle guictrlsettip guidelete
+    guigetcursorinfo guigetmsg guigetstyle guiregistermsg guisetaccelerators
+    guisetbkcolor guisetcoord guisetcursor guisetfont guisethelp guiseticon
+    guisetonevent guisetstate guisetstyle guistartgroup guiswitch hex hotkeyset
+    httpsetproxy httpsetuseragent hwnd inetclose inetget inetgetinfo inetgetsize
+    inetread inidelete iniread inireadsection inireadsectionnames
+    inirenamesection iniwrite iniwritesection inputbox int isadmin isarray
+    isbinary isbool isdeclared isdllstruct isfloat ishwnd isint iskeyword
+    isnumber isobj isptr isstring log memgetstats mod mouseclick mouseclickdrag
+    mousedown mousegetcursor mousegetpos mousemove mouseup mousewheel msgbox
+    number objcreate objcreateinterface objevent objevent objget objname
+    onautoitexitregister onautoitexitunregister opt ping pixelchecksum
+    pixelgetcolor pixelsearch pluginclose pluginopen processclose processexists
+    processgetstats processlist processsetpriority processwait processwaitclose
+    progressoff progresson progressset ptr random regdelete regenumkey
+    regenumval regread regwrite round run runas runaswait runwait send
+    sendkeepactive seterror setextended shellexecute shellexecutewait shutdown
+    sin sleep soundplay soundsetwavevolume splashimageon splashoff splashtexton
+    sqrt srandom statusbargettext stderrread stdinwrite stdioclose stdoutread
+    string stringaddcr stringcompare stringformat stringfromasciiarray
+    stringinstr stringisalnum stringisalpha stringisascii stringisdigit
+    stringisfloat stringisint stringislower stringisspace stringisupper
+    stringisxdigit stringleft stringlen stringlower stringmid stringregexp
+    stringregexpreplace stringreplace stringright stringsplit stringstripcr
+    stringstripws stringtoasciiarray stringtobinary stringtrimleft
+    stringtrimright stringupper tan tcpaccept tcpclosesocket tcpconnect
+    tcplisten tcpnametoip tcprecv tcpsend tcpshutdown tcpstartup timerdiff
+    timerinit tooltip traycreateitem traycreatemenu traygetmsg trayitemdelete
+    trayitemgethandle trayitemgetstate trayitemgettext trayitemsetonevent
+    trayitemsetstate trayitemsettext traysetclick trayseticon traysetonevent
+    traysetpauseicon traysetstate traysettooltip traytip ubound udpbind
+    udpclosesocket udpopen udprecv udpsend udpshutdown udpstartup vargettype
+    winactivate winactive winclose winexists winflash wingetcaretpos
+    wingetclasslist wingetclientsize wingethandle wingetpos wingetprocess
+    wingetstate wingettext wingettitle winkill winlist winmenuselectitem
+    winminimizeall winminimizeallundo winmove winsetontop winsetstate
+    winsettitle winsettrans winwait winwaitactive winwaitclose
+    winwaitnotactive""".split()
+
+    macros = """\
+    @appdatacommondir @appdatadir @autoitexe @autoitpid @autoitversion
+    @autoitx64 @com_eventobj @commonfilesdir @compiled @computername @comspec
+    @cpuarch @cr @crlf @desktopcommondir @desktopdepth @desktopdir
+    @desktopheight @desktoprefresh @desktopwidth @documentscommondir @error
+    @exitcode @exitmethod @extended @favoritescommondir @favoritesdir
+    @gui_ctrlhandle @gui_ctrlid @gui_dragfile @gui_dragid @gui_dropid
+    @gui_winhandle @homedrive @homepath @homeshare @hotkeypressed @hour
+    @ipaddress1 @ipaddress2 @ipaddress3 @ipaddress4 @kblayout @lf
+    @logondnsdomain @logondomain @logonserver @mday @min @mon @msec @muilang
+    @mydocumentsdir @numparams @osarch @osbuild @oslang @osservicepack @ostype
+    @osversion @programfilesdir @programscommondir @programsdir @scriptdir
+    @scriptfullpath @scriptlinenumber @scriptname @sec @startmenucommondir
+    @startmenudir @startupcommondir @startupdir @sw_disable @sw_enable @sw_hide
+    @sw_lock @sw_maximize @sw_minimize @sw_restore @sw_show @sw_showdefault
+    @sw_showmaximized @sw_showminimized @sw_showminnoactive @sw_showna
+    @sw_shownoactivate @sw_shownormal @sw_unlock @systemdir @tab @tempdir
+    @tray_id @trayiconflashing @trayiconvisible @username @userprofiledir @wday
+    @windowsdir @workingdir @yday @year""".split()
+
+    tokens = {
+        'root': [
+            (r';.*\n', Comment.Single),
+            (r'(#comments-start|#cs)(.|\n)*?(#comments-end|#ce)',
+             Comment.Multiline),
+            (r'[\[\]{}(),;]', Punctuation),
+            (r'(and|or|not)\b', Operator.Word),
+            (r'[$|@][a-zA-Z_]\w*', Name.Variable),
+            (r'!=|==|:=|\.=|<<|>>|[-~+/*%=<>&^|?:!.]', Operator),
+            include('commands'),
+            include('labels'),
+            include('builtInFunctions'),
+            include('builtInMarcros'),
+            (r'"', String, combined('stringescape', 'dqs')),
+            (r"'", String, 'sqs'),
+            include('numbers'),
+            (r'[a-zA-Z_#@$][\w#@$]*', Name),
+            (r'\\|\'', Text),
+            (r'\`([,%`abfnrtv\-+;])', String.Escape),
+            (r'_\n', Text),  # Line continuation
+            include('garbage'),
+        ],
+        'commands': [
+            (r'(?i)(\s*)({})\b'.format('|'.join(keywords)),
+             bygroups(Text, Name.Builtin)),
+        ],
+        'builtInFunctions': [
+            (r'(?i)({})\b'.format('|'.join(functions)),
+             Name.Function),
+        ],
+        'builtInMarcros': [
+            (r'(?i)({})\b'.format('|'.join(macros)),
+             Name.Variable.Global),
+        ],
+        'labels': [
+            # sendkeys
+            (r'(^\s*)(\{\S+?\})', bygroups(Text, Name.Label)),
+        ],
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+', Number.Float),
+            (r'0\d+', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+', Number.Integer)
+        ],
+        'stringescape': [
+            (r'\"\"|\`([,%`abfnrtv])', String.Escape),
+        ],
+        'strings': [
+            (r'[^"\n]+', String),
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            include('strings')
+        ],
+        'sqs': [
+            (r'\'\'|\`([,%`abfnrtv])', String.Escape),
+            (r"'", String, '#pop'),
+            (r"[^'\n]+", String)
+        ],
+        'garbage': [
+            (r'[^\S\n]', Text),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/bare.py b/.venv/Lib/site-packages/pygments/lexers/bare.py
new file mode 100644 (file)
index 0000000..d7167dc
--- /dev/null
@@ -0,0 +1,101 @@
+"""
+    pygments.lexers.bare
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the BARE schema.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, bygroups
+from pygments.token import Text, Comment, Keyword, Name, Literal, Whitespace
+
+__all__ = ['BareLexer']
+
+
+class BareLexer(RegexLexer):
+    """
+    For BARE schema source.
+    """
+    name = 'BARE'
+    url = 'https://baremessages.org'
+    filenames = ['*.bare']
+    aliases = ['bare']
+    version_added = '2.7'
+
+    keywords = [
+        'type',
+        'enum',
+        'u8',
+        'u16',
+        'u32',
+        'u64',
+        'uint',
+        'i8',
+        'i16',
+        'i32',
+        'i64',
+        'int',
+        'f32',
+        'f64',
+        'bool',
+        'void',
+        'data',
+        'string',
+        'optional',
+        'map',
+    ]
+
+    tokens = {
+        'root': [
+            (r'(type)(\s+)([A-Z][a-zA-Z0-9]+)(\s+)(\{)',
+             bygroups(Keyword, Whitespace, Name.Class, Whitespace, Text), 'struct'),
+            (r'(type)(\s+)([A-Z][a-zA-Z0-9]+)(\s+)(\()',
+             bygroups(Keyword, Whitespace, Name.Class, Whitespace, Text), 'union'),
+            (r'(type)(\s+)([A-Z][a-zA-Z0-9]+)(\s+)',
+             bygroups(Keyword, Whitespace, Name, Whitespace), 'typedef'),
+            (r'(enum)(\s+)([A-Z][a-zA-Z0-9]+)(\s+\{)',
+             bygroups(Keyword, Whitespace, Name.Class, Whitespace), 'enum'),
+            (r'#.*?$', Comment),
+            (r'\s+', Whitespace),
+        ],
+        'struct': [
+            (r'\{', Text, '#push'),
+            (r'\}', Text, '#pop'),
+            (r'([a-zA-Z0-9]+)(:)(\s*)',
+             bygroups(Name.Attribute, Text, Whitespace), 'typedef'),
+            (r'\s+', Whitespace),
+        ],
+        'union': [
+            (r'\)', Text, '#pop'),
+            (r'(\s*)(\|)(\s*)', bygroups(Whitespace, Text, Whitespace)),
+            (r'[A-Z][a-zA-Z0-9]+', Name.Class),
+            (words(keywords), Keyword),
+            (r'\s+', Whitespace),
+        ],
+        'typedef': [
+            (r'\[\]', Text),
+            (r'#.*?$', Comment, '#pop'),
+            (r'(\[)(\d+)(\])', bygroups(Text, Literal, Text)),
+            (r'<|>', Text),
+            (r'\(', Text, 'union'),
+            (r'(\[)([a-z][a-z-A-Z0-9]+)(\])', bygroups(Text, Keyword, Text)),
+            (r'(\[)([A-Z][a-z-A-Z0-9]+)(\])', bygroups(Text, Name.Class, Text)),
+            (r'([A-Z][a-z-A-Z0-9]+)', Name.Class),
+            (words(keywords), Keyword),
+            (r'\n', Text, '#pop'),
+            (r'\{', Text, 'struct'),
+            (r'\s+', Whitespace),
+            (r'\d+', Literal),
+        ],
+        'enum': [
+            (r'\{', Text, '#push'),
+            (r'\}', Text, '#pop'),
+            (r'([A-Z][A-Z0-9_]*)(\s*=\s*)(\d+)',
+             bygroups(Name.Attribute, Text, Literal)),
+            (r'([A-Z][A-Z0-9_]*)', bygroups(Name.Attribute)),
+            (r'#.*?$', Comment),
+            (r'\s+', Whitespace),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/basic.py b/.venv/Lib/site-packages/pygments/lexers/basic.py
new file mode 100644 (file)
index 0000000..7c9123d
--- /dev/null
@@ -0,0 +1,656 @@
+"""
+    pygments.lexers.basic
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for BASIC like languages (other than VB.net).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, default, words, include
+from pygments.token import Comment, Error, Keyword, Name, Number, \
+    Punctuation, Operator, String, Text, Whitespace
+from pygments.lexers import _vbscript_builtins
+
+
+__all__ = ['BlitzBasicLexer', 'BlitzMaxLexer', 'MonkeyLexer', 'CbmBasicV2Lexer',
+           'QBasicLexer', 'VBScriptLexer', 'BBCBasicLexer']
+
+
+class BlitzMaxLexer(RegexLexer):
+    """
+    For BlitzMax source code.
+    """
+
+    name = 'BlitzMax'
+    url = 'http://blitzbasic.com'
+    aliases = ['blitzmax', 'bmax']
+    filenames = ['*.bmx']
+    mimetypes = ['text/x-bmx']
+    version_added = '1.4'
+
+    bmax_vopwords = r'\b(Shl|Shr|Sar|Mod)\b'
+    bmax_sktypes = r'@{1,2}|[!#$%]'
+    bmax_lktypes = r'\b(Int|Byte|Short|Float|Double|Long)\b'
+    bmax_name = r'[a-z_]\w*'
+    bmax_var = (rf'({bmax_name})(?:(?:([ \t]*)({bmax_sktypes})|([ \t]*:[ \t]*\b(?:Shl|Shr|Sar|Mod)\b)'
+                rf'|([ \t]*)(:)([ \t]*)(?:{bmax_lktypes}|({bmax_name})))(?:([ \t]*)(Ptr))?)')
+    bmax_func = bmax_var + r'?((?:[ \t]|\.\.\n)*)([(])'
+
+    flags = re.MULTILINE | re.IGNORECASE
+    tokens = {
+        'root': [
+            # Text
+            (r'\s+', Whitespace),
+            (r'(\.\.)(\n)', bygroups(Text, Whitespace)),  # Line continuation
+            # Comments
+            (r"'.*?\n", Comment.Single),
+            (r'([ \t]*)\bRem\n(\n|.)*?\s*\bEnd([ \t]*)Rem', Comment.Multiline),
+            # Data types
+            ('"', String.Double, 'string'),
+            # Numbers
+            (r'[0-9]+\.[0-9]*(?!\.)', Number.Float),
+            (r'\.[0-9]*(?!\.)', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'\$[0-9a-f]+', Number.Hex),
+            (r'\%[10]+', Number.Bin),
+            # Other
+            (rf'(?:(?:(:)?([ \t]*)(:?{bmax_vopwords}|([+\-*/&|~]))|Or|And|Not|[=<>^]))', Operator),
+            (r'[(),.:\[\]]', Punctuation),
+            (r'(?:#[\w \t]*)', Name.Label),
+            (r'(?:\?[\w \t]*)', Comment.Preproc),
+            # Identifiers
+            (rf'\b(New)\b([ \t]?)([(]?)({bmax_name})',
+             bygroups(Keyword.Reserved, Whitespace, Punctuation, Name.Class)),
+            (rf'\b(Import|Framework|Module)([ \t]+)({bmax_name}\.{bmax_name})',
+             bygroups(Keyword.Reserved, Whitespace, Keyword.Namespace)),
+            (bmax_func, bygroups(Name.Function, Whitespace, Keyword.Type,
+                                 Operator, Whitespace, Punctuation, Whitespace,
+                                 Keyword.Type, Name.Class, Whitespace,
+                                 Keyword.Type, Whitespace, Punctuation)),
+            (bmax_var, bygroups(Name.Variable, Whitespace, Keyword.Type, Operator,
+                                Whitespace, Punctuation, Whitespace, Keyword.Type,
+                                Name.Class, Whitespace, Keyword.Type)),
+            (rf'\b(Type|Extends)([ \t]+)({bmax_name})',
+             bygroups(Keyword.Reserved, Whitespace, Name.Class)),
+            # Keywords
+            (r'\b(Ptr)\b', Keyword.Type),
+            (r'\b(Pi|True|False|Null|Self|Super)\b', Keyword.Constant),
+            (r'\b(Local|Global|Const|Field)\b', Keyword.Declaration),
+            (words((
+                'TNullMethodException', 'TNullFunctionException',
+                'TNullObjectException', 'TArrayBoundsException',
+                'TRuntimeException'), prefix=r'\b', suffix=r'\b'), Name.Exception),
+            (words((
+                'Strict', 'SuperStrict', 'Module', 'ModuleInfo',
+                'End', 'Return', 'Continue', 'Exit', 'Public', 'Private',
+                'Var', 'VarPtr', 'Chr', 'Len', 'Asc', 'SizeOf', 'Sgn', 'Abs', 'Min', 'Max',
+                'New', 'Release', 'Delete', 'Incbin', 'IncbinPtr', 'IncbinLen',
+                'Framework', 'Include', 'Import', 'Extern', 'EndExtern',
+                'Function', 'EndFunction', 'Type', 'EndType', 'Extends', 'Method', 'EndMethod',
+                'Abstract', 'Final', 'If', 'Then', 'Else', 'ElseIf', 'EndIf',
+                'For', 'To', 'Next', 'Step', 'EachIn', 'While', 'Wend', 'EndWhile',
+                'Repeat', 'Until', 'Forever', 'Select', 'Case', 'Default', 'EndSelect',
+                'Try', 'Catch', 'EndTry', 'Throw', 'Assert', 'Goto', 'DefData', 'ReadData',
+                'RestoreData'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+            # Final resolve (for variable names and such)
+            (rf'({bmax_name})', Name.Variable),
+        ],
+        'string': [
+            (r'""', String.Double),
+            (r'"C?', String.Double, '#pop'),
+            (r'[^"]+', String.Double),
+        ],
+    }
+
+
+class BlitzBasicLexer(RegexLexer):
+    """
+    For BlitzBasic source code.
+    """
+
+    name = 'BlitzBasic'
+    url = 'http://blitzbasic.com'
+    aliases = ['blitzbasic', 'b3d', 'bplus']
+    filenames = ['*.bb', '*.decls']
+    mimetypes = ['text/x-bb']
+    version_added = '2.0'
+
+    bb_sktypes = r'@{1,2}|[#$%]'
+    bb_name = r'[a-z]\w*'
+    bb_var = (rf'({bb_name})(?:([ \t]*)({bb_sktypes})|([ \t]*)([.])([ \t]*)(?:({bb_name})))?')
+
+    flags = re.MULTILINE | re.IGNORECASE
+    tokens = {
+        'root': [
+            # Text
+            (r'\s+', Whitespace),
+            # Comments
+            (r";.*?\n", Comment.Single),
+            # Data types
+            ('"', String.Double, 'string'),
+            # Numbers
+            (r'[0-9]+\.[0-9]*(?!\.)', Number.Float),
+            (r'\.[0-9]+(?!\.)', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'\$[0-9a-f]+', Number.Hex),
+            (r'\%[10]+', Number.Bin),
+            # Other
+            (words(('Shl', 'Shr', 'Sar', 'Mod', 'Or', 'And', 'Not',
+                    'Abs', 'Sgn', 'Handle', 'Int', 'Float', 'Str',
+                    'First', 'Last', 'Before', 'After'),
+                   prefix=r'\b', suffix=r'\b'),
+             Operator),
+            (r'([+\-*/~=<>^])', Operator),
+            (r'[(),:\[\]\\]', Punctuation),
+            (rf'\.([ \t]*)({bb_name})', Name.Label),
+            # Identifiers
+            (rf'\b(New)\b([ \t]+)({bb_name})',
+             bygroups(Keyword.Reserved, Whitespace, Name.Class)),
+            (rf'\b(Gosub|Goto)\b([ \t]+)({bb_name})',
+             bygroups(Keyword.Reserved, Whitespace, Name.Label)),
+            (rf'\b(Object)\b([ \t]*)([.])([ \t]*)({bb_name})\b',
+             bygroups(Operator, Whitespace, Punctuation, Whitespace, Name.Class)),
+            (rf'\b{bb_var}\b([ \t]*)(\()',
+             bygroups(Name.Function, Whitespace, Keyword.Type, Whitespace, Punctuation,
+                      Whitespace, Name.Class, Whitespace, Punctuation)),
+            (rf'\b(Function)\b([ \t]+){bb_var}',
+             bygroups(Keyword.Reserved, Whitespace, Name.Function, Whitespace, Keyword.Type,
+                      Whitespace, Punctuation, Whitespace, Name.Class)),
+            (rf'\b(Type)([ \t]+)({bb_name})',
+             bygroups(Keyword.Reserved, Whitespace, Name.Class)),
+            # Keywords
+            (r'\b(Pi|True|False|Null)\b', Keyword.Constant),
+            (r'\b(Local|Global|Const|Field|Dim)\b', Keyword.Declaration),
+            (words((
+                'End', 'Return', 'Exit', 'Chr', 'Len', 'Asc', 'New', 'Delete', 'Insert',
+                'Include', 'Function', 'Type', 'If', 'Then', 'Else', 'ElseIf', 'EndIf',
+                'For', 'To', 'Next', 'Step', 'Each', 'While', 'Wend',
+                'Repeat', 'Until', 'Forever', 'Select', 'Case', 'Default',
+                'Goto', 'Gosub', 'Data', 'Read', 'Restore'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+            # Final resolve (for variable names and such)
+            # (r'(%s)' % (bb_name), Name.Variable),
+            (bb_var, bygroups(Name.Variable, Whitespace, Keyword.Type,
+                              Whitespace, Punctuation, Whitespace, Name.Class)),
+        ],
+        'string': [
+            (r'""', String.Double),
+            (r'"C?', String.Double, '#pop'),
+            (r'[^"\n]+', String.Double),
+        ],
+    }
+
+
+class MonkeyLexer(RegexLexer):
+    """
+    For Monkey source code.
+    """
+
+    name = 'Monkey'
+    aliases = ['monkey']
+    filenames = ['*.monkey']
+    mimetypes = ['text/x-monkey']
+    url = 'https://blitzresearch.itch.io/monkeyx'
+    version_added = '1.6'
+
+    name_variable = r'[a-z_]\w*'
+    name_function = r'[A-Z]\w*'
+    name_constant = r'[A-Z_][A-Z0-9_]*'
+    name_class = r'[A-Z]\w*'
+    name_module = r'[a-z0-9_]*'
+
+    keyword_type = r'(?:Int|Float|String|Bool|Object|Array|Void)'
+    # ? == Bool // % == Int // # == Float // $ == String
+    keyword_type_special = r'[?%#$]'
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            # Text
+            (r'\s+', Whitespace),
+            # Comments
+            (r"'.*", Comment),
+            (r'(?i)^#rem\b', Comment.Multiline, 'comment'),
+            # preprocessor directives
+            (r'(?i)^(?:#If|#ElseIf|#Else|#EndIf|#End|#Print|#Error)\b', Comment.Preproc),
+            # preprocessor variable (any line starting with '#' that is not a directive)
+            (r'^#', Comment.Preproc, 'variables'),
+            # String
+            ('"', String.Double, 'string'),
+            # Numbers
+            (r'[0-9]+\.[0-9]*(?!\.)', Number.Float),
+            (r'\.[0-9]+(?!\.)', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'\$[0-9a-fA-Z]+', Number.Hex),
+            (r'\%[10]+', Number.Bin),
+            # Native data types
+            (rf'\b{keyword_type}\b', Keyword.Type),
+            # Exception handling
+            (r'(?i)\b(?:Try|Catch|Throw)\b', Keyword.Reserved),
+            (r'Throwable', Name.Exception),
+            # Builtins
+            (r'(?i)\b(?:Null|True|False)\b', Name.Builtin),
+            (r'(?i)\b(?:Self|Super)\b', Name.Builtin.Pseudo),
+            (r'\b(?:HOST|LANG|TARGET|CONFIG)\b', Name.Constant),
+            # Keywords
+            (r'(?i)^(Import)(\s+)(.*)(\n)',
+             bygroups(Keyword.Namespace, Whitespace, Name.Namespace, Whitespace)),
+            (r'(?i)^Strict\b.*\n', Keyword.Reserved),
+            (r'(?i)(Const|Local|Global|Field)(\s+)',
+             bygroups(Keyword.Declaration, Whitespace), 'variables'),
+            (r'(?i)(New|Class|Interface|Extends|Implements)(\s+)',
+             bygroups(Keyword.Reserved, Whitespace), 'classname'),
+            (r'(?i)(Function|Method)(\s+)',
+             bygroups(Keyword.Reserved, Whitespace), 'funcname'),
+            (r'(?i)(?:End|Return|Public|Private|Extern|Property|'
+             r'Final|Abstract)\b', Keyword.Reserved),
+            # Flow Control stuff
+            (r'(?i)(?:If|Then|Else|ElseIf|EndIf|'
+             r'Select|Case|Default|'
+             r'While|Wend|'
+             r'Repeat|Until|Forever|'
+             r'For|To|Until|Step|EachIn|Next|'
+             r'Exit|Continue)(?=\s)', Keyword.Reserved),
+            # not used yet
+            (r'(?i)\b(?:Module|Inline)\b', Keyword.Reserved),
+            # Array
+            (r'[\[\]]', Punctuation),
+            # Other
+            (r'<=|>=|<>|\*=|/=|\+=|-=|&=|~=|\|=|[-&*/^+=<>|~]', Operator),
+            (r'(?i)(?:Not|Mod|Shl|Shr|And|Or)', Operator.Word),
+            (r'[(){}!#,.:]', Punctuation),
+            # catch the rest
+            (rf'{name_constant}\b', Name.Constant),
+            (rf'{name_function}\b', Name.Function),
+            (rf'{name_variable}\b', Name.Variable),
+        ],
+        'funcname': [
+            (rf'(?i){name_function}\b', Name.Function),
+            (r':', Punctuation, 'classname'),
+            (r'\s+', Whitespace),
+            (r'\(', Punctuation, 'variables'),
+            (r'\)', Punctuation, '#pop')
+        ],
+        'classname': [
+            (rf'{name_module}\.', Name.Namespace),
+            (rf'{keyword_type}\b', Keyword.Type),
+            (rf'{name_class}\b', Name.Class),
+            # array (of given size)
+            (r'(\[)(\s*)(\d*)(\s*)(\])',
+             bygroups(Punctuation, Whitespace, Number.Integer, Whitespace, Punctuation)),
+            # generics
+            (r'\s+(?!<)', Whitespace, '#pop'),
+            (r'<', Punctuation, '#push'),
+            (r'>', Punctuation, '#pop'),
+            (r'\n', Whitespace, '#pop'),
+            default('#pop')
+        ],
+        'variables': [
+            (rf'{name_constant}\b', Name.Constant),
+            (rf'{name_variable}\b', Name.Variable),
+            (rf'{keyword_type_special}', Keyword.Type),
+            (r'\s+', Whitespace),
+            (r':', Punctuation, 'classname'),
+            (r',', Punctuation, '#push'),
+            default('#pop')
+        ],
+        'string': [
+            (r'[^"~]+', String.Double),
+            (r'~q|~n|~r|~t|~z|~~', String.Escape),
+            (r'"', String.Double, '#pop'),
+        ],
+        'comment': [
+            (r'(?i)^#rem.*?', Comment.Multiline, "#push"),
+            (r'(?i)^#end.*?', Comment.Multiline, "#pop"),
+            (r'\n', Comment.Multiline),
+            (r'.+', Comment.Multiline),
+        ],
+    }
+
+
+class CbmBasicV2Lexer(RegexLexer):
+    """
+    For CBM BASIC V2 sources.
+    """
+    name = 'CBM BASIC V2'
+    aliases = ['cbmbas']
+    filenames = ['*.bas']
+    url = 'https://en.wikipedia.org/wiki/Commodore_BASIC'
+    version_added = '1.6'
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'rem.*\n', Comment.Single),
+            (r'\s+', Whitespace),
+            (r'new|run|end|for|to|next|step|go(to|sub)?|on|return|stop|cont'
+             r'|if|then|input#?|read|wait|load|save|verify|poke|sys|print#?'
+             r'|list|clr|cmd|open|close|get#?', Keyword.Reserved),
+            (r'data|restore|dim|let|def|fn', Keyword.Declaration),
+            (r'tab|spc|sgn|int|abs|usr|fre|pos|sqr|rnd|log|exp|cos|sin|tan|atn'
+             r'|peek|len|val|asc|(str|chr|left|right|mid)\$', Name.Builtin),
+            (r'[-+*/^<>=]', Operator),
+            (r'not|and|or', Operator.Word),
+            (r'"[^"\n]*.', String),
+            (r'\d+|[-+]?\d*\.\d*(e[-+]?\d+)?', Number.Float),
+            (r'[(),:;]', Punctuation),
+            (r'\w+[$%]?', Name),
+        ]
+    }
+
+    def analyse_text(text):
+        # if it starts with a line number, it shouldn't be a "modern" Basic
+        # like VB.net
+        if re.match(r'^\d+', text):
+            return 0.2
+
+
+class QBasicLexer(RegexLexer):
+    """
+    For QBasic source code.
+    """
+
+    name = 'QBasic'
+    aliases = ['qbasic', 'basic']
+    filenames = ['*.BAS', '*.bas']
+    mimetypes = ['text/basic']
+    url = 'https://en.wikipedia.org/wiki/QBasic'
+    version_added = '2.0'
+
+    declarations = ('DATA', 'LET')
+
+    functions = (
+        'ABS', 'ASC', 'ATN', 'CDBL', 'CHR$', 'CINT', 'CLNG',
+        'COMMAND$', 'COS', 'CSNG', 'CSRLIN', 'CVD', 'CVDMBF', 'CVI',
+        'CVL', 'CVS', 'CVSMBF', 'DATE$', 'ENVIRON$', 'EOF', 'ERDEV',
+        'ERDEV$', 'ERL', 'ERR', 'EXP', 'FILEATTR', 'FIX', 'FRE',
+        'FREEFILE', 'HEX$', 'INKEY$', 'INP', 'INPUT$', 'INSTR', 'INT',
+        'IOCTL$', 'LBOUND', 'LCASE$', 'LEFT$', 'LEN', 'LOC', 'LOF',
+        'LOG', 'LPOS', 'LTRIM$', 'MID$', 'MKD$', 'MKDMBF$', 'MKI$',
+        'MKL$', 'MKS$', 'MKSMBF$', 'OCT$', 'PEEK', 'PEN', 'PLAY',
+        'PMAP', 'POINT', 'POS', 'RIGHT$', 'RND', 'RTRIM$', 'SADD',
+        'SCREEN', 'SEEK', 'SETMEM', 'SGN', 'SIN', 'SPACE$', 'SPC',
+        'SQR', 'STICK', 'STR$', 'STRIG', 'STRING$', 'TAB', 'TAN',
+        'TIME$', 'TIMER', 'UBOUND', 'UCASE$', 'VAL', 'VARPTR',
+        'VARPTR$', 'VARSEG'
+    )
+
+    metacommands = ('$DYNAMIC', '$INCLUDE', '$STATIC')
+
+    operators = ('AND', 'EQV', 'IMP', 'NOT', 'OR', 'XOR')
+
+    statements = (
+        'BEEP', 'BLOAD', 'BSAVE', 'CALL', 'CALL ABSOLUTE',
+        'CALL INTERRUPT', 'CALLS', 'CHAIN', 'CHDIR', 'CIRCLE', 'CLEAR',
+        'CLOSE', 'CLS', 'COLOR', 'COM', 'COMMON', 'CONST', 'DATA',
+        'DATE$', 'DECLARE', 'DEF FN', 'DEF SEG', 'DEFDBL', 'DEFINT',
+        'DEFLNG', 'DEFSNG', 'DEFSTR', 'DEF', 'DIM', 'DO', 'LOOP',
+        'DRAW', 'END', 'ENVIRON', 'ERASE', 'ERROR', 'EXIT', 'FIELD',
+        'FILES', 'FOR', 'NEXT', 'FUNCTION', 'GET', 'GOSUB', 'GOTO',
+        'IF', 'THEN', 'INPUT', 'INPUT #', 'IOCTL', 'KEY', 'KEY',
+        'KILL', 'LET', 'LINE', 'LINE INPUT', 'LINE INPUT #', 'LOCATE',
+        'LOCK', 'UNLOCK', 'LPRINT', 'LSET', 'MID$', 'MKDIR', 'NAME',
+        'ON COM', 'ON ERROR', 'ON KEY', 'ON PEN', 'ON PLAY',
+        'ON STRIG', 'ON TIMER', 'ON UEVENT', 'ON', 'OPEN', 'OPEN COM',
+        'OPTION BASE', 'OUT', 'PAINT', 'PALETTE', 'PCOPY', 'PEN',
+        'PLAY', 'POKE', 'PRESET', 'PRINT', 'PRINT #', 'PRINT USING',
+        'PSET', 'PUT', 'PUT', 'RANDOMIZE', 'READ', 'REDIM', 'REM',
+        'RESET', 'RESTORE', 'RESUME', 'RETURN', 'RMDIR', 'RSET', 'RUN',
+        'SCREEN', 'SEEK', 'SELECT CASE', 'SHARED', 'SHELL', 'SLEEP',
+        'SOUND', 'STATIC', 'STOP', 'STRIG', 'SUB', 'SWAP', 'SYSTEM',
+        'TIME$', 'TIMER', 'TROFF', 'TRON', 'TYPE', 'UEVENT', 'UNLOCK',
+        'VIEW', 'WAIT', 'WHILE', 'WEND', 'WIDTH', 'WINDOW', 'WRITE'
+    )
+
+    keywords = (
+        'ACCESS', 'ALIAS', 'ANY', 'APPEND', 'AS', 'BASE', 'BINARY',
+        'BYVAL', 'CASE', 'CDECL', 'DOUBLE', 'ELSE', 'ELSEIF', 'ENDIF',
+        'INTEGER', 'IS', 'LIST', 'LOCAL', 'LONG', 'LOOP', 'MOD',
+        'NEXT', 'OFF', 'ON', 'OUTPUT', 'RANDOM', 'SIGNAL', 'SINGLE',
+        'STEP', 'STRING', 'THEN', 'TO', 'UNTIL', 'USING', 'WEND'
+    )
+
+    tokens = {
+        'root': [
+            (r'\n+', Text),
+            (r'\s+', Text.Whitespace),
+            (r'^(\s*)(\d*)(\s*)(REM .*)$',
+             bygroups(Text.Whitespace, Name.Label, Text.Whitespace,
+                      Comment.Single)),
+            (r'^(\s*)(\d+)(\s*)',
+             bygroups(Text.Whitespace, Name.Label, Text.Whitespace)),
+            (r'(?=[\s]*)(\w+)(?=[\s]*=)', Name.Variable.Global),
+            (r'(?=[^"]*)\'.*$', Comment.Single),
+            (r'"[^\n"]*"', String.Double),
+            (r'(END)(\s+)(FUNCTION|IF|SELECT|SUB)',
+             bygroups(Keyword.Reserved, Text.Whitespace, Keyword.Reserved)),
+            (r'(DECLARE)(\s+)([A-Z]+)(\s+)(\S+)',
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Variable,
+                      Text.Whitespace, Name)),
+            (r'(DIM)(\s+)(SHARED)(\s+)([^\s(]+)',
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Variable,
+                      Text.Whitespace, Name.Variable.Global)),
+            (r'(DIM)(\s+)([^\s(]+)',
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Variable.Global)),
+            (r'^(\s*)([a-zA-Z_]+)(\s*)(\=)',
+             bygroups(Text.Whitespace, Name.Variable.Global, Text.Whitespace,
+                      Operator)),
+            (r'(GOTO|GOSUB)(\s+)(\w+\:?)',
+             bygroups(Keyword.Reserved, Text.Whitespace, Name.Label)),
+            (r'(SUB)(\s+)(\w+\:?)',
+             bygroups(Keyword.Reserved, Text.Whitespace, Name.Label)),
+            include('declarations'),
+            include('functions'),
+            include('metacommands'),
+            include('operators'),
+            include('statements'),
+            include('keywords'),
+            (r'[a-zA-Z_]\w*[$@#&!]', Name.Variable.Global),
+            (r'[a-zA-Z_]\w*\:', Name.Label),
+            (r'\-?\d*\.\d+[@|#]?', Number.Float),
+            (r'\-?\d+[@|#]', Number.Float),
+            (r'\-?\d+#?', Number.Integer.Long),
+            (r'\-?\d+#?', Number.Integer),
+            (r'!=|==|:=|\.=|<<|>>|[-~+/\\*%=<>&^|?:!.]', Operator),
+            (r'[\[\]{}(),;]', Punctuation),
+            (r'[\w]+', Name.Variable.Global),
+        ],
+        # can't use regular \b because of X$()
+        # XXX: use words() here
+        'declarations': [
+            (r'\b({})(?=\(|\b)'.format('|'.join(map(re.escape, declarations))),
+             Keyword.Declaration),
+        ],
+        'functions': [
+            (r'\b({})(?=\(|\b)'.format('|'.join(map(re.escape, functions))),
+             Keyword.Reserved),
+        ],
+        'metacommands': [
+            (r'\b({})(?=\(|\b)'.format('|'.join(map(re.escape, metacommands))),
+             Keyword.Constant),
+        ],
+        'operators': [
+            (r'\b({})(?=\(|\b)'.format('|'.join(map(re.escape, operators))), Operator.Word),
+        ],
+        'statements': [
+            (r'\b({})\b'.format('|'.join(map(re.escape, statements))),
+             Keyword.Reserved),
+        ],
+        'keywords': [
+            (r'\b({})\b'.format('|'.join(keywords)), Keyword),
+        ],
+    }
+
+    def analyse_text(text):
+        if '$DYNAMIC' in text or '$STATIC' in text:
+            return 0.9
+
+
+class VBScriptLexer(RegexLexer):
+    """
+    VBScript is scripting language that is modeled on Visual Basic.
+    """
+    name = 'VBScript'
+    aliases = ['vbscript']
+    filenames = ['*.vbs', '*.VBS']
+    url = 'https://learn.microsoft.com/en-us/previous-versions/t0aew7h6(v=vs.85)'
+    version_added = '2.4'
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r"'[^\n]*", Comment.Single),
+            (r'\s+', Whitespace),
+            ('"', String.Double, 'string'),
+            ('&h[0-9a-f]+', Number.Hex),
+            # Float variant 1, for example: 1., 1.e2, 1.2e3
+            (r'[0-9]+\.[0-9]*(e[+-]?[0-9]+)?', Number.Float),
+            (r'\.[0-9]+(e[+-]?[0-9]+)?', Number.Float),  # Float variant 2, for example: .1, .1e2
+            (r'[0-9]+e[+-]?[0-9]+', Number.Float),  # Float variant 3, for example: 123e45
+            (r'[0-9]+', Number.Integer),
+            ('#.+#', String),  # date or time value
+            (r'(dim)(\s+)([a-z_][a-z0-9_]*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Variable), 'dim_more'),
+            (r'(function|sub)(\s+)([a-z_][a-z0-9_]*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Function)),
+            (r'(class)(\s+)([a-z_][a-z0-9_]*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Class)),
+            (r'(const)(\s+)([a-z_][a-z0-9_]*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Constant)),
+            (r'(end)(\s+)(class|function|if|property|sub|with)',
+             bygroups(Keyword, Whitespace, Keyword)),
+            (r'(on)(\s+)(error)(\s+)(goto)(\s+)(0)',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword, Whitespace, Number.Integer)),
+            (r'(on)(\s+)(error)(\s+)(resume)(\s+)(next)',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword, Whitespace, Keyword)),
+            (r'(option)(\s+)(explicit)', bygroups(Keyword, Whitespace, Keyword)),
+            (r'(property)(\s+)(get|let|set)(\s+)([a-z_][a-z0-9_]*)',
+             bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration, Whitespace, Name.Property)),
+            (r'rem\s.*[^\n]*', Comment.Single),
+            (words(_vbscript_builtins.KEYWORDS, suffix=r'\b'), Keyword),
+            (words(_vbscript_builtins.OPERATORS), Operator),
+            (words(_vbscript_builtins.OPERATOR_WORDS, suffix=r'\b'), Operator.Word),
+            (words(_vbscript_builtins.BUILTIN_CONSTANTS, suffix=r'\b'), Name.Constant),
+            (words(_vbscript_builtins.BUILTIN_FUNCTIONS, suffix=r'\b'), Name.Builtin),
+            (words(_vbscript_builtins.BUILTIN_VARIABLES, suffix=r'\b'), Name.Builtin),
+            (r'[a-z_][a-z0-9_]*', Name),
+            (r'\b_\n', Operator),
+            (words(r'(),.:'), Punctuation),
+            (r'.+(\n)?', Error)
+        ],
+        'dim_more': [
+            (r'(\s*)(,)(\s*)([a-z_][a-z0-9]*)',
+             bygroups(Whitespace, Punctuation, Whitespace, Name.Variable)),
+            default('#pop'),
+        ],
+        'string': [
+            (r'[^"\n]+', String.Double),
+            (r'\"\"', String.Double),
+            (r'"', String.Double, '#pop'),
+            (r'\n', Error, '#pop'),  # Unterminated string
+        ],
+    }
+
+
+class BBCBasicLexer(RegexLexer):
+    """
+    BBC Basic was supplied on the BBC Micro, and later Acorn RISC OS.
+    It is also used by BBC Basic For Windows.
+    """
+    base_keywords = ['OTHERWISE', 'AND', 'DIV', 'EOR', 'MOD', 'OR', 'ERROR',
+                     'LINE', 'OFF', 'STEP', 'SPC', 'TAB', 'ELSE', 'THEN',
+                     'OPENIN', 'PTR', 'PAGE', 'TIME', 'LOMEM', 'HIMEM', 'ABS',
+                     'ACS', 'ADVAL', 'ASC', 'ASN', 'ATN', 'BGET', 'COS', 'COUNT',
+                     'DEG', 'ERL', 'ERR', 'EVAL', 'EXP', 'EXT', 'FALSE', 'FN',
+                     'GET', 'INKEY', 'INSTR', 'INT', 'LEN', 'LN', 'LOG', 'NOT',
+                     'OPENUP', 'OPENOUT', 'PI', 'POINT', 'POS', 'RAD', 'RND',
+                     'SGN', 'SIN', 'SQR', 'TAN', 'TO', 'TRUE', 'USR', 'VAL',
+                     'VPOS', 'CHR$', 'GET$', 'INKEY$', 'LEFT$', 'MID$',
+                     'RIGHT$', 'STR$', 'STRING$', 'EOF', 'PTR', 'PAGE', 'TIME',
+                     'LOMEM', 'HIMEM', 'SOUND', 'BPUT', 'CALL', 'CHAIN', 'CLEAR',
+                     'CLOSE', 'CLG', 'CLS', 'DATA', 'DEF', 'DIM', 'DRAW', 'END',
+                     'ENDPROC', 'ENVELOPE', 'FOR', 'GOSUB', 'GOTO', 'GCOL', 'IF',
+                     'INPUT', 'LET', 'LOCAL', 'MODE', 'MOVE', 'NEXT', 'ON',
+                     'VDU', 'PLOT', 'PRINT', 'PROC', 'READ', 'REM', 'REPEAT',
+                     'REPORT', 'RESTORE', 'RETURN', 'RUN', 'STOP', 'COLOUR',
+                     'TRACE', 'UNTIL', 'WIDTH', 'OSCLI']
+
+    basic5_keywords = ['WHEN', 'OF', 'ENDCASE', 'ENDIF', 'ENDWHILE', 'CASE',
+                       'CIRCLE', 'FILL', 'ORIGIN', 'POINT', 'RECTANGLE', 'SWAP',
+                       'WHILE', 'WAIT', 'MOUSE', 'QUIT', 'SYS', 'INSTALL',
+                       'LIBRARY', 'TINT', 'ELLIPSE', 'BEATS', 'TEMPO', 'VOICES',
+                       'VOICE', 'STEREO', 'OVERLAY', 'APPEND', 'AUTO', 'CRUNCH',
+                       'DELETE', 'EDIT', 'HELP', 'LIST', 'LOAD', 'LVAR', 'NEW',
+                       'OLD', 'RENUMBER', 'SAVE', 'TEXTLOAD', 'TEXTSAVE',
+                       'TWIN', 'TWINO', 'INSTALL', 'SUM', 'BEAT']
+
+
+    name = 'BBC Basic'
+    aliases = ['bbcbasic']
+    filenames = ['*.bbc']
+    url = 'https://www.bbcbasic.co.uk/bbcbasic.html'
+    version_added = '2.4'
+
+    tokens = {
+        'root': [
+            (r"[0-9]+", Name.Label),
+            (r"(\*)([^\n]*)",
+             bygroups(Keyword.Pseudo, Comment.Special)),
+            default('code'),
+        ],
+
+        'code': [
+            (r"(REM)([^\n]*)",
+             bygroups(Keyword.Declaration, Comment.Single)),
+            (r'\n', Whitespace, 'root'),
+            (r'\s+', Whitespace),
+            (r':', Comment.Preproc),
+
+            # Some special cases to make functions come out nicer
+            (r'(DEF)(\s*)(FN|PROC)([A-Za-z_@][\w@]*)',
+             bygroups(Keyword.Declaration, Whitespace,
+                      Keyword.Declaration, Name.Function)),
+            (r'(FN|PROC)([A-Za-z_@][\w@]*)',
+             bygroups(Keyword, Name.Function)),
+
+            (r'(GOTO|GOSUB|THEN|RESTORE)(\s*)(\d+)',
+             bygroups(Keyword, Whitespace, Name.Label)),
+
+            (r'(TRUE|FALSE)', Keyword.Constant),
+            (r'(PAGE|LOMEM|HIMEM|TIME|WIDTH|ERL|ERR|REPORT\$|POS|VPOS|VOICES)',
+             Keyword.Pseudo),
+
+            (words(base_keywords), Keyword),
+            (words(basic5_keywords), Keyword),
+
+            ('"', String.Double, 'string'),
+
+            ('%[01]{1,32}', Number.Bin),
+            ('&[0-9a-f]{1,8}', Number.Hex),
+
+            (r'[+-]?[0-9]+\.[0-9]*(E[+-]?[0-9]+)?', Number.Float),
+            (r'[+-]?\.[0-9]+(E[+-]?[0-9]+)?', Number.Float),
+            (r'[+-]?[0-9]+E[+-]?[0-9]+', Number.Float),
+            (r'[+-]?\d+', Number.Integer),
+
+            (r'([A-Za-z_@][\w@]*[%$]?)', Name.Variable),
+            (r'([+\-]=|[$!|?+\-*/%^=><();]|>=|<=|<>|<<|>>|>>>|,)', Operator),
+        ],
+        'string': [
+            (r'[^"\n]+', String.Double),
+            (r'"', String.Double, '#pop'),
+            (r'\n', Error, 'root'),  # Unterminated string
+        ],
+    }
+
+    def analyse_text(text):
+        if text.startswith('10REM >') or text.startswith('REM >'):
+            return 0.9
diff --git a/.venv/Lib/site-packages/pygments/lexers/bdd.py b/.venv/Lib/site-packages/pygments/lexers/bdd.py
new file mode 100644 (file)
index 0000000..6ddb605
--- /dev/null
@@ -0,0 +1,57 @@
+"""
+    pygments.lexers.bdd
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for BDD(Behavior-driven development).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include
+from pygments.token import Comment, Keyword, Name, String, Number, Text, \
+    Punctuation, Whitespace
+
+__all__ = ['BddLexer']
+
+class BddLexer(RegexLexer):
+    """
+    Lexer for BDD(Behavior-driven development), which highlights not only
+    keywords, but also comments, punctuations, strings, numbers, and variables.
+    """
+
+    name = 'Bdd'
+    aliases = ['bdd']
+    filenames = ['*.feature']
+    mimetypes = ['text/x-bdd']
+    url = 'https://en.wikipedia.org/wiki/Behavior-driven_development'
+    version_added = '2.11'
+
+    step_keywords = (r'Given|When|Then|Add|And|Feature|Scenario Outline|'
+                     r'Scenario|Background|Examples|But')
+
+    tokens = {
+        'comments': [
+            (r'^\s*#.*$', Comment),
+        ],
+        'miscellaneous': [
+            (r'(<|>|\[|\]|=|\||:|\(|\)|\{|\}|,|\.|;|-|_|\$)', Punctuation),
+            (r'((?<=\<)[^\\>]+(?=\>))', Name.Variable),
+            (r'"([^\"]*)"', String),
+            (r'^@\S+', Name.Label),
+        ],
+        'numbers': [
+            (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number),
+        ],
+        'root': [
+            (r'\n|\s+', Whitespace),
+            (step_keywords, Keyword),
+            include('comments'),
+            include('miscellaneous'),
+            include('numbers'),
+            (r'\S+', Text),
+        ]
+    }
+
+    def analyse_text(self, text):
+        return
diff --git a/.venv/Lib/site-packages/pygments/lexers/berry.py b/.venv/Lib/site-packages/pygments/lexers/berry.py
new file mode 100644 (file)
index 0000000..5f772b1
--- /dev/null
@@ -0,0 +1,99 @@
+"""
+    pygments.lexers.berry
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Berry.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include, bygroups
+from pygments.token import Comment, Whitespace, Operator, Keyword, Name, \
+    String, Number, Punctuation
+
+__all__ = ['BerryLexer']
+
+
+class BerryLexer(RegexLexer):
+    """
+    For Berry source code.
+    """
+    name = 'Berry'
+    aliases = ['berry', 'be']
+    filenames = ['*.be']
+    mimetypes = ['text/x-berry', 'application/x-berry']
+    url = 'https://berry-lang.github.io'
+    version_added = '2.12'
+
+    _name = r'\b[^\W\d]\w*'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('numbers'),
+            include('keywords'),
+            (rf'(def)(\s+)({_name})',
+             bygroups(Keyword.Declaration, Whitespace, Name.Function)),
+            (rf'\b(class)(\s+)({_name})',
+             bygroups(Keyword.Declaration, Whitespace, Name.Class)),
+            (rf'\b(import)(\s+)({_name})',
+             bygroups(Keyword.Namespace, Whitespace, Name.Namespace)),
+            include('expr')
+        ],
+        'expr': [
+            (r'[^\S\n]+', Whitespace),
+            (r'\.\.|[~!%^&*+=|?:<>/-]', Operator),
+            (r'[(){}\[\],.;]', Punctuation),
+            include('controls'),
+            include('builtins'),
+            include('funccall'),
+            include('member'),
+            include('name'),
+            include('strings')
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+            (r'#-(.|\n)*?-#', Comment.Multiline),
+            (r'#.*?$', Comment.Single)
+        ],
+        'keywords': [
+            (words((
+                'as', 'break', 'continue', 'import', 'static', 'self', 'super'),
+                suffix=r'\b'), Keyword.Reserved),
+            (r'(true|false|nil)\b', Keyword.Constant),
+            (r'(var|def)\b', Keyword.Declaration)
+        ],
+        'controls': [
+            (words((
+                'if', 'elif', 'else', 'for', 'while', 'do', 'end', 'break',
+                'continue', 'return', 'try', 'except', 'raise'),
+                suffix=r'\b'), Keyword)
+        ],
+        'builtins': [
+            (words((
+                'assert', 'bool', 'input', 'classname', 'classof', 'number', 'real',
+                'bytes', 'compile', 'map', 'list', 'int', 'isinstance', 'print',
+                'range', 'str', 'super', 'module', 'size', 'issubclass', 'open',
+                'file', 'type', 'call'),
+                suffix=r'\b'), Name.Builtin)
+        ],
+        'numbers': [
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'-?\d+', Number.Integer),
+            (r'(-?\d+\.?|\.\d)\d*([eE][+-]?\d+)?', Number.Float)
+        ],
+        'name': [
+            (_name, Name)
+        ],
+        'funccall': [
+            (rf'{_name}(?=\s*\()', Name.Function, '#pop')
+        ],
+        'member': [
+            (rf'(?<=\.){_name}\b(?!\()', Name.Attribute, '#pop')
+        ],
+        'strings': [
+            (r'"([^\\]|\\.)*?"', String.Double, '#pop'),
+            (r'\'([^\\]|\\.)*?\'', String.Single, '#pop')
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/bibtex.py b/.venv/Lib/site-packages/pygments/lexers/bibtex.py
new file mode 100644 (file)
index 0000000..32cc40a
--- /dev/null
@@ -0,0 +1,159 @@
+"""
+    pygments.lexers.bibtex
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for BibTeX bibliography data and styles
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, default, \
+    words
+from pygments.token import Name, Comment, String, Error, Number, Keyword, \
+    Punctuation, Whitespace
+
+__all__ = ['BibTeXLexer', 'BSTLexer']
+
+
+class BibTeXLexer(ExtendedRegexLexer):
+    """
+    A lexer for BibTeX bibliography data format.
+    """
+
+    name = 'BibTeX'
+    aliases = ['bibtex', 'bib']
+    filenames = ['*.bib']
+    mimetypes = ["text/x-bibtex"]
+    version_added = '2.2'
+    flags = re.IGNORECASE
+    url = 'https://texfaq.org/FAQ-BibTeXing'
+
+    ALLOWED_CHARS = r'@!$&*+\-./:;<>?\[\\\]^`|~'
+    IDENTIFIER = '[{}][{}]*'.format('a-z_' + ALLOWED_CHARS, r'\w' + ALLOWED_CHARS)
+
+    def open_brace_callback(self, match, ctx):
+        opening_brace = match.group()
+        ctx.opening_brace = opening_brace
+        yield match.start(), Punctuation, opening_brace
+        ctx.pos = match.end()
+
+    def close_brace_callback(self, match, ctx):
+        closing_brace = match.group()
+        if (
+            ctx.opening_brace == '{' and closing_brace != '}' or
+            ctx.opening_brace == '(' and closing_brace != ')'
+        ):
+            yield match.start(), Error, closing_brace
+        else:
+            yield match.start(), Punctuation, closing_brace
+        del ctx.opening_brace
+        ctx.pos = match.end()
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            (r'@comment(?!ary)', Comment),
+            ('@preamble', Name.Class, ('closing-brace', 'value', 'opening-brace')),
+            ('@string', Name.Class, ('closing-brace', 'field', 'opening-brace')),
+            ('@' + IDENTIFIER, Name.Class,
+             ('closing-brace', 'command-body', 'opening-brace')),
+            ('.+', Comment),
+        ],
+        'opening-brace': [
+            include('whitespace'),
+            (r'[{(]', open_brace_callback, '#pop'),
+        ],
+        'closing-brace': [
+            include('whitespace'),
+            (r'[})]', close_brace_callback, '#pop'),
+        ],
+        'command-body': [
+            include('whitespace'),
+            (r'[^\s\,\}]+', Name.Label, ('#pop', 'fields')),
+        ],
+        'fields': [
+            include('whitespace'),
+            (',', Punctuation, 'field'),
+            default('#pop'),
+        ],
+        'field': [
+            include('whitespace'),
+            (IDENTIFIER, Name.Attribute, ('value', '=')),
+            default('#pop'),
+        ],
+        '=': [
+            include('whitespace'),
+            ('=', Punctuation, '#pop'),
+        ],
+        'value': [
+            include('whitespace'),
+            (IDENTIFIER, Name.Variable),
+            ('"', String, 'quoted-string'),
+            (r'\{', String, 'braced-string'),
+            (r'[\d]+', Number),
+            ('#', Punctuation),
+            default('#pop'),
+        ],
+        'quoted-string': [
+            (r'\{', String, 'braced-string'),
+            ('"', String, '#pop'),
+            (r'[^\{\"]+', String),
+        ],
+        'braced-string': [
+            (r'\{', String, '#push'),
+            (r'\}', String, '#pop'),
+            (r'[^\{\}]+', String),
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+        ],
+    }
+
+
+class BSTLexer(RegexLexer):
+    """
+    A lexer for BibTeX bibliography styles.
+    """
+
+    name = 'BST'
+    aliases = ['bst', 'bst-pybtex']
+    filenames = ['*.bst']
+    version_added = '2.2'
+    flags = re.IGNORECASE | re.MULTILINE
+    url = 'https://texfaq.org/FAQ-BibTeXing'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            (words(['read', 'sort']), Keyword),
+            (words(['execute', 'integers', 'iterate', 'reverse', 'strings']),
+             Keyword, ('group')),
+            (words(['function', 'macro']), Keyword, ('group', 'group')),
+            (words(['entry']), Keyword, ('group', 'group', 'group')),
+        ],
+        'group': [
+            include('whitespace'),
+            (r'\{', Punctuation, ('#pop', 'group-end', 'body')),
+        ],
+        'group-end': [
+            include('whitespace'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'body': [
+            include('whitespace'),
+            (r"\'[^#\"\{\}\s]+", Name.Function),
+            (r'[^#\"\{\}\s]+\$', Name.Builtin),
+            (r'[^#\"\{\}\s]+', Name.Variable),
+            (r'"[^\"]*"', String),
+            (r'#-?\d+', Number),
+            (r'\{', Punctuation, ('group-end', 'body')),
+            default('#pop'),
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+            ('%.*?$', Comment.Single),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/blueprint.py b/.venv/Lib/site-packages/pygments/lexers/blueprint.py
new file mode 100644 (file)
index 0000000..59f9c42
--- /dev/null
@@ -0,0 +1,173 @@
+"""
+    pygments.lexers.blueprint
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Blueprint UI markup language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, words
+from pygments.token import (
+    Comment,
+    Operator,
+    Keyword,
+    Name,
+    String,
+    Number,
+    Punctuation,
+    Whitespace,
+)
+
+__all__ = ["BlueprintLexer"]
+
+
+class BlueprintLexer(RegexLexer):
+    """
+    For Blueprint UI markup.
+    """
+
+    name = "Blueprint"
+    aliases = ["blueprint"]
+    filenames = ["*.blp"]
+    mimetypes = ["text/x-blueprint"]
+    url = "https://gitlab.gnome.org/jwestman/blueprint-compiler"
+    version_added = '2.16'
+
+    flags = re.IGNORECASE
+    tokens = {
+        "root": [
+            include("block-content"),
+        ],
+        "type": [
+            (r"\$\s*[a-z_][a-z0-9_\-]*", Name.Class),
+            (r"(?:([a-z_][a-z0-9_\-]*)(\s*)(\.)(\s*))?([a-z_][a-z0-9_\-]*)",
+             bygroups(Name.Namespace, Whitespace, Punctuation, Whitespace, Name.Class)),
+        ],
+        "whitespace": [
+            (r"\s+", Whitespace),
+            (r"//.*?\n", Comment.Single),
+            (r"/\*", Comment.Multiline, "comment-multiline"),
+        ],
+        "comment-multiline": [
+            (r"\*/", Comment.Multiline, "#pop"),
+            (r"[^*]+", Comment.Multiline),
+            (r"\*", Comment.Multiline),
+        ],
+        "value": [
+            (r"(typeof)(\s*)(<)", bygroups(Keyword, Whitespace, Punctuation), "typeof"),
+            (words(("true", "false", "null")), Keyword.Constant),
+            (r"[a-z_][a-z0-9_\-]*", Name.Variable),
+            (r"\|", Operator),
+            (r'".*?"', String.Double),
+            (r"\'.*?\'", String.Single),
+            (r"0x[\d_]*", Number.Hex),
+            (r"[0-9_]+", Number.Integer),
+            (r"\d[\d\.a-z_]*", Number),
+        ],
+        "typeof": [
+            include("whitespace"),
+            include("type"),
+            (r">", Punctuation, "#pop"),
+        ],
+        "content": [
+            include("whitespace"),
+            # Keywords
+            (words(("after", "bidirectional", "bind-property", "bind", "default",
+                    "destructive", "disabled", "inverted", "no-sync-create",
+                    "suggested", "swapped", "sync-create", "template")),
+             Keyword),
+            # Translated strings
+            (r"(C?_)(\s*)(\()",
+             bygroups(Name.Function.Builtin, Whitespace, Punctuation),
+             "paren-content"),
+            # Cast expressions
+            (r"(as)(\s*)(<)", bygroups(Keyword, Whitespace, Punctuation), "typeof"),
+            # Closures
+            (r"(\$?[a-z_][a-z0-9_\-]*)(\s*)(\()",
+             bygroups(Name.Function, Whitespace, Punctuation),
+             "paren-content"),
+            # Objects
+            (r"(?:(\$\s*[a-z_][a-z0-9_\-]+)|(?:([a-z_][a-z0-9_\-]*)(\s*)(\.)(\s*))?([a-z_][a-z0-9_\-]*))(?:(\s+)([a-z_][a-z0-9_\-]*))?(\s*)(\{)",
+             bygroups(Name.Class, Name.Namespace, Whitespace, Punctuation, Whitespace,
+                      Name.Class, Whitespace, Name.Variable, Whitespace, Punctuation),
+             "brace-block"),
+            # Misc
+            include("value"),
+            (r",|\.", Punctuation),
+        ],
+        "block-content": [
+            # Import statements
+            (r"(using)(\s+)([a-z_][a-z0-9_\-]*)(\s+)(\d[\d\.]*)(;)",
+             bygroups(Keyword, Whitespace, Name.Namespace, Whitespace,
+                      Name.Namespace, Punctuation)),
+            # Menus
+            (r"(menu|section|submenu)(?:(\s+)([a-z_][a-z0-9_\-]*))?(\s*)(\{)",
+             bygroups(Keyword, Whitespace, Name.Variable, Whitespace, Punctuation),
+             "brace-block"),
+            (r"(item)(\s*)(\{)",
+             bygroups(Keyword, Whitespace, Punctuation),
+             "brace-block"),
+            (r"(item)(\s*)(\()",
+             bygroups(Keyword, Whitespace, Punctuation),
+             "paren-block"),
+            # Templates
+            (r"template", Keyword.Declaration, "template"),
+            # Nested blocks. When extensions are added, this is where they go.
+            (r"(responses|items|mime-types|patterns|suffixes|marks|widgets|strings|styles)(\s*)(\[)",
+             bygroups(Keyword, Whitespace, Punctuation),
+             "bracket-block"),
+            (r"(accessibility|setters|layout|item)(\s*)(\{)",
+             bygroups(Keyword, Whitespace, Punctuation),
+             "brace-block"),
+            (r"(condition|mark|item)(\s*)(\()",
+             bygroups(Keyword, Whitespace, Punctuation),
+             "paren-content"),
+            (r"\[", Punctuation, "child-type"),
+            # Properties and signals
+            (r"([a-z_][a-z0-9_\-]*(?:::[a-z0-9_]+)?)(\s*)(:|=>)",
+             bygroups(Name.Property, Whitespace, Punctuation),
+             "statement"),
+            include("content"),
+        ],
+        "paren-block": [
+            include("block-content"),
+            (r"\)", Punctuation, "#pop"),
+        ],
+        "paren-content": [
+            include("content"),
+            (r"\)", Punctuation, "#pop"),
+        ],
+        "bracket-block": [
+            include("block-content"),
+            (r"\]", Punctuation, "#pop"),
+        ],
+        "brace-block": [
+            include("block-content"),
+            (r"\}", Punctuation, "#pop"),
+        ],
+        "statement": [
+            include("content"),
+            (r";", Punctuation, "#pop"),
+        ],
+        "child-type": [
+            include("whitespace"),
+            (r"(action)(\s+)(response)(\s*)(=)(\s*)",
+             bygroups(Keyword, Whitespace, Name.Attribute, Whitespace,
+                      Punctuation, Whitespace)),
+            (words(("default", "internal-child", "response")), Keyword),
+            (r"[a-z_][a-z0-9_\-]*", Name.Decorator),
+            include("value"),
+            (r"=", Punctuation),
+            (r"\]", Punctuation, "#pop"),
+        ],
+        "template": [
+            include("whitespace"),
+            include("type"),
+            (r":", Punctuation),
+            (r"\{", Punctuation, ("#pop", "brace-block")),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/boa.py b/.venv/Lib/site-packages/pygments/lexers/boa.py
new file mode 100644 (file)
index 0000000..6f4e8cd
--- /dev/null
@@ -0,0 +1,97 @@
+"""
+    pygments.lexers.boa
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Boa language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import String, Comment, Keyword, Name, Number, Operator, \
+    Punctuation, Whitespace
+
+__all__ = ['BoaLexer']
+
+
+class BoaLexer(RegexLexer):
+    """
+    Lexer for the Boa language.
+    """
+    name = 'Boa'
+    aliases = ['boa']
+    filenames = ['*.boa']
+    url = 'https://boa.cs.iastate.edu/docs'
+    version_added = '2.4'
+
+    reserved = words(
+        ('input', 'output', 'of', 'weight', 'before', 'after', 'stop',
+         'ifall', 'foreach', 'exists', 'function', 'break', 'switch', 'case',
+         'visitor', 'default', 'return', 'visit', 'while', 'if', 'else'),
+        suffix=r'\b', prefix=r'\b')
+    keywords = words(
+        ('bottom', 'collection', 'maximum', 'mean', 'minimum', 'set', 'sum',
+         'top', 'string', 'int', 'bool', 'float', 'time', 'false', 'true',
+         'array', 'map', 'stack', 'enum', 'type'), suffix=r'\b', prefix=r'\b')
+    classes = words(
+        ('Project', 'ForgeKind', 'CodeRepository', 'Revision', 'RepositoryKind',
+         'ChangedFile', 'FileKind', 'ASTRoot', 'Namespace', 'Declaration', 'Type',
+         'Method', 'Variable', 'Statement', 'Expression', 'Modifier',
+         'StatementKind', 'ExpressionKind', 'ModifierKind', 'Visibility',
+         'TypeKind', 'Person', 'ChangeKind'),
+        suffix=r'\b', prefix=r'\b')
+    operators = ('->', ':=', ':', '=', '<<', '!', '++', '||',
+                 '&&', '+', '-', '*', ">", "<")
+    string_sep = ('`', '\"')
+    built_in_functions = words(
+        (
+            # Array functions
+            'new', 'sort',
+            # Date & Time functions
+            'yearof', 'dayofyear', 'hourof', 'minuteof', 'secondof', 'now',
+            'addday', 'addmonth', 'addweek', 'addyear', 'dayofmonth', 'dayofweek',
+            'dayofyear', 'formattime', 'trunctoday', 'trunctohour', 'trunctominute',
+            'trunctomonth', 'trunctosecond', 'trunctoyear',
+            # Map functions
+            'clear', 'haskey', 'keys', 'lookup', 'remove', 'values',
+            # Math functions
+            'abs', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh',
+            'ceil', 'cos', 'cosh', 'exp', 'floor', 'highbit', 'isfinite', 'isinf',
+            'isnan', 'isnormal', 'log', 'log10', 'max', 'min', 'nrand', 'pow',
+            'rand', 'round', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc',
+            # Other functions
+            'def', 'hash', 'len',
+            # Set functions
+            'add', 'contains', 'remove',
+            # String functions
+            'format', 'lowercase', 'match', 'matchposns', 'matchstrs', 'regex',
+            'split', 'splitall', 'splitn', 'strfind', 'strreplace', 'strrfind',
+            'substring', 'trim', 'uppercase',
+            # Type Conversion functions
+            'bool', 'float', 'int', 'string', 'time',
+            # Domain-Specific functions
+            'getast', 'getsnapshot', 'hasfiletype', 'isfixingrevision', 'iskind',
+            'isliteral',
+        ),
+        prefix=r'\b',
+        suffix=r'\(')
+
+    tokens = {
+        'root': [
+            (r'#.*?$', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (reserved, Keyword.Reserved),
+            (built_in_functions, Name.Function),
+            (keywords, Keyword.Type),
+            (classes, Name.Classes),
+            (words(operators), Operator),
+            (r'[][(),;{}\\.]', Punctuation),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"`(\\\\|\\[^\\]|[^`\\])*`", String.Backtick),
+            (words(string_sep), String.Delimiter),
+            (r'[a-zA-Z_]+', Name.Variable),
+            (r'[0-9]+', Number.Integer),
+            (r'\s+', Whitespace),  # Whitespace
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/bqn.py b/.venv/Lib/site-packages/pygments/lexers/bqn.py
new file mode 100644 (file)
index 0000000..083f69b
--- /dev/null
@@ -0,0 +1,112 @@
+"""
+    pygments.lexers.bqn
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for BQN.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['BQNLexer']
+
+
+class BQNLexer(RegexLexer):
+    """
+    A simple BQN lexer.
+    """
+    name = 'BQN'
+    url = 'https://mlochbaum.github.io/BQN/index.html'
+    aliases = ['bqn']
+    filenames = ['*.bqn']
+    mimetypes = []
+    version_added = '2.16'
+
+    # An inter_word_char. Necessary because \w matches all alphanumeric
+    # Unicode characters, including ones (e.g., 𝕊) that BQN treats special.
+    _iwc = r'((?=[^𝕎𝕏𝔽𝔾𝕊𝕨𝕩𝕗𝕘𝕤𝕣])\w)'
+
+    tokens = {
+        'root': [
+            # Whitespace
+            # ==========
+            (r'\s+', Whitespace),
+            #
+            # Comment
+            # =======
+            # '#' is a comment that continues to the end of the line
+            (r'#.*$', Comment.Single),
+            #
+            # Strings
+            # =======
+            (r'\'((\'\')|[^\'])*\'', String.Single),
+            (r'"(("")|[^"])*"', String.Double),
+            #
+            # Null Character
+            # ==============
+            # Literal representation of the null character
+            (r'@', String.Symbol),
+            #
+            # Punctuation
+            # ===========
+            # This token type is used for diamond, commas
+            # and  array and list brackets and strand syntax
+            (r'[\.⋄,\[\]⟨⟩‿]', Punctuation),
+            #
+            # Expression Grouping
+            # ===================
+            # Since this token type is important in BQN, it is not included in
+            # the punctuation token type but rather in the following one
+            (r'[\(\)]', String.Regex),
+            #
+            # Numbers
+            # =======
+            # Includes the numeric literals and the Nothing character
+            (r'¯?[0-9](([0-9]|_)*\.?([0-9]|_)+|([0-9]|_)*)([Ee][¯]?([0-9]|_)+)?|¯|∞|π|·', Number),
+            #
+            # Variables
+            # =========
+            (r'[a-z]' + _iwc + r'*', Name.Variable),
+            #
+            # 2-Modifiers
+            # ===========
+            # Needs to come before the 1-modifiers due to _𝕣 and _𝕣_
+            (r'[∘○⊸⟜⌾⊘◶⎉⚇⍟⎊]', Name.Property),
+            (r'_(𝕣|[a-zA-Z0-9]+)_', Name.Property),
+            #
+            # 1-Modifiers
+            # ===========
+            (r'[˙˜˘¨⌜⁼´˝`𝕣]', Name.Attribute),
+            (r'_(𝕣|[a-zA-Z0-9]+)', Name.Attribute),
+            #
+            # Functions
+            # =========
+            # The monadic or dyadic function primitives and function
+            # operands and arguments, along with function self-reference
+            (r'[+\-×÷\⋆√⌊⌈∧∨¬|≤<>≥=≠≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!𝕎𝕏𝔽𝔾𝕊]',
+             Operator),
+            (r'[A-Z]' + _iwc + r'*|•' + _iwc + r'+', Operator),
+            #
+            # Constant
+            # ========
+            (r'˙', Name.Constant),
+            #
+            # Define/Export/Change
+            # ====================
+            (r'[←↩⇐]', Keyword.Declaration),
+            #
+            # Blocks
+            # ======
+            (r'[{}]', Keyword.Type),
+            #
+            # Extra characters
+            # ================
+            (r'[;:?𝕨𝕩𝕗𝕘𝕤]', Name.Entity),
+            #
+
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/business.py b/.venv/Lib/site-packages/pygments/lexers/business.py
new file mode 100644 (file)
index 0000000..73adb87
--- /dev/null
@@ -0,0 +1,625 @@
+"""
+    pygments.lexers.business
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for "business-oriented" languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Whitespace
+
+from pygments.lexers._openedge_builtins import OPENEDGEKEYWORDS
+
+__all__ = ['CobolLexer', 'CobolFreeformatLexer', 'ABAPLexer', 'OpenEdgeLexer',
+           'GoodDataCLLexer', 'MaqlLexer']
+
+
+class CobolLexer(RegexLexer):
+    """
+    Lexer for OpenCOBOL code.
+    """
+    name = 'COBOL'
+    aliases = ['cobol']
+    filenames = ['*.cob', '*.COB', '*.cpy', '*.CPY']
+    mimetypes = ['text/x-cobol']
+    url = 'https://en.wikipedia.org/wiki/COBOL'
+    version_added = '1.6'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    # Data Types: by PICTURE and USAGE
+    # Operators: **, *, +, -, /, <, >, <=, >=, =, <>
+    # Logical (?): NOT, AND, OR
+
+    # Reserved words:
+    # http://opencobol.add1tocobol.com/#reserved-words
+    # Intrinsics:
+    # http://opencobol.add1tocobol.com/#does-opencobol-implement-any-intrinsic-functions
+
+    tokens = {
+        'root': [
+            include('comment'),
+            include('strings'),
+            include('core'),
+            include('nums'),
+            (r'[a-z0-9]([\w\-]*[a-z0-9]+)?', Name.Variable),
+            # (r'[\s]+', Text),
+            (r'[ \t]+', Whitespace),
+        ],
+        'comment': [
+            (r'(^.{6}[*/].*\n|^.{6}|\*>.*\n)', Comment),
+        ],
+        'core': [
+            # Figurative constants
+            (r'(^|(?<=[^\w\-]))(ALL\s+)?'
+             r'((ZEROES)|(HIGH-VALUE|LOW-VALUE|QUOTE|SPACE|ZERO)(S)?)'
+             r'\s*($|(?=[^\w\-]))',
+             Name.Constant),
+
+            # Reserved words STATEMENTS and other bolds
+            (words((
+                'ACCEPT', 'ADD', 'ALLOCATE', 'CALL', 'CANCEL', 'CLOSE', 'COMPUTE',
+                'CONFIGURATION', 'CONTINUE', 'DATA', 'DELETE', 'DISPLAY', 'DIVIDE',
+                'DIVISION', 'ELSE', 'END', 'END-ACCEPT',
+                'END-ADD', 'END-CALL', 'END-COMPUTE', 'END-DELETE', 'END-DISPLAY',
+                'END-DIVIDE', 'END-EVALUATE', 'END-IF', 'END-MULTIPLY', 'END-OF-PAGE',
+                'END-PERFORM', 'END-READ', 'END-RETURN', 'END-REWRITE', 'END-SEARCH',
+                'END-START', 'END-STRING', 'END-SUBTRACT', 'END-UNSTRING', 'END-WRITE',
+                'ENVIRONMENT', 'EVALUATE', 'EXIT', 'FD', 'FILE', 'FILE-CONTROL', 'FOREVER',
+                'FREE', 'GENERATE', 'GO', 'GOBACK', 'IDENTIFICATION', 'IF', 'INITIALIZE',
+                'INITIATE', 'INPUT-OUTPUT', 'INSPECT', 'INVOKE', 'I-O-CONTROL', 'LINKAGE',
+                'LOCAL-STORAGE', 'MERGE', 'MOVE', 'MULTIPLY', 'OPEN', 'PERFORM',
+                'PROCEDURE', 'PROGRAM-ID', 'RAISE', 'READ', 'RELEASE', 'RESUME',
+                'RETURN', 'REWRITE', 'SCREEN', 'SD', 'SEARCH', 'SECTION', 'SET',
+                'SORT', 'START', 'STOP', 'STRING', 'SUBTRACT', 'SUPPRESS',
+                'TERMINATE', 'THEN', 'UNLOCK', 'UNSTRING', 'USE', 'VALIDATE',
+                'WORKING-STORAGE', 'WRITE'), prefix=r'(^|(?<=[^\w\-]))',
+                suffix=r'\s*($|(?=[^\w\-]))'),
+             Keyword.Reserved),
+
+            # Reserved words
+            (words((
+                'ACCESS', 'ADDRESS', 'ADVANCING', 'AFTER', 'ALL',
+                'ALPHABET', 'ALPHABETIC', 'ALPHABETIC-LOWER', 'ALPHABETIC-UPPER',
+                'ALPHANUMERIC', 'ALPHANUMERIC-EDITED', 'ALSO', 'ALTER', 'ALTERNATE'
+                'ANY', 'ARE', 'AREA', 'AREAS', 'ARGUMENT-NUMBER', 'ARGUMENT-VALUE', 'AS',
+                'ASCENDING', 'ASSIGN', 'AT', 'AUTO', 'AUTO-SKIP', 'AUTOMATIC',
+                'AUTOTERMINATE', 'BACKGROUND-COLOR', 'BASED', 'BEEP', 'BEFORE', 'BELL',
+                'BLANK', 'BLINK', 'BLOCK', 'BOTTOM', 'BY', 'BYTE-LENGTH', 'CHAINING',
+                'CHARACTER', 'CHARACTERS', 'CLASS', 'CODE', 'CODE-SET', 'COL',
+                'COLLATING', 'COLS', 'COLUMN', 'COLUMNS', 'COMMA', 'COMMAND-LINE',
+                'COMMIT', 'COMMON', 'CONSTANT', 'CONTAINS', 'CONTENT', 'CONTROL',
+                'CONTROLS', 'CONVERTING', 'COPY', 'CORR', 'CORRESPONDING', 'COUNT', 'CRT',
+                'CURRENCY', 'CURSOR', 'CYCLE', 'DATE', 'DAY', 'DAY-OF-WEEK', 'DE',
+                'DEBUGGING', 'DECIMAL-POINT', 'DECLARATIVES', 'DEFAULT', 'DELIMITED',
+                'DELIMITER', 'DEPENDING', 'DESCENDING', 'DETAIL', 'DISK',
+                'DOWN', 'DUPLICATES', 'DYNAMIC', 'EBCDIC',
+                'ENTRY', 'ENVIRONMENT-NAME', 'ENVIRONMENT-VALUE', 'EOL', 'EOP',
+                'EOS', 'ERASE', 'ERROR', 'ESCAPE', 'EXCEPTION',
+                'EXCLUSIVE', 'EXTEND', 'EXTERNAL', 'FILE-ID', 'FILLER', 'FINAL',
+                'FIRST', 'FIXED', 'FLOAT-LONG', 'FLOAT-SHORT',
+                'FOOTING', 'FOR', 'FOREGROUND-COLOR', 'FORMAT', 'FROM', 'FULL',
+                'FUNCTION', 'FUNCTION-ID', 'GIVING', 'GLOBAL', 'GROUP',
+                'HEADING', 'HIGHLIGHT', 'I-O', 'ID',
+                'IGNORE', 'IGNORING', 'IN', 'INDEX', 'INDEXED', 'INDICATE',
+                'INITIAL', 'INITIALIZED', 'INPUT', 'INTO', 'INTRINSIC', 'INVALID',
+                'IS', 'JUST', 'JUSTIFIED', 'KEY', 'LABEL',
+                'LAST', 'LEADING', 'LEFT', 'LENGTH', 'LIMIT', 'LIMITS', 'LINAGE',
+                'LINAGE-COUNTER', 'LINE', 'LINES', 'LOCALE', 'LOCK',
+                'LOWLIGHT', 'MANUAL', 'MEMORY', 'MINUS', 'MODE', 'MULTIPLE',
+                'NATIONAL', 'NATIONAL-EDITED', 'NATIVE', 'NEGATIVE', 'NEXT', 'NO',
+                'NULL', 'NULLS', 'NUMBER', 'NUMBERS', 'NUMERIC', 'NUMERIC-EDITED',
+                'OBJECT-COMPUTER', 'OCCURS', 'OF', 'OFF', 'OMITTED', 'ON', 'ONLY',
+                'OPTIONAL', 'ORDER', 'ORGANIZATION', 'OTHER', 'OUTPUT', 'OVERFLOW',
+                'OVERLINE', 'PACKED-DECIMAL', 'PADDING', 'PAGE', 'PARAGRAPH',
+                'PLUS', 'POINTER', 'POSITION', 'POSITIVE', 'PRESENT', 'PREVIOUS',
+                'PRINTER', 'PRINTING', 'PROCEDURE-POINTER', 'PROCEDURES',
+                'PROCEED', 'PROGRAM', 'PROGRAM-POINTER', 'PROMPT', 'QUOTE',
+                'QUOTES', 'RANDOM', 'RD', 'RECORD', 'RECORDING', 'RECORDS', 'RECURSIVE',
+                'REDEFINES', 'REEL', 'REFERENCE', 'RELATIVE', 'REMAINDER', 'REMOVAL',
+                'RENAMES', 'REPLACING', 'REPORT', 'REPORTING', 'REPORTS', 'REPOSITORY',
+                'REQUIRED', 'RESERVE', 'RETURNING', 'REVERSE-VIDEO', 'REWIND',
+                'RIGHT', 'ROLLBACK', 'ROUNDED', 'RUN', 'SAME', 'SCROLL',
+                'SECURE', 'SEGMENT-LIMIT', 'SELECT', 'SENTENCE', 'SEPARATE',
+                'SEQUENCE', 'SEQUENTIAL', 'SHARING', 'SIGN', 'SIGNED', 'SIGNED-INT',
+                'SIGNED-LONG', 'SIGNED-SHORT', 'SIZE', 'SORT-MERGE', 'SOURCE',
+                'SOURCE-COMPUTER', 'SPECIAL-NAMES', 'STANDARD',
+                'STANDARD-1', 'STANDARD-2', 'STATUS', 'SUBKEY', 'SUM',
+                'SYMBOLIC', 'SYNC', 'SYNCHRONIZED', 'TALLYING', 'TAPE',
+                'TEST', 'THROUGH', 'THRU', 'TIME', 'TIMES', 'TO', 'TOP', 'TRAILING',
+                'TRANSFORM', 'TYPE', 'UNDERLINE', 'UNIT', 'UNSIGNED',
+                'UNSIGNED-INT', 'UNSIGNED-LONG', 'UNSIGNED-SHORT', 'UNTIL', 'UP',
+                'UPDATE', 'UPON', 'USAGE', 'USING', 'VALUE', 'VALUES', 'VARYING',
+                'WAIT', 'WHEN', 'WITH', 'WORDS', 'YYYYDDD', 'YYYYMMDD'),
+                prefix=r'(^|(?<=[^\w\-]))', suffix=r'\s*($|(?=[^\w\-]))'),
+             Keyword.Pseudo),
+
+            # inactive reserved words
+            (words((
+                'ACTIVE-CLASS', 'ALIGNED', 'ANYCASE', 'ARITHMETIC', 'ATTRIBUTE',
+                'B-AND', 'B-NOT', 'B-OR', 'B-XOR', 'BIT', 'BOOLEAN', 'CD', 'CENTER',
+                'CF', 'CH', 'CHAIN', 'CLASS-ID', 'CLASSIFICATION', 'COMMUNICATION',
+                'CONDITION', 'DATA-POINTER', 'DESTINATION', 'DISABLE', 'EC', 'EGI',
+                'EMI', 'ENABLE', 'END-RECEIVE', 'ENTRY-CONVENTION', 'EO', 'ESI',
+                'EXCEPTION-OBJECT', 'EXPANDS', 'FACTORY', 'FLOAT-BINARY-16',
+                'FLOAT-BINARY-34', 'FLOAT-BINARY-7', 'FLOAT-DECIMAL-16',
+                'FLOAT-DECIMAL-34', 'FLOAT-EXTENDED', 'FORMAT', 'FUNCTION-POINTER',
+                'GET', 'GROUP-USAGE', 'IMPLEMENTS', 'INFINITY', 'INHERITS',
+                'INTERFACE', 'INTERFACE-ID', 'INVOKE', 'LC_ALL', 'LC_COLLATE',
+                'LC_CTYPE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC', 'LC_TIME',
+                'LINE-COUNTER', 'MESSAGE', 'METHOD', 'METHOD-ID', 'NESTED', 'NONE',
+                'NORMAL', 'OBJECT', 'OBJECT-REFERENCE', 'OPTIONS', 'OVERRIDE',
+                'PAGE-COUNTER', 'PF', 'PH', 'PROPERTY', 'PROTOTYPE', 'PURGE',
+                'QUEUE', 'RAISE', 'RAISING', 'RECEIVE', 'RELATION', 'REPLACE',
+                'REPRESENTS-NOT-A-NUMBER', 'RESET', 'RESUME', 'RETRY', 'RF', 'RH',
+                'SECONDS', 'SEGMENT', 'SELF', 'SEND', 'SOURCES', 'STATEMENT',
+                'STEP', 'STRONG', 'SUB-QUEUE-1', 'SUB-QUEUE-2', 'SUB-QUEUE-3',
+                'SUPER', 'SYMBOL', 'SYSTEM-DEFAULT', 'TABLE', 'TERMINAL', 'TEXT',
+                'TYPEDEF', 'UCS-4', 'UNIVERSAL', 'USER-DEFAULT', 'UTF-16', 'UTF-8',
+                'VAL-STATUS', 'VALID', 'VALIDATE', 'VALIDATE-STATUS'),
+                   prefix=r'(^|(?<=[^\w\-]))', suffix=r'\s*($|(?=[^\w\-]))'),
+             Error),
+
+            # Data Types
+            (r'(^|(?<=[^\w\-]))'
+             r'(PIC\s+.+?(?=(\s|\.\s))|PICTURE\s+.+?(?=(\s|\.\s))|'
+             r'(COMPUTATIONAL)(-[1-5X])?|(COMP)(-[1-5X])?|'
+             r'BINARY-C-LONG|'
+             r'BINARY-CHAR|BINARY-DOUBLE|BINARY-LONG|BINARY-SHORT|'
+             r'BINARY)\s*($|(?=[^\w\-]))', Keyword.Type),
+
+            # Operators
+            (r'(\*\*|\*|\+|-|/|<=|>=|<|>|==|/=|=)', Operator),
+
+            # (r'(::)', Keyword.Declaration),
+
+            (r'([(),;:&%.])', Punctuation),
+
+            # Intrinsics
+            (r'(^|(?<=[^\w\-]))(ABS|ACOS|ANNUITY|ASIN|ATAN|BYTE-LENGTH|'
+             r'CHAR|COMBINED-DATETIME|CONCATENATE|COS|CURRENT-DATE|'
+             r'DATE-OF-INTEGER|DATE-TO-YYYYMMDD|DAY-OF-INTEGER|DAY-TO-YYYYDDD|'
+             r'EXCEPTION-(?:FILE|LOCATION|STATEMENT|STATUS)|EXP10|EXP|E|'
+             r'FACTORIAL|FRACTION-PART|INTEGER-OF-(?:DATE|DAY|PART)|INTEGER|'
+             r'LENGTH|LOCALE-(?:DATE|TIME(?:-FROM-SECONDS)?)|LOG(?:10)?|'
+             r'LOWER-CASE|MAX|MEAN|MEDIAN|MIDRANGE|MIN|MOD|NUMVAL(?:-C)?|'
+             r'ORD(?:-MAX|-MIN)?|PI|PRESENT-VALUE|RANDOM|RANGE|REM|REVERSE|'
+             r'SECONDS-FROM-FORMATTED-TIME|SECONDS-PAST-MIDNIGHT|SIGN|SIN|SQRT|'
+             r'STANDARD-DEVIATION|STORED-CHAR-LENGTH|SUBSTITUTE(?:-CASE)?|'
+             r'SUM|TAN|TEST-DATE-YYYYMMDD|TEST-DAY-YYYYDDD|TRIM|'
+             r'UPPER-CASE|VARIANCE|WHEN-COMPILED|YEAR-TO-YYYY)\s*'
+             r'($|(?=[^\w\-]))', Name.Function),
+
+            # Booleans
+            (r'(^|(?<=[^\w\-]))(true|false)\s*($|(?=[^\w\-]))', Name.Builtin),
+            # Comparing Operators
+            (r'(^|(?<=[^\w\-]))(equal|equals|ne|lt|le|gt|ge|'
+             r'greater|less|than|not|and|or)\s*($|(?=[^\w\-]))', Operator.Word),
+        ],
+
+        # \"[^\"\n]*\"|\'[^\'\n]*\'
+        'strings': [
+            # apparently strings can be delimited by EOL if they are continued
+            # in the next line
+            (r'"[^"\n]*("|\n)', String.Double),
+            (r"'[^'\n]*('|\n)", String.Single),
+        ],
+
+        'nums': [
+            (r'\d+(\s*|\.$|$)', Number.Integer),
+            (r'[+-]?\d*\.\d+(E[-+]?\d+)?', Number.Float),
+            (r'[+-]?\d+\.\d*(E[-+]?\d+)?', Number.Float),
+        ],
+    }
+
+
+class CobolFreeformatLexer(CobolLexer):
+    """
+    Lexer for Free format OpenCOBOL code.
+    """
+    name = 'COBOLFree'
+    aliases = ['cobolfree']
+    filenames = ['*.cbl', '*.CBL']
+    mimetypes = []
+    url = 'https://opencobol.add1tocobol.com'
+    version_added = '1.6'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'comment': [
+            (r'(\*>.*\n|^\w*\*.*$)', Comment),
+        ],
+    }
+
+
+class ABAPLexer(RegexLexer):
+    """
+    Lexer for ABAP, SAP's integrated language.
+    """
+    name = 'ABAP'
+    aliases = ['abap']
+    filenames = ['*.abap', '*.ABAP']
+    mimetypes = ['text/x-abap']
+    url = 'https://community.sap.com/topics/abap'
+    version_added = '1.1'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'common': [
+            (r'\s+', Whitespace),
+            (r'^\*.*$', Comment.Single),
+            (r'\".*?\n', Comment.Single),
+            (r'##\w+', Comment.Special),
+        ],
+        'variable-names': [
+            (r'<\S+>', Name.Variable),
+            (r'\w[\w~]*(?:(\[\])|->\*)?', Name.Variable),
+        ],
+        'root': [
+            include('common'),
+            # function calls
+            (r'CALL\s+(?:BADI|CUSTOMER-FUNCTION|FUNCTION)',
+             Keyword),
+            (r'(CALL\s+(?:DIALOG|SCREEN|SUBSCREEN|SELECTION-SCREEN|'
+             r'TRANSACTION|TRANSFORMATION))\b',
+             Keyword),
+            (r'(FORM|PERFORM)(\s+)(\w+)',
+             bygroups(Keyword, Whitespace, Name.Function)),
+            (r'(PERFORM)(\s+)(\()(\w+)(\))',
+             bygroups(Keyword, Whitespace, Punctuation, Name.Variable, Punctuation)),
+            (r'(MODULE)(\s+)(\S+)(\s+)(INPUT|OUTPUT)',
+             bygroups(Keyword, Whitespace, Name.Function, Whitespace, Keyword)),
+
+            # method implementation
+            (r'(METHOD)(\s+)([\w~]+)',
+             bygroups(Keyword, Whitespace, Name.Function)),
+            # method calls
+            (r'(\s+)([\w\-]+)([=\-]>)([\w\-~]+)',
+             bygroups(Whitespace, Name.Variable, Operator, Name.Function)),
+            # call methodnames returning style
+            (r'(?<=(=|-)>)([\w\-~]+)(?=\()', Name.Function),
+
+            # text elements
+            (r'(TEXT)(-)(\d{3})',
+             bygroups(Keyword, Punctuation, Number.Integer)),
+            (r'(TEXT)(-)(\w{3})',
+             bygroups(Keyword, Punctuation, Name.Variable)),
+
+            # keywords with dashes in them.
+            # these need to be first, because for instance the -ID part
+            # of MESSAGE-ID wouldn't get highlighted if MESSAGE was
+            # first in the list of keywords.
+            (r'(ADD-CORRESPONDING|AUTHORITY-CHECK|'
+             r'CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|'
+             r'DELETE-ADJACENT|DIVIDE-CORRESPONDING|'
+             r'EDITOR-CALL|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|EXIT-COMMAND|'
+             r'FIELD-GROUPS|FIELD-SYMBOLS|FIELD-SYMBOL|FUNCTION-POOL|'
+             r'INTERFACE-POOL|INVERTED-DATE|'
+             r'LOAD-OF-PROGRAM|LOG-POINT|'
+             r'MESSAGE-ID|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|'
+             r'NEW-LINE|NEW-PAGE|NEW-SECTION|NO-EXTENSION|'
+             r'OUTPUT-LENGTH|PRINT-CONTROL|'
+             r'SELECT-OPTIONS|START-OF-SELECTION|SUBTRACT-CORRESPONDING|'
+             r'SYNTAX-CHECK|SYSTEM-EXCEPTIONS|'
+             r'TYPE-POOL|TYPE-POOLS|NO-DISPLAY'
+             r')\b', Keyword),
+
+            # keyword kombinations
+            (r'(?<![-\>])(CREATE\s+(PUBLIC|PRIVATE|DATA|OBJECT)|'
+             r'(PUBLIC|PRIVATE|PROTECTED)\s+SECTION|'
+             r'(TYPE|LIKE)\s+((LINE\s+OF|REF\s+TO|'
+             r'(SORTED|STANDARD|HASHED)\s+TABLE\s+OF))?|'
+             r'FROM\s+(DATABASE|MEMORY)|CALL\s+METHOD|'
+             r'(GROUP|ORDER) BY|HAVING|SEPARATED BY|'
+             r'GET\s+(BADI|BIT|CURSOR|DATASET|LOCALE|PARAMETER|'
+             r'PF-STATUS|(PROPERTY|REFERENCE)\s+OF|'
+             r'RUN\s+TIME|TIME\s+(STAMP)?)?|'
+             r'SET\s+(BIT|BLANK\s+LINES|COUNTRY|CURSOR|DATASET|EXTENDED\s+CHECK|'
+             r'HANDLER|HOLD\s+DATA|LANGUAGE|LEFT\s+SCROLL-BOUNDARY|'
+             r'LOCALE|MARGIN|PARAMETER|PF-STATUS|PROPERTY\s+OF|'
+             r'RUN\s+TIME\s+(ANALYZER|CLOCK\s+RESOLUTION)|SCREEN|'
+             r'TITLEBAR|UPADTE\s+TASK\s+LOCAL|USER-COMMAND)|'
+             r'CONVERT\s+((INVERTED-)?DATE|TIME|TIME\s+STAMP|TEXT)|'
+             r'(CLOSE|OPEN)\s+(DATASET|CURSOR)|'
+             r'(TO|FROM)\s+(DATA BUFFER|INTERNAL TABLE|MEMORY ID|'
+             r'DATABASE|SHARED\s+(MEMORY|BUFFER))|'
+             r'DESCRIBE\s+(DISTANCE\s+BETWEEN|FIELD|LIST|TABLE)|'
+             r'FREE\s(MEMORY|OBJECT)?|'
+             r'PROCESS\s+(BEFORE\s+OUTPUT|AFTER\s+INPUT|'
+             r'ON\s+(VALUE-REQUEST|HELP-REQUEST))|'
+             r'AT\s+(LINE-SELECTION|USER-COMMAND|END\s+OF|NEW)|'
+             r'AT\s+SELECTION-SCREEN(\s+(ON(\s+(BLOCK|(HELP|VALUE)-REQUEST\s+FOR|'
+             r'END\s+OF|RADIOBUTTON\s+GROUP))?|OUTPUT))?|'
+             r'SELECTION-SCREEN:?\s+((BEGIN|END)\s+OF\s+((TABBED\s+)?BLOCK|LINE|'
+             r'SCREEN)|COMMENT|FUNCTION\s+KEY|'
+             r'INCLUDE\s+BLOCKS|POSITION|PUSHBUTTON|'
+             r'SKIP|ULINE)|'
+             r'LEAVE\s+(LIST-PROCESSING|PROGRAM|SCREEN|'
+             r'TO LIST-PROCESSING|TO TRANSACTION)'
+             r'(ENDING|STARTING)\s+AT|'
+             r'FORMAT\s+(COLOR|INTENSIFIED|INVERSE|HOTSPOT|INPUT|FRAMES|RESET)|'
+             r'AS\s+(CHECKBOX|SUBSCREEN|WINDOW)|'
+             r'WITH\s+(((NON-)?UNIQUE)?\s+KEY|FRAME)|'
+             r'(BEGIN|END)\s+OF|'
+             r'DELETE(\s+ADJACENT\s+DUPLICATES\sFROM)?|'
+             r'COMPARING(\s+ALL\s+FIELDS)?|'
+             r'(INSERT|APPEND)(\s+INITIAL\s+LINE\s+(IN)?TO|\s+LINES\s+OF)?|'
+             r'IN\s+((BYTE|CHARACTER)\s+MODE|PROGRAM)|'
+             r'END-OF-(DEFINITION|PAGE|SELECTION)|'
+             r'WITH\s+FRAME(\s+TITLE)|'
+             r'(REPLACE|FIND)\s+((FIRST|ALL)\s+OCCURRENCES?\s+OF\s+)?(SUBSTRING|REGEX)?|'
+             r'MATCH\s+(LENGTH|COUNT|LINE|OFFSET)|'
+             r'(RESPECTING|IGNORING)\s+CASE|'
+             r'IN\s+UPDATE\s+TASK|'
+             r'(SOURCE|RESULT)\s+(XML)?|'
+             r'REFERENCE\s+INTO|'
+
+             # simple kombinations
+             r'AND\s+(MARK|RETURN)|CLIENT\s+SPECIFIED|CORRESPONDING\s+FIELDS\s+OF|'
+             r'IF\s+FOUND|FOR\s+EVENT|INHERITING\s+FROM|LEAVE\s+TO\s+SCREEN|'
+             r'LOOP\s+AT\s+(SCREEN)?|LOWER\s+CASE|MATCHCODE\s+OBJECT|MODIF\s+ID|'
+             r'MODIFY\s+SCREEN|NESTING\s+LEVEL|NO\s+INTERVALS|OF\s+STRUCTURE|'
+             r'RADIOBUTTON\s+GROUP|RANGE\s+OF|REF\s+TO|SUPPRESS DIALOG|'
+             r'TABLE\s+OF|UPPER\s+CASE|TRANSPORTING\s+NO\s+FIELDS|'
+             r'VALUE\s+CHECK|VISIBLE\s+LENGTH|HEADER\s+LINE|COMMON\s+PART)\b', Keyword),
+
+            # single word keywords.
+            (r'(^|(?<=(\s|\.)))(ABBREVIATED|ABSTRACT|ADD|ALIASES|ALIGN|ALPHA|'
+             r'ASSERT|AS|ASSIGN(ING)?|AT(\s+FIRST)?|'
+             r'BACK|BLOCK|BREAK-POINT|'
+             r'CASE|CAST|CATCH|CHANGING|CHECK|CLASS|CLEAR|COLLECT|COLOR|COMMIT|COND|CONV|'
+             r'CREATE|COMMUNICATION|COMPONENTS?|COMPUTE|CONCATENATE|CONDENSE|'
+             r'CONSTANTS|CONTEXTS|CONTINUE|CONTROLS|COUNTRY|CURRENCY|'
+             r'DATA|DATE|DECIMALS|DEFAULT|DEFINE|DEFINITION|DEFERRED|DEMAND|'
+             r'DETAIL|DIRECTORY|DIVIDE|DO|DUMMY|'
+             r'ELSE(IF)?|ENDAT|ENDCASE|ENDCATCH|ENDCLASS|ENDDO|ENDFORM|ENDFUNCTION|'
+             r'ENDIF|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDSELECT|ENDTRY|ENDWHILE|'
+             r'ENHANCEMENT|EVENTS|EXACT|EXCEPTIONS?|EXIT|EXPONENT|EXPORT|EXPORTING|EXTRACT|'
+             r'FETCH|FIELDS?|FOR|FORM|FORMAT|FREE|FROM|FUNCTION|'
+             r'HIDE|'
+             r'ID|IF|IMPORT|IMPLEMENTATION|IMPORTING|IN|INCLUDE|INCLUDING|'
+             r'INDEX|INFOTYPES|INITIALIZATION|INTERFACE|INTERFACES|INTO|'
+             r'LANGUAGE|LEAVE|LENGTH|LINES|LOAD|LOCAL|'
+             r'JOIN|'
+             r'KEY|'
+             r'NEW|NEXT|'
+             r'MAXIMUM|MESSAGE|METHOD[S]?|MINIMUM|MODULE|MODIFIER|MODIFY|MOVE|MULTIPLY|'
+             r'NODES|NUMBER|'
+             r'OBLIGATORY|OBJECT|OF|OFF|ON|OTHERS|OVERLAY|'
+             r'PACK|PAD|PARAMETERS|PERCENTAGE|POSITION|PROGRAM|PROVIDE|PUBLIC|PUT|PF\d\d|'
+             r'RAISE|RAISING|RANGES?|READ|RECEIVE|REDEFINITION|REFRESH|REJECT|REPORT|RESERVE|'
+             r'REF|RESUME|RETRY|RETURN|RETURNING|RIGHT|ROLLBACK|REPLACE|'
+             r'SCROLL|SEARCH|SELECT|SHIFT|SIGN|SINGLE|SIZE|SKIP|SORT|SPLIT|STATICS|STOP|'
+             r'STYLE|SUBMATCHES|SUBMIT|SUBTRACT|SUM(?!\()|SUMMARY|SUMMING|SUPPLY|SWITCH|'
+             r'TABLE|TABLES|TIMESTAMP|TIMES?|TIMEZONE|TITLE|\??TO|'
+             r'TOP-OF-PAGE|TRANSFER|TRANSLATE|TRY|TYPES|'
+             r'ULINE|UNDER|UNPACK|UPDATE|USING|'
+             r'VALUE|VALUES|VIA|VARYING|VARY|'
+             r'WAIT|WHEN|WHERE|WIDTH|WHILE|WITH|WINDOW|WRITE|XSD|ZERO)\b', Keyword),
+
+            # builtins
+            (r'(abs|acos|asin|atan|'
+             r'boolc|boolx|bit_set|'
+             r'char_off|charlen|ceil|cmax|cmin|condense|contains|'
+             r'contains_any_of|contains_any_not_of|concat_lines_of|cos|cosh|'
+             r'count|count_any_of|count_any_not_of|'
+             r'dbmaxlen|distance|'
+             r'escape|exp|'
+             r'find|find_end|find_any_of|find_any_not_of|floor|frac|from_mixed|'
+             r'insert|'
+             r'lines|log|log10|'
+             r'match|matches|'
+             r'nmax|nmin|numofchar|'
+             r'repeat|replace|rescale|reverse|round|'
+             r'segment|shift_left|shift_right|sign|sin|sinh|sqrt|strlen|'
+             r'substring|substring_after|substring_from|substring_before|substring_to|'
+             r'tan|tanh|to_upper|to_lower|to_mixed|translate|trunc|'
+             r'xstrlen)(\()\b', bygroups(Name.Builtin, Punctuation)),
+
+            (r'&[0-9]', Name),
+            (r'[0-9]+', Number.Integer),
+
+            # operators which look like variable names before
+            # parsing variable names.
+            (r'(?<=(\s|.))(AND|OR|EQ|NE|GT|LT|GE|LE|CO|CN|CA|NA|CS|NOT|NS|CP|NP|'
+             r'BYTE-CO|BYTE-CN|BYTE-CA|BYTE-NA|BYTE-CS|BYTE-NS|'
+             r'IS\s+(NOT\s+)?(INITIAL|ASSIGNED|REQUESTED|BOUND))\b', Operator.Word),
+
+            include('variable-names'),
+
+            # standard operators after variable names,
+            # because < and > are part of field symbols.
+            (r'[?*<>=\-+&]', Operator),
+            (r"'(''|[^'])*'", String.Single),
+            (r"`([^`])*`", String.Single),
+            (r"([|}])([^{}|]*?)([|{])",
+             bygroups(Punctuation, String.Single, Punctuation)),
+            (r'[/;:()\[\],.]', Punctuation),
+            (r'(!)(\w+)', bygroups(Operator, Name)),
+        ],
+    }
+
+
+class OpenEdgeLexer(RegexLexer):
+    """
+    Lexer for OpenEdge ABL (formerly Progress) source code.
+    """
+    name = 'OpenEdge ABL'
+    aliases = ['openedge', 'abl', 'progress']
+    filenames = ['*.p', '*.cls']
+    mimetypes = ['text/x-openedge', 'application/x-openedge']
+    url = 'https://www.progress.com/openedge/features/abl'
+    version_added = '1.5'
+
+    types = (r'(?i)(^|(?<=[^\w\-]))(CHARACTER|CHAR|CHARA|CHARAC|CHARACT|CHARACTE|'
+             r'COM-HANDLE|DATE|DATETIME|DATETIME-TZ|'
+             r'DECIMAL|DEC|DECI|DECIM|DECIMA|HANDLE|'
+             r'INT64|INTEGER|INT|INTE|INTEG|INTEGE|'
+             r'LOGICAL|LONGCHAR|MEMPTR|RAW|RECID|ROWID)\s*($|(?=[^\w\-]))')
+
+    keywords = words(OPENEDGEKEYWORDS,
+                     prefix=r'(?i)(^|(?<=[^\w\-]))',
+                     suffix=r'\s*($|(?=[^\w\-]))')
+
+    tokens = {
+        'root': [
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'\{', Comment.Preproc, 'preprocessor'),
+            (r'\s*&.*', Comment.Preproc),
+            (r'0[xX][0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'(?i)(DEFINE|DEF|DEFI|DEFIN)\b', Keyword.Declaration),
+            (types, Keyword.Type),
+            (keywords, Name.Builtin),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'\s+', Whitespace),
+            (r'[+*/=-]', Operator),
+            (r'[.:()]', Punctuation),
+            (r'.', Name.Variable),  # Lazy catch-all
+        ],
+        'comment': [
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'preprocessor': [
+            (r'[^{}]', Comment.Preproc),
+            (r'\{', Comment.Preproc, '#push'),
+            (r'\}', Comment.Preproc, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        """Try to identify OpenEdge ABL based on a few common constructs."""
+        result = 0
+
+        if 'END.' in text:
+            result += 0.05
+
+        if 'END PROCEDURE.' in text:
+            result += 0.05
+
+        if 'ELSE DO:' in text:
+            result += 0.05
+
+        return result
+
+
+class GoodDataCLLexer(RegexLexer):
+    """
+    Lexer for GoodData-CL script files.
+    """
+
+    name = 'GoodData-CL'
+    aliases = ['gooddata-cl']
+    filenames = ['*.gdc']
+    mimetypes = ['text/x-gooddata-cl']
+    url = 'https://github.com/gooddata/GoodData-CL'
+    version_added = '1.4'
+
+    flags = re.IGNORECASE
+
+    # Syntax:
+    # https://github.com/gooddata/GoodData-CL/raw/master/cli/src/main/resources/com/gooddata/processor/COMMANDS.txt
+    tokens = {
+        'root': [
+            # Comments
+            (r'#.*', Comment.Single),
+            # Function call
+            (r'[a-z]\w*', Name.Function),
+            # Argument list
+            (r'\(', Punctuation, 'args-list'),
+            # Punctuation
+            (r';', Punctuation),
+            # Space is not significant
+            (r'\s+', Text)
+        ],
+        'args-list': [
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'[a-z]\w*', Name.Variable),
+            (r'=', Operator),
+            (r'"', String, 'string-literal'),
+            (r'[0-9]+(?:\.[0-9]+)?(?:e[+-]?[0-9]{1,3})?', Number),
+            # Space is not significant
+            (r'\s', Whitespace)
+        ],
+        'string-literal': [
+            (r'\\[tnrfbae"\\]', String.Escape),
+            (r'"', String, '#pop'),
+            (r'[^\\"]+', String)
+        ]
+    }
+
+
+class MaqlLexer(RegexLexer):
+    """
+    Lexer for GoodData MAQL scripts.
+    """
+
+    name = 'MAQL'
+    aliases = ['maql']
+    filenames = ['*.maql']
+    mimetypes = ['text/x-gooddata-maql', 'application/x-gooddata-maql']
+    url = 'https://help.gooddata.com/doc/enterprise/en/dashboards-and-insights/maql-analytical-query-language'
+    version_added = '1.4'
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            # IDENTITY
+            (r'IDENTIFIER\b', Name.Builtin),
+            # IDENTIFIER
+            (r'\{[^}]+\}', Name.Variable),
+            # NUMBER
+            (r'[0-9]+(?:\.[0-9]+)?(?:e[+-]?[0-9]{1,3})?', Number),
+            # STRING
+            (r'"', String, 'string-literal'),
+            #  RELATION
+            (r'\<\>|\!\=', Operator),
+            (r'\=|\>\=|\>|\<\=|\<', Operator),
+            # :=
+            (r'\:\=', Operator),
+            # OBJECT
+            (r'\[[^]]+\]', Name.Variable.Class),
+            # keywords
+            (words((
+                'DIMENSION', 'DIMENSIONS', 'BOTTOM', 'METRIC', 'COUNT', 'OTHER',
+                'FACT', 'WITH', 'TOP', 'OR', 'ATTRIBUTE', 'CREATE', 'PARENT',
+                'FALSE', 'ROW', 'ROWS', 'FROM', 'ALL', 'AS', 'PF', 'COLUMN',
+                'COLUMNS', 'DEFINE', 'REPORT', 'LIMIT', 'TABLE', 'LIKE', 'AND',
+                'BY', 'BETWEEN', 'EXCEPT', 'SELECT', 'MATCH', 'WHERE', 'TRUE',
+                'FOR', 'IN', 'WITHOUT', 'FILTER', 'ALIAS', 'WHEN', 'NOT', 'ON',
+                'KEYS', 'KEY', 'FULLSET', 'PRIMARY', 'LABELS', 'LABEL',
+                'VISUAL', 'TITLE', 'DESCRIPTION', 'FOLDER', 'ALTER', 'DROP',
+                'ADD', 'DATASET', 'DATATYPE', 'INT', 'BIGINT', 'DOUBLE', 'DATE',
+                'VARCHAR', 'DECIMAL', 'SYNCHRONIZE', 'TYPE', 'DEFAULT', 'ORDER',
+                'ASC', 'DESC', 'HYPERLINK', 'INCLUDE', 'TEMPLATE', 'MODIFY'),
+                suffix=r'\b'),
+             Keyword),
+            # FUNCNAME
+            (r'[a-z]\w*\b', Name.Function),
+            # Comments
+            (r'#.*', Comment.Single),
+            # Punctuation
+            (r'[,;()]', Punctuation),
+            # Space is not significant
+            (r'\s+', Whitespace)
+        ],
+        'string-literal': [
+            (r'\\[tnrfbae"\\]', String.Escape),
+            (r'"', String, '#pop'),
+            (r'[^\\"]+', String)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/c_cpp.py b/.venv/Lib/site-packages/pygments/lexers/c_cpp.py
new file mode 100644 (file)
index 0000000..399f2bc
--- /dev/null
@@ -0,0 +1,414 @@
+"""
+    pygments.lexers.c_cpp
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for C/C++ languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, \
+    this, inherit, default, words
+from pygments.util import get_bool_opt
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['CLexer', 'CppLexer']
+
+
+class CFamilyLexer(RegexLexer):
+    """
+    For C family source code.  This is used as a base class to avoid repetitious
+    definitions.
+    """
+
+    # The trailing ?, rather than *, avoids a geometric performance drop here.
+    #: only one /* */ style comment
+    _ws1 = r'\s*(?:/[*].*?[*]/\s*)?'
+
+    # Hexadecimal part in an hexadecimal integer/floating-point literal.
+    # This includes decimal separators matching.
+    _hexpart = r'[0-9a-fA-F](\'?[0-9a-fA-F])*'
+    # Decimal part in an decimal integer/floating-point literal.
+    # This includes decimal separators matching.
+    _decpart = r'\d(\'?\d)*'
+    # Integer literal suffix (e.g. 'ull' or 'll').
+    _intsuffix = r'(([uU][lL]{0,2})|[lL]{1,2}[uU]?)?'
+
+    # Identifier regex with C and C++ Universal Character Name (UCN) support.
+    _ident = r'(?!\d)(?:[\w$]|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8})+'
+    _namespaced_ident = r'(?!\d)(?:[\w$]|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|::)+'
+
+    # Single and multiline comment regexes
+    # Beware not to use *? for the inner content! When these regexes
+    # are embedded in larger regexes, that can cause the stuff*? to
+    # match more than it would have if the regex had been used in
+    # a standalone way ...
+    _comment_single = r'//(?:.|(?<=\\)\n)*\n'
+    _comment_multiline = r'/(?:\\\n)?[*](?:[^*]|[*](?!(?:\\\n)?/))*[*](?:\\\n)?/'
+
+    # Regex to match optional comments
+    _possible_comments = rf'\s*(?:(?:(?:{_comment_single})|(?:{_comment_multiline}))\s*)*'
+
+    tokens = {
+        'whitespace': [
+            # preprocessor directives: without whitespace
+            (r'^#if\s+0', Comment.Preproc, 'if0'),
+            ('^#', Comment.Preproc, 'macro'),
+            # or with whitespace
+            ('^(' + _ws1 + r')(#if\s+0)',
+             bygroups(using(this), Comment.Preproc), 'if0'),
+            ('^(' + _ws1 + ')(#)',
+             bygroups(using(this), Comment.Preproc), 'macro'),
+            # Labels:
+            # Line start and possible indentation.
+            (r'(^[ \t]*)'
+             # Not followed by keywords which can be mistaken as labels.
+             r'(?!(?:public|private|protected|default)\b)'
+             # Actual label, followed by a single colon.
+             r'(' + _ident + r')(\s*)(:)(?!:)',
+             bygroups(Whitespace, Name.Label, Whitespace, Punctuation)),
+            (r'\n', Whitespace),
+            (r'[^\S\n]+', Whitespace),
+            (r'\\\n', Text),  # line continuation
+            (_comment_single, Comment.Single),
+            (_comment_multiline, Comment.Multiline),
+            # Open until EOF, so no ending delimiter
+            (r'/(\\\n)?[*][\w\W]*', Comment.Multiline),
+        ],
+        'statements': [
+            include('keywords'),
+            include('types'),
+            (r'([LuU]|u8)?(")', bygroups(String.Affix, String), 'string'),
+            (r"([LuU]|u8)?(')(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])(')",
+             bygroups(String.Affix, String.Char, String.Char, String.Char)),
+
+             # Hexadecimal floating-point literals (C11, C++17)
+            (r'0[xX](' + _hexpart + r'\.' + _hexpart + r'|\.' + _hexpart +
+             r'|' + _hexpart + r')[pP][+-]?' + _hexpart + r'[lL]?', Number.Float),
+
+            (r'(-)?(' + _decpart + r'\.' + _decpart + r'|\.' + _decpart + r'|' +
+             _decpart + r')[eE][+-]?' + _decpart + r'[fFlL]?', Number.Float),
+            (r'(-)?((' + _decpart + r'\.(' + _decpart + r')?|\.' +
+             _decpart + r')[fFlL]?)|(' + _decpart + r'[fFlL])', Number.Float),
+            (r'(-)?0[xX]' + _hexpart + _intsuffix, Number.Hex),
+            (r'(-)?0[bB][01](\'?[01])*' + _intsuffix, Number.Bin),
+            (r'(-)?0(\'?[0-7])+' + _intsuffix, Number.Oct),
+            (r'(-)?' + _decpart + _intsuffix, Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.]', Punctuation),
+            (r'(true|false|NULL)\b', Name.Builtin),
+            (_ident, Name)
+        ],
+        'types': [
+            (words(('int8', 'int16', 'int32', 'int64', 'wchar_t'), prefix=r'__',
+                    suffix=r'\b'), Keyword.Reserved),
+            (words(('bool', 'int', 'long', 'float', 'short', 'double', 'char',
+                    'unsigned', 'signed', 'void', '_BitInt',
+                    '__int128'), suffix=r'\b'), Keyword.Type)
+        ],
+        'keywords': [
+            (r'(struct|union)(\s+)', bygroups(Keyword, Whitespace), 'classname'),
+            (r'case\b', Keyword, 'case-value'),
+            (words(('asm', 'auto', 'break', 'const', 'continue', 'default',
+                    'do', 'else', 'enum', 'extern', 'for', 'goto', 'if',
+                    'register', 'restricted', 'return', 'sizeof', 'struct',
+                    'static', 'switch', 'typedef', 'volatile', 'while', 'union',
+                    'thread_local', 'alignas', 'alignof', 'static_assert', '_Pragma'),
+                   suffix=r'\b'), Keyword),
+            (words(('inline', '_inline', '__inline', 'naked', 'restrict',
+                    'thread'), suffix=r'\b'), Keyword.Reserved),
+            # Vector intrinsics
+            (r'(__m(128i|128d|128|64))\b', Keyword.Reserved),
+            # Microsoft-isms
+            (words((
+                'asm', 'based', 'except', 'stdcall', 'cdecl',
+                'fastcall', 'declspec', 'finally', 'try',
+                'leave', 'w64', 'unaligned', 'raise', 'noop',
+                'identifier', 'forceinline', 'assume'),
+                prefix=r'__', suffix=r'\b'), Keyword.Reserved)
+        ],
+        'root': [
+            include('whitespace'),
+            include('keywords'),
+            # functions
+            (r'(' + _namespaced_ident + r'(?:[&*\s])+)'  # return arguments
+             r'(' + _possible_comments + r')'
+             r'(' + _namespaced_ident + r')'             # method name
+             r'(' + _possible_comments + r')'
+             r'(\([^;"\')]*?\))'                         # signature
+             r'(' + _possible_comments + r')'
+             r'([^;{/"\']*)(\{)',
+             bygroups(using(this), using(this, state='whitespace'),
+                      Name.Function, using(this, state='whitespace'),
+                      using(this), using(this, state='whitespace'),
+                      using(this), Punctuation),
+             'function'),
+            # function declarations
+            (r'(' + _namespaced_ident + r'(?:[&*\s])+)'  # return arguments
+             r'(' + _possible_comments + r')'
+             r'(' + _namespaced_ident + r')'             # method name
+             r'(' + _possible_comments + r')'
+             r'(\([^;"\')]*?\))'                         # signature
+             r'(' + _possible_comments + r')'
+             r'([^;/"\']*)(;)',
+             bygroups(using(this), using(this, state='whitespace'),
+                      Name.Function, using(this, state='whitespace'),
+                      using(this), using(this, state='whitespace'),
+                      using(this), Punctuation)),
+            include('types'),
+            default('statement'),
+        ],
+        'statement': [
+            include('whitespace'),
+            include('statements'),
+            (r'\}', Punctuation),
+            (r'[{;]', Punctuation, '#pop'),
+        ],
+        'function': [
+            include('whitespace'),
+            include('statements'),
+            (';', Punctuation),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|'
+             r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+        'macro': [
+            (r'('+_ws1+r')(include)('+_ws1+r')("[^"]+")([^\n]*)',
+                bygroups(using(this), Comment.Preproc, using(this),
+                         Comment.PreprocFile, Comment.Single)),
+            (r'('+_ws1+r')(include)('+_ws1+r')(<[^>]+>)([^\n]*)',
+                bygroups(using(this), Comment.Preproc, using(this),
+                         Comment.PreprocFile, Comment.Single)),
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'),
+            (r'^\s*#el(?:se|if).*\n', Comment.Preproc, '#pop'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'),
+            (r'.*?\n', Comment),
+        ],
+        'classname': [
+            (_ident, Name.Class, '#pop'),
+            # template specification
+            (r'\s*(?=>)', Text, '#pop'),
+            default('#pop')
+        ],
+        # Mark identifiers preceded by `case` keyword as constants.
+        'case-value': [
+            (r'(?<!:)(:)(?!:)', Punctuation, '#pop'),
+            (_ident, Name.Constant),
+            include('whitespace'),
+            include('statements'),
+        ]
+    }
+
+    stdlib_types = {
+        'size_t', 'ssize_t', 'off_t', 'wchar_t', 'ptrdiff_t', 'sig_atomic_t', 'fpos_t',
+        'clock_t', 'time_t', 'va_list', 'jmp_buf', 'FILE', 'DIR', 'div_t', 'ldiv_t',
+        'mbstate_t', 'wctrans_t', 'wint_t', 'wctype_t'}
+    c99_types = {
+        'int8_t', 'int16_t', 'int32_t', 'int64_t', 'uint8_t',
+        'uint16_t', 'uint32_t', 'uint64_t', 'int_least8_t', 'int_least16_t',
+        'int_least32_t', 'int_least64_t', 'uint_least8_t', 'uint_least16_t',
+        'uint_least32_t', 'uint_least64_t', 'int_fast8_t', 'int_fast16_t', 'int_fast32_t',
+        'int_fast64_t', 'uint_fast8_t', 'uint_fast16_t', 'uint_fast32_t', 'uint_fast64_t',
+        'intptr_t', 'uintptr_t', 'intmax_t', 'uintmax_t'}
+    linux_types = {
+        'clockid_t', 'cpu_set_t', 'cpumask_t', 'dev_t', 'gid_t', 'id_t', 'ino_t', 'key_t',
+        'mode_t', 'nfds_t', 'pid_t', 'rlim_t', 'sig_t', 'sighandler_t', 'siginfo_t',
+        'sigset_t', 'sigval_t', 'socklen_t', 'timer_t', 'uid_t'}
+    c11_atomic_types = {
+        'atomic_bool', 'atomic_char', 'atomic_schar', 'atomic_uchar', 'atomic_short',
+        'atomic_ushort', 'atomic_int', 'atomic_uint', 'atomic_long', 'atomic_ulong',
+        'atomic_llong', 'atomic_ullong', 'atomic_char16_t', 'atomic_char32_t', 'atomic_wchar_t',
+        'atomic_int_least8_t', 'atomic_uint_least8_t', 'atomic_int_least16_t',
+        'atomic_uint_least16_t', 'atomic_int_least32_t', 'atomic_uint_least32_t',
+        'atomic_int_least64_t', 'atomic_uint_least64_t', 'atomic_int_fast8_t',
+        'atomic_uint_fast8_t', 'atomic_int_fast16_t', 'atomic_uint_fast16_t',
+        'atomic_int_fast32_t', 'atomic_uint_fast32_t', 'atomic_int_fast64_t',
+        'atomic_uint_fast64_t', 'atomic_intptr_t', 'atomic_uintptr_t', 'atomic_size_t',
+        'atomic_ptrdiff_t', 'atomic_intmax_t', 'atomic_uintmax_t'}
+
+    def __init__(self, **options):
+        self.stdlibhighlighting = get_bool_opt(options, 'stdlibhighlighting', True)
+        self.c99highlighting = get_bool_opt(options, 'c99highlighting', True)
+        self.c11highlighting = get_bool_opt(options, 'c11highlighting', True)
+        self.platformhighlighting = get_bool_opt(options, 'platformhighlighting', True)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text, stack=('root',)):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name:
+                if self.stdlibhighlighting and value in self.stdlib_types:
+                    token = Keyword.Type
+                elif self.c99highlighting and value in self.c99_types:
+                    token = Keyword.Type
+                elif self.c11highlighting and value in self.c11_atomic_types:
+                    token = Keyword.Type
+                elif self.platformhighlighting and value in self.linux_types:
+                    token = Keyword.Type
+            yield index, token, value
+
+
+class CLexer(CFamilyLexer):
+    """
+    For C source code with preprocessor directives.
+
+    Additional options accepted:
+
+    `stdlibhighlighting`
+        Highlight common types found in the C/C++ standard library (e.g. `size_t`).
+        (default: ``True``).
+
+    `c99highlighting`
+        Highlight common types found in the C99 standard library (e.g. `int8_t`).
+        Actually, this includes all fixed-width integer types.
+        (default: ``True``).
+
+    `c11highlighting`
+        Highlight atomic types found in the C11 standard library (e.g. `atomic_bool`).
+        (default: ``True``).
+
+    `platformhighlighting`
+        Highlight common types found in the platform SDK headers (e.g. `clockid_t` on Linux).
+        (default: ``True``).
+    """
+    name = 'C'
+    aliases = ['c']
+    filenames = ['*.c', '*.h', '*.idc', '*.x[bp]m']
+    mimetypes = ['text/x-chdr', 'text/x-csrc', 'image/x-xbitmap', 'image/x-xpixmap']
+    url = 'https://en.wikipedia.org/wiki/C_(programming_language)'
+    version_added = ''
+    priority = 0.1
+
+    tokens = {
+        'keywords': [
+            (words((
+                '_Alignas', '_Alignof', '_Noreturn', '_Generic', '_Thread_local',
+                '_Static_assert', '_Imaginary', 'noreturn', 'imaginary', 'complex'),
+                suffix=r'\b'), Keyword),
+            inherit
+        ],
+        'types': [
+            (words(('_Bool', '_Complex', '_Atomic'), suffix=r'\b'), Keyword.Type),
+            inherit
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\s*#include [<"]', text, re.MULTILINE):
+            return 0.1
+        if re.search(r'^\s*#ifn?def ', text, re.MULTILINE):
+            return 0.1
+
+
+class CppLexer(CFamilyLexer):
+    """
+    For C++ source code with preprocessor directives.
+
+    Additional options accepted:
+
+    `stdlibhighlighting`
+        Highlight common types found in the C/C++ standard library (e.g. `size_t`).
+        (default: ``True``).
+
+    `c99highlighting`
+        Highlight common types found in the C99 standard library (e.g. `int8_t`).
+        Actually, this includes all fixed-width integer types.
+        (default: ``True``).
+
+    `c11highlighting`
+        Highlight atomic types found in the C11 standard library (e.g. `atomic_bool`).
+        (default: ``True``).
+
+    `platformhighlighting`
+        Highlight common types found in the platform SDK headers (e.g. `clockid_t` on Linux).
+        (default: ``True``).
+    """
+    name = 'C++'
+    url = 'https://isocpp.org/'
+    aliases = ['cpp', 'c++']
+    filenames = ['*.cpp', '*.hpp', '*.c++', '*.h++',
+                 '*.cc', '*.hh', '*.cxx', '*.hxx',
+                 '*.C', '*.H', '*.cp', '*.CPP', '*.tpp']
+    mimetypes = ['text/x-c++hdr', 'text/x-c++src']
+    version_added = ''
+    priority = 0.1
+
+    tokens = {
+        'statements': [
+            # C++11 raw strings
+            (r'((?:[LuU]|u8)?R)(")([^\\()\s]{,16})(\()((?:.|\n)*?)(\)\3)(")',
+             bygroups(String.Affix, String, String.Delimiter, String.Delimiter,
+                      String, String.Delimiter, String)),
+            inherit,
+        ],
+        'root': [
+            inherit,
+            # C++ Microsoft-isms
+            (words(('virtual_inheritance', 'uuidof', 'super', 'single_inheritance',
+                    'multiple_inheritance', 'interface', 'event'),
+                   prefix=r'__', suffix=r'\b'), Keyword.Reserved),
+            # Offload C++ extensions, http://offload.codeplay.com/
+            (r'__(offload|blockingoffload|outer)\b', Keyword.Pseudo),
+        ],
+        'enumname': [
+            include('whitespace'),
+            # 'enum class' and 'enum struct' C++11 support
+            (words(('class', 'struct'), suffix=r'\b'), Keyword),
+            (CFamilyLexer._ident, Name.Class, '#pop'),
+            # template specification
+            (r'\s*(?=>)', Text, '#pop'),
+            default('#pop')
+        ],
+        'keywords': [
+            (r'(class|concept|typename)(\s+)', bygroups(Keyword, Whitespace), 'classname'),
+            (words((
+                'catch', 'const_cast', 'delete', 'dynamic_cast', 'explicit',
+                'export', 'friend', 'mutable', 'new', 'operator',
+                'private', 'protected', 'public', 'reinterpret_cast', 'class',
+                '__restrict', 'static_cast', 'template', 'this', 'throw', 'throws',
+                'try', 'typeid', 'using', 'virtual', 'constexpr', 'nullptr', 'concept',
+                'decltype', 'noexcept', 'override', 'final', 'constinit', 'consteval',
+                'co_await', 'co_return', 'co_yield', 'requires', 'import', 'module',
+                'typename', 'and', 'and_eq', 'bitand', 'bitor', 'compl', 'not',
+                'not_eq', 'or', 'or_eq', 'xor', 'xor_eq'),
+               suffix=r'\b'), Keyword),
+            (r'namespace\b', Keyword, 'namespace'),
+            (r'(enum)(\s+)', bygroups(Keyword, Whitespace), 'enumname'),
+            inherit
+        ],
+        'types': [
+            (r'char(16_t|32_t|8_t)\b', Keyword.Type),
+            inherit
+        ],
+        'namespace': [
+            (r'[;{]', Punctuation, ('#pop', 'root')),
+            (r'inline\b', Keyword.Reserved),
+            (CFamilyLexer._ident, Name.Namespace),
+            include('statement')
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search('#include <[a-z_]+>', text):
+            return 0.2
+        if re.search('using namespace ', text):
+            return 0.4
diff --git a/.venv/Lib/site-packages/pygments/lexers/c_like.py b/.venv/Lib/site-packages/pygments/lexers/c_like.py
new file mode 100644 (file)
index 0000000..1ba269e
--- /dev/null
@@ -0,0 +1,738 @@
+"""
+    pygments.lexers.c_like
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for other C-like languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, inherit, words, \
+    default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+from pygments.lexers.c_cpp import CLexer, CppLexer
+from pygments.lexers import _mql_builtins
+
+__all__ = ['PikeLexer', 'NesCLexer', 'ClayLexer', 'ECLexer', 'ValaLexer',
+           'CudaLexer', 'SwigLexer', 'MqlLexer', 'ArduinoLexer', 'CharmciLexer',
+           'OmgIdlLexer', 'PromelaLexer']
+
+
+class PikeLexer(CppLexer):
+    """
+    For `Pike <http://pike.lysator.liu.se/>`_ source code.
+    """
+    name = 'Pike'
+    aliases = ['pike']
+    filenames = ['*.pike', '*.pmod']
+    mimetypes = ['text/x-pike']
+    version_added = '2.0'
+
+    tokens = {
+        'statements': [
+            (words((
+                'catch', 'new', 'private', 'protected', 'public', 'gauge',
+                'throw', 'throws', 'class', 'interface', 'implement', 'abstract',
+                'extends', 'from', 'this', 'super', 'constant', 'final', 'static',
+                'import', 'use', 'extern', 'inline', 'proto', 'break', 'continue',
+                'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'as', 'in',
+                'version', 'return', 'true', 'false', 'null',
+                '__VERSION__', '__MAJOR__', '__MINOR__', '__BUILD__', '__REAL_VERSION__',
+                '__REAL_MAJOR__', '__REAL_MINOR__', '__REAL_BUILD__', '__DATE__', '__TIME__',
+                '__FILE__', '__DIR__', '__LINE__', '__AUTO_BIGNUM__', '__NT__', '__PIKE__',
+                '__amigaos__', '_Pragma', 'static_assert', 'defined', 'sscanf'), suffix=r'\b'),
+             Keyword),
+            (r'(bool|int|long|float|short|double|char|string|object|void|mapping|'
+             r'array|multiset|program|function|lambda|mixed|'
+             r'[a-z_][a-z0-9_]*_t)\b',
+             Keyword.Type),
+            (r'(class)(\s+)', bygroups(Keyword, Whitespace), 'classname'),
+            (r'[~!%^&*+=|?:<>/@-]', Operator),
+            inherit,
+        ],
+        'classname': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            # template specification
+            (r'\s*(?=>)', Whitespace, '#pop'),
+        ],
+    }
+
+
+class NesCLexer(CLexer):
+    """
+    For `nesC <https://github.com/tinyos/nesc>`_ source code with preprocessor
+    directives.
+    """
+    name = 'nesC'
+    aliases = ['nesc']
+    filenames = ['*.nc']
+    mimetypes = ['text/x-nescsrc']
+    version_added = '2.0'
+
+    tokens = {
+        'statements': [
+            (words((
+                'abstract', 'as', 'async', 'atomic', 'call', 'command', 'component',
+                'components', 'configuration', 'event', 'extends', 'generic',
+                'implementation', 'includes', 'interface', 'module', 'new', 'norace',
+                'post', 'provides', 'signal', 'task', 'uses'), suffix=r'\b'),
+             Keyword),
+            (words(('nx_struct', 'nx_union', 'nx_int8_t', 'nx_int16_t', 'nx_int32_t',
+                    'nx_int64_t', 'nx_uint8_t', 'nx_uint16_t', 'nx_uint32_t',
+                    'nx_uint64_t'), suffix=r'\b'),
+             Keyword.Type),
+            inherit,
+        ],
+    }
+
+
+class ClayLexer(RegexLexer):
+    """
+    For Clay source.
+    """
+    name = 'Clay'
+    filenames = ['*.clay']
+    aliases = ['clay']
+    mimetypes = ['text/x-clay']
+    url = 'http://claylabs.com/clay'
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'//.*?$', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'\b(public|private|import|as|record|variant|instance'
+             r'|define|overload|default|external|alias'
+             r'|rvalue|ref|forward|inline|noinline|forceinline'
+             r'|enum|var|and|or|not|if|else|goto|return|while'
+             r'|switch|case|break|continue|for|in|true|false|try|catch|throw'
+             r'|finally|onerror|staticassert|eval|when|newtype'
+             r'|__FILE__|__LINE__|__COLUMN__|__ARG__'
+             r')\b', Keyword),
+            (r'[~!%^&*+=|:<>/-]', Operator),
+            (r'[#(){}\[\],;.]', Punctuation),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'\b(true|false)\b', Name.Builtin),
+            (r'(?i)[a-z_?][\w?]*', Name),
+            (r'"""', String, 'tdqs'),
+            (r'"', String, 'dqs'),
+        ],
+        'strings': [
+            (r'(?i)\\(x[0-9a-f]{2}|.)', String.Escape),
+            (r'[^\\"]+', String),
+        ],
+        'nl': [
+            (r'\n', String),
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            include('strings'),
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            include('strings'),
+            include('nl'),
+        ],
+    }
+
+
+class ECLexer(CLexer):
+    """
+    For eC source code with preprocessor directives.
+    """
+    name = 'eC'
+    aliases = ['ec']
+    filenames = ['*.ec', '*.eh']
+    mimetypes = ['text/x-echdr', 'text/x-ecsrc']
+    url = 'https://ec-lang.org'
+    version_added = '1.5'
+
+    tokens = {
+        'statements': [
+            (words((
+                'virtual', 'class', 'private', 'public', 'property', 'import',
+                'delete', 'new', 'new0', 'renew', 'renew0', 'define', 'get',
+                'set', 'remote', 'dllexport', 'dllimport', 'stdcall', 'subclass',
+                '__on_register_module', 'namespace', 'using', 'typed_object',
+                'any_object', 'incref', 'register', 'watch', 'stopwatching', 'firewatchers',
+                'watchable', 'class_designer', 'class_fixed', 'class_no_expansion', 'isset',
+                'class_default_property', 'property_category', 'class_data',
+                'class_property', 'thisclass', 'dbtable', 'dbindex',
+                'database_open', 'dbfield'), suffix=r'\b'), Keyword),
+            (words(('uint', 'uint16', 'uint32', 'uint64', 'bool', 'byte',
+                    'unichar', 'int64'), suffix=r'\b'),
+             Keyword.Type),
+            (r'(class)(\s+)', bygroups(Keyword, Whitespace), 'classname'),
+            (r'(null|value|this)\b', Name.Builtin),
+            inherit,
+        ]
+    }
+
+
+class ValaLexer(RegexLexer):
+    """
+    For Vala source code with preprocessor directives.
+    """
+    name = 'Vala'
+    aliases = ['vala', 'vapi']
+    filenames = ['*.vala', '*.vapi']
+    mimetypes = ['text/x-vala']
+    url = 'https://vala.dev'
+    version_added = '1.1'
+
+    tokens = {
+        'whitespace': [
+            (r'^\s*#if\s+0', Comment.Preproc, 'if0'),
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'\\\n', Text),  # line continuation
+            (r'//(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+        ],
+        'statements': [
+            (r'[L@]?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'",
+             String.Char),
+            (r'(?s)""".*?"""', String),  # verbatim strings
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[Ll]?', Number.Hex),
+            (r'0[0-7]+[Ll]?', Number.Oct),
+            (r'\d+[Ll]?', Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'(\[)(Compact|Immutable|(?:Boolean|Simple)Type)(\])',
+             bygroups(Punctuation, Name.Decorator, Punctuation)),
+            # TODO: "correctly" parse complex code attributes
+            (r'(\[)(CCode|(?:Integer|Floating)Type)',
+             bygroups(Punctuation, Name.Decorator)),
+            (r'[()\[\],.]', Punctuation),
+            (words((
+                'as', 'base', 'break', 'case', 'catch', 'construct', 'continue',
+                'default', 'delete', 'do', 'else', 'enum', 'finally', 'for',
+                'foreach', 'get', 'if', 'in', 'is', 'lock', 'new', 'out', 'params',
+                'return', 'set', 'sizeof', 'switch', 'this', 'throw', 'try',
+                'typeof', 'while', 'yield'), suffix=r'\b'),
+             Keyword),
+            (words((
+                'abstract', 'const', 'delegate', 'dynamic', 'ensures', 'extern',
+                'inline', 'internal', 'override', 'owned', 'private', 'protected',
+                'public', 'ref', 'requires', 'signal', 'static', 'throws', 'unowned',
+                'var', 'virtual', 'volatile', 'weak', 'yields'), suffix=r'\b'),
+             Keyword.Declaration),
+            (r'(namespace|using)(\s+)', bygroups(Keyword.Namespace, Whitespace),
+             'namespace'),
+            (r'(class|errordomain|interface|struct)(\s+)',
+             bygroups(Keyword.Declaration, Whitespace), 'class'),
+            (r'(\.)([a-zA-Z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            # void is an actual keyword, others are in glib-2.0.vapi
+            (words((
+                'void', 'bool', 'char', 'double', 'float', 'int', 'int8', 'int16',
+                'int32', 'int64', 'long', 'short', 'size_t', 'ssize_t', 'string',
+                'time_t', 'uchar', 'uint', 'uint8', 'uint16', 'uint32', 'uint64',
+                'ulong', 'unichar', 'ushort'), suffix=r'\b'),
+             Keyword.Type),
+            (r'(true|false|null)\b', Name.Builtin),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'root': [
+            include('whitespace'),
+            default('statement'),
+        ],
+        'statement': [
+            include('whitespace'),
+            include('statements'),
+            ('[{}]', Punctuation),
+            (';', Punctuation, '#pop'),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'),
+            (r'^\s*#el(?:se|if).*\n', Comment.Preproc, '#pop'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'),
+            (r'.*?\n', Comment),
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'namespace': [
+            (r'[a-zA-Z_][\w.]*', Name.Namespace, '#pop')
+        ],
+    }
+
+
+class CudaLexer(CLexer):
+    """
+    For NVIDIA CUDA™ source.
+    """
+    name = 'CUDA'
+    filenames = ['*.cu', '*.cuh']
+    aliases = ['cuda', 'cu']
+    mimetypes = ['text/x-cuda']
+    url = 'https://developer.nvidia.com/category/zone/cuda-zone'
+    version_added = '1.6'
+
+    function_qualifiers = {'__device__', '__global__', '__host__',
+                           '__noinline__', '__forceinline__'}
+    variable_qualifiers = {'__device__', '__constant__', '__shared__',
+                           '__restrict__'}
+    vector_types = {'char1', 'uchar1', 'char2', 'uchar2', 'char3', 'uchar3',
+                    'char4', 'uchar4', 'short1', 'ushort1', 'short2', 'ushort2',
+                    'short3', 'ushort3', 'short4', 'ushort4', 'int1', 'uint1',
+                    'int2', 'uint2', 'int3', 'uint3', 'int4', 'uint4', 'long1',
+                    'ulong1', 'long2', 'ulong2', 'long3', 'ulong3', 'long4',
+                    'ulong4', 'longlong1', 'ulonglong1', 'longlong2',
+                    'ulonglong2', 'float1', 'float2', 'float3', 'float4',
+                    'double1', 'double2', 'dim3'}
+    variables = {'gridDim', 'blockIdx', 'blockDim', 'threadIdx', 'warpSize'}
+    functions = {'__threadfence_block', '__threadfence', '__threadfence_system',
+                 '__syncthreads', '__syncthreads_count', '__syncthreads_and',
+                 '__syncthreads_or'}
+    execution_confs = {'<<<', '>>>'}
+
+    def get_tokens_unprocessed(self, text, stack=('root',)):
+        for index, token, value in CLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name:
+                if value in self.variable_qualifiers:
+                    token = Keyword.Type
+                elif value in self.vector_types:
+                    token = Keyword.Type
+                elif value in self.variables:
+                    token = Name.Builtin
+                elif value in self.execution_confs:
+                    token = Keyword.Pseudo
+                elif value in self.function_qualifiers:
+                    token = Keyword.Reserved
+                elif value in self.functions:
+                    token = Name.Function
+            yield index, token, value
+
+
+class SwigLexer(CppLexer):
+    """
+    For `SWIG <http://www.swig.org/>`_ source code.
+    """
+    name = 'SWIG'
+    aliases = ['swig']
+    filenames = ['*.swg', '*.i']
+    mimetypes = ['text/swig']
+    version_added = '2.0'
+    priority = 0.04  # Lower than C/C++ and Objective C/C++
+
+    tokens = {
+        'root': [
+            # Match it here so it won't be matched as a function in the rest of root
+            (r'\$\**\&?\w+', Name),
+            inherit
+        ],
+        'statements': [
+            # SWIG directives
+            (r'(%[a-z_][a-z0-9_]*)', Name.Function),
+            # Special variables
+            (r'\$\**\&?\w+', Name),
+            # Stringification / additional preprocessor directives
+            (r'##*[a-zA-Z_]\w*', Comment.Preproc),
+            inherit,
+        ],
+    }
+
+    # This is a far from complete set of SWIG directives
+    swig_directives = {
+        # Most common directives
+        '%apply', '%define', '%director', '%enddef', '%exception', '%extend',
+        '%feature', '%fragment', '%ignore', '%immutable', '%import', '%include',
+        '%inline', '%insert', '%module', '%newobject', '%nspace', '%pragma',
+        '%rename', '%shared_ptr', '%template', '%typecheck', '%typemap',
+        # Less common directives
+        '%arg', '%attribute', '%bang', '%begin', '%callback', '%catches', '%clear',
+        '%constant', '%copyctor', '%csconst', '%csconstvalue', '%csenum',
+        '%csmethodmodifiers', '%csnothrowexception', '%default', '%defaultctor',
+        '%defaultdtor', '%defined', '%delete', '%delobject', '%descriptor',
+        '%exceptionclass', '%exceptionvar', '%extend_smart_pointer', '%fragments',
+        '%header', '%ifcplusplus', '%ignorewarn', '%implicit', '%implicitconv',
+        '%init', '%javaconst', '%javaconstvalue', '%javaenum', '%javaexception',
+        '%javamethodmodifiers', '%kwargs', '%luacode', '%mutable', '%naturalvar',
+        '%nestedworkaround', '%perlcode', '%pythonabc', '%pythonappend',
+        '%pythoncallback', '%pythoncode', '%pythondynamic', '%pythonmaybecall',
+        '%pythonnondynamic', '%pythonprepend', '%refobject', '%shadow', '%sizeof',
+        '%trackobjects', '%types', '%unrefobject', '%varargs', '%warn',
+        '%warnfilter'}
+
+    def analyse_text(text):
+        rv = 0
+        # Search for SWIG directives, which are conventionally at the beginning of
+        # a line. The probability of them being within a line is low, so let another
+        # lexer win in this case.
+        matches = re.findall(r'^\s*(%[a-z_][a-z0-9_]*)', text, re.M)
+        for m in matches:
+            if m in SwigLexer.swig_directives:
+                rv = 0.98
+                break
+            else:
+                rv = 0.91  # Fraction higher than MatlabLexer
+        return rv
+
+
+class MqlLexer(CppLexer):
+    """
+    For `MQL4 <http://docs.mql4.com/>`_ and
+    `MQL5 <http://www.mql5.com/en/docs>`_ source code.
+    """
+    name = 'MQL'
+    aliases = ['mql', 'mq4', 'mq5', 'mql4', 'mql5']
+    filenames = ['*.mq4', '*.mq5', '*.mqh']
+    mimetypes = ['text/x-mql']
+    version_added = '2.0'
+
+    tokens = {
+        'statements': [
+            (words(_mql_builtins.keywords, suffix=r'\b'), Keyword),
+            (words(_mql_builtins.c_types, suffix=r'\b'), Keyword.Type),
+            (words(_mql_builtins.types, suffix=r'\b'), Name.Function),
+            (words(_mql_builtins.constants, suffix=r'\b'), Name.Constant),
+            (words(_mql_builtins.colors, prefix='(clr)?', suffix=r'\b'),
+             Name.Constant),
+            inherit,
+        ],
+    }
+
+
+class ArduinoLexer(CppLexer):
+    """
+    For `Arduino(tm) <https://arduino.cc/>`_ source.
+
+    This is an extension of the CppLexer, as the Arduino® Language is a superset
+    of C++
+    """
+
+    name = 'Arduino'
+    aliases = ['arduino']
+    filenames = ['*.ino']
+    mimetypes = ['text/x-arduino']
+    version_added = '2.1'
+
+    # Language sketch main structure functions
+    structure = {'setup', 'loop'}
+
+    # Language operators
+    operators = {'not', 'or', 'and', 'xor'}
+
+    # Language 'variables'
+    variables = {
+        'DIGITAL_MESSAGE', 'FIRMATA_STRING', 'ANALOG_MESSAGE', 'REPORT_DIGITAL',
+        'REPORT_ANALOG', 'INPUT_PULLUP', 'SET_PIN_MODE', 'INTERNAL2V56', 'SYSTEM_RESET',
+        'LED_BUILTIN', 'INTERNAL1V1', 'SYSEX_START', 'INTERNAL', 'EXTERNAL', 'HIGH',
+        'LOW', 'INPUT', 'OUTPUT', 'INPUT_PULLUP', 'LED_BUILTIN', 'true', 'false',
+        'void', 'boolean', 'char', 'unsigned char', 'byte', 'int', 'unsigned int',
+        'word', 'long', 'unsigned long', 'short', 'float', 'double', 'string', 'String',
+        'array', 'static', 'volatile', 'const', 'boolean', 'byte', 'word', 'string',
+        'String', 'array', 'int', 'float', 'private', 'char', 'virtual', 'operator',
+        'sizeof', 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t', 'int8_t', 'int16_t',
+        'int32_t', 'int64_t', 'dynamic_cast', 'typedef', 'const_cast', 'const',
+        'struct', 'static_cast', 'union', 'unsigned', 'long', 'volatile', 'static',
+        'protected', 'bool', 'public', 'friend', 'auto', 'void', 'enum', 'extern',
+        'class', 'short', 'reinterpret_cast', 'double', 'register', 'explicit',
+        'signed', 'inline', 'delete', '_Bool', 'complex', '_Complex', '_Imaginary',
+        'atomic_bool', 'atomic_char', 'atomic_schar', 'atomic_uchar', 'atomic_short',
+        'atomic_ushort', 'atomic_int', 'atomic_uint', 'atomic_long', 'atomic_ulong',
+        'atomic_llong', 'atomic_ullong', 'PROGMEM'}
+
+    # Language shipped functions and class ( )
+    functions = {
+        'KeyboardController', 'MouseController', 'SoftwareSerial', 'EthernetServer',
+        'EthernetClient', 'LiquidCrystal', 'RobotControl', 'GSMVoiceCall',
+        'EthernetUDP', 'EsploraTFT', 'HttpClient', 'RobotMotor', 'WiFiClient',
+        'GSMScanner', 'FileSystem', 'Scheduler', 'GSMServer', 'YunClient', 'YunServer',
+        'IPAddress', 'GSMClient', 'GSMModem', 'Keyboard', 'Ethernet', 'Console',
+        'GSMBand', 'Esplora', 'Stepper', 'Process', 'WiFiUDP', 'GSM_SMS', 'Mailbox',
+        'USBHost', 'Firmata', 'PImage', 'Client', 'Server', 'GSMPIN', 'FileIO',
+        'Bridge', 'Serial', 'EEPROM', 'Stream', 'Mouse', 'Audio', 'Servo', 'File',
+        'Task', 'GPRS', 'WiFi', 'Wire', 'TFT', 'GSM', 'SPI', 'SD',
+        'runShellCommandAsynchronously', 'analogWriteResolution',
+        'retrieveCallingNumber', 'printFirmwareVersion', 'analogReadResolution',
+        'sendDigitalPortPair', 'noListenOnLocalhost', 'readJoystickButton',
+        'setFirmwareVersion', 'readJoystickSwitch', 'scrollDisplayRight',
+        'getVoiceCallStatus', 'scrollDisplayLeft', 'writeMicroseconds',
+        'delayMicroseconds', 'beginTransmission', 'getSignalStrength',
+        'runAsynchronously', 'getAsynchronously', 'listenOnLocalhost',
+        'getCurrentCarrier', 'readAccelerometer', 'messageAvailable',
+        'sendDigitalPorts', 'lineFollowConfig', 'countryNameWrite', 'runShellCommand',
+        'readStringUntil', 'rewindDirectory', 'readTemperature', 'setClockDivider',
+        'readLightSensor', 'endTransmission', 'analogReference', 'detachInterrupt',
+        'countryNameRead', 'attachInterrupt', 'encryptionType', 'readBytesUntil',
+        'robotNameWrite', 'readMicrophone', 'robotNameRead', 'cityNameWrite',
+        'userNameWrite', 'readJoystickY', 'readJoystickX', 'mouseReleased',
+        'openNextFile', 'scanNetworks', 'noInterrupts', 'digitalWrite', 'beginSpeaker',
+        'mousePressed', 'isActionDone', 'mouseDragged', 'displayLogos', 'noAutoscroll',
+        'addParameter', 'remoteNumber', 'getModifiers', 'keyboardRead', 'userNameRead',
+        'waitContinue', 'processInput', 'parseCommand', 'printVersion', 'readNetworks',
+        'writeMessage', 'blinkVersion', 'cityNameRead', 'readMessage', 'setDataMode',
+        'parsePacket', 'isListening', 'setBitOrder', 'beginPacket', 'isDirectory',
+        'motorsWrite', 'drawCompass', 'digitalRead', 'clearScreen', 'serialEvent',
+        'rightToLeft', 'setTextSize', 'leftToRight', 'requestFrom', 'keyReleased',
+        'compassRead', 'analogWrite', 'interrupts', 'WiFiServer', 'disconnect',
+        'playMelody', 'parseFloat', 'autoscroll', 'getPINUsed', 'setPINUsed',
+        'setTimeout', 'sendAnalog', 'readSlider', 'analogRead', 'beginWrite',
+        'createChar', 'motorsStop', 'keyPressed', 'tempoWrite', 'readButton',
+        'subnetMask', 'debugPrint', 'macAddress', 'writeGreen', 'randomSeed',
+        'attachGPRS', 'readString', 'sendString', 'remotePort', 'releaseAll',
+        'mouseMoved', 'background', 'getXChange', 'getYChange', 'answerCall',
+        'getResult', 'voiceCall', 'endPacket', 'constrain', 'getSocket', 'writeJSON',
+        'getButton', 'available', 'connected', 'findUntil', 'readBytes', 'exitValue',
+        'readGreen', 'writeBlue', 'startLoop', 'IPAddress', 'isPressed', 'sendSysex',
+        'pauseMode', 'gatewayIP', 'setCursor', 'getOemKey', 'tuneWrite', 'noDisplay',
+        'loadImage', 'switchPIN', 'onRequest', 'onReceive', 'changePIN', 'playFile',
+        'noBuffer', 'parseInt', 'overflow', 'checkPIN', 'knobRead', 'beginTFT',
+        'bitClear', 'updateIR', 'bitWrite', 'position', 'writeRGB', 'highByte',
+        'writeRed', 'setSpeed', 'readBlue', 'noStroke', 'remoteIP', 'transfer',
+        'shutdown', 'hangCall', 'beginSMS', 'endWrite', 'attached', 'maintain',
+        'noCursor', 'checkReg', 'checkPUK', 'shiftOut', 'isValid', 'shiftIn', 'pulseIn',
+        'connect', 'println', 'localIP', 'pinMode', 'getIMEI', 'display', 'noBlink',
+        'process', 'getBand', 'running', 'beginSD', 'drawBMP', 'lowByte', 'setBand',
+        'release', 'bitRead', 'prepare', 'pointTo', 'readRed', 'setMode', 'noFill',
+        'remove', 'listen', 'stroke', 'detach', 'attach', 'noTone', 'exists', 'buffer',
+        'height', 'bitSet', 'circle', 'config', 'cursor', 'random', 'IRread', 'setDNS',
+        'endSMS', 'getKey', 'micros', 'millis', 'begin', 'print', 'write', 'ready',
+        'flush', 'width', 'isPIN', 'blink', 'clear', 'press', 'mkdir', 'rmdir', 'close',
+        'point', 'yield', 'image', 'BSSID', 'click', 'delay', 'read', 'text', 'move',
+        'peek', 'beep', 'rect', 'line', 'open', 'seek', 'fill', 'size', 'turn', 'stop',
+        'home', 'find', 'step', 'tone', 'sqrt', 'RSSI', 'SSID', 'end', 'bit', 'tan',
+        'cos', 'sin', 'pow', 'map', 'abs', 'max', 'min', 'get', 'run', 'put',
+        'isAlphaNumeric', 'isAlpha', 'isAscii', 'isWhitespace', 'isControl', 'isDigit',
+        'isGraph', 'isLowerCase', 'isPrintable', 'isPunct', 'isSpace', 'isUpperCase',
+        'isHexadecimalDigit'}
+
+    # do not highlight
+    suppress_highlight = {
+        'namespace', 'template', 'mutable', 'using', 'asm', 'typeid',
+        'typename', 'this', 'alignof', 'constexpr', 'decltype', 'noexcept',
+        'static_assert', 'thread_local', 'restrict'}
+
+    def get_tokens_unprocessed(self, text, stack=('root',)):
+        for index, token, value in CppLexer.get_tokens_unprocessed(self, text, stack):
+            if value in self.structure:
+                yield index, Name.Builtin, value
+            elif value in self.operators:
+                yield index, Operator, value
+            elif value in self.variables:
+                yield index, Keyword.Reserved, value
+            elif value in self.suppress_highlight:
+                yield index, Name, value
+            elif value in self.functions:
+                yield index, Name.Function, value
+            else:
+                yield index, token, value
+
+
+class CharmciLexer(CppLexer):
+    """
+    For `Charm++ <https://charm.cs.illinois.edu>`_ interface files (.ci).
+    """
+
+    name = 'Charmci'
+    aliases = ['charmci']
+    filenames = ['*.ci']
+    version_added = '2.4'
+
+    mimetypes = []
+
+    tokens = {
+        'keywords': [
+            (r'(module)(\s+)', bygroups(Keyword, Text), 'classname'),
+            (words(('mainmodule', 'mainchare', 'chare', 'array', 'group',
+                    'nodegroup', 'message', 'conditional')), Keyword),
+            (words(('entry', 'aggregate', 'threaded', 'sync', 'exclusive',
+                    'nokeep', 'notrace', 'immediate', 'expedited', 'inline',
+                    'local', 'python', 'accel', 'readwrite', 'writeonly',
+                    'accelblock', 'memcritical', 'packed', 'varsize',
+                    'initproc', 'initnode', 'initcall', 'stacksize',
+                    'createhere', 'createhome', 'reductiontarget', 'iget',
+                    'nocopy', 'mutable', 'migratable', 'readonly')), Keyword),
+            inherit,
+        ],
+    }
+
+
+class OmgIdlLexer(CLexer):
+    """
+    Lexer for Object Management Group Interface Definition Language.
+    """
+
+    name = 'OMG Interface Definition Language'
+    url = 'https://www.omg.org/spec/IDL/About-IDL/'
+    aliases = ['omg-idl']
+    filenames = ['*.idl', '*.pidl']
+    mimetypes = []
+    version_added = '2.9'
+
+    scoped_name = r'((::)?\w+)+'
+
+    tokens = {
+        'values': [
+            (words(('true', 'false'), prefix=r'(?i)', suffix=r'\b'), Number),
+            (r'([Ll]?)(")', bygroups(String.Affix, String.Double), 'string'),
+            (r'([Ll]?)(\')(\\[^\']+)(\')',
+                bygroups(String.Affix, String.Char, String.Escape, String.Char)),
+            (r'([Ll]?)(\')(\\\')(\')',
+                bygroups(String.Affix, String.Char, String.Escape, String.Char)),
+            (r'([Ll]?)(\'.\')', bygroups(String.Affix, String.Char)),
+            (r'[+-]?\d+(\.\d*)?[Ee][+-]?\d+', Number.Float),
+            (r'[+-]?(\d+\.\d*)|(\d*\.\d+)([Ee][+-]?\d+)?', Number.Float),
+            (r'(?i)[+-]?0x[0-9a-f]+', Number.Hex),
+            (r'[+-]?[1-9]\d*', Number.Integer),
+            (r'[+-]?0[0-7]*', Number.Oct),
+            (r'[\+\-\*\/%^&\|~]', Operator),
+            (words(('<<', '>>')), Operator),
+            (scoped_name, Name),
+            (r'[{};:,<>\[\]]', Punctuation),
+        ],
+        'annotation_params': [
+            include('whitespace'),
+            (r'\(', Punctuation, '#push'),
+            include('values'),
+            (r'=', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'annotation_params_maybe': [
+            (r'\(', Punctuation, 'annotation_params'),
+            include('whitespace'),
+            default('#pop'),
+        ],
+        'annotation_appl': [
+            (r'@' + scoped_name, Name.Decorator, 'annotation_params_maybe'),
+        ],
+        'enum': [
+            include('whitespace'),
+            (r'[{,]', Punctuation),
+            (r'\w+', Name.Constant),
+            include('annotation_appl'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'root': [
+            include('whitespace'),
+            (words((
+                'typedef', 'const',
+                'in', 'out', 'inout', 'local',
+            ), prefix=r'(?i)', suffix=r'\b'), Keyword.Declaration),
+            (words((
+                'void', 'any', 'native', 'bitfield',
+                'unsigned', 'boolean', 'char', 'wchar', 'octet', 'short', 'long',
+                'int8', 'uint8', 'int16', 'int32', 'int64', 'uint16', 'uint32', 'uint64',
+                'float', 'double', 'fixed',
+                'sequence', 'string', 'wstring', 'map',
+            ), prefix=r'(?i)', suffix=r'\b'), Keyword.Type),
+            (words((
+                '@annotation', 'struct', 'union', 'bitset', 'interface',
+                'exception', 'valuetype', 'eventtype', 'component',
+            ), prefix=r'(?i)', suffix=r'(\s+)(\w+)'), bygroups(Keyword, Whitespace, Name.Class)),
+            (words((
+                'abstract', 'alias', 'attribute', 'case', 'connector',
+                'consumes', 'context', 'custom', 'default', 'emits', 'factory',
+                'finder', 'getraises', 'home', 'import', 'manages', 'mirrorport',
+                'multiple', 'Object', 'oneway', 'primarykey', 'private', 'port',
+                'porttype', 'provides', 'public', 'publishes', 'raises',
+                'readonly', 'setraises', 'supports', 'switch', 'truncatable',
+                'typeid', 'typename', 'typeprefix', 'uses', 'ValueBase',
+            ), prefix=r'(?i)', suffix=r'\b'), Keyword),
+            (r'(?i)(enum|bitmask)(\s+)(\w+)',
+                bygroups(Keyword, Whitespace, Name.Class), 'enum'),
+            (r'(?i)(module)(\s+)(\w+)',
+                bygroups(Keyword.Namespace, Whitespace, Name.Namespace)),
+            (r'(\w+)(\s*)(=)', bygroups(Name.Constant, Whitespace, Operator)),
+            (r'[\(\)]', Punctuation),
+            include('values'),
+            include('annotation_appl'),
+        ],
+    }
+
+
+class PromelaLexer(CLexer):
+    """
+    For the Promela language used with SPIN.
+    """
+    
+    name = 'Promela'
+    aliases = ['promela']
+    filenames = ['*.pml', '*.prom', '*.prm', '*.promela', '*.pr', '*.pm']
+    mimetypes = ['text/x-promela']
+    url = 'https://spinroot.com/spin/whatispin.html'
+    version_added = '2.18'
+
+    # Promela's language reference:
+    # https://spinroot.com/spin/Man/promela.html
+    # Promela's grammar definition:
+    # https://spinroot.com/spin/Man/grammar.html
+
+    tokens = {
+        'statements': [
+            (r'(\[\]|<>|/\\|\\/)|(U|W|V)\b', Operator), # LTL Operators
+            (r'@', Punctuation), #remoterefs
+            (r'(\.)([a-zA-Z_]\w*)', bygroups(Operator, Name.Attribute)),
+            inherit
+        ],
+        'types': [
+            # Predefined (data types)
+            (words((
+                'bit', 'bool', 'byte', 'pid', 'short', 'int', 'unsigned'),
+                suffix=r'\b'),
+             Keyword.Type),
+        ],
+        'keywords': [
+            # ControlFlow
+            (words((
+                'atomic', 'break', 'd_step', 'do', 'od', 'for', 'in', 'goto',
+                'if', 'fi', 'unless'), suffix=r'\b'),
+             Keyword),
+            # BasicStatements
+            (words((
+                'assert', 'get_priority', 'printf', 'printm', 'set_priority'),
+                suffix=r'\b'),
+             Name.Function),
+            # Embedded C Code
+            (words((
+                'c_code', 'c_decl', 'c_expr', 'c_state', 'c_track'),
+                suffix=r'\b'),
+             Keyword),
+            # Predefined (local/global variables)
+            (words((
+                '_', '_last', '_nr_pr', '_pid', '_priority', 'else', 'np_',
+                'STDIN'), suffix=r'\b'),
+             Name.Builtin),
+            # Predefined (functions)
+            (words((
+                'empty', 'enabled', 'eval', 'full', 'len', 'nempty', 'nfull',
+                'pc_value'), suffix=r'\b'),
+             Name.Function),
+            # Predefined (operators)
+            (r'run\b', Operator.Word),
+            # Declarators
+            (words((
+                'active', 'chan', 'D_proctype', 'hidden', 'init', 'local',
+                'mtype', 'never', 'notrace', 'proctype', 'show', 'trace',
+                'typedef', 'xr', 'xs'), suffix=r'\b'),
+             Keyword.Declaration),
+            # Declarators (suffixes)
+            (words((
+                'priority', 'provided'), suffix=r'\b'),
+             Keyword),
+            # MetaTerms (declarators)
+            (words((
+                'inline', 'ltl', 'select'), suffix=r'\b'),
+             Keyword.Declaration),
+            # MetaTerms (keywords)
+            (r'skip\b', Keyword),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/capnproto.py b/.venv/Lib/site-packages/pygments/lexers/capnproto.py
new file mode 100644 (file)
index 0000000..333760e
--- /dev/null
@@ -0,0 +1,74 @@
+"""
+    pygments.lexers.capnproto
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Cap'n Proto schema language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, default
+from pygments.token import Text, Comment, Keyword, Name, Literal, Whitespace
+
+__all__ = ['CapnProtoLexer']
+
+
+class CapnProtoLexer(RegexLexer):
+    """
+    For Cap'n Proto source.
+    """
+    name = 'Cap\'n Proto'
+    url = 'https://capnproto.org'
+    filenames = ['*.capnp']
+    aliases = ['capnp']
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            (r'#.*?$', Comment.Single),
+            (r'@[0-9a-zA-Z]*', Name.Decorator),
+            (r'=', Literal, 'expression'),
+            (r':', Name.Class, 'type'),
+            (r'\$', Name.Attribute, 'annotation'),
+            (r'(struct|enum|interface|union|import|using|const|annotation|'
+             r'extends|in|of|on|as|with|from|fixed)\b',
+             Keyword),
+            (r'[\w.]+', Name),
+            (r'[^#@=:$\w\s]+', Text),
+            (r'\s+', Whitespace),
+        ],
+        'type': [
+            (r'[^][=;,(){}$]+', Name.Class),
+            (r'[\[(]', Name.Class, 'parentype'),
+            default('#pop'),
+        ],
+        'parentype': [
+            (r'[^][;()]+', Name.Class),
+            (r'[\[(]', Name.Class, '#push'),
+            (r'[])]', Name.Class, '#pop'),
+            default('#pop'),
+        ],
+        'expression': [
+            (r'[^][;,(){}$]+', Literal),
+            (r'[\[(]', Literal, 'parenexp'),
+            default('#pop'),
+        ],
+        'parenexp': [
+            (r'[^][;()]+', Literal),
+            (r'[\[(]', Literal, '#push'),
+            (r'[])]', Literal, '#pop'),
+            default('#pop'),
+        ],
+        'annotation': [
+            (r'[^][;,(){}=:]+', Name.Attribute),
+            (r'[\[(]', Name.Attribute, 'annexp'),
+            default('#pop'),
+        ],
+        'annexp': [
+            (r'[^][;()]+', Name.Attribute),
+            (r'[\[(]', Name.Attribute, '#push'),
+            (r'[])]', Name.Attribute, '#pop'),
+            default('#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/carbon.py b/.venv/Lib/site-packages/pygments/lexers/carbon.py
new file mode 100644 (file)
index 0000000..702b37b
--- /dev/null
@@ -0,0 +1,95 @@
+"""
+    pygments.lexers.carbon
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Carbon programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+import re
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['CarbonLexer']
+
+
+class CarbonLexer(RegexLexer):
+    """
+    For Carbon source.
+    """
+    name = 'Carbon'
+    url = 'https://github.com/carbon-language/carbon-lang'
+    filenames = ['*.carbon']
+    aliases = ['carbon']
+    mimetypes = ['text/x-carbon']
+    version_added = '2.15'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'\\\n', Text),
+            # comments
+            (r'//(.*?)\n', Comment.Single),
+            (r'/(\\\n)?[*].*?[*](\\\n)?/', Comment.Multiline),
+            # Declaration
+            (r'(package|import|api|namespace|library)\b', Keyword.Namespace),
+            (r'(abstract|alias|fn|class|interface|let|var|virtual|external|'
+             r'base|addr|extends|choice|constraint|impl)\b', Keyword.Declaration),
+            # Keywords
+            (words(('as', 'or', 'not', 'and', 'break', 'continue', 'case',
+                    'default', 'if', 'else', 'destructor', 'for', 'forall',
+                    'while', 'where', 'then', 'in', 'is', 'return', 'returned',
+                    'friend', 'partial', 'private', 'protected', 'observe', 'Self',
+                    'override', 'final', 'match', 'type', 'like'), suffix=r'\b'), Keyword),
+            (r'(self)\b', Keyword.Pseudo),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'(auto|bool|string|i8|i16|i32|i64|u8|u16|u32|u64|'
+             r'f8|f16|f32|f64)\b', Keyword.Type),
+            # numeric literals
+            (r'[0-9]*[.][0-9]+', Number.Double),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            # string literal
+            (r'"(\\.|[^"\\])*"', String),
+            # char literal
+            (r'\'(\\.|[^\'\\])\'', String.Char),
+            # tokens
+            (r'<<=|>>=|<<|>>|<=|>=|\+=|-=|\*=|/=|\%=|\|=|&=|\^=|&&|\|\||&|\||'
+             r'\+\+|--|\%|\^|\~|==|!=|::|[.]{3}|->|=>|[+\-*/&]', Operator),
+            (r'[|<>=!()\[\]{}.,;:\?]', Punctuation),
+            # identifiers
+            (r'[^\W\d]\w*', Name.Other),
+        ]
+    }
+
+    def analyse_text(text):
+        result = 0
+        if 'forall' in text:
+            result += 0.1
+        if 'type' in text:
+            result += 0.1
+        if 'Self' in text:
+            result += 0.1
+        if 'observe' in text:
+            result += 0.1
+        if 'package' in text:
+            result += 0.1
+        if 'library' in text:
+            result += 0.1
+        if 'choice' in text:
+            result += 0.1
+        if 'addr' in text:
+            result += 0.1
+        if 'constraint' in text:
+            result += 0.1
+        if 'impl' in text:
+            result += 0.1
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/cddl.py b/.venv/Lib/site-packages/pygments/lexers/cddl.py
new file mode 100644 (file)
index 0000000..fa0c85f
--- /dev/null
@@ -0,0 +1,172 @@
+"""
+    pygments.lexers.cddl
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Concise data definition language (CDDL), a notational
+    convention to express CBOR and JSON data structures.
+
+    More information:
+    https://datatracker.ietf.org/doc/rfc8610/
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include, words
+from pygments.token import Comment, Error, Keyword, Name, Number, Operator, \
+    Punctuation, String, Whitespace
+
+__all__ = ['CddlLexer']
+
+
+class CddlLexer(RegexLexer):
+    """
+    Lexer for CDDL definitions.
+    """
+    name = "CDDL"
+    url = 'https://datatracker.ietf.org/doc/rfc8610/'
+    aliases = ["cddl"]
+    filenames = ["*.cddl"]
+    mimetypes = ["text/x-cddl"]
+    version_added = '2.8'
+
+    _prelude_types = [
+        "any",
+        "b64legacy",
+        "b64url",
+        "bigfloat",
+        "bigint",
+        "bignint",
+        "biguint",
+        "bool",
+        "bstr",
+        "bytes",
+        "cbor-any",
+        "decfrac",
+        "eb16",
+        "eb64legacy",
+        "eb64url",
+        "encoded-cbor",
+        "false",
+        "float",
+        "float16",
+        "float16-32",
+        "float32",
+        "float32-64",
+        "float64",
+        "int",
+        "integer",
+        "mime-message",
+        "nil",
+        "nint",
+        "null",
+        "number",
+        "regexp",
+        "tdate",
+        "text",
+        "time",
+        "true",
+        "tstr",
+        "uint",
+        "undefined",
+        "unsigned",
+        "uri",
+    ]
+
+    _controls = [
+        ".and",
+        ".bits",
+        ".cbor",
+        ".cborseq",
+        ".default",
+        ".eq",
+        ".ge",
+        ".gt",
+        ".le",
+        ".lt",
+        ".ne",
+        ".regexp",
+        ".size",
+        ".within",
+    ]
+
+    _re_id = (
+        r"[$@A-Z_a-z]"
+        r"(?:[\-\.]+(?=[$@0-9A-Z_a-z])|[$@0-9A-Z_a-z])*"
+
+    )
+
+    # While the spec reads more like "an int must not start with 0" we use a
+    # lookahead here that says "after a 0 there must be no digit". This makes the
+    # '0' the invalid character in '01', which looks nicer when highlighted.
+    _re_uint = r"(?:0b[01]+|0x[0-9a-fA-F]+|[1-9]\d*|0(?!\d))"
+    _re_int = r"-?" + _re_uint
+
+    tokens = {
+        "commentsandwhitespace": [(r"\s+", Whitespace), (r";.+$", Comment.Single)],
+        "root": [
+            include("commentsandwhitespace"),
+            # tag types
+            (rf"#(\d\.{_re_uint})?", Keyword.Type),  # type or any
+            # occurrence
+            (
+                rf"({_re_uint})?(\*)({_re_uint})?",
+                bygroups(Number, Operator, Number),
+            ),
+            (r"\?|\+", Operator),  # occurrence
+            (r"\^", Operator),  # cuts
+            (r"(\.\.\.|\.\.)", Operator),  # rangeop
+            (words(_controls, suffix=r"\b"), Operator.Word),  # ctlops
+            # into choice op
+            (rf"&(?=\s*({_re_id}|\())", Operator),
+            (rf"~(?=\s*{_re_id})", Operator),  # unwrap op
+            (r"//|/(?!/)", Operator),  # double und single slash
+            (r"=>|/==|/=|=", Operator),
+            (r"[\[\]{}\(\),<>:]", Punctuation),
+            # Bytestrings
+            (r"(b64)(')", bygroups(String.Affix, String.Single), "bstrb64url"),
+            (r"(h)(')", bygroups(String.Affix, String.Single), "bstrh"),
+            (r"'", String.Single, "bstr"),
+            # Barewords as member keys (must be matched before values, types, typenames,
+            # groupnames).
+            # Token type is String as barewords are always interpreted as such.
+            (rf"({_re_id})(\s*)(:)",
+             bygroups(String, Whitespace, Punctuation)),
+            # predefined types
+            (words(_prelude_types, prefix=r"(?![\-_$@])\b", suffix=r"\b(?![\-_$@])"),
+             Name.Builtin),
+            # user-defined groupnames, typenames
+            (_re_id, Name.Class),
+            # values
+            (r"0b[01]+", Number.Bin),
+            (r"0o[0-7]+", Number.Oct),
+            (r"0x[0-9a-fA-F]+(\.[0-9a-fA-F]+)?p[+-]?\d+", Number.Hex),  # hexfloat
+            (r"0x[0-9a-fA-F]+", Number.Hex),  # hex
+            # Float
+            (rf"{_re_int}(?=(\.\d|e[+-]?\d))(?:\.\d+)?(?:e[+-]?\d+)?",
+             Number.Float),
+            # Int
+            (_re_int, Number.Integer),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+        ],
+        "bstrb64url": [
+            (r"'", String.Single, "#pop"),
+            include("commentsandwhitespace"),
+            (r"\\.", String.Escape),
+            (r"[0-9a-zA-Z\-_=]+", String.Single),
+            (r".", Error),
+            # (r";.+$", Token.Other),
+        ],
+        "bstrh": [
+            (r"'", String.Single, "#pop"),
+            include("commentsandwhitespace"),
+            (r"\\.", String.Escape),
+            (r"[0-9a-fA-F]+", String.Single),
+            (r".", Error),
+        ],
+        "bstr": [
+            (r"'", String.Single, "#pop"),
+            (r"\\.", String.Escape),
+            (r"[^'\\]+", String.Single),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/chapel.py b/.venv/Lib/site-packages/pygments/lexers/chapel.py
new file mode 100644 (file)
index 0000000..955a157
--- /dev/null
@@ -0,0 +1,139 @@
+"""
+    pygments.lexers.chapel
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Chapel language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['ChapelLexer']
+
+
+class ChapelLexer(RegexLexer):
+    """
+    For Chapel source.
+    """
+    name = 'Chapel'
+    url = 'https://chapel-lang.org/'
+    filenames = ['*.chpl']
+    aliases = ['chapel', 'chpl']
+    version_added = '2.0'
+    # mimetypes = ['text/x-chapel']
+
+    known_types = ('bool', 'bytes', 'complex', 'imag', 'int', 'locale',
+                   'nothing', 'opaque', 'range', 'real', 'string', 'uint',
+                   'void')
+
+    type_modifiers_par = ('atomic', 'single', 'sync')
+    type_modifiers_mem = ('borrowed', 'owned', 'shared', 'unmanaged')
+    type_modifiers = (*type_modifiers_par, *type_modifiers_mem)
+
+    declarations = ('config', 'const', 'in', 'inout', 'out', 'param', 'ref',
+                    'type', 'var')
+
+    constants = ('false', 'nil', 'none', 'true')
+
+    other_keywords = ('align', 'as',
+                      'begin', 'break', 'by',
+                      'catch', 'cobegin', 'coforall', 'continue',
+                      'defer', 'delete', 'dmapped', 'do', 'domain',
+                      'else', 'enum', 'except', 'export', 'extern',
+                      'for', 'forall', 'foreach', 'forwarding',
+                      'if', 'implements', 'import', 'index', 'init', 'inline',
+                      'label', 'lambda', 'let', 'lifetime', 'local',
+                      'new', 'noinit',
+                      'on', 'only', 'otherwise', 'override',
+                      'pragma', 'primitive', 'private', 'prototype', 'public',
+                      'reduce', 'require', 'return',
+                      'scan', 'select', 'serial', 'sparse', 'subdomain',
+                      'then', 'this', 'throw', 'throws', 'try',
+                      'use',
+                      'when', 'where', 'while', 'with',
+                      'yield',
+                      'zip')
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'\\\n', Text),
+
+            (r'//(.*?)\n', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+
+            (words(declarations, suffix=r'\b'), Keyword.Declaration),
+            (words(constants, suffix=r'\b'), Keyword.Constant),
+            (words(known_types, suffix=r'\b'), Keyword.Type),
+            (words((*type_modifiers, *other_keywords), suffix=r'\b'), Keyword),
+
+            (r'@', Keyword, 'attributename'),
+            (r'(iter)(\s+)', bygroups(Keyword, Whitespace), 'procname'),
+            (r'(proc)(\s+)', bygroups(Keyword, Whitespace), 'procname'),
+            (r'(operator)(\s+)', bygroups(Keyword, Whitespace), 'procname'),
+            (r'(class|interface|module|record|union)(\s+)', bygroups(Keyword, Whitespace),
+             'classname'),
+
+            # imaginary integers
+            (r'\d+i', Number),
+            (r'\d+\.\d*([Ee][-+]\d+)?i', Number),
+            (r'\.\d+([Ee][-+]\d+)?i', Number),
+            (r'\d+[Ee][-+]\d+i', Number),
+
+            # reals cannot end with a period due to lexical ambiguity with
+            # .. operator. See reference for rationale.
+            (r'(\d*\.\d+)([eE][+-]?[0-9]+)?i?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+i?', Number.Float),
+
+            # integer literals
+            # -- binary
+            (r'0[bB][01]+', Number.Bin),
+            # -- hex
+            (r'0[xX][0-9a-fA-F]+', Number.Hex),
+            # -- octal
+            (r'0[oO][0-7]+', Number.Oct),
+            # -- decimal
+            (r'[0-9]+', Number.Integer),
+
+            # strings
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"'(\\\\|\\'|[^'])*'", String),
+
+            # tokens
+            (r'(=|\+=|-=|\*=|/=|\*\*=|%=|&=|\|=|\^=|&&=|\|\|=|<<=|>>=|'
+             r'<=>|<~>|\.\.|by|#|\.\.\.|'
+             r'&&|\|\||!|&|\||\^|~|<<|>>|'
+             r'==|!=|<=|>=|<|>|'
+             r'[+\-*/%]|\*\*)', Operator),
+            (r'[:;,.?()\[\]{}]', Punctuation),
+
+            # identifiers
+            (r'[a-zA-Z_][\w$]*', Name.Other),
+        ],
+        'classname': [
+            (r'[a-zA-Z_][\w$]*', Name.Class, '#pop'),
+        ],
+        'procname': [
+            (r'([a-zA-Z_][.\w$]*|'  # regular function name, including secondary
+             r'\~[a-zA-Z_][.\w$]*|'  # support for legacy destructors
+             r'[+*/!~%<>=&^|\-:]{1,2})',  # operators
+             Name.Function, '#pop'),
+
+            # allow `proc (atomic T).foo`
+            (r'\(', Punctuation, "receivertype"),
+            (r'\)+\.', Punctuation),
+        ],
+        'receivertype': [
+            (words(type_modifiers, suffix=r'\b'), Keyword),
+            (words(known_types, suffix=r'\b'), Keyword.Type),
+            (r'[^()]*', Name.Other, '#pop'),
+        ],
+        'attributename': [
+            (r'[a-zA-Z_][.\w$]*', Name.Decorator, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/clean.py b/.venv/Lib/site-packages/pygments/lexers/clean.py
new file mode 100644 (file)
index 0000000..f96e743
--- /dev/null
@@ -0,0 +1,180 @@
+"""
+    pygments.lexers.clean
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Clean language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import ExtendedRegexLexer, words, default, include, bygroups
+from pygments.token import Comment, Error, Keyword, Literal, Name, Number, \
+    Operator, Punctuation, String, Whitespace
+
+__all__ = ['CleanLexer']
+
+
+class CleanLexer(ExtendedRegexLexer):
+    """
+    Lexer for the general purpose, state-of-the-art, pure and lazy functional
+    programming language Clean.
+
+    .. versionadded: 2.2
+    """
+    name = 'Clean'
+    url = 'http://clean.cs.ru.nl/Clean'
+    aliases = ['clean']
+    filenames = ['*.icl', '*.dcl']
+    version_added = ''
+
+    keywords = (
+        'case', 'ccall', 'class', 'code', 'code inline', 'derive', 'export',
+        'foreign', 'generic', 'if', 'in', 'infix', 'infixl', 'infixr',
+        'instance', 'let', 'of', 'otherwise', 'special', 'stdcall', 'where',
+        'with')
+
+    modulewords = ('implementation', 'definition', 'system')
+
+    lowerId = r'[a-z`][\w`]*'
+    upperId = r'[A-Z`][\w`]*'
+    funnyId = r'[~@#$%\^?!+\-*<>\\/|&=:]+'
+    scoreUpperId = r'_' + upperId
+    scoreLowerId = r'_' + lowerId
+    moduleId = r'[a-zA-Z_][a-zA-Z0-9_.`]+'
+    classId = '|'.join([lowerId, upperId, funnyId])
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('keywords'),
+            include('module'),
+            include('import'),
+            include('whitespace'),
+            include('literals'),
+            include('operators'),
+            include('delimiters'),
+            include('names'),
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+        ],
+        'comments': [
+            (r'//.*\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comments.in'),
+            (r'/\*\*', Comment.Special, 'comments.in'),
+        ],
+        'comments.in': [
+            (r'\*\/', Comment.Multiline, '#pop'),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'[^*/]+', Comment.Multiline),
+            (r'\*(?!/)', Comment.Multiline),
+            (r'/', Comment.Multiline),
+        ],
+        'keywords': [
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword),
+        ],
+        'module': [
+            (words(modulewords, prefix=r'\b', suffix=r'\b'), Keyword.Namespace),
+            (r'\bmodule\b', Keyword.Namespace, 'module.name'),
+        ],
+        'module.name': [
+            include('whitespace'),
+            (moduleId, Name.Class, '#pop'),
+        ],
+        'import': [
+            (r'\b(import)\b(\s*)', bygroups(Keyword, Whitespace), 'import.module'),
+            (r'\b(from)\b(\s*)\b(' + moduleId + r')\b(\s*)\b(import)\b',
+                bygroups(Keyword, Whitespace, Name.Class, Whitespace, Keyword),
+                'import.what'),
+        ],
+        'import.module': [
+            (r'\b(qualified)\b(\s*)', bygroups(Keyword, Whitespace)),
+            (r'(\s*)\b(as)\b', bygroups(Whitespace, Keyword), ('#pop', 'import.module.as')),
+            (moduleId, Name.Class),
+            (r'(\s*)(,)(\s*)', bygroups(Whitespace, Punctuation, Whitespace)),
+            (r'\s+', Whitespace),
+            default('#pop'),
+        ],
+        'import.module.as': [
+            include('whitespace'),
+            (lowerId, Name.Class, '#pop'),
+            (upperId, Name.Class, '#pop'),
+        ],
+        'import.what': [
+            (r'\b(class)\b(\s+)(' + classId + r')',
+                bygroups(Keyword, Whitespace, Name.Class), 'import.what.class'),
+            (r'\b(instance)(\s+)(' + classId + r')(\s+)',
+                bygroups(Keyword, Whitespace, Name.Class, Whitespace), 'import.what.instance'),
+            (r'(::)(\s*)\b(' + upperId + r')\b',
+                bygroups(Punctuation, Whitespace, Name.Class), 'import.what.type'),
+            (r'\b(generic)\b(\s+)\b(' + lowerId + '|' + upperId + r')\b',
+                bygroups(Keyword, Whitespace, Name)),
+            include('names'),
+            (r'(,)(\s+)', bygroups(Punctuation, Whitespace)),
+            (r'$', Whitespace, '#pop'),
+            include('whitespace'),
+        ],
+        'import.what.class': [
+            (r',', Punctuation, '#pop'),
+            (r'\(', Punctuation, 'import.what.class.members'),
+            (r'$', Whitespace, '#pop:2'),
+            include('whitespace'),
+        ],
+        'import.what.class.members': [
+            (r',', Punctuation),
+            (r'\.\.', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+            include('names'),
+        ],
+        'import.what.instance': [
+            (r'[,)]', Punctuation, '#pop'),
+            (r'\(', Punctuation, 'import.what.instance'),
+            (r'$', Whitespace, '#pop:2'),
+            include('whitespace'),
+            include('names'),
+        ],
+        'import.what.type': [
+            (r',', Punctuation, '#pop'),
+            (r'[({]', Punctuation, 'import.what.type.consesandfields'),
+            (r'$', Whitespace, '#pop:2'),
+            include('whitespace'),
+        ],
+        'import.what.type.consesandfields': [
+            (r',', Punctuation),
+            (r'\.\.', Punctuation),
+            (r'[)}]', Punctuation, '#pop'),
+            include('names'),
+        ],
+        'literals': [
+            (r'\'([^\'\\]|\\(x[\da-fA-F]+|\d+|.))\'', Literal.Char),
+            (r'[+~-]?0[0-7]+\b', Number.Oct),
+            (r'[+~-]?\d+\.\d+(E[+-]?\d+)?', Number.Float),
+            (r'[+~-]?\d+\b', Number.Integer),
+            (r'[+~-]?0x[\da-fA-F]+\b', Number.Hex),
+            (r'True|False', Literal),
+            (r'"', String.Double, 'literals.stringd'),
+        ],
+        'literals.stringd': [
+            (r'[^\\"\n]+', String.Double),
+            (r'"', String.Double, '#pop'),
+            (r'\\.', String.Double),
+            (r'[$\n]', Error, '#pop'),
+        ],
+        'operators': [
+            (r'[-~@#$%\^?!+*<>\\/|&=:.]+', Operator),
+            (r'\b_+\b', Operator),
+        ],
+        'delimiters': [
+            (r'[,;(){}\[\]]', Punctuation),
+            (r'(\')([\w`.]+)(\')',
+                bygroups(Punctuation, Name.Class, Punctuation)),
+        ],
+        'names': [
+            (lowerId, Name),
+            (scoreLowerId, Name),
+            (funnyId, Name.Function),
+            (upperId, Name.Class),
+            (scoreUpperId, Name.Class),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/codeql.py b/.venv/Lib/site-packages/pygments/lexers/codeql.py
new file mode 100644 (file)
index 0000000..3d06bec
--- /dev/null
@@ -0,0 +1,80 @@
+"""
+    pygments.lexers.codeql
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for CodeQL query language.
+
+    The grammar is originating from:
+    https://github.com/github/vscode-codeql/blob/main/syntaxes/README.md
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+__all__ = ['CodeQLLexer']
+
+import re
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+class CodeQLLexer(RegexLexer):
+    name = 'CodeQL'
+    aliases = ['codeql', 'ql']
+    filenames = ['*.ql', '*.qll']
+    mimetypes = []
+    url = 'https://github.com/github/codeql'
+    version_added = '2.19'
+
+    flags = re.MULTILINE | re.UNICODE
+
+    tokens = {
+        'root': [
+            # Whitespace and comments
+            (r'\s+', Whitespace),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+
+             # Keywords
+            (words((
+                'module', 'import', 'class', 'extends', 'implements',
+                'predicate', 'select', 'where', 'from', 'as', 'and', 'or', 'not',
+                'in', 'if', 'then', 'else', 'exists', 'forall', 'instanceof',
+                'private', 'predicate', 'abstract', 'cached', 'external',
+                'final', 'library', 'override', 'query'
+            ), suffix=r'\b'), Keyword.Builtin),
+
+            # Special Keywords
+            (words(('this'),                # class related keywords
+                   prefix=r'\b', suffix=r'\b\??:?'), Name.Builtin.Pseudo),
+
+            # Types
+            (words((
+                'boolean', 'date', 'float', 'int', 'string'
+            ), suffix=r'\b'), Keyword.Type),
+
+            # Literals
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r'[0-9]+\.[0-9]+', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            
+            # Operators
+            (r'<=|>=|<|>|=|!=|\+|-|\*|/', Operator),
+
+            # Punctuation
+            (r'[.,;:\[\]{}()]+', Punctuation),
+
+            # Identifiers
+            (r'@[a-zA-Z_]\w*', Name.Variable),  # Variables with @ prefix
+            (r'[A-Z][a-zA-Z0-9_]*', Name.Class),  # Types and classes
+            (r'[a-z][a-zA-Z0-9_]*', Name.Variable),  # Variables and predicates
+        ],
+        'multiline-comments': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+
+    }
\ No newline at end of file
diff --git a/.venv/Lib/site-packages/pygments/lexers/comal.py b/.venv/Lib/site-packages/pygments/lexers/comal.py
new file mode 100644 (file)
index 0000000..3c89a59
--- /dev/null
@@ -0,0 +1,81 @@
+"""
+    pygments.lexers.comal
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for COMAL-80.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Whitespace, Operator, Keyword, String, \
+    Number, Name, Punctuation
+
+__all__ = ["Comal80Lexer"]
+
+
+class Comal80Lexer(RegexLexer):
+    """
+    For COMAL-80 source code.
+    """
+
+    name = 'COMAL-80'
+    url = 'https://en.wikipedia.org/wiki/COMAL'
+    aliases = ['comal', 'comal80']
+    filenames = ['*.cml', '*.comal']
+    version_added = ''
+    flags = re.IGNORECASE
+    #
+    # COMAL allows for some strange characters in names which we list here so
+    # keywords and word operators will not be recognized at the start of an
+    # identifier.
+    #
+    _suffix = r"\b(?!['\[\]←£\\])"
+    _identifier = r"[a-z]['\[\]←£\\\w]*"
+
+    tokens = {
+        'root': [
+            (r'//.*\n', Comment.Single),
+            (r'\s+', Whitespace),
+            (r':[=+-]|\<\>|[-+*/^↑<>=]', Operator),
+            (r'(and +then|or +else)' + _suffix, Operator.Word),
+            (words([
+                'and', 'bitand', 'bitor', 'bitxor', 'div', 'in', 'mod', 'not',
+                'or'], suffix=_suffix,), Operator.Word),
+            (words([
+                'append', 'at', 'case', 'chain', 'close', 'copy', 'create', 'cursor',
+                'data', 'delete', 'dir', 'do', 'elif', 'else', 'end', 'endcase', 'endif',
+                'endfor', 'endloop', 'endtrap', 'endwhile', 'exec', 'exit', 'file',
+                'for', 'goto', 'handler', 'if', 'input', 'let', 'loop', 'mount', 'null',
+                'of', 'open', 'otherwise', 'output', 'page', 'pass', 'poke', 'print',
+                'random', 'read', 'repeat', 'report', 'return', 'rename', 'restore',
+                'select', 'step', 'stop', 'sys', 'then', 'to', 'trap', 'unit', 'unit$',
+                'until', 'using', 'when', 'while', 'write', 'zone'], suffix=_suffix),
+                Keyword.Reserved),
+            (words([
+                'closed', 'dim', 'endfunc', 'endproc', 'external', 'func', 'import',
+                'proc', 'ref', 'use'], suffix=_suffix), Keyword.Declaration),
+            (words([
+                'abs', 'atn', 'chr$', 'cos', 'eod', 'eof', 'err', 'errfile', 'errtext',
+                'esc', 'exp', 'int', 'key$', 'len', 'log', 'ord', 'peek', 'randomize',
+                'rnd', 'sgn', 'sin', 'spc$', 'sqr', 'status$', 'str$', 'tab', 'tan',
+                'time', 'val'], suffix=_suffix), Name.Builtin),
+            (words(['false', 'pi', 'true'], suffix=_suffix), Keyword.Constant),
+            (r'"', String, 'string'),
+            (_identifier + r":(?=[ \n/])", Name.Label),
+            (_identifier + r"[$#]?", Name),
+            (r'%[01]+', Number.Bin),
+            (r'\$[0-9a-f]+', Number.Hex),
+            (r'\d*\.\d*(e[-+]?\d+)?', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'[(),:;]', Punctuation),
+        ],
+        'string': [
+            (r'[^"]+', String),
+            (r'"[0-9]*"', String.Escape),
+            (r'"', String, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/compiled.py b/.venv/Lib/site-packages/pygments/lexers/compiled.py
new file mode 100644 (file)
index 0000000..5e0cc18
--- /dev/null
@@ -0,0 +1,35 @@
+"""
+    pygments.lexers.compiled
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexer classes previously contained in this module.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# ruff: noqa: F401
+from pygments.lexers.jvm import JavaLexer, ScalaLexer
+from pygments.lexers.c_cpp import CLexer, CppLexer
+from pygments.lexers.d import DLexer
+from pygments.lexers.objective import ObjectiveCLexer, \
+    ObjectiveCppLexer, LogosLexer
+from pygments.lexers.go import GoLexer
+from pygments.lexers.rust import RustLexer
+from pygments.lexers.c_like import ECLexer, ValaLexer, CudaLexer
+from pygments.lexers.pascal import DelphiLexer, PortugolLexer, Modula2Lexer
+from pygments.lexers.ada import AdaLexer
+from pygments.lexers.business import CobolLexer, CobolFreeformatLexer
+from pygments.lexers.fortran import FortranLexer
+from pygments.lexers.prolog import PrologLexer
+from pygments.lexers.python import CythonLexer
+from pygments.lexers.graphics import GLShaderLexer
+from pygments.lexers.ml import OcamlLexer
+from pygments.lexers.basic import BlitzBasicLexer, BlitzMaxLexer, MonkeyLexer
+from pygments.lexers.dylan import DylanLexer, DylanLidLexer, DylanConsoleLexer
+from pygments.lexers.ooc import OocLexer
+from pygments.lexers.felix import FelixLexer
+from pygments.lexers.nimrod import NimrodLexer
+from pygments.lexers.crystal import CrystalLexer
+
+__all__ = []
diff --git a/.venv/Lib/site-packages/pygments/lexers/configs.py b/.venv/Lib/site-packages/pygments/lexers/configs.py
new file mode 100644 (file)
index 0000000..5e7f47b
--- /dev/null
@@ -0,0 +1,1433 @@
+"""
+    pygments.lexers.configs
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for configuration file formats.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import ExtendedRegexLexer, RegexLexer, default, words, \
+    bygroups, include, using, line_re
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace, Literal, Error, Generic
+from pygments.lexers.shell import BashLexer
+from pygments.lexers.data import JsonLexer
+
+__all__ = ['IniLexer', 'SystemdLexer', 'DesktopLexer', 'RegeditLexer', 'PropertiesLexer',
+           'KconfigLexer', 'Cfengine3Lexer', 'ApacheConfLexer', 'SquidConfLexer',
+           'NginxConfLexer', 'LighttpdConfLexer', 'DockerLexer',
+           'TerraformLexer', 'TermcapLexer', 'TerminfoLexer',
+           'PkgConfigLexer', 'PacmanConfLexer', 'AugeasLexer', 'TOMLLexer',
+           'NestedTextLexer', 'SingularityLexer', 'UnixConfigLexer']
+
+
+class IniLexer(RegexLexer):
+    """
+    Lexer for configuration files in INI style.
+    """
+
+    name = 'INI'
+    aliases = ['ini', 'cfg', 'dosini']
+    filenames = [
+        '*.ini', '*.cfg', '*.inf', '.editorconfig',
+    ]
+    mimetypes = ['text/x-ini', 'text/inf']
+    url = 'https://en.wikipedia.org/wiki/INI_file'
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'[;#].*', Comment.Single),
+            (r'(\[.*?\])([ \t]*)$', bygroups(Keyword, Whitespace)),
+            (r'''(.*?)([ \t]*)([=:])([ \t]*)(["'])''',
+             bygroups(Name.Attribute, Whitespace, Operator, Whitespace, String),
+             "quoted_value"),
+            (r'(.*?)([ \t]*)([=:])([ \t]*)([^;#\n]*)(\\)(\s+)',
+             bygroups(Name.Attribute, Whitespace, Operator, Whitespace, String,
+                      Text, Whitespace),
+             "value"),
+            (r'(.*?)([ \t]*)([=:])([ \t]*)([^ ;#\n]*(?: +[^ ;#\n]+)*)',
+             bygroups(Name.Attribute, Whitespace, Operator, Whitespace, String)),
+            # standalone option, supported by some INI parsers
+            (r'(.+?)$', Name.Attribute),
+        ],
+        'quoted_value': [
+            (r'''([^"'\n]*)(["'])(\s*)''',
+             bygroups(String, String, Whitespace), "#pop"),
+            (r'[;#].*', Comment.Single),
+            (r'$', String, "#pop"),
+        ],
+        'value': [     # line continuation
+            (r'\s+', Whitespace),
+            (r'(\s*)(.*)(\\)([ \t]*)',
+             bygroups(Whitespace, String, Text, Whitespace)),
+            (r'.*$', String, "#pop"),
+        ],
+    }
+
+    def analyse_text(text):
+        npos = text.find('\n')
+        if npos < 3:
+            return False
+        if text[0] == '[' and text[npos-1] == ']':
+            return 0.8
+        return False
+
+
+class DesktopLexer(RegexLexer):
+    """
+    Lexer for .desktop files.
+    """
+
+    name = 'Desktop file'
+    url = "https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html"
+    aliases = ['desktop']
+    filenames = ['*.desktop']
+    mimetypes = ['application/x-desktop']
+    version_added = '2.16'
+
+    tokens = {
+        'root': [
+            (r'^[ \t]*\n', Whitespace),
+            (r'^(#.*)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'(\[[^\]\n]+\])(\n)', bygroups(Keyword, Whitespace)),
+            (r'([-A-Za-z0-9]+)(\[[^\] \t=]+\])?([ \t]*)(=)([ \t]*)([^\n]*)([ \t\n]*\n)',
+             bygroups(Name.Attribute, Name.Namespace, Whitespace, Operator, Whitespace, String, Whitespace)),
+        ],
+    }
+
+    def analyse_text(text):
+        if text.startswith("[Desktop Entry]"):
+            return 1.0
+        if re.search(r"^\[Desktop Entry\][ \t]*$", text[:500], re.MULTILINE) is not None:
+            return 0.9
+        return 0.0
+
+
+class SystemdLexer(RegexLexer):
+    """
+    Lexer for systemd unit files.
+    """
+
+    name = 'Systemd'
+    url = "https://www.freedesktop.org/software/systemd/man/systemd.syntax.html"
+    aliases = ['systemd']
+    filenames = [
+        '*.service', '*.socket', '*.device', '*.mount', '*.automount',
+        '*.swap', '*.target', '*.path', '*.timer', '*.slice', '*.scope',
+    ]
+    version_added = '2.16'
+
+    tokens = {
+        'root': [
+            (r'^[ \t]*\n', Whitespace),
+            (r'^([;#].*)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'(\[[^\]\n]+\])(\n)', bygroups(Keyword, Whitespace)),
+            (r'([^=]+)([ \t]*)(=)([ \t]*)([^\n]*)(\\)(\n)',
+             bygroups(Name.Attribute, Whitespace, Operator, Whitespace, String,
+                      Text, Whitespace),
+             "value"),
+            (r'([^=]+)([ \t]*)(=)([ \t]*)([^\n]*)(\n)',
+             bygroups(Name.Attribute, Whitespace, Operator, Whitespace, String, Whitespace)),
+        ],
+        'value': [
+            # line continuation
+            (r'^([;#].*)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'([ \t]*)([^\n]*)(\\)(\n)',
+             bygroups(Whitespace, String, Text, Whitespace)),
+            (r'([ \t]*)([^\n]*)(\n)',
+             bygroups(Whitespace, String, Whitespace), "#pop"),
+        ],
+    }
+
+    def analyse_text(text):
+        if text.startswith("[Unit]"):
+            return 1.0
+        if re.search(r"^\[Unit\][ \t]*$", text[:500], re.MULTILINE) is not None:
+            return 0.9
+        return 0.0
+
+
+class RegeditLexer(RegexLexer):
+    """
+    Lexer for Windows Registry files produced by regedit.
+    """
+
+    name = 'reg'
+    url = 'http://en.wikipedia.org/wiki/Windows_Registry#.REG_files'
+    aliases = ['registry']
+    filenames = ['*.reg']
+    mimetypes = ['text/x-windows-registry']
+    version_added = '1.6'
+
+    tokens = {
+        'root': [
+            (r'Windows Registry Editor.*', Text),
+            (r'\s+', Whitespace),
+            (r'[;#].*', Comment.Single),
+            (r'(\[)(-?)(HKEY_[A-Z_]+)(.*?\])$',
+             bygroups(Keyword, Operator, Name.Builtin, Keyword)),
+            # String keys, which obey somewhat normal escaping
+            (r'("(?:\\"|\\\\|[^"])+")([ \t]*)(=)([ \t]*)',
+             bygroups(Name.Attribute, Whitespace, Operator, Whitespace),
+             'value'),
+            # Bare keys (includes @)
+            (r'(.*?)([ \t]*)(=)([ \t]*)',
+             bygroups(Name.Attribute, Whitespace, Operator, Whitespace),
+             'value'),
+        ],
+        'value': [
+            (r'-', Operator, '#pop'),  # delete value
+            (r'(dword|hex(?:\([0-9a-fA-F]\))?)(:)([0-9a-fA-F,]+)',
+             bygroups(Name.Variable, Punctuation, Number), '#pop'),
+            # As far as I know, .reg files do not support line continuation.
+            (r'.+', String, '#pop'),
+            default('#pop'),
+        ]
+    }
+
+    def analyse_text(text):
+        return text.startswith('Windows Registry Editor')
+
+
+class PropertiesLexer(RegexLexer):
+    """
+    Lexer for configuration files in Java's properties format.
+
+    Note: trailing whitespace counts as part of the value as per spec
+    """
+
+    name = 'Properties'
+    aliases = ['properties', 'jproperties']
+    filenames = ['*.properties']
+    mimetypes = ['text/x-java-properties']
+    url = 'https://en.wikipedia.org/wiki/.properties'
+    version_added = '1.4'
+
+    tokens = {
+        'root': [
+            # comments
+            (r'[!#].*|/{2}.*', Comment.Single),
+            # ending a comment or whitespace-only line
+            (r'\n', Whitespace),
+            # eat whitespace at the beginning of a line
+            (r'^[^\S\n]+', Whitespace),
+            # start lexing a key
+            default('key'),
+        ],
+        'key': [
+            # non-escaped key characters
+            (r'[^\\:=\s]+', Name.Attribute),
+            # escapes
+            include('escapes'),
+            # separator is the first non-escaped whitespace or colon or '=' on the line;
+            # if it's whitespace, = and : are gobbled after it
+            (r'([^\S\n]*)([:=])([^\S\n]*)',
+             bygroups(Whitespace, Operator, Whitespace),
+             ('#pop', 'value')),
+            (r'[^\S\n]+', Whitespace, ('#pop', 'value')),
+            # maybe we got no value after all
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'value': [
+            # non-escaped value characters
+            (r'[^\\\n]+', String),
+            # escapes
+            include('escapes'),
+            # end the value on an unescaped newline
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'escapes': [
+            # line continuations; these gobble whitespace at the beginning of the next line
+            (r'(\\\n)([^\S\n]*)', bygroups(String.Escape, Whitespace)),
+            # other escapes
+            (r'\\(.|\n)', String.Escape),
+        ],
+    }
+
+
+def _rx_indent(level):
+    # Kconfig *always* interprets a tab as 8 spaces, so this is the default.
+    # Edit this if you are in an environment where KconfigLexer gets expanded
+    # input (tabs expanded to spaces) and the expansion tab width is != 8,
+    # e.g. in connection with Trac (trac.ini, [mimeviewer], tab_width).
+    # Value range here is 2 <= {tab_width} <= 8.
+    tab_width = 8
+    # Regex matching a given indentation {level}, assuming that indentation is
+    # a multiple of {tab_width}. In other cases there might be problems.
+    if tab_width == 2:
+        space_repeat = '+'
+    else:
+        space_repeat = '{1,%d}' % (tab_width - 1)
+    if level == 1:
+        level_repeat = ''
+    else:
+        level_repeat = f'{{{level}}}'
+    return rf'(?:\t| {space_repeat}\t| {{{tab_width}}}){level_repeat}.*\n'
+
+
+class KconfigLexer(RegexLexer):
+    """
+    For Linux-style Kconfig files.
+    """
+
+    name = 'Kconfig'
+    aliases = ['kconfig', 'menuconfig', 'linux-config', 'kernel-config']
+    version_added = '1.6'
+    # Adjust this if new kconfig file names appear in your environment
+    filenames = ['Kconfig*', '*Config.in*', 'external.in*',
+                 'standard-modules.in']
+    mimetypes = ['text/x-kconfig']
+    url = 'https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html'
+
+    # No re.MULTILINE, indentation-aware help text needs line-by-line handling
+    flags = 0
+
+    def call_indent(level):
+        # If indentation >= {level} is detected, enter state 'indent{level}'
+        return (_rx_indent(level), String.Doc, f'indent{level}')
+
+    def do_indent(level):
+        # Print paragraphs of indentation level >= {level} as String.Doc,
+        # ignoring blank lines. Then return to 'root' state.
+        return [
+            (_rx_indent(level), String.Doc),
+            (r'\s*\n', Text),
+            default('#pop:2')
+        ]
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'#.*?\n', Comment.Single),
+            (words((
+                'mainmenu', 'config', 'menuconfig', 'choice', 'endchoice',
+                'comment', 'menu', 'endmenu', 'visible if', 'if', 'endif',
+                'source', 'prompt', 'select', 'depends on', 'default',
+                'range', 'option'), suffix=r'\b'),
+             Keyword),
+            (r'(---help---|help)[\t ]*\n', Keyword, 'help'),
+            (r'(bool|tristate|string|hex|int|defconfig_list|modules|env)\b',
+             Name.Builtin),
+            (r'[!=&|]', Operator),
+            (r'[()]', Punctuation),
+            (r'[0-9]+', Number.Integer),
+            (r"'(''|[^'])*'", String.Single),
+            (r'"(""|[^"])*"', String.Double),
+            (r'\S+', Text),
+        ],
+        # Help text is indented, multi-line and ends when a lower indentation
+        # level is detected.
+        'help': [
+            # Skip blank lines after help token, if any
+            (r'\s*\n', Text),
+            # Determine the first help line's indentation level heuristically(!).
+            # Attention: this is not perfect, but works for 99% of "normal"
+            # indentation schemes up to a max. indentation level of 7.
+            call_indent(7),
+            call_indent(6),
+            call_indent(5),
+            call_indent(4),
+            call_indent(3),
+            call_indent(2),
+            call_indent(1),
+            default('#pop'),  # for incomplete help sections without text
+        ],
+        # Handle text for indentation levels 7 to 1
+        'indent7': do_indent(7),
+        'indent6': do_indent(6),
+        'indent5': do_indent(5),
+        'indent4': do_indent(4),
+        'indent3': do_indent(3),
+        'indent2': do_indent(2),
+        'indent1': do_indent(1),
+    }
+
+
+class Cfengine3Lexer(RegexLexer):
+    """
+    Lexer for CFEngine3 policy files.
+    """
+
+    name = 'CFEngine3'
+    url = 'http://cfengine.org'
+    aliases = ['cfengine3', 'cf3']
+    filenames = ['*.cf']
+    mimetypes = []
+    version_added = '1.5'
+
+    tokens = {
+        'root': [
+            (r'#.*?\n', Comment),
+            (r'(body)(\s+)(\S+)(\s+)(control)',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword)),
+            (r'(body|bundle)(\s+)(\S+)(\s+)(\w+)(\()',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Function, Punctuation),
+             'arglist'),
+            (r'(body|bundle)(\s+)(\S+)(\s+)(\w+)',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Function)),
+            (r'(")([^"]+)(")(\s+)(string|slist|int|real)(\s*)(=>)(\s*)',
+             bygroups(Punctuation, Name.Variable, Punctuation,
+                      Whitespace, Keyword.Type, Whitespace, Operator, Whitespace)),
+            (r'(\S+)(\s*)(=>)(\s*)',
+             bygroups(Keyword.Reserved, Whitespace, Operator, Text)),
+            (r'"', String, 'string'),
+            (r'(\w+)(\()', bygroups(Name.Function, Punctuation)),
+            (r'([\w.!&|()]+)(::)', bygroups(Name.Class, Punctuation)),
+            (r'(\w+)(:)', bygroups(Keyword.Declaration, Punctuation)),
+            (r'@[{(][^)}]+[})]', Name.Variable),
+            (r'[(){},;]', Punctuation),
+            (r'=>', Operator),
+            (r'->', Operator),
+            (r'\d+\.\d+', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'\w+', Name.Function),
+            (r'\s+', Whitespace),
+        ],
+        'string': [
+            (r'\$[{(]', String.Interpol, 'interpol'),
+            (r'\\.', String.Escape),
+            (r'"', String, '#pop'),
+            (r'\n', String),
+            (r'.', String),
+        ],
+        'interpol': [
+            (r'\$[{(]', String.Interpol, '#push'),
+            (r'[})]', String.Interpol, '#pop'),
+            (r'[^${()}]+', String.Interpol),
+        ],
+        'arglist': [
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'\w+', Name.Variable),
+            (r'\s+', Whitespace),
+        ],
+    }
+
+
+class ApacheConfLexer(RegexLexer):
+    """
+    Lexer for configuration files following the Apache config file
+    format.
+    """
+
+    name = 'ApacheConf'
+    aliases = ['apacheconf', 'aconf', 'apache']
+    filenames = ['.htaccess', 'apache.conf', 'apache2.conf']
+    mimetypes = ['text/x-apacheconf']
+    url = 'https://httpd.apache.org/docs/current/configuring.html'
+    version_added = '0.6'
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'#(.*\\\n)+.*$|(#.*?)$', Comment),
+            (r'(<[^\s>/][^\s>]*)(?:(\s+)(.*))?(>)',
+             bygroups(Name.Tag, Whitespace, String, Name.Tag)),
+            (r'(</[^\s>]+)(>)',
+             bygroups(Name.Tag, Name.Tag)),
+            (r'[a-z]\w*', Name.Builtin, 'value'),
+            (r'\.+', Text),
+        ],
+        'value': [
+            (r'\\\n', Text),
+            (r'\n+', Whitespace, '#pop'),
+            (r'\\', Text),
+            (r'[^\S\n]+', Whitespace),
+            (r'\d+\.\d+\.\d+\.\d+(?:/\d+)?', Number),
+            (r'\d+', Number),
+            (r'/([*a-z0-9][*\w./-]+)', String.Other),
+            (r'(on|off|none|any|all|double|email|dns|min|minimal|'
+             r'os|productonly|full|emerg|alert|crit|error|warn|'
+             r'notice|info|debug|registry|script|inetd|standalone|'
+             r'user|group)\b', Keyword),
+            (r'"([^"\\]*(?:\\(.|\n)[^"\\]*)*)"', String.Double),
+            (r'[^\s"\\]+', Text)
+        ],
+    }
+
+
+class SquidConfLexer(RegexLexer):
+    """
+    Lexer for squid configuration files.
+    """
+
+    name = 'SquidConf'
+    url = 'http://www.squid-cache.org/'
+    aliases = ['squidconf', 'squid.conf', 'squid']
+    filenames = ['squid.conf']
+    mimetypes = ['text/x-squidconf']
+    version_added = '0.9'
+    flags = re.IGNORECASE
+
+    keywords = (
+        "access_log", "acl", "always_direct", "announce_host",
+        "announce_period", "announce_port", "announce_to", "anonymize_headers",
+        "append_domain", "as_whois_server", "auth_param_basic",
+        "authenticate_children", "authenticate_program", "authenticate_ttl",
+        "broken_posts", "buffered_logs", "cache_access_log", "cache_announce",
+        "cache_dir", "cache_dns_program", "cache_effective_group",
+        "cache_effective_user", "cache_host", "cache_host_acl",
+        "cache_host_domain", "cache_log", "cache_mem", "cache_mem_high",
+        "cache_mem_low", "cache_mgr", "cachemgr_passwd", "cache_peer",
+        "cache_peer_access", "cache_replacement_policy", "cache_stoplist",
+        "cache_stoplist_pattern", "cache_store_log", "cache_swap",
+        "cache_swap_high", "cache_swap_log", "cache_swap_low", "client_db",
+        "client_lifetime", "client_netmask", "connect_timeout", "coredump_dir",
+        "dead_peer_timeout", "debug_options", "delay_access", "delay_class",
+        "delay_initial_bucket_level", "delay_parameters", "delay_pools",
+        "deny_info", "dns_children", "dns_defnames", "dns_nameservers",
+        "dns_testnames", "emulate_httpd_log", "err_html_text",
+        "fake_user_agent", "firewall_ip", "forwarded_for", "forward_snmpd_port",
+        "fqdncache_size", "ftpget_options", "ftpget_program", "ftp_list_width",
+        "ftp_passive", "ftp_user", "half_closed_clients", "header_access",
+        "header_replace", "hierarchy_stoplist", "high_response_time_warning",
+        "high_page_fault_warning", "hosts_file", "htcp_port", "http_access",
+        "http_anonymizer", "httpd_accel", "httpd_accel_host",
+        "httpd_accel_port", "httpd_accel_uses_host_header",
+        "httpd_accel_with_proxy", "http_port", "http_reply_access",
+        "icp_access", "icp_hit_stale", "icp_port", "icp_query_timeout",
+        "ident_lookup", "ident_lookup_access", "ident_timeout",
+        "incoming_http_average", "incoming_icp_average", "inside_firewall",
+        "ipcache_high", "ipcache_low", "ipcache_size", "local_domain",
+        "local_ip", "logfile_rotate", "log_fqdn", "log_icp_queries",
+        "log_mime_hdrs", "maximum_object_size", "maximum_single_addr_tries",
+        "mcast_groups", "mcast_icp_query_timeout", "mcast_miss_addr",
+        "mcast_miss_encode_key", "mcast_miss_port", "memory_pools",
+        "memory_pools_limit", "memory_replacement_policy", "mime_table",
+        "min_http_poll_cnt", "min_icp_poll_cnt", "minimum_direct_hops",
+        "minimum_object_size", "minimum_retry_timeout", "miss_access",
+        "negative_dns_ttl", "negative_ttl", "neighbor_timeout",
+        "neighbor_type_domain", "netdb_high", "netdb_low", "netdb_ping_period",
+        "netdb_ping_rate", "never_direct", "no_cache", "passthrough_proxy",
+        "pconn_timeout", "pid_filename", "pinger_program", "positive_dns_ttl",
+        "prefer_direct", "proxy_auth", "proxy_auth_realm", "query_icmp",
+        "quick_abort", "quick_abort_max", "quick_abort_min",
+        "quick_abort_pct", "range_offset_limit", "read_timeout",
+        "redirect_children", "redirect_program",
+        "redirect_rewrites_host_header", "reference_age",
+        "refresh_pattern", "reload_into_ims", "request_body_max_size",
+        "request_size", "request_timeout", "shutdown_lifetime",
+        "single_parent_bypass", "siteselect_timeout", "snmp_access",
+        "snmp_incoming_address", "snmp_port", "source_ping", "ssl_proxy",
+        "store_avg_object_size", "store_objects_per_bucket",
+        "strip_query_terms", "swap_level1_dirs", "swap_level2_dirs",
+        "tcp_incoming_address", "tcp_outgoing_address", "tcp_recv_bufsize",
+        "test_reachability", "udp_hit_obj", "udp_hit_obj_size",
+        "udp_incoming_address", "udp_outgoing_address", "unique_hostname",
+        "unlinkd_program", "uri_whitespace", "useragent_log",
+        "visible_hostname", "wais_relay", "wais_relay_host", "wais_relay_port",
+    )
+
+    opts = (
+        "proxy-only", "weight", "ttl", "no-query", "default", "round-robin",
+        "multicast-responder", "on", "off", "all", "deny", "allow", "via",
+        "parent", "no-digest", "heap", "lru", "realm", "children", "q1", "q2",
+        "credentialsttl", "none", "disable", "offline_toggle", "diskd",
+    )
+
+    actions = (
+        "shutdown", "info", "parameter", "server_list", "client_list",
+        r'squid.conf',
+    )
+
+    actions_stats = (
+        "objects", "vm_objects", "utilization", "ipcache", "fqdncache", "dns",
+        "redirector", "io", "reply_headers", "filedescriptors", "netdb",
+    )
+
+    actions_log = ("status", "enable", "disable", "clear")
+
+    acls = (
+        "url_regex", "urlpath_regex", "referer_regex", "port", "proto",
+        "req_mime_type", "rep_mime_type", "method", "browser", "user", "src",
+        "dst", "time", "dstdomain", "ident", "snmp_community",
+    )
+
+    ipv4_group = r'(\d+|0x[0-9a-f]+)'
+    ipv4 = rf'({ipv4_group}(\.{ipv4_group}){{3}})'
+    ipv6_group = r'([0-9a-f]{0,4})'
+    ipv6 = rf'({ipv6_group}(:{ipv6_group}){{1,7}})'
+    bare_ip = rf'({ipv4}|{ipv6})'
+    # XXX: /integer is a subnet mark, but what is /IP ?
+    # There is no test where it is used.
+    ip = rf'{bare_ip}(/({bare_ip}|\d+))?'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'#', Comment, 'comment'),
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(opts, prefix=r'\b', suffix=r'\b'), Name.Constant),
+            # Actions
+            (words(actions, prefix=r'\b', suffix=r'\b'), String),
+            (words(actions_stats, prefix=r'stats/', suffix=r'\b'), String),
+            (words(actions_log, prefix=r'log/', suffix=r'='), String),
+            (words(acls, prefix=r'\b', suffix=r'\b'), Keyword),
+            (ip, Number.Float),
+            (r'(?:\b\d+\b(?:-\b\d+|%)?)', Number),
+            (r'\S+', Text),
+        ],
+        'comment': [
+            (r'\s*TAG:.*', String.Escape, '#pop'),
+            (r'.+', Comment, '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class NginxConfLexer(RegexLexer):
+    """
+    Lexer for Nginx configuration files.
+    """
+    name = 'Nginx configuration file'
+    url = 'http://nginx.net/'
+    aliases = ['nginx']
+    filenames = ['nginx.conf']
+    mimetypes = ['text/x-nginx-conf']
+    version_added = '0.11'
+
+    tokens = {
+        'root': [
+            (r'(include)(\s+)([^\s;]+)', bygroups(Keyword, Whitespace, Name)),
+            (r'[^\s;#]+', Keyword, 'stmt'),
+            include('base'),
+        ],
+        'block': [
+            (r'\}', Punctuation, '#pop:2'),
+            (r'[^\s;#]+', Keyword.Namespace, 'stmt'),
+            include('base'),
+        ],
+        'stmt': [
+            (r'\{', Punctuation, 'block'),
+            (r';', Punctuation, '#pop'),
+            include('base'),
+        ],
+        'base': [
+            (r'#.*\n', Comment.Single),
+            (r'on|off', Name.Constant),
+            (r'\$[^\s;#()]+', Name.Variable),
+            (r'([a-z0-9.-]+)(:)([0-9]+)',
+             bygroups(Name, Punctuation, Number.Integer)),
+            (r'[a-z-]+/[a-z-+]+', String),  # mimetype
+            # (r'[a-zA-Z._-]+', Keyword),
+            (r'[0-9]+[km]?\b', Number.Integer),
+            (r'(~)(\s*)([^\s{]+)', bygroups(Punctuation, Whitespace, String.Regex)),
+            (r'[:=~]', Punctuation),
+            (r'[^\s;#{}$]+', String),  # catch all
+            (r'/[^\s;#]*', Name),  # pathname
+            (r'\s+', Whitespace),
+            (r'[$;]', Text),  # leftover characters
+        ],
+    }
+
+
+class LighttpdConfLexer(RegexLexer):
+    """
+    Lexer for Lighttpd configuration files.
+    """
+    name = 'Lighttpd configuration file'
+    url = 'http://lighttpd.net/'
+    aliases = ['lighttpd', 'lighty']
+    filenames = ['lighttpd.conf']
+    mimetypes = ['text/x-lighttpd-conf']
+    version_added = '0.11'
+
+    tokens = {
+        'root': [
+            (r'#.*\n', Comment.Single),
+            (r'/\S*', Name),  # pathname
+            (r'[a-zA-Z._-]+', Keyword),
+            (r'\d+\.\d+\.\d+\.\d+(?:/\d+)?', Number),
+            (r'[0-9]+', Number),
+            (r'=>|=~|\+=|==|=|\+', Operator),
+            (r'\$[A-Z]+', Name.Builtin),
+            (r'[(){}\[\],]', Punctuation),
+            (r'"([^"\\]*(?:\\.[^"\\]*)*)"', String.Double),
+            (r'\s+', Whitespace),
+        ],
+
+    }
+
+
+class DockerLexer(RegexLexer):
+    """
+    Lexer for Docker configuration files.
+    """
+    name = 'Docker'
+    url = 'http://docker.io'
+    aliases = ['docker', 'dockerfile']
+    filenames = ['Dockerfile', '*.docker']
+    mimetypes = ['text/x-dockerfile-config']
+    version_added = '2.0'
+
+    _keywords = (r'(?:MAINTAINER|EXPOSE|WORKDIR|USER|STOPSIGNAL)')
+    _bash_keywords = (r'(?:RUN|CMD|ENTRYPOINT|ENV|ARG|LABEL|ADD|COPY)')
+    _lb = r'(?:\s*\\?\s*)'  # dockerfile line break regex
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'#.*', Comment),
+            (r'(FROM)([ \t]*)(\S*)([ \t]*)(?:(AS)([ \t]*)(\S*))?',
+             bygroups(Keyword, Whitespace, String, Whitespace, Keyword, Whitespace, String)),
+            (rf'(ONBUILD)(\s+)({_lb})', bygroups(Keyword, Whitespace, using(BashLexer))),
+            (rf'(HEALTHCHECK)(\s+)(({_lb}--\w+=\w+{_lb})*)',
+                bygroups(Keyword, Whitespace, using(BashLexer))),
+            (rf'(VOLUME|ENTRYPOINT|CMD|SHELL)(\s+)({_lb})(\[.*?\])',
+                bygroups(Keyword, Whitespace, using(BashLexer), using(JsonLexer))),
+            (rf'(LABEL|ENV|ARG)(\s+)(({_lb}\w+=\w+{_lb})*)',
+                bygroups(Keyword, Whitespace, using(BashLexer))),
+            (rf'({_keywords}|VOLUME)\b(\s+)(.*)', bygroups(Keyword, Whitespace, String)),
+            (rf'({_bash_keywords})(\s+)', bygroups(Keyword, Whitespace)),
+            (r'(.*\\\n)*.+', using(BashLexer)),
+        ]
+    }
+
+
+class TerraformLexer(ExtendedRegexLexer):
+    """
+    Lexer for terraformi ``.tf`` files.
+    """
+
+    name = 'Terraform'
+    url = 'https://www.terraform.io/'
+    aliases = ['terraform', 'tf', 'hcl']
+    filenames = ['*.tf', '*.hcl']
+    mimetypes = ['application/x-tf', 'application/x-terraform']
+    version_added = '2.1'
+
+    classes = ('backend', 'data', 'module', 'output', 'provider',
+               'provisioner', 'resource', 'variable')
+    classes_re = "({})".format(('|').join(classes))
+
+    types = ('string', 'number', 'bool', 'list', 'tuple', 'map', 'set', 'object', 'null')
+
+    numeric_functions = ('abs', 'ceil', 'floor', 'log', 'max',
+                         'mix', 'parseint', 'pow', 'signum')
+
+    string_functions = ('chomp', 'format', 'formatlist', 'indent',
+                        'join', 'lower', 'regex', 'regexall', 'replace',
+                        'split', 'strrev', 'substr', 'title', 'trim',
+                        'trimprefix', 'trimsuffix', 'trimspace', 'upper'
+                        )
+
+    collection_functions = ('alltrue', 'anytrue', 'chunklist', 'coalesce',
+                            'coalescelist', 'compact', 'concat', 'contains',
+                            'distinct', 'element', 'flatten', 'index', 'keys',
+                            'length', 'list', 'lookup', 'map', 'matchkeys',
+                            'merge', 'range', 'reverse', 'setintersection',
+                            'setproduct', 'setsubtract', 'setunion', 'slice',
+                            'sort', 'sum', 'transpose', 'values', 'zipmap'
+                            )
+
+    encoding_functions = ('base64decode', 'base64encode', 'base64gzip',
+                          'csvdecode', 'jsondecode', 'jsonencode', 'textdecodebase64',
+                          'textencodebase64', 'urlencode', 'yamldecode', 'yamlencode')
+
+    filesystem_functions = ('abspath', 'dirname', 'pathexpand', 'basename',
+                            'file', 'fileexists', 'fileset', 'filebase64', 'templatefile')
+
+    date_time_functions = ('formatdate', 'timeadd', 'timestamp')
+
+    hash_crypto_functions = ('base64sha256', 'base64sha512', 'bcrypt', 'filebase64sha256',
+                             'filebase64sha512', 'filemd5', 'filesha1', 'filesha256', 'filesha512',
+                             'md5', 'rsadecrypt', 'sha1', 'sha256', 'sha512', 'uuid', 'uuidv5')
+
+    ip_network_functions = ('cidrhost', 'cidrnetmask', 'cidrsubnet', 'cidrsubnets')
+
+    type_conversion_functions = ('can', 'defaults', 'tobool', 'tolist', 'tomap',
+                                 'tonumber', 'toset', 'tostring', 'try')
+
+    builtins = numeric_functions + string_functions + collection_functions + encoding_functions +\
+        filesystem_functions + date_time_functions + hash_crypto_functions + ip_network_functions +\
+        type_conversion_functions
+    builtins_re = "({})".format(('|').join(builtins))
+
+    def heredoc_callback(self, match, ctx):
+        # Parse a terraform heredoc
+        # match: 1 = <<[-]?, 2 = name 3 = rest of line
+
+        start = match.start(1)
+        yield start, Operator, match.group(1)        # <<[-]?
+        yield match.start(2), String.Delimiter, match.group(2)  # heredoc name
+
+        ctx.pos = match.start(3)
+        ctx.end = match.end(3)
+        yield ctx.pos, String.Heredoc, match.group(3)
+        ctx.pos = match.end()
+
+        hdname = match.group(2)
+        tolerant = True  # leading whitespace is always accepted
+
+        lines = []
+
+        for match in line_re.finditer(ctx.text, ctx.pos):
+            if tolerant:
+                check = match.group().strip()
+            else:
+                check = match.group().rstrip()
+            if check == hdname:
+                for amatch in lines:
+                    yield amatch.start(), String.Heredoc, amatch.group()
+                yield match.start(), String.Delimiter, match.group()
+                ctx.pos = match.end()
+                break
+            else:
+                lines.append(match)
+        else:
+            # end of heredoc not found -- error!
+            for amatch in lines:
+                yield amatch.start(), Error, amatch.group()
+        ctx.end = len(ctx.text)
+
+    tokens = {
+        'root': [
+            include('basic'),
+            include('whitespace'),
+
+            # Strings
+            (r'(".*")', bygroups(String.Double)),
+
+            # Constants
+            (words(('true', 'false'), prefix=r'\b', suffix=r'\b'), Name.Constant),
+
+            # Types
+            (words(types, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+
+            include('identifier'),
+            include('punctuation'),
+            (r'[0-9]+', Number),
+        ],
+        'basic': [
+            (r'\s*/\*', Comment.Multiline, 'comment'),
+            (r'\s*(#|//).*\n', Comment.Single),
+            include('whitespace'),
+
+            # e.g. terraform {
+            # e.g. egress {
+            (r'(\s*)([0-9a-zA-Z-_]+)(\s*)(=?)(\s*)(\{)',
+             bygroups(Whitespace, Name.Builtin, Whitespace, Operator, Whitespace, Punctuation)),
+
+            # Assignment with attributes, e.g. something = ...
+            (r'(\s*)([0-9a-zA-Z-_]+)(\s*)(=)(\s*)',
+             bygroups(Whitespace, Name.Attribute, Whitespace, Operator, Whitespace)),
+
+            # Assignment with environment variables and similar, e.g. "something" = ...
+            # or key value assignment, e.g. "SlotName" : ...
+            (r'(\s*)("\S+")(\s*)([=:])(\s*)',
+             bygroups(Whitespace, Literal.String.Double, Whitespace, Operator, Whitespace)),
+
+            # Functions, e.g. jsonencode(element("value"))
+            (builtins_re + r'(\()', bygroups(Name.Function, Punctuation)),
+
+            # List of attributes, e.g. ignore_changes = [last_modified, filename]
+            (r'(\[)([a-z_,\s]+)(\])', bygroups(Punctuation, Name.Builtin, Punctuation)),
+
+            # e.g. resource "aws_security_group" "allow_tls" {
+            # e.g. backend "consul" {
+            (classes_re + r'(\s+)("[0-9a-zA-Z-_]+")?(\s*)("[0-9a-zA-Z-_]+")(\s+)(\{)',
+             bygroups(Keyword.Reserved, Whitespace, Name.Class, Whitespace, Name.Variable, Whitespace, Punctuation)),
+
+            # here-doc style delimited strings
+            (r'(<<-?)\s*([a-zA-Z_]\w*)(.*?\n)', heredoc_callback),
+        ],
+        'identifier': [
+            (r'\b(var\.[0-9a-zA-Z-_\.\[\]]+)\b', bygroups(Name.Variable)),
+            (r'\b([0-9a-zA-Z-_\[\]]+\.[0-9a-zA-Z-_\.\[\]]+)\b',
+             bygroups(Name.Variable)),
+        ],
+        'punctuation': [
+            (r'[\[\]()\{\},.?:!=]', Punctuation),
+        ],
+        'comment': [
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'(\\)(\n)', bygroups(Text, Whitespace)),
+        ],
+    }
+
+
+class TermcapLexer(RegexLexer):
+    """
+    Lexer for termcap database source.
+
+    This is very simple and minimal.
+    """
+    name = 'Termcap'
+    aliases = ['termcap']
+    filenames = ['termcap', 'termcap.src']
+    mimetypes = []
+    url = 'https://en.wikipedia.org/wiki/Termcap'
+    version_added = '2.1'
+
+    # NOTE:
+    #   * multiline with trailing backslash
+    #   * separator is ':'
+    #   * to embed colon as data, we must use \072
+    #   * space after separator is not allowed (mayve)
+    tokens = {
+        'root': [
+            (r'^#.*', Comment),
+            (r'^[^\s#:|]+', Name.Tag, 'names'),
+            (r'\s+', Whitespace),
+        ],
+        'names': [
+            (r'\n', Whitespace, '#pop'),
+            (r':', Punctuation, 'defs'),
+            (r'\|', Punctuation),
+            (r'[^:|]+', Name.Attribute),
+        ],
+        'defs': [
+            (r'(\\)(\n[ \t]*)', bygroups(Text, Whitespace)),
+            (r'\n[ \t]*', Whitespace, '#pop:2'),
+            (r'(#)([0-9]+)', bygroups(Operator, Number)),
+            (r'=', Operator, 'data'),
+            (r':', Punctuation),
+            (r'[^\s:=#]+', Name.Class),
+        ],
+        'data': [
+            (r'\\072', Literal),
+            (r':', Punctuation, '#pop'),
+            (r'[^:\\]+', Literal),  # for performance
+            (r'.', Literal),
+        ],
+    }
+
+
+class TerminfoLexer(RegexLexer):
+    """
+    Lexer for terminfo database source.
+
+    This is very simple and minimal.
+    """
+    name = 'Terminfo'
+    aliases = ['terminfo']
+    filenames = ['terminfo', 'terminfo.src']
+    mimetypes = []
+    url = 'https://en.wikipedia.org/wiki/Terminfo'
+    version_added = '2.1'
+
+    # NOTE:
+    #   * multiline with leading whitespace
+    #   * separator is ','
+    #   * to embed comma as data, we can use \,
+    #   * space after separator is allowed
+    tokens = {
+        'root': [
+            (r'^#.*$', Comment),
+            (r'^[^\s#,|]+', Name.Tag, 'names'),
+            (r'\s+', Whitespace),
+        ],
+        'names': [
+            (r'\n', Whitespace, '#pop'),
+            (r'(,)([ \t]*)', bygroups(Punctuation, Whitespace), 'defs'),
+            (r'\|', Punctuation),
+            (r'[^,|]+', Name.Attribute),
+        ],
+        'defs': [
+            (r'\n[ \t]+', Whitespace),
+            (r'\n', Whitespace, '#pop:2'),
+            (r'(#)([0-9]+)', bygroups(Operator, Number)),
+            (r'=', Operator, 'data'),
+            (r'(,)([ \t]*)', bygroups(Punctuation, Whitespace)),
+            (r'[^\s,=#]+', Name.Class),
+        ],
+        'data': [
+            (r'\\[,\\]', Literal),
+            (r'(,)([ \t]*)', bygroups(Punctuation, Whitespace), '#pop'),
+            (r'[^\\,]+', Literal),  # for performance
+            (r'.', Literal),
+        ],
+    }
+
+
+class PkgConfigLexer(RegexLexer):
+    """
+    Lexer for pkg-config
+    (see also `manual page <http://linux.die.net/man/1/pkg-config>`_).
+    """
+
+    name = 'PkgConfig'
+    url = 'http://www.freedesktop.org/wiki/Software/pkg-config/'
+    aliases = ['pkgconfig']
+    filenames = ['*.pc']
+    mimetypes = []
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            (r'#.*$', Comment.Single),
+
+            # variable definitions
+            (r'^(\w+)(=)', bygroups(Name.Attribute, Operator)),
+
+            # keyword lines
+            (r'^([\w.]+)(:)',
+             bygroups(Name.Tag, Punctuation), 'spvalue'),
+
+            # variable references
+            include('interp'),
+
+            # fallback
+            (r'\s+', Whitespace),
+            (r'[^${}#=:\n.]+', Text),
+            (r'.', Text),
+        ],
+        'interp': [
+            # you can escape literal "$" as "$$"
+            (r'\$\$', Text),
+
+            # variable references
+            (r'\$\{', String.Interpol, 'curly'),
+        ],
+        'curly': [
+            (r'\}', String.Interpol, '#pop'),
+            (r'\w+', Name.Attribute),
+        ],
+        'spvalue': [
+            include('interp'),
+
+            (r'#.*$', Comment.Single, '#pop'),
+            (r'\n', Whitespace, '#pop'),
+
+            # fallback
+            (r'\s+', Whitespace),
+            (r'[^${}#\n\s]+', Text),
+            (r'.', Text),
+        ],
+    }
+
+
+class PacmanConfLexer(RegexLexer):
+    """
+    Lexer for pacman.conf.
+
+    Actually, IniLexer works almost fine for this format,
+    but it yield error token. It is because pacman.conf has
+    a form without assignment like:
+
+        UseSyslog
+        Color
+        TotalDownload
+        CheckSpace
+        VerbosePkgLists
+
+    These are flags to switch on.
+    """
+
+    name = 'PacmanConf'
+    url = 'https://www.archlinux.org/pacman/pacman.conf.5.html'
+    aliases = ['pacmanconf']
+    filenames = ['pacman.conf']
+    mimetypes = []
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            # comment
+            (r'#.*$', Comment.Single),
+
+            # section header
+            (r'^(\s*)(\[.*?\])(\s*)$', bygroups(Whitespace, Keyword, Whitespace)),
+
+            # variable definitions
+            # (Leading space is allowed...)
+            (r'(\w+)(\s*)(=)',
+             bygroups(Name.Attribute, Whitespace, Operator)),
+
+            # flags to on
+            (r'^(\s*)(\w+)(\s*)$',
+             bygroups(Whitespace, Name.Attribute, Whitespace)),
+
+            # built-in special values
+            (words((
+                '$repo',  # repository
+                '$arch',  # architecture
+                '%o',     # outfile
+                '%u',     # url
+                ), suffix=r'\b'),
+             Name.Variable),
+
+            # fallback
+            (r'\s+', Whitespace),
+            (r'.', Text),
+        ],
+    }
+
+
+class AugeasLexer(RegexLexer):
+    """
+    Lexer for Augeas.
+    """
+    name = 'Augeas'
+    url = 'http://augeas.net'
+    aliases = ['augeas']
+    filenames = ['*.aug']
+    version_added = '2.4'
+
+    tokens = {
+        'root': [
+            (r'(module)(\s*)([^\s=]+)', bygroups(Keyword.Namespace, Whitespace, Name.Namespace)),
+            (r'(let)(\s*)([^\s=]+)', bygroups(Keyword.Declaration, Whitespace, Name.Variable)),
+            (r'(del|store|value|counter|seq|key|label|autoload|incl|excl|transform|test|get|put)(\s+)', bygroups(Name.Builtin, Whitespace)),
+            (r'(\()([^:]+)(\:)(unit|string|regexp|lens|tree|filter)(\))', bygroups(Punctuation, Name.Variable, Punctuation, Keyword.Type, Punctuation)),
+            (r'\(\*', Comment.Multiline, 'comment'),
+            (r'[*+\-.;=?|]', Operator),
+            (r'[()\[\]{}]', Operator),
+            (r'"', String.Double, 'string'),
+            (r'\/', String.Regex, 'regex'),
+            (r'([A-Z]\w*)(\.)(\w+)', bygroups(Name.Namespace, Punctuation, Name.Variable)),
+            (r'.', Name.Variable),
+            (r'\s+', Whitespace),
+        ],
+        'string': [
+            (r'\\.', String.Escape),
+            (r'[^"]', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'regex': [
+            (r'\\.', String.Escape),
+            (r'[^/]', String.Regex),
+            (r'\/', String.Regex, '#pop'),
+        ],
+        'comment': [
+            (r'[^*)]', Comment.Multiline),
+            (r'\(\*', Comment.Multiline, '#push'),
+            (r'\*\)', Comment.Multiline, '#pop'),
+            (r'[)*]', Comment.Multiline)
+        ],
+    }
+
+
+class TOMLLexer(RegexLexer):
+    """
+    Lexer for TOML, a simple language for config files.
+    """
+
+    name = 'TOML'
+    aliases = ['toml']
+    filenames = ['*.toml', 'Pipfile', 'poetry.lock']
+    mimetypes = ['application/toml']
+    url = 'https://toml.io'
+    version_added = '2.4'
+
+    # Based on the TOML spec: https://toml.io/en/v1.0.0
+
+    # The following is adapted from CPython's tomllib:
+    _time = r"\d\d:\d\d:\d\d(\.\d+)?"
+    _datetime = rf"""(?x)
+                  \d\d\d\d-\d\d-\d\d # date, e.g., 1988-10-27
+                (
+                  [Tt ] {_time} # optional time
+                  (
+                    [Zz]|[+-]\d\d:\d\d # optional time offset
+                  )?
+                )?
+              """
+
+    tokens = {
+        'root': [
+            # Note that we make an effort in order to distinguish
+            # moments at which we're parsing a key and moments at
+            # which we're parsing a value. In the TOML code
+            #
+            #   1234 = 1234
+            #
+            # the first "1234" should be Name, the second Integer.
+
+            # Whitespace
+            (r'\s+', Whitespace),
+
+            # Comment
+            (r'#.*', Comment.Single),
+
+            # Assignment keys
+            include('key'),
+
+            # After "=", find a value
+            (r'(=)(\s*)', bygroups(Operator, Whitespace), 'value'),
+
+            # Table header
+            (r'\[\[?', Keyword, 'table-key'),
+        ],
+        'key': [
+            # Start of bare key (only ASCII is allowed here).
+            (r'[A-Za-z0-9_-]+', Name),
+            # Quoted key
+            (r'"', String.Double, 'basic-string'),
+            (r"'", String.Single, 'literal-string'),
+            # Dots act as separators in keys
+            (r'\.', Punctuation),
+        ],
+        'table-key': [
+            # This is like 'key', but highlights the name components
+            # and separating dots as Keyword because it looks better
+            # when the whole table header is Keyword. We do highlight
+            # strings as strings though.
+            # Start of bare key (only ASCII is allowed here).
+            (r'[A-Za-z0-9_-]+', Keyword),
+            (r'"', String.Double, 'basic-string'),
+            (r"'", String.Single, 'literal-string'),
+            (r'\.', Keyword),
+            (r'\]\]?', Keyword, '#pop'),
+
+            # Inline whitespace allowed
+            (r'[ \t]+', Whitespace),
+        ],
+        'value': [
+            # Datetime, baretime
+            (_datetime, Literal.Date, '#pop'),
+            (_time, Literal.Date, '#pop'),
+
+            # Recognize as float if there is a fractional part
+            # and/or an exponent.
+            (r'[+-]?\d[0-9_]*[eE][+-]?\d[0-9_]*', Number.Float, '#pop'),
+            (r'[+-]?\d[0-9_]*\.\d[0-9_]*([eE][+-]?\d[0-9_]*)?',
+             Number.Float, '#pop'),
+
+            # Infinities and NaN
+            (r'[+-]?(inf|nan)', Number.Float, '#pop'),
+
+            # Integers
+            (r'-?0b[01_]+', Number.Bin, '#pop'),
+            (r'-?0o[0-7_]+', Number.Oct, '#pop'),
+            (r'-?0x[0-9a-fA-F_]+', Number.Hex, '#pop'),
+            (r'[+-]?[0-9_]+', Number.Integer, '#pop'),
+
+            # Strings
+            (r'"""', String.Double, ('#pop', 'multiline-basic-string')),
+            (r'"', String.Double, ('#pop', 'basic-string')),
+            (r"'''", String.Single, ('#pop', 'multiline-literal-string')),
+            (r"'", String.Single, ('#pop', 'literal-string')),
+
+            # Booleans
+            (r'true|false', Keyword.Constant, '#pop'),
+
+            # Start of array
+            (r'\[', Punctuation, ('#pop', 'array')),
+
+            # Start of inline table
+            (r'\{', Punctuation, ('#pop', 'inline-table')),
+        ],
+        'array': [
+            # Whitespace, including newlines, is ignored inside arrays,
+            # and comments are allowed.
+            (r'\s+', Whitespace),
+            (r'#.*', Comment.Single),
+
+            # Delimiters
+            (r',', Punctuation),
+
+            # End of array
+            (r'\]', Punctuation, '#pop'),
+
+            # Parse a value and come back
+            default('value'),
+        ],
+        'inline-table': [
+            # Note that unlike inline arrays, inline tables do not
+            # allow newlines or comments.
+            (r'[ \t]+', Whitespace),
+
+            # Keys
+            include('key'),
+
+            # Values
+            (r'(=)(\s*)', bygroups(Punctuation, Whitespace), 'value'),
+
+            # Delimiters
+            (r',', Punctuation),
+
+            # End of inline table
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'basic-string': [
+            (r'"', String.Double, '#pop'),
+            include('escapes'),
+            (r'[^"\\]+', String.Double),
+        ],
+        'literal-string': [
+            (r".*?'", String.Single, '#pop'),
+        ],
+        'multiline-basic-string': [
+            (r'"""', String.Double, '#pop'),
+            (r'(\\)(\n)', bygroups(String.Escape, Whitespace)),
+            include('escapes'),
+            (r'[^"\\]+', String.Double),
+            (r'"', String.Double),
+        ],
+        'multiline-literal-string': [
+            (r"'''", String.Single, '#pop'),
+            (r"[^']+", String.Single),
+            (r"'", String.Single),
+        ],
+        'escapes': [
+            (r'\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}', String.Escape),
+            (r'\\.', String.Escape),
+        ],
+    }
+
+class NestedTextLexer(RegexLexer):
+    """
+    Lexer for *NextedText*, a human-friendly data format.
+
+    .. versionchanged:: 2.16
+        Added support for *NextedText* v3.0.
+    """
+
+    name = 'NestedText'
+    url = 'https://nestedtext.org'
+    aliases = ['nestedtext', 'nt']
+    filenames = ['*.nt']
+    version_added = '2.9'
+
+    tokens = {
+        'root': [
+            # Comment: # ...
+            (r'^([ ]*)(#.*)$', bygroups(Whitespace, Comment)),
+
+            # Inline dictionary: {...}
+            (r'^([ ]*)(\{)', bygroups(Whitespace, Punctuation), 'inline_dict'),
+
+            # Inline list: [...]
+            (r'^([ ]*)(\[)', bygroups(Whitespace, Punctuation), 'inline_list'),
+
+            # empty multiline string item: >
+            (r'^([ ]*)(>)$', bygroups(Whitespace, Punctuation)),
+
+            # multiline string item: > ...
+            (r'^([ ]*)(>)( )(.*?)([ \t]*)$', bygroups(Whitespace, Punctuation, Whitespace, Text, Whitespace)),
+
+            # empty list item: -
+            (r'^([ ]*)(-)$', bygroups(Whitespace, Punctuation)),
+
+            # list item: - ...
+            (r'^([ ]*)(-)( )(.*?)([ \t]*)$', bygroups(Whitespace, Punctuation, Whitespace, Text, Whitespace)),
+
+            # empty multiline key item: :
+            (r'^([ ]*)(:)$', bygroups(Whitespace, Punctuation)),
+
+            # multiline key item: : ...
+            (r'^([ ]*)(:)( )([^\n]*?)([ \t]*)$', bygroups(Whitespace, Punctuation, Whitespace, Name.Tag, Whitespace)),
+
+            # empty dict key item: ...:
+            (r'^([ ]*)([^\{\[\s].*?)(:)$', bygroups(Whitespace, Name.Tag, Punctuation)),
+
+            # dict key item: ...: ...
+            (r'^([ ]*)([^\{\[\s].*?)(:)( )(.*?)([ \t]*)$', bygroups(Whitespace, Name.Tag, Punctuation, Whitespace, Text, Whitespace)),
+        ],
+        'inline_list': [
+            include('whitespace'),
+            (r'[^\{\}\[\],\s]+', Text),
+            include('inline_value'),
+            (r',', Punctuation),
+            (r'\]', Punctuation, '#pop'),
+            (r'\n', Error, '#pop'),
+        ],
+        'inline_dict': [
+            include('whitespace'),
+            (r'[^\{\}\[\],:\s]+', Name.Tag),
+            (r':', Punctuation, 'inline_dict_value'),
+            (r'\}', Punctuation, '#pop'),
+            (r'\n', Error, '#pop'),
+        ],
+        'inline_dict_value': [
+            include('whitespace'),
+            (r'[^\{\}\[\],:\s]+', Text),
+            include('inline_value'),
+            (r',', Punctuation, '#pop'),
+            (r'\}', Punctuation, '#pop:2'),
+        ],
+        'inline_value': [
+            include('whitespace'),
+            (r'\{', Punctuation, 'inline_dict'),
+            (r'\[', Punctuation, 'inline_list'),
+        ],
+        'whitespace': [
+            (r'[ \t]+', Whitespace),
+        ],
+    }
+
+
+class SingularityLexer(RegexLexer):
+    """
+    Lexer for Singularity definition files.
+    """
+
+    name = 'Singularity'
+    url = 'https://www.sylabs.io/guides/3.0/user-guide/definition_files.html'
+    aliases = ['singularity']
+    filenames = ['*.def', 'Singularity']
+    version_added = '2.6'
+    flags = re.IGNORECASE | re.MULTILINE | re.DOTALL
+
+    _headers = r'^(\s*)(bootstrap|from|osversion|mirrorurl|include|registry|namespace|includecmd)(:)'
+    _section = r'^(%(?:pre|post|setup|environment|help|labels|test|runscript|files|startscript))(\s*)'
+    _appsect = r'^(%app(?:install|help|run|labels|env|test|files))(\s*)'
+
+    tokens = {
+        'root': [
+            (_section, bygroups(Generic.Heading, Whitespace), 'script'),
+            (_appsect, bygroups(Generic.Heading, Whitespace), 'script'),
+            (_headers, bygroups(Whitespace, Keyword, Text)),
+            (r'\s*#.*?\n', Comment),
+            (r'\b(([0-9]+\.?[0-9]*)|(\.[0-9]+))\b', Number),
+            (r'[ \t]+', Whitespace),
+            (r'(?!^\s*%).', Text),
+        ],
+        'script': [
+            (r'(.+?(?=^\s*%))|(.*)', using(BashLexer), '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        """This is a quite simple script file, but there are a few keywords
+        which seem unique to this language."""
+        result = 0
+        if re.search(r'\b(?:osversion|includecmd|mirrorurl)\b', text, re.IGNORECASE):
+            result += 0.5
+
+        if re.search(SingularityLexer._section[1:], text):
+            result += 0.49
+
+        return result
+
+
+class UnixConfigLexer(RegexLexer):
+    """
+    Lexer for Unix/Linux config files using colon-separated values, e.g.
+
+    * ``/etc/group``
+    * ``/etc/passwd``
+    * ``/etc/shadow``
+    """
+
+    name = 'Unix/Linux config files'
+    aliases = ['unixconfig', 'linuxconfig']
+    filenames = []
+    url = 'https://en.wikipedia.org/wiki/Configuration_file#Unix_and_Unix-like_operating_systems'
+    version_added = '2.12'
+
+    tokens = {
+        'root': [
+            (r'^#.*', Comment),
+            (r'\n', Whitespace),
+            (r':', Punctuation),
+            (r'[0-9]+', Number),
+            (r'((?!\n)[a-zA-Z0-9\_\-\s\(\),]){2,}', Text),
+            (r'[^:\n]+', String),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/console.py b/.venv/Lib/site-packages/pygments/lexers/console.py
new file mode 100644 (file)
index 0000000..d66cbaa
--- /dev/null
@@ -0,0 +1,114 @@
+"""
+    pygments.lexers.console
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for misc console output.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Generic, Comment, String, Text, Keyword, Name, \
+    Punctuation, Number, Whitespace
+
+__all__ = ['VCTreeStatusLexer', 'PyPyLogLexer']
+
+
+class VCTreeStatusLexer(RegexLexer):
+    """
+    For colorizing output of version control status commands, like "hg
+    status" or "svn status".
+    """
+    name = 'VCTreeStatus'
+    aliases = ['vctreestatus']
+    filenames = []
+    mimetypes = []
+    url = ""
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            (r'^A  \+  C\s+', Generic.Error),
+            (r'^A\s+\+?\s+', String),
+            (r'^M\s+', Generic.Inserted),
+            (r'^C\s+', Generic.Error),
+            (r'^D\s+', Generic.Deleted),
+            (r'^[?!]\s+', Comment.Preproc),
+            (r'      >\s+.*\n', Comment.Preproc),
+            (r'\S+', Text),
+            (r'\s+', Whitespace),
+        ]
+    }
+
+
+class PyPyLogLexer(RegexLexer):
+    """
+    Lexer for PyPy log files.
+    """
+    name = "PyPy Log"
+    aliases = ["pypylog", "pypy"]
+    filenames = ["*.pypylog"]
+    mimetypes = ['application/x-pypylog']
+    url = 'pypy.org'
+    version_added = '1.5'
+
+    tokens = {
+        "root": [
+            (r"\[\w+\] \{jit-log-.*?$", Keyword, "jit-log"),
+            (r"\[\w+\] \{jit-backend-counts$", Keyword, "jit-backend-counts"),
+            include("extra-stuff"),
+        ],
+        "jit-log": [
+            (r"\[\w+\] jit-log-.*?}$", Keyword, "#pop"),
+            (r"^\+\d+: ", Comment),
+            (r"--end of the loop--", Comment),
+            (r"[ifp]\d+", Name),
+            (r"ptr\d+", Name),
+            (r"(\()(\w+(?:\.\w+)?)(\))",
+             bygroups(Punctuation, Name.Builtin, Punctuation)),
+            (r"[\[\]=,()]", Punctuation),
+            (r"(\d+\.\d+|inf|-inf)", Number.Float),
+            (r"-?\d+", Number.Integer),
+            (r"'.*'", String),
+            (r"(None|descr|ConstClass|ConstPtr|TargetToken)", Name),
+            (r"<.*?>+", Name.Builtin),
+            (r"(label|debug_merge_point|jump|finish)", Name.Class),
+            (r"(int_add_ovf|int_add|int_sub_ovf|int_sub|int_mul_ovf|int_mul|"
+             r"int_floordiv|int_mod|int_lshift|int_rshift|int_and|int_or|"
+             r"int_xor|int_eq|int_ne|int_ge|int_gt|int_le|int_lt|int_is_zero|"
+             r"int_is_true|"
+             r"uint_floordiv|uint_ge|uint_lt|"
+             r"float_add|float_sub|float_mul|float_truediv|float_neg|"
+             r"float_eq|float_ne|float_ge|float_gt|float_le|float_lt|float_abs|"
+             r"ptr_eq|ptr_ne|instance_ptr_eq|instance_ptr_ne|"
+             r"cast_int_to_float|cast_float_to_int|"
+             r"force_token|quasiimmut_field|same_as|virtual_ref_finish|"
+             r"virtual_ref|mark_opaque_ptr|"
+             r"call_may_force|call_assembler|call_loopinvariant|"
+             r"call_release_gil|call_pure|call|"
+             r"new_with_vtable|new_array|newstr|newunicode|new|"
+             r"arraylen_gc|"
+             r"getarrayitem_gc_pure|getarrayitem_gc|setarrayitem_gc|"
+             r"getarrayitem_raw|setarrayitem_raw|getfield_gc_pure|"
+             r"getfield_gc|getinteriorfield_gc|setinteriorfield_gc|"
+             r"getfield_raw|setfield_gc|setfield_raw|"
+             r"strgetitem|strsetitem|strlen|copystrcontent|"
+             r"unicodegetitem|unicodesetitem|unicodelen|"
+             r"guard_true|guard_false|guard_value|guard_isnull|"
+             r"guard_nonnull_class|guard_nonnull|guard_class|guard_no_overflow|"
+             r"guard_not_forced|guard_no_exception|guard_not_invalidated)",
+             Name.Builtin),
+            include("extra-stuff"),
+        ],
+        "jit-backend-counts": [
+            (r"\[\w+\] jit-backend-counts}$", Keyword, "#pop"),
+            (r":", Punctuation),
+            (r"\d+", Number),
+            include("extra-stuff"),
+        ],
+        "extra-stuff": [
+            (r"\s+", Whitespace),
+            (r"#.*?$", Comment),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/cplint.py b/.venv/Lib/site-packages/pygments/lexers/cplint.py
new file mode 100644 (file)
index 0000000..f842425
--- /dev/null
@@ -0,0 +1,43 @@
+"""
+    pygments.lexers.cplint
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the cplint language
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import bygroups, inherit, words
+from pygments.lexers import PrologLexer
+from pygments.token import Operator, Keyword, Name, String, Punctuation
+
+__all__ = ['CplintLexer']
+
+
+class CplintLexer(PrologLexer):
+    """
+    Lexer for cplint files, including CP-logic, Logic Programs with Annotated
+    Disjunctions, Distributional Clauses syntax, ProbLog, DTProbLog.
+    """
+    name = 'cplint'
+    url = 'https://cplint.eu'
+    aliases = ['cplint']
+    filenames = ['*.ecl', '*.prolog', '*.pro', '*.pl', '*.P', '*.lpad', '*.cpl']
+    mimetypes = ['text/x-cplint']
+    version_added = '2.12'
+
+    tokens = {
+        'root': [
+            (r'map_query', Keyword),
+            (words(('gaussian', 'uniform_dens', 'dirichlet', 'gamma', 'beta',
+                    'poisson', 'binomial', 'geometric', 'exponential', 'pascal',
+                    'multinomial', 'user', 'val', 'uniform', 'discrete',
+                    'finite')), Name.Builtin),
+            # annotations of atoms
+            (r'([a-z]+)(:)', bygroups(String.Atom, Punctuation)),
+            (r':(-|=)|::?|~=?|=>', Operator),
+            (r'\?', Name.Builtin),
+            inherit,
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/crystal.py b/.venv/Lib/site-packages/pygments/lexers/crystal.py
new file mode 100644 (file)
index 0000000..f5da4f8
--- /dev/null
@@ -0,0 +1,364 @@
+"""
+    pygments.lexers.crystal
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Crystal.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import ExtendedRegexLexer, include, bygroups, default, \
+    words, line_re
+from pygments.token import Comment, Operator, Keyword, Name, String, Number, \
+    Punctuation, Error, Whitespace
+
+__all__ = ['CrystalLexer']
+
+
+CRYSTAL_OPERATORS = [
+    '!=', '!~', '!', '%', '&&', '&', '**', '*', '+', '-', '/', '<=>', '<<', '<=', '<',
+    '===', '==', '=~', '=', '>=', '>>', '>', '[]=', '[]?', '[]', '^', '||', '|', '~'
+]
+
+
+class CrystalLexer(ExtendedRegexLexer):
+    """
+    For Crystal source code.
+    """
+
+    name = 'Crystal'
+    url = 'https://crystal-lang.org'
+    aliases = ['cr', 'crystal']
+    filenames = ['*.cr']
+    mimetypes = ['text/x-crystal']
+    version_added = '2.2'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    def heredoc_callback(self, match, ctx):
+        # okay, this is the hardest part of parsing Crystal...
+        # match: 1 = <<-?, 2 = quote? 3 = name 4 = quote? 5 = rest of line
+
+        start = match.start(1)
+        yield start, Operator, match.group(1)        # <<-?
+        yield match.start(2), String.Heredoc, match.group(2)    # quote ", ', `
+        yield match.start(3), String.Delimiter, match.group(3)  # heredoc name
+        yield match.start(4), String.Heredoc, match.group(4)    # quote again
+
+        heredocstack = ctx.__dict__.setdefault('heredocstack', [])
+        outermost = not bool(heredocstack)
+        heredocstack.append((match.group(1) == '<<-', match.group(3)))
+
+        ctx.pos = match.start(5)
+        ctx.end = match.end(5)
+        # this may find other heredocs, so limit the recursion depth
+        if len(heredocstack) < 100:
+            yield from self.get_tokens_unprocessed(context=ctx)
+        else:
+            yield ctx.pos, String.Heredoc, match.group(5)
+        ctx.pos = match.end()
+
+        if outermost:
+            # this is the outer heredoc again, now we can process them all
+            for tolerant, hdname in heredocstack:
+                lines = []
+                for match in line_re.finditer(ctx.text, ctx.pos):
+                    if tolerant:
+                        check = match.group().strip()
+                    else:
+                        check = match.group().rstrip()
+                    if check == hdname:
+                        for amatch in lines:
+                            yield amatch.start(), String.Heredoc, amatch.group()
+                        yield match.start(), String.Delimiter, match.group()
+                        ctx.pos = match.end()
+                        break
+                    else:
+                        lines.append(match)
+                else:
+                    # end of heredoc not found -- error!
+                    for amatch in lines:
+                        yield amatch.start(), Error, amatch.group()
+            ctx.end = len(ctx.text)
+            del heredocstack[:]
+
+    def gen_crystalstrings_rules():
+        states = {}
+        states['strings'] = [
+            (r'\:\w+[!?]?', String.Symbol),
+            (words(CRYSTAL_OPERATORS, prefix=r'\:'), String.Symbol),
+            (r":'(\\\\|\\[^\\]|[^'\\])*'", String.Symbol),
+            # This allows arbitrary text after '\ for simplicity
+            (r"'(\\\\|\\'|[^']|\\[^'\\]+)'", String.Char),
+            (r':"', String.Symbol, 'simple-sym'),
+            # Crystal doesn't have "symbol:"s but this simplifies function args
+            (r'([a-zA-Z_]\w*)(:)(?!:)', bygroups(String.Symbol, Punctuation)),
+            (r'"', String.Double, 'simple-string'),
+            (r'(?<!\.)`', String.Backtick, 'simple-backtick'),
+        ]
+
+        # double-quoted string and symbol
+        for name, ttype, end in ('string', String.Double, '"'), \
+                                ('sym', String.Symbol, '"'), \
+                                ('backtick', String.Backtick, '`'):
+            states['simple-'+name] = [
+                include('string-escaped' if name == 'sym' else 'string-intp-escaped'),
+                (rf'[^\\{end}#]+', ttype),
+                (r'[\\#]', ttype),
+                (end, ttype, '#pop'),
+            ]
+
+        # https://crystal-lang.org/docs/syntax_and_semantics/literals/string.html#percent-string-literals
+        for lbrace, rbrace, bracecc, name in \
+                ('\\{', '\\}', '{}', 'cb'), \
+                ('\\[', '\\]', '\\[\\]', 'sb'), \
+                ('\\(', '\\)', '()', 'pa'), \
+                ('<', '>', '<>', 'ab'), \
+                ('\\|', '\\|', '\\|', 'pi'):
+            states[name+'-intp-string'] = [
+                (r'\\' + lbrace, String.Other),
+            ] + (lbrace != rbrace) * [
+                (lbrace, String.Other, '#push'),
+            ] + [
+                (rbrace, String.Other, '#pop'),
+                include('string-intp-escaped'),
+                (r'[\\#' + bracecc + ']', String.Other),
+                (r'[^\\#' + bracecc + ']+', String.Other),
+            ]
+            states['strings'].append((r'%Q?' + lbrace, String.Other,
+                                      name+'-intp-string'))
+            states[name+'-string'] = [
+                (r'\\[\\' + bracecc + ']', String.Other),
+            ] + (lbrace != rbrace) * [
+                (lbrace, String.Other, '#push'),
+            ] + [
+                (rbrace, String.Other, '#pop'),
+                (r'[\\#' + bracecc + ']', String.Other),
+                (r'[^\\#' + bracecc + ']+', String.Other),
+            ]
+            # https://crystal-lang.org/docs/syntax_and_semantics/literals/array.html#percent-array-literals
+            states['strings'].append((r'%[qwi]' + lbrace, String.Other,
+                                      name+'-string'))
+            states[name+'-regex'] = [
+                (r'\\[\\' + bracecc + ']', String.Regex),
+            ] + (lbrace != rbrace) * [
+                (lbrace, String.Regex, '#push'),
+            ] + [
+                (rbrace + '[imsx]*', String.Regex, '#pop'),
+                include('string-intp'),
+                (r'[\\#' + bracecc + ']', String.Regex),
+                (r'[^\\#' + bracecc + ']+', String.Regex),
+            ]
+            states['strings'].append((r'%r' + lbrace, String.Regex,
+                                      name+'-regex'))
+
+        return states
+
+    tokens = {
+        'root': [
+            (r'#.*?$', Comment.Single),
+            # keywords
+            (words('''
+                abstract asm begin break case do else elsif end ensure extend if in
+                include next of private protected require rescue return select self super
+                then unless until when while with yield
+            '''.split(), suffix=r'\b'), Keyword),
+            (words('''
+                previous_def forall out uninitialized __DIR__ __FILE__ __LINE__
+                __END_LINE__
+            '''.split(), prefix=r'(?<!\.)', suffix=r'\b'), Keyword.Pseudo),
+            # https://crystal-lang.org/docs/syntax_and_semantics/is_a.html
+            (r'\.(is_a\?|nil\?|responds_to\?|as\?|as\b)', Keyword.Pseudo),
+            (words(['true', 'false', 'nil'], suffix=r'\b'), Keyword.Constant),
+            # start of function, class and module names
+            (r'(module|lib)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Whitespace, Name.Namespace)),
+            (r'(def|fun|macro)(\s+)((?:[a-zA-Z_]\w*::)*)',
+             bygroups(Keyword, Whitespace, Name.Namespace), 'funcname'),
+            (r'def(?=[*%&^`~+-/\[<>=])', Keyword, 'funcname'),
+            (r'(annotation|class|struct|union|type|alias|enum)(\s+)((?:[a-zA-Z_]\w*::)*)',
+             bygroups(Keyword, Whitespace, Name.Namespace), 'classname'),
+            # https://crystal-lang.org/api/toplevel.html
+            (words('''
+                instance_sizeof offsetof pointerof sizeof typeof
+            '''.split(), prefix=r'(?<!\.)', suffix=r'\b'), Keyword.Pseudo),
+            # macros
+            (r'(?<!\.)(debugger\b|p!|pp!|record\b|spawn\b)', Name.Builtin.Pseudo),
+            # builtins
+            (words('''
+                abort at_exit caller exit gets loop main p pp print printf puts
+                raise rand read_line sleep spawn sprintf system
+            '''.split(), prefix=r'(?<!\.)', suffix=r'\b'), Name.Builtin),
+            # https://crystal-lang.org/api/Object.html#macro-summary
+            (r'(?<!\.)(((class_)?((getter|property)\b[!?]?|setter\b))|'
+             r'(def_(clone|equals|equals_and_hash|hash)|delegate|forward_missing_to)\b)',
+             Name.Builtin.Pseudo),
+            # normal heredocs
+            (r'(?<!\w)(<<-?)(["`\']?)([a-zA-Z_]\w*)(\2)(.*?\n)',
+             heredoc_callback),
+            # empty string heredocs
+            (r'(<<-?)("|\')()(\2)(.*?\n)', heredoc_callback),
+            (r'__END__', Comment.Preproc, 'end-part'),
+            # multiline regex (after keywords or assignments)
+            (r'(?:^|(?<=[=<>~!:])|'
+             r'(?<=(?:\s|;)when\s)|'
+             r'(?<=(?:\s|;)or\s)|'
+             r'(?<=(?:\s|;)and\s)|'
+             r'(?<=\.index\s)|'
+             r'(?<=\.scan\s)|'
+             r'(?<=\.sub\s)|'
+             r'(?<=\.sub!\s)|'
+             r'(?<=\.gsub\s)|'
+             r'(?<=\.gsub!\s)|'
+             r'(?<=\.match\s)|'
+             r'(?<=(?:\s|;)if\s)|'
+             r'(?<=(?:\s|;)elsif\s)|'
+             r'(?<=^when\s)|'
+             r'(?<=^index\s)|'
+             r'(?<=^scan\s)|'
+             r'(?<=^sub\s)|'
+             r'(?<=^gsub\s)|'
+             r'(?<=^sub!\s)|'
+             r'(?<=^gsub!\s)|'
+             r'(?<=^match\s)|'
+             r'(?<=^if\s)|'
+             r'(?<=^elsif\s)'
+             r')(\s*)(/)', bygroups(Whitespace, String.Regex), 'multiline-regex'),
+            # multiline regex (in method calls or subscripts)
+            (r'(?<=\(|,|\[)/', String.Regex, 'multiline-regex'),
+            # multiline regex (this time the funny no whitespace rule)
+            (r'(\s+)(/)(?![\s=])', bygroups(Whitespace, String.Regex),
+             'multiline-regex'),
+            # lex numbers and ignore following regular expressions which
+            # are division operators in fact (grrrr. i hate that. any
+            # better ideas?)
+            # since pygments 0.7 we also eat a "?" operator after numbers
+            # so that the char operator does not work. Chars are not allowed
+            # there so that you can use the ternary operator.
+            # stupid example:
+            #   x>=0?n[x]:""
+            (r'(0o[0-7]+(?:_[0-7]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?',
+             bygroups(Number.Oct, Whitespace, Operator)),
+            (r'(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?',
+             bygroups(Number.Hex, Whitespace, Operator)),
+            (r'(0b[01]+(?:_[01]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?',
+             bygroups(Number.Bin, Whitespace, Operator)),
+            # 3 separate expressions for floats because any of the 3 optional
+            # parts makes it a float
+            (r'((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)(?:e[+-]?[0-9]+)?'
+             r'(?:_?f[0-9]+)?)(\s*)([/?])?',
+             bygroups(Number.Float, Whitespace, Operator)),
+            (r'((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)?(?:e[+-]?[0-9]+)'
+             r'(?:_?f[0-9]+)?)(\s*)([/?])?',
+             bygroups(Number.Float, Whitespace, Operator)),
+            (r'((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)?(?:e[+-]?[0-9]+)?'
+             r'(?:_?f[0-9]+))(\s*)([/?])?',
+             bygroups(Number.Float, Whitespace, Operator)),
+            (r'(0\b|[1-9][\d]*(?:_\d+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?',
+             bygroups(Number.Integer, Whitespace, Operator)),
+            # Names
+            (r'@@[a-zA-Z_]\w*', Name.Variable.Class),
+            (r'@[a-zA-Z_]\w*', Name.Variable.Instance),
+            (r'\$\w+', Name.Variable.Global),
+            (r'\$[!@&`\'+~=/\\,;.<>_*$?:"^-]', Name.Variable.Global),
+            (r'\$-[0adFiIlpvw]', Name.Variable.Global),
+            (r'::', Operator),
+            include('strings'),
+            # https://crystal-lang.org/reference/syntax_and_semantics/literals/char.html
+            (r'\?(\\[MC]-)*'  # modifiers
+             r'(\\([\\abefnrtv#"\']|[0-7]{1,3}|x[a-fA-F0-9]{2}|u[a-fA-F0-9]{4}|u\{[a-fA-F0-9 ]+\})|\S)'
+             r'(?!\w)',
+             String.Char),
+            (r'[A-Z][A-Z_]+\b(?!::|\.)', Name.Constant),
+            # macro expansion
+            (r'\{%', String.Interpol, 'in-macro-control'),
+            (r'\{\{', String.Interpol, 'in-macro-expr'),
+            # annotations
+            (r'(@\[)(\s*)([A-Z]\w*(::[A-Z]\w*)*)',
+             bygroups(Operator, Whitespace, Name.Decorator), 'in-annot'),
+            # this is needed because Crystal attributes can look
+            # like keywords (class) or like this: ` ?!?
+            (words(CRYSTAL_OPERATORS, prefix=r'(\.|::)'),
+             bygroups(Operator, Name.Operator)),
+            (r'(\.|::)([a-zA-Z_]\w*[!?]?|[*%&^`~+\-/\[<>=])',
+             bygroups(Operator, Name)),
+            # Names can end with [!?] unless it's "!="
+            (r'[a-zA-Z_]\w*(?:[!?](?!=))?', Name),
+            (r'(\[|\]\??|\*\*|<=>?|>=|<<?|>>?|=~|===|'
+             r'!~|&&?|\|\||\.{1,3})', Operator),
+            (r'[-+/*%=<>&!^|~]=?', Operator),
+            (r'[(){};,/?:\\]', Punctuation),
+            (r'\s+', Whitespace)
+        ],
+        'funcname': [
+            (r'(?:([a-zA-Z_]\w*)(\.))?'
+             r'([a-zA-Z_]\w*[!?]?|\*\*?|[-+]@?|'
+             r'[/%&|^`~]|\[\]=?|<<|>>|<=?>|>=?|===?)',
+             bygroups(Name.Class, Operator, Name.Function), '#pop'),
+            default('#pop')
+        ],
+        'classname': [
+            (r'[A-Z_]\w*', Name.Class),
+            (r'(\()(\s*)([A-Z_]\w*)(\s*)(\))',
+             bygroups(Punctuation, Whitespace, Name.Class, Whitespace, Punctuation)),
+            default('#pop')
+        ],
+        'in-intp': [
+            (r'\{', String.Interpol, '#push'),
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        'string-intp': [
+            (r'#\{', String.Interpol, 'in-intp'),
+        ],
+        'string-escaped': [
+            # https://crystal-lang.org/reference/syntax_and_semantics/literals/string.html
+            (r'\\([\\abefnrtv#"\']|[0-7]{1,3}|x[a-fA-F0-9]{2}|u[a-fA-F0-9]{4}|u\{[a-fA-F0-9 ]+\})',
+             String.Escape)
+        ],
+        'string-intp-escaped': [
+            include('string-intp'),
+            include('string-escaped'),
+        ],
+        'interpolated-regex': [
+            include('string-intp'),
+            (r'[\\#]', String.Regex),
+            (r'[^\\#]+', String.Regex),
+        ],
+        'interpolated-string': [
+            include('string-intp'),
+            (r'[\\#]', String.Other),
+            (r'[^\\#]+', String.Other),
+        ],
+        'multiline-regex': [
+            include('string-intp'),
+            (r'\\\\', String.Regex),
+            (r'\\/', String.Regex),
+            (r'[\\#]', String.Regex),
+            (r'[^\\/#]+', String.Regex),
+            (r'/[imsx]*', String.Regex, '#pop'),
+        ],
+        'end-part': [
+            (r'.+', Comment.Preproc, '#pop')
+        ],
+        'in-macro-control': [
+            (r'\{%', String.Interpol, '#push'),
+            (r'%\}', String.Interpol, '#pop'),
+            (r'(for|verbatim)\b', Keyword),
+            include('root'),
+        ],
+        'in-macro-expr': [
+            (r'\{\{', String.Interpol, '#push'),
+            (r'\}\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        'in-annot': [
+            (r'\[', Operator, '#push'),
+            (r'\]', Operator, '#pop'),
+            include('root'),
+        ],
+    }
+    tokens.update(gen_crystalstrings_rules())
diff --git a/.venv/Lib/site-packages/pygments/lexers/csound.py b/.venv/Lib/site-packages/pygments/lexers/csound.py
new file mode 100644 (file)
index 0000000..403b66f
--- /dev/null
@@ -0,0 +1,466 @@
+"""
+    pygments.lexers.csound
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Csound languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, default, include, using, words
+from pygments.token import Comment, Error, Keyword, Name, Number, Operator, Punctuation, \
+    String, Text, Whitespace
+from pygments.lexers._csound_builtins import OPCODES, DEPRECATED_OPCODES, REMOVED_OPCODES
+from pygments.lexers.html import HtmlLexer
+from pygments.lexers.python import PythonLexer
+from pygments.lexers.scripting import LuaLexer
+
+__all__ = ['CsoundScoreLexer', 'CsoundOrchestraLexer', 'CsoundDocumentLexer']
+
+newline = (r'((?:(?:;|//).*)*)(\n)', bygroups(Comment.Single, Text))
+
+
+class CsoundLexer(RegexLexer):
+    url = 'https://csound.com/'
+
+    tokens = {
+        'whitespace': [
+            (r'[ \t]+', Whitespace),
+            (r'/[*](?:.|\n)*?[*]/', Comment.Multiline),
+            (r'(?:;|//).*$', Comment.Single),
+            (r'(\\)(\n)', bygroups(Text, Whitespace))
+        ],
+
+        'preprocessor directives': [
+            (r'#(?:e(?:nd(?:if)?|lse)\b|##)|@@?[ \t]*\d+', Comment.Preproc),
+            (r'#includestr', Comment.Preproc, 'includestr directive'),
+            (r'#include', Comment.Preproc, 'include directive'),
+            (r'#[ \t]*define', Comment.Preproc, 'define directive'),
+            (r'#(?:ifn?def|undef)\b', Comment.Preproc, 'macro directive')
+        ],
+
+        'include directive': [
+            include('whitespace'),
+            (r'([^ \t]).*?\1', String, '#pop')
+        ],
+        'includestr directive': [
+            include('whitespace'),
+            (r'"', String, ('#pop', 'quoted string'))
+        ],
+
+        'define directive': [
+            (r'\n', Whitespace),
+            include('whitespace'),
+            (r'([A-Z_a-z]\w*)(\()', bygroups(Comment.Preproc, Punctuation),
+             ('#pop', 'macro parameter name list')),
+            (r'[A-Z_a-z]\w*', Comment.Preproc, ('#pop', 'before macro body'))
+        ],
+        'macro parameter name list': [
+            include('whitespace'),
+            (r'[A-Z_a-z]\w*', Comment.Preproc),
+            (r"['#]", Punctuation),
+            (r'\)', Punctuation, ('#pop', 'before macro body'))
+        ],
+        'before macro body': [
+            (r'\n', Whitespace),
+            include('whitespace'),
+            (r'#', Punctuation, ('#pop', 'macro body'))
+        ],
+        'macro body': [
+            (r'(?:\\(?!#)|[^#\\]|\n)+', Comment.Preproc),
+            (r'\\#', Comment.Preproc),
+            (r'(?<!\\)#', Punctuation, '#pop')
+        ],
+
+        'macro directive': [
+            include('whitespace'),
+            (r'[A-Z_a-z]\w*', Comment.Preproc, '#pop')
+        ],
+
+        'macro uses': [
+            (r'(\$[A-Z_a-z]\w*\.?)(\()', bygroups(Comment.Preproc, Punctuation),
+             'macro parameter value list'),
+            (r'\$[A-Z_a-z]\w*(?:\.|\b)', Comment.Preproc)
+        ],
+        'macro parameter value list': [
+            (r'(?:[^\'#"{()]|\{(?!\{))+', Comment.Preproc),
+            (r"['#]", Punctuation),
+            (r'"', String, 'macro parameter value quoted string'),
+            (r'\{\{', String, 'macro parameter value braced string'),
+            (r'\(', Comment.Preproc, 'macro parameter value parenthetical'),
+            (r'\)', Punctuation, '#pop')
+        ],
+        'macro parameter value quoted string': [
+            (r"\\[#'()]", Comment.Preproc),
+            (r"[#'()]", Error),
+            include('quoted string')
+        ],
+        'macro parameter value braced string': [
+            (r"\\[#'()]", Comment.Preproc),
+            (r"[#'()]", Error),
+            include('braced string')
+        ],
+        'macro parameter value parenthetical': [
+            (r'(?:[^\\()]|\\\))+', Comment.Preproc),
+            (r'\(', Comment.Preproc, '#push'),
+            (r'\)', Comment.Preproc, '#pop')
+        ],
+
+        'whitespace and macro uses': [
+            include('whitespace'),
+            include('macro uses')
+        ],
+
+        'numbers': [
+            (r'\d+[Ee][+-]?\d+|(\d+\.\d*|\d*\.\d+)([Ee][+-]?\d+)?', Number.Float),
+            (r'(0[Xx])([0-9A-Fa-f]+)', bygroups(Keyword.Type, Number.Hex)),
+            (r'\d+', Number.Integer)
+        ],
+
+        'quoted string': [
+            (r'"', String, '#pop'),
+            (r'[^"$]+', String),
+            include('macro uses'),
+            (r'[$]', String)
+        ],
+
+        'braced string': [
+            # Do nothing. This must be defined in subclasses.
+        ]
+    }
+
+
+class CsoundScoreLexer(CsoundLexer):
+    """
+    For `Csound <https://csound.com>`_ scores.
+    """
+
+    name = 'Csound Score'
+    aliases = ['csound-score', 'csound-sco']
+    filenames = ['*.sco']
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            include('whitespace and macro uses'),
+            include('preprocessor directives'),
+
+            (r'[aBbCdefiqstvxy]', Keyword),
+            # There is also a w statement that is generated internally and should not be
+            # used; see https://github.com/csound/csound/issues/750.
+
+            (r'z', Keyword.Constant),
+            # z is a constant equal to 800,000,000,000. 800 billion seconds is about
+            # 25,367.8 years. See also
+            # https://csound.com/docs/manual/ScoreTop.html and
+            # https://github.com/csound/csound/search?q=stof+path%3AEngine+filename%3Asread.c.
+
+            (r'([nNpP][pP])(\d+)', bygroups(Keyword, Number.Integer)),
+
+            (r'[mn]', Keyword, 'mark statement'),
+
+            include('numbers'),
+            (r'[!+\-*/^%&|<>#~.]', Operator),
+            (r'[()\[\]]', Punctuation),
+            (r'"', String, 'quoted string'),
+            (r'\{', Comment.Preproc, 'loop after left brace'),
+        ],
+
+        'mark statement': [
+            include('whitespace and macro uses'),
+            (r'[A-Z_a-z]\w*', Name.Label),
+            (r'\n', Whitespace, '#pop')
+        ],
+
+        'loop after left brace': [
+            include('whitespace and macro uses'),
+            (r'\d+', Number.Integer, ('#pop', 'loop after repeat count')),
+        ],
+        'loop after repeat count': [
+            include('whitespace and macro uses'),
+            (r'[A-Z_a-z]\w*', Comment.Preproc, ('#pop', 'loop'))
+        ],
+        'loop': [
+            (r'\}', Comment.Preproc, '#pop'),
+            include('root')
+        ],
+
+        # Braced strings are not allowed in Csound scores, but this is needed because the
+        # superclass includes it.
+        'braced string': [
+            (r'\}\}', String, '#pop'),
+            (r'[^}]|\}(?!\})', String)
+        ]
+    }
+
+
+class CsoundOrchestraLexer(CsoundLexer):
+    """
+    For `Csound <https://csound.com>`_ orchestras.
+    """
+
+    name = 'Csound Orchestra'
+    aliases = ['csound', 'csound-orc']
+    filenames = ['*.orc', '*.udo']
+    version_added = '2.1'
+
+    user_defined_opcodes = set()
+
+    def opcode_name_callback(lexer, match):
+        opcode = match.group(0)
+        lexer.user_defined_opcodes.add(opcode)
+        yield match.start(), Name.Function, opcode
+
+    def name_callback(lexer, match):
+        type_annotation_token = Keyword.Type
+
+        name = match.group(1)
+        if name in OPCODES or name in DEPRECATED_OPCODES or name in REMOVED_OPCODES:
+            yield match.start(), Name.Builtin, name
+        elif name in lexer.user_defined_opcodes:
+            yield match.start(), Name.Function, name
+        else:
+            type_annotation_token = Name
+            name_match = re.search(r'^(g?[afikSw])(\w+)', name)
+            if name_match:
+                yield name_match.start(1), Keyword.Type, name_match.group(1)
+                yield name_match.start(2), Name, name_match.group(2)
+            else:
+                yield match.start(), Name, name
+
+        if match.group(2):
+            yield match.start(2), Punctuation, match.group(2)
+            yield match.start(3), type_annotation_token, match.group(3)
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+
+            (r'^([ \t]*)(\w+)(:)([ \t]+|$)', bygroups(Whitespace, Name.Label, Punctuation, Whitespace)),
+
+            include('whitespace and macro uses'),
+            include('preprocessor directives'),
+
+            (r'\binstr\b', Keyword.Declaration, 'instrument numbers and identifiers'),
+            (r'\bopcode\b', Keyword.Declaration, 'after opcode keyword'),
+            (r'\b(?:end(?:in|op))\b', Keyword.Declaration),
+
+            include('partial statements')
+        ],
+
+        'partial statements': [
+            (r'\b(?:0dbfs|A4|k(?:r|smps)|nchnls(?:_i)?|sr)\b', Name.Variable.Global),
+
+            include('numbers'),
+
+            (r'\+=|-=|\*=|/=|<<|>>|<=|>=|==|!=|&&|\|\||[~¬]|[=!+\-*/^%&|<>#?:]', Operator),
+            (r'[(),\[\]]', Punctuation),
+
+            (r'"', String, 'quoted string'),
+            (r'\{\{', String, 'braced string'),
+
+            (words((
+                'do', 'else', 'elseif', 'endif', 'enduntil', 'fi', 'if', 'ithen', 'kthen',
+                'od', 'then', 'until', 'while',
+                ), prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(('return', 'rireturn'), prefix=r'\b', suffix=r'\b'), Keyword.Pseudo),
+
+            (r'\b[ik]?goto\b', Keyword, 'goto label'),
+            (r'\b(r(?:einit|igoto)|tigoto)(\(|\b)', bygroups(Keyword.Pseudo, Punctuation),
+             'goto label'),
+            (r'\b(c(?:g|in?|k|nk?)goto)(\(|\b)', bygroups(Keyword.Pseudo, Punctuation),
+             ('goto label', 'goto argument')),
+            (r'\b(timout)(\(|\b)', bygroups(Keyword.Pseudo, Punctuation),
+             ('goto label', 'goto argument', 'goto argument')),
+            (r'\b(loop_[gl][et])(\(|\b)', bygroups(Keyword.Pseudo, Punctuation),
+             ('goto label', 'goto argument', 'goto argument', 'goto argument')),
+
+            (r'\bprintk?s\b', Name.Builtin, 'prints opcode'),
+            (r'\b(?:readscore|scoreline(?:_i)?)\b', Name.Builtin, 'Csound score opcode'),
+            (r'\bpyl?run[it]?\b', Name.Builtin, 'Python opcode'),
+            (r'\blua_(?:exec|opdef)\b', Name.Builtin, 'Lua opcode'),
+            (r'\bp\d+\b', Name.Variable.Instance),
+            (r'\b([A-Z_a-z]\w*)(?:(:)([A-Za-z]))?\b', name_callback)
+        ],
+
+        'instrument numbers and identifiers': [
+            include('whitespace and macro uses'),
+            (r'\d+|[A-Z_a-z]\w*', Name.Function),
+            (r'[+,]', Punctuation),
+            (r'\n', Whitespace, '#pop')
+        ],
+
+        'after opcode keyword': [
+            include('whitespace and macro uses'),
+            (r'[A-Z_a-z]\w*', opcode_name_callback, ('#pop', 'opcode type signatures')),
+            (r'\n', Whitespace, '#pop')
+        ],
+        'opcode type signatures': [
+            include('whitespace and macro uses'),
+
+            # https://github.com/csound/csound/search?q=XIDENT+path%3AEngine+filename%3Acsound_orc.lex
+            (r'0|[afijkKoOpPStV\[\]]+', Keyword.Type),
+
+            (r',', Punctuation),
+            (r'\n', Whitespace, '#pop')
+        ],
+
+        'quoted string': [
+            (r'"', String, '#pop'),
+            (r'[^\\"$%)]+', String),
+            include('macro uses'),
+            include('escape sequences'),
+            include('format specifiers'),
+            (r'[\\$%)]', String)
+        ],
+        'braced string': [
+            (r'\}\}', String, '#pop'),
+            (r'(?:[^\\%)}]|\}(?!\}))+', String),
+            include('escape sequences'),
+            include('format specifiers'),
+            (r'[\\%)]', String)
+        ],
+        'escape sequences': [
+            # https://github.com/csound/csound/search?q=unquote_string+path%3AEngine+filename%3Acsound_orc_compile.c
+            (r'\\(?:[\\abnrt"]|[0-7]{1,3})', String.Escape)
+        ],
+        # Format specifiers are highlighted in all strings, even though only
+        #   fprintks        https://csound.com/docs/manual/fprintks.html
+        #   fprints         https://csound.com/docs/manual/fprints.html
+        #   printf/printf_i https://csound.com/docs/manual/printf.html
+        #   printks         https://csound.com/docs/manual/printks.html
+        #   prints          https://csound.com/docs/manual/prints.html
+        #   sprintf         https://csound.com/docs/manual/sprintf.html
+        #   sprintfk        https://csound.com/docs/manual/sprintfk.html
+        # work with strings that contain format specifiers. In addition, these opcodes’
+        # handling of format specifiers is inconsistent:
+        #   - fprintks and fprints accept %a and %A specifiers, and accept %s specifiers
+        #     starting in Csound 6.15.0.
+        #   - printks and prints accept %a and %A specifiers, but don’t accept %s
+        #     specifiers.
+        #   - printf, printf_i, sprintf, and sprintfk don’t accept %a and %A specifiers,
+        #     but accept %s specifiers.
+        # See https://github.com/csound/csound/issues/747 for more information.
+        'format specifiers': [
+            (r'%[#0\- +]*\d*(?:\.\d+)?[AE-GXac-giosux]', String.Interpol),
+            (r'%%', String.Escape)
+        ],
+
+        'goto argument': [
+            include('whitespace and macro uses'),
+            (r',', Punctuation, '#pop'),
+            include('partial statements')
+        ],
+        'goto label': [
+            include('whitespace and macro uses'),
+            (r'\w+', Name.Label, '#pop'),
+            default('#pop')
+        ],
+
+        'prints opcode': [
+            include('whitespace and macro uses'),
+            (r'"', String, 'prints quoted string'),
+            default('#pop')
+        ],
+        'prints quoted string': [
+            (r'\\\\[aAbBnNrRtT]', String.Escape),
+            (r'%[!nNrRtT]|[~^]{1,2}', String.Escape),
+            include('quoted string')
+        ],
+
+        'Csound score opcode': [
+            include('whitespace and macro uses'),
+            (r'"', String, 'quoted string'),
+            (r'\{\{', String, 'Csound score'),
+            (r'\n', Whitespace, '#pop')
+        ],
+        'Csound score': [
+            (r'\}\}', String, '#pop'),
+            (r'([^}]+)|\}(?!\})', using(CsoundScoreLexer))
+        ],
+
+        'Python opcode': [
+            include('whitespace and macro uses'),
+            (r'"', String, 'quoted string'),
+            (r'\{\{', String, 'Python'),
+            (r'\n', Whitespace, '#pop')
+        ],
+        'Python': [
+            (r'\}\}', String, '#pop'),
+            (r'([^}]+)|\}(?!\})', using(PythonLexer))
+        ],
+
+        'Lua opcode': [
+            include('whitespace and macro uses'),
+            (r'"', String, 'quoted string'),
+            (r'\{\{', String, 'Lua'),
+            (r'\n', Whitespace, '#pop')
+        ],
+        'Lua': [
+            (r'\}\}', String, '#pop'),
+            (r'([^}]+)|\}(?!\})', using(LuaLexer))
+        ]
+    }
+
+
+class CsoundDocumentLexer(RegexLexer):
+    """
+    For Csound documents.
+    """
+
+    name = 'Csound Document'
+    aliases = ['csound-document', 'csound-csd']
+    filenames = ['*.csd']
+    url = 'https://csound.com'
+    version_added = '2.1'
+
+    # These tokens are based on those in XmlLexer in pygments/lexers/html.py. Making
+    # CsoundDocumentLexer a subclass of XmlLexer rather than RegexLexer may seem like a
+    # better idea, since Csound Document files look like XML files. However, Csound
+    # Documents can contain Csound comments (preceded by //, for example) before and
+    # after the root element, unescaped bitwise AND & and less than < operators, etc. In
+    # other words, while Csound Document files look like XML files, they may not actually
+    # be XML files.
+    tokens = {
+        'root': [
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'(?:;|//).*$', Comment.Single),
+            (r'[^/;<]+|/(?!/)', Text),
+
+            (r'<\s*CsInstruments', Name.Tag, ('orchestra', 'tag')),
+            (r'<\s*CsScore', Name.Tag, ('score', 'tag')),
+            (r'<\s*[Hh][Tt][Mm][Ll]', Name.Tag, ('HTML', 'tag')),
+
+            (r'<\s*[\w:.-]+', Name.Tag, 'tag'),
+            (r'<\s*/\s*[\w:.-]+\s*>', Name.Tag)
+        ],
+
+        'orchestra': [
+            (r'<\s*/\s*CsInstruments\s*>', Name.Tag, '#pop'),
+            (r'(.|\n)+?(?=<\s*/\s*CsInstruments\s*>)', using(CsoundOrchestraLexer))
+        ],
+        'score': [
+            (r'<\s*/\s*CsScore\s*>', Name.Tag, '#pop'),
+            (r'(.|\n)+?(?=<\s*/\s*CsScore\s*>)', using(CsoundScoreLexer))
+        ],
+        'HTML': [
+            (r'<\s*/\s*[Hh][Tt][Mm][Ll]\s*>', Name.Tag, '#pop'),
+            (r'(.|\n)+?(?=<\s*/\s*[Hh][Tt][Mm][Ll]\s*>)', using(HtmlLexer))
+        ],
+
+        'tag': [
+            (r'\s+', Whitespace),
+            (r'[\w.:-]+\s*=', Name.Attribute, 'attr'),
+            (r'/?\s*>', Name.Tag, '#pop')
+        ],
+        'attr': [
+            (r'\s+', Whitespace),
+            (r'".*?"', String, '#pop'),
+            (r"'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop')
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/css.py b/.venv/Lib/site-packages/pygments/lexers/css.py
new file mode 100644 (file)
index 0000000..97897db
--- /dev/null
@@ -0,0 +1,602 @@
+"""
+    pygments.lexers.css
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for CSS and related stylesheet formats.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+import copy
+
+from pygments.lexer import ExtendedRegexLexer, RegexLexer, include, bygroups, \
+    default, words, inherit
+from pygments.token import Comment, Operator, Keyword, Name, String, Number, \
+    Punctuation, Whitespace
+from pygments.lexers._css_builtins import _css_properties
+
+__all__ = ['CssLexer', 'SassLexer', 'ScssLexer', 'LessCssLexer']
+
+
+# List of vendor prefixes obtained from:
+# https://www.w3.org/TR/CSS21/syndata.html#vendor-keyword-history
+_vendor_prefixes = (
+    '-ms-', 'mso-', '-moz-', '-o-', '-xv-', '-atsc-', '-wap-', '-khtml-',
+    '-webkit-', 'prince-', '-ah-', '-hp-', '-ro-', '-rim-', '-tc-',
+)
+
+# List of extended color keywords obtained from:
+# https://drafts.csswg.org/css-color/#named-colors
+_color_keywords = (
+    'aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige',
+    'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown',
+    'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral',
+    'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan',
+    'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki',
+    'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred',
+    'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray',
+    'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue',
+    'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite',
+    'forestgreen', 'fuchsia', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod',
+    'gray', 'green', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred',
+    'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen',
+    'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan',
+    'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey',
+    'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue',
+    'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow',
+    'lime', 'limegreen', 'linen', 'magenta', 'maroon', 'mediumaquamarine',
+    'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen',
+    'mediumslateblue', 'mediumspringgreen', 'mediumturquoise',
+    'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin',
+    'navajowhite', 'navy', 'oldlace', 'olive', 'olivedrab', 'orange',
+    'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise',
+    'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum',
+    'powderblue', 'purple', 'rebeccapurple', 'red', 'rosybrown', 'royalblue',
+    'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna',
+    'silver', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow',
+    'springgreen', 'steelblue', 'tan', 'teal', 'thistle', 'tomato', 'turquoise',
+    'violet', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen',
+) + ('transparent',)
+
+# List of keyword values obtained from:
+# http://cssvalues.com/
+_keyword_values = (
+    'absolute', 'alias', 'all', 'all-petite-caps', 'all-scroll',
+    'all-small-caps', 'allow-end', 'alpha', 'alternate', 'alternate-reverse',
+    'always', 'armenian', 'auto', 'avoid', 'avoid-column', 'avoid-page',
+    'backwards', 'balance', 'baseline', 'below', 'blink', 'block', 'bold',
+    'bolder', 'border-box', 'both', 'bottom', 'box-decoration', 'break-word',
+    'capitalize', 'cell', 'center', 'circle', 'clip', 'clone', 'close-quote',
+    'col-resize', 'collapse', 'color', 'color-burn', 'color-dodge', 'column',
+    'column-reverse', 'compact', 'condensed', 'contain', 'container',
+    'content-box', 'context-menu', 'copy', 'cover', 'crisp-edges', 'crosshair',
+    'currentColor', 'cursive', 'darken', 'dashed', 'decimal',
+    'decimal-leading-zero', 'default', 'descendants', 'difference', 'digits',
+    'disc', 'distribute', 'dot', 'dotted', 'double', 'double-circle', 'e-resize',
+    'each-line', 'ease', 'ease-in', 'ease-in-out', 'ease-out', 'edges',
+    'ellipsis', 'end', 'ew-resize', 'exclusion', 'expanded', 'extra-condensed',
+    'extra-expanded', 'fantasy', 'fill', 'fill-box', 'filled', 'first', 'fixed',
+    'flat', 'flex', 'flex-end', 'flex-start', 'flip', 'force-end', 'forwards',
+    'from-image', 'full-width', 'geometricPrecision', 'georgian', 'groove',
+    'hanging', 'hard-light', 'help', 'hidden', 'hide', 'horizontal', 'hue',
+    'icon', 'infinite', 'inherit', 'initial', 'ink', 'inline', 'inline-block',
+    'inline-flex', 'inline-table', 'inset', 'inside', 'inter-word', 'invert',
+    'isolate', 'italic', 'justify', 'large', 'larger', 'last', 'left',
+    'lighten', 'lighter', 'line-through', 'linear', 'list-item', 'local',
+    'loose', 'lower-alpha', 'lower-greek', 'lower-latin', 'lower-roman',
+    'lowercase', 'ltr', 'luminance', 'luminosity', 'mandatory', 'manipulation',
+    'manual', 'margin-box', 'match-parent', 'medium', 'mixed', 'monospace',
+    'move', 'multiply', 'n-resize', 'ne-resize', 'nesw-resize',
+    'no-close-quote', 'no-drop', 'no-open-quote', 'no-repeat', 'none', 'normal',
+    'not-allowed', 'nowrap', 'ns-resize', 'nw-resize', 'nwse-resize', 'objects',
+    'oblique', 'off', 'on', 'open', 'open-quote', 'optimizeLegibility',
+    'optimizeSpeed', 'outset', 'outside', 'over', 'overlay', 'overline',
+    'padding-box', 'page', 'pan-down', 'pan-left', 'pan-right', 'pan-up',
+    'pan-x', 'pan-y', 'paused', 'petite-caps', 'pixelated', 'pointer',
+    'preserve-3d', 'progress', 'proximity', 'relative', 'repeat',
+    'repeat no-repeat', 'repeat-x', 'repeat-y', 'reverse', 'revert', 'ridge', 'right',
+    'round', 'row', 'row-resize', 'row-reverse', 'rtl', 'ruby', 'ruby-base',
+    'ruby-base-container', 'ruby-text', 'ruby-text-container', 'run-in',
+    'running', 's-resize', 'sans-serif', 'saturation', 'scale-down', 'screen',
+    'scroll', 'se-resize', 'semi-condensed', 'semi-expanded', 'separate',
+    'serif', 'sesame', 'show', 'sideways', 'sideways-left', 'sideways-right',
+    'slice', 'small', 'small-caps', 'smaller', 'smooth', 'snap', 'soft-light',
+    'solid', 'space', 'space-around', 'space-between', 'spaces', 'square',
+    'start', 'static', 'step-end', 'step-start', 'sticky', 'stretch', 'strict',
+    'stroke-box', 'style', 'sw-resize', 'table', 'table-caption', 'table-cell',
+    'table-column', 'table-column-group', 'table-footer-group',
+    'table-header-group', 'table-row', 'table-row-group', 'text', 'thick',
+    'thin', 'titling-caps', 'to', 'top', 'triangle', 'ultra-condensed',
+    'ultra-expanded', 'under', 'underline', 'unicase', 'unset', 'upper-alpha',
+    'upper-latin', 'upper-roman', 'uppercase', 'upright', 'use-glyph-orientation',
+    'vertical', 'vertical-text', 'view-box', 'visible', 'w-resize', 'wait',
+    'wavy', 'weight', 'weight style', 'wrap', 'wrap-reverse', 'x-large',
+    'x-small', 'xx-large', 'xx-small', 'zoom-in', 'zoom-out',
+)
+
+# List of other keyword values from other sources:
+_other_keyword_values = (
+    'above', 'aural', 'behind', 'bidi-override', 'center-left', 'center-right',
+    'cjk-ideographic', 'continuous', 'crop', 'cross', 'embed', 'far-left',
+    'far-right', 'fast', 'faster', 'hebrew', 'high', 'higher', 'hiragana',
+    'hiragana-iroha', 'katakana', 'katakana-iroha', 'landscape', 'left-side',
+    'leftwards', 'level', 'loud', 'low', 'lower', 'message-box', 'middle',
+    'mix', 'narrower', 'once', 'portrait', 'right-side', 'rightwards', 'silent',
+    'slow', 'slower', 'small-caption', 'soft', 'spell-out', 'status-bar',
+    'super', 'text-bottom', 'text-top', 'wider', 'x-fast', 'x-high', 'x-loud',
+    'x-low', 'x-soft', 'yes', 'pre', 'pre-wrap', 'pre-line',
+)
+
+# List of functional notation and function keyword values:
+_functional_notation_keyword_values = (
+    'attr', 'blackness', 'blend', 'blenda', 'blur', 'brightness', 'calc',
+    'circle', 'color-mod', 'contrast', 'counter', 'cubic-bezier', 'device-cmyk',
+    'drop-shadow', 'ellipse', 'gray', 'grayscale', 'hsl', 'hsla', 'hue',
+    'hue-rotate', 'hwb', 'image', 'inset', 'invert', 'lightness',
+    'linear-gradient', 'matrix', 'matrix3d', 'opacity', 'perspective',
+    'polygon', 'radial-gradient', 'rect', 'repeating-linear-gradient',
+    'repeating-radial-gradient', 'rgb', 'rgba', 'rotate', 'rotate3d', 'rotateX',
+    'rotateY', 'rotateZ', 'saturate', 'saturation', 'scale', 'scale3d',
+    'scaleX', 'scaleY', 'scaleZ', 'sepia', 'shade', 'skewX', 'skewY', 'steps',
+    'tint', 'toggle', 'translate', 'translate3d', 'translateX', 'translateY',
+    'translateZ', 'whiteness',
+)
+# Note! Handle url(...) separately.
+
+# List of units obtained from:
+# https://www.w3.org/TR/css3-values/
+_angle_units = (
+    'deg', 'grad', 'rad', 'turn',
+)
+_frequency_units = (
+    'Hz', 'kHz',
+)
+_length_units = (
+    'em', 'ex', 'ch', 'rem',
+    'vh', 'vw', 'vmin', 'vmax',
+    'px', 'mm', 'cm', 'in', 'pt', 'pc', 'q',
+)
+_resolution_units = (
+    'dpi', 'dpcm', 'dppx',
+)
+_time_units = (
+    's', 'ms',
+)
+_all_units = _angle_units + _frequency_units + _length_units + \
+    _resolution_units + _time_units
+
+
+class CssLexer(RegexLexer):
+    """
+    For CSS (Cascading Style Sheets).
+    """
+
+    name = 'CSS'
+    url = 'https://www.w3.org/TR/CSS/#css'
+    aliases = ['css']
+    filenames = ['*.css']
+    mimetypes = ['text/css']
+    version_added = ''
+
+    tokens = {
+        'root': [
+            include('basics'),
+        ],
+        'basics': [
+            (r'\s+', Whitespace),
+            (r'/\*(?:.|\n)*?\*/', Comment),
+            (r'\{', Punctuation, 'content'),
+            (r'(\:{1,2})([\w-]+)', bygroups(Punctuation, Name.Decorator)),
+            (r'(\.)([\w-]+)', bygroups(Punctuation, Name.Class)),
+            (r'(\#)([\w-]+)', bygroups(Punctuation, Name.Namespace)),
+            (r'(@)([\w-]+)', bygroups(Punctuation, Keyword), 'atrule'),
+            (r'[\w-]+', Name.Tag),
+            (r'[~^*!%&$\[\]()<>|+=@:;,./?-]', Operator),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ],
+        'atrule': [
+            (r'\{', Punctuation, 'atcontent'),
+            (r';', Punctuation, '#pop'),
+            include('basics'),
+        ],
+        'atcontent': [
+            include('basics'),
+            (r'\}', Punctuation, '#pop:2'),
+        ],
+        'content': [
+            (r'\s+', Whitespace),
+            (r'\}', Punctuation, '#pop'),
+            (r';', Punctuation),
+            (r'^@.*?$', Comment.Preproc),
+
+            (words(_vendor_prefixes,), Keyword.Pseudo),
+            (r'('+r'|'.join(_css_properties)+r')(\s*)(\:)',
+             bygroups(Keyword, Whitespace, Punctuation), 'value-start'),
+            (r'([-]+[a-zA-Z_][\w-]*)(\s*)(\:)', bygroups(Name.Variable, Whitespace, Punctuation),
+             'value-start'),
+            (r'([a-zA-Z_][\w-]*)(\s*)(\:)', bygroups(Name, Whitespace, Punctuation),
+             'value-start'),
+
+            (r'/\*(?:.|\n)*?\*/', Comment),
+        ],
+        'value-start': [
+            (r'\s+', Whitespace),
+            (words(_vendor_prefixes,), Name.Builtin.Pseudo),
+            include('urls'),
+            (r'('+r'|'.join(_functional_notation_keyword_values)+r')(\()',
+             bygroups(Name.Builtin, Punctuation), 'function-start'),
+            (r'([a-zA-Z_][\w-]+)(\()',
+             bygroups(Name.Function, Punctuation), 'function-start'),
+            (words(_keyword_values, suffix=r'\b'), Keyword.Constant),
+            (words(_other_keyword_values, suffix=r'\b'), Keyword.Constant),
+            (words(_color_keywords, suffix=r'\b'), Keyword.Constant),
+            # for transition-property etc.
+            (words(_css_properties, suffix=r'\b'), Keyword),
+            (r'\!important', Comment.Preproc),
+            (r'/\*(?:.|\n)*?\*/', Comment),
+
+            include('numeric-values'),
+
+            (r'[~^*!%&<>|+=@:./?-]+', Operator),
+            (r'[\[\](),]+', Punctuation),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'[a-zA-Z_][\w-]*', Name),
+            (r';', Punctuation, '#pop'),
+            (r'\}', Punctuation, '#pop:2'),
+        ],
+        'function-start': [
+            (r'\s+', Whitespace),
+            (r'[-]+([A-Za-z][\w+]*[-]*)+', Name.Variable),
+            include('urls'),
+            (words(_vendor_prefixes,), Keyword.Pseudo),
+            (words(_keyword_values, suffix=r'\b'), Keyword.Constant),
+            (words(_other_keyword_values, suffix=r'\b'), Keyword.Constant),
+            (words(_color_keywords, suffix=r'\b'), Keyword.Constant),
+
+            # function-start may be entered recursively
+            (r'(' + r'|'.join(_functional_notation_keyword_values) + r')(\()',
+             bygroups(Name.Builtin, Punctuation), 'function-start'),
+            (r'([a-zA-Z_][\w-]+)(\()',
+             bygroups(Name.Function, Punctuation), 'function-start'),
+
+            (r'/\*(?:.|\n)*?\*/', Comment),
+            include('numeric-values'),
+            (r'[*+/-]', Operator),
+            (r',', Punctuation),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'[a-zA-Z_-]\w*', Name),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'urls': [
+            (r'(url)(\()(".*?")(\))', bygroups(Name.Builtin, Punctuation,
+                                               String.Double, Punctuation)),
+            (r"(url)(\()('.*?')(\))", bygroups(Name.Builtin, Punctuation,
+                                               String.Single, Punctuation)),
+            (r'(url)(\()(.*?)(\))', bygroups(Name.Builtin, Punctuation,
+                                             String.Other, Punctuation)),
+        ],
+        'numeric-values': [
+            (r'\#[a-zA-Z0-9]{1,6}', Number.Hex),
+            (r'[+\-]?[0-9]*[.][0-9]+', Number.Float, 'numeric-end'),
+            (r'[+\-]?[0-9]+', Number.Integer, 'numeric-end'),
+        ],
+        'numeric-end': [
+            (words(_all_units, suffix=r'\b'), Keyword.Type),
+            (r'%', Keyword.Type),
+            default('#pop'),
+        ],
+    }
+
+
+common_sass_tokens = {
+    'value': [
+        (r'[ \t]+', Whitespace),
+        (r'[!$][\w-]+', Name.Variable),
+        (r'url\(', String.Other, 'string-url'),
+        (r'[a-z_-][\w-]*(?=\()', Name.Function),
+        (words(_css_properties + (
+            'above', 'absolute', 'always', 'armenian', 'aural', 'auto', 'avoid', 'baseline',
+            'behind', 'below', 'bidi-override', 'blink', 'block', 'bold', 'bolder', 'both',
+            'capitalize', 'center-left', 'center-right', 'center', 'circle',
+            'cjk-ideographic', 'close-quote', 'collapse', 'condensed', 'continuous',
+            'crosshair', 'cross', 'cursive', 'dashed', 'decimal-leading-zero',
+            'decimal', 'default', 'digits', 'disc', 'dotted', 'double', 'e-resize', 'embed',
+            'extra-condensed', 'extra-expanded', 'expanded', 'fantasy', 'far-left',
+            'far-right', 'faster', 'fast', 'fixed', 'georgian', 'groove', 'hebrew', 'help',
+            'hidden', 'hide', 'higher', 'high', 'hiragana-iroha', 'hiragana', 'icon',
+            'inherit', 'inline-table', 'inline', 'inset', 'inside', 'invert', 'italic',
+            'justify', 'katakana-iroha', 'katakana', 'landscape', 'larger', 'large',
+            'left-side', 'leftwards', 'level', 'lighter', 'line-through', 'list-item',
+            'loud', 'lower-alpha', 'lower-greek', 'lower-roman', 'lowercase', 'ltr',
+            'lower', 'low', 'medium', 'message-box', 'middle', 'mix', 'monospace',
+            'n-resize', 'narrower', 'ne-resize', 'no-close-quote', 'no-open-quote',
+            'no-repeat', 'none', 'normal', 'nowrap', 'nw-resize', 'oblique', 'once',
+            'open-quote', 'outset', 'outside', 'overline', 'pointer', 'portrait', 'px',
+            'relative', 'repeat-x', 'repeat-y', 'repeat', 'rgb', 'ridge', 'right-side',
+            'rightwards', 's-resize', 'sans-serif', 'scroll', 'se-resize',
+            'semi-condensed', 'semi-expanded', 'separate', 'serif', 'show', 'silent',
+            'slow', 'slower', 'small-caps', 'small-caption', 'smaller', 'soft', 'solid',
+            'spell-out', 'square', 'static', 'status-bar', 'super', 'sw-resize',
+            'table-caption', 'table-cell', 'table-column', 'table-column-group',
+            'table-footer-group', 'table-header-group', 'table-row',
+            'table-row-group', 'text', 'text-bottom', 'text-top', 'thick', 'thin',
+            'transparent', 'ultra-condensed', 'ultra-expanded', 'underline',
+            'upper-alpha', 'upper-latin', 'upper-roman', 'uppercase', 'url',
+            'visible', 'w-resize', 'wait', 'wider', 'x-fast', 'x-high', 'x-large', 'x-loud',
+            'x-low', 'x-small', 'x-soft', 'xx-large', 'xx-small', 'yes'), suffix=r'\b'),
+         Name.Constant),
+        (words(_color_keywords, suffix=r'\b'), Name.Entity),
+        (words((
+            'black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green',
+            'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua'), suffix=r'\b'),
+         Name.Builtin),
+        (r'\!(important|default)', Name.Exception),
+        (r'(true|false)', Name.Pseudo),
+        (r'(and|or|not)', Operator.Word),
+        (r'/\*', Comment.Multiline, 'inline-comment'),
+        (r'//[^\n]*', Comment.Single),
+        (r'\#[a-z0-9]{1,6}', Number.Hex),
+        (r'(-?\d+)(\%|[a-z]+)?', bygroups(Number.Integer, Keyword.Type)),
+        (r'(-?\d*\.\d+)(\%|[a-z]+)?', bygroups(Number.Float, Keyword.Type)),
+        (r'#\{', String.Interpol, 'interpolation'),
+        (r'[~^*!&%<>|+=@:,./?-]+', Operator),
+        (r'[\[\]()]+', Punctuation),
+        (r'"', String.Double, 'string-double'),
+        (r"'", String.Single, 'string-single'),
+        (r'[a-z_-][\w-]*', Name),
+    ],
+
+    'interpolation': [
+        (r'\}', String.Interpol, '#pop'),
+        include('value'),
+    ],
+
+    'selector': [
+        (r'[ \t]+', Whitespace),
+        (r'\:', Name.Decorator, 'pseudo-class'),
+        (r'\.', Name.Class, 'class'),
+        (r'\#', Name.Namespace, 'id'),
+        (r'[\w-]+', Name.Tag),
+        (r'#\{', String.Interpol, 'interpolation'),
+        (r'&', Keyword),
+        (r'[~^*!&\[\]()<>|+=@:;,./?-]', Operator),
+        (r'"', String.Double, 'string-double'),
+        (r"'", String.Single, 'string-single'),
+    ],
+
+    'string-double': [
+        (r'(\\.|#(?=[^\n{])|[^\n"#])+', String.Double),
+        (r'#\{', String.Interpol, 'interpolation'),
+        (r'"', String.Double, '#pop'),
+    ],
+
+    'string-single': [
+        (r"(\\.|#(?=[^\n{])|[^\n'#])+", String.Single),
+        (r'#\{', String.Interpol, 'interpolation'),
+        (r"'", String.Single, '#pop'),
+    ],
+
+    'string-url': [
+        (r'(\\#|#(?=[^\n{])|[^\n#)])+', String.Other),
+        (r'#\{', String.Interpol, 'interpolation'),
+        (r'\)', String.Other, '#pop'),
+    ],
+
+    'pseudo-class': [
+        (r'[\w-]+', Name.Decorator),
+        (r'#\{', String.Interpol, 'interpolation'),
+        default('#pop'),
+    ],
+
+    'class': [
+        (r'[\w-]+', Name.Class),
+        (r'#\{', String.Interpol, 'interpolation'),
+        default('#pop'),
+    ],
+
+    'id': [
+        (r'[\w-]+', Name.Namespace),
+        (r'#\{', String.Interpol, 'interpolation'),
+        default('#pop'),
+    ],
+
+    'for': [
+        (r'(from|to|through)', Operator.Word),
+        include('value'),
+    ],
+}
+
+
+def _indentation(lexer, match, ctx):
+    indentation = match.group(0)
+    yield match.start(), Whitespace, indentation
+    ctx.last_indentation = indentation
+    ctx.pos = match.end()
+
+    if hasattr(ctx, 'block_state') and ctx.block_state and \
+            indentation.startswith(ctx.block_indentation) and \
+            indentation != ctx.block_indentation:
+        ctx.stack.append(ctx.block_state)
+    else:
+        ctx.block_state = None
+        ctx.block_indentation = None
+        ctx.stack.append('content')
+
+
+def _starts_block(token, state):
+    def callback(lexer, match, ctx):
+        yield match.start(), token, match.group(0)
+
+        if hasattr(ctx, 'last_indentation'):
+            ctx.block_indentation = ctx.last_indentation
+        else:
+            ctx.block_indentation = ''
+
+        ctx.block_state = state
+        ctx.pos = match.end()
+
+    return callback
+
+
+class SassLexer(ExtendedRegexLexer):
+    """
+    For Sass stylesheets.
+    """
+
+    name = 'Sass'
+    url = 'https://sass-lang.com/'
+    aliases = ['sass']
+    filenames = ['*.sass']
+    mimetypes = ['text/x-sass']
+    version_added = '1.3'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'[ \t]*\n', Whitespace),
+            (r'[ \t]*', _indentation),
+        ],
+
+        'content': [
+            (r'//[^\n]*', _starts_block(Comment.Single, 'single-comment'),
+             'root'),
+            (r'/\*[^\n]*', _starts_block(Comment.Multiline, 'multi-comment'),
+             'root'),
+            (r'@import', Keyword, 'import'),
+            (r'@for', Keyword, 'for'),
+            (r'@(debug|warn|if|while)', Keyword, 'value'),
+            (r'(@mixin)( )([\w-]+)', bygroups(Keyword, Whitespace, Name.Function), 'value'),
+            (r'(@include)( )([\w-]+)', bygroups(Keyword, Whitespace, Name.Decorator), 'value'),
+            (r'@extend', Keyword, 'selector'),
+            (r'@[\w-]+', Keyword, 'selector'),
+            (r'=[\w-]+', Name.Function, 'value'),
+            (r'\+[\w-]+', Name.Decorator, 'value'),
+            (r'([!$][\w-]\w*)([ \t]*(?:(?:\|\|)?=|:))',
+             bygroups(Name.Variable, Operator), 'value'),
+            (r':', Name.Attribute, 'old-style-attr'),
+            (r'(?=.+?[=:]([^a-z]|$))', Name.Attribute, 'new-style-attr'),
+            default('selector'),
+        ],
+
+        'single-comment': [
+            (r'.+', Comment.Single),
+            (r'\n', Whitespace, 'root'),
+        ],
+
+        'multi-comment': [
+            (r'.+', Comment.Multiline),
+            (r'\n', Whitespace, 'root'),
+        ],
+
+        'import': [
+            (r'[ \t]+', Whitespace),
+            (r'\S+', String),
+            (r'\n', Whitespace, 'root'),
+        ],
+
+        'old-style-attr': [
+            (r'[^\s:="\[]+', Name.Attribute),
+            (r'#\{', String.Interpol, 'interpolation'),
+            (r'([ \t]*)(=)', bygroups(Whitespace, Operator), 'value'),
+            default('value'),
+        ],
+
+        'new-style-attr': [
+            (r'[^\s:="\[]+', Name.Attribute),
+            (r'#\{', String.Interpol, 'interpolation'),
+            (r'([ \t]*)([=:])', bygroups(Whitespace, Operator), 'value'),
+        ],
+
+        'inline-comment': [
+            (r"(\\#|#(?=[^\n{])|\*(?=[^\n/])|[^\n#*])+", Comment.Multiline),
+            (r'#\{', String.Interpol, 'interpolation'),
+            (r"\*/", Comment, '#pop'),
+        ],
+    }
+    for group, common in common_sass_tokens.items():
+        tokens[group] = copy.copy(common)
+    tokens['value'].append((r'\n', Whitespace, 'root'))
+    tokens['selector'].append((r'\n', Whitespace, 'root'))
+
+
+class ScssLexer(RegexLexer):
+    """
+    For SCSS stylesheets.
+    """
+
+    name = 'SCSS'
+    url = 'https://sass-lang.com/'
+    aliases = ['scss']
+    filenames = ['*.scss']
+    mimetypes = ['text/x-scss']
+    version_added = ''
+
+    flags = re.IGNORECASE | re.DOTALL
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@import', Keyword, 'value'),
+            (r'@for', Keyword, 'for'),
+            (r'@(debug|warn|if|while)', Keyword, 'value'),
+            (r'(@mixin)( [\w-]+)', bygroups(Keyword, Name.Function), 'value'),
+            (r'(@include)( [\w-]+)', bygroups(Keyword, Name.Decorator), 'value'),
+            (r'@extend', Keyword, 'selector'),
+            (r'(@media)(\s+)', bygroups(Keyword, Whitespace), 'value'),
+            (r'@[\w-]+', Keyword, 'selector'),
+            (r'(\$[\w-]*\w)([ \t]*:)', bygroups(Name.Variable, Operator), 'value'),
+            # TODO: broken, and prone to infinite loops.
+            # (r'(?=[^;{}][;}])', Name.Attribute, 'attr'),
+            # (r'(?=[^;{}:]+:[^a-z])', Name.Attribute, 'attr'),
+            default('selector'),
+        ],
+
+        'attr': [
+            (r'[^\s:="\[]+', Name.Attribute),
+            (r'#\{', String.Interpol, 'interpolation'),
+            (r'[ \t]*:', Operator, 'value'),
+            default('#pop'),
+        ],
+
+        'inline-comment': [
+            (r"(\\#|#(?=[^{])|\*(?=[^/])|[^#*])+", Comment.Multiline),
+            (r'#\{', String.Interpol, 'interpolation'),
+            (r"\*/", Comment, '#pop'),
+        ],
+    }
+    for group, common in common_sass_tokens.items():
+        tokens[group] = copy.copy(common)
+    tokens['value'].extend([(r'\n', Whitespace), (r'[;{}]', Punctuation, '#pop')])
+    tokens['selector'].extend([(r'\n', Whitespace), (r'[;{}]', Punctuation, '#pop')])
+
+
+class LessCssLexer(CssLexer):
+    """
+    For LESS styleshets.
+    """
+
+    name = 'LessCss'
+    url = 'http://lesscss.org/'
+    aliases = ['less']
+    filenames = ['*.less']
+    mimetypes = ['text/x-less-css']
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            (r'@\w+', Name.Variable),
+            inherit,
+        ],
+        'content': [
+            (r'\{', Punctuation, '#push'),
+            (r'//.*\n', Comment.Single),
+            inherit,
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/d.py b/.venv/Lib/site-packages/pygments/lexers/d.py
new file mode 100644 (file)
index 0000000..a0b56e9
--- /dev/null
@@ -0,0 +1,259 @@
+"""
+    pygments.lexers.d
+    ~~~~~~~~~~~~~~~~~
+
+    Lexers for D languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words, bygroups
+from pygments.token import Comment, Keyword, Name, String, Number, \
+    Punctuation, Whitespace
+
+__all__ = ['DLexer', 'CrocLexer', 'MiniDLexer']
+
+
+class DLexer(RegexLexer):
+    """
+    For D source.
+    """
+    name = 'D'
+    url = 'https://dlang.org/'
+    filenames = ['*.d', '*.di']
+    aliases = ['d']
+    mimetypes = ['text/x-dsrc']
+    version_added = '1.2'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            # (r'\\\n', Text), # line continuations
+            # Comments
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'/\+', Comment.Multiline, 'nested_comment'),
+            # Keywords
+            (words((
+                'abstract', 'alias', 'align', 'asm', 'assert', 'auto', 'body',
+                'break', 'case', 'cast', 'catch', 'class', 'const', 'continue',
+                'debug', 'default', 'delegate', 'delete', 'deprecated', 'do', 'else',
+                'enum', 'export', 'extern', 'finally', 'final', 'foreach_reverse',
+                'foreach', 'for', 'function', 'goto', 'if', 'immutable', 'import',
+                'interface', 'invariant', 'inout', 'in', 'is', 'lazy', 'mixin',
+                'module', 'new', 'nothrow', 'out', 'override', 'package', 'pragma',
+                'private', 'protected', 'public', 'pure', 'ref', 'return', 'scope',
+                'shared', 'static', 'struct', 'super', 'switch', 'synchronized',
+                'template', 'this', 'throw', 'try', 'typeid', 'typeof',
+                'union', 'unittest', 'version', 'volatile', 'while', 'with',
+                '__gshared', '__traits', '__vector', '__parameters'),
+                suffix=r'\b'),
+             Keyword),
+            (words((
+                # Removed in 2.072
+                'typedef', ),
+                suffix=r'\b'),
+             Keyword.Removed),
+            (words((
+                'bool', 'byte', 'cdouble', 'cent', 'cfloat', 'char', 'creal',
+                'dchar', 'double', 'float', 'idouble', 'ifloat', 'int', 'ireal',
+                'long', 'real', 'short', 'ubyte', 'ucent', 'uint', 'ulong',
+                'ushort', 'void', 'wchar'), suffix=r'\b'),
+             Keyword.Type),
+            (r'(false|true|null)\b', Keyword.Constant),
+            (words((
+                '__FILE__', '__FILE_FULL_PATH__', '__MODULE__', '__LINE__', '__FUNCTION__',
+                '__PRETTY_FUNCTION__', '__DATE__', '__EOF__', '__TIME__', '__TIMESTAMP__',
+                '__VENDOR__', '__VERSION__'), suffix=r'\b'),
+             Keyword.Pseudo),
+            (r'macro\b', Keyword.Reserved),
+            (r'(string|wstring|dstring|size_t|ptrdiff_t)\b', Name.Builtin),
+            # FloatLiteral
+            # -- HexFloat
+            (r'0[xX]([0-9a-fA-F_]*\.[0-9a-fA-F_]+|[0-9a-fA-F_]+)'
+             r'[pP][+\-]?[0-9_]+[fFL]?[i]?', Number.Float),
+            # -- DecimalFloat
+            (r'[0-9_]+(\.[0-9_]+[eE][+\-]?[0-9_]+|'
+             r'\.[0-9_]*|[eE][+\-]?[0-9_]+)[fFL]?[i]?', Number.Float),
+            (r'\.(0|[1-9][0-9_]*)([eE][+\-]?[0-9_]+)?[fFL]?[i]?', Number.Float),
+            # IntegerLiteral
+            # -- Binary
+            (r'0[Bb][01_]+', Number.Bin),
+            # -- Octal
+            (r'0[0-7_]+', Number.Oct),
+            # -- Hexadecimal
+            (r'0[xX][0-9a-fA-F_]+', Number.Hex),
+            # -- Decimal
+            (r'(0|[1-9][0-9_]*)([LUu]|Lu|LU|uL|UL)?', Number.Integer),
+            # CharacterLiteral
+            (r"""'(\\['"?\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}"""
+             r"""|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|\\&\w+;|.)'""",
+             String.Char),
+            # StringLiteral
+            # -- WysiwygString
+            (r'r"[^"]*"[cwd]?', String),
+            # -- AlternateWysiwygString
+            (r'`[^`]*`[cwd]?', String),
+            # -- DoubleQuotedString
+            (r'"(\\\\|\\[^\\]|[^"\\])*"[cwd]?', String),
+            # -- EscapeSequence
+            (r"\\(['\"?\\abfnrtv]|x[0-9a-fA-F]{2}|[0-7]{1,3}"
+             r"|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|&\w+;)",
+             String),
+            # -- HexString
+            (r'x"[0-9a-fA-F_\s]*"[cwd]?', String),
+            # -- DelimitedString
+            (r'q"\[', String, 'delimited_bracket'),
+            (r'q"\(', String, 'delimited_parenthesis'),
+            (r'q"<', String, 'delimited_angle'),
+            (r'q"\{', String, 'delimited_curly'),
+            (r'q"([a-zA-Z_]\w*)\n.*?\n\1"', String),
+            (r'q"(.).*?\1"', String),
+            # -- TokenString
+            (r'q\{', String, 'token_string'),
+            # Attributes
+            (r'@([a-zA-Z_]\w*)?', Name.Decorator),
+            # Tokens
+            (r'(~=|\^=|%=|\*=|==|!>=|!<=|!<>=|!<>|!<|!>|!=|>>>=|>>>|>>=|>>|>='
+             r'|<>=|<>|<<=|<<|<=|\+\+|\+=|--|-=|\|\||\|=|&&|&=|\.\.\.|\.\.|/=)'
+             r'|[/.&|\-+<>!()\[\]{}?,;:$=*%^~]', Punctuation),
+            # Identifier
+            (r'[a-zA-Z_]\w*', Name),
+            # Line
+            (r'(#line)(\s)(.*)(\n)', bygroups(Comment.Special, Whitespace,
+                Comment.Special, Whitespace)),
+        ],
+        'nested_comment': [
+            (r'[^+/]+', Comment.Multiline),
+            (r'/\+', Comment.Multiline, '#push'),
+            (r'\+/', Comment.Multiline, '#pop'),
+            (r'[+/]', Comment.Multiline),
+        ],
+        'token_string': [
+            (r'\{', Punctuation, 'token_string_nest'),
+            (r'\}', String, '#pop'),
+            include('root'),
+        ],
+        'token_string_nest': [
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'delimited_bracket': [
+            (r'[^\[\]]+', String),
+            (r'\[', String, 'delimited_inside_bracket'),
+            (r'\]"', String, '#pop'),
+        ],
+        'delimited_inside_bracket': [
+            (r'[^\[\]]+', String),
+            (r'\[', String, '#push'),
+            (r'\]', String, '#pop'),
+        ],
+        'delimited_parenthesis': [
+            (r'[^()]+', String),
+            (r'\(', String, 'delimited_inside_parenthesis'),
+            (r'\)"', String, '#pop'),
+        ],
+        'delimited_inside_parenthesis': [
+            (r'[^()]+', String),
+            (r'\(', String, '#push'),
+            (r'\)', String, '#pop'),
+        ],
+        'delimited_angle': [
+            (r'[^<>]+', String),
+            (r'<', String, 'delimited_inside_angle'),
+            (r'>"', String, '#pop'),
+        ],
+        'delimited_inside_angle': [
+            (r'[^<>]+', String),
+            (r'<', String, '#push'),
+            (r'>', String, '#pop'),
+        ],
+        'delimited_curly': [
+            (r'[^{}]+', String),
+            (r'\{', String, 'delimited_inside_curly'),
+            (r'\}"', String, '#pop'),
+        ],
+        'delimited_inside_curly': [
+            (r'[^{}]+', String),
+            (r'\{', String, '#push'),
+            (r'\}', String, '#pop'),
+        ],
+    }
+
+
+class CrocLexer(RegexLexer):
+    """
+    For Croc source.
+    """
+    name = 'Croc'
+    url = 'http://jfbillingsley.com/croc'
+    filenames = ['*.croc']
+    aliases = ['croc']
+    mimetypes = ['text/x-crocsrc']
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            # Comments
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/\*', Comment.Multiline, 'nestedcomment'),
+            # Keywords
+            (words((
+                'as', 'assert', 'break', 'case', 'catch', 'class', 'continue',
+                'default', 'do', 'else', 'finally', 'for', 'foreach', 'function',
+                'global', 'namespace', 'if', 'import', 'in', 'is', 'local',
+                'module', 'return', 'scope', 'super', 'switch', 'this', 'throw',
+                'try', 'vararg', 'while', 'with', 'yield'), suffix=r'\b'),
+             Keyword),
+            (r'(false|true|null)\b', Keyword.Constant),
+            # FloatLiteral
+            (r'([0-9][0-9_]*)(?=[.eE])(\.[0-9][0-9_]*)?([eE][+\-]?[0-9_]+)?',
+             Number.Float),
+            # IntegerLiteral
+            # -- Binary
+            (r'0[bB][01][01_]*', Number.Bin),
+            # -- Hexadecimal
+            (r'0[xX][0-9a-fA-F][0-9a-fA-F_]*', Number.Hex),
+            # -- Decimal
+            (r'([0-9][0-9_]*)(?![.eE])', Number.Integer),
+            # CharacterLiteral
+            (r"""'(\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\[0-9]{1,3}"""
+             r"""|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|.)'""",
+             String.Char),
+            # StringLiteral
+            # -- WysiwygString
+            (r'@"(""|[^"])*"', String),
+            (r'@`(``|[^`])*`', String),
+            (r"@'(''|[^'])*'", String),
+            # -- DoubleQuotedString
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            # Tokens
+            (r'(~=|\^=|%=|\*=|==|!=|>>>=|>>>|>>=|>>|>=|<=>|\?=|-\>'
+             r'|<<=|<<|<=|\+\+|\+=|--|-=|\|\||\|=|&&|&=|\.\.|/=)'
+             r'|[-/.&$@|\+<>!()\[\]{}?,;:=*%^~#\\]', Punctuation),
+            # Identifier
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'nestedcomment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+    }
+
+
+class MiniDLexer(CrocLexer):
+    """
+    For MiniD source. MiniD is now known as Croc.
+    """
+    name = 'MiniD'
+    filenames = []  # don't lex .md as MiniD, reserve for Markdown
+    aliases = ['minid']
+    mimetypes = ['text/x-minidsrc']
+    version_added = ''
diff --git a/.venv/Lib/site-packages/pygments/lexers/dalvik.py b/.venv/Lib/site-packages/pygments/lexers/dalvik.py
new file mode 100644 (file)
index 0000000..1ac332b
--- /dev/null
@@ -0,0 +1,126 @@
+"""
+    pygments.lexers.dalvik
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexers for Dalvik VM-related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Keyword, Text, Comment, Name, String, Number, \
+    Punctuation, Whitespace
+
+__all__ = ['SmaliLexer']
+
+
+class SmaliLexer(RegexLexer):
+    """
+    For Smali (Android/Dalvik) assembly
+    code.
+    """
+    name = 'Smali'
+    url = 'http://code.google.com/p/smali/'
+    aliases = ['smali']
+    filenames = ['*.smali']
+    mimetypes = ['text/smali']
+    version_added = '1.6'
+
+    tokens = {
+        'root': [
+            include('comment'),
+            include('label'),
+            include('field'),
+            include('method'),
+            include('class'),
+            include('directive'),
+            include('access-modifier'),
+            include('instruction'),
+            include('literal'),
+            include('punctuation'),
+            include('type'),
+            include('whitespace')
+        ],
+        'directive': [
+            (r'^([ \t]*)(\.(?:class|super|implements|field|subannotation|annotation|'
+             r'enum|method|registers|locals|array-data|packed-switch|'
+             r'sparse-switch|catchall|catch|line|parameter|local|prologue|'
+             r'epilogue|source))', bygroups(Whitespace, Keyword)),
+            (r'^([ \t]*)(\.end)( )(field|subannotation|annotation|method|array-data|'
+             'packed-switch|sparse-switch|parameter|local)',
+             bygroups(Whitespace, Keyword, Whitespace, Keyword)),
+            (r'^([ \t]*)(\.restart)( )(local)',
+             bygroups(Whitespace, Keyword, Whitespace, Keyword)),
+        ],
+        'access-modifier': [
+            (r'(public|private|protected|static|final|synchronized|bridge|'
+             r'varargs|native|abstract|strictfp|synthetic|constructor|'
+             r'declared-synchronized|interface|enum|annotation|volatile|'
+             r'transient)', Keyword),
+        ],
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+        ],
+        'instruction': [
+            (r'\b[vp]\d+\b', Name.Builtin),  # registers
+            (r'(\b[a-z][A-Za-z0-9/-]+)(\s+)', bygroups(Text, Whitespace)),  # instructions
+        ],
+        'literal': [
+            (r'".*"', String),
+            (r'0x[0-9A-Fa-f]+t?', Number.Hex),
+            (r'[0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'[0-9]+L?', Number.Integer),
+        ],
+        'field': [
+            (r'(\$?\b)([\w$]*)(:)',
+             bygroups(Punctuation, Name.Variable, Punctuation)),
+        ],
+        'method': [
+            (r'<(?:cl)?init>', Name.Function),  # constructor
+            (r'(\$?\b)([\w$]*)(\()',
+             bygroups(Punctuation, Name.Function, Punctuation)),
+        ],
+        'label': [
+            (r':\w+', Name.Label),
+        ],
+        'class': [
+            # class names in the form Lcom/namespace/ClassName;
+            # I only want to color the ClassName part, so the namespace part is
+            # treated as 'Text'
+            (r'(L)((?:[\w$]+/)*)([\w$]+)(;)',
+                bygroups(Keyword.Type, Text, Name.Class, Text)),
+        ],
+        'punctuation': [
+            (r'->', Punctuation),
+            (r'[{},():=.-]', Punctuation),
+        ],
+        'type': [
+            (r'[ZBSCIJFDV\[]+', Keyword.Type),
+        ],
+        'comment': [
+            (r'#.*?\n', Comment),
+        ],
+    }
+
+    def analyse_text(text):
+        score = 0
+        if re.search(r'^\s*\.class\s', text, re.MULTILINE):
+            score += 0.5
+            if re.search(r'\b((check-cast|instance-of|throw-verification-error'
+                         r')\b|(-to|add|[ais]get|[ais]put|and|cmpl|const|div|'
+                         r'if|invoke|move|mul|neg|not|or|rem|return|rsub|shl|'
+                         r'shr|sub|ushr)[-/])|{|}', text, re.MULTILINE):
+                score += 0.3
+        if re.search(r'(\.(catchall|epilogue|restart local|prologue)|'
+                     r'\b(array-data|class-change-error|declared-synchronized|'
+                     r'(field|inline|vtable)@0x[0-9a-fA-F]|generic-error|'
+                     r'illegal-class-access|illegal-field-access|'
+                     r'illegal-method-access|instantiation-error|no-error|'
+                     r'no-such-class|no-such-field|no-such-method|'
+                     r'packed-switch|sparse-switch))\b', text, re.MULTILINE):
+            score += 0.6
+        return score
diff --git a/.venv/Lib/site-packages/pygments/lexers/data.py b/.venv/Lib/site-packages/pygments/lexers/data.py
new file mode 100644 (file)
index 0000000..f432032
--- /dev/null
@@ -0,0 +1,763 @@
+"""
+    pygments.lexers.data
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for data file format.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import Lexer, ExtendedRegexLexer, LexerContext, \
+    include, bygroups
+from pygments.token import Comment, Error, Keyword, Literal, Name, Number, \
+    Punctuation, String, Whitespace
+
+__all__ = ['YamlLexer', 'JsonLexer', 'JsonBareObjectLexer', 'JsonLdLexer']
+
+
+class YamlLexerContext(LexerContext):
+    """Indentation context for the YAML lexer."""
+
+    def __init__(self, *args, **kwds):
+        super().__init__(*args, **kwds)
+        self.indent_stack = []
+        self.indent = -1
+        self.next_indent = 0
+        self.block_scalar_indent = None
+
+
+class YamlLexer(ExtendedRegexLexer):
+    """
+    Lexer for YAML, a human-friendly data serialization
+    language.
+    """
+
+    name = 'YAML'
+    url = 'http://yaml.org/'
+    aliases = ['yaml']
+    filenames = ['*.yaml', '*.yml']
+    mimetypes = ['text/x-yaml']
+    version_added = '0.11'
+
+    def something(token_class):
+        """Do not produce empty tokens."""
+        def callback(lexer, match, context):
+            text = match.group()
+            if not text:
+                return
+            yield match.start(), token_class, text
+            context.pos = match.end()
+        return callback
+
+    def reset_indent(token_class):
+        """Reset the indentation levels."""
+        def callback(lexer, match, context):
+            text = match.group()
+            context.indent_stack = []
+            context.indent = -1
+            context.next_indent = 0
+            context.block_scalar_indent = None
+            yield match.start(), token_class, text
+            context.pos = match.end()
+        return callback
+
+    def save_indent(token_class, start=False):
+        """Save a possible indentation level."""
+        def callback(lexer, match, context):
+            text = match.group()
+            extra = ''
+            if start:
+                context.next_indent = len(text)
+                if context.next_indent < context.indent:
+                    while context.next_indent < context.indent:
+                        context.indent = context.indent_stack.pop()
+                    if context.next_indent > context.indent:
+                        extra = text[context.indent:]
+                        text = text[:context.indent]
+            else:
+                context.next_indent += len(text)
+            if text:
+                yield match.start(), token_class, text
+            if extra:
+                yield match.start()+len(text), token_class.Error, extra
+            context.pos = match.end()
+        return callback
+
+    def set_indent(token_class, implicit=False):
+        """Set the previously saved indentation level."""
+        def callback(lexer, match, context):
+            text = match.group()
+            if context.indent < context.next_indent:
+                context.indent_stack.append(context.indent)
+                context.indent = context.next_indent
+            if not implicit:
+                context.next_indent += len(text)
+            yield match.start(), token_class, text
+            context.pos = match.end()
+        return callback
+
+    def set_block_scalar_indent(token_class):
+        """Set an explicit indentation level for a block scalar."""
+        def callback(lexer, match, context):
+            text = match.group()
+            context.block_scalar_indent = None
+            if not text:
+                return
+            increment = match.group(1)
+            if increment:
+                current_indent = max(context.indent, 0)
+                increment = int(increment)
+                context.block_scalar_indent = current_indent + increment
+            if text:
+                yield match.start(), token_class, text
+                context.pos = match.end()
+        return callback
+
+    def parse_block_scalar_empty_line(indent_token_class, content_token_class):
+        """Process an empty line in a block scalar."""
+        def callback(lexer, match, context):
+            text = match.group()
+            if (context.block_scalar_indent is None or
+                    len(text) <= context.block_scalar_indent):
+                if text:
+                    yield match.start(), indent_token_class, text
+            else:
+                indentation = text[:context.block_scalar_indent]
+                content = text[context.block_scalar_indent:]
+                yield match.start(), indent_token_class, indentation
+                yield (match.start()+context.block_scalar_indent,
+                       content_token_class, content)
+            context.pos = match.end()
+        return callback
+
+    def parse_block_scalar_indent(token_class):
+        """Process indentation spaces in a block scalar."""
+        def callback(lexer, match, context):
+            text = match.group()
+            if context.block_scalar_indent is None:
+                if len(text) <= max(context.indent, 0):
+                    context.stack.pop()
+                    context.stack.pop()
+                    return
+                context.block_scalar_indent = len(text)
+            else:
+                if len(text) < context.block_scalar_indent:
+                    context.stack.pop()
+                    context.stack.pop()
+                    return
+            if text:
+                yield match.start(), token_class, text
+                context.pos = match.end()
+        return callback
+
+    def parse_plain_scalar_indent(token_class):
+        """Process indentation spaces in a plain scalar."""
+        def callback(lexer, match, context):
+            text = match.group()
+            if len(text) <= context.indent:
+                context.stack.pop()
+                context.stack.pop()
+                return
+            if text:
+                yield match.start(), token_class, text
+                context.pos = match.end()
+        return callback
+
+    tokens = {
+        # the root rules
+        'root': [
+            # ignored whitespaces
+            (r'[ ]+(?=#|$)', Whitespace),
+            # line breaks
+            (r'\n+', Whitespace),
+            # a comment
+            (r'#[^\n]*', Comment.Single),
+            # the '%YAML' directive
+            (r'^%YAML(?=[ ]|$)', reset_indent(Name.Tag), 'yaml-directive'),
+            # the %TAG directive
+            (r'^%TAG(?=[ ]|$)', reset_indent(Name.Tag), 'tag-directive'),
+            # document start and document end indicators
+            (r'^(?:---|\.\.\.)(?=[ ]|$)', reset_indent(Name.Namespace),
+             'block-line'),
+            # indentation spaces
+            (r'[ ]*(?!\s|$)', save_indent(Whitespace, start=True),
+             ('block-line', 'indentation')),
+        ],
+
+        # trailing whitespaces after directives or a block scalar indicator
+        'ignored-line': [
+            # ignored whitespaces
+            (r'[ ]+(?=#|$)', Whitespace),
+            # a comment
+            (r'#[^\n]*', Comment.Single),
+            # line break
+            (r'\n', Whitespace, '#pop:2'),
+        ],
+
+        # the %YAML directive
+        'yaml-directive': [
+            # the version number
+            (r'([ ]+)([0-9]+\.[0-9]+)',
+             bygroups(Whitespace, Number), 'ignored-line'),
+        ],
+
+        # the %TAG directive
+        'tag-directive': [
+            # a tag handle and the corresponding prefix
+            (r'([ ]+)(!|![\w-]*!)'
+             r'([ ]+)(!|!?[\w;/?:@&=+$,.!~*\'()\[\]%-]+)',
+             bygroups(Whitespace, Keyword.Type, Whitespace, Keyword.Type),
+             'ignored-line'),
+        ],
+
+        # block scalar indicators and indentation spaces
+        'indentation': [
+            # trailing whitespaces are ignored
+            (r'[ ]*$', something(Whitespace), '#pop:2'),
+            # whitespaces preceding block collection indicators
+            (r'[ ]+(?=[?:-](?:[ ]|$))', save_indent(Whitespace)),
+            # block collection indicators
+            (r'[?:-](?=[ ]|$)', set_indent(Punctuation.Indicator)),
+            # the beginning a block line
+            (r'[ ]*', save_indent(Whitespace), '#pop'),
+        ],
+
+        # an indented line in the block context
+        'block-line': [
+            # the line end
+            (r'[ ]*(?=#|$)', something(Whitespace), '#pop'),
+            # whitespaces separating tokens
+            (r'[ ]+', Whitespace),
+            # key with colon
+            (r'''([^#,?\[\]{}"'\n]+)(:)(?=[ ]|$)''',
+             bygroups(Name.Tag, set_indent(Punctuation, implicit=True))),
+            # tags, anchors and aliases,
+            include('descriptors'),
+            # block collections and scalars
+            include('block-nodes'),
+            # flow collections and quoted scalars
+            include('flow-nodes'),
+            # a plain scalar
+            (r'(?=[^\s?:,\[\]{}#&*!|>\'"%@`-]|[?:-]\S)',
+             something(Name.Variable),
+             'plain-scalar-in-block-context'),
+        ],
+
+        # tags, anchors, aliases
+        'descriptors': [
+            # a full-form tag
+            (r'!<[\w#;/?:@&=+$,.!~*\'()\[\]%-]+>', Keyword.Type),
+            # a tag in the form '!', '!suffix' or '!handle!suffix'
+            (r'!(?:[\w-]+!)?'
+             r'[\w#;/?:@&=+$,.!~*\'()\[\]%-]*', Keyword.Type),
+            # an anchor
+            (r'&[\w-]+', Name.Label),
+            # an alias
+            (r'\*[\w-]+', Name.Variable),
+        ],
+
+        # block collections and scalars
+        'block-nodes': [
+            # implicit key
+            (r':(?=[ ]|$)', set_indent(Punctuation.Indicator, implicit=True)),
+            # literal and folded scalars
+            (r'[|>]', Punctuation.Indicator,
+             ('block-scalar-content', 'block-scalar-header')),
+        ],
+
+        # flow collections and quoted scalars
+        'flow-nodes': [
+            # a flow sequence
+            (r'\[', Punctuation.Indicator, 'flow-sequence'),
+            # a flow mapping
+            (r'\{', Punctuation.Indicator, 'flow-mapping'),
+            # a single-quoted scalar
+            (r'\'', String, 'single-quoted-scalar'),
+            # a double-quoted scalar
+            (r'\"', String, 'double-quoted-scalar'),
+        ],
+
+        # the content of a flow collection
+        'flow-collection': [
+            # whitespaces
+            (r'[ ]+', Whitespace),
+            # line breaks
+            (r'\n+', Whitespace),
+            # a comment
+            (r'#[^\n]*', Comment.Single),
+            # simple indicators
+            (r'[?:,]', Punctuation.Indicator),
+            # tags, anchors and aliases
+            include('descriptors'),
+            # nested collections and quoted scalars
+            include('flow-nodes'),
+            # a plain scalar
+            (r'(?=[^\s?:,\[\]{}#&*!|>\'"%@`])',
+             something(Name.Variable),
+             'plain-scalar-in-flow-context'),
+        ],
+
+        # a flow sequence indicated by '[' and ']'
+        'flow-sequence': [
+            # include flow collection rules
+            include('flow-collection'),
+            # the closing indicator
+            (r'\]', Punctuation.Indicator, '#pop'),
+        ],
+
+        # a flow mapping indicated by '{' and '}'
+        'flow-mapping': [
+            # key with colon
+            (r'''([^,:?\[\]{}"'\n]+)(:)(?=[ ]|$)''',
+             bygroups(Name.Tag, Punctuation)),
+            # include flow collection rules
+            include('flow-collection'),
+            # the closing indicator
+            (r'\}', Punctuation.Indicator, '#pop'),
+        ],
+
+        # block scalar lines
+        'block-scalar-content': [
+            # line break
+            (r'\n', Whitespace),
+            # empty line
+            (r'^[ ]+$',
+             parse_block_scalar_empty_line(Whitespace, Name.Constant)),
+            # indentation spaces (we may leave the state here)
+            (r'^[ ]*', parse_block_scalar_indent(Whitespace)),
+            # line content
+            (r'[\S\t ]+', Name.Constant),
+        ],
+
+        # the content of a literal or folded scalar
+        'block-scalar-header': [
+            # indentation indicator followed by chomping flag
+            (r'([1-9])?[+-]?(?=[ ]|$)',
+             set_block_scalar_indent(Punctuation.Indicator),
+             'ignored-line'),
+            # chomping flag followed by indentation indicator
+            (r'[+-]?([1-9])?(?=[ ]|$)',
+             set_block_scalar_indent(Punctuation.Indicator),
+             'ignored-line'),
+        ],
+
+        # ignored and regular whitespaces in quoted scalars
+        'quoted-scalar-whitespaces': [
+            # leading and trailing whitespaces are ignored
+            (r'^[ ]+', Whitespace),
+            (r'[ ]+$', Whitespace),
+            # line breaks are ignored
+            (r'\n+', Whitespace),
+            # other whitespaces are a part of the value
+            (r'[ ]+', Name.Variable),
+        ],
+
+        # single-quoted scalars
+        'single-quoted-scalar': [
+            # include whitespace and line break rules
+            include('quoted-scalar-whitespaces'),
+            # escaping of the quote character
+            (r'\'\'', String.Escape),
+            # regular non-whitespace characters
+            (r'[^\s\']+', String),
+            # the closing quote
+            (r'\'', String, '#pop'),
+        ],
+
+        # double-quoted scalars
+        'double-quoted-scalar': [
+            # include whitespace and line break rules
+            include('quoted-scalar-whitespaces'),
+            # escaping of special characters
+            (r'\\[0abt\tn\nvfre "\\N_LP]', String),
+            # escape codes
+            (r'\\(?:x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})',
+             String.Escape),
+            # regular non-whitespace characters
+            (r'[^\s"\\]+', String),
+            # the closing quote
+            (r'"', String, '#pop'),
+        ],
+
+        # the beginning of a new line while scanning a plain scalar
+        'plain-scalar-in-block-context-new-line': [
+            # empty lines
+            (r'^[ ]+$', Whitespace),
+            # line breaks
+            (r'\n+', Whitespace),
+            # document start and document end indicators
+            (r'^(?=---|\.\.\.)', something(Name.Namespace), '#pop:3'),
+            # indentation spaces (we may leave the block line state here)
+            (r'^[ ]*', parse_plain_scalar_indent(Whitespace), '#pop'),
+        ],
+
+        # a plain scalar in the block context
+        'plain-scalar-in-block-context': [
+            # the scalar ends with the ':' indicator
+            (r'[ ]*(?=:[ ]|:$)', something(Whitespace), '#pop'),
+            # the scalar ends with whitespaces followed by a comment
+            (r'[ ]+(?=#)', Whitespace, '#pop'),
+            # trailing whitespaces are ignored
+            (r'[ ]+$', Whitespace),
+            # line breaks are ignored
+            (r'\n+', Whitespace, 'plain-scalar-in-block-context-new-line'),
+            # other whitespaces are a part of the value
+            (r'[ ]+', Literal.Scalar.Plain),
+            # regular non-whitespace characters
+            (r'(?::(?!\s)|[^\s:])+', Literal.Scalar.Plain),
+        ],
+
+        # a plain scalar is the flow context
+        'plain-scalar-in-flow-context': [
+            # the scalar ends with an indicator character
+            (r'[ ]*(?=[,:?\[\]{}])', something(Whitespace), '#pop'),
+            # the scalar ends with a comment
+            (r'[ ]+(?=#)', Whitespace, '#pop'),
+            # leading and trailing whitespaces are ignored
+            (r'^[ ]+', Whitespace),
+            (r'[ ]+$', Whitespace),
+            # line breaks are ignored
+            (r'\n+', Whitespace),
+            # other whitespaces are a part of the value
+            (r'[ ]+', Name.Variable),
+            # regular non-whitespace characters
+            (r'[^\s,:?\[\]{}]+', Name.Variable),
+        ],
+
+    }
+
+    def get_tokens_unprocessed(self, text=None, context=None):
+        if context is None:
+            context = YamlLexerContext(text, 0)
+        return super().get_tokens_unprocessed(text, context)
+
+
+class JsonLexer(Lexer):
+    """
+    For JSON data structures.
+
+    Javascript-style comments are supported (like ``/* */`` and ``//``),
+    though comments are not part of the JSON specification.
+    This allows users to highlight JSON as it is used in the wild.
+
+    No validation is performed on the input JSON document.
+    """
+
+    name = 'JSON'
+    url = 'https://www.json.org'
+    aliases = ['json', 'json-object']
+    filenames = ['*.json', '*.jsonl', '*.ndjson', 'Pipfile.lock']
+    mimetypes = ['application/json', 'application/json-object', 'application/x-ndjson', 'application/jsonl', 'application/json-seq']
+    version_added = '1.5'
+
+    # No validation of integers, floats, or constants is done.
+    # As long as the characters are members of the following
+    # sets, the token will be considered valid. For example,
+    #
+    #     "--1--" is parsed as an integer
+    #     "1...eee" is parsed as a float
+    #     "trustful" is parsed as a constant
+    #
+    integers = set('-0123456789')
+    floats = set('.eE+')
+    constants = set('truefalsenull')  # true|false|null
+    hexadecimals = set('0123456789abcdefABCDEF')
+    punctuations = set('{}[],')
+    whitespaces = {'\u0020', '\u000a', '\u000d', '\u0009'}
+
+    def get_tokens_unprocessed(self, text):
+        """Parse JSON data."""
+
+        in_string = False
+        in_escape = False
+        in_unicode_escape = 0
+        in_whitespace = False
+        in_constant = False
+        in_number = False
+        in_float = False
+        in_punctuation = False
+        in_comment_single = False
+        in_comment_multiline = False
+        expecting_second_comment_opener = False  # // or /*
+        expecting_second_comment_closer = False  # */
+
+        start = 0
+
+        # The queue is used to store data that may need to be tokenized
+        # differently based on what follows. In particular, JSON object
+        # keys are tokenized differently than string values, but cannot
+        # be distinguished until punctuation is encountered outside the
+        # string.
+        #
+        # A ":" character after the string indicates that the string is
+        # an object key; any other character indicates the string is a
+        # regular string value.
+        #
+        # The queue holds tuples that contain the following data:
+        #
+        #     (start_index, token_type, text)
+        #
+        # By default the token type of text in double quotes is
+        # String.Double. The token type will be replaced if a colon
+        # is encountered after the string closes.
+        #
+        queue = []
+
+        for stop, character in enumerate(text):
+            if in_string:
+                if in_unicode_escape:
+                    if character in self.hexadecimals:
+                        in_unicode_escape -= 1
+                        if not in_unicode_escape:
+                            in_escape = False
+                    else:
+                        in_unicode_escape = 0
+                        in_escape = False
+
+                elif in_escape:
+                    if character == 'u':
+                        in_unicode_escape = 4
+                    else:
+                        in_escape = False
+
+                elif character == '\\':
+                    in_escape = True
+
+                elif character == '"':
+                    queue.append((start, String.Double, text[start:stop + 1]))
+                    in_string = False
+                    in_escape = False
+                    in_unicode_escape = 0
+
+                continue
+
+            elif in_whitespace:
+                if character in self.whitespaces:
+                    continue
+
+                if queue:
+                    queue.append((start, Whitespace, text[start:stop]))
+                else:
+                    yield start, Whitespace, text[start:stop]
+                in_whitespace = False
+                # Fall through so the new character can be evaluated.
+
+            elif in_constant:
+                if character in self.constants:
+                    continue
+
+                yield start, Keyword.Constant, text[start:stop]
+                in_constant = False
+                # Fall through so the new character can be evaluated.
+
+            elif in_number:
+                if character in self.integers:
+                    continue
+                elif character in self.floats:
+                    in_float = True
+                    continue
+
+                if in_float:
+                    yield start, Number.Float, text[start:stop]
+                else:
+                    yield start, Number.Integer, text[start:stop]
+                in_number = False
+                in_float = False
+                # Fall through so the new character can be evaluated.
+
+            elif in_punctuation:
+                if character in self.punctuations:
+                    continue
+
+                yield start, Punctuation, text[start:stop]
+                in_punctuation = False
+                # Fall through so the new character can be evaluated.
+
+            elif in_comment_single:
+                if character != '\n':
+                    continue
+
+                if queue:
+                    queue.append((start, Comment.Single, text[start:stop]))
+                else:
+                    yield start, Comment.Single, text[start:stop]
+
+                in_comment_single = False
+                # Fall through so the new character can be evaluated.
+
+            elif in_comment_multiline:
+                if character == '*':
+                    expecting_second_comment_closer = True
+                elif expecting_second_comment_closer:
+                    expecting_second_comment_closer = False
+                    if character == '/':
+                        if queue:
+                            queue.append((start, Comment.Multiline, text[start:stop + 1]))
+                        else:
+                            yield start, Comment.Multiline, text[start:stop + 1]
+
+                        in_comment_multiline = False
+
+                continue
+
+            elif expecting_second_comment_opener:
+                expecting_second_comment_opener = False
+                if character == '/':
+                    in_comment_single = True
+                    continue
+                elif character == '*':
+                    in_comment_multiline = True
+                    continue
+
+                # Exhaust the queue. Accept the existing token types.
+                yield from queue
+                queue.clear()
+
+                yield start, Error, text[start:stop]
+                # Fall through so the new character can be evaluated.
+
+            start = stop
+
+            if character == '"':
+                in_string = True
+
+            elif character in self.whitespaces:
+                in_whitespace = True
+
+            elif character in {'f', 'n', 't'}:  # The first letters of true|false|null
+                # Exhaust the queue. Accept the existing token types.
+                yield from queue
+                queue.clear()
+
+                in_constant = True
+
+            elif character in self.integers:
+                # Exhaust the queue. Accept the existing token types.
+                yield from queue
+                queue.clear()
+
+                in_number = True
+
+            elif character == ':':
+                # Yield from the queue. Replace string token types.
+                for _start, _token, _text in queue:
+                    # There can be only three types of tokens before a ':':
+                    # Whitespace, Comment, or a quoted string.
+                    #
+                    # If it's a quoted string we emit Name.Tag.
+                    # Otherwise, we yield the original token.
+                    #
+                    # In all other cases this would be invalid JSON,
+                    # but this is not a validating JSON lexer, so it's OK.
+                    if _token is String.Double:
+                        yield _start, Name.Tag, _text
+                    else:
+                        yield _start, _token, _text
+                queue.clear()
+
+                in_punctuation = True
+
+            elif character in self.punctuations:
+                # Exhaust the queue. Accept the existing token types.
+                yield from queue
+                queue.clear()
+
+                in_punctuation = True
+
+            elif character == '/':
+                # This is the beginning of a comment.
+                expecting_second_comment_opener = True
+
+            else:
+                # Exhaust the queue. Accept the existing token types.
+                yield from queue
+                queue.clear()
+
+                yield start, Error, character
+
+        # Yield any remaining text.
+        yield from queue
+        if in_string:
+            yield start, Error, text[start:]
+        elif in_float:
+            yield start, Number.Float, text[start:]
+        elif in_number:
+            yield start, Number.Integer, text[start:]
+        elif in_constant:
+            yield start, Keyword.Constant, text[start:]
+        elif in_whitespace:
+            yield start, Whitespace, text[start:]
+        elif in_punctuation:
+            yield start, Punctuation, text[start:]
+        elif in_comment_single:
+            yield start, Comment.Single, text[start:]
+        elif in_comment_multiline:
+            yield start, Error, text[start:]
+        elif expecting_second_comment_opener:
+            yield start, Error, text[start:]
+
+
+class JsonBareObjectLexer(JsonLexer):
+    """
+    For JSON data structures (with missing object curly braces).
+
+    .. deprecated:: 2.8.0
+
+       Behaves the same as `JsonLexer` now.
+    """
+
+    name = 'JSONBareObject'
+    aliases = []
+    filenames = []
+    mimetypes = []
+    version_added = '2.2'
+
+
+class JsonLdLexer(JsonLexer):
+    """
+    For JSON-LD linked data.
+    """
+
+    name = 'JSON-LD'
+    url = 'https://json-ld.org/'
+    aliases = ['jsonld', 'json-ld']
+    filenames = ['*.jsonld']
+    mimetypes = ['application/ld+json']
+    version_added = '2.0'
+
+    json_ld_keywords = {
+        f'"@{keyword}"'
+        for keyword in (
+            'base',
+            'container',
+            'context',
+            'direction',
+            'graph',
+            'id',
+            'import',
+            'included',
+            'index',
+            'json',
+            'language',
+            'list',
+            'nest',
+            'none',
+            'prefix',
+            'propagate',
+            'protected',
+            'reverse',
+            'set',
+            'type',
+            'value',
+            'version',
+            'vocab',
+        )
+    }
+
+    def get_tokens_unprocessed(self, text):
+        for start, token, value in super().get_tokens_unprocessed(text):
+            if token is Name.Tag and value in self.json_ld_keywords:
+                yield start, Name.Decorator, value
+            else:
+                yield start, token, value
diff --git a/.venv/Lib/site-packages/pygments/lexers/dax.py b/.venv/Lib/site-packages/pygments/lexers/dax.py
new file mode 100644 (file)
index 0000000..9c33394
--- /dev/null
@@ -0,0 +1,135 @@
+"""
+    pygments.lexers.dax
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for LilyPond.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Punctuation, Whitespace,\
+    Name, Operator, String, Number, Text
+
+__all__ = ['DaxLexer']
+
+
+class DaxLexer(RegexLexer):
+    """
+    Lexer for Power BI DAX
+    Referenced from: https://github.com/sql-bi/SyntaxHighlighterBrushDax
+    """
+    name = 'Dax'
+    aliases = ['dax']
+    filenames = ['*.dax']
+    url = 'https://learn.microsoft.com/en-us/dax/dax-function-reference'
+    mimetypes = []
+    version_added = '2.15'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r"--.*\n?", Comment.Single),      # Comment: Double dash comment
+            (r"//.*\n?", Comment.Single),      # Comment: Double backslash comment
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (words(('abs', 'accrint', 'accrintm', 'acos', 'acosh', 'acot', 'acoth',
+                    'addcolumns', 'addmissingitems', 'all', 'allcrossfiltered',
+                    'allexcept', 'allnoblankrow', 'allselected', 'amordegrc', 'amorlinc',
+                    'and','approximatedistinctcount', 'asin', 'asinh', 'atan', 'atanh',
+                    'average', 'averagea', 'averagex', 'beta.dist', 'beta.inv',
+                    'bitand', 'bitlshift', 'bitor', 'bitrshift', 'bitxor', 'blank',
+                    'calculate', 'calculatetable', 'calendar', 'calendarauto', 'ceiling',
+                    'chisq.dist', 'chisq.dist.rt', 'chisq.inv', 'chisq.inv.rt',
+                    'closingbalancemonth', 'closingbalancequarter', 'closingbalanceyear',
+                    'coalesce', 'columnstatistics', 'combin', 'combina', 'combinevalues',
+                    'concatenate', 'concatenatex', 'confidence.norm', 'confidence.t',
+                    'contains', 'containsrow', 'containsstring', 'containsstringexact',
+                    'convert', 'cos', 'cosh', 'cot', 'coth', 'count', 'counta', 'countax',
+                    'countblank', 'countrows', 'countx', 'coupdaybs', 'coupdays',
+                    'coupdaysnc', 'coupncd', 'coupnum', 'couppcd', 'crossfilter',
+                    'crossjoin', 'cumipmt', 'cumprinc', 'currency', 'currentgroup',
+                    'customdata', 'datatable', 'date', 'dateadd', 'datediff',
+                    'datesbetween', 'datesinperiod', 'datesmtd', 'datesqtd',
+                    'datesytd', 'datevalue', 'day', 'db', 'ddb', 'degrees', 'detailrows',
+                    'disc', 'distinct', 'distinctcount', 'distinctcountnoblank',
+                    'divide', 'dollarde', 'dollarfr', 'duration', 'earlier', 'earliest',
+                    'edate', 'effect', 'endofmonth', 'endofquarter', 'endofyear',
+                    'eomonth', 'error', 'evaluateandlog', 'even', 'exact', 'except',
+                    'exp', 'expon.dist', 'fact', 'false', 'filter', 'filters', 'find',
+                    'firstdate', 'firstnonblank', 'firstnonblankvalue', 'fixed', 'floor',
+                    'format', 'fv', 'gcd', 'generate', 'generateall', 'generateseries',
+                    'geomean', 'geomeanx', 'groupby', 'hash', 'hasonefilter',
+                    'hasonevalue', 'hour', 'if', 'if.eager', 'iferror', 'ignore', 'index',
+                    'int', 'intersect', 'intrate', 'ipmt', 'isafter', 'isblank',
+                    'iscrossfiltered', 'isempty', 'iserror', 'iseven', 'isfiltered',
+                    'isinscope', 'islogical', 'isnontext', 'isnumber', 'iso.ceiling',
+                    'isodd', 'isonorafter', 'ispmt', 'isselectedmeasure', 'issubtotal',
+                    'istext', 'keepfilters', 'keywordmatch', 'lastdate', 'lastnonblank',
+                    'lastnonblankvalue', 'lcm', 'left', 'len', 'linest', 'linestx', 'ln',
+                    'log', 'log10', 'lookupvalue', 'lower', 'max', 'maxa', 'maxx',
+                    'mduration', 'median', 'medianx', 'mid', 'min', 'mina', 'minute',
+                    'minx', 'mod', 'month', 'mround', 'nameof', 'naturalinnerjoin',
+                    'naturalleftouterjoin', 'networkdays', 'nextday', 'nextmonth',
+                    'nextquarter', 'nextyear', 'nominal', 'nonvisual', 'norm.dist',
+                    'norm.inv', 'norm.s.dist', 'norm.s.inv', 'not', 'now', 'nper', 'odd',
+                    'oddfprice', 'oddfyield', 'oddlprice', 'oddlyield', 'offset',
+                    'openingbalancemonth', 'openingbalancequarter', 'openingbalanceyear',
+                    'or', 'orderby', 'parallelperiod', 'partitionby', 'path',
+                    'pathcontains', 'pathitem', 'pathitemreverse', 'pathlength',
+                    'pduration', 'percentile.exc', 'percentile.inc', 'percentilex.exc',
+                    'percentilex.inc', 'permut', 'pi', 'pmt', 'poisson.dist', 'power',
+                    'ppmt', 'previousday', 'previousmonth', 'previousquarter',
+                    'previousyear', 'price', 'pricedisc', 'pricemat', 'product',
+                    'productx', 'pv', 'quarter', 'quotient', 'radians', 'rand',
+                    'randbetween', 'rank.eq', 'rankx', 'rate', 'received', 'related',
+                    'relatedtable', 'removefilters', 'replace', 'rept', 'right',
+                    'rollup', 'rollupaddissubtotal', 'rollupgroup', 'rollupissubtotal',
+                    'round', 'rounddown', 'roundup', 'row', 'rri', 'sameperiodlastyear',
+                    'sample', 'sampleaxiswithlocalminmax', 'search', 'second',
+                    'selectcolumns', 'selectedmeasure', 'selectedmeasureformatstring',
+                    'selectedmeasurename', 'selectedvalue', 'sign', 'sin', 'sinh', 'sln',
+                    'sqrt', 'sqrtpi', 'startofmonth', 'startofquarter', 'startofyear',
+                    'stdev.p', 'stdev.s', 'stdevx.p', 'stdevx.s', 'substitute',
+                    'substitutewithindex', 'sum', 'summarize', 'summarizecolumns', 'sumx',
+                    'switch', 'syd', 't.dist', 't.dist.2t', 't.dist.rt', 't.inv',
+                    't.inv.2t', 'tan', 'tanh', 'tbilleq', 'tbillprice', 'tbillyield',
+                    'time', 'timevalue', 'tocsv', 'today', 'tojson', 'topn',
+                    'topnperlevel', 'topnskip', 'totalmtd', 'totalqtd', 'totalytd',
+                    'treatas', 'trim', 'true', 'trunc', 'unichar', 'unicode', 'union',
+                    'upper', 'userculture', 'userelationship', 'username', 'userobjectid',
+                    'userprincipalname', 'utcnow', 'utctoday', 'value', 'values', 'var.p',
+                    'var.s', 'varx.p', 'varx.s', 'vdb', 'weekday', 'weeknum', 'window',
+                    'xirr', 'xnpv', 'year', 'yearfrac', 'yield', 'yielddisc', 'yieldmat'),
+                 prefix=r'(?i)', suffix=r'\b'), Name.Function), #Functions
+
+            (words(('at','asc','boolean','both','by','create','currency',
+                'datetime','day','define','desc','double',
+                'evaluate','false','integer','measure',
+                'month','none','order','return','single','start','string',
+                'table','true','var','year'),
+                prefix=r'(?i)', suffix=r'\b'), Name.Builtin), # Keyword
+
+            (r':=|[-+*\/=^]', Operator),
+            (r'\b(IN|NOT)\b', Operator.Word),
+            (r'"', String, 'string'), #StringLiteral
+            (r"'(?:[^']|'')*'(?!')(?:\[[ \w]+\])?|\w+\[[ \w]+\]",
+                Name.Attribute),       # Column reference
+            (r"\[[ \w]+\]", Name.Attribute), #Measure reference
+            (r'(?<!\w)(\d+\.?\d*|\.\d+\b)', Number),# Number
+            (r'[\[\](){}`,.]', Punctuation), #Parenthesis
+            (r'.*\n', Text),
+
+        ],
+        'multiline-comments': [
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[^/*]+', Comment.Multiline),
+            (r'[/*]', Comment.Multiline)
+        ],
+        'string': [
+            (r'""', String.Escape),
+            (r'"', String, '#pop'),
+            (r'[^"]+', String),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/devicetree.py b/.venv/Lib/site-packages/pygments/lexers/devicetree.py
new file mode 100644 (file)
index 0000000..a9b0b7a
--- /dev/null
@@ -0,0 +1,108 @@
+"""
+    pygments.lexers.devicetree
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Devicetree language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include, default, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text, Whitespace
+
+__all__ = ['DevicetreeLexer']
+
+
+class DevicetreeLexer(RegexLexer):
+    """
+    Lexer for Devicetree files.
+    """
+
+    name = 'Devicetree'
+    url = 'https://www.devicetree.org/'
+    aliases = ['devicetree', 'dts']
+    filenames = ['*.dts', '*.dtsi']
+    mimetypes = ['text/x-c']
+    version_added = '2.7'
+
+    #: optional Whitespace or /*...*/ style comment
+    _ws = r'\s*(?:/[*][^*/]*?[*]/\s*)*'
+
+    tokens = {
+        'macro': [
+            # Include preprocessor directives (C style):
+            (r'(#include)(' + _ws + r')([^\n]+)',
+             bygroups(Comment.Preproc, Comment.Multiline, Comment.PreprocFile)),
+            # Define preprocessor directives (C style):
+            (r'(#define)(' + _ws + r')([^\n]+)',
+             bygroups(Comment.Preproc, Comment.Multiline, Comment.Preproc)),
+            # devicetree style with file:
+            (r'(/[^*/{]+/)(' + _ws + r')("[^\n{]+")',
+             bygroups(Comment.Preproc, Comment.Multiline, Comment.PreprocFile)),
+            # devicetree style with property:
+            (r'(/[^*/{]+/)(' + _ws + r')([^\n;{]*)([;]?)',
+             bygroups(Comment.Preproc, Comment.Multiline, Comment.Preproc, Punctuation)),
+        ],
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'\\\n', Text),  # line continuation
+            (r'//(\n|[\w\W]*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*][\w\W]*?[*](\\\n)?/', Comment.Multiline),
+            # Open until EOF, so no ending delimiter
+            (r'/(\\\n)?[*][\w\W]*', Comment.Multiline),
+        ],
+        'statements': [
+            (r'(L?)(")', bygroups(String.Affix, String), 'string'),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'([^\s{}/*]*)(\s*)(:)', bygroups(Name.Label, Text, Punctuation), '#pop'),
+            (words(('compatible', 'model', 'phandle', 'status', '#address-cells',
+                    '#size-cells', 'reg', 'virtual-reg', 'ranges', 'dma-ranges',
+                    'device_type', 'name'), suffix=r'\b'), Keyword.Reserved),
+            (r'([~!%^&*+=|?:<>/#-])', Operator),
+            (r'[()\[\]{},.]', Punctuation),
+            (r'[a-zA-Z_][\w-]*(?=(?:\s*,\s*[a-zA-Z_][\w-]*|(?:' + _ws + r'))*\s*[=;])',
+             Name),
+            (r'[a-zA-Z_]\w*', Name.Attribute),
+        ],
+        'root': [
+            include('whitespace'),
+            include('macro'),
+
+            # Nodes
+            (r'([^/*@\s&]+|/)(@?)((?:0x)?[0-9a-fA-F,]*)(' + _ws + r')(\{)',
+             bygroups(Name.Function, Operator, Number.Integer,
+                      Comment.Multiline, Punctuation), 'node'),
+
+            default('statement'),
+        ],
+        'statement': [
+            include('whitespace'),
+            include('statements'),
+            (';', Punctuation, '#pop'),
+        ],
+        'node': [
+            include('whitespace'),
+            include('macro'),
+
+            (r'([^/*@\s&]+|/)(@?)((?:0x)?[0-9a-fA-F,]*)(' + _ws + r')(\{)',
+             bygroups(Name.Function, Operator, Number.Integer,
+                      Comment.Multiline, Punctuation), '#push'),
+
+            include('statements'),
+
+            (r'\};', Punctuation, '#pop'),
+            (';', Punctuation),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|'
+             r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/diff.py b/.venv/Lib/site-packages/pygments/lexers/diff.py
new file mode 100644 (file)
index 0000000..ed7007f
--- /dev/null
@@ -0,0 +1,169 @@
+"""
+    pygments.lexers.diff
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for diff/patch formats.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, Generic, \
+    Literal, Whitespace
+
+__all__ = ['DiffLexer', 'DarcsPatchLexer', 'WDiffLexer']
+
+
+class DiffLexer(RegexLexer):
+    """
+    Lexer for unified or context-style diffs or patches.
+    """
+
+    name = 'Diff'
+    aliases = ['diff', 'udiff']
+    filenames = ['*.diff', '*.patch']
+    mimetypes = ['text/x-diff', 'text/x-patch']
+    url = 'https://en.wikipedia.org/wiki/Diff'
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'( )(.*)(\n)', bygroups(Whitespace, Text, Whitespace)),
+            (r'(!.*|---)(\n)', bygroups(Generic.Strong, Whitespace)),
+            (r'((?:< |-).*)(\n)', bygroups(Generic.Deleted, Whitespace)),
+            (r'((?:> |\+).*)(\n)', bygroups(Generic.Inserted, Whitespace)),
+            (
+                r'(@.*|\d(?:,\d+)?(?:a|c|d)\d+(?:,\d+)?)(\n)',
+                bygroups(Generic.Subheading, Whitespace),
+            ),
+            (r'((?:[Ii]ndex|diff).*)(\n)', bygroups(Generic.Heading, Whitespace)),
+            (r'(=.*)(\n)', bygroups(Generic.Heading, Whitespace)),
+            (r'(.*)(\n)', bygroups(Text, Whitespace)),
+        ]
+    }
+
+    def analyse_text(text):
+        if text[:7] == 'Index: ':
+            return True
+        if text[:5] == 'diff ':
+            return True
+        if text[:4] == '--- ':
+            return 0.9
+
+
+class DarcsPatchLexer(RegexLexer):
+    """
+    DarcsPatchLexer is a lexer for the various versions of the darcs patch
+    format.  Examples of this format are derived by commands such as
+    ``darcs annotate --patch`` and ``darcs send``.
+    """
+
+    name = 'Darcs Patch'
+    aliases = ['dpatch']
+    filenames = ['*.dpatch', '*.darcspatch']
+    url = 'https://darcs.net'
+    version_added = '0.10'
+
+    DPATCH_KEYWORDS = ('hunk', 'addfile', 'adddir', 'rmfile', 'rmdir', 'move',
+                       'replace')
+
+    tokens = {
+        'root': [
+            (r'<', Operator),
+            (r'>', Operator),
+            (r'\{', Operator),
+            (r'\}', Operator),
+            (r'(\[)((?:TAG )?)(.*)(\n)(.*)(\*\*)(\d+)(\s?)(\])',
+             bygroups(Operator, Keyword, Name, Whitespace, Name, Operator,
+                      Literal.Date, Whitespace, Operator)),
+            (r'(\[)((?:TAG )?)(.*)(\n)(.*)(\*\*)(\d+)(\s?)',
+             bygroups(Operator, Keyword, Name, Whitespace, Name, Operator,
+                      Literal.Date, Whitespace), 'comment'),
+            (r'New patches:', Generic.Heading),
+            (r'Context:', Generic.Heading),
+            (r'Patch bundle hash:', Generic.Heading),
+            (r'(\s*)({})(.*)(\n)'.format('|'.join(DPATCH_KEYWORDS)),
+                bygroups(Whitespace, Keyword, Text, Whitespace)),
+            (r'\+', Generic.Inserted, "insert"),
+            (r'-', Generic.Deleted, "delete"),
+            (r'(.*)(\n)', bygroups(Text, Whitespace)),
+        ],
+        'comment': [
+            (r'[^\]].*\n', Comment),
+            (r'\]', Operator, "#pop"),
+        ],
+        'specialText': [            # darcs add [_CODE_] special operators for clarity
+            (r'\n', Whitespace, "#pop"),  # line-based
+            (r'\[_[^_]*_]', Operator),
+        ],
+        'insert': [
+            include('specialText'),
+            (r'\[', Generic.Inserted),
+            (r'[^\n\[]+', Generic.Inserted),
+        ],
+        'delete': [
+            include('specialText'),
+            (r'\[', Generic.Deleted),
+            (r'[^\n\[]+', Generic.Deleted),
+        ],
+    }
+
+
+class WDiffLexer(RegexLexer):
+    """
+    A wdiff lexer.
+
+    Note that:
+
+    * It only works with normal output (without options like ``-l``).
+    * If the target files contain "[-", "-]", "{+", or "+}",
+      especially they are unbalanced, the lexer will get confused.
+    """
+
+    name = 'WDiff'
+    url = 'https://www.gnu.org/software/wdiff/'
+    aliases = ['wdiff']
+    filenames = ['*.wdiff']
+    mimetypes = []
+    version_added = '2.2'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    # We can only assume "[-" after "[-" before "-]" is `nested`,
+    # for instance wdiff to wdiff outputs. We have no way to
+    # distinct these marker is of wdiff output from original text.
+
+    ins_op = r"\{\+"
+    ins_cl = r"\+\}"
+    del_op = r"\[\-"
+    del_cl = r"\-\]"
+    normal = r'[^{}[\]+-]+'  # for performance
+    tokens = {
+        'root': [
+            (ins_op, Generic.Inserted, 'inserted'),
+            (del_op, Generic.Deleted, 'deleted'),
+            (normal, Text),
+            (r'.', Text),
+        ],
+        'inserted': [
+            (ins_op, Generic.Inserted, '#push'),
+            (del_op, Generic.Inserted, '#push'),
+            (del_cl, Generic.Inserted, '#pop'),
+
+            (ins_cl, Generic.Inserted, '#pop'),
+            (normal, Generic.Inserted),
+            (r'.', Generic.Inserted),
+        ],
+        'deleted': [
+            (del_op, Generic.Deleted, '#push'),
+            (ins_op, Generic.Deleted, '#push'),
+            (ins_cl, Generic.Deleted, '#pop'),
+
+            (del_cl, Generic.Deleted, '#pop'),
+            (normal, Generic.Deleted),
+            (r'.', Generic.Deleted),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/dns.py b/.venv/Lib/site-packages/pygments/lexers/dns.py
new file mode 100644 (file)
index 0000000..3fb91f5
--- /dev/null
@@ -0,0 +1,109 @@
+"""
+    pygments.lexers.dns
+    ~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexers for DNS
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace, Literal
+from pygments.lexer import RegexLexer, bygroups, include
+
+__all__ = ['DnsZoneLexer']
+
+
+CLASSES = [
+    "IN",
+    "CS",
+    "CH",
+    "HS",
+]
+
+CLASSES_RE = "(" + "|".join(CLASSES) + ')'
+
+
+class DnsZoneLexer(RegexLexer):
+
+    """
+    Lexer for DNS zone file
+    """
+
+    flags = re.MULTILINE
+
+    name = 'Zone'
+    aliases = ['zone']
+    filenames = [ "*.zone" ]
+    url = "https://datatracker.ietf.org/doc/html/rfc1035"
+    mimetypes = ['text/dns']
+    version_added = '2.16'
+
+    tokens = {
+       'root': [
+            # Empty/comment line:
+            (r'([ \t]*)(;.*)(\n)', bygroups(Whitespace, Comment.Single, Whitespace)),
+            # Special directives:
+            (r'^\$ORIGIN\b', Keyword, 'values'),
+            (r'^\$TTL\b', Keyword, 'values'),
+            (r'^\$INCLUDE\b', Comment.Preproc, 'include'),
+            # TODO, $GENERATE https://bind9.readthedocs.io/en/v9.18.14/chapter3.html#soa-rr
+            (r'^\$[A-Z]+\b', Keyword, 'values'),
+            # Records:
+            # <domain-name> [<TTL>] [<class>] <type> <RDATA> [<comment>]
+            (r'^(@)([ \t]+)(?:([0-9]+[smhdw]?)([ \t]+))?(?:' + CLASSES_RE + "([ \t]+))?([A-Z]+)([ \t]+)", 
+                bygroups(Operator, Whitespace, Number.Integer, Whitespace, Name.Class, Whitespace, Keyword.Type, Whitespace),
+                "values"),
+            (r'^([^ \t\n]*)([ \t]+)(?:([0-9]+[smhdw]?)([ \t]+))?(?:' + CLASSES_RE + "([ \t]+))?([A-Z]+)([ \t]+)", 
+                bygroups(Name, Whitespace, Number.Integer, Whitespace, Name.Class, Whitespace, Keyword.Type, Whitespace),
+                "values"),
+            # <domain-name> [<class>] [<TTL>] <type> <RDATA> [<comment>]
+            (r'^(Operator)([ \t]+)(?:' + CLASSES_RE + "([ \t]+))?(?:([0-9]+[smhdw]?)([ \t]+))?([A-Z]+)([ \t]+)", 
+                bygroups(Name, Whitespace, Number.Integer, Whitespace, Name.Class, Whitespace, Keyword.Type, Whitespace),
+                "values"),
+            (r'^([^ \t\n]*)([ \t]+)(?:' + CLASSES_RE + "([ \t]+))?(?:([0-9]+[smhdw]?)([ \t]+))?([A-Z]+)([ \t]+)", 
+                bygroups(Name, Whitespace, Number.Integer, Whitespace, Name.Class, Whitespace, Keyword.Type, Whitespace),
+                "values"),
+        ],
+        # Parsing values:
+        'values': [
+            (r'\n', Whitespace, "#pop"),
+            (r'\(', Punctuation, 'nested'),
+            include('simple-value'),
+        ],
+        # Parsing nested values (...):
+        'nested': [
+            (r'\)', Punctuation, "#pop"),
+            include('multiple-simple-values'),
+        ],
+        # Parsing values:
+        'simple-value': [
+            (r'(;.*)', bygroups(Comment.Single)),
+            (r'[ \t]+', Whitespace),
+            (r"@\b", Operator),
+            ('"', String, 'string'),
+            (r'[0-9]+[smhdw]?$', Number.Integer),
+            (r'([0-9]+[smhdw]?)([ \t]+)', bygroups(Number.Integer, Whitespace)),
+            (r'\S+', Literal),
+        ],
+        'multiple-simple-values': [
+            include('simple-value'),
+            (r'[\n]+', Whitespace),
+        ],
+        'include': [
+            (r'([ \t]+)([^ \t\n]+)([ \t]+)([-\._a-zA-Z]+)([ \t]+)(;.*)?$',
+             bygroups(Whitespace, Comment.PreprocFile, Whitespace, Name, Whitespace, Comment.Single), '#pop'),
+            (r'([ \t]+)([^ \t\n]+)([ \t\n]+)$', bygroups(Whitespace, Comment.PreprocFile, Whitespace), '#pop'),
+        ],
+        "string": [
+            (r'\\"', String),
+            (r'"', String, "#pop"),
+            (r'[^"]+', String),
+        ]
+    }
+
+    def analyse_text(text):
+        return text.startswith("$ORIGIN")
diff --git a/.venv/Lib/site-packages/pygments/lexers/dotnet.py b/.venv/Lib/site-packages/pygments/lexers/dotnet.py
new file mode 100644 (file)
index 0000000..2254a8b
--- /dev/null
@@ -0,0 +1,873 @@
+"""
+    pygments.lexers.dotnet
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for .net languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+import re
+
+from pygments.lexer import RegexLexer, DelegatingLexer, bygroups, include, \
+    using, this, default, words
+from pygments.token import Punctuation, Text, Comment, Operator, Keyword, \
+    Name, String, Number, Literal, Other, Whitespace
+from pygments.util import get_choice_opt
+from pygments import unistring as uni
+
+from pygments.lexers.html import XmlLexer
+
+__all__ = ['CSharpLexer', 'NemerleLexer', 'BooLexer', 'VbNetLexer',
+           'CSharpAspxLexer', 'VbNetAspxLexer', 'FSharpLexer', 'XppLexer']
+
+
+class CSharpLexer(RegexLexer):
+    """
+    For C# source code.
+
+    Additional options accepted:
+
+    `unicodelevel`
+      Determines which Unicode characters this lexer allows for identifiers.
+      The possible values are:
+
+      * ``none`` -- only the ASCII letters and numbers are allowed. This
+        is the fastest selection.
+      * ``basic`` -- all Unicode characters from the specification except
+        category ``Lo`` are allowed.
+      * ``full`` -- all Unicode characters as specified in the C# specs
+        are allowed.  Note that this means a considerable slowdown since the
+        ``Lo`` category has more than 40,000 characters in it!
+
+      The default value is ``basic``.
+
+      .. versionadded:: 0.8
+    """
+
+    name = 'C#'
+    url = 'https://docs.microsoft.com/en-us/dotnet/csharp/'
+    aliases = ['csharp', 'c#', 'cs']
+    filenames = ['*.cs']
+    mimetypes = ['text/x-csharp']  # inferred
+    version_added = ''
+
+    flags = re.MULTILINE | re.DOTALL
+
+    # for the range of allowed unicode characters in identifiers, see
+    # http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf
+
+    levels = {
+        'none': r'@?[_a-zA-Z]\w*',
+        'basic': ('@?[_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl') + ']' +
+                  '[' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc',
+                                    'Cf', 'Mn', 'Mc') + ']*'),
+        'full': ('@?(?:_|[^' +
+                 uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + '])' +
+                 '[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',
+                                      'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*'),
+    }
+
+    tokens = {}
+    token_variants = True
+
+    for levelname, cs_ident in levels.items():
+        tokens[levelname] = {
+            'root': [
+                include('numbers'),
+                # method names
+                (r'^([ \t]*)((?:' + cs_ident + r'(?:\[\])?\s+)+?)'  # return type
+                 r'(' + cs_ident + ')'                            # method name
+                 r'(\s*)(\()',                               # signature start
+                 bygroups(Whitespace, using(this), Name.Function, Whitespace,
+                          Punctuation)),
+                (r'^(\s*)(\[.*?\])', bygroups(Whitespace, Name.Attribute)),
+                (r'[^\S\n]+', Whitespace),
+                (r'(\\)(\n)', bygroups(Text, Whitespace)),  # line continuation
+                (r'//.*?\n', Comment.Single),
+                (r'/[*].*?[*]/', Comment.Multiline),
+                (r'\n', Whitespace),
+                (words((
+                    '>>>=', '>>=', '<<=', '<=', '>=', '+=', '-=', '*=', '/=',
+                    '%=', '&=', '|=', '^=', '??=', '=>', '??', '?.', '!=', '==',
+                    '&&', '||', '>>>', '>>', '<<', '++', '--', '+', '-', '*',
+                    '/', '%', '&', '|', '^', '<', '>', '?', '!', '~', '=',
+                )), Operator),
+                (r'=~|!=|==|<<|>>|[-+/*%=<>&^|]', Operator),
+                (r'[()\[\];:,.]', Punctuation),
+                (r'[{}]', Punctuation),
+                (r'@"(""|[^"])*"', String),
+                (r'\$?"(\\\\|\\[^\\]|[^"\\\n])*["\n]', String),
+                (r"'\\.'|'[^\\]'", String.Char),
+                (r"[0-9]+(\.[0-9]*)?([eE][+-][0-9]+)?"
+                 r"[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?", Number),
+                (r'(#)([ \t]*)(if|endif|else|elif|define|undef|'
+                 r'line|error|warning|region|endregion|pragma)\b(.*?)(\n)',
+                 bygroups(Comment.Preproc, Whitespace, Comment.Preproc,
+                          Comment.Preproc, Whitespace)),
+                (r'\b(extern)(\s+)(alias)\b', bygroups(Keyword, Whitespace,
+                 Keyword)),
+                (words((
+                    'abstract', 'as', 'async', 'await', 'base', 'break', 'by',
+                    'case', 'catch', 'checked', 'const', 'continue', 'default',
+                    'delegate', 'do', 'else', 'enum', 'event', 'explicit',
+                    'extern', 'false', 'finally', 'fixed', 'for', 'foreach',
+                    'goto', 'if', 'implicit', 'in', 'interface', 'internal',
+                    'is', 'let', 'lock', 'new', 'null', 'on', 'operator',
+                    'out', 'override', 'params', 'private', 'protected',
+                    'public', 'readonly', 'ref', 'return', 'sealed', 'sizeof',
+                    'stackalloc', 'static', 'switch', 'this', 'throw', 'true',
+                    'try', 'typeof', 'unchecked', 'unsafe', 'virtual', 'void',
+                    'while', 'get', 'set', 'new', 'partial', 'yield', 'add',
+                    'remove', 'value', 'alias', 'ascending', 'descending',
+                    'from', 'group', 'into', 'orderby', 'select', 'thenby',
+                    'where', 'join', 'equals', 'record', 'allows',
+                    'and', 'init', 'managed', 'nameof', 'nint', 'not',
+                    'notnull', 'nuint', 'or', 'scoped', 'unmanaged', 'when',
+                    'with'
+                ), suffix=r'\b'), Keyword),
+                # version 1: assumes that 'file' is the only contextual keyword
+                # that is a class modifier
+                (r'(file)(\s+)(record|class|abstract|enum|new|sealed|static)\b',
+                   bygroups(Keyword, Whitespace, Keyword)),
+                (r'(global)(::)', bygroups(Keyword, Punctuation)),
+                (r'(bool|byte|char|decimal|double|dynamic|float|int|long|object|'
+                 r'sbyte|short|string|uint|ulong|ushort|var)\b\??', Keyword.Type),
+                (r'(class|struct)(\s+)', bygroups(Keyword, Whitespace), 'class'),
+                (r'(namespace|using)(\s+)', bygroups(Keyword, Whitespace), 'namespace'),
+                (cs_ident, Name),
+            ],
+            'numbers_int': [
+                (r"0[xX][0-9a-fA-F]+(([uU][lL]?)|[lL][uU]?)?", Number.Hex),
+                (r"0[bB][01]+(([uU][lL]?)|[lL][uU]?)?", Number.Bin),
+                (r"[0-9]+(([uU][lL]?)|[lL][uU]?)?", Number.Integer),
+            ],
+            'numbers_float': [
+                (r"([0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fFdDmM]?)|"
+                 r"(\.[0-9]+([eE][+-]?[0-9]+)?[fFdDmM]?)|"
+                 r"([0-9]+([eE][+-]?[0-9]+)[fFdDmM]?)|"
+                 r"([0-9]+[fFdDmM])", Number.Float),
+            ],
+            'numbers': [
+                include('numbers_float'),
+                include('numbers_int'),
+            ],
+            'class': [
+                (cs_ident, Name.Class, '#pop'),
+                default('#pop'),
+            ],
+            'namespace': [
+                (r'(?=\()', Text, '#pop'),  # using (resource)
+                ('(' + cs_ident + r'|\.)+', Name.Namespace, '#pop'),
+            ]
+        }
+
+    def __init__(self, **options):
+        level = get_choice_opt(options, 'unicodelevel', list(self.tokens), 'basic')
+        if level not in self._all_tokens:
+            # compile the regexes now
+            self._tokens = self.__class__.process_tokendef(level)
+        else:
+            self._tokens = self._all_tokens[level]
+
+        RegexLexer.__init__(self, **options)
+
+
+class NemerleLexer(RegexLexer):
+    """
+    For Nemerle source code.
+
+    Additional options accepted:
+
+    `unicodelevel`
+      Determines which Unicode characters this lexer allows for identifiers.
+      The possible values are:
+
+      * ``none`` -- only the ASCII letters and numbers are allowed. This
+        is the fastest selection.
+      * ``basic`` -- all Unicode characters from the specification except
+        category ``Lo`` are allowed.
+      * ``full`` -- all Unicode characters as specified in the C# specs
+        are allowed.  Note that this means a considerable slowdown since the
+        ``Lo`` category has more than 40,000 characters in it!
+
+      The default value is ``basic``.
+    """
+
+    name = 'Nemerle'
+    url = 'http://nemerle.org'
+    aliases = ['nemerle']
+    filenames = ['*.n']
+    mimetypes = ['text/x-nemerle']  # inferred
+    version_added = '1.5'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    # for the range of allowed unicode characters in identifiers, see
+    # http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf
+
+    levels = {
+        'none': r'@?[_a-zA-Z]\w*',
+        'basic': ('@?[_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl') + ']' +
+                  '[' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc',
+                                    'Cf', 'Mn', 'Mc') + ']*'),
+        'full': ('@?(?:_|[^' +
+                 uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + '])' +
+                 '[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',
+                                      'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*'),
+    }
+
+    tokens = {}
+    token_variants = True
+
+    for levelname, cs_ident in levels.items():
+        tokens[levelname] = {
+            'root': [
+                # method names
+                (r'^([ \t]*)((?:' + cs_ident + r'(?:\[\])?\s+)+?)'  # return type
+                 r'(' + cs_ident + ')'                            # method name
+                 r'(\s*)(\()',                               # signature start
+                 bygroups(Whitespace, using(this), Name.Function, Whitespace, \
+                          Punctuation)),
+                (r'^(\s*)(\[.*?\])', bygroups(Whitespace, Name.Attribute)),
+                (r'[^\S\n]+', Whitespace),
+                (r'(\\)(\n)', bygroups(Text, Whitespace)),  # line continuation
+                (r'//.*?\n', Comment.Single),
+                (r'/[*].*?[*]/', Comment.Multiline),
+                (r'\n', Whitespace),
+                (r'(\$)(\s*)(")', bygroups(String, Whitespace, String),
+                    'splice-string'),
+                (r'(\$)(\s*)(<#)', bygroups(String, Whitespace, String),
+                    'splice-string2'),
+                (r'<#', String, 'recursive-string'),
+
+                (r'(<\[)(\s*)(' + cs_ident + ':)?',
+                 bygroups(Keyword, Whitespace, Keyword)),
+                (r'\]\>', Keyword),
+
+                # quasiquotation only
+                (r'\$' + cs_ident, Name),
+                (r'(\$)(\()', bygroups(Name, Punctuation),
+                 'splice-string-content'),
+
+                (r'[~!%^&*()+=|\[\]:;,.<>/?-]', Punctuation),
+                (r'[{}]', Punctuation),
+                (r'@"(""|[^"])*"', String),
+                (r'"(\\\\|\\[^\\]|[^"\\\n])*["\n]', String),
+                (r"'\\.'|'[^\\]'", String.Char),
+                (r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+                (r"[0-9](\.[0-9]*)?([eE][+-][0-9]+)?[flFLdD]?", Number),
+                (r'(#)([ \t]*)(if|endif|else|elif|define|undef|'
+                 r'line|error|warning|region|endregion|pragma)\b',
+                 bygroups(Comment.Preproc, Whitespace, Comment.Preproc), 'preproc'),
+                (r'\b(extern)(\s+)(alias)\b', bygroups(Keyword, Whitespace, Keyword)),
+                (r'(abstract|and|as|base|catch|def|delegate|'
+                 r'enum|event|extern|false|finally|'
+                 r'fun|implements|interface|internal|'
+                 r'is|macro|match|matches|module|mutable|new|'
+                 r'null|out|override|params|partial|private|'
+                 r'protected|public|ref|sealed|static|'
+                 r'syntax|this|throw|true|try|type|typeof|'
+                 r'virtual|volatile|when|where|with|'
+                 r'assert|assert2|async|break|checked|continue|do|else|'
+                 r'ensures|for|foreach|if|late|lock|new|nolate|'
+                 r'otherwise|regexp|repeat|requires|return|surroundwith|'
+                 r'unchecked|unless|using|while|yield)\b', Keyword),
+                (r'(global)(::)', bygroups(Keyword, Punctuation)),
+                (r'(bool|byte|char|decimal|double|float|int|long|object|sbyte|'
+                 r'short|string|uint|ulong|ushort|void|array|list)\b\??',
+                 Keyword.Type),
+                (r'(:>?)(\s*)(' + cs_ident + r'\??)',
+                 bygroups(Punctuation, Whitespace, Keyword.Type)),
+                (r'(class|struct|variant|module)(\s+)',
+                 bygroups(Keyword, Whitespace), 'class'),
+                (r'(namespace|using)(\s+)', bygroups(Keyword, Whitespace),
+                 'namespace'),
+                (cs_ident, Name),
+            ],
+            'class': [
+                (cs_ident, Name.Class, '#pop')
+            ],
+            'preproc': [
+                (r'\w+', Comment.Preproc),
+                (r'[ \t]+', Whitespace),
+                (r'\n', Whitespace, '#pop')
+            ],
+            'namespace': [
+                (r'(?=\()', Text, '#pop'),  # using (resource)
+                ('(' + cs_ident + r'|\.)+', Name.Namespace, '#pop')
+            ],
+            'splice-string': [
+                (r'[^"$]',  String),
+                (r'\$' + cs_ident, Name),
+                (r'(\$)(\()', bygroups(Name, Punctuation),
+                 'splice-string-content'),
+                (r'\\"',  String),
+                (r'"',  String, '#pop')
+            ],
+            'splice-string2': [
+                (r'[^#<>$]',  String),
+                (r'\$' + cs_ident, Name),
+                (r'(\$)(\()', bygroups(Name, Punctuation),
+                 'splice-string-content'),
+                (r'<#',  String, '#push'),
+                (r'#>',  String, '#pop')
+            ],
+            'recursive-string': [
+                (r'[^#<>]',  String),
+                (r'<#',  String, '#push'),
+                (r'#>',  String, '#pop')
+            ],
+            'splice-string-content': [
+                (r'if|match', Keyword),
+                (r'[~!%^&*+=|\[\]:;,.<>/?-\\"$ ]', Punctuation),
+                (cs_ident, Name),
+                (r'\d+', Number),
+                (r'\(', Punctuation, '#push'),
+                (r'\)', Punctuation, '#pop')
+            ]
+        }
+
+    def __init__(self, **options):
+        level = get_choice_opt(options, 'unicodelevel', list(self.tokens),
+                               'basic')
+        if level not in self._all_tokens:
+            # compile the regexes now
+            self._tokens = self.__class__.process_tokendef(level)
+        else:
+            self._tokens = self._all_tokens[level]
+
+        RegexLexer.__init__(self, **options)
+
+    def analyse_text(text):
+        """Nemerle is quite similar to Python, but @if is relatively uncommon
+        elsewhere."""
+        result = 0
+
+        if '@if' in text:
+            result += 0.1
+
+        return result
+
+
+class BooLexer(RegexLexer):
+    """
+    For Boo source code.
+    """
+
+    name = 'Boo'
+    url = 'https://github.com/boo-lang/boo'
+    aliases = ['boo']
+    filenames = ['*.boo']
+    mimetypes = ['text/x-boo']
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'(#|//).*$', Comment.Single),
+            (r'/[*]', Comment.Multiline, 'comment'),
+            (r'[]{}:(),.;[]', Punctuation),
+            (r'(\\)(\n)', bygroups(Text, Whitespace)),
+            (r'\\', Text),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            (r'/(\\\\|\\[^\\]|[^/\\\s])/', String.Regex),
+            (r'@/(\\\\|\\[^\\]|[^/\\])*/', String.Regex),
+            (r'=~|!=|==|<<|>>|[-+/*%=<>&^|]', Operator),
+            (r'(as|abstract|callable|constructor|destructor|do|import|'
+             r'enum|event|final|get|interface|internal|of|override|'
+             r'partial|private|protected|public|return|set|static|'
+             r'struct|transient|virtual|yield|super|and|break|cast|'
+             r'continue|elif|else|ensure|except|for|given|goto|if|in|'
+             r'is|isa|not|or|otherwise|pass|raise|ref|try|unless|when|'
+             r'while|from|as)\b', Keyword),
+            (r'def(?=\s+\(.*?\))', Keyword),
+            (r'(def)(\s+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (r'(class)(\s+)', bygroups(Keyword, Whitespace), 'classname'),
+            (r'(namespace)(\s+)', bygroups(Keyword, Whitespace), 'namespace'),
+            (r'(?<!\.)(true|false|null|self|__eval__|__switch__|array|'
+             r'assert|checked|enumerate|filter|getter|len|lock|map|'
+             r'matrix|max|min|normalArrayIndexing|print|property|range|'
+             r'rawArrayIndexing|required|typeof|unchecked|using|'
+             r'yieldAll|zip)\b', Name.Builtin),
+            (r'"""(\\\\|\\"|.*?)"""', String.Double),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'(\d+\.\d*|\d*\.\d+)([fF][+-]?[0-9]+)?', Number.Float),
+            (r'[0-9][0-9.]*(ms?|d|h|s)', Number),
+            (r'0\d+', Number.Oct),
+            (r'0x[a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+', Number.Integer),
+        ],
+        'comment': [
+            ('/[*]', Comment.Multiline, '#push'),
+            ('[*]/', Comment.Multiline, '#pop'),
+            ('[^/*]', Comment.Multiline),
+            ('[*/]', Comment.Multiline)
+        ],
+        'funcname': [
+            (r'[a-zA-Z_]\w*', Name.Function, '#pop')
+        ],
+        'classname': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'namespace': [
+            (r'[a-zA-Z_][\w.]*', Name.Namespace, '#pop')
+        ]
+    }
+
+
+class VbNetLexer(RegexLexer):
+    """
+    For Visual Basic.NET source code.
+    Also LibreOffice Basic, OpenOffice Basic, and StarOffice Basic.
+    """
+
+    name = 'VB.net'
+    url = 'https://docs.microsoft.com/en-us/dotnet/visual-basic/'
+    aliases = ['vb.net', 'vbnet', 'lobas', 'oobas', 'sobas', 'visual-basic', 'visualbasic']
+    filenames = ['*.vb', '*.bas']
+    mimetypes = ['text/x-vbnet', 'text/x-vba']  # (?)
+    version_added = ''
+
+    uni_name = '[_' + uni.combine('Ll', 'Lt', 'Lm', 'Nl') + ']' + \
+               '[' + uni.combine('Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc',
+                                 'Cf', 'Mn', 'Mc') + ']*'
+
+    flags = re.MULTILINE | re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'^\s*<.*?>', Name.Attribute),
+            (r'\s+', Whitespace),
+            (r'\n', Whitespace),
+            (r'(rem\b.*?)(\n)', bygroups(Comment, Whitespace)),
+            (r"('.*?)(\n)", bygroups(Comment, Whitespace)),
+            (r'#If\s.*?\sThen|#ElseIf\s.*?\sThen|#Else|#End\s+If|#Const|'
+             r'#ExternalSource.*?\n|#End\s+ExternalSource|'
+             r'#Region.*?\n|#End\s+Region|#ExternalChecksum',
+             Comment.Preproc),
+            (r'[(){}!#,.:]', Punctuation),
+            (r'(Option)(\s+)(Strict|Explicit|Compare)(\s+)'
+             r'(On|Off|Binary|Text)',
+             bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration,
+                      Whitespace, Keyword.Declaration)),
+            (words((
+                'AddHandler', 'Alias', 'ByRef', 'ByVal', 'Call', 'Case',
+                'Catch', 'CBool', 'CByte', 'CChar', 'CDate', 'CDec', 'CDbl',
+                'CInt', 'CLng', 'CObj', 'Continue', 'CSByte', 'CShort', 'CSng',
+                'CStr', 'CType', 'CUInt', 'CULng', 'CUShort', 'Declare',
+                'Default', 'Delegate', 'DirectCast', 'Do', 'Each', 'Else',
+                'ElseIf', 'EndIf', 'Erase', 'Error', 'Event', 'Exit', 'False',
+                'Finally', 'For', 'Friend', 'Get', 'Global', 'GoSub', 'GoTo',
+                'Handles', 'If', 'Implements', 'Inherits', 'Interface', 'Let',
+                'Lib', 'Loop', 'Me', 'MustInherit', 'MustOverride', 'MyBase',
+                'MyClass', 'Narrowing', 'New', 'Next', 'Not', 'Nothing',
+                'NotInheritable', 'NotOverridable', 'Of', 'On', 'Operator',
+                'Option', 'Optional', 'Overloads', 'Overridable', 'Overrides',
+                'ParamArray', 'Partial', 'Private', 'Protected', 'Public',
+                'RaiseEvent', 'ReadOnly', 'ReDim', 'RemoveHandler', 'Resume',
+                'Return', 'Select', 'Set', 'Shadows', 'Shared', 'Single',
+                'Static', 'Step', 'Stop', 'SyncLock', 'Then', 'Throw', 'To',
+                'True', 'Try', 'TryCast', 'Wend', 'Using', 'When', 'While',
+                'Widening', 'With', 'WithEvents', 'WriteOnly'),
+                   prefix=r'(?<!\.)', suffix=r'\b'), Keyword),
+            (r'(?<!\.)End\b', Keyword, 'end'),
+            (r'(?<!\.)(Dim|Const)\b', Keyword, 'dim'),
+            (r'(?<!\.)(Function|Sub|Property)(\s+)',
+             bygroups(Keyword, Whitespace), 'funcname'),
+            (r'(?<!\.)(Class|Structure|Enum)(\s+)',
+             bygroups(Keyword, Whitespace), 'classname'),
+            (r'(?<!\.)(Module|Namespace|Imports)(\s+)',
+             bygroups(Keyword, Whitespace), 'namespace'),
+            (r'(?<!\.)(Boolean|Byte|Char|Date|Decimal|Double|Integer|Long|'
+             r'Object|SByte|Short|Single|String|Variant|UInteger|ULong|'
+             r'UShort)\b', Keyword.Type),
+            (r'(?<!\.)(AddressOf|And|AndAlso|As|GetType|In|Is|IsNot|Like|Mod|'
+             r'Or|OrElse|TypeOf|Xor)\b', Operator.Word),
+            (r'&=|[*]=|/=|\\=|\^=|\+=|-=|<<=|>>=|<<|>>|:=|'
+             r'<=|>=|<>|[-&*/\\^+=<>\[\]]',
+             Operator),
+            ('"', String, 'string'),
+            (r'(_)(\n)', bygroups(Text, Whitespace)),  # Line continuation  (must be before Name)
+            (uni_name + '[%&@!#$]?', Name),
+            ('#.*?#', Literal.Date),
+            (r'(\d+\.\d*|\d*\.\d+)(F[+-]?[0-9]+)?', Number.Float),
+            (r'\d+([SILDFR]|US|UI|UL)?', Number.Integer),
+            (r'&H[0-9a-f]+([SILDFR]|US|UI|UL)?', Number.Integer),
+            (r'&O[0-7]+([SILDFR]|US|UI|UL)?', Number.Integer),
+        ],
+        'string': [
+            (r'""', String),
+            (r'"C?', String, '#pop'),
+            (r'[^"]+', String),
+        ],
+        'dim': [
+            (uni_name, Name.Variable, '#pop'),
+            default('#pop'),  # any other syntax
+        ],
+        'funcname': [
+            (uni_name, Name.Function, '#pop'),
+        ],
+        'classname': [
+            (uni_name, Name.Class, '#pop'),
+        ],
+        'namespace': [
+            (uni_name, Name.Namespace),
+            (r'\.', Name.Namespace),
+            default('#pop'),
+        ],
+        'end': [
+            (r'\s+', Whitespace),
+            (r'(Function|Sub|Property|Class|Structure|Enum|Module|Namespace)\b',
+             Keyword, '#pop'),
+            default('#pop'),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\s*(#If|Module|Namespace)', text, re.MULTILINE):
+            return 0.5
+
+
+class GenericAspxLexer(RegexLexer):
+    """
+    Lexer for ASP.NET pages.
+    """
+
+    name = 'aspx-gen'
+    filenames = []
+    mimetypes = []
+    url = 'https://dotnet.microsoft.com/en-us/apps/aspnet'
+
+    flags = re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'(<%[@=#]?)(.*?)(%>)', bygroups(Name.Tag, Other, Name.Tag)),
+            (r'(<script.*?>)(.*?)(</script>)', bygroups(using(XmlLexer),
+                                                        Other,
+                                                        using(XmlLexer))),
+            (r'(.+?)(?=<)', using(XmlLexer)),
+            (r'.+', using(XmlLexer)),
+        ],
+    }
+
+
+# TODO support multiple languages within the same source file
+class CSharpAspxLexer(DelegatingLexer):
+    """
+    Lexer for highlighting C# within ASP.NET pages.
+    """
+
+    name = 'aspx-cs'
+    aliases = ['aspx-cs']
+    filenames = ['*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd']
+    mimetypes = []
+    url = 'https://dotnet.microsoft.com/en-us/apps/aspnet'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(CSharpLexer, GenericAspxLexer, **options)
+
+    def analyse_text(text):
+        if re.search(r'Page\s*Language="C#"', text, re.I) is not None:
+            return 0.2
+        elif re.search(r'script[^>]+language=["\']C#', text, re.I) is not None:
+            return 0.15
+
+
+class VbNetAspxLexer(DelegatingLexer):
+    """
+    Lexer for highlighting Visual Basic.net within ASP.NET pages.
+    """
+
+    name = 'aspx-vb'
+    aliases = ['aspx-vb']
+    filenames = ['*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd']
+    mimetypes = []
+    url = 'https://dotnet.microsoft.com/en-us/apps/aspnet'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(VbNetLexer, GenericAspxLexer, **options)
+
+    def analyse_text(text):
+        if re.search(r'Page\s*Language="Vb"', text, re.I) is not None:
+            return 0.2
+        elif re.search(r'script[^>]+language=["\']vb', text, re.I) is not None:
+            return 0.15
+
+
+# Very close to functional.OcamlLexer
+class FSharpLexer(RegexLexer):
+    """
+    For the F# language (version 3.0).
+    """
+
+    name = 'F#'
+    url = 'https://fsharp.org/'
+    aliases = ['fsharp', 'f#']
+    filenames = ['*.fs', '*.fsi', '*.fsx']
+    mimetypes = ['text/x-fsharp']
+    version_added = '1.5'
+
+    keywords = [
+        'abstract', 'as', 'assert', 'base', 'begin', 'class', 'default',
+        'delegate', 'do!', 'do', 'done', 'downcast', 'downto', 'elif', 'else',
+        'end', 'exception', 'extern', 'false', 'finally', 'for', 'function',
+        'fun', 'global', 'if', 'inherit', 'inline', 'interface', 'internal',
+        'in', 'lazy', 'let!', 'let', 'match', 'member', 'module', 'mutable',
+        'namespace', 'new', 'null', 'of', 'open', 'override', 'private', 'public',
+        'rec', 'return!', 'return', 'select', 'static', 'struct', 'then', 'to',
+        'true', 'try', 'type', 'upcast', 'use!', 'use', 'val', 'void', 'when',
+        'while', 'with', 'yield!', 'yield',
+    ]
+    # Reserved words; cannot hurt to color them as keywords too.
+    keywords += [
+        'atomic', 'break', 'checked', 'component', 'const', 'constraint',
+        'constructor', 'continue', 'eager', 'event', 'external', 'fixed',
+        'functor', 'include', 'method', 'mixin', 'object', 'parallel',
+        'process', 'protected', 'pure', 'sealed', 'tailcall', 'trait',
+        'virtual', 'volatile',
+    ]
+    keyopts = [
+        '!=', '#', '&&', '&', r'\(', r'\)', r'\*', r'\+', ',', r'-\.',
+        '->', '-', r'\.\.', r'\.', '::', ':=', ':>', ':', ';;', ';', '<-',
+        r'<\]', '<', r'>\]', '>', r'\?\?', r'\?', r'\[<', r'\[\|', r'\[', r'\]',
+        '_', '`', r'\{', r'\|\]', r'\|', r'\}', '~', '<@@', '<@', '=', '@>', '@@>',
+    ]
+
+    operators = r'[!$%&*+\./:<=>?@^|~-]'
+    word_operators = ['and', 'or', 'not']
+    prefix_syms = r'[!?~]'
+    infix_syms = r'[=<>@^|&+\*/$%-]'
+    primitives = [
+        'sbyte', 'byte', 'char', 'nativeint', 'unativeint', 'float32', 'single',
+        'float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32',
+        'uint32', 'int64', 'uint64', 'decimal', 'unit', 'bool', 'string',
+        'list', 'exn', 'obj', 'enum',
+    ]
+
+    # See http://msdn.microsoft.com/en-us/library/dd233181.aspx and/or
+    # http://fsharp.org/about/files/spec.pdf for reference.  Good luck.
+
+    tokens = {
+        'escape-sequence': [
+            (r'\\[\\"\'ntbrafv]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\U[0-9a-fA-F]{8}', String.Escape),
+        ],
+        'root': [
+            (r'\s+', Whitespace),
+            (r'\(\)|\[\]', Name.Builtin.Pseudo),
+            (r'\b(?<!\.)([A-Z][\w\']*)(?=\s*\.)',
+             Name.Namespace, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name),
+            (r'(///.*?)(\n)', bygroups(String.Doc, Whitespace)),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'\(\*(?!\))', Comment, 'comment'),
+
+            (r'@"', String, 'lstring'),
+            (r'"""', String, 'tqs'),
+            (r'"', String, 'string'),
+
+            (r'\b(open|module)(\s+)([\w.]+)',
+             bygroups(Keyword, Whitespace, Name.Namespace)),
+            (r'\b(let!?)(\s+)(\w+)',
+             bygroups(Keyword, Whitespace, Name.Variable)),
+            (r'\b(type)(\s+)(\w+)',
+             bygroups(Keyword, Whitespace, Name.Class)),
+            (r'\b(member|override)(\s+)(\w+)(\.)(\w+)',
+             bygroups(Keyword, Whitespace, Name, Punctuation, Name.Function)),
+            (r'\b({})\b'.format('|'.join(keywords)), Keyword),
+            (r'``([^`\n\r\t]|`[^`\n\r\t])+``', Name),
+            (r'({})'.format('|'.join(keyopts)), Operator),
+            (rf'({infix_syms}|{prefix_syms})?{operators}', Operator),
+            (r'\b({})\b'.format('|'.join(word_operators)), Operator.Word),
+            (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type),
+            (r'(#)([ \t]*)(if|endif|else|line|nowarn|light|\d+)\b(.*?)(\n)',
+             bygroups(Comment.Preproc, Whitespace, Comment.Preproc,
+                      Comment.Preproc, Whitespace)),
+
+            (r"[^\W\d][\w']*", Name),
+
+            (r'\d[\d_]*[uU]?[yslLnQRZINGmM]?', Number.Integer),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*[uU]?[yslLn]?[fF]?', Number.Hex),
+            (r'0[oO][0-7][0-7_]*[uU]?[yslLn]?', Number.Oct),
+            (r'0[bB][01][01_]*[uU]?[yslLn]?', Number.Bin),
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)[fFmM]?',
+             Number.Float),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'B?",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'", Keyword),  # a stray quote is another syntax element
+
+            (r'@?"', String.Double, 'string'),
+
+            (r'[~?][a-z][\w\']*:', Name.Variable),
+        ],
+        'dotted': [
+            (r'\s+', Whitespace),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
+            (r'[A-Z][\w\']*', Name, '#pop'),
+            (r'[a-z_][\w\']*', Name, '#pop'),
+            # e.g. dictionary index access
+            default('#pop'),
+        ],
+        'comment': [
+            (r'[^(*)@"]+', Comment),
+            (r'\(\*', Comment, '#push'),
+            (r'\*\)', Comment, '#pop'),
+            # comments cannot be closed within strings in comments
+            (r'@"', String, 'lstring'),
+            (r'"""', String, 'tqs'),
+            (r'"', String, 'string'),
+            (r'[(*)@]', Comment),
+        ],
+        'string': [
+            (r'[^\\"]+', String),
+            include('escape-sequence'),
+            (r'\\\n', String),
+            (r'\n', String),  # newlines are allowed in any string
+            (r'"B?', String, '#pop'),
+        ],
+        'lstring': [
+            (r'[^"]+', String),
+            (r'\n', String),
+            (r'""', String),
+            (r'"B?', String, '#pop'),
+        ],
+        'tqs': [
+            (r'[^"]+', String),
+            (r'\n', String),
+            (r'"""B?', String, '#pop'),
+            (r'"', String),
+        ],
+    }
+
+    def analyse_text(text):
+        """F# doesn't have that many unique features -- |> and <| are weak
+        indicators."""
+        result = 0
+        if '|>' in text:
+            result += 0.05
+        if '<|' in text:
+            result += 0.05
+
+        return result
+
+
+class XppLexer(RegexLexer):
+
+    """
+    For X++ source code. This is based loosely on the CSharpLexer
+    """
+
+    name = 'X++'
+    url = 'https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/dev-ref/xpp-language-reference'
+    aliases = ['xpp', 'x++']
+    filenames = ['*.xpp']
+    version_added = '2.15'
+
+    flags = re.MULTILINE
+
+    XPP_CHARS = ('@?(?:_|[^' +
+                 uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + '])' +
+                 '[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',
+                                      'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*')
+    # Temporary, see
+    # https://github.com/thatch/regexlint/pull/49
+    XPP_CHARS = XPP_CHARS.replace('\x00', '\x01')
+
+    OPERATORS = (
+                    '<=', '>=', '+=', '-=', '*=', '/=', '!=', '==',
+                    '&&', '||', '>>', '<<', '++', '--', '+', '-', '*',
+                    '/', '%', '&', '|', '^', '<', '>', '?', '!', '~', '=',
+                )
+    KEYWORDS = ('abstract','anytype','as','async','asc','at','avg','break','breakpoint','by','byref','case','catch',
+                 'changecompany','client','container','continue','count','crosscompany','default','delegate',
+                 'delete_from','desc','display','div','do','edit','else','element','eventhandler','exists','false','final',
+                 'firstfast','firstonly','firstonly10','firstonly100','firstonly1000','flush','for','forceliterals',
+                 'forcenestedloop','forceplaceholders','forceselectorder','forupdate','from','group','if','insert_recordset',
+                 'interface','is','join','like','maxof','minof','mod','new','next','nofetch','notexists','null','optimisticlock','order',
+                 'outer','pause','pessimisticlock','print','private','protected','public','repeatableread','retry','return',
+                 'reverse','select','server','setting','static','sum','super','switch','tablelock','this','throw','true','try','ttsabort','ttsbegin',
+                 'ttscommit','update_recordset','validtimestate','void','where','while','window')
+    RUNTIME_FUNCTIONS = ('_duration','abs','acos','any2Date','any2Enum','any2Guid','any2Int','any2Int64','any2Real','any2Str','anytodate',
+                 'anytoenum','anytoguid','anytoint','anytoint64','anytoreal','anytostr','asin','atan','beep','cTerm','char2Num','classIdGet',
+                 'corrFlagGet','corrFlagSet','cos','cosh','curExt','curUserId','date2Num','date2Str','datetime2Str','dayName','dayOfMth',
+                 'dayOfWk','dayOfYr','ddb','decRound','dg','dimOf','endMth','enum2str','exp','exp10','fV','fieldId2Name','fieldId2PName',
+                 'fieldName2Id','frac','funcName','getCurrentPartition','getCurrentPartitionRecId','getPrefix','guid2Str','idg','indexId2Name',
+                 'indexName2Id','int2Str','int642Str','intvMax','intvName','intvNo','intvNorm','log10','logN','match','max','min','mkDate','mthName',
+                 'mthOfYr','newGuid','nextMth','nextQtr','nextYr','num2Char','num2Date','num2Str','pmt','power','prevMth','prevQtr','prevYr',
+                 'prmIsDefault','pt','pv','rate','refPrintAll','round','runAs','sessionId','setPrefix','sin','sinh','sleep','sln','str2Date',
+                 'str2Datetime','str2Enum','str2Guid','str2Int','str2Int64','str2Num','str2Time','strAlpha','strCmp','strColSeq','strDel',
+                 'strFind','strFmt','strIns','strKeep','strLTrim','strLen','strLine','strLwr','strNFind','strPoke','strPrompt','strRTrim',
+                 'strRem','strRep','strScan','strUpr','subStr','syd','systemDateGet','systemDateSet','tableId2Name',
+                 'tableId2PName','tableName2Id','tan','tanh','term','time2Str','timeNow','today','trunc','typeOf','uint2Str','wkOfYr','year')
+    COMPILE_FUNCTIONS = ('attributeStr','classNum','classStr','configurationKeyNum','configurationKeyStr','dataEntityDataSourceStr','delegateStr',
+                 'dimensionHierarchyLevelStr','dimensionHierarchyStr','dimensionReferenceStr','dutyStr','enumCnt','enumLiteralStr','enumNum','enumStr',
+                 'extendedTypeNum','extendedTypeStr','fieldNum','fieldPName','fieldStr','formControlStr','formDataFieldStr','formDataSourceStr',
+                 'formMethodStr','formStr','identifierStr','indexNum','indexStr','licenseCodeNum','licenseCodeStr','literalStr','maxDate','maxInt',
+                 'measureStr','measurementStr','menuItemActionStr','menuItemDisplayStr','menuItemOutputStr','menuStr','methodStr','minInt','privilegeStr',
+                 'queryDatasourceStr','queryMethodStr','queryStr','reportStr','resourceStr','roleStr','ssrsReportStr','staticDelegateStr','staticMethodStr',
+                 'tableCollectionStr','tableFieldGroupStr','tableMethodStr','tableNum','tablePName','tableStaticMethodStr','tableStr','tileStr','varStr',
+                 'webActionItemStr','webDisplayContentItemStr','webFormStr','webMenuStr','webOutputContentItemStr','webReportStr','webSiteTempStr',
+                 'webStaticFileStr','webUrlItemStr','webWebPartStr','webletItemStr','webpageDefStr','websiteDefStr','workflowApprovalStr',
+                 'workflowCategoryStr','workflowTaskStr','workflowTypeStr')
+
+    tokens = {}
+
+    tokens = {
+        'root': [
+            # method names
+            (r'(\s*)\b(else|if)\b([^\n])', bygroups(Whitespace, Keyword, using(this))), # ensure that if is not treated like a function
+            (r'^([ \t]*)((?:' + XPP_CHARS + r'(?:\[\])?\s+)+?)'  # return type
+                r'(' + XPP_CHARS + ')'                            # method name
+                r'(\s*)(\()',                               # signature start
+                bygroups(Whitespace, using(this), Name.Function, Whitespace,
+                        Punctuation)),
+            (r'^(\s*)(\[)([^\n]*?)(\])', bygroups(Whitespace, Name.Attribute, Name.Variable.Class, Name.Attribute)),
+            (r'[^\S\n]+', Whitespace),
+            (r'(\\)(\n)', bygroups(Text, Whitespace)),  # line continuation
+            (r'//[^\n]*?\n', Comment.Single),
+            (r'/[*][^\n]*?[*]/', Comment.Multiline),
+            (r'\n', Whitespace),
+            (words(OPERATORS), Operator),
+            (r'=~|!=|==|<<|>>|[-+/*%=<>&^|]', Operator),
+            (r'[()\[\];:,.#@]', Punctuation),
+            (r'[{}]', Punctuation),
+            (r'@"(""|[^"])*"', String),
+            (r'\$?"(\\\\|\\[^\\]|[^"\\\n])*["\n]', String),
+            (r"'\\.'|'[^\\]'", String.Char),
+            (r"[0-9]+(\.[0-9]*)?([eE][+-][0-9]+)?"
+                r"[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?", Number),
+            (words(KEYWORDS, suffix=r'\b'), Keyword),
+            (r'(boolean|int|int64|str|real|guid|date)\b\??', Keyword.Type),
+            (r'(class|struct|extends|implements)(\s+)', bygroups(Keyword, Whitespace), 'class'),
+            (r'('+XPP_CHARS+')(::)', bygroups(Name.Variable.Class, Punctuation)),
+            (r'(\s*)(\w+)(\s+\w+(,|=)?[^\n]*;)', bygroups(Whitespace, Name.Variable.Class, using(this))), # declaration
+            # x++ specific function to get field should highlight the classname
+            (r'(fieldNum\()('+XPP_CHARS+r')(\s*,\s*)('+XPP_CHARS+r')(\s*\))',
+                bygroups(using(this), Name.Variable.Class, using(this), Name.Property, using(this))),
+            # x++ specific function to get table should highlight the classname
+            (r'(tableNum\()('+XPP_CHARS+r')(\s*\))',
+                bygroups(using(this), Name.Variable.Class, using(this))),
+            (words(RUNTIME_FUNCTIONS, suffix=r'(?=\()'), Name.Function.Magic),
+            (words(COMPILE_FUNCTIONS, suffix=r'(?=\()'), Name.Function.Magic),
+            (XPP_CHARS, Name),
+        ],
+        'class': [
+            (XPP_CHARS, Name.Class, '#pop'),
+            default('#pop'),
+        ],
+        'namespace': [
+            (r'(?=\()', Text, '#pop'),  # using (resource)
+            ('(' + XPP_CHARS + r'|\.)+', Name.Namespace, '#pop'),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/dsls.py b/.venv/Lib/site-packages/pygments/lexers/dsls.py
new file mode 100644 (file)
index 0000000..d30c112
--- /dev/null
@@ -0,0 +1,970 @@
+"""
+    pygments.lexers.dsls
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various domain-specific languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import ExtendedRegexLexer, RegexLexer, bygroups, words, \
+    include, default, this, using, combined
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['ProtoBufLexer', 'ZeekLexer', 'PuppetLexer', 'RslLexer',
+           'MscgenLexer', 'VGLLexer', 'AlloyLexer', 'PanLexer',
+           'CrmshLexer', 'ThriftLexer', 'FlatlineLexer', 'SnowballLexer']
+
+
+class ProtoBufLexer(RegexLexer):
+    """
+    Lexer for Protocol Buffer definition files.
+    """
+
+    name = 'Protocol Buffer'
+    url = 'https://developers.google.com/protocol-buffers/'
+    aliases = ['protobuf', 'proto']
+    filenames = ['*.proto']
+    version_added = '1.4'
+
+    tokens = {
+        'root': [
+            (r'[ \t]+', Whitespace),
+            (r'[,;{}\[\]()<>]', Punctuation),
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment.Multiline),
+            (words((
+                'import', 'option', 'optional', 'required', 'repeated',
+                'reserved', 'default', 'packed', 'ctype', 'extensions', 'to',
+                'max', 'rpc', 'returns', 'oneof', 'syntax'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (words((
+                'int32', 'int64', 'uint32', 'uint64', 'sint32', 'sint64',
+                'fixed32', 'fixed64', 'sfixed32', 'sfixed64',
+                'float', 'double', 'bool', 'string', 'bytes'), suffix=r'\b'),
+             Keyword.Type),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Whitespace), 'package'),
+            (r'(message|extend)(\s+)',
+             bygroups(Keyword.Declaration, Whitespace), 'message'),
+            (r'(enum|group|service)(\s+)',
+             bygroups(Keyword.Declaration, Whitespace), 'type'),
+            (r'\".*?\"', String),
+            (r'\'.*?\'', String),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'(\-?(inf|nan))\b', Number.Float),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'0[0-7]+[LlUu]*', Number.Oct),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'[+-=]', Operator),
+            (r'([a-zA-Z_][\w.]*)([ \t]*)(=)',
+             bygroups(Name.Attribute, Whitespace, Operator)),
+            (r'[a-zA-Z_][\w.]*', Name),
+        ],
+        'package': [
+            (r'[a-zA-Z_]\w*', Name.Namespace, '#pop'),
+            default('#pop'),
+        ],
+        'message': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            default('#pop'),
+        ],
+        'type': [
+            (r'[a-zA-Z_]\w*', Name, '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class ThriftLexer(RegexLexer):
+    """
+    For Thrift interface definitions.
+    """
+    name = 'Thrift'
+    url = 'https://thrift.apache.org/'
+    aliases = ['thrift']
+    filenames = ['*.thrift']
+    mimetypes = ['application/x-thrift']
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            (r'"', String.Double, combined('stringescape', 'dqs')),
+            (r'\'', String.Single, combined('stringescape', 'sqs')),
+            (r'(namespace)(\s+)',
+                bygroups(Keyword.Namespace, Whitespace), 'namespace'),
+            (r'(enum|union|struct|service|exception)(\s+)',
+                bygroups(Keyword.Declaration, Whitespace), 'class'),
+            (r'((?:(?:[^\W\d]|\$)[\w.\[\]$<>]*\s+)+?)'  # return arguments
+             r'((?:[^\W\d]|\$)[\w$]*)'                  # method name
+             r'(\s*)(\()',                              # signature start
+             bygroups(using(this), Name.Function, Whitespace, Operator)),
+            include('keywords'),
+            include('numbers'),
+            (r'[&=]', Operator),
+            (r'[:;,{}()<>\[\]]', Punctuation),
+            (r'[a-zA-Z_](\.\w|\w)*', Name),
+        ],
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+        ],
+        'comments': [
+            (r'#.*$', Comment),
+            (r'//.*?\n', Comment),
+            (r'/\*[\w\W]*?\*/', Comment.Multiline),
+        ],
+        'stringescape': [
+            (r'\\([\\nrt"\'])', String.Escape),
+        ],
+        'dqs': [
+            (r'"', String.Double, '#pop'),
+            (r'[^\\"\n]+', String.Double),
+        ],
+        'sqs': [
+            (r"'", String.Single, '#pop'),
+            (r'[^\\\'\n]+', String.Single),
+        ],
+        'namespace': [
+            (r'[a-z*](\.\w|\w)*', Name.Namespace, '#pop'),
+            default('#pop'),
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            default('#pop'),
+        ],
+        'keywords': [
+            (r'(async|oneway|extends|throws|required|optional)\b', Keyword),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'(const|typedef)\b', Keyword.Declaration),
+            (words((
+                'cpp_namespace', 'cpp_include', 'cpp_type', 'java_package',
+                'cocoa_prefix', 'csharp_namespace', 'delphi_namespace',
+                'php_namespace', 'py_module', 'perl_package',
+                'ruby_namespace', 'smalltalk_category', 'smalltalk_prefix',
+                'xsd_all', 'xsd_optional', 'xsd_nillable', 'xsd_namespace',
+                'xsd_attrs', 'include'), suffix=r'\b'),
+             Keyword.Namespace),
+            (words((
+                'void', 'bool', 'byte', 'i16', 'i32', 'i64', 'double',
+                'string', 'binary', 'map', 'list', 'set', 'slist',
+                'senum'), suffix=r'\b'),
+             Keyword.Type),
+            (words((
+                'BEGIN', 'END', '__CLASS__', '__DIR__', '__FILE__',
+                '__FUNCTION__', '__LINE__', '__METHOD__', '__NAMESPACE__',
+                'abstract', 'alias', 'and', 'args', 'as', 'assert', 'begin',
+                'break', 'case', 'catch', 'class', 'clone', 'continue',
+                'declare', 'def', 'default', 'del', 'delete', 'do', 'dynamic',
+                'elif', 'else', 'elseif', 'elsif', 'end', 'enddeclare',
+                'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile',
+                'ensure', 'except', 'exec', 'finally', 'float', 'for',
+                'foreach', 'function', 'global', 'goto', 'if', 'implements',
+                'import', 'in', 'inline', 'instanceof', 'interface', 'is',
+                'lambda', 'module', 'native', 'new', 'next', 'nil', 'not',
+                'or', 'pass', 'public', 'print', 'private', 'protected',
+                'raise', 'redo', 'rescue', 'retry', 'register', 'return',
+                'self', 'sizeof', 'static', 'super', 'switch', 'synchronized',
+                'then', 'this', 'throw', 'transient', 'try', 'undef',
+                'unless', 'unsigned', 'until', 'use', 'var', 'virtual',
+                'volatile', 'when', 'while', 'with', 'xor', 'yield'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+        ],
+        'numbers': [
+            (r'[+-]?(\d+\.\d+([eE][+-]?\d+)?|\.?\d+[eE][+-]?\d+)', Number.Float),
+            (r'[+-]?0x[0-9A-Fa-f]+', Number.Hex),
+            (r'[+-]?[0-9]+', Number.Integer),
+        ],
+    }
+
+
+class ZeekLexer(RegexLexer):
+    """
+    For Zeek scripts.
+    """
+    name = 'Zeek'
+    url = 'https://www.zeek.org/'
+    aliases = ['zeek', 'bro']
+    filenames = ['*.zeek', '*.bro']
+    version_added = '2.5'
+
+    _hex = r'[0-9a-fA-F]'
+    _float = r'((\d*\.?\d+)|(\d+\.?\d*))([eE][-+]?\d+)?'
+    _h = r'[A-Za-z0-9][-A-Za-z0-9]*'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            include('directives'),
+            include('attributes'),
+            include('types'),
+            include('keywords'),
+            include('literals'),
+            include('operators'),
+            include('punctuation'),
+            (r'((?:[A-Za-z_]\w*)(?:::(?:[A-Za-z_]\w*))*)(?=\s*\()',
+                Name.Function),
+            include('identifiers'),
+        ],
+
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'(\\)(\n)', bygroups(Text, Whitespace)),
+        ],
+
+        'comments': [
+            (r'#.*$', Comment),
+        ],
+
+        'directives': [
+            (r'@(load-plugin|load-sigs|load|unload)\b.*$', Comment.Preproc),
+            (r'@(DEBUG|DIR|FILENAME|deprecated|if|ifdef|ifndef|else|endif)\b', Comment.Preproc),
+            (r'(@prefixes)(\s*)((\+?=).*)$', bygroups(Comment.Preproc,
+                Whitespace, Comment.Preproc)),
+        ],
+
+        'attributes': [
+            (words(('redef', 'priority', 'log', 'optional', 'default', 'add_func',
+                    'delete_func', 'expire_func', 'read_expire', 'write_expire',
+                    'create_expire', 'synchronized', 'persistent', 'rotate_interval',
+                    'rotate_size', 'encrypt', 'raw_output', 'mergeable', 'error_handler',
+                    'type_column', 'deprecated'),
+                prefix=r'&', suffix=r'\b'),
+             Keyword.Pseudo),
+        ],
+
+        'types': [
+            (words(('any',
+                    'enum', 'record', 'set', 'table', 'vector',
+                    'function', 'hook', 'event',
+                    'addr', 'bool', 'count', 'double', 'file', 'int', 'interval',
+                    'pattern', 'port', 'string', 'subnet', 'time'),
+                suffix=r'\b'),
+             Keyword.Type),
+
+            (r'(opaque)(\s+)(of)(\s+)((?:[A-Za-z_]\w*)(?:::(?:[A-Za-z_]\w*))*)\b',
+                bygroups(Keyword.Type, Whitespace, Operator.Word, Whitespace, Keyword.Type)),
+
+            (r'(type)(\s+)((?:[A-Za-z_]\w*)(?:::(?:[A-Za-z_]\w*))*)(\s*)(:)(\s*)\b(record|enum)\b',
+                bygroups(Keyword, Whitespace, Name.Class, Whitespace, Operator, Whitespace, Keyword.Type)),
+
+            (r'(type)(\s+)((?:[A-Za-z_]\w*)(?:::(?:[A-Za-z_]\w*))*)(\s*)(:)',
+                bygroups(Keyword, Whitespace, Name, Whitespace, Operator)),
+
+            (r'(redef)(\s+)(record|enum)(\s+)((?:[A-Za-z_]\w*)(?:::(?:[A-Za-z_]\w*))*)\b',
+                bygroups(Keyword, Whitespace, Keyword.Type, Whitespace, Name.Class)),
+        ],
+
+        'keywords': [
+            (words(('redef', 'export', 'if', 'else', 'for', 'while',
+                    'return', 'break', 'next', 'continue', 'fallthrough',
+                    'switch', 'default', 'case',
+                    'add', 'delete',
+                    'when', 'timeout', 'schedule'),
+                suffix=r'\b'),
+             Keyword),
+            (r'(print)\b', Keyword),
+            (r'(global|local|const|option)\b', Keyword.Declaration),
+            (r'(module)(\s+)(([A-Za-z_]\w*)(?:::([A-Za-z_]\w*))*)\b',
+                bygroups(Keyword.Namespace, Whitespace, Name.Namespace)),
+        ],
+
+        'literals': [
+            (r'"', String, 'string'),
+
+            # Not the greatest match for patterns, but generally helps
+            # disambiguate between start of a pattern and just a division
+            # operator.
+            (r'/(?=.*/)', String.Regex, 'regex'),
+
+            (r'(T|F)\b', Keyword.Constant),
+
+            # Port
+            (r'\d{1,5}/(udp|tcp|icmp|unknown)\b', Number),
+
+            # IPv4 Address
+            (r'(\d{1,3}.){3}(\d{1,3})\b', Number),
+
+            # IPv6 Address
+            (r'\[([0-9a-fA-F]{0,4}:){2,7}([0-9a-fA-F]{0,4})?((\d{1,3}.){3}(\d{1,3}))?\]', Number),
+
+            # Numeric
+            (r'0[xX]' + _hex + r'+\b', Number.Hex),
+            (_float + r'\s*(day|hr|min|sec|msec|usec)s?\b', Number.Float),
+            (_float + r'\b', Number.Float),
+            (r'(\d+)\b', Number.Integer),
+
+            # Hostnames
+            (_h + r'(\.' + _h + r')+', String),
+        ],
+
+        'operators': [
+            (r'[!%*/+<=>~|&^-]', Operator),
+            (r'([-+=&|]{2}|[+=!><-]=)', Operator),
+            (r'(in|as|is|of)\b', Operator.Word),
+            (r'\??\$', Operator),
+        ],
+
+        'punctuation': [
+            (r'[{}()\[\],;.]', Punctuation),
+            # The "ternary if", which uses '?' and ':', could instead be
+            # treated as an Operator, but colons are more frequently used to
+            # separate field/identifier names from their types, so the (often)
+            # less-prominent Punctuation is used even with '?' for consistency.
+            (r'[?:]', Punctuation),
+        ],
+
+        'identifiers': [
+            (r'([a-zA-Z_]\w*)(::)', bygroups(Name, Punctuation)),
+            (r'[a-zA-Z_]\w*', Name)
+        ],
+
+        'string': [
+            (r'\\.', String.Escape),
+            (r'%-?[0-9]*(\.[0-9]+)?[DTd-gsx]', String.Escape),
+            (r'"', String, '#pop'),
+            (r'.', String),
+        ],
+
+        'regex': [
+            (r'\\.', String.Escape),
+            (r'/', String.Regex, '#pop'),
+            (r'.', String.Regex),
+        ],
+    }
+
+
+BroLexer = ZeekLexer
+
+
+class PuppetLexer(RegexLexer):
+    """
+    For Puppet configuration DSL.
+    """
+    name = 'Puppet'
+    url = 'https://puppet.com/'
+    aliases = ['puppet']
+    filenames = ['*.pp']
+    version_added = '1.6'
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('keywords'),
+            include('names'),
+            include('numbers'),
+            include('operators'),
+            include('strings'),
+
+            (r'[]{}:(),;[]', Punctuation),
+            (r'\s+', Whitespace),
+        ],
+
+        'comments': [
+            (r'(\s*)(#.*)$', bygroups(Whitespace, Comment)),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+        ],
+
+        'operators': [
+            (r'(=>|\?|<|>|=|\+|-|/|\*|~|!|\|)', Operator),
+            (r'(in|and|or|not)\b', Operator.Word),
+        ],
+
+        'names': [
+            (r'[a-zA-Z_]\w*', Name.Attribute),
+            (r'(\$\S+)(\[)(\S+)(\])', bygroups(Name.Variable, Punctuation,
+                                               String, Punctuation)),
+            (r'\$\S+', Name.Variable),
+        ],
+
+        'numbers': [
+            # Copypasta from the Python lexer
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+j?', Number.Float),
+            (r'0[0-7]+j?', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+j?', Number.Integer)
+        ],
+
+        'keywords': [
+            # Left out 'group' and 'require'
+            # Since they're often used as attributes
+            (words((
+                'absent', 'alert', 'alias', 'audit', 'augeas', 'before', 'case',
+                'check', 'class', 'computer', 'configured', 'contained',
+                'create_resources', 'crit', 'cron', 'debug', 'default',
+                'define', 'defined', 'directory', 'else', 'elsif', 'emerg',
+                'err', 'exec', 'extlookup', 'fail', 'false', 'file',
+                'filebucket', 'fqdn_rand', 'generate', 'host', 'if', 'import',
+                'include', 'info', 'inherits', 'inline_template', 'installed',
+                'interface', 'k5login', 'latest', 'link', 'loglevel',
+                'macauthorization', 'mailalias', 'maillist', 'mcx', 'md5',
+                'mount', 'mounted', 'nagios_command', 'nagios_contact',
+                'nagios_contactgroup', 'nagios_host', 'nagios_hostdependency',
+                'nagios_hostescalation', 'nagios_hostextinfo', 'nagios_hostgroup',
+                'nagios_service', 'nagios_servicedependency', 'nagios_serviceescalation',
+                'nagios_serviceextinfo', 'nagios_servicegroup', 'nagios_timeperiod',
+                'node', 'noop', 'notice', 'notify', 'package', 'present', 'purged',
+                'realize', 'regsubst', 'resources', 'role', 'router', 'running',
+                'schedule', 'scheduled_task', 'search', 'selboolean', 'selmodule',
+                'service', 'sha1', 'shellquote', 'split', 'sprintf',
+                'ssh_authorized_key', 'sshkey', 'stage', 'stopped', 'subscribe',
+                'tag', 'tagged', 'template', 'tidy', 'true', 'undef', 'unmounted',
+                'user', 'versioncmp', 'vlan', 'warning', 'yumrepo', 'zfs', 'zone',
+                'zpool'), prefix='(?i)', suffix=r'\b'),
+             Keyword),
+        ],
+
+        'strings': [
+            (r'"([^"])*"', String),
+            (r"'(\\'|[^'])*'", String),
+        ],
+
+    }
+
+
+class RslLexer(RegexLexer):
+    """
+    RSL is the formal specification
+    language used in RAISE (Rigorous Approach to Industrial Software Engineering)
+    method.
+    """
+    name = 'RSL'
+    url = 'http://en.wikipedia.org/wiki/RAISE'
+    aliases = ['rsl']
+    filenames = ['*.rsl']
+    mimetypes = ['text/rsl']
+    version_added = '2.0'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            (words((
+                'Bool', 'Char', 'Int', 'Nat', 'Real', 'Text', 'Unit', 'abs',
+                'all', 'always', 'any', 'as', 'axiom', 'card', 'case', 'channel',
+                'chaos', 'class', 'devt_relation', 'dom', 'elems', 'else', 'elif',
+                'end', 'exists', 'extend', 'false', 'for', 'hd', 'hide', 'if',
+                'in', 'is', 'inds', 'initialise', 'int', 'inter', 'isin', 'len',
+                'let', 'local', 'ltl_assertion', 'object', 'of', 'out', 'post',
+                'pre', 'read', 'real', 'rng', 'scheme', 'skip', 'stop', 'swap',
+                'then', 'theory', 'test_case', 'tl', 'transition_system', 'true',
+                'type', 'union', 'until', 'use', 'value', 'variable', 'while',
+                'with', 'write', '~isin', '-inflist', '-infset', '-list',
+                '-set'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (r'(variable|value)\b', Keyword.Declaration),
+            (r'--.*?\n', Comment),
+            (r'<:.*?:>', Comment),
+            (r'\{!.*?!\}', Comment),
+            (r'/\*.*?\*/', Comment),
+            (r'^([ \t]*)([\w]+)([ \t]*)(:[^:])', bygroups(Whitespace,
+                Name.Function, Whitespace, Name.Function)),
+            (r'(^[ \t]*)([\w]+)([ \t]*)(\([\w\s,]*\))([ \t]*)(is|as)',
+             bygroups(Whitespace, Name.Function, Whitespace, Text,
+                 Whitespace, Keyword)),
+            (r'\b[A-Z]\w*\b', Keyword.Type),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'".*"', String),
+            (r'\'.\'', String.Char),
+            (r'(><|->|-m->|/\\|<=|<<=|<\.|\|\||\|\^\||-~->|-~m->|\\/|>=|>>|'
+             r'\.>|\+\+|-\\|<->|=>|:-|~=|\*\*|<<|>>=|\+>|!!|\|=\||#)',
+             Operator),
+            (r'[0-9]+\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'\s+', Whitespace),
+            (r'.', Text),
+        ],
+    }
+
+    def analyse_text(text):
+        """
+        Check for the most common text in the beginning of a RSL file.
+        """
+        if re.search(r'scheme\s*.*?=\s*class\s*type', text, re.I) is not None:
+            return 1.0
+
+
+class MscgenLexer(RegexLexer):
+    """
+    For Mscgen files.
+    """
+    name = 'Mscgen'
+    url = 'http://www.mcternan.me.uk/mscgen/'
+    aliases = ['mscgen', 'msc']
+    filenames = ['*.msc']
+    version_added = '1.6'
+
+    _var = r'(\w+|"(?:\\"|[^"])*")'
+
+    tokens = {
+        'root': [
+            (r'msc\b', Keyword.Type),
+            # Options
+            (r'(hscale|HSCALE|width|WIDTH|wordwraparcs|WORDWRAPARCS'
+             r'|arcgradient|ARCGRADIENT)\b', Name.Property),
+            # Operators
+            (r'(abox|ABOX|rbox|RBOX|box|BOX|note|NOTE)\b', Operator.Word),
+            (r'(\.|-|\|){3}', Keyword),
+            (r'(?:-|=|\.|:){2}'
+             r'|<<=>>|<->|<=>|<<>>|<:>'
+             r'|->|=>>|>>|=>|:>|-x|-X'
+             r'|<-|<<=|<<|<=|<:|x-|X-|=', Operator),
+            # Names
+            (r'\*', Name.Builtin),
+            (_var, Name.Variable),
+            # Other
+            (r'\[', Punctuation, 'attrs'),
+            (r'\{|\}|,|;', Punctuation),
+            include('comments')
+        ],
+        'attrs': [
+            (r'\]', Punctuation, '#pop'),
+            (_var + r'(\s*)(=)(\s*)' + _var,
+             bygroups(Name.Attribute, Whitespace, Operator, Whitespace,
+                      String)),
+            (r',', Punctuation),
+            include('comments')
+        ],
+        'comments': [
+            (r'(?://|#).*?\n', Comment.Single),
+            (r'/\*(?:.|\n)*?\*/', Comment.Multiline),
+            (r'[ \t\r\n]+', Whitespace)
+        ]
+    }
+
+
+class VGLLexer(RegexLexer):
+    """
+    For SampleManager VGL source code.
+    """
+    name = 'VGL'
+    url = 'http://www.thermoscientific.com/samplemanager'
+    aliases = ['vgl']
+    filenames = ['*.rpf']
+    version_added = '1.6'
+
+    flags = re.MULTILINE | re.DOTALL | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\{[^}]*\}', Comment.Multiline),
+            (r'declare', Keyword.Constant),
+            (r'(if|then|else|endif|while|do|endwhile|and|or|prompt|object'
+             r'|create|on|line|with|global|routine|value|endroutine|constant'
+             r'|global|set|join|library|compile_option|file|exists|create|copy'
+             r'|delete|enable|windows|name|notprotected)(?! *[=<>.,()])',
+             Keyword),
+            (r'(true|false|null|empty|error|locked)', Keyword.Constant),
+            (r'[~^*#!%&\[\]()<>|+=:;,./?-]', Operator),
+            (r'"[^"]*"', String),
+            (r'(\.)([a-z_$][\w$]*)', bygroups(Operator, Name.Attribute)),
+            (r'[0-9][0-9]*(\.[0-9]+(e[+\-]?[0-9]+)?)?', Number),
+            (r'[a-z_$][\w$]*', Name),
+            (r'[\r\n]+', Whitespace),
+            (r'\s+', Whitespace)
+        ]
+    }
+
+
+class AlloyLexer(RegexLexer):
+    """
+    For Alloy source code.
+    """
+
+    name = 'Alloy'
+    url = 'http://alloy.mit.edu'
+    aliases = ['alloy']
+    filenames = ['*.als']
+    mimetypes = ['text/x-alloy']
+    version_added = '2.0'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    iden_rex = r'[a-zA-Z_][\w]*"*'
+    string_rex = r'"\b(\\\\|\\[^\\]|[^"\\])*"'
+    text_tuple = (r'[^\S\n]+', Whitespace)
+
+    tokens = {
+        'sig': [
+            (r'(extends)\b', Keyword, '#pop'),
+            (iden_rex, Name),
+            text_tuple,
+            (r',', Punctuation),
+            (r'\{', Operator, '#pop'),
+        ],
+        'module': [
+            text_tuple,
+            (iden_rex, Name, '#pop'),
+        ],
+        'fun': [
+            text_tuple,
+            (r'\{', Operator, '#pop'),
+            (iden_rex, Name, '#pop'),
+        ],
+        'fact': [
+            include('fun'),
+            (string_rex, String, '#pop'),
+        ],
+        'root': [
+            (r'--.*?$', Comment.Single),
+            (r'//.*?$', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            text_tuple,
+            (r'(module|open)(\s+)', bygroups(Keyword.Namespace, Whitespace),
+                'module'),
+            (r'(sig|enum)(\s+)', bygroups(Keyword.Declaration, Whitespace), 'sig'),
+            (r'(iden|univ|none)\b', Keyword.Constant),
+            (r'(int|Int)\b', Keyword.Type),
+            (r'(var|this|abstract|extends|set|seq|one|lone|let)\b', Keyword),
+            (r'(all|some|no|sum|disj|when|else)\b', Keyword),
+            (r'(run|check|for|but|exactly|expect|as|steps)\b', Keyword),
+            (r'(always|after|eventually|until|release)\b', Keyword), # future time operators
+            (r'(historically|before|once|since|triggered)\b', Keyword), # past time operators
+            (r'(and|or|implies|iff|in)\b', Operator.Word),
+            (r'(fun|pred|assert)(\s+)', bygroups(Keyword, Whitespace), 'fun'),
+            (r'(fact)(\s+)', bygroups(Keyword, Whitespace), 'fact'),
+            (r'!|#|&&|\+\+|<<|>>|>=|<=>|<=|\.\.|\.|->', Operator),
+            (r'[-+/*%=<>&!^|~{}\[\]().\';]', Operator),
+            (iden_rex, Name),
+            (r'[:,]', Punctuation),
+            (r'[0-9]+', Number.Integer),
+            (string_rex, String),
+            (r'\n', Whitespace),
+        ]
+    }
+
+
+class PanLexer(RegexLexer):
+    """
+    Lexer for pan source files.
+
+    Based on tcsh lexer.
+    """
+
+    name = 'Pan'
+    url = 'https://github.com/quattor/pan/'
+    aliases = ['pan']
+    filenames = ['*.pan']
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            include('basic'),
+            (r'\(', Keyword, 'paren'),
+            (r'\{', Keyword, 'curly'),
+            include('data'),
+        ],
+        'basic': [
+            (words((
+                'if', 'for', 'with', 'else', 'type', 'bind', 'while', 'valid', 'final',
+                'prefix', 'unique', 'object', 'foreach', 'include', 'template',
+                'function', 'variable', 'structure', 'extensible', 'declaration'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (words((
+                'file_contents', 'format', 'index', 'length', 'match', 'matches',
+                'replace', 'splice', 'split', 'substr', 'to_lowercase', 'to_uppercase',
+                'debug', 'error', 'traceback', 'deprecated', 'base64_decode',
+                'base64_encode', 'digest', 'escape', 'unescape', 'append', 'create',
+                'first', 'nlist', 'key', 'list', 'merge', 'next', 'prepend', 'is_boolean',
+                'is_defined', 'is_double', 'is_list', 'is_long', 'is_nlist', 'is_null',
+                'is_number', 'is_property', 'is_resource', 'is_string', 'to_boolean',
+                'to_double', 'to_long', 'to_string', 'clone', 'delete', 'exists',
+                'path_exists', 'if_exists', 'return', 'value'),
+                prefix=r'\b', suffix=r'\b'),
+             Name.Builtin),
+            (r'#.*', Comment),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Whitespace, Operator)),
+            (r'[\[\]{}()=]+', Operator),
+            (r'<<\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+            (r';', Punctuation),
+        ],
+        'data': [
+            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
+            (r"(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r'\s+', Whitespace),
+            (r'[^=\s\[\]{}()$"\'`\\;#]+', Text),
+            (r'\d+(?= |\Z)', Number),
+        ],
+        'curly': [
+            (r'\}', Keyword, '#pop'),
+            (r':-', Keyword),
+            (r'\w+', Name.Variable),
+            (r'[^}:"\'`$]+', Punctuation),
+            (r':', Punctuation),
+            include('root'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+    }
+
+
+class CrmshLexer(RegexLexer):
+    """
+    Lexer for crmsh configuration files for Pacemaker clusters.
+    """
+    name = 'Crmsh'
+    url = 'http://crmsh.github.io/'
+    aliases = ['crmsh', 'pcmk']
+    filenames = ['*.crmsh', '*.pcmk']
+    mimetypes = []
+    version_added = '2.1'
+
+    elem = words((
+        'node', 'primitive', 'group', 'clone', 'ms', 'location',
+        'colocation', 'order', 'fencing_topology', 'rsc_ticket',
+        'rsc_template', 'property', 'rsc_defaults',
+        'op_defaults', 'acl_target', 'acl_group', 'user', 'role',
+        'tag'), suffix=r'(?![\w#$-])')
+    sub = words((
+        'params', 'meta', 'operations', 'op', 'rule',
+        'attributes', 'utilization'), suffix=r'(?![\w#$-])')
+    acl = words(('read', 'write', 'deny'), suffix=r'(?![\w#$-])')
+    bin_rel = words(('and', 'or'), suffix=r'(?![\w#$-])')
+    un_ops = words(('defined', 'not_defined'), suffix=r'(?![\w#$-])')
+    date_exp = words(('in_range', 'date', 'spec', 'in'), suffix=r'(?![\w#$-])')
+    acl_mod = (r'(?:tag|ref|reference|attribute|type|xpath)')
+    bin_ops = (r'(?:lt|gt|lte|gte|eq|ne)')
+    val_qual = (r'(?:string|version|number)')
+    rsc_role_action = (r'(?:Master|Started|Slave|Stopped|'
+                       r'start|promote|demote|stop)')
+
+    tokens = {
+        'root': [
+            (r'^(#.*)(\n)?', bygroups(Comment, Whitespace)),
+            # attr=value (nvpair)
+            (r'([\w#$-]+)(=)("(?:""|[^"])*"|\S+)',
+                bygroups(Name.Attribute, Punctuation, String)),
+            # need this construct, otherwise numeric node ids
+            # are matched as scores
+            # elem id:
+            (r'(node)(\s+)([\w#$-]+)(:)',
+                bygroups(Keyword, Whitespace, Name, Punctuation)),
+            # scores
+            (r'([+-]?([0-9]+|inf)):', Number),
+            # keywords (elements and other)
+            (elem, Keyword),
+            (sub, Keyword),
+            (acl, Keyword),
+            # binary operators
+            (rf'(?:{val_qual}:)?({bin_ops})(?![\w#$-])', Operator.Word),
+            # other operators
+            (bin_rel, Operator.Word),
+            (un_ops, Operator.Word),
+            (date_exp, Operator.Word),
+            # builtin attributes (e.g. #uname)
+            (r'#[a-z]+(?![\w#$-])', Name.Builtin),
+            # acl_mod:blah
+            (rf'({acl_mod})(:)("(?:""|[^"])*"|\S+)',
+             bygroups(Keyword, Punctuation, Name)),
+            # rsc_id[:(role|action)]
+            # NB: this matches all other identifiers
+            (rf'([\w#$-]+)(?:(:)({rsc_role_action}))?(?![\w#$-])',
+             bygroups(Name, Punctuation, Operator.Word)),
+            # punctuation
+            (r'(\\(?=\n)|[\[\](){}/:@])', Punctuation),
+            (r'\s+|\n', Whitespace),
+        ],
+    }
+
+
+class FlatlineLexer(RegexLexer):
+    """
+    Lexer for Flatline expressions.
+    """
+    name = 'Flatline'
+    url = 'https://github.com/bigmlcom/flatline'
+    aliases = ['flatline']
+    filenames = []
+    mimetypes = ['text/x-flatline']
+    version_added = '2.2'
+
+    special_forms = ('let',)
+
+    builtins = (
+        "!=", "*", "+", "-", "<", "<=", "=", ">", ">=", "abs", "acos", "all",
+        "all-but", "all-with-defaults", "all-with-numeric-default", "and",
+        "asin", "atan", "avg", "avg-window", "bin-center", "bin-count", "call",
+        "category-count", "ceil", "cond", "cond-window", "cons", "cos", "cosh",
+        "count", "diff-window", "div", "ensure-value", "ensure-weighted-value",
+        "epoch", "epoch-day", "epoch-fields", "epoch-hour", "epoch-millisecond",
+        "epoch-minute", "epoch-month", "epoch-second", "epoch-weekday",
+        "epoch-year", "exp", "f", "field", "field-prop", "fields", "filter",
+        "first", "floor", "head", "if", "in", "integer", "language", "length",
+        "levenshtein", "linear-regression", "list", "ln", "log", "log10", "map",
+        "matches", "matches?", "max", "maximum", "md5", "mean", "median", "min",
+        "minimum", "missing", "missing-count", "missing?", "missing_count",
+        "mod", "mode", "normalize", "not", "nth", "occurrences", "or",
+        "percentile", "percentile-label", "population", "population-fraction",
+        "pow", "preferred", "preferred?", "quantile-label", "rand", "rand-int",
+        "random-value", "re-quote", "real", "replace", "replace-first", "rest",
+        "round", "row-number", "segment-label", "sha1", "sha256", "sin", "sinh",
+        "sqrt", "square", "standard-deviation", "standard_deviation", "str",
+        "subs", "sum", "sum-squares", "sum-window", "sum_squares", "summary",
+        "summary-no", "summary-str", "tail", "tan", "tanh", "to-degrees",
+        "to-radians", "variance", "vectorize", "weighted-random-value", "window",
+        "winnow", "within-percentiles?", "z-score",
+    )
+
+    valid_name = r'(?!#)[\w!$%*+<=>?/.#-]+'
+
+    tokens = {
+        'root': [
+            # whitespaces - usually not relevant
+            (r'[,]+', Text),
+            (r'\s+', Whitespace),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+            (r'0x-?[a-f\d]+', Number.Hex),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r"\\(.|[a-z]+)", String.Char),
+
+            # expression template placeholder
+            (r'_', String.Symbol),
+
+            # highlight the special forms
+            (words(special_forms, suffix=' '), Keyword),
+
+            # highlight the builtins
+            (words(builtins, suffix=' '), Name.Builtin),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Function),
+
+            # find the remaining variables
+            (valid_name, Name.Variable),
+
+            # parentheses
+            (r'(\(|\))', Punctuation),
+        ],
+    }
+
+
+class SnowballLexer(ExtendedRegexLexer):
+    """
+    Lexer for Snowball source code.
+    """
+
+    name = 'Snowball'
+    url = 'https://snowballstem.org/'
+    aliases = ['snowball']
+    filenames = ['*.sbl']
+    version_added = '2.2'
+
+    _ws = r'\n\r\t '
+
+    def __init__(self, **options):
+        self._reset_stringescapes()
+        ExtendedRegexLexer.__init__(self, **options)
+
+    def _reset_stringescapes(self):
+        self._start = "'"
+        self._end = "'"
+
+    def _string(do_string_first):
+        def callback(lexer, match, ctx):
+            s = match.start()
+            text = match.group()
+            string = re.compile(rf'([^{re.escape(lexer._start)}]*)(.)').match
+            escape = re.compile(rf'([^{re.escape(lexer._end)}]*)(.)').match
+            pos = 0
+            do_string = do_string_first
+            while pos < len(text):
+                if do_string:
+                    match = string(text, pos)
+                    yield s + match.start(1), String.Single, match.group(1)
+                    if match.group(2) == "'":
+                        yield s + match.start(2), String.Single, match.group(2)
+                        ctx.stack.pop()
+                        break
+                    yield s + match.start(2), String.Escape, match.group(2)
+                    pos = match.end()
+                match = escape(text, pos)
+                yield s + match.start(), String.Escape, match.group()
+                if match.group(2) != lexer._end:
+                    ctx.stack[-1] = 'escape'
+                    break
+                pos = match.end()
+                do_string = True
+            ctx.pos = s + match.end()
+        return callback
+
+    def _stringescapes(lexer, match, ctx):
+        lexer._start = match.group(3)
+        lexer._end = match.group(5)
+        return bygroups(Keyword.Reserved, Whitespace, String.Escape, Whitespace,
+                        String.Escape)(lexer, match, ctx)
+
+    tokens = {
+        'root': [
+            (r'len\b', Name.Builtin),
+            (r'lenof\b', Operator.Word),
+            include('root1'),
+        ],
+        'root1': [
+            (rf'[{_ws}]+', Whitespace),
+            (r'\d+', Number.Integer),
+            (r"'", String.Single, 'string'),
+            (r'[()]', Punctuation),
+            (r'/\*[\w\W]*?\*/', Comment.Multiline),
+            (r'//.*', Comment.Single),
+            (r'[!*+\-/<=>]=|[-=]>|<[+-]|[$*+\-/<=>?\[\]]', Operator),
+            (words(('as', 'get', 'hex', 'among', 'define', 'decimal',
+                    'backwardmode'), suffix=r'\b'),
+             Keyword.Reserved),
+            (words(('strings', 'booleans', 'integers', 'routines', 'externals',
+                    'groupings'), suffix=r'\b'),
+             Keyword.Reserved, 'declaration'),
+            (words(('do', 'or', 'and', 'for', 'hop', 'non', 'not', 'set', 'try',
+                    'fail', 'goto', 'loop', 'next', 'test', 'true',
+                    'false', 'unset', 'atmark', 'attach', 'delete', 'gopast',
+                    'insert', 'repeat', 'sizeof', 'tomark', 'atleast',
+                    'atlimit', 'reverse', 'setmark', 'tolimit', 'setlimit',
+                    'backwards', 'substring'), suffix=r'\b'),
+             Operator.Word),
+            (words(('size', 'limit', 'cursor', 'maxint', 'minint'),
+                   suffix=r'\b'),
+             Name.Builtin),
+            (rf'(stringdef\b)([{_ws}]*)([^{_ws}]+)',
+             bygroups(Keyword.Reserved, Whitespace, String.Escape)),
+            (rf'(stringescapes\b)([{_ws}]*)(.)([{_ws}]*)(.)',
+             _stringescapes),
+            (r'[A-Za-z]\w*', Name),
+        ],
+        'declaration': [
+            (r'\)', Punctuation, '#pop'),
+            (words(('len', 'lenof'), suffix=r'\b'), Name,
+             ('root1', 'declaration')),
+            include('root1'),
+        ],
+        'string': [
+            (r"[^']*'", _string(True)),
+        ],
+        'escape': [
+            (r"[^']*'", _string(False)),
+        ],
+    }
+
+    def get_tokens_unprocessed(self, text=None, context=None):
+        self._reset_stringescapes()
+        return ExtendedRegexLexer.get_tokens_unprocessed(self, text, context)
diff --git a/.venv/Lib/site-packages/pygments/lexers/dylan.py b/.venv/Lib/site-packages/pygments/lexers/dylan.py
new file mode 100644 (file)
index 0000000..2109bd5
--- /dev/null
@@ -0,0 +1,279 @@
+"""
+    pygments.lexers.dylan
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Dylan language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, do_insertions, \
+    default, line_re
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Literal, Whitespace
+
+__all__ = ['DylanLexer', 'DylanConsoleLexer', 'DylanLidLexer']
+
+
+class DylanLexer(RegexLexer):
+    """
+    For the Dylan language.
+    """
+
+    name = 'Dylan'
+    url = 'http://www.opendylan.org/'
+    aliases = ['dylan']
+    filenames = ['*.dylan', '*.dyl', '*.intr']
+    mimetypes = ['text/x-dylan']
+    version_added = '0.7'
+
+    flags = re.IGNORECASE
+
+    builtins = {
+        'subclass', 'abstract', 'block', 'concrete', 'constant', 'class',
+        'compiler-open', 'compiler-sideways', 'domain', 'dynamic',
+        'each-subclass', 'exception', 'exclude', 'function', 'generic',
+        'handler', 'inherited', 'inline', 'inline-only', 'instance',
+        'interface', 'import', 'keyword', 'library', 'macro', 'method',
+        'module', 'open', 'primary', 'required', 'sealed', 'sideways',
+        'singleton', 'slot', 'thread', 'variable', 'virtual'}
+
+    keywords = {
+        'above', 'afterwards', 'begin', 'below', 'by', 'case', 'cleanup',
+        'create', 'define', 'else', 'elseif', 'end', 'export', 'finally',
+        'for', 'from', 'if', 'in', 'let', 'local', 'otherwise', 'rename',
+        'select', 'signal', 'then', 'to', 'unless', 'until', 'use', 'when',
+        'while'}
+
+    operators = {
+        '~', '+', '-', '*', '|', '^', '=', '==', '~=', '~==', '<', '<=',
+        '>', '>=', '&', '|'}
+
+    functions = {
+        'abort', 'abs', 'add', 'add!', 'add-method', 'add-new', 'add-new!',
+        'all-superclasses', 'always', 'any?', 'applicable-method?', 'apply',
+        'aref', 'aref-setter', 'as', 'as-lowercase', 'as-lowercase!',
+        'as-uppercase', 'as-uppercase!', 'ash', 'backward-iteration-protocol',
+        'break', 'ceiling', 'ceiling/', 'cerror', 'check-type', 'choose',
+        'choose-by', 'complement', 'compose', 'concatenate', 'concatenate-as',
+        'condition-format-arguments', 'condition-format-string', 'conjoin',
+        'copy-sequence', 'curry', 'default-handler', 'dimension', 'dimensions',
+        'direct-subclasses', 'direct-superclasses', 'disjoin', 'do',
+        'do-handlers', 'element', 'element-setter', 'empty?', 'error', 'even?',
+        'every?', 'false-or', 'fill!', 'find-key', 'find-method', 'first',
+        'first-setter', 'floor', 'floor/', 'forward-iteration-protocol',
+        'function-arguments', 'function-return-values',
+        'function-specializers', 'gcd', 'generic-function-mandatory-keywords',
+        'generic-function-methods', 'head', 'head-setter', 'identity',
+        'initialize', 'instance?', 'integral?', 'intersection',
+        'key-sequence', 'key-test', 'last', 'last-setter', 'lcm', 'limited',
+        'list', 'logand', 'logbit?', 'logior', 'lognot', 'logxor', 'make',
+        'map', 'map-as', 'map-into', 'max', 'member?', 'merge-hash-codes',
+        'min', 'modulo', 'negative', 'negative?', 'next-method',
+        'object-class', 'object-hash', 'odd?', 'one-of', 'pair', 'pop',
+        'pop-last', 'positive?', 'push', 'push-last', 'range', 'rank',
+        'rcurry', 'reduce', 'reduce1', 'remainder', 'remove', 'remove!',
+        'remove-duplicates', 'remove-duplicates!', 'remove-key!',
+        'remove-method', 'replace-elements!', 'replace-subsequence!',
+        'restart-query', 'return-allowed?', 'return-description',
+        'return-query', 'reverse', 'reverse!', 'round', 'round/',
+        'row-major-index', 'second', 'second-setter', 'shallow-copy',
+        'signal', 'singleton', 'size', 'size-setter', 'slot-initialized?',
+        'sort', 'sort!', 'sorted-applicable-methods', 'subsequence-position',
+        'subtype?', 'table-protocol', 'tail', 'tail-setter', 'third',
+        'third-setter', 'truncate', 'truncate/', 'type-error-expected-type',
+        'type-error-value', 'type-for-copy', 'type-union', 'union', 'values',
+        'vector', 'zero?'}
+
+    valid_name = '\\\\?[\\w!&*<>|^$%@\\-+~?/=]+'
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name:
+                lowercase_value = value.lower()
+                if lowercase_value in self.builtins:
+                    yield index, Name.Builtin, value
+                    continue
+                if lowercase_value in self.keywords:
+                    yield index, Keyword, value
+                    continue
+                if lowercase_value in self.functions:
+                    yield index, Name.Builtin, value
+                    continue
+                if lowercase_value in self.operators:
+                    yield index, Operator, value
+                    continue
+            yield index, token, value
+
+    tokens = {
+        'root': [
+            # Whitespace
+            (r'\s+', Whitespace),
+
+            # single line comment
+            (r'//.*?\n', Comment.Single),
+
+            # lid header
+            (r'([a-z0-9-]+)(:)([ \t]*)(.*(?:\n[ \t].+)*)',
+                bygroups(Name.Attribute, Operator, Whitespace, String)),
+
+            default('code')  # no header match, switch to code
+        ],
+        'code': [
+            # Whitespace
+            (r'\s+', Whitespace),
+
+            # single line comment
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+
+            # multi-line comment
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            # strings and characters
+            (r'"', String, 'string'),
+            (r"'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\\'\n])'", String.Char),
+
+            # binary integer
+            (r'#b[01]+', Number.Bin),
+
+            # octal integer
+            (r'#o[0-7]+', Number.Oct),
+
+            # floating point
+            (r'[-+]?(\d*\.\d+(e[-+]?\d+)?|\d+(\.\d*)?e[-+]?\d+)', Number.Float),
+
+            # decimal integer
+            (r'[-+]?\d+', Number.Integer),
+
+            # hex integer
+            (r'#x[0-9a-f]+', Number.Hex),
+
+            # Macro parameters
+            (r'(\?' + valid_name + ')(:)'
+             r'(token|name|variable|expression|body|case-body|\*)',
+                bygroups(Name.Tag, Operator, Name.Builtin)),
+            (r'(\?)(:)(token|name|variable|expression|body|case-body|\*)',
+                bygroups(Name.Tag, Operator, Name.Builtin)),
+            (r'\?' + valid_name, Name.Tag),
+
+            # Punctuation
+            (r'(=>|::|#\(|#\[|##|\?\?|\?=|\?|[(){}\[\],.;])', Punctuation),
+
+            # Most operators are picked up as names and then re-flagged.
+            # This one isn't valid in a name though, so we pick it up now.
+            (r':=', Operator),
+
+            # Pick up #t / #f before we match other stuff with #.
+            (r'#[tf]', Literal),
+
+            # #"foo" style keywords
+            (r'#"', String.Symbol, 'keyword'),
+
+            # #rest, #key, #all-keys, etc.
+            (r'#[a-z0-9-]+', Keyword),
+
+            # required-init-keyword: style keywords.
+            (valid_name + ':', Keyword),
+
+            # class names
+            ('<' + valid_name + '>', Name.Class),
+
+            # define variable forms.
+            (r'\*' + valid_name + r'\*', Name.Variable.Global),
+
+            # define constant forms.
+            (r'\$' + valid_name, Name.Constant),
+
+            # everything else. We re-flag some of these in the method above.
+            (valid_name, Name),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'keyword': [
+            (r'"', String.Symbol, '#pop'),
+            (r'[^\\"]+', String.Symbol),  # all other characters
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-f0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ]
+    }
+
+
+class DylanLidLexer(RegexLexer):
+    """
+    For Dylan LID (Library Interchange Definition) files.
+    """
+
+    name = 'DylanLID'
+    aliases = ['dylan-lid', 'lid']
+    filenames = ['*.lid', '*.hdp']
+    mimetypes = ['text/x-dylan-lid']
+    url = 'http://www.opendylan.org/'
+    version_added = '1.6'
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            # Whitespace
+            (r'\s+', Whitespace),
+
+            # single line comment
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+
+            # lid header
+            (r'(.*?)(:)([ \t]*)(.*(?:\n[ \t].+)*)',
+             bygroups(Name.Attribute, Operator, Whitespace, String)),
+        ]
+    }
+
+
+class DylanConsoleLexer(Lexer):
+    """
+    For Dylan interactive console output.
+
+    This is based on a copy of the ``RubyConsoleLexer``.
+    """
+    name = 'Dylan session'
+    aliases = ['dylan-console', 'dylan-repl']
+    filenames = ['*.dylan-console']
+    mimetypes = ['text/x-dylan-console']
+    url = 'http://www.opendylan.org/'
+    version_added = '1.6'
+    _example = 'dylan-console/console.dylan-console'
+
+    _prompt_re = re.compile(r'\?| ')
+
+    def get_tokens_unprocessed(self, text):
+        dylexer = DylanLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        for match in line_re.finditer(text):
+            line = match.group()
+            m = self._prompt_re.match(line)
+            if m is not None:
+                end = m.end()
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:end])]))
+                curcode += line[end:]
+            else:
+                if curcode:
+                    yield from do_insertions(insertions,
+                                             dylexer.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+                yield match.start(), Generic.Output, line
+        if curcode:
+            yield from do_insertions(insertions,
+                                     dylexer.get_tokens_unprocessed(curcode))
diff --git a/.venv/Lib/site-packages/pygments/lexers/ecl.py b/.venv/Lib/site-packages/pygments/lexers/ecl.py
new file mode 100644 (file)
index 0000000..f1ee3bf
--- /dev/null
@@ -0,0 +1,144 @@
+"""
+    pygments.lexers.ecl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the ECL language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, words
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['ECLLexer']
+
+
+class ECLLexer(RegexLexer):
+    """
+    Lexer for the declarative big-data ECL language.
+    """
+
+    name = 'ECL'
+    url = 'https://hpccsystems.com/training/documentation/ecl-language-reference/html'
+    aliases = ['ecl']
+    filenames = ['*.ecl']
+    mimetypes = ['application/x-ecl']
+    version_added = '1.5'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('statements'),
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+            (r'\/\/.*', Comment.Single),
+            (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment.Multiline),
+        ],
+        'statements': [
+            include('types'),
+            include('keywords'),
+            include('functions'),
+            include('hash'),
+            (r'"', String, 'string'),
+            (r'\'', String, 'string'),
+            (r'(\d+\.\d*|\.\d+|\d+)e[+-]?\d+[lu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+f)f?', Number.Float),
+            (r'0x[0-9a-f]+[lu]*', Number.Hex),
+            (r'0[0-7]+[lu]*', Number.Oct),
+            (r'\d+[lu]*', Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]+', Operator),
+            (r'[{}()\[\],.;]', Punctuation),
+            (r'[a-z_]\w*', Name),
+        ],
+        'hash': [
+            (r'^#.*$', Comment.Preproc),
+        ],
+        'types': [
+            (r'(RECORD|END)\D', Keyword.Declaration),
+            (r'((?:ASCII|BIG_ENDIAN|BOOLEAN|DATA|DECIMAL|EBCDIC|INTEGER|PATTERN|'
+             r'QSTRING|REAL|RECORD|RULE|SET OF|STRING|TOKEN|UDECIMAL|UNICODE|'
+             r'UNSIGNED|VARSTRING|VARUNICODE)\d*)(\s+)',
+             bygroups(Keyword.Type, Whitespace)),
+        ],
+        'keywords': [
+            (words((
+                'APPLY', 'ASSERT', 'BUILD', 'BUILDINDEX', 'EVALUATE', 'FAIL',
+                'KEYDIFF', 'KEYPATCH', 'LOADXML', 'NOTHOR', 'NOTIFY', 'OUTPUT',
+                'PARALLEL', 'SEQUENTIAL', 'SOAPCALL', 'CHECKPOINT', 'DEPRECATED',
+                'FAILCODE', 'FAILMESSAGE', 'FAILURE', 'GLOBAL', 'INDEPENDENT',
+                'ONWARNING', 'PERSIST', 'PRIORITY', 'RECOVERY', 'STORED', 'SUCCESS',
+                'WAIT', 'WHEN'), suffix=r'\b'),
+             Keyword.Reserved),
+            # These are classed differently, check later
+            (words((
+                'ALL', 'AND', 'ANY', 'AS', 'ATMOST', 'BEFORE', 'BEGINC++', 'BEST',
+                'BETWEEN', 'CASE', 'CONST', 'COUNTER', 'CSV', 'DESCEND', 'ENCRYPT',
+                'ENDC++', 'ENDMACRO', 'EXCEPT', 'EXCLUSIVE', 'EXPIRE', 'EXPORT',
+                'EXTEND', 'FALSE', 'FEW', 'FIRST', 'FLAT', 'FULL', 'FUNCTION',
+                'GROUP', 'HEADER', 'HEADING', 'HOLE', 'IFBLOCK', 'IMPORT', 'IN',
+                'JOINED', 'KEEP', 'KEYED', 'LAST', 'LEFT', 'LIMIT', 'LOAD', 'LOCAL',
+                'LOCALE', 'LOOKUP', 'MACRO', 'MANY', 'MAXCOUNT', 'MAXLENGTH',
+                'MIN SKEW', 'MODULE', 'INTERFACE', 'NAMED', 'NOCASE', 'NOROOT',
+                'NOSCAN', 'NOSORT', 'NOT', 'OF', 'ONLY', 'OPT', 'OR', 'OUTER',
+                'OVERWRITE', 'PACKED', 'PARTITION', 'PENALTY', 'PHYSICALLENGTH',
+                'PIPE', 'QUOTE', 'RELATIONSHIP', 'REPEAT', 'RETURN', 'RIGHT',
+                'SCAN', 'SELF', 'SEPARATOR', 'SERVICE', 'SHARED', 'SKEW', 'SKIP',
+                'SQL', 'STORE', 'TERMINATOR', 'THOR', 'THRESHOLD', 'TOKEN',
+                'TRANSFORM', 'TRIM', 'TRUE', 'TYPE', 'UNICODEORDER', 'UNSORTED',
+                'VALIDATE', 'VIRTUAL', 'WHOLE', 'WILD', 'WITHIN', 'XML', 'XPATH',
+                '__COMPRESSED__'), suffix=r'\b'),
+             Keyword.Reserved),
+        ],
+        'functions': [
+            (words((
+                'ABS', 'ACOS', 'ALLNODES', 'ASCII', 'ASIN', 'ASSTRING', 'ATAN',
+                'ATAN2', 'AVE', 'CASE', 'CHOOSE', 'CHOOSEN', 'CHOOSESETS',
+                'CLUSTERSIZE', 'COMBINE', 'CORRELATION', 'COS', 'COSH', 'COUNT',
+                'COVARIANCE', 'CRON', 'DATASET', 'DEDUP', 'DEFINE', 'DENORMALIZE',
+                'DISTRIBUTE', 'DISTRIBUTED', 'DISTRIBUTION', 'EBCDIC', 'ENTH',
+                'ERROR', 'EVALUATE', 'EVENT', 'EVENTEXTRA', 'EVENTNAME', 'EXISTS',
+                'EXP', 'FAILCODE', 'FAILMESSAGE', 'FETCH', 'FROMUNICODE',
+                'GETISVALID', 'GLOBAL', 'GRAPH', 'GROUP', 'HASH', 'HASH32',
+                'HASH64', 'HASHCRC', 'HASHMD5', 'HAVING', 'IF', 'INDEX',
+                'INTFORMAT', 'ISVALID', 'ITERATE', 'JOIN', 'KEYUNICODE', 'LENGTH',
+                'LIBRARY', 'LIMIT', 'LN', 'LOCAL', 'LOG', 'LOOP', 'MAP', 'MATCHED',
+                'MATCHLENGTH', 'MATCHPOSITION', 'MATCHTEXT', 'MATCHUNICODE', 'MAX',
+                'MERGE', 'MERGEJOIN', 'MIN', 'NOLOCAL', 'NONEMPTY', 'NORMALIZE',
+                'PARSE', 'PIPE', 'POWER', 'PRELOAD', 'PROCESS', 'PROJECT', 'PULL',
+                'RANDOM', 'RANGE', 'RANK', 'RANKED', 'REALFORMAT', 'RECORDOF',
+                'REGEXFIND', 'REGEXREPLACE', 'REGROUP', 'REJECTED', 'ROLLUP',
+                'ROUND', 'ROUNDUP', 'ROW', 'ROWDIFF', 'SAMPLE', 'SET', 'SIN',
+                'SINH', 'SIZEOF', 'SOAPCALL', 'SORT', 'SORTED', 'SQRT', 'STEPPED',
+                'STORED', 'SUM', 'TABLE', 'TAN', 'TANH', 'THISNODE', 'TOPN',
+                'TOUNICODE', 'TRANSFER', 'TRIM', 'TRUNCATE', 'TYPEOF', 'UNGROUP',
+                'UNICODEORDER', 'VARIANCE', 'WHICH', 'WORKUNIT', 'XMLDECODE',
+                'XMLENCODE', 'XMLTEXT', 'XMLUNICODE'), suffix=r'\b'),
+             Name.Function),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\'', String, '#pop'),
+            (r'[^"\']+', String),
+        ],
+    }
+
+    def analyse_text(text):
+        """This is very difficult to guess relative to other business languages.
+        -> in conjunction with BEGIN/END seems relatively rare though."""
+        result = 0
+
+        if '->' in text:
+            result += 0.01
+        if 'BEGIN' in text:
+            result += 0.01
+        if 'END' in text:
+            result += 0.01
+
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/eiffel.py b/.venv/Lib/site-packages/pygments/lexers/eiffel.py
new file mode 100644 (file)
index 0000000..691c718
--- /dev/null
@@ -0,0 +1,68 @@
+"""
+    pygments.lexers.eiffel
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Eiffel language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words, bygroups
+from pygments.token import Comment, Operator, Keyword, Name, String, Number, \
+    Punctuation, Whitespace
+
+__all__ = ['EiffelLexer']
+
+
+class EiffelLexer(RegexLexer):
+    """
+    For Eiffel source code.
+    """
+    name = 'Eiffel'
+    url = 'https://www.eiffel.com'
+    aliases = ['eiffel']
+    filenames = ['*.e']
+    mimetypes = ['text/x-eiffel']
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Whitespace),
+            (r'--.*?$', Comment.Single),
+            (r'[^\S\n]+', Whitespace),
+            # Please note that keyword and operator are case insensitive.
+            (r'(?i)(true|false|void|current|result|precursor)\b', Keyword.Constant),
+            (r'(?i)(not|xor|implies|or)\b', Operator.Word),
+            (r'(?i)(and)(?:(\s+)(then))?\b',
+             bygroups(Operator.Word, Whitespace, Operator.Word)),
+            (r'(?i)(or)(?:(\s+)(else))?\b',
+             bygroups(Operator.Word, Whitespace, Operator.Word)),
+            (words((
+                'across', 'agent', 'alias', 'all', 'as', 'assign', 'attached',
+                'attribute', 'check', 'class', 'convert', 'create', 'debug',
+                'deferred', 'detachable', 'do', 'else', 'elseif', 'end', 'ensure',
+                'expanded', 'export', 'external', 'feature', 'from', 'frozen', 'if',
+                'inherit', 'inspect', 'invariant', 'like', 'local', 'loop', 'none',
+                'note', 'obsolete', 'old', 'once', 'only', 'redefine', 'rename',
+                'require', 'rescue', 'retry', 'select', 'separate', 'then',
+                'undefine', 'until', 'variant', 'when'), prefix=r'(?i)\b', suffix=r'\b'),
+             Keyword.Reserved),
+            (r'"\[([^\]%]|%(.|\n)|\][^"])*?\]"', String),
+            (r'"([^"%\n]|%.)*?"', String),
+            include('numbers'),
+            (r"'([^'%]|%'|%%)'", String.Char),
+            (r"(//|\\\\|>=|<=|:=|/=|~|/~|[\\?!#%&@|+/\-=>*$<^\[\]])", Operator),
+            (r"([{}():;,.])", Punctuation),
+            (r'([a-z]\w*)|([A-Z][A-Z0-9_]*[a-z]\w*)', Name),
+            (r'([A-Z][A-Z0-9_]*)', Name.Class),
+            (r'\n+', Whitespace),
+        ],
+        'numbers': [
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'0[bB][01]+', Number.Bin),
+            (r'0[cC][0-7]+', Number.Oct),
+            (r'([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)', Number.Float),
+            (r'[0-9]+', Number.Integer),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/elm.py b/.venv/Lib/site-packages/pygments/lexers/elm.py
new file mode 100644 (file)
index 0000000..cebbbf0
--- /dev/null
@@ -0,0 +1,123 @@
+"""
+    pygments.lexers.elm
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Elm programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include, bygroups
+from pygments.token import Comment, Keyword, Name, Number, Punctuation, \
+    String, Whitespace
+
+__all__ = ['ElmLexer']
+
+
+class ElmLexer(RegexLexer):
+    """
+    For Elm source code.
+    """
+
+    name = 'Elm'
+    url = 'https://elm-lang.org/'
+    aliases = ['elm']
+    filenames = ['*.elm']
+    mimetypes = ['text/x-elm']
+    version_added = '2.1'
+
+    validName = r'[a-z_][a-zA-Z0-9_\']*'
+
+    specialName = r'^main '
+
+    builtinOps = (
+        '~', '||', '|>', '|', '`', '^', '\\', '\'', '>>', '>=', '>', '==',
+        '=', '<~', '<|', '<=', '<<', '<-', '<', '::', ':', '/=', '//', '/',
+        '..', '.', '->', '-', '++', '+', '*', '&&', '%',
+    )
+
+    reservedWords = words((
+        'alias', 'as', 'case', 'else', 'if', 'import', 'in',
+        'let', 'module', 'of', 'port', 'then', 'type', 'where',
+    ), suffix=r'\b')
+
+    tokens = {
+        'root': [
+
+            # Comments
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r'--.*', Comment.Single),
+
+            # Whitespace
+            (r'\s+', Whitespace),
+
+            # Strings
+            (r'"', String, 'doublequote'),
+
+            # Modules
+            (r'^(\s*)(module)(\s*)', bygroups(Whitespace, Keyword.Namespace,
+                Whitespace), 'imports'),
+
+            # Imports
+            (r'^(\s*)(import)(\s*)', bygroups(Whitespace, Keyword.Namespace,
+                Whitespace), 'imports'),
+
+            # Shaders
+            (r'\[glsl\|.*', Name.Entity, 'shader'),
+
+            # Keywords
+            (reservedWords, Keyword.Reserved),
+
+            # Types
+            (r'[A-Z][a-zA-Z0-9_]*', Keyword.Type),
+
+            # Main
+            (specialName, Keyword.Reserved),
+
+            # Prefix Operators
+            (words((builtinOps), prefix=r'\(', suffix=r'\)'), Name.Function),
+
+            # Infix Operators
+            (words(builtinOps), Name.Function),
+
+            # Numbers
+            include('numbers'),
+
+            # Variable Names
+            (validName, Name.Variable),
+
+            # Parens
+            (r'[,()\[\]{}]', Punctuation),
+
+        ],
+
+        'comment': [
+            (r'-(?!\})', Comment.Multiline),
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r'[^-}]', Comment.Multiline),
+            (r'-\}', Comment.Multiline, '#pop'),
+        ],
+
+        'doublequote': [
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\[nrfvb\\"]', String.Escape),
+            (r'[^"]', String),
+            (r'"', String, '#pop'),
+        ],
+
+        'imports': [
+            (r'\w+(\.\w+)*', Name.Class, '#pop'),
+        ],
+
+        'numbers': [
+            (r'_?\d+\.(?=\d+)', Number.Float),
+            (r'_?\d+', Number.Integer),
+        ],
+
+        'shader': [
+            (r'\|(?!\])', Name.Entity),
+            (r'\|\]', Name.Entity, '#pop'),
+            (r'(.*)(\n)', bygroups(Name.Entity, Whitespace)),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/elpi.py b/.venv/Lib/site-packages/pygments/lexers/elpi.py
new file mode 100644 (file)
index 0000000..5e4b1e5
--- /dev/null
@@ -0,0 +1,175 @@
+"""
+    pygments.lexers.elpi
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the `Elpi <http://github.com/LPCIC/elpi>`_ programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include, using
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['ElpiLexer']
+
+from pygments.lexers.theorem import CoqLexer
+
+class ElpiLexer(RegexLexer):
+    """
+    Lexer for the Elpi programming language.
+    """
+
+    name = 'Elpi'
+    url = 'http://github.com/LPCIC/elpi'
+    aliases = ['elpi']
+    filenames = ['*.elpi']
+    mimetypes = ['text/x-elpi']
+    version_added = '2.11'
+
+    lcase_re = r"[a-z]"
+    ucase_re = r"[A-Z]"
+    digit_re = r"[0-9]"
+    schar2_re = r"([+*^?/<>`'@#~=&!])"
+    schar_re = rf"({schar2_re}|-|\$|_)"
+    idchar_re = rf"({lcase_re}|{ucase_re}|{digit_re}|{schar_re})"
+    idcharstarns_re = rf"({idchar_re}*(\.({lcase_re}|{ucase_re}){idchar_re}*)*)"
+    symbchar_re = rf"({lcase_re}|{ucase_re}|{digit_re}|{schar_re}|:)"
+    constant_re = rf"({ucase_re}{idchar_re}*|{lcase_re}{idcharstarns_re}|{schar2_re}{symbchar_re}*|_{idchar_re}+)"
+    symbol_re = r"(,|<=>|->|:-|;|\?-|->|&|=>|\bas\b|\buvar\b|<|=<|=|==|>=|>|\bi<|\bi=<|\bi>=|\bi>|\bis\b|\br<|\br=<|\br>=|\br>|\bs<|\bs=<|\bs>=|\bs>|@|::|\[\]|`->|`:|`:=|\^|-|\+|\bi-|\bi\+|r-|r\+|/|\*|\bdiv\b|\bi\*|\bmod\b|\br\*|~|\bi~|\br~)"
+    escape_re = rf"\(({constant_re}|{symbol_re})\)"
+    const_sym_re = rf"({constant_re}|{symbol_re}|{escape_re})"
+
+    tokens = {
+        'root': [
+            include('elpi')
+        ],
+
+        'elpi': [
+            include('_elpi-comment'),
+
+            (r"(:before|:after|:if|:name)(\s*)(\")",
+             bygroups(Keyword.Mode, Text.Whitespace, String.Double),
+             'elpi-string'),
+            (r"(:index)(\s*)(\()", bygroups(Keyword.Mode, Text.Whitespace, Punctuation),
+             'elpi-indexing-expr'),
+            (rf"\b(external pred|pred)(\s+)({const_sym_re})",
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
+             'elpi-pred-item'),
+            (rf"\b(external type|type)(\s+)(({const_sym_re}(,\s*)?)+)",
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
+             'elpi-type'),
+            (rf"\b(kind)(\s+)(({const_sym_re}|,)+)",
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
+             'elpi-type'),
+            (rf"\b(typeabbrev)(\s+)({const_sym_re})",
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
+             'elpi-type'),
+            (r"\b(typeabbrev)(\s+)(\([^)]+\))",
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
+             'elpi-type'),
+            (r"\b(accumulate)(\s+)(\")",
+             bygroups(Keyword.Declaration, Text.Whitespace, String.Double),
+             'elpi-string'),
+            (rf"\b(accumulate|namespace|local)(\s+)({constant_re})",
+             bygroups(Keyword.Declaration, Text.Whitespace, Text)),
+            (rf"\b(shorten)(\s+)({constant_re}\.)",
+             bygroups(Keyword.Declaration, Text.Whitespace, Text)),
+            (r"\b(pi|sigma)(\s+)([a-zA-Z][A-Za-z0-9_ ]*)(\\)",
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Variable, Text)),
+            (rf"\b(constraint)(\s+)(({const_sym_re}(\s+)?)+)",
+             bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
+             'elpi-chr-rule-start'),
+
+            (rf"(?=[A-Z_]){constant_re}", Name.Variable),
+            (rf"(?=[a-z_])({constant_re}|_)\\", Name.Variable),
+            (r"_", Name.Variable),
+            (rf"({symbol_re}|!|=>|;)", Keyword.Declaration),
+            (constant_re, Text),
+            (r"\[|\]|\||=>", Keyword.Declaration),
+            (r'"', String.Double, 'elpi-string'),
+            (r'`', String.Double, 'elpi-btick'),
+            (r'\'', String.Double, 'elpi-tick'),
+            (r'\{\{', Punctuation, 'elpi-quote'),
+            (r'\{[^\{]', Text, 'elpi-spill'),
+            (r"\(", Punctuation, 'elpi-in-parens'),
+            (r'\d[\d_]*', Number.Integer),
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
+            (r"[\+\*\-/\^\.]", Operator),
+        ],
+        '_elpi-comment': [
+            (r'%[^\n]*\n', Comment),
+            (r'/(?:\\\n)?[*](?:[^*]|[*](?!(?:\\\n)?/))*[*](?:\\\n)?/', Comment),
+            (r"\s+", Text.Whitespace),
+        ],
+        'elpi-indexing-expr':[
+            (r'[0-9 _]+', Number.Integer),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'elpi-type': [
+            (r"(ctype\s+)(\")", bygroups(Keyword.Type, String.Double), 'elpi-string'),
+            (r'->', Keyword.Type),
+            (constant_re, Keyword.Type),
+            (r"\(|\)", Keyword.Type),
+            (r"\.", Text, '#pop'),
+            include('_elpi-comment'),
+        ],
+        'elpi-chr-rule-start': [
+            (r"\{", Punctuation, 'elpi-chr-rule'),
+            include('_elpi-comment'),
+        ],
+        'elpi-chr-rule': [
+           (r"\brule\b", Keyword.Declaration),
+           (r"\\", Keyword.Declaration),
+           (r"\}", Punctuation, '#pop:2'),
+           include('elpi'),
+        ],
+        'elpi-pred-item': [
+            (r"[io]:", Keyword.Mode, 'elpi-ctype'),
+            (r"\.", Text, '#pop'),
+            include('_elpi-comment'),
+        ],
+        'elpi-ctype': [
+            (r"(ctype\s+)(\")", bygroups(Keyword.Type, String.Double), 'elpi-string'),
+            (r'->', Keyword.Type),
+            (constant_re, Keyword.Type),
+            (r"\(|\)", Keyword.Type),
+            (r",", Text, '#pop'),
+            (r"\.", Text, '#pop:2'),
+            include('_elpi-comment'),
+        ],
+        'elpi-btick': [
+            (r'[^` ]+', String.Double),
+            (r'`', String.Double, '#pop'),
+        ],
+        'elpi-tick': [
+            (r'[^\' ]+', String.Double),
+            (r'\'', String.Double, '#pop'),
+        ],
+        'elpi-string': [
+            (r'[^\"]+', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'elpi-quote': [
+            (r'\}\}', Punctuation, '#pop'),
+            (r"\s+", Text.Whitespace),
+            (r"(lp:)(\{\{)", bygroups(Number, Punctuation), 'elpi-quote-exit'),
+            (rf"(lp:)((?=[A-Z_]){constant_re})", bygroups(Number, Name.Variable)),
+            (r"((?!lp:|\}\}).)+", using(CoqLexer)),
+        ],
+        'elpi-quote-exit': [
+            include('elpi'),
+            (r'\}\}', Punctuation, '#pop'),
+        ],
+        'elpi-spill': [
+            (r'\{[^\{]', Text, '#push'),
+            (r'\}[^\}]', Text, '#pop'),
+            include('elpi'),
+        ],
+        'elpi-in-parens': [
+            (r"\(", Punctuation, '#push'),
+            include('elpi'),
+            (r"\)", Punctuation, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/email.py b/.venv/Lib/site-packages/pygments/lexers/email.py
new file mode 100644 (file)
index 0000000..ea071c8
--- /dev/null
@@ -0,0 +1,132 @@
+"""
+    pygments.lexers.email
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the raw E-mail.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, DelegatingLexer, bygroups
+from pygments.lexers.mime import MIMELexer
+from pygments.token import Text, Keyword, Name, String, Number, Comment
+from pygments.util import get_bool_opt
+
+__all__ = ["EmailLexer"]
+
+
+class EmailHeaderLexer(RegexLexer):
+    """
+    Sub-lexer for raw E-mail. This lexer only process header part of e-mail.
+
+    .. versionadded:: 2.5
+    """
+
+    def __init__(self, **options):
+        super().__init__(**options)
+        self.highlight_x = get_bool_opt(options, "highlight-X-header", False)
+
+    def get_x_header_tokens(self, match):
+        if self.highlight_x:
+            # field
+            yield match.start(1), Name.Tag, match.group(1)
+
+            # content
+            default_actions = self.get_tokens_unprocessed(
+                match.group(2), stack=("root", "header"))
+            yield from default_actions
+        else:
+            # lowlight
+            yield match.start(1), Comment.Special, match.group(1)
+            yield match.start(2), Comment.Multiline, match.group(2)
+
+    tokens = {
+        "root": [
+            (r"^(?:[A-WYZ]|X400)[\w\-]*:", Name.Tag, "header"),
+            (r"^(X-(?:\w[\w\-]*:))([\s\S]*?\n)(?![ \t])", get_x_header_tokens),
+        ],
+        "header": [
+            # folding
+            (r"\n[ \t]", Text.Whitespace),
+            (r"\n(?![ \t])", Text.Whitespace, "#pop"),
+
+            # keywords
+            (r"\bE?SMTPS?\b", Keyword),
+            (r"\b(?:HE|EH)LO\b", Keyword),
+
+            # mailbox
+            (r"[\w\.\-\+=]+@[\w\.\-]+", Name.Label),
+            (r"<[\w\.\-\+=]+@[\w\.\-]+>", Name.Label),
+
+            # domain
+            (r"\b(\w[\w\.-]*\.[\w\.-]*\w[a-zA-Z]+)\b", Name.Function),
+
+            # IPv4
+            (r"(?<=\b)(?:(?:25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?)\.){3}(?:25[0"
+             r"-5]|2[0-4][0-9]|1?[0-9][0-9]?)(?=\b)",
+             Number.Integer),
+
+            # IPv6
+            (r"(?<=\b)([0-9a-fA-F]{1,4}:){1,7}:(?!\b)", Number.Hex),
+            (r"(?<=\b):((:[0-9a-fA-F]{1,4}){1,7}|:)(?=\b)", Number.Hex),
+            (r"(?<=\b)([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}(?=\b)", Number.Hex),
+            (r"(?<=\b)([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}(?=\b)", Number.Hex),
+            (r"(?<=\b)[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})(?=\b)", Number.Hex),
+            (r"(?<=\b)fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}(?=\b)", Number.Hex),
+            (r"(?<=\b)([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}(?=\b)", Number.Hex),
+            (r"(?<=\b)([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}(?=\b)",
+             Number.Hex),
+            (r"(?<=\b)([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}(?=\b)",
+             Number.Hex),
+            (r"(?<=\b)([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}(?=\b)",
+             Number.Hex),
+            (r"(?<=\b)::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}"
+             r"[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}"
+             r"[0-9])(?=\b)",
+             Number.Hex),
+            (r"(?<=\b)([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9])"
+             r"{0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])(?=\b)",
+             Number.Hex),
+
+            # Date time
+            (r"(?:(Sun|Mon|Tue|Wed|Thu|Fri|Sat),\s+)?(0[1-9]|[1-2]?[0-9]|3["
+             r"01])\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+("
+             r"19[0-9]{2}|[2-9][0-9]{3})\s+(2[0-3]|[0-1][0-9]):([0-5][0-9])"
+             r"(?::(60|[0-5][0-9]))?(?:\.\d{1,5})?\s+([-\+][0-9]{2}[0-5][0-"
+             r"9]|\(?(?:UTC?|GMT|(?:E|C|M|P)(?:ST|ET|DT)|[A-IK-Z])\)?)",
+             Name.Decorator),
+
+            # RFC-2047 encoded string
+            (r"(=\?)([\w-]+)(\?)([BbQq])(\?)([\[\w!\"#$%&\'()*+,-./:;<=>@[\\"
+             r"\]^_`{|}~]+)(\?=)",
+             bygroups(String.Affix, Name.Constant, String.Affix, Keyword.Constant,
+                      String.Affix, Number.Hex, String.Affix)),
+
+            # others
+            (r'[\s]+', Text.Whitespace),
+            (r'[\S]', Text),
+        ],
+    }
+
+
+class EmailLexer(DelegatingLexer):
+    """
+    Lexer for raw E-mail.
+
+    Additional options accepted:
+
+    `highlight-X-header`
+        Highlight the fields of ``X-`` user-defined email header. (default:
+        ``False``).
+    """
+
+    name = "E-mail"
+    aliases = ["email", "eml"]
+    filenames = ["*.eml"]
+    mimetypes = ["message/rfc822"]
+    url = "https://en.wikipedia.org/wiki/Email#Message_format"
+    version_added = '2.5'
+
+    def __init__(self, **options):
+        super().__init__(EmailHeaderLexer, MIMELexer, Comment, **options)
diff --git a/.venv/Lib/site-packages/pygments/lexers/erlang.py b/.venv/Lib/site-packages/pygments/lexers/erlang.py
new file mode 100644 (file)
index 0000000..120f504
--- /dev/null
@@ -0,0 +1,526 @@
+"""
+    pygments.lexers.erlang
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Erlang.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, words, do_insertions, \
+    include, default, line_re
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+
+__all__ = ['ErlangLexer', 'ErlangShellLexer', 'ElixirConsoleLexer',
+           'ElixirLexer']
+
+
+class ErlangLexer(RegexLexer):
+    """
+    For the Erlang functional programming language.
+    """
+
+    name = 'Erlang'
+    url = 'https://www.erlang.org/'
+    aliases = ['erlang']
+    filenames = ['*.erl', '*.hrl', '*.es', '*.escript']
+    mimetypes = ['text/x-erlang']
+    version_added = '0.9'
+
+    keywords = (
+        'after', 'begin', 'case', 'catch', 'cond', 'end', 'fun', 'if',
+        'let', 'of', 'query', 'receive', 'try', 'when',
+    )
+
+    builtins = (  # See erlang(3) man page
+        'abs', 'append_element', 'apply', 'atom_to_list', 'binary_to_list',
+        'bitstring_to_list', 'binary_to_term', 'bit_size', 'bump_reductions',
+        'byte_size', 'cancel_timer', 'check_process_code', 'delete_module',
+        'demonitor', 'disconnect_node', 'display', 'element', 'erase', 'exit',
+        'float', 'float_to_list', 'fun_info', 'fun_to_list',
+        'function_exported', 'garbage_collect', 'get', 'get_keys',
+        'group_leader', 'hash', 'hd', 'integer_to_list', 'iolist_to_binary',
+        'iolist_size', 'is_atom', 'is_binary', 'is_bitstring', 'is_boolean',
+        'is_builtin', 'is_float', 'is_function', 'is_integer', 'is_list',
+        'is_number', 'is_pid', 'is_port', 'is_process_alive', 'is_record',
+        'is_reference', 'is_tuple', 'length', 'link', 'list_to_atom',
+        'list_to_binary', 'list_to_bitstring', 'list_to_existing_atom',
+        'list_to_float', 'list_to_integer', 'list_to_pid', 'list_to_tuple',
+        'load_module', 'localtime_to_universaltime', 'make_tuple', 'md5',
+        'md5_final', 'md5_update', 'memory', 'module_loaded', 'monitor',
+        'monitor_node', 'node', 'nodes', 'open_port', 'phash', 'phash2',
+        'pid_to_list', 'port_close', 'port_command', 'port_connect',
+        'port_control', 'port_call', 'port_info', 'port_to_list',
+        'process_display', 'process_flag', 'process_info', 'purge_module',
+        'put', 'read_timer', 'ref_to_list', 'register', 'resume_process',
+        'round', 'send', 'send_after', 'send_nosuspend', 'set_cookie',
+        'setelement', 'size', 'spawn', 'spawn_link', 'spawn_monitor',
+        'spawn_opt', 'split_binary', 'start_timer', 'statistics',
+        'suspend_process', 'system_flag', 'system_info', 'system_monitor',
+        'system_profile', 'term_to_binary', 'tl', 'trace', 'trace_delivered',
+        'trace_info', 'trace_pattern', 'trunc', 'tuple_size', 'tuple_to_list',
+        'universaltime_to_localtime', 'unlink', 'unregister', 'whereis'
+    )
+
+    operators = r'(\+\+?|--?|\*|/|<|>|/=|=:=|=/=|=<|>=|==?|<-|!|\?)'
+    word_operators = (
+        'and', 'andalso', 'band', 'bnot', 'bor', 'bsl', 'bsr', 'bxor',
+        'div', 'not', 'or', 'orelse', 'rem', 'xor'
+    )
+
+    atom_re = r"(?:[a-z]\w*|'[^\n']*[^\\]')"
+
+    variable_re = r'(?:[A-Z_]\w*)'
+
+    esc_char_re = r'[bdefnrstv\'"\\]'
+    esc_octal_re = r'[0-7][0-7]?[0-7]?'
+    esc_hex_re = r'(?:x[0-9a-fA-F]{2}|x\{[0-9a-fA-F]+\})'
+    esc_ctrl_re = r'\^[a-zA-Z]'
+    escape_re = r'(?:\\(?:'+esc_char_re+r'|'+esc_octal_re+r'|'+esc_hex_re+r'|'+esc_ctrl_re+r'))'
+
+    macro_re = r'(?:'+variable_re+r'|'+atom_re+r')'
+
+    base_re = r'(?:[2-9]|[12][0-9]|3[0-6])'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'(%.*)(\n)', bygroups(Comment, Whitespace)),
+            (words(keywords, suffix=r'\b'), Keyword),
+            (words(builtins, suffix=r'\b'), Name.Builtin),
+            (words(word_operators, suffix=r'\b'), Operator.Word),
+            (r'^-', Punctuation, 'directive'),
+            (operators, Operator),
+            (r'"', String, 'string'),
+            (r'<<', Name.Label),
+            (r'>>', Name.Label),
+            ('(' + atom_re + ')(:)', bygroups(Name.Namespace, Punctuation)),
+            ('(?:^|(?<=:))(' + atom_re + r')(\s*)(\()',
+             bygroups(Name.Function, Whitespace, Punctuation)),
+            (r'[+-]?' + base_re + r'#[0-9a-zA-Z]+', Number.Integer),
+            (r'[+-]?\d+', Number.Integer),
+            (r'[+-]?\d+.\d+', Number.Float),
+            (r'[]\[:_@\".{}()|;,]', Punctuation),
+            (variable_re, Name.Variable),
+            (atom_re, Name),
+            (r'\?'+macro_re, Name.Constant),
+            (r'\$(?:'+escape_re+r'|\\[ %]|[^\\])', String.Char),
+            (r'#'+atom_re+r'(:?\.'+atom_re+r')?', Name.Label),
+
+            # Erlang script shebang
+            (r'\A#!.+\n', Comment.Hashbang),
+
+            # EEP 43: Maps
+            # http://www.erlang.org/eeps/eep-0043.html
+            (r'#\{', Punctuation, 'map_key'),
+        ],
+        'string': [
+            (escape_re, String.Escape),
+            (r'"', String, '#pop'),
+            (r'~[0-9.*]*[~#+BPWXb-ginpswx]', String.Interpol),
+            (r'[^"\\~]+', String),
+            (r'~', String),
+        ],
+        'directive': [
+            (r'(define)(\s*)(\()('+macro_re+r')',
+             bygroups(Name.Entity, Whitespace, Punctuation, Name.Constant), '#pop'),
+            (r'(record)(\s*)(\()('+macro_re+r')',
+             bygroups(Name.Entity, Whitespace, Punctuation, Name.Label), '#pop'),
+            (atom_re, Name.Entity, '#pop'),
+        ],
+        'map_key': [
+            include('root'),
+            (r'=>', Punctuation, 'map_val'),
+            (r':=', Punctuation, 'map_val'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'map_val': [
+            include('root'),
+            (r',', Punctuation, '#pop'),
+            (r'(?=\})', Punctuation, '#pop'),
+        ],
+    }
+
+
+class ErlangShellLexer(Lexer):
+    """
+    Shell sessions in erl (for Erlang code).
+    """
+    name = 'Erlang erl session'
+    aliases = ['erl']
+    filenames = ['*.erl-sh']
+    mimetypes = ['text/x-erl-shellsession']
+    url = 'https://www.erlang.org/'
+    version_added = '1.1'
+
+    _prompt_re = re.compile(r'(?:\([\w@_.]+\))?\d+>(?=\s|\Z)')
+
+    def get_tokens_unprocessed(self, text):
+        erlexer = ErlangLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        for match in line_re.finditer(text):
+            line = match.group()
+            m = self._prompt_re.match(line)
+            if m is not None:
+                end = m.end()
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:end])]))
+                curcode += line[end:]
+            else:
+                if curcode:
+                    yield from do_insertions(insertions,
+                                             erlexer.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+                if line.startswith('*'):
+                    yield match.start(), Generic.Traceback, line
+                else:
+                    yield match.start(), Generic.Output, line
+        if curcode:
+            yield from do_insertions(insertions,
+                                     erlexer.get_tokens_unprocessed(curcode))
+
+
+def gen_elixir_string_rules(name, symbol, token):
+    states = {}
+    states['string_' + name] = [
+        (rf'[^#{symbol}\\]+', token),
+        include('escapes'),
+        (r'\\.', token),
+        (rf'({symbol})', bygroups(token), "#pop"),
+        include('interpol')
+    ]
+    return states
+
+
+def gen_elixir_sigstr_rules(term, term_class, token, interpol=True):
+    if interpol:
+        return [
+            (rf'[^#{term_class}\\]+', token),
+            include('escapes'),
+            (r'\\.', token),
+            (rf'{term}[a-zA-Z]*', token, '#pop'),
+            include('interpol')
+        ]
+    else:
+        return [
+            (rf'[^{term_class}\\]+', token),
+            (r'\\.', token),
+            (rf'{term}[a-zA-Z]*', token, '#pop'),
+        ]
+
+
+class ElixirLexer(RegexLexer):
+    """
+    For the Elixir language.
+    """
+
+    name = 'Elixir'
+    url = 'https://elixir-lang.org'
+    aliases = ['elixir', 'ex', 'exs']
+    filenames = ['*.ex', '*.eex', '*.exs', '*.leex']
+    mimetypes = ['text/x-elixir']
+    version_added = '1.5'
+
+    KEYWORD = ('fn', 'do', 'end', 'after', 'else', 'rescue', 'catch')
+    KEYWORD_OPERATOR = ('not', 'and', 'or', 'when', 'in')
+    BUILTIN = (
+        'case', 'cond', 'for', 'if', 'unless', 'try', 'receive', 'raise',
+        'quote', 'unquote', 'unquote_splicing', 'throw', 'super',
+    )
+    BUILTIN_DECLARATION = (
+        'def', 'defp', 'defmodule', 'defprotocol', 'defmacro', 'defmacrop',
+        'defdelegate', 'defexception', 'defstruct', 'defimpl', 'defcallback',
+    )
+
+    BUILTIN_NAMESPACE = ('import', 'require', 'use', 'alias')
+    CONSTANT = ('nil', 'true', 'false')
+
+    PSEUDO_VAR = ('_', '__MODULE__', '__DIR__', '__ENV__', '__CALLER__')
+
+    OPERATORS3 = (
+        '<<<', '>>>', '|||', '&&&', '^^^', '~~~', '===', '!==',
+        '~>>', '<~>', '|~>', '<|>',
+    )
+    OPERATORS2 = (
+        '==', '!=', '<=', '>=', '&&', '||', '<>', '++', '--', '|>', '=~',
+        '->', '<-', '|', '.', '=', '~>', '<~',
+    )
+    OPERATORS1 = ('<', '>', '+', '-', '*', '/', '!', '^', '&')
+
+    PUNCTUATION = (
+        '\\\\', '<<', '>>', '=>', '(', ')', ':', ';', ',', '[', ']',
+    )
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name:
+                if value in self.KEYWORD:
+                    yield index, Keyword, value
+                elif value in self.KEYWORD_OPERATOR:
+                    yield index, Operator.Word, value
+                elif value in self.BUILTIN:
+                    yield index, Keyword, value
+                elif value in self.BUILTIN_DECLARATION:
+                    yield index, Keyword.Declaration, value
+                elif value in self.BUILTIN_NAMESPACE:
+                    yield index, Keyword.Namespace, value
+                elif value in self.CONSTANT:
+                    yield index, Name.Constant, value
+                elif value in self.PSEUDO_VAR:
+                    yield index, Name.Builtin.Pseudo, value
+                else:
+                    yield index, token, value
+            else:
+                yield index, token, value
+
+    def gen_elixir_sigil_rules():
+        # all valid sigil terminators (excluding heredocs)
+        terminators = [
+            (r'\{', r'\}', '}',   'cb'),
+            (r'\[', r'\]', r'\]', 'sb'),
+            (r'\(', r'\)', ')',   'pa'),
+            ('<',   '>',   '>',   'ab'),
+            ('/',   '/',   '/',   'slas'),
+            (r'\|', r'\|', '|',   'pipe'),
+            ('"',   '"',   '"',   'quot'),
+            ("'",   "'",   "'",   'apos'),
+        ]
+
+        # heredocs have slightly different rules
+        triquotes = [(r'"""', 'triquot'), (r"'''", 'triapos')]
+
+        token = String.Other
+        states = {'sigils': []}
+
+        for term, name in triquotes:
+            states['sigils'] += [
+                (rf'(~[a-z])({term})', bygroups(token, String.Heredoc),
+                    (name + '-end', name + '-intp')),
+                (rf'(~[A-Z])({term})', bygroups(token, String.Heredoc),
+                    (name + '-end', name + '-no-intp')),
+            ]
+
+            states[name + '-end'] = [
+                (r'[a-zA-Z]+', token, '#pop'),
+                default('#pop'),
+            ]
+            states[name + '-intp'] = [
+                (r'^(\s*)(' + term + ')', bygroups(Whitespace, String.Heredoc), '#pop'),
+                include('heredoc_interpol'),
+            ]
+            states[name + '-no-intp'] = [
+                (r'^(\s*)(' + term +')', bygroups(Whitespace, String.Heredoc), '#pop'),
+                include('heredoc_no_interpol'),
+            ]
+
+        for lterm, rterm, rterm_class, name in terminators:
+            states['sigils'] += [
+                (r'~[a-z]' + lterm, token, name + '-intp'),
+                (r'~[A-Z]' + lterm, token, name + '-no-intp'),
+            ]
+            states[name + '-intp'] = \
+                gen_elixir_sigstr_rules(rterm, rterm_class, token)
+            states[name + '-no-intp'] = \
+                gen_elixir_sigstr_rules(rterm, rterm_class, token, interpol=False)
+
+        return states
+
+    op3_re = "|".join(re.escape(s) for s in OPERATORS3)
+    op2_re = "|".join(re.escape(s) for s in OPERATORS2)
+    op1_re = "|".join(re.escape(s) for s in OPERATORS1)
+    ops_re = rf'(?:{op3_re}|{op2_re}|{op1_re})'
+    punctuation_re = "|".join(re.escape(s) for s in PUNCTUATION)
+    alnum = r'\w'
+    name_re = rf'(?:\.\.\.|[a-z_]{alnum}*[!?]?)'
+    modname_re = rf'[A-Z]{alnum}*(?:\.[A-Z]{alnum}*)*'
+    complex_name_re = rf'(?:{name_re}|{modname_re}|{ops_re})'
+    special_atom_re = r'(?:\.\.\.|<<>>|%\{\}|%|\{\})'
+
+    long_hex_char_re = r'(\\x\{)([\da-fA-F]+)(\})'
+    hex_char_re = r'(\\x[\da-fA-F]{1,2})'
+    escape_char_re = r'(\\[abdefnrstv])'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'#.*$', Comment.Single),
+
+            # Various kinds of characters
+            (r'(\?)' + long_hex_char_re,
+                bygroups(String.Char,
+                         String.Escape, Number.Hex, String.Escape)),
+            (r'(\?)' + hex_char_re,
+                bygroups(String.Char, String.Escape)),
+            (r'(\?)' + escape_char_re,
+                bygroups(String.Char, String.Escape)),
+            (r'\?\\?.', String.Char),
+
+            # '::' has to go before atoms
+            (r':::', String.Symbol),
+            (r'::', Operator),
+
+            # atoms
+            (r':' + special_atom_re, String.Symbol),
+            (r':' + complex_name_re, String.Symbol),
+            (r':"', String.Symbol, 'string_double_atom'),
+            (r":'", String.Symbol, 'string_single_atom'),
+
+            # [keywords: ...]
+            (rf'({special_atom_re}|{complex_name_re})(:)(?=\s|\n)',
+                bygroups(String.Symbol, Punctuation)),
+
+            # @attributes
+            (r'@' + name_re, Name.Attribute),
+
+            # identifiers
+            (name_re, Name),
+            (rf'(%?)({modname_re})', bygroups(Punctuation, Name.Class)),
+
+            # operators and punctuation
+            (op3_re, Operator),
+            (op2_re, Operator),
+            (punctuation_re, Punctuation),
+            (r'&\d', Name.Entity),   # anon func arguments
+            (op1_re, Operator),
+
+            # numbers
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[\da-fA-F]+', Number.Hex),
+            (r'\d(_?\d)*\.\d(_?\d)*([eE][-+]?\d(_?\d)*)?', Number.Float),
+            (r'\d(_?\d)*', Number.Integer),
+
+            # strings and heredocs
+            (r'(""")(\s*)', bygroups(String.Heredoc, Whitespace),
+                'heredoc_double'),
+            (r"(''')(\s*)$", bygroups(String.Heredoc, Whitespace),
+                'heredoc_single'),
+            (r'"', String.Double, 'string_double'),
+            (r"'", String.Single, 'string_single'),
+
+            include('sigils'),
+
+            (r'%\{', Punctuation, 'map_key'),
+            (r'\{', Punctuation, 'tuple'),
+        ],
+        'heredoc_double': [
+            (r'^(\s*)(""")', bygroups(Whitespace, String.Heredoc), '#pop'),
+            include('heredoc_interpol'),
+        ],
+        'heredoc_single': [
+            (r"^\s*'''", String.Heredoc, '#pop'),
+            include('heredoc_interpol'),
+        ],
+        'heredoc_interpol': [
+            (r'[^#\\\n]+', String.Heredoc),
+            include('escapes'),
+            (r'\\.', String.Heredoc),
+            (r'\n+', String.Heredoc),
+            include('interpol'),
+        ],
+        'heredoc_no_interpol': [
+            (r'[^\\\n]+', String.Heredoc),
+            (r'\\.', String.Heredoc),
+            (r'\n+', Whitespace),
+        ],
+        'escapes': [
+            (long_hex_char_re,
+                bygroups(String.Escape, Number.Hex, String.Escape)),
+            (hex_char_re, String.Escape),
+            (escape_char_re, String.Escape),
+        ],
+        'interpol': [
+            (r'#\{', String.Interpol, 'interpol_string'),
+        ],
+        'interpol_string': [
+            (r'\}', String.Interpol, "#pop"),
+            include('root')
+        ],
+        'map_key': [
+            include('root'),
+            (r':', Punctuation, 'map_val'),
+            (r'=>', Punctuation, 'map_val'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'map_val': [
+            include('root'),
+            (r',', Punctuation, '#pop'),
+            (r'(?=\})', Punctuation, '#pop'),
+        ],
+        'tuple': [
+            include('root'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+    }
+    tokens.update(gen_elixir_string_rules('double', '"', String.Double))
+    tokens.update(gen_elixir_string_rules('single', "'", String.Single))
+    tokens.update(gen_elixir_string_rules('double_atom', '"', String.Symbol))
+    tokens.update(gen_elixir_string_rules('single_atom', "'", String.Symbol))
+    tokens.update(gen_elixir_sigil_rules())
+
+
+class ElixirConsoleLexer(Lexer):
+    """
+    For Elixir interactive console (iex) output like:
+
+    .. sourcecode:: iex
+
+        iex> [head | tail] = [1,2,3]
+        [1,2,3]
+        iex> head
+        1
+        iex> tail
+        [2,3]
+        iex> [head | tail]
+        [1,2,3]
+        iex> length [head | tail]
+        3
+    """
+
+    name = 'Elixir iex session'
+    aliases = ['iex']
+    mimetypes = ['text/x-elixir-shellsession']
+    url = 'https://elixir-lang.org'
+    version_added = '1.5'
+
+    _prompt_re = re.compile(r'(iex|\.{3})((?:\([\w@_.]+\))?\d+|\(\d+\))?> ')
+
+    def get_tokens_unprocessed(self, text):
+        exlexer = ElixirLexer(**self.options)
+
+        curcode = ''
+        in_error = False
+        insertions = []
+        for match in line_re.finditer(text):
+            line = match.group()
+            if line.startswith('** '):
+                in_error = True
+                insertions.append((len(curcode),
+                                   [(0, Generic.Error, line[:-1])]))
+                curcode += line[-1:]
+            else:
+                m = self._prompt_re.match(line)
+                if m is not None:
+                    in_error = False
+                    end = m.end()
+                    insertions.append((len(curcode),
+                                       [(0, Generic.Prompt, line[:end])]))
+                    curcode += line[end:]
+                else:
+                    if curcode:
+                        yield from do_insertions(
+                            insertions, exlexer.get_tokens_unprocessed(curcode))
+                        curcode = ''
+                        insertions = []
+                    token = Generic.Error if in_error else Generic.Output
+                    yield match.start(), token, line
+        if curcode:
+            yield from do_insertions(
+                insertions, exlexer.get_tokens_unprocessed(curcode))
diff --git a/.venv/Lib/site-packages/pygments/lexers/esoteric.py b/.venv/Lib/site-packages/pygments/lexers/esoteric.py
new file mode 100644 (file)
index 0000000..fe3825c
--- /dev/null
@@ -0,0 +1,300 @@
+"""
+    pygments.lexers.esoteric
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for esoteric languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words, bygroups
+from pygments.token import Comment, Operator, Keyword, Name, String, Number, \
+    Punctuation, Error, Whitespace
+
+__all__ = ['BrainfuckLexer', 'BefungeLexer', 'RedcodeLexer', 'CAmkESLexer',
+           'CapDLLexer', 'AheuiLexer']
+
+
+class BrainfuckLexer(RegexLexer):
+    """
+    Lexer for the esoteric BrainFuck language.
+    """
+
+    name = 'Brainfuck'
+    url = 'http://www.muppetlabs.com/~breadbox/bf/'
+    aliases = ['brainfuck', 'bf']
+    filenames = ['*.bf', '*.b']
+    mimetypes = ['application/x-brainfuck']
+    version_added = ''
+
+    tokens = {
+        'common': [
+            # use different colors for different instruction types
+            (r'[.,]+', Name.Tag),
+            (r'[+-]+', Name.Builtin),
+            (r'[<>]+', Name.Variable),
+            (r'[^.,+\-<>\[\]]+', Comment),
+        ],
+        'root': [
+            (r'\[', Keyword, 'loop'),
+            (r'\]', Error),
+            include('common'),
+        ],
+        'loop': [
+            (r'\[', Keyword, '#push'),
+            (r'\]', Keyword, '#pop'),
+            include('common'),
+        ]
+    }
+
+    def analyse_text(text):
+        """It's safe to assume that a program which mostly consists of + -
+        and < > is brainfuck."""
+        plus_minus_count = 0
+        greater_less_count = 0
+
+        range_to_check = max(256, len(text))
+
+        for c in text[:range_to_check]:
+            if c == '+' or c == '-':
+                plus_minus_count += 1
+            if c == '<' or c == '>':
+                greater_less_count += 1
+
+        if plus_minus_count > (0.25 * range_to_check):
+            return 1.0
+        if greater_less_count > (0.25 * range_to_check):
+            return 1.0
+
+        result = 0
+        if '[-]' in text:
+            result += 0.5
+
+        return result
+
+
+class BefungeLexer(RegexLexer):
+    """
+    Lexer for the esoteric Befunge language.
+    """
+    name = 'Befunge'
+    url = 'http://en.wikipedia.org/wiki/Befunge'
+    aliases = ['befunge']
+    filenames = ['*.befunge']
+    mimetypes = ['application/x-befunge']
+    version_added = '0.7'
+
+    tokens = {
+        'root': [
+            (r'[0-9a-f]', Number),
+            (r'[+*/%!`-]', Operator),             # Traditional math
+            (r'[<>^v?\[\]rxjk]', Name.Variable),  # Move, imperatives
+            (r'[:\\$.,n]', Name.Builtin),         # Stack ops, imperatives
+            (r'[|_mw]', Keyword),
+            (r'[{}]', Name.Tag),                  # Befunge-98 stack ops
+            (r'".*?"', String.Double),            # Strings don't appear to allow escapes
+            (r'\'.', String.Single),              # Single character
+            (r'[#;]', Comment),                   # Trampoline... depends on direction hit
+            (r'[pg&~=@iotsy]', Keyword),          # Misc
+            (r'[()A-Z]', Comment),                # Fingerprints
+            (r'\s+', Whitespace),                 # Whitespace doesn't matter
+        ],
+    }
+
+
+class CAmkESLexer(RegexLexer):
+    """
+    Basic lexer for the input language for the CAmkES component platform.
+    """
+    name = 'CAmkES'
+    url = 'https://sel4.systems/CAmkES/'
+    aliases = ['camkes', 'idl4']
+    filenames = ['*.camkes', '*.idl4']
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            # C pre-processor directive
+            (r'^(\s*)(#.*)(\n)', bygroups(Whitespace, Comment.Preproc,
+                Whitespace)),
+
+            # Whitespace, comments
+            (r'\s+', Whitespace),
+            (r'/\*(.|\n)*?\*/', Comment),
+            (r'//.*$', Comment),
+
+            (r'[\[(){},.;\]]', Punctuation),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+
+            (words(('assembly', 'attribute', 'component', 'composition',
+                    'configuration', 'connection', 'connector', 'consumes',
+                    'control', 'dataport', 'Dataport', 'Dataports', 'emits',
+                    'event', 'Event', 'Events', 'export', 'from', 'group',
+                    'hardware', 'has', 'interface', 'Interface', 'maybe',
+                    'procedure', 'Procedure', 'Procedures', 'provides',
+                    'template', 'thread', 'threads', 'to', 'uses', 'with'),
+                   suffix=r'\b'), Keyword),
+
+            (words(('bool', 'boolean', 'Buf', 'char', 'character', 'double',
+                    'float', 'in', 'inout', 'int', 'int16_6', 'int32_t',
+                    'int64_t', 'int8_t', 'integer', 'mutex', 'out', 'real',
+                    'refin', 'semaphore', 'signed', 'string', 'struct',
+                    'uint16_t', 'uint32_t', 'uint64_t', 'uint8_t', 'uintptr_t',
+                    'unsigned', 'void'),
+                   suffix=r'\b'), Keyword.Type),
+
+            # Recognised attributes
+            (r'[a-zA-Z_]\w*_(priority|domain|buffer)', Keyword.Reserved),
+            (words(('dma_pool', 'from_access', 'to_access'), suffix=r'\b'),
+                Keyword.Reserved),
+
+            # CAmkES-level include
+            (r'(import)(\s+)((?:<[^>]*>|"[^"]*");)',
+                bygroups(Comment.Preproc, Whitespace, Comment.Preproc)),
+
+            # C-level include
+            (r'(include)(\s+)((?:<[^>]*>|"[^"]*");)',
+                bygroups(Comment.Preproc, Whitespace, Comment.Preproc)),
+
+            # Literals
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'-?[\d]+', Number),
+            (r'-?[\d]+\.[\d]+', Number.Float),
+            (r'"[^"]*"', String),
+            (r'[Tt]rue|[Ff]alse', Name.Builtin),
+
+            # Identifiers
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+    }
+
+
+class CapDLLexer(RegexLexer):
+    """
+    Basic lexer for CapDL.
+
+    The source of the primary tool that reads such specifications is available
+    at https://github.com/seL4/capdl/tree/master/capDL-tool. Note that this
+    lexer only supports a subset of the grammar. For example, identifiers can
+    shadow type names, but these instances are currently incorrectly
+    highlighted as types. Supporting this would need a stateful lexer that is
+    considered unnecessarily complex for now.
+    """
+    name = 'CapDL'
+    url = 'https://ssrg.nicta.com.au/publications/nictaabstracts/Kuz_KLW_10.abstract.pml'
+    aliases = ['capdl']
+    filenames = ['*.cdl']
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            # C pre-processor directive
+            (r'^(\s*)(#.*)(\n)',
+                bygroups(Whitespace, Comment.Preproc, Whitespace)),
+
+            # Whitespace, comments
+            (r'\s+', Whitespace),
+            (r'/\*(.|\n)*?\*/', Comment),
+            (r'(//|--).*$', Comment),
+
+            (r'[<>\[(){},:;=\]]', Punctuation),
+            (r'\.\.', Punctuation),
+
+            (words(('arch', 'arm11', 'caps', 'child_of', 'ia32', 'irq', 'maps',
+                    'objects'), suffix=r'\b'), Keyword),
+
+            (words(('aep', 'asid_pool', 'cnode', 'ep', 'frame', 'io_device',
+                    'io_ports', 'io_pt', 'notification', 'pd', 'pt', 'tcb',
+                    'ut', 'vcpu'), suffix=r'\b'), Keyword.Type),
+
+            # Properties
+            (words(('asid', 'addr', 'badge', 'cached', 'dom', 'domainID', 'elf',
+                    'fault_ep', 'G', 'guard', 'guard_size', 'init', 'ip',
+                    'prio', 'sp', 'R', 'RG', 'RX', 'RW', 'RWG', 'RWX', 'W',
+                    'WG', 'WX', 'level', 'masked', 'master_reply', 'paddr',
+                    'ports', 'reply', 'uncached'), suffix=r'\b'),
+             Keyword.Reserved),
+
+            # Literals
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'\d+(\.\d+)?(k|M)?', Number),
+            (words(('bits',), suffix=r'\b'), Number),
+            (words(('cspace', 'vspace', 'reply_slot', 'caller_slot',
+                    'ipc_buffer_slot'), suffix=r'\b'), Number),
+
+            # Identifiers
+            (r'[a-zA-Z_][-@\.\w]*', Name),
+        ],
+    }
+
+
+class RedcodeLexer(RegexLexer):
+    """
+    A simple Redcode lexer based on ICWS'94.
+    Contributed by Adam Blinkinsop <blinks@acm.org>.
+    """
+    name = 'Redcode'
+    aliases = ['redcode']
+    filenames = ['*.cw']
+    url = 'https://en.wikipedia.org/wiki/Core_War'
+    version_added = '0.8'
+
+    opcodes = ('DAT', 'MOV', 'ADD', 'SUB', 'MUL', 'DIV', 'MOD',
+               'JMP', 'JMZ', 'JMN', 'DJN', 'CMP', 'SLT', 'SPL',
+               'ORG', 'EQU', 'END')
+    modifiers = ('A', 'B', 'AB', 'BA', 'F', 'X', 'I')
+
+    tokens = {
+        'root': [
+            # Whitespace:
+            (r'\s+', Whitespace),
+            (r';.*$', Comment.Single),
+            # Lexemes:
+            #  Identifiers
+            (r'\b({})\b'.format('|'.join(opcodes)), Name.Function),
+            (r'\b({})\b'.format('|'.join(modifiers)), Name.Decorator),
+            (r'[A-Za-z_]\w+', Name),
+            #  Operators
+            (r'[-+*/%]', Operator),
+            (r'[#$@<>]', Operator),  # mode
+            (r'[.,]', Punctuation),  # mode
+            #  Numbers
+            (r'[-+]?\d+', Number.Integer),
+        ],
+    }
+
+
+class AheuiLexer(RegexLexer):
+    """
+    Aheui is esoteric language based on Korean alphabets.
+    """
+
+    name = 'Aheui'
+    url = 'http://aheui.github.io/'
+    aliases = ['aheui']
+    filenames = ['*.aheui']
+    version_added = ''
+
+    tokens = {
+        'root': [
+            ('['
+             '나-낳냐-냫너-넣녀-녛노-놓뇨-눟뉴-닇'
+             '다-닿댜-댷더-덯뎌-뎧도-돟됴-둫듀-딓'
+             '따-땋땨-떃떠-떻뗘-뗳또-똫뚀-뚷뜌-띟'
+             '라-랗랴-럏러-렇려-렿로-롷료-뤃류-릫'
+             '마-맣먀-먛머-멓며-몋모-뫃묘-뭏뮤-믷'
+             '바-밯뱌-뱧버-벟벼-볗보-봏뵤-붛뷰-빃'
+             '빠-빻뺘-뺳뻐-뻫뼈-뼣뽀-뽛뾰-뿧쀼-삏'
+             '사-샇샤-샿서-섷셔-셯소-솧쇼-숳슈-싛'
+             '싸-쌓쌰-썋써-쎃쎠-쎻쏘-쏳쑈-쑿쓔-씧'
+             '자-잫쟈-쟣저-젛져-졓조-좋죠-줗쥬-즿'
+             '차-챃챠-챻처-첳쳐-쳫초-촣쵸-춯츄-칗'
+             '카-캏캬-컇커-컿켜-켷코-콯쿄-쿻큐-킣'
+             '타-탛탸-턓터-텋텨-톃토-톻툐-퉇튜-틯'
+             '파-팧퍄-퍟퍼-펗펴-폏포-퐇표-풓퓨-픻'
+             '하-핳햐-햫허-헣혀-혛호-홓효-훟휴-힇'
+             ']', Operator),
+            ('.', Comment),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/ezhil.py b/.venv/Lib/site-packages/pygments/lexers/ezhil.py
new file mode 100644 (file)
index 0000000..aeb71ab
--- /dev/null
@@ -0,0 +1,76 @@
+"""
+    pygments.lexers.ezhil
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexers for Ezhil language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Keyword, Comment, Name, String, Number, \
+    Punctuation, Operator, Whitespace
+
+__all__ = ['EzhilLexer']
+
+
+class EzhilLexer(RegexLexer):
+    """
+    Lexer for Ezhil, a Tamil script-based programming language.
+    """
+    name = 'Ezhil'
+    url = 'http://ezhillang.org'
+    aliases = ['ezhil']
+    filenames = ['*.n']
+    mimetypes = ['text/x-ezhil']
+    version_added = '2.1'
+    # Refer to tamil.utf8.tamil_letters from open-tamil for a stricter version of this.
+    # This much simpler version is close enough, and includes combining marks.
+    _TALETTERS = '[a-zA-Z_]|[\u0b80-\u0bff]'
+    tokens = {
+        'root': [
+            include('keywords'),
+            (r'#.*$', Comment.Single),
+            (r'[@+/*,^\-%]|[!<>=]=?|&&?|\|\|?', Operator),
+            ('இல்', Operator.Word),
+            (words(('assert', 'max', 'min',
+                    'நீளம்', 'சரம்_இடமாற்று', 'சரம்_கண்டுபிடி',
+                    'பட்டியல்', 'பின்இணை', 'வரிசைப்படுத்து',
+                    'எடு', 'தலைகீழ்', 'நீட்டிக்க', 'நுழைக்க', 'வை',
+                    'கோப்பை_திற', 'கோப்பை_எழுது', 'கோப்பை_மூடு',
+                    'pi', 'sin', 'cos', 'tan', 'sqrt', 'hypot', 'pow',
+                    'exp', 'log', 'log10', 'exit',
+                    ), suffix=r'\b'), Name.Builtin),
+            (r'(True|False)\b', Keyword.Constant),
+            (r'[^\S\n]+', Whitespace),
+            include('identifier'),
+            include('literal'),
+            (r'[(){}\[\]:;.]', Punctuation),
+        ],
+        'keywords': [
+            ('பதிப்பி|தேர்ந்தெடு|தேர்வு|ஏதேனில்|ஆனால்|இல்லைஆனால்|இல்லை|ஆக|ஒவ்வொன்றாக|இல்|வரை|செய்|முடியேனில்|பின்கொடு|முடி|நிரல்பாகம்|தொடர்|நிறுத்து|நிரல்பாகம்', Keyword),
+        ],
+        'identifier': [
+            ('(?:'+_TALETTERS+')(?:[0-9]|'+_TALETTERS+')*', Name),
+        ],
+        'literal': [
+            (r'".*?"', String),
+            (r'\d+((\.\d*)?[eE][+-]?\d+|\.\d*)', Number.Float),
+            (r'\d+', Number.Integer),
+        ]
+    }
+
+    def analyse_text(text):
+        """This language uses Tamil-script. We'll assume that if there's a
+        decent amount of Tamil-characters, it's this language. This assumption
+        is obviously horribly off if someone uses string literals in tamil
+        in another language."""
+        if len(re.findall(r'[\u0b80-\u0bff]', text)) > 10:
+            return 0.25
+
+    def __init__(self, **options):
+        super().__init__(**options)
+        self.encoding = options.get('encoding', 'utf-8')
diff --git a/.venv/Lib/site-packages/pygments/lexers/factor.py b/.venv/Lib/site-packages/pygments/lexers/factor.py
new file mode 100644 (file)
index 0000000..2ec3f9b
--- /dev/null
@@ -0,0 +1,363 @@
+"""
+    pygments.lexers.factor
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Factor language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, default, words
+from pygments.token import Text, Comment, Keyword, Name, String, Number, \
+    Whitespace, Punctuation
+
+__all__ = ['FactorLexer']
+
+
+class FactorLexer(RegexLexer):
+    """
+    Lexer for the Factor language.
+    """
+    name = 'Factor'
+    url = 'http://factorcode.org'
+    aliases = ['factor']
+    filenames = ['*.factor']
+    mimetypes = ['text/x-factor']
+    version_added = '1.4'
+
+    builtin_kernel = words((
+        '-rot', '2bi', '2bi@', '2bi*', '2curry', '2dip', '2drop', '2dup', '2keep', '2nip',
+        '2over', '2tri', '2tri@', '2tri*', '3bi', '3curry', '3dip', '3drop', '3dup', '3keep',
+        '3tri', '4dip', '4drop', '4dup', '4keep', '<wrapper>', '=', '>boolean', 'clone',
+        '?', '?execute', '?if', 'and', 'assert', 'assert=', 'assert?', 'bi', 'bi-curry',
+        'bi-curry@', 'bi-curry*', 'bi@', 'bi*', 'boa', 'boolean', 'boolean?', 'both?',
+        'build', 'call', 'callstack', 'callstack>array', 'callstack?', 'clear', '(clone)',
+        'compose', 'compose?', 'curry', 'curry?', 'datastack', 'die', 'dip', 'do', 'drop',
+        'dup', 'dupd', 'either?', 'eq?', 'equal?', 'execute', 'hashcode', 'hashcode*',
+        'identity-hashcode', 'identity-tuple', 'identity-tuple?', 'if', 'if*',
+        'keep', 'loop', 'most', 'new', 'nip', 'not', 'null', 'object', 'or', 'over',
+        'pick', 'prepose', 'retainstack', 'rot', 'same?', 'swap', 'swapd', 'throw',
+        'tri', 'tri-curry', 'tri-curry@', 'tri-curry*', 'tri@', 'tri*', 'tuple',
+        'tuple?', 'unless', 'unless*', 'until', 'when', 'when*', 'while', 'with',
+        'wrapper', 'wrapper?', 'xor'), suffix=r'(\s+)')
+
+    builtin_assocs = words((
+        '2cache', '<enum>', '>alist', '?at', '?of', 'assoc', 'assoc-all?',
+        'assoc-any?', 'assoc-clone-like', 'assoc-combine', 'assoc-diff',
+        'assoc-diff!', 'assoc-differ', 'assoc-each', 'assoc-empty?',
+        'assoc-filter', 'assoc-filter!', 'assoc-filter-as', 'assoc-find',
+        'assoc-hashcode', 'assoc-intersect', 'assoc-like', 'assoc-map',
+        'assoc-map-as', 'assoc-partition', 'assoc-refine', 'assoc-size',
+        'assoc-stack', 'assoc-subset?', 'assoc-union', 'assoc-union!',
+        'assoc=', 'assoc>map', 'assoc?', 'at', 'at+', 'at*', 'cache', 'change-at',
+        'clear-assoc', 'delete-at', 'delete-at*', 'enum', 'enum?', 'extract-keys',
+        'inc-at', 'key?', 'keys', 'map>assoc', 'maybe-set-at', 'new-assoc', 'of',
+        'push-at', 'rename-at', 'set-at', 'sift-keys', 'sift-values', 'substitute',
+        'unzip', 'value-at', 'value-at*', 'value?', 'values', 'zip'), suffix=r'(\s+)')
+
+    builtin_combinators = words((
+        '2cleave', '2cleave>quot', '3cleave', '3cleave>quot', '4cleave',
+        '4cleave>quot', 'alist>quot', 'call-effect', 'case', 'case-find',
+        'case>quot', 'cleave', 'cleave>quot', 'cond', 'cond>quot', 'deep-spread>quot',
+        'execute-effect', 'linear-case-quot', 'no-case', 'no-case?', 'no-cond',
+        'no-cond?', 'recursive-hashcode', 'shallow-spread>quot', 'spread',
+        'to-fixed-point', 'wrong-values', 'wrong-values?'), suffix=r'(\s+)')
+
+    builtin_math = words((
+        '-', '/', '/f', '/i', '/mod', '2/', '2^', '<', '<=', '<fp-nan>', '>',
+        '>=', '>bignum', '>fixnum', '>float', '>integer', '(all-integers?)',
+        '(each-integer)', '(find-integer)', '*', '+', '?1+',
+        'abs', 'align', 'all-integers?', 'bignum', 'bignum?', 'bit?', 'bitand',
+        'bitnot', 'bitor', 'bits>double', 'bits>float', 'bitxor', 'complex',
+        'complex?', 'denominator', 'double>bits', 'each-integer', 'even?',
+        'find-integer', 'find-last-integer', 'fixnum', 'fixnum?', 'float',
+        'float>bits', 'float?', 'fp-bitwise=', 'fp-infinity?', 'fp-nan-payload',
+        'fp-nan?', 'fp-qnan?', 'fp-sign', 'fp-snan?', 'fp-special?',
+        'if-zero', 'imaginary-part', 'integer', 'integer>fixnum',
+        'integer>fixnum-strict', 'integer?', 'log2', 'log2-expects-positive',
+        'log2-expects-positive?', 'mod', 'neg', 'neg?', 'next-float',
+        'next-power-of-2', 'number', 'number=', 'number?', 'numerator', 'odd?',
+        'out-of-fixnum-range', 'out-of-fixnum-range?', 'power-of-2?',
+        'prev-float', 'ratio', 'ratio?', 'rational', 'rational?', 'real',
+        'real-part', 'real?', 'recip', 'rem', 'sgn', 'shift', 'sq', 'times',
+        'u<', 'u<=', 'u>', 'u>=', 'unless-zero', 'unordered?', 'when-zero',
+        'zero?'), suffix=r'(\s+)')
+
+    builtin_sequences = words((
+        '1sequence', '2all?', '2each', '2map', '2map-as', '2map-reduce', '2reduce',
+        '2selector', '2sequence', '3append', '3append-as', '3each', '3map', '3map-as',
+        '3sequence', '4sequence', '<repetition>', '<reversed>', '<slice>', '?first',
+        '?last', '?nth', '?second', '?set-nth', 'accumulate', 'accumulate!',
+        'accumulate-as', 'all?', 'any?', 'append', 'append!', 'append-as',
+        'assert-sequence', 'assert-sequence=', 'assert-sequence?',
+        'binary-reduce', 'bounds-check', 'bounds-check?', 'bounds-error',
+        'bounds-error?', 'but-last', 'but-last-slice', 'cartesian-each',
+        'cartesian-map', 'cartesian-product', 'change-nth', 'check-slice',
+        'check-slice-error', 'clone-like', 'collapse-slice', 'collector',
+        'collector-for', 'concat', 'concat-as', 'copy', 'count', 'cut', 'cut-slice',
+        'cut*', 'delete-all', 'delete-slice', 'drop-prefix', 'each', 'each-from',
+        'each-index', 'empty?', 'exchange', 'filter', 'filter!', 'filter-as', 'find',
+        'find-from', 'find-index', 'find-index-from', 'find-last', 'find-last-from',
+        'first', 'first2', 'first3', 'first4', 'flip', 'follow', 'fourth', 'glue', 'halves',
+        'harvest', 'head', 'head-slice', 'head-slice*', 'head*', 'head?',
+        'if-empty', 'immutable', 'immutable-sequence', 'immutable-sequence?',
+        'immutable?', 'index', 'index-from', 'indices', 'infimum', 'infimum-by',
+        'insert-nth', 'interleave', 'iota', 'iota-tuple', 'iota-tuple?', 'join',
+        'join-as', 'last', 'last-index', 'last-index-from', 'length', 'lengthen',
+        'like', 'longer', 'longer?', 'longest', 'map', 'map!', 'map-as', 'map-find',
+        'map-find-last', 'map-index', 'map-integers', 'map-reduce', 'map-sum',
+        'max-length', 'member-eq?', 'member?', 'midpoint@', 'min-length',
+        'mismatch', 'move', 'new-like', 'new-resizable', 'new-sequence',
+        'non-negative-integer-expected', 'non-negative-integer-expected?',
+        'nth', 'nths', 'pad-head', 'pad-tail', 'padding', 'partition', 'pop', 'pop*',
+        'prefix', 'prepend', 'prepend-as', 'produce', 'produce-as', 'product', 'push',
+        'push-all', 'push-either', 'push-if', 'reduce', 'reduce-index', 'remove',
+        'remove!', 'remove-eq', 'remove-eq!', 'remove-nth', 'remove-nth!', 'repetition',
+        'repetition?', 'replace-slice', 'replicate', 'replicate-as', 'rest',
+        'rest-slice', 'reverse', 'reverse!', 'reversed', 'reversed?', 'second',
+        'selector', 'selector-for', 'sequence', 'sequence-hashcode', 'sequence=',
+        'sequence?', 'set-first', 'set-fourth', 'set-last', 'set-length', 'set-nth',
+        'set-second', 'set-third', 'short', 'shorten', 'shorter', 'shorter?',
+        'shortest', 'sift', 'slice', 'slice-error', 'slice-error?', 'slice?',
+        'snip', 'snip-slice', 'start', 'start*', 'subseq', 'subseq?', 'suffix',
+        'suffix!', 'sum', 'sum-lengths', 'supremum', 'supremum-by', 'surround', 'tail',
+        'tail-slice', 'tail-slice*', 'tail*', 'tail?', 'third', 'trim',
+        'trim-head', 'trim-head-slice', 'trim-slice', 'trim-tail', 'trim-tail-slice',
+        'unclip', 'unclip-last', 'unclip-last-slice', 'unclip-slice', 'unless-empty',
+        'virtual-exemplar', 'virtual-sequence', 'virtual-sequence?', 'virtual@',
+        'when-empty'), suffix=r'(\s+)')
+
+    builtin_namespaces = words((
+        '+@', 'change', 'change-global', 'counter', 'dec', 'get', 'get-global',
+        'global', 'inc', 'init-namespaces', 'initialize', 'is-global', 'make-assoc',
+        'namespace', 'namestack', 'off', 'on', 'set', 'set-global', 'set-namestack',
+        'toggle', 'with-global', 'with-scope', 'with-variable', 'with-variables'),
+        suffix=r'(\s+)')
+
+    builtin_arrays = words((
+        '1array', '2array', '3array', '4array', '<array>', '>array', 'array',
+        'array?', 'pair', 'pair?', 'resize-array'), suffix=r'(\s+)')
+
+    builtin_io = words((
+        '(each-stream-block-slice)', '(each-stream-block)',
+        '(stream-contents-by-block)', '(stream-contents-by-element)',
+        '(stream-contents-by-length-or-block)',
+        '(stream-contents-by-length)', '+byte+', '+character+',
+        'bad-seek-type', 'bad-seek-type?', 'bl', 'contents', 'each-block',
+        'each-block-size', 'each-block-slice', 'each-line', 'each-morsel',
+        'each-stream-block', 'each-stream-block-slice', 'each-stream-line',
+        'error-stream', 'flush', 'input-stream', 'input-stream?',
+        'invalid-read-buffer', 'invalid-read-buffer?', 'lines', 'nl',
+        'output-stream', 'output-stream?', 'print', 'read', 'read-into',
+        'read-partial', 'read-partial-into', 'read-until', 'read1', 'readln',
+        'seek-absolute', 'seek-absolute?', 'seek-end', 'seek-end?',
+        'seek-input', 'seek-output', 'seek-relative', 'seek-relative?',
+        'stream-bl', 'stream-contents', 'stream-contents*', 'stream-copy',
+        'stream-copy*', 'stream-element-type', 'stream-flush',
+        'stream-length', 'stream-lines', 'stream-nl', 'stream-print',
+        'stream-read', 'stream-read-into', 'stream-read-partial',
+        'stream-read-partial-into', 'stream-read-partial-unsafe',
+        'stream-read-unsafe', 'stream-read-until', 'stream-read1',
+        'stream-readln', 'stream-seek', 'stream-seekable?', 'stream-tell',
+        'stream-write', 'stream-write1', 'tell-input', 'tell-output',
+        'with-error-stream', 'with-error-stream*', 'with-error>output',
+        'with-input-output+error-streams',
+        'with-input-output+error-streams*', 'with-input-stream',
+        'with-input-stream*', 'with-output-stream', 'with-output-stream*',
+        'with-output>error', 'with-output+error-stream',
+        'with-output+error-stream*', 'with-streams', 'with-streams*',
+        'write', 'write1'), suffix=r'(\s+)')
+
+    builtin_strings = words((
+        '1string', '<string>', '>string', 'resize-string', 'string',
+        'string?'), suffix=r'(\s+)')
+
+    builtin_vectors = words((
+        '1vector', '<vector>', '>vector', '?push', 'vector', 'vector?'),
+        suffix=r'(\s+)')
+
+    builtin_continuations = words((
+        '<condition>', '<continuation>', '<restart>', 'attempt-all',
+        'attempt-all-error', 'attempt-all-error?', 'callback-error-hook',
+        'callcc0', 'callcc1', 'cleanup', 'compute-restarts', 'condition',
+        'condition?', 'continuation', 'continuation?', 'continue',
+        'continue-restart', 'continue-with', 'current-continuation',
+        'error', 'error-continuation', 'error-in-thread', 'error-thread',
+        'ifcc', 'ignore-errors', 'in-callback?', 'original-error', 'recover',
+        'restart', 'restart?', 'restarts', 'rethrow', 'rethrow-restarts',
+        'return', 'return-continuation', 'thread-error-hook', 'throw-continue',
+        'throw-restarts', 'with-datastack', 'with-return'), suffix=r'(\s+)')
+
+    tokens = {
+        'root': [
+            # factor allows a file to start with a shebang
+            (r'#!.*$', Comment.Preproc),
+            default('base'),
+        ],
+        'base': [
+            (r'\s+', Whitespace),
+
+            # defining words
+            (r'((?:MACRO|MEMO|TYPED)?:[:]?)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Function)),
+            (r'(M:[:]?)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Class, Whitespace,
+                 Name.Function)),
+            (r'(C:)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Function, Whitespace,
+                 Name.Class)),
+            (r'(GENERIC:)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Function)),
+            (r'(HOOK:|GENERIC#)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Function, Whitespace,
+                 Name.Function)),
+            (r'(\()(\s)', bygroups(Name.Function, Whitespace), 'stackeffect'),
+            (r'(;)(\s)', bygroups(Keyword, Whitespace)),
+
+            # imports and namespaces
+            (r'(USING:)(\s+)',
+             bygroups(Keyword.Namespace, Whitespace), 'vocabs'),
+            (r'(USE:|UNUSE:|IN:|QUALIFIED:)(\s+)(\S+)',
+             bygroups(Keyword.Namespace, Whitespace, Name.Namespace)),
+            (r'(QUALIFIED-WITH:)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword.Namespace, Whitespace, Name.Namespace,
+                 Whitespace, Name.Namespace)),
+            (r'(FROM:|EXCLUDE:)(\s+)(\S+)(\s+=>\s)',
+             bygroups(Keyword.Namespace, Whitespace, Name.Namespace,
+                 Whitespace), 'words'),
+            (r'(RENAME:)(\s+)(\S+)(\s+)(\S+)(\s+)(=>)(\s+)(\S+)',
+             bygroups(Keyword.Namespace, Whitespace, Name.Function, Whitespace,
+                 Name.Namespace, Whitespace, Punctuation, Whitespace,
+                 Name.Function)),
+            (r'(ALIAS:|TYPEDEF:)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword.Namespace, Whitespace, Name.Function, Whitespace,
+                 Name.Function)),
+            (r'(DEFER:|FORGET:|POSTPONE:)(\s+)(\S+)',
+             bygroups(Keyword.Namespace, Whitespace, Name.Function)),
+
+            # tuples and classes
+            (r'(TUPLE:|ERROR:)(\s+)(\S+)(\s+)(<)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Class, Whitespace, Punctuation,
+                 Whitespace, Name.Class), 'slots'),
+            (r'(TUPLE:|ERROR:|BUILTIN:)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Class), 'slots'),
+            (r'(MIXIN:|UNION:|INTERSECTION:)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Class)),
+            (r'(PREDICATE:)(\s+)(\S+)(\s+)(<)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Class, Whitespace,
+                 Punctuation, Whitespace, Name.Class)),
+            (r'(C:)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Function, Whitespace, Name.Class)),
+            (r'(INSTANCE:)(\s+)(\S+)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Class, Whitespace, Name.Class)),
+            (r'(SLOT:)(\s+)(\S+)', bygroups(Keyword, Whitespace, Name.Function)),
+            (r'(SINGLETON:)(\s+)(\S+)', bygroups(Keyword, Whitespace, Name.Class)),
+            (r'SINGLETONS:', Keyword, 'classes'),
+
+            # other syntax
+            (r'(CONSTANT:|SYMBOL:|MAIN:|HELP:)(\s+)(\S+)',
+             bygroups(Keyword, Whitespace, Name.Function)),
+            (r'(SYMBOLS:)(\s+)', bygroups(Keyword, Whitespace), 'words'),
+            (r'(SYNTAX:)(\s+)', bygroups(Keyword, Whitespace)),
+            (r'(ALIEN:)(\s+)', bygroups(Keyword, Whitespace)),
+            (r'(STRUCT:)(\s+)(\S+)', bygroups(Keyword, Whitespace, Name.Class)),
+            (r'(FUNCTION:)(\s+)'
+                r'(\S+)(\s+)(\S+)(\s+)'
+                r'(\()(\s+)([^)]+)(\))(\s)',
+             bygroups(Keyword.Namespace, Whitespace,
+                 Text, Whitespace, Name.Function, Whitespace,
+                 Punctuation, Whitespace, Text, Punctuation, Whitespace)),
+            (r'(FUNCTION-ALIAS:)(\s+)'
+                r'(\S+)(\s+)(\S+)(\s+)'
+                r'(\S+)(\s+)'
+                r'(\()(\s+)([^)]+)(\))(\s)',
+             bygroups(Keyword.Namespace, Whitespace,
+                 Text, Whitespace, Name.Function, Whitespace,
+                 Name.Function, Whitespace,
+                 Punctuation, Whitespace, Text, Punctuation, Whitespace)),
+
+            # vocab.private
+            (r'(<PRIVATE|PRIVATE>)(\s)', bygroups(Keyword.Namespace, Whitespace)),
+
+            # strings
+            (r'"""\s(?:.|\n)*?\s"""', String),
+            (r'"(?:\\\\|\\"|[^"])*"', String),
+            (r'(\S+")(\s+)((?:\\\\|\\"|[^"])*")',
+                bygroups(String, Whitespace, String)),
+            (r'(CHAR:)(\s+)(\\[\\abfnrstv]|[^\\]\S*)(\s)',
+                bygroups(String.Char, Whitespace, String.Char, Whitespace)),
+
+            # comments
+            (r'!\s+.*$', Comment),
+            (r'#!\s+.*$', Comment),
+            (r'/\*\s+(?:.|\n)*?\s\*/', Comment),
+
+            # boolean constants
+            (r'[tf]\b', Name.Constant),
+
+            # symbols and literals
+            (r'[\\$]\s+\S+', Name.Constant),
+            (r'M\\\s+\S+\s+\S+', Name.Constant),
+
+            # numbers
+            (r'[+-]?(?:[\d,]*\d)?\.(?:\d([\d,]*\d)?)?(?:[eE][+-]?\d+)?\s', Number),
+            (r'[+-]?\d(?:[\d,]*\d)?(?:[eE][+-]?\d+)?\s', Number),
+            (r'0x[a-fA-F\d](?:[a-fA-F\d,]*[a-fA-F\d])?(?:p\d([\d,]*\d)?)?\s', Number),
+            (r'NAN:\s+[a-fA-F\d](?:[a-fA-F\d,]*[a-fA-F\d])?(?:p\d([\d,]*\d)?)?\s', Number),
+            (r'0b[01]+\s', Number.Bin),
+            (r'0o[0-7]+\s', Number.Oct),
+            (r'(?:\d([\d,]*\d)?)?\+\d(?:[\d,]*\d)?/\d(?:[\d,]*\d)?\s', Number),
+            (r'(?:\-\d([\d,]*\d)?)?\-\d(?:[\d,]*\d)?/\d(?:[\d,]*\d)?\s', Number),
+
+            # keywords
+            (r'(?:deprecated|final|foldable|flushable|inline|recursive)\s',
+             Keyword),
+
+            # builtins
+            (builtin_kernel, bygroups(Name.Builtin, Whitespace)),
+            (builtin_assocs, bygroups(Name.Builtin, Whitespace)),
+            (builtin_combinators, bygroups(Name.Builtin, Whitespace)),
+            (builtin_math, bygroups(Name.Builtin, Whitespace)),
+            (builtin_sequences, bygroups(Name.Builtin, Whitespace)),
+            (builtin_namespaces, bygroups(Name.Builtin, Whitespace)),
+            (builtin_arrays, bygroups(Name.Builtin, Whitespace)),
+            (builtin_io, bygroups(Name.Builtin, Whitespace)),
+            (builtin_strings, bygroups(Name.Builtin, Whitespace)),
+            (builtin_vectors, bygroups(Name.Builtin, Whitespace)),
+            (builtin_continuations, bygroups(Name.Builtin, Whitespace)),
+
+            # everything else is text
+            (r'\S+', Text),
+        ],
+        'stackeffect': [
+            (r'\s+', Whitespace),
+            (r'(\()(\s+)', bygroups(Name.Function, Whitespace), 'stackeffect'),
+            (r'(\))(\s+)', bygroups(Name.Function, Whitespace), '#pop'),
+            (r'(--)(\s+)', bygroups(Name.Function, Whitespace)),
+            (r'\S+', Name.Variable),
+        ],
+        'slots': [
+            (r'\s+', Whitespace),
+            (r'(;)(\s+)', bygroups(Keyword, Whitespace), '#pop'),
+            (r'(\{)(\s+)(\S+)(\s+)([^}]+)(\s+)(\})(\s+)',
+             bygroups(Text, Whitespace, Name.Variable, Whitespace,
+                 Text, Whitespace, Text, Whitespace)),
+            (r'\S+', Name.Variable),
+        ],
+        'vocabs': [
+            (r'\s+', Whitespace),
+            (r'(;)(\s+)', bygroups(Keyword, Whitespace), '#pop'),
+            (r'\S+', Name.Namespace),
+        ],
+        'classes': [
+            (r'\s+', Whitespace),
+            (r'(;)(\s+)', bygroups(Keyword, Whitespace), '#pop'),
+            (r'\S+', Name.Class),
+        ],
+        'words': [
+            (r'\s+', Whitespace),
+            (r'(;)(\s+)', bygroups(Keyword, Whitespace), '#pop'),
+            (r'\S+', Name.Function),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/fantom.py b/.venv/Lib/site-packages/pygments/lexers/fantom.py
new file mode 100644 (file)
index 0000000..7228554
--- /dev/null
@@ -0,0 +1,251 @@
+"""
+    pygments.lexers.fantom
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Fantom language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from string import Template
+
+from pygments.lexer import RegexLexer, include, bygroups, using, \
+    this, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal, Whitespace
+
+__all__ = ['FantomLexer']
+
+
+class FantomLexer(RegexLexer):
+    """
+    For Fantom source code.
+    """
+    name = 'Fantom'
+    aliases = ['fan']
+    filenames = ['*.fan']
+    mimetypes = ['application/x-fantom']
+    url = 'https://www.fantom.org'
+    version_added = '1.5'
+
+    # often used regexes
+    def s(str):
+        return Template(str).substitute(
+            dict(
+                pod=r'[\"\w\.]+',
+                eos=r'\n|;',
+                id=r'[a-zA-Z_]\w*',
+                # all chars which can be part of type definition. Starts with
+                # either letter, or [ (maps), or | (funcs)
+                type=r'(?:\[|[a-zA-Z_]|\|)[:\w\[\]|\->?]*?',
+            )
+        )
+
+    tokens = {
+        'comments': [
+            (r'(?s)/\*.*?\*/', Comment.Multiline),           # Multiline
+            (r'//.*?$', Comment.Single),                    # Single line
+            # TODO: highlight references in fandocs
+            (r'\*\*.*?$', Comment.Special),                 # Fandoc
+            (r'#.*$', Comment.Single)                       # Shell-style
+        ],
+        'literals': [
+            (r'\b-?[\d_]+(ns|ms|sec|min|hr|day)', Number),   # Duration
+            (r'\b-?[\d_]*\.[\d_]+(ns|ms|sec|min|hr|day)', Number),  # Duration with dot
+            (r'\b-?(\d+)?\.\d+(f|F|d|D)?', Number.Float),    # Float/Decimal
+            (r'\b-?0x[0-9a-fA-F_]+', Number.Hex),            # Hex
+            (r'\b-?[\d_]+', Number.Integer),                 # Int
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'", String.Char),  # Char
+            (r'"', Punctuation, 'insideStr'),                # Opening quote
+            (r'`', Punctuation, 'insideUri'),                # Opening accent
+            (r'\b(true|false|null)\b', Keyword.Constant),    # Bool & null
+            (r'(?:(\w+)(::))?(\w+)(<\|)(.*?)(\|>)',          # DSL
+             bygroups(Name.Namespace, Punctuation, Name.Class,
+                      Punctuation, String, Punctuation)),
+            (r'(?:(\w+)(::))?(\w+)?(#)(\w+)?',               # Type/slot literal
+             bygroups(Name.Namespace, Punctuation, Name.Class,
+                      Punctuation, Name.Function)),
+            (r'\[,\]', Literal),                             # Empty list
+            (s(r'($type)(\[,\])'),                           # Typed empty list
+             bygroups(using(this, state='inType'), Literal)),
+            (r'\[:\]', Literal),                             # Empty Map
+            (s(r'($type)(\[:\])'),
+             bygroups(using(this, state='inType'), Literal)),
+        ],
+        'insideStr': [
+            (r'\\\\', String.Escape),                        # Escaped backslash
+            (r'\\"', String.Escape),                         # Escaped "
+            (r'\\`', String.Escape),                         # Escaped `
+            (r'\$\w+', String.Interpol),                     # Subst var
+            (r'\$\{.*?\}', String.Interpol),                 # Subst expr
+            (r'"', Punctuation, '#pop'),                     # Closing quot
+            (r'.', String)                                   # String content
+        ],
+        'insideUri': [  # TODO: remove copy/paste str/uri
+            (r'\\\\', String.Escape),                        # Escaped backslash
+            (r'\\"', String.Escape),                         # Escaped "
+            (r'\\`', String.Escape),                         # Escaped `
+            (r'\$\w+', String.Interpol),                     # Subst var
+            (r'\$\{.*?\}', String.Interpol),                 # Subst expr
+            (r'`', Punctuation, '#pop'),                     # Closing tick
+            (r'.', String.Backtick)                          # URI content
+        ],
+        'protectionKeywords': [
+            (r'\b(public|protected|private|internal)\b', Keyword),
+        ],
+        'typeKeywords': [
+            (r'\b(abstract|final|const|native|facet|enum)\b', Keyword),
+        ],
+        'methodKeywords': [
+            (r'\b(abstract|native|once|override|static|virtual|final)\b',
+             Keyword),
+        ],
+        'fieldKeywords': [
+            (r'\b(abstract|const|final|native|override|static|virtual|'
+             r'readonly)\b', Keyword)
+        ],
+        'otherKeywords': [
+            (words((
+                'try', 'catch', 'throw', 'finally', 'for', 'if', 'else', 'while',
+                'as', 'is', 'isnot', 'switch', 'case', 'default', 'continue',
+                'break', 'do', 'return', 'get', 'set'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (r'\b(it|this|super)\b', Name.Builtin.Pseudo),
+        ],
+        'operators': [
+            (r'\+\+|\-\-|\+|\-|\*|/|\|\||&&|<=>|<=|<|>=|>|=|!|\[|\]', Operator)
+        ],
+        'inType': [
+            (r'[\[\]|\->:?]', Punctuation),
+            (s(r'$id'), Name.Class),
+            default('#pop'),
+
+        ],
+        'root': [
+            include('comments'),
+            include('protectionKeywords'),
+            include('typeKeywords'),
+            include('methodKeywords'),
+            include('fieldKeywords'),
+            include('literals'),
+            include('otherKeywords'),
+            include('operators'),
+            (r'using\b', Keyword.Namespace, 'using'),         # Using stmt
+            (r'@\w+', Name.Decorator, 'facet'),               # Symbol
+            (r'(class|mixin)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Class),
+             'inheritance'),                                  # Inheritance list
+
+            # Type var := val
+            (s(r'($type)([ \t]+)($id)(\s*)(:=)'),
+             bygroups(using(this, state='inType'), Whitespace,
+                      Name.Variable, Whitespace, Operator)),
+
+            # var := val
+            (s(r'($id)(\s*)(:=)'),
+             bygroups(Name.Variable, Whitespace, Operator)),
+
+            # .someId( or ->someId( ###
+            (s(r'(\.|(?:\->))($id)(\s*)(\()'),
+             bygroups(Operator, Name.Function, Whitespace, Punctuation),
+             'insideParen'),
+
+            # .someId  or ->someId
+            (s(r'(\.|(?:\->))($id)'),
+             bygroups(Operator, Name.Function)),
+
+            # new makeXXX (
+            (r'(new)(\s+)(make\w*)(\s*)(\()',
+             bygroups(Keyword, Whitespace, Name.Function, Whitespace, Punctuation),
+             'insideMethodDeclArgs'),
+
+            # Type name (
+            (s(r'($type)([ \t]+)'  # Return type and whitespace
+               r'($id)(\s*)(\()'),  # method name + open brace
+             bygroups(using(this, state='inType'), Whitespace,
+                      Name.Function, Whitespace, Punctuation),
+             'insideMethodDeclArgs'),
+
+            # ArgType argName,
+            (s(r'($type)(\s+)($id)(\s*)(,)'),
+             bygroups(using(this, state='inType'), Whitespace, Name.Variable,
+                      Whitespace, Punctuation)),
+
+            # ArgType argName)
+            # Covered in 'insideParen' state
+
+            # ArgType argName -> ArgType|
+            (s(r'($type)(\s+)($id)(\s*)(\->)(\s*)($type)(\|)'),
+             bygroups(using(this, state='inType'), Whitespace, Name.Variable,
+                      Whitespace, Punctuation, Whitespace, using(this, state='inType'),
+                      Punctuation)),
+
+            # ArgType argName|
+            (s(r'($type)(\s+)($id)(\s*)(\|)'),
+             bygroups(using(this, state='inType'), Whitespace, Name.Variable,
+                      Whitespace, Punctuation)),
+
+            # Type var
+            (s(r'($type)([ \t]+)($id)'),
+             bygroups(using(this, state='inType'), Whitespace,
+                      Name.Variable)),
+
+            (r'\(', Punctuation, 'insideParen'),
+            (r'\{', Punctuation, 'insideBrace'),
+            (r'\s+', Whitespace),
+            (r'.', Text)
+        ],
+        'insideParen': [
+            (r'\)', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'insideMethodDeclArgs': [
+            (r'\)', Punctuation, '#pop'),
+            (s(r'($type)(\s+)($id)(\s*)(\))'),
+             bygroups(using(this, state='inType'), Whitespace, Name.Variable,
+                      Whitespace, Punctuation), '#pop'),
+            include('root'),
+        ],
+        'insideBrace': [
+            (r'\}', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'inheritance': [
+            (r'\s+', Whitespace),                                      # Whitespace
+            (r':|,', Punctuation),
+            (r'(?:(\w+)(::))?(\w+)',
+             bygroups(Name.Namespace, Punctuation, Name.Class)),
+            (r'\{', Punctuation, '#pop')
+        ],
+        'using': [
+            (r'[ \t]+', Whitespace),  # consume whitespaces
+            (r'(\[)(\w+)(\])',
+             bygroups(Punctuation, Comment.Special, Punctuation)),  # ffi
+            (r'(\")?([\w.]+)(\")?',
+             bygroups(Punctuation, Name.Namespace, Punctuation)),  # podname
+            (r'::', Punctuation, 'usingClass'),
+            default('#pop')
+        ],
+        'usingClass': [
+            (r'[ \t]+', Whitespace),  # consume whitespaces
+            (r'(as)(\s+)(\w+)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Class), '#pop:2'),
+            (r'[\w$]+', Name.Class),
+            default('#pop:2')  # jump out to root state
+        ],
+        'facet': [
+            (r'\s+', Whitespace),
+            (r'\{', Punctuation, 'facetFields'),
+            default('#pop')
+        ],
+        'facetFields': [
+            include('comments'),
+            include('literals'),
+            include('operators'),
+            (r'\s+', Whitespace),
+            (r'(\s*)(\w+)(\s*)(=)', bygroups(Whitespace, Name, Whitespace, Operator)),
+            (r'\}', Punctuation, '#pop'),
+            (r'\s+', Whitespace),
+            (r'.', Text)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/felix.py b/.venv/Lib/site-packages/pygments/lexers/felix.py
new file mode 100644 (file)
index 0000000..a42ac08
--- /dev/null
@@ -0,0 +1,275 @@
+"""
+    pygments.lexers.felix
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Felix language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, default, words, \
+    combined
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['FelixLexer']
+
+
+class FelixLexer(RegexLexer):
+    """
+    For Felix source code.
+    """
+
+    name = 'Felix'
+    url = 'http://www.felix-lang.org'
+    aliases = ['felix', 'flx']
+    filenames = ['*.flx', '*.flxh']
+    mimetypes = ['text/x-felix']
+    version_added = '1.2'
+
+    preproc = (
+        'elif', 'else', 'endif', 'if', 'ifdef', 'ifndef',
+    )
+
+    keywords = (
+        '_', '_deref', 'all', 'as',
+        'assert', 'attempt', 'call', 'callback', 'case', 'caseno', 'cclass',
+        'code', 'compound', 'ctypes', 'do', 'done', 'downto', 'elif', 'else',
+        'endattempt', 'endcase', 'endif', 'endmatch', 'enum', 'except',
+        'exceptions', 'expect', 'finally', 'for', 'forall', 'forget', 'fork',
+        'functor', 'goto', 'ident', 'if', 'incomplete', 'inherit', 'instance',
+        'interface', 'jump', 'lambda', 'loop', 'match', 'module', 'namespace',
+        'new', 'noexpand', 'nonterm', 'obj', 'of', 'open', 'parse', 'raise',
+        'regexp', 'reglex', 'regmatch', 'rename', 'return', 'the', 'then',
+        'to', 'type', 'typecase', 'typedef', 'typematch', 'typeof', 'upto',
+        'when', 'whilst', 'with', 'yield',
+    )
+
+    keyword_directives = (
+        '_gc_pointer', '_gc_type', 'body', 'comment', 'const', 'export',
+        'header', 'inline', 'lval', 'macro', 'noinline', 'noreturn',
+        'package', 'private', 'pod', 'property', 'public', 'publish',
+        'requires', 'todo', 'virtual', 'use',
+    )
+
+    keyword_declarations = (
+        'def', 'let', 'ref', 'val', 'var',
+    )
+
+    keyword_types = (
+        'unit', 'void', 'any', 'bool',
+        'byte',  'offset',
+        'address', 'caddress', 'cvaddress', 'vaddress',
+        'tiny', 'short', 'int', 'long', 'vlong',
+        'utiny', 'ushort', 'vshort', 'uint', 'ulong', 'uvlong',
+        'int8', 'int16', 'int32', 'int64',
+        'uint8', 'uint16', 'uint32', 'uint64',
+        'float', 'double', 'ldouble',
+        'complex', 'dcomplex', 'lcomplex',
+        'imaginary', 'dimaginary', 'limaginary',
+        'char', 'wchar', 'uchar',
+        'charp', 'charcp', 'ucharp', 'ucharcp',
+        'string', 'wstring', 'ustring',
+        'cont',
+        'array', 'varray', 'list',
+        'lvalue', 'opt', 'slice',
+    )
+
+    keyword_constants = (
+        'false', 'true',
+    )
+
+    operator_words = (
+        'and', 'not', 'in', 'is', 'isin', 'or', 'xor',
+    )
+
+    name_builtins = (
+        '_svc', 'while',
+    )
+
+    name_pseudo = (
+        'root', 'self', 'this',
+    )
+
+    decimal_suffixes = '([tTsSiIlLvV]|ll|LL|([iIuU])(8|16|32|64))?'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+
+            # Keywords
+            (words(('axiom', 'ctor', 'fun', 'gen', 'proc', 'reduce',
+                    'union'), suffix=r'\b'),
+             Keyword, 'funcname'),
+            (words(('class', 'cclass', 'cstruct', 'obj', 'struct'), suffix=r'\b'),
+             Keyword, 'classname'),
+            (r'(instance|module|typeclass)\b', Keyword, 'modulename'),
+
+            (words(keywords, suffix=r'\b'), Keyword),
+            (words(keyword_directives, suffix=r'\b'), Name.Decorator),
+            (words(keyword_declarations, suffix=r'\b'), Keyword.Declaration),
+            (words(keyword_types, suffix=r'\b'), Keyword.Type),
+            (words(keyword_constants, suffix=r'\b'), Keyword.Constant),
+
+            # Operators
+            include('operators'),
+
+            # Float Literal
+            # -- Hex Float
+            (r'0[xX]([0-9a-fA-F_]*\.[0-9a-fA-F_]+|[0-9a-fA-F_]+)'
+             r'[pP][+\-]?[0-9_]+[lLfFdD]?', Number.Float),
+            # -- DecimalFloat
+            (r'[0-9_]+(\.[0-9_]+[eE][+\-]?[0-9_]+|'
+             r'\.[0-9_]*|[eE][+\-]?[0-9_]+)[lLfFdD]?', Number.Float),
+            (r'\.(0|[1-9][0-9_]*)([eE][+\-]?[0-9_]+)?[lLfFdD]?',
+             Number.Float),
+
+            # IntegerLiteral
+            # -- Binary
+            (rf'0[Bb][01_]+{decimal_suffixes}', Number.Bin),
+            # -- Octal
+            (rf'0[0-7_]+{decimal_suffixes}', Number.Oct),
+            # -- Hexadecimal
+            (rf'0[xX][0-9a-fA-F_]+{decimal_suffixes}', Number.Hex),
+            # -- Decimal
+            (rf'(0|[1-9][0-9_]*){decimal_suffixes}', Number.Integer),
+
+            # Strings
+            ('([rR][cC]?|[cC][rR])"""', String, 'tdqs'),
+            ("([rR][cC]?|[cC][rR])'''", String, 'tsqs'),
+            ('([rR][cC]?|[cC][rR])"', String, 'dqs'),
+            ("([rR][cC]?|[cC][rR])'", String, 'sqs'),
+            ('[cCfFqQwWuU]?"""', String, combined('stringescape', 'tdqs')),
+            ("[cCfFqQwWuU]?'''", String, combined('stringescape', 'tsqs')),
+            ('[cCfFqQwWuU]?"', String, combined('stringescape', 'dqs')),
+            ("[cCfFqQwWuU]?'", String, combined('stringescape', 'sqs')),
+
+            # Punctuation
+            (r'[\[\]{}:(),;?]', Punctuation),
+
+            # Labels
+            (r'[a-zA-Z_]\w*:>', Name.Label),
+
+            # Identifiers
+            (r'({})\b'.format('|'.join(name_builtins)), Name.Builtin),
+            (r'({})\b'.format('|'.join(name_pseudo)), Name.Builtin.Pseudo),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+
+            include('comment'),
+
+            # Preprocessor
+            (r'(#)(\s*)(if)(\s+)(0)',
+                bygroups(Comment.Preproc, Whitespace, Comment.Preproc,
+                    Whitespace, Comment.Preproc), 'if0'),
+            (r'#', Comment.Preproc, 'macro'),
+        ],
+        'operators': [
+            (r'({})\b'.format('|'.join(operator_words)), Operator.Word),
+            (r'!=|==|<<|>>|\|\||&&|[-~+/*%=<>&^|.$]', Operator),
+        ],
+        'comment': [
+            (r'//(.*?)$', Comment.Single),
+            (r'/[*]', Comment.Multiline, 'comment2'),
+        ],
+        'comment2': [
+            (r'[^/*]', Comment.Multiline),
+            (r'/[*]', Comment.Multiline, '#push'),
+            (r'[*]/', Comment.Multiline, '#pop'),
+            (r'[/*]', Comment.Multiline),
+        ],
+        'if0': [
+            (r'^(\s*)(#if.*?(?<!\\))(\n)',
+                bygroups(Whitespace, Comment, Whitespace), '#push'),
+            (r'^(\s*)(#endif.*?(?<!\\))(\n)',
+                bygroups(Whitespace, Comment, Whitespace), '#pop'),
+            (r'(.*?)(\n)', bygroups(Comment, Whitespace)),
+        ],
+        'macro': [
+            include('comment'),
+            (r'(import|include)(\s+)(<[^>]*?>)',
+             bygroups(Comment.Preproc, Whitespace, String), '#pop'),
+            (r'(import|include)(\s+)("[^"]*?")',
+             bygroups(Comment.Preproc, Whitespace, String), '#pop'),
+            (r"(import|include)(\s+)('[^']*?')",
+             bygroups(Comment.Preproc, Whitespace, String), '#pop'),
+            (r'[^/\n]+', Comment.Preproc),
+            # (r'/[*](.|\n)*?[*]/', Comment),
+            # (r'//.*?\n', Comment, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'funcname': [
+            include('whitespace'),
+            (r'[a-zA-Z_]\w*', Name.Function, '#pop'),
+            # anonymous functions
+            (r'(?=\()', Text, '#pop'),
+        ],
+        'classname': [
+            include('whitespace'),
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            # anonymous classes
+            (r'(?=\{)', Text, '#pop'),
+        ],
+        'modulename': [
+            include('whitespace'),
+            (r'\[', Punctuation, ('modulename2', 'tvarlist')),
+            default('modulename2'),
+        ],
+        'modulename2': [
+            include('whitespace'),
+            (r'([a-zA-Z_]\w*)', Name.Namespace, '#pop:2'),
+        ],
+        'tvarlist': [
+            include('whitespace'),
+            include('operators'),
+            (r'\[', Punctuation, '#push'),
+            (r'\]', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'(with|where)\b', Keyword),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'strings': [
+            (r'%(\([a-zA-Z0-9]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsux%]', String.Interpol),
+            (r'[^\\\'"%\n]+', String),
+            # quotes, percents and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+            # unhandled string formatting sign
+            (r'%', String)
+            # newlines are an error (use "nl" state)
+        ],
+        'nl': [
+            (r'\n', String)
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            # included here again for raw strings
+            (r'\\\\|\\"|\\\n', String.Escape),
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            # included here again for raw strings
+            (r"\\\\|\\'|\\\n", String.Escape),
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            include('strings'),
+            include('nl')
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop'),
+            include('strings'),
+            include('nl')
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/fift.py b/.venv/Lib/site-packages/pygments/lexers/fift.py
new file mode 100644 (file)
index 0000000..1263236
--- /dev/null
@@ -0,0 +1,68 @@
+"""
+    pygments.lexers.fift
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for fift.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include
+from pygments.token import Literal, Comment, Name, String, Number, Whitespace
+
+__all__ = ['FiftLexer']
+
+
+class FiftLexer(RegexLexer):
+    """
+    For Fift source code.
+    """
+
+    name = 'Fift'
+    aliases = ['fift', 'fif']
+    filenames = ['*.fif']
+    url = 'https://ton-blockchain.github.io/docs/fiftbase.pdf'
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+
+            include('comments'),
+
+            (r'[\.+]?\"', String, 'string'),
+
+            # numbers
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'0b[01]+', Number.Bin),
+            (r'-?[0-9]+("/"-?[0-9]+)?', Number.Decimal),
+
+            # slices
+            (r'b\{[01]+\}', Literal),
+            (r'x\{[0-9a-fA-F_]+\}', Literal),
+
+            # byte literal
+            (r'B\{[0-9a-fA-F_]+\}', Literal),
+
+            # treat anything as word
+            (r'\S+', Name)
+        ],
+
+        'string': [
+            (r'\\.', String.Escape),
+            (r'\"', String, '#pop'),
+            (r'[^\"\r\n\\]+', String)
+        ],
+
+        'comments': [
+            (r'//.*', Comment.Singleline),
+            (r'/\*', Comment.Multiline, 'comment'),
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/floscript.py b/.venv/Lib/site-packages/pygments/lexers/floscript.py
new file mode 100644 (file)
index 0000000..9c7eaab
--- /dev/null
@@ -0,0 +1,81 @@
+"""
+    pygments.lexers.floscript
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for FloScript
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['FloScriptLexer']
+
+
+class FloScriptLexer(RegexLexer):
+    """
+    For FloScript configuration language source code.
+    """
+
+    name = 'FloScript'
+    url = 'https://github.com/ioflo/ioflo'
+    aliases = ['floscript', 'flo']
+    filenames = ['*.flo']
+    version_added = '2.4'
+
+    def innerstring_rules(ttype):
+        return [
+            # the old style '%s' % (...) string formatting
+            (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsux%]', String.Interpol),
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"%\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # unhandled string formatting sign
+            (r'%', ttype),
+            # newlines are an error (use "nl" state)
+        ]
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+
+            (r'[]{}:(),;[]', Punctuation),
+            (r'(\\)(\n)', bygroups(Text, Whitespace)),
+            (r'\\', Text),
+            (r'(to|by|with|from|per|for|cum|qua|via|as|at|in|of|on|re|is|if|be|into|'
+             r'and|not)\b', Operator.Word),
+            (r'!=|==|<<|>>|[-~+/*%=<>&^|.]', Operator),
+            (r'(load|init|server|logger|log|loggee|first|over|under|next|done|timeout|'
+             r'repeat|native|benter|enter|recur|exit|precur|renter|rexit|print|put|inc|'
+             r'copy|set|aux|rear|raze|go|let|do|bid|ready|start|stop|run|abort|use|flo|'
+             r'give|take)\b', Name.Builtin),
+            (r'(frame|framer|house)\b', Keyword),
+            ('"', String, 'string'),
+
+            include('name'),
+            include('numbers'),
+            (r'#.+$', Comment.Single),
+        ],
+        'string': [
+            ('[^"]+', String),
+            ('"', String, '#pop'),
+        ],
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+j?', Number.Float),
+            (r'0[0-7]+j?', Number.Oct),
+            (r'0[bB][01]+', Number.Bin),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+j?', Number.Integer)
+        ],
+
+        'name': [
+            (r'@[\w.]+', Name.Decorator),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/forth.py b/.venv/Lib/site-packages/pygments/lexers/forth.py
new file mode 100644 (file)
index 0000000..51f75af
--- /dev/null
@@ -0,0 +1,178 @@
+"""
+    pygments.lexers.forth
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Forth language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Text, Comment, Keyword, Name, String, Number, \
+    Whitespace
+
+
+__all__ = ['ForthLexer']
+
+
+class ForthLexer(RegexLexer):
+    """
+    Lexer for Forth files.
+    """
+    name = 'Forth'
+    url = 'https://www.forth.com/forth/'
+    aliases = ['forth']
+    filenames = ['*.frt', '*.fs']
+    mimetypes = ['application/x-forth']
+    version_added = '2.2'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            # All comment types
+            (r'\\.*?$', Comment.Single),
+            (r'\([\s].*?\)', Comment.Single),
+            # defining words. The next word is a new command name
+            (r'(:|variable|constant|value|buffer:)(\s+)',
+             bygroups(Keyword.Namespace, Whitespace), 'worddef'),
+            # strings are rather simple
+            (r'([.sc]")(\s+?)', bygroups(String, Whitespace), 'stringdef'),
+            # keywords from the various wordsets
+            # *** Wordset BLOCK
+            (r'(blk|block|buffer|evaluate|flush|load|save-buffers|update|'
+             # *** Wordset BLOCK-EXT
+             r'empty-buffers|list|refill|scr|thru|'
+             # *** Wordset CORE
+             r'\#s|\*\/mod|\+loop|\/mod|0<|0=|1\+|1-|2!|'
+             r'2\*|2\/|2@|2drop|2dup|2over|2swap|>body|'
+             r'>in|>number|>r|\?dup|abort|abort\"|abs|'
+             r'accept|align|aligned|allot|and|base|begin|'
+             r'bl|c!|c,|c@|cell\+|cells|char|char\+|'
+             r'chars|constant|count|cr|create|decimal|'
+             r'depth|do|does>|drop|dup|else|emit|environment\?|'
+             r'evaluate|execute|exit|fill|find|fm\/mod|'
+             r'here|hold|i|if|immediate|invert|j|key|'
+             r'leave|literal|loop|lshift|m\*|max|min|'
+             r'mod|move|negate|or|over|postpone|quit|'
+             r'r>|r@|recurse|repeat|rot|rshift|s\"|s>d|'
+             r'sign|sm\/rem|source|space|spaces|state|swap|'
+             r'then|type|u\.|u\<|um\*|um\/mod|unloop|until|'
+             r'variable|while|word|xor|\[char\]|\[\'\]|'
+             r'@|!|\#|<\#|\#>|:|;|\+|-|\*|\/|,|<|>|\|1\+|1-|\.|'
+             # *** Wordset CORE-EXT
+             r'\.r|0<>|'
+             r'0>|2>r|2r>|2r@|:noname|\?do|again|c\"|'
+             r'case|compile,|endcase|endof|erase|false|'
+             r'hex|marker|nip|of|pad|parse|pick|refill|'
+             r'restore-input|roll|save-input|source-id|to|'
+             r'true|tuck|u\.r|u>|unused|value|within|'
+             r'\[compile\]|'
+             # *** Wordset CORE-EXT-obsolescent
+             r'\#tib|convert|expect|query|span|'
+             r'tib|'
+             # *** Wordset DOUBLE
+             r'2constant|2literal|2variable|d\+|d-|'
+             r'd\.|d\.r|d0<|d0=|d2\*|d2\/|d<|d=|d>s|'
+             r'dabs|dmax|dmin|dnegate|m\*\/|m\+|'
+             # *** Wordset DOUBLE-EXT
+             r'2rot|du<|'
+             # *** Wordset EXCEPTION
+             r'catch|throw|'
+             # *** Wordset EXCEPTION-EXT
+             r'abort|abort\"|'
+             # *** Wordset FACILITY
+             r'at-xy|key\?|page|'
+             # *** Wordset FACILITY-EXT
+             r'ekey|ekey>char|ekey\?|emit\?|ms|time&date|'
+             # *** Wordset FILE
+             r'BIN|CLOSE-FILE|CREATE-FILE|DELETE-FILE|FILE-POSITION|'
+             r'FILE-SIZE|INCLUDE-FILE|INCLUDED|OPEN-FILE|R\/O|'
+             r'R\/W|READ-FILE|READ-LINE|REPOSITION-FILE|RESIZE-FILE|'
+             r'S\"|SOURCE-ID|W/O|WRITE-FILE|WRITE-LINE|'
+             # *** Wordset FILE-EXT
+             r'FILE-STATUS|FLUSH-FILE|REFILL|RENAME-FILE|'
+             # *** Wordset FLOAT
+             r'>float|d>f|'
+             r'f!|f\*|f\+|f-|f\/|f0<|f0=|f<|f>d|f@|'
+             r'falign|faligned|fconstant|fdepth|fdrop|fdup|'
+             r'fliteral|float\+|floats|floor|fmax|fmin|'
+             r'fnegate|fover|frot|fround|fswap|fvariable|'
+             r'represent|'
+             # *** Wordset FLOAT-EXT
+             r'df!|df@|dfalign|dfaligned|dfloat\+|'
+             r'dfloats|f\*\*|f\.|fabs|facos|facosh|falog|'
+             r'fasin|fasinh|fatan|fatan2|fatanh|fcos|fcosh|'
+             r'fe\.|fexp|fexpm1|fln|flnp1|flog|fs\.|fsin|'
+             r'fsincos|fsinh|fsqrt|ftan|ftanh|f~|precision|'
+             r'set-precision|sf!|sf@|sfalign|sfaligned|sfloat\+|'
+             r'sfloats|'
+             # *** Wordset LOCAL
+             r'\(local\)|to|'
+             # *** Wordset LOCAL-EXT
+             r'locals\||'
+             # *** Wordset MEMORY
+             r'allocate|free|resize|'
+             # *** Wordset SEARCH
+             r'definitions|find|forth-wordlist|get-current|'
+             r'get-order|search-wordlist|set-current|set-order|'
+             r'wordlist|'
+             # *** Wordset SEARCH-EXT
+             r'also|forth|only|order|previous|'
+             # *** Wordset STRING
+             r'-trailing|\/string|blank|cmove|cmove>|compare|'
+             r'search|sliteral|'
+             # *** Wordset TOOLS
+             r'.s|dump|see|words|'
+             # *** Wordset TOOLS-EXT
+             r';code|'
+             r'ahead|assembler|bye|code|cs-pick|cs-roll|'
+             r'editor|state|\[else\]|\[if\]|\[then\]|'
+             # *** Wordset TOOLS-EXT-obsolescent
+             r'forget|'
+             # Forth 2012
+             r'defer|defer@|defer!|action-of|begin-structure|field:|buffer:|'
+             r'parse-name|buffer:|traverse-wordlist|n>r|nr>|2value|fvalue|'
+             r'name>interpret|name>compile|name>string|'
+             r'cfield:|end-structure)(?!\S)', Keyword),
+
+            # Numbers
+            (r'(\$[0-9A-F]+)', Number.Hex),
+            (r'(\#|%|&|\-|\+)?[0-9]+', Number.Integer),
+            (r'(\#|%|&|\-|\+)?[0-9.]+', Keyword.Type),
+            # amforth specific
+            (r'(@i|!i|@e|!e|pause|noop|turnkey|sleep|'
+             r'itype|icompare|sp@|sp!|rp@|rp!|up@|up!|'
+             r'>a|a>|a@|a!|a@+|a@-|>b|b>|b@|b!|b@+|b@-|'
+             r'find-name|1ms|'
+             r'sp0|rp0|\(evaluate\)|int-trap|int!)(?!\S)',
+             Name.Constant),
+            # a proposal
+            (r'(do-recognizer|r:fail|recognizer:|get-recognizers|'
+             r'set-recognizers|r:float|r>comp|r>int|r>post|'
+             r'r:name|r:word|r:dnum|r:num|recognizer|forth-recognizer|'
+             r'rec:num|rec:float|rec:word)(?!\S)', Name.Decorator),
+            # defining words. The next word is a new command name
+            (r'(Evalue|Rvalue|Uvalue|Edefer|Rdefer|Udefer)(\s+)',
+             bygroups(Keyword.Namespace, Text), 'worddef'),
+
+            (r'\S+', Name.Function),      # Anything else is executed
+
+        ],
+        'worddef': [
+            (r'\S+', Name.Class, '#pop'),
+        ],
+        'stringdef': [
+            (r'[^"]+', String, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        """Forth uses : COMMAND ; quite a lot in a single line, so we're trying
+        to find that."""
+        if re.search('\n:[^\n]+;\n', text):
+            return 0.3
diff --git a/.venv/Lib/site-packages/pygments/lexers/fortran.py b/.venv/Lib/site-packages/pygments/lexers/fortran.py
new file mode 100644 (file)
index 0000000..a6230f0
--- /dev/null
@@ -0,0 +1,212 @@
+"""
+    pygments.lexers.fortran
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Fortran languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, include, words, using, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic
+
+__all__ = ['FortranLexer', 'FortranFixedLexer']
+
+
+class FortranLexer(RegexLexer):
+    """
+    Lexer for FORTRAN 90 code.
+    """
+    name = 'Fortran'
+    url = 'https://fortran-lang.org/'
+    aliases = ['fortran', 'f90']
+    filenames = ['*.f03', '*.f90', '*.F03', '*.F90']
+    mimetypes = ['text/x-fortran']
+    version_added = '0.10'
+    flags = re.IGNORECASE | re.MULTILINE
+
+    # Data Types: INTEGER, REAL, COMPLEX, LOGICAL, CHARACTER and DOUBLE PRECISION
+    # Operators: **, *, +, -, /, <, >, <=, >=, ==, /=
+    # Logical (?): NOT, AND, OR, EQV, NEQV
+
+    # Builtins:
+    # http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Table-of-Intrinsic-Functions.html
+
+    tokens = {
+        'root': [
+            (r'^#.*\n', Comment.Preproc),
+            (r'!.*\n', Comment),
+            include('strings'),
+            include('core'),
+            (r'[a-z][\w$]*', Name),
+            include('nums'),
+            (r'[\s]+', Text.Whitespace),
+        ],
+        'core': [
+            # Statements
+
+            (r'\b(DO)(\s+)(CONCURRENT)\b', bygroups(Keyword, Text.Whitespace, Keyword)),
+            (r'\b(GO)(\s*)(TO)\b', bygroups(Keyword, Text.Whitespace, Keyword)),
+
+            (words((
+                'ABSTRACT', 'ACCEPT', 'ALL', 'ALLSTOP', 'ALLOCATABLE', 'ALLOCATE',
+                'ARRAY', 'ASSIGN', 'ASSOCIATE', 'ASYNCHRONOUS', 'BACKSPACE', 'BIND',
+                'BLOCK', 'BLOCKDATA', 'BYTE', 'CALL', 'CASE', 'CLASS', 'CLOSE',
+                'CODIMENSION', 'COMMON', 'CONTIGUOUS', 'CONTAINS',
+                'CONTINUE', 'CRITICAL', 'CYCLE', 'DATA', 'DEALLOCATE', 'DECODE',
+                'DEFERRED', 'DIMENSION', 'DO', 'ELEMENTAL', 'ELSE', 'ELSEIF', 'ENCODE',
+                'END', 'ENDASSOCIATE', 'ENDBLOCK', 'ENDDO', 'ENDENUM', 'ENDFORALL',
+                'ENDFUNCTION',  'ENDIF', 'ENDINTERFACE', 'ENDMODULE', 'ENDPROGRAM',
+                'ENDSELECT', 'ENDSUBMODULE', 'ENDSUBROUTINE', 'ENDTYPE', 'ENDWHERE',
+                'ENTRY', 'ENUM', 'ENUMERATOR', 'EQUIVALENCE', 'ERROR STOP', 'EXIT',
+                'EXTENDS', 'EXTERNAL', 'EXTRINSIC', 'FILE', 'FINAL', 'FORALL', 'FORMAT',
+                'FUNCTION', 'GENERIC', 'IF', 'IMAGES', 'IMPLICIT',
+                'IMPORT', 'IMPURE', 'INCLUDE', 'INQUIRE', 'INTENT', 'INTERFACE',
+                'INTRINSIC', 'IS', 'LOCK', 'MEMORY', 'MODULE', 'NAMELIST', 'NULLIFY',
+                'NONE', 'NON_INTRINSIC', 'NON_OVERRIDABLE', 'NOPASS', 'ONLY', 'OPEN',
+                'OPTIONAL', 'OPTIONS', 'PARAMETER', 'PASS', 'PAUSE', 'POINTER', 'PRINT',
+                'PRIVATE', 'PROGRAM', 'PROCEDURE', 'PROTECTED', 'PUBLIC', 'PURE', 'READ',
+                'RECURSIVE', 'RESULT', 'RETURN', 'REWIND', 'SAVE', 'SELECT', 'SEQUENCE',
+                'STOP', 'SUBMODULE', 'SUBROUTINE', 'SYNC', 'SYNCALL', 'SYNCIMAGES',
+                'SYNCMEMORY', 'TARGET', 'THEN', 'TYPE', 'UNLOCK', 'USE', 'VALUE',
+                'VOLATILE', 'WHERE', 'WRITE', 'WHILE'), prefix=r'\b', suffix=r'\s*\b'),
+             Keyword),
+
+            # Data Types
+            (words((
+                'CHARACTER', 'COMPLEX', 'DOUBLE PRECISION', 'DOUBLE COMPLEX', 'INTEGER',
+                'LOGICAL', 'REAL', 'C_INT', 'C_SHORT', 'C_LONG', 'C_LONG_LONG',
+                'C_SIGNED_CHAR', 'C_SIZE_T', 'C_INT8_T', 'C_INT16_T', 'C_INT32_T',
+                'C_INT64_T', 'C_INT_LEAST8_T', 'C_INT_LEAST16_T', 'C_INT_LEAST32_T',
+                'C_INT_LEAST64_T', 'C_INT_FAST8_T', 'C_INT_FAST16_T', 'C_INT_FAST32_T',
+                'C_INT_FAST64_T', 'C_INTMAX_T', 'C_INTPTR_T', 'C_FLOAT', 'C_DOUBLE',
+                'C_LONG_DOUBLE', 'C_FLOAT_COMPLEX', 'C_DOUBLE_COMPLEX',
+                'C_LONG_DOUBLE_COMPLEX', 'C_BOOL', 'C_CHAR', 'C_PTR', 'C_FUNPTR'),
+                   prefix=r'\b', suffix=r'\s*\b'),
+             Keyword.Type),
+
+            # Operators
+            (r'(\*\*|\*|\+|-|\/|<|>|<=|>=|==|\/=|=)', Operator),
+
+            (r'(::)', Keyword.Declaration),
+
+            (r'[()\[\],:&%;.]', Punctuation),
+            # Intrinsics
+            (words((
+                'Abort', 'Abs', 'Access', 'AChar', 'ACos', 'ACosH', 'AdjustL',
+                'AdjustR', 'AImag', 'AInt', 'Alarm', 'All', 'Allocated', 'ALog',
+                'AMax', 'AMin', 'AMod', 'And', 'ANInt', 'Any', 'ASin', 'ASinH',
+                'Associated', 'ATan', 'ATanH', 'Atomic_Define', 'Atomic_Ref',
+                'BesJ', 'BesJN', 'Bessel_J0', 'Bessel_J1', 'Bessel_JN', 'Bessel_Y0',
+                'Bessel_Y1', 'Bessel_YN', 'BesY', 'BesYN', 'BGE', 'BGT', 'BLE',
+                'BLT', 'Bit_Size', 'BTest', 'CAbs', 'CCos', 'Ceiling', 'CExp',
+                'Char', 'ChDir', 'ChMod', 'CLog', 'Cmplx', 'Command_Argument_Count',
+                'Complex', 'Conjg', 'Cos', 'CosH', 'Count', 'CPU_Time', 'CShift',
+                'CSin', 'CSqRt', 'CTime', 'C_Loc', 'C_Associated',
+                'C_Null_Ptr', 'C_Null_Funptr', 'C_F_Pointer', 'C_F_ProcPointer',
+                'C_Null_Char', 'C_Alert', 'C_Backspace', 'C_Form_Feed', 'C_FunLoc',
+                'C_Sizeof', 'C_New_Line', 'C_Carriage_Return',
+                'C_Horizontal_Tab', 'C_Vertical_Tab', 'DAbs', 'DACos', 'DASin',
+                'DATan', 'Date_and_Time', 'DbesJ', 'DbesJN', 'DbesY',
+                'DbesYN', 'Dble', 'DCos', 'DCosH', 'DDiM', 'DErF',
+                'DErFC', 'DExp', 'Digits', 'DiM', 'DInt', 'DLog', 'DMax',
+                'DMin', 'DMod', 'DNInt', 'Dot_Product', 'DProd', 'DSign', 'DSinH',
+                'DShiftL', 'DShiftR', 'DSin', 'DSqRt', 'DTanH', 'DTan', 'DTime',
+                'EOShift', 'Epsilon', 'ErF', 'ErFC', 'ErFC_Scaled', 'ETime',
+                'Execute_Command_Line', 'Exit', 'Exp', 'Exponent', 'Extends_Type_Of',
+                'FDate', 'FGet', 'FGetC', 'FindLoc', 'Float', 'Floor', 'Flush',
+                'FNum', 'FPutC', 'FPut', 'Fraction', 'FSeek', 'FStat', 'FTell',
+                'Gamma', 'GError', 'GetArg', 'Get_Command', 'Get_Command_Argument',
+                'Get_Environment_Variable', 'GetCWD', 'GetEnv', 'GetGId', 'GetLog',
+                'GetPId', 'GetUId', 'GMTime', 'HostNm', 'Huge', 'Hypot', 'IAbs',
+                'IAChar', 'IAll', 'IAnd', 'IAny', 'IArgC', 'IBClr', 'IBits',
+                'IBSet', 'IChar', 'IDate', 'IDiM', 'IDInt', 'IDNInt', 'IEOr',
+                'IErrNo', 'IFix', 'Imag', 'ImagPart', 'Image_Index', 'Index',
+                'Int', 'IOr', 'IParity', 'IRand', 'IsaTty', 'IShft', 'IShftC',
+                'ISign', 'Iso_C_Binding', 'Is_Contiguous', 'Is_Iostat_End',
+                'Is_Iostat_Eor', 'ITime', 'Kill', 'Kind', 'LBound', 'LCoBound',
+                'Len', 'Len_Trim', 'LGe', 'LGt', 'Link', 'LLe', 'LLt', 'LnBlnk',
+                'Loc', 'Log', 'Log_Gamma', 'Logical', 'Long', 'LShift', 'LStat',
+                'LTime', 'MaskL', 'MaskR', 'MatMul', 'Max', 'MaxExponent',
+                'MaxLoc', 'MaxVal', 'MClock', 'Merge', 'Merge_Bits', 'Move_Alloc',
+                'Min', 'MinExponent', 'MinLoc', 'MinVal', 'Mod', 'Modulo', 'MvBits',
+                'Nearest', 'New_Line', 'NInt', 'Norm2', 'Not', 'Null', 'Num_Images',
+                'Or', 'Pack', 'Parity', 'PError', 'Precision', 'Present', 'Product',
+                'Radix', 'Rand', 'Random_Number', 'Random_Seed', 'Range', 'Real',
+                'RealPart', 'Rename', 'Repeat', 'Reshape', 'RRSpacing', 'RShift',
+                'Same_Type_As', 'Scale', 'Scan', 'Second', 'Selected_Char_Kind',
+                'Selected_Int_Kind', 'Selected_Real_Kind', 'Set_Exponent', 'Shape',
+                'ShiftA', 'ShiftL', 'ShiftR', 'Short', 'Sign', 'Signal', 'SinH',
+                'Sin', 'Sleep', 'Sngl', 'Spacing', 'Spread', 'SqRt', 'SRand',
+                'Stat', 'Storage_Size', 'Sum', 'SymLnk', 'System', 'System_Clock',
+                'Tan', 'TanH', 'Time', 'This_Image', 'Tiny', 'TrailZ', 'Transfer',
+                'Transpose', 'Trim', 'TtyNam', 'UBound', 'UCoBound', 'UMask',
+                'Unlink', 'Unpack', 'Verify', 'XOr', 'ZAbs', 'ZCos', 'ZExp',
+                'ZLog', 'ZSin', 'ZSqRt'), prefix=r'\b', suffix=r'\s*\b'),
+             Name.Builtin),
+
+            # Booleans
+            (r'\.(true|false)\.', Name.Builtin),
+            # Comparing Operators
+            (r'\.(eq|ne|lt|le|gt|ge|not|and|or|eqv|neqv)\.', Operator.Word),
+        ],
+
+        'strings': [
+            (r'"(\\[0-7]+|\\[^0-7]|[^"\\])*"', String.Double),
+            (r"'(\\[0-7]+|\\[^0-7]|[^'\\])*'", String.Single),
+        ],
+
+        'nums': [
+            (r'\d+(?![.e])(_([1-9]|[a-z]\w*))?', Number.Integer),
+            (r'[+-]?\d*\.\d+([ed][-+]?\d+)?(_([1-9]|[a-z]\w*))?', Number.Float),
+            (r'[+-]?\d+\.\d*([ed][-+]?\d+)?(_([1-9]|[a-z]\w*))?', Number.Float),
+            (r'[+-]?\d+(\.\d*)?[ed][-+]?\d+(_([1-9]|[a-z]\w*))?', Number.Float),
+        ],
+    }
+
+
+class FortranFixedLexer(RegexLexer):
+    """
+    Lexer for fixed format Fortran.
+    """
+    name = 'FortranFixed'
+    aliases = ['fortranfixed']
+    filenames = ['*.f', '*.F']
+    url = 'https://fortran-lang.org/'
+    version_added = '2.1'
+
+    flags = re.IGNORECASE
+
+    def _lex_fortran(self, match, ctx=None):
+        """Lex a line just as free form fortran without line break."""
+        lexer = FortranLexer()
+        text = match.group(0) + "\n"
+        for index, token, value in lexer.get_tokens_unprocessed(text):
+            value = value.replace('\n', '')
+            if value != '':
+                yield index, token, value
+
+    tokens = {
+        'root': [
+            (r'[C*].*\n', Comment),
+            (r'#.*\n', Comment.Preproc),
+            (r' {0,4}!.*\n', Comment),
+            (r'(.{5})', Name.Label, 'cont-char'),
+            (r'.*\n', using(FortranLexer)),
+        ],
+        'cont-char': [
+            (' ', Text, 'code'),
+            ('0', Comment, 'code'),
+            ('.', Generic.Strong, 'code'),
+        ],
+        'code': [
+            (r'(.{66})(.*)(\n)',
+             bygroups(_lex_fortran, Comment, Text.Whitespace), 'root'),
+            (r'(.*)(\n)', bygroups(_lex_fortran, Text.Whitespace), 'root'),
+            default('root'),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/foxpro.py b/.venv/Lib/site-packages/pygments/lexers/foxpro.py
new file mode 100644 (file)
index 0000000..3e7c056
--- /dev/null
@@ -0,0 +1,427 @@
+"""
+    pygments.lexers.foxpro
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Simple lexer for Microsoft Visual FoxPro source code.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer
+from pygments.token import Punctuation, Text, Comment, Operator, Keyword, \
+    Name, String
+
+__all__ = ['FoxProLexer']
+
+
+class FoxProLexer(RegexLexer):
+    """Lexer for Microsoft Visual FoxPro language.
+
+    FoxPro syntax allows to shorten all keywords and function names
+    to 4 characters.  Shortened forms are not recognized by this lexer.
+    """
+
+    name = 'FoxPro'
+    aliases = ['foxpro', 'vfp', 'clipper', 'xbase']
+    filenames = ['*.PRG', '*.prg']
+    version_added = '1.6'
+    mimetype = []
+    url = 'https://learn.microsoft.com/en-us/previous-versions/visualstudio/foxpro'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r';\s*\n', Punctuation),  # consume newline
+            (r'(^|\n)\s*', Text, 'newline'),
+
+            # Square brackets may be used for array indices
+            # and for string literal.  Look for arrays
+            # before matching string literals.
+            (r'(?<=\w)\[[0-9, ]+\]', Text),
+            (r'\'[^\'\n]*\'|"[^"\n]*"|\[[^]*]\]', String),
+            (r'(^\s*\*|&&|&amp;&amp;).*?\n', Comment.Single),
+
+            (r'(ABS|ACLASS|ACOPY|ACOS|ADATABASES|ADBOBJECTS|ADDBS|'
+             r'ADDPROPERTY|ADEL|ADIR|ADLLS|ADOCKSTATE|AELEMENT|AERROR|'
+             r'AEVENTS|AFIELDS|AFONT|AGETCLASS|AGETFILEVERSION|AINS|'
+             r'AINSTANCE|ALANGUAGE|ALEN|ALIAS|ALINES|ALLTRIM|'
+             r'AMEMBERS|AMOUSEOBJ|ANETRESOURCES|APRINTERS|APROCINFO|'
+             r'ASC|ASCAN|ASELOBJ|ASESSIONS|ASIN|ASORT|ASQLHANDLES|'
+             r'ASTACKINFO|ASUBSCRIPT|AT|AT_C|ATAGINFO|ATAN|ATC|ATCC|'
+             r'ATCLINE|ATLINE|ATN2|AUSED|AVCXCLASSES|BAR|BARCOUNT|'
+             r'BARPROMPT|BETWEEN|BINDEVENT|BINTOC|BITAND|BITCLEAR|'
+             r'BITLSHIFT|BITNOT|BITOR|BITRSHIFT|BITSET|BITTEST|BITXOR|'
+             r'BOF|CANDIDATE|CAPSLOCK|CAST|CDOW|CDX|CEILING|CHR|CHRSAW|'
+             r'CHRTRAN|CHRTRANC|CLEARRESULTSET|CMONTH|CNTBAR|CNTPAD|COL|'
+             r'COM|Functions|COMARRAY|COMCLASSINFO|COMPOBJ|COMPROP|'
+             r'COMRETURNERROR|COS|CPCONVERT|CPCURRENT|CPDBF|CREATEBINARY|'
+             r'CREATEOBJECT|CREATEOBJECTEX|CREATEOFFLINE|CTOBIN|CTOD|'
+             r'CTOT|CURDIR|CURSORGETPROP|CURSORSETPROP|CURSORTOXML|'
+             r'CURVAL|DATE|DATETIME|DAY|DBC|DBF|DBGETPROP|DBSETPROP|'
+             r'DBUSED|DDEAbortTrans|DDEAdvise|DDEEnabled|DDEExecute|'
+             r'DDEInitiate|DDELastError|DDEPoke|DDERequest|DDESetOption|'
+             r'DDESetService|DDESetTopic|DDETerminate|DEFAULTEXT|'
+             r'DELETED|DESCENDING|DIFFERENCE|DIRECTORY|DISKSPACE|'
+             r'DisplayPath|DMY|DODEFAULT|DOW|DRIVETYPE|DROPOFFLINE|'
+             r'DTOC|DTOR|DTOS|DTOT|EDITSOURCE|EMPTY|EOF|ERROR|EVAL(UATE)?|'
+             r'EVENTHANDLER|EVL|EXECSCRIPT|EXP|FCHSIZE|FCLOSE|FCOUNT|'
+             r'FCREATE|FDATE|FEOF|FERROR|FFLUSH|FGETS|FIELD|FILE|'
+             r'FILETOSTR|FILTER|FKLABEL|FKMAX|FLDLIST|FLOCK|FLOOR|'
+             r'FONTMETRIC|FOPEN|FOR|FORCEEXT|FORCEPATH|FOUND|FPUTS|'
+             r'FREAD|FSEEK|FSIZE|FTIME|FULLPATH|FV|FWRITE|'
+             r'GETAUTOINCVALUE|GETBAR|GETCOLOR|GETCP|GETDIR|GETENV|'
+             r'GETFILE|GETFLDSTATE|GETFONT|GETINTERFACE|'
+             r'GETNEXTMODIFIED|GETOBJECT|GETPAD|GETPEM|GETPICT|'
+             r'GETPRINTER|GETRESULTSET|GETWORDCOUNT|GETWORDNUM|'
+             r'GETCURSORADAPTER|GOMONTH|HEADER|HOME|HOUR|ICASE|'
+             r'IDXCOLLATE|IIF|IMESTATUS|INDBC|INDEXSEEK|INKEY|INLIST|'
+             r'INPUTBOX|INSMODE|INT|ISALPHA|ISBLANK|ISCOLOR|ISDIGIT|'
+             r'ISEXCLUSIVE|ISFLOCKED|ISLEADBYTE|ISLOWER|ISMEMOFETCHED|'
+             r'ISMOUSE|ISNULL|ISPEN|ISREADONLY|ISRLOCKED|'
+             r'ISTRANSACTABLE|ISUPPER|JUSTDRIVE|JUSTEXT|JUSTFNAME|'
+             r'JUSTPATH|JUSTSTEM|KEY|KEYMATCH|LASTKEY|LEFT|LEFTC|LEN|'
+             r'LENC|LIKE|LIKEC|LINENO|LOADPICTURE|LOCFILE|LOCK|LOG|'
+             r'LOG10|LOOKUP|LOWER|LTRIM|LUPDATE|MAKETRANSACTABLE|MAX|'
+             r'MCOL|MDOWN|MDX|MDY|MEMLINES|MEMORY|MENU|MESSAGE|'
+             r'MESSAGEBOX|MIN|MINUTE|MLINE|MOD|MONTH|MRKBAR|MRKPAD|'
+             r'MROW|MTON|MWINDOW|NDX|NEWOBJECT|NORMALIZE|NTOM|NUMLOCK|'
+             r'NVL|OBJNUM|OBJTOCLIENT|OBJVAR|OCCURS|OEMTOANSI|OLDVAL|'
+             r'ON|ORDER|OS|PAD|PADL|PARAMETERS|PAYMENT|PCOL|PCOUNT|'
+             r'PEMSTATUS|PI|POPUP|PRIMARY|PRINTSTATUS|PRMBAR|PRMPAD|'
+             r'PROGRAM|PROMPT|PROPER|PROW|PRTINFO|PUTFILE|PV|QUARTER|'
+             r'RAISEEVENT|RAND|RAT|RATC|RATLINE|RDLEVEL|READKEY|RECCOUNT|'
+             r'RECNO|RECSIZE|REFRESH|RELATION|REPLICATE|REQUERY|RGB|'
+             r'RGBSCHEME|RIGHT|RIGHTC|RLOCK|ROUND|ROW|RTOD|RTRIM|'
+             r'SAVEPICTURE|SCHEME|SCOLS|SEC|SECONDS|SEEK|SELECT|SET|'
+             r'SETFLDSTATE|SETRESULTSET|SIGN|SIN|SKPBAR|SKPPAD|SOUNDEX|'
+             r'SPACE|SQLCANCEL|SQLCOLUMNS|SQLCOMMIT|SQLCONNECT|'
+             r'SQLDISCONNECT|SQLEXEC|SQLGETPROP|SQLIDLEDISCONNECT|'
+             r'SQLMORERESULTS|SQLPREPARE|SQLROLLBACK|SQLSETPROP|'
+             r'SQLSTRINGCONNECT|SQLTABLES|SQRT|SROWS|STR|STRCONV|'
+             r'STREXTRACT|STRTOFILE|STRTRAN|STUFF|STUFFC|SUBSTR|'
+             r'SUBSTRC|SYS|SYSMETRIC|TABLEREVERT|TABLEUPDATE|TAG|'
+             r'TAGCOUNT|TAGNO|TAN|TARGET|TEXTMERGE|TIME|TRANSFORM|'
+             r'TRIM|TTOC|TTOD|TXNLEVEL|TXTWIDTH|TYPE|UNBINDEVENTS|'
+             r'UNIQUE|UPDATED|UPPER|USED|VAL|VARREAD|VARTYPE|VERSION|'
+             r'WBORDER|WCHILD|WCOLS|WDOCKABLE|WEEK|WEXIST|WFONT|WLAST|'
+             r'WLCOL|WLROW|WMAXIMUM|WMINIMUM|WONTOP|WOUTPUT|WPARENT|'
+             r'WREAD|WROWS|WTITLE|WVISIBLE|XMLTOCURSOR|XMLUPDATEGRAM|'
+             r'YEAR)(?=\s*\()', Name.Function),
+
+            (r'_ALIGNMENT|_ASCIICOLS|_ASCIIROWS|_ASSIST|_BEAUTIFY|_BOX|'
+             r'_BROWSER|_BUILDER|_CALCMEM|_CALCVALUE|_CLIPTEXT|_CONVERTER|'
+             r'_COVERAGE|_CUROBJ|_DBLCLICK|_DIARYDATE|_DOS|_FOXDOC|_FOXREF|'
+             r'_GALLERY|_GENGRAPH|_GENHTML|_GENMENU|_GENPD|_GENSCRN|'
+             r'_GENXTAB|_GETEXPR|_INCLUDE|_INCSEEK|_INDENT|_LMARGIN|_MAC|'
+             r'_MENUDESIGNER|_MLINE|_PADVANCE|_PAGENO|_PAGETOTAL|_PBPAGE|'
+             r'_PCOLNO|_PCOPIES|_PDRIVER|_PDSETUP|_PECODE|_PEJECT|_PEPAGE|'
+             r'_PLENGTH|_PLINENO|_PLOFFSET|_PPITCH|_PQUALITY|_PRETEXT|'
+             r'_PSCODE|_PSPACING|_PWAIT|_RMARGIN|_REPORTBUILDER|'
+             r'_REPORTOUTPUT|_REPORTPREVIEW|_SAMPLES|_SCCTEXT|_SCREEN|'
+             r'_SHELL|_SPELLCHK|_STARTUP|_TABS|_TALLY|_TASKPANE|_TEXT|'
+             r'_THROTTLE|_TOOLBOX|_TOOLTIPTIMEOUT|_TRANSPORT|_TRIGGERLEVEL|'
+             r'_UNIX|_VFP|_WINDOWS|_WIZARD|_WRAP', Keyword.Pseudo),
+
+            (r'THISFORMSET|THISFORM|THIS', Name.Builtin),
+
+            (r'Application|CheckBox|Collection|Column|ComboBox|'
+             r'CommandButton|CommandGroup|Container|Control|CursorAdapter|'
+             r'Cursor|Custom|DataEnvironment|DataObject|EditBox|'
+             r'Empty|Exception|Fields|Files|File|FormSet|Form|FoxCode|'
+             r'Grid|Header|Hyperlink|Image|Label|Line|ListBox|Objects|'
+             r'OptionButton|OptionGroup|PageFrame|Page|ProjectHook|Projects|'
+             r'Project|Relation|ReportListener|Separator|Servers|Server|'
+             r'Session|Shape|Spinner|Tables|TextBox|Timer|ToolBar|'
+             r'XMLAdapter|XMLField|XMLTable', Name.Class),
+
+            (r'm\.[a-z_]\w*', Name.Variable),
+            (r'\.(F|T|AND|OR|NOT|NULL)\.|\b(AND|OR|NOT|NULL)\b', Operator.Word),
+
+            (r'\.(ActiveColumn|ActiveControl|ActiveForm|ActivePage|'
+             r'ActiveProject|ActiveRow|AddLineFeeds|ADOCodePage|Alias|'
+             r'Alignment|Align|AllowAddNew|AllowAutoColumnFit|'
+             r'AllowCellSelection|AllowDelete|AllowHeaderSizing|'
+             r'AllowInsert|AllowModalMessages|AllowOutput|AllowRowSizing|'
+             r'AllowSimultaneousFetch|AllowTabs|AllowUpdate|'
+             r'AlwaysOnBottom|AlwaysOnTop|Anchor|Application|'
+             r'AutoActivate|AutoCenter|AutoCloseTables|AutoComplete|'
+             r'AutoCompSource|AutoCompTable|AutoHideScrollBar|'
+             r'AutoIncrement|AutoOpenTables|AutoRelease|AutoSize|'
+             r'AutoVerbMenu|AutoYield|BackColor|ForeColor|BackStyle|'
+             r'BaseClass|BatchUpdateCount|BindControls|BorderColor|'
+             r'BorderStyle|BorderWidth|BoundColumn|BoundTo|Bound|'
+             r'BreakOnError|BufferModeOverride|BufferMode|'
+             r'BuildDateTime|ButtonCount|Buttons|Cancel|Caption|'
+             r'Centered|Century|ChildAlias|ChildOrder|ChildTable|'
+             r'ClassLibrary|Class|ClipControls|Closable|CLSID|CodePage|'
+             r'ColorScheme|ColorSource|ColumnCount|ColumnLines|'
+             r'ColumnOrder|Columns|ColumnWidths|CommandClauses|'
+             r'Comment|CompareMemo|ConflictCheckCmd|ConflictCheckType|'
+             r'ContinuousScroll|ControlBox|ControlCount|Controls|'
+             r'ControlSource|ConversionFunc|Count|CurrentControl|'
+             r'CurrentDataSession|CurrentPass|CurrentX|CurrentY|'
+             r'CursorSchema|CursorSource|CursorStatus|Curvature|'
+             r'Database|DataSessionID|DataSession|DataSourceType|'
+             r'DataSource|DataType|DateFormat|DateMark|Debug|'
+             r'DeclareXMLPrefix|DEClassLibrary|DEClass|DefaultFilePath|'
+             r'Default|DefOLELCID|DeleteCmdDataSourceType|DeleteCmdDataSource|'
+             r'DeleteCmd|DeleteMark|Description|Desktop|'
+             r'Details|DisabledBackColor|DisabledForeColor|'
+             r'DisabledItemBackColor|DisabledItemForeColor|'
+             r'DisabledPicture|DisableEncode|DisplayCount|'
+             r'DisplayValue|Dockable|Docked|DockPosition|'
+             r'DocumentFile|DownPicture|DragIcon|DragMode|DrawMode|'
+             r'DrawStyle|DrawWidth|DynamicAlignment|DynamicBackColor|'
+             r'DynamicForeColor|DynamicCurrentControl|DynamicFontBold|'
+             r'DynamicFontItalic|DynamicFontStrikethru|'
+             r'DynamicFontUnderline|DynamicFontName|DynamicFontOutline|'
+             r'DynamicFontShadow|DynamicFontSize|DynamicInputMask|'
+             r'DynamicLineHeight|EditorOptions|Enabled|'
+             r'EnableHyperlinks|Encrypted|ErrorNo|Exclude|Exclusive|'
+             r'FetchAsNeeded|FetchMemoCmdList|FetchMemoDataSourceType|'
+             r'FetchMemoDataSource|FetchMemo|FetchSize|'
+             r'FileClassLibrary|FileClass|FillColor|FillStyle|Filter|'
+             r'FirstElement|FirstNestedTable|Flags|FontBold|FontItalic|'
+             r'FontStrikethru|FontUnderline|FontCharSet|FontCondense|'
+             r'FontExtend|FontName|FontOutline|FontShadow|FontSize|'
+             r'ForceCloseTag|Format|FormCount|FormattedOutput|Forms|'
+             r'FractionDigits|FRXDataSession|FullName|GDIPlusGraphics|'
+             r'GridLineColor|GridLines|GridLineWidth|HalfHeightCaption|'
+             r'HeaderClassLibrary|HeaderClass|HeaderHeight|Height|'
+             r'HelpContextID|HideSelection|HighlightBackColor|'
+             r'HighlightForeColor|HighlightStyle|HighlightRowLineWidth|'
+             r'HighlightRow|Highlight|HomeDir|Hours|HostName|'
+             r'HScrollSmallChange|hWnd|Icon|IncrementalSearch|Increment|'
+             r'InitialSelectedAlias|InputMask|InsertCmdDataSourceType|'
+             r'InsertCmdDataSource|InsertCmdRefreshCmd|'
+             r'InsertCmdRefreshFieldList|InsertCmdRefreshKeyFieldList|'
+             r'InsertCmd|Instancing|IntegralHeight|'
+             r'Interval|IMEMode|IsAttribute|IsBase64|IsBinary|IsNull|'
+             r'IsDiffGram|IsLoaded|ItemBackColor,|ItemData|ItemIDData|'
+             r'ItemTips|IXMLDOMElement|KeyboardHighValue|KeyboardLowValue|'
+             r'Keyfield|KeyFieldList|KeyPreview|KeySort|LanguageOptions|'
+             r'LeftColumn|Left|LineContents|LineNo|LineSlant|LinkMaster|'
+             r'ListCount|ListenerType|ListIndex|ListItemID|ListItem|'
+             r'List|LockColumnsLeft|LockColumns|LockScreen|MacDesktop|'
+             r'MainFile|MapN19_4ToCurrency|MapBinary|MapVarchar|Margin|'
+             r'MaxButton|MaxHeight|MaxLeft|MaxLength|MaxRecords|MaxTop|'
+             r'MaxWidth|MDIForm|MemberClassLibrary|MemberClass|'
+             r'MemoWindow|Message|MinButton|MinHeight|MinWidth|'
+             r'MouseIcon|MousePointer|Movable|MoverBars|MultiSelect|'
+             r'Name|NestedInto|NewIndex|NewItemID|NextSiblingTable|'
+             r'NoCpTrans|NoDataOnLoad|NoData|NullDisplay|'
+             r'NumberOfElements|Object|OLEClass|OLEDragMode|'
+             r'OLEDragPicture|OLEDropEffects|OLEDropHasData|'
+             r'OLEDropMode|OLEDropTextInsertion|OLELCID|'
+             r'OLERequestPendingTimeout|OLEServerBusyRaiseError|'
+             r'OLEServerBusyTimeout|OLETypeAllowed|OneToMany|'
+             r'OpenViews|OpenWindow|Optimize|OrderDirection|Order|'
+             r'OutputPageCount|OutputType|PageCount|PageHeight|'
+             r'PageNo|PageOrder|Pages|PageTotal|PageWidth|'
+             r'PanelLink|Panel|ParentAlias|ParentClass|ParentTable|'
+             r'Parent|Partition|PasswordChar|PictureMargin|'
+             r'PicturePosition|PictureSpacing|PictureSelectionDisplay|'
+             r'PictureVal|Picture|Prepared|'
+             r'PolyPoints|PreserveWhiteSpace|PreviewContainer|'
+             r'PrintJobName|Procedure|PROCESSID|ProgID|ProjectHookClass|'
+             r'ProjectHookLibrary|ProjectHook|QuietMode|'
+             r'ReadCycle|ReadLock|ReadMouse|ReadObject|ReadOnly|'
+             r'ReadSave|ReadTimeout|RecordMark|RecordSourceType|'
+             r'RecordSource|RefreshAlias|'
+             r'RefreshCmdDataSourceType|RefreshCmdDataSource|RefreshCmd|'
+             r'RefreshIgnoreFieldList|RefreshTimeStamp|RelationalExpr|'
+             r'RelativeColumn|RelativeRow|ReleaseType|Resizable|'
+             r'RespectCursorCP|RespectNesting|RightToLeft|RotateFlip|'
+             r'Rotation|RowColChange|RowHeight|RowSourceType|'
+             r'RowSource|ScaleMode|SCCProvider|SCCStatus|ScrollBars|'
+             r'Seconds|SelectCmd|SelectedID|'
+             r'SelectedItemBackColor|SelectedItemForeColor|Selected|'
+             r'SelectionNamespaces|SelectOnEntry|SelLength|SelStart|'
+             r'SelText|SendGDIPlusImage|SendUpdates|ServerClassLibrary|'
+             r'ServerClass|ServerHelpFile|ServerName|'
+             r'ServerProject|ShowTips|ShowInTaskbar|ShowWindow|'
+             r'Sizable|SizeBox|SOM|Sorted|Sparse|SpecialEffect|'
+             r'SpinnerHighValue|SpinnerLowValue|SplitBar|StackLevel|'
+             r'StartMode|StatusBarText|StatusBar|Stretch|StrictDateEntry|'
+             r'Style|TabIndex|Tables|TabOrientation|Tabs|TabStop|'
+             r'TabStretch|TabStyle|Tag|TerminateRead|Text|Themes|'
+             r'ThreadID|TimestampFieldList|TitleBar|ToolTipText|'
+             r'TopIndex|TopItemID|Top|TwoPassProcess|TypeLibCLSID|'
+             r'TypeLibDesc|TypeLibName|Type|Unicode|UpdatableFieldList|'
+             r'UpdateCmdDataSourceType|UpdateCmdDataSource|'
+             r'UpdateCmdRefreshCmd|UpdateCmdRefreshFieldList|'
+             r'UpdateCmdRefreshKeyFieldList|UpdateCmd|'
+             r'UpdateGramSchemaLocation|UpdateGram|UpdateNameList|UpdateType|'
+             r'UseCodePage|UseCursorSchema|UseDeDataSource|UseMemoSize|'
+             r'UserValue|UseTransactions|UTF8Encoded|Value|VersionComments|'
+             r'VersionCompany|VersionCopyright|VersionDescription|'
+             r'VersionNumber|VersionProduct|VersionTrademarks|Version|'
+             r'VFPXMLProgID|ViewPortHeight|ViewPortLeft|'
+             r'ViewPortTop|ViewPortWidth|VScrollSmallChange|View|Visible|'
+             r'VisualEffect|WhatsThisButton|WhatsThisHelpID|WhatsThisHelp|'
+             r'WhereType|Width|WindowList|WindowState|WindowType|WordWrap|'
+             r'WrapCharInCDATA|WrapInCDATA|WrapMemoInCDATA|XMLAdapter|'
+             r'XMLConstraints|XMLNameIsXPath|XMLNamespace|XMLName|'
+             r'XMLPrefix|XMLSchemaLocation|XMLTable|XMLType|'
+             r'XSDfractionDigits|XSDmaxLength|XSDtotalDigits|'
+             r'XSDtype|ZoomBox)', Name.Attribute),
+
+            (r'\.(ActivateCell|AddColumn|AddItem|AddListItem|AddObject|'
+             r'AddProperty|AddTableSchema|AddToSCC|Add|'
+             r'ApplyDiffgram|Attach|AutoFit|AutoOpen|Box|Build|'
+             r'CancelReport|ChangesToCursor|CheckIn|CheckOut|Circle|'
+             r'CleanUp|ClearData|ClearStatus|Clear|CloneObject|CloseTables|'
+             r'Close|Cls|CursorAttach|CursorDetach|CursorFill|'
+             r'CursorRefresh|DataToClip|DelayedMemoFetch|DeleteColumn|'
+             r'Dock|DoMessage|DoScroll|DoStatus|DoVerb|Drag|Draw|Eval|'
+             r'GetData|GetDockState|GetFormat|GetKey|GetLatestVersion|'
+             r'GetPageHeight|GetPageWidth|Help|Hide|IncludePageInOutput|'
+             r'IndexToItemID|ItemIDToIndex|Item|LoadXML|Line|Modify|'
+             r'MoveItem|Move|Nest|OLEDrag|OnPreviewClose|OutputPage|'
+             r'Point|Print|PSet|Quit|ReadExpression|ReadMethod|'
+             r'RecordRefresh|Refresh|ReleaseXML|Release|RemoveFromSCC|'
+             r'RemoveItem|RemoveListItem|RemoveObject|Remove|'
+             r'Render|Requery|RequestData|ResetToDefault|Reset|Run|'
+             r'SaveAsClass|SaveAs|SetAll|SetData|SetFocus|SetFormat|'
+             r'SetMain|SetVar|SetViewPort|ShowWhatsThis|Show|'
+             r'SupportsListenerType|TextHeight|TextWidth|ToCursor|'
+             r'ToXML|UndoCheckOut|Unnest|UpdateStatus|WhatsThisMode|'
+             r'WriteExpression|WriteMethod|ZOrder)', Name.Function),
+
+            (r'\.(Activate|AdjustObjectSize|AfterBand|AfterBuild|'
+             r'AfterCloseTables|AfterCursorAttach|AfterCursorClose|'
+             r'AfterCursorDetach|AfterCursorFill|AfterCursorRefresh|'
+             r'AfterCursorUpdate|AfterDelete|AfterInsert|'
+             r'AfterRecordRefresh|AfterUpdate|AfterDock|AfterReport|'
+             r'AfterRowColChange|BeforeBand|BeforeCursorAttach|'
+             r'BeforeCursorClose|BeforeCursorDetach|BeforeCursorFill|'
+             r'BeforeCursorRefresh|BeforeCursorUpdate|BeforeDelete|'
+             r'BeforeInsert|BeforeDock|BeforeOpenTables|'
+             r'BeforeRecordRefresh|BeforeReport|BeforeRowColChange|'
+             r'BeforeUpdate|Click|dbc_Activate|dbc_AfterAddTable|'
+             r'dbc_AfterAppendProc|dbc_AfterCloseTable|dbc_AfterCopyProc|'
+             r'dbc_AfterCreateConnection|dbc_AfterCreateOffline|'
+             r'dbc_AfterCreateTable|dbc_AfterCreateView|dbc_AfterDBGetProp|'
+             r'dbc_AfterDBSetProp|dbc_AfterDeleteConnection|'
+             r'dbc_AfterDropOffline|dbc_AfterDropTable|'
+             r'dbc_AfterModifyConnection|dbc_AfterModifyProc|'
+             r'dbc_AfterModifyTable|dbc_AfterModifyView|dbc_AfterOpenTable|'
+             r'dbc_AfterRemoveTable|dbc_AfterRenameConnection|'
+             r'dbc_AfterRenameTable|dbc_AfterRenameView|'
+             r'dbc_AfterValidateData|dbc_BeforeAddTable|'
+             r'dbc_BeforeAppendProc|dbc_BeforeCloseTable|'
+             r'dbc_BeforeCopyProc|dbc_BeforeCreateConnection|'
+             r'dbc_BeforeCreateOffline|dbc_BeforeCreateTable|'
+             r'dbc_BeforeCreateView|dbc_BeforeDBGetProp|'
+             r'dbc_BeforeDBSetProp|dbc_BeforeDeleteConnection|'
+             r'dbc_BeforeDropOffline|dbc_BeforeDropTable|'
+             r'dbc_BeforeModifyConnection|dbc_BeforeModifyProc|'
+             r'dbc_BeforeModifyTable|dbc_BeforeModifyView|'
+             r'dbc_BeforeOpenTable|dbc_BeforeRemoveTable|'
+             r'dbc_BeforeRenameConnection|dbc_BeforeRenameTable|'
+             r'dbc_BeforeRenameView|dbc_BeforeValidateData|'
+             r'dbc_CloseData|dbc_Deactivate|dbc_ModifyData|dbc_OpenData|'
+             r'dbc_PackData|DblClick|Deactivate|Deleted|Destroy|DoCmd|'
+             r'DownClick|DragDrop|DragOver|DropDown|ErrorMessage|Error|'
+             r'EvaluateContents|GotFocus|Init|InteractiveChange|KeyPress|'
+             r'LoadReport|Load|LostFocus|Message|MiddleClick|MouseDown|'
+             r'MouseEnter|MouseLeave|MouseMove|MouseUp|MouseWheel|Moved|'
+             r'OLECompleteDrag|OLEDragOver|OLEGiveFeedback|OLESetData|'
+             r'OLEStartDrag|OnMoveItem|Paint|ProgrammaticChange|'
+             r'QueryAddFile|QueryModifyFile|QueryNewFile|QueryRemoveFile|'
+             r'QueryRunFile|QueryUnload|RangeHigh|RangeLow|ReadActivate|'
+             r'ReadDeactivate|ReadShow|ReadValid|ReadWhen|Resize|'
+             r'RightClick|SCCInit|SCCDestroy|Scrolled|Timer|UIEnable|'
+             r'UnDock|UnloadReport|Unload|UpClick|Valid|When)', Name.Function),
+
+            (r'\s+', Text),
+            # everything else is not colored
+            (r'.', Text),
+        ],
+        'newline': [
+            (r'\*.*?$', Comment.Single, '#pop'),
+            (r'(ACCEPT|ACTIVATE\s*MENU|ACTIVATE\s*POPUP|ACTIVATE\s*SCREEN|'
+             r'ACTIVATE\s*WINDOW|APPEND|APPEND\s*FROM|APPEND\s*FROM\s*ARRAY|'
+             r'APPEND\s*GENERAL|APPEND\s*MEMO|ASSIST|AVERAGE|BLANK|BROWSE|'
+             r'BUILD\s*APP|BUILD\s*EXE|BUILD\s*PROJECT|CALCULATE|CALL|'
+             r'CANCEL|CHANGE|CLEAR|CLOSE|CLOSE\s*MEMO|COMPILE|CONTINUE|'
+             r'COPY\s*FILE|COPY\s*INDEXES|COPY\s*MEMO|COPY\s*STRUCTURE|'
+             r'COPY\s*STRUCTURE\s*EXTENDED|COPY\s*TAG|COPY\s*TO|'
+             r'COPY\s*TO\s*ARRAY|COUNT|CREATE|CREATE\s*COLOR\s*SET|'
+             r'CREATE\s*CURSOR|CREATE\s*FROM|CREATE\s*LABEL|CREATE\s*MENU|'
+             r'CREATE\s*PROJECT|CREATE\s*QUERY|CREATE\s*REPORT|'
+             r'CREATE\s*SCREEN|CREATE\s*TABLE|CREATE\s*VIEW|DDE|'
+             r'DEACTIVATE\s*MENU|DEACTIVATE\s*POPUP|DEACTIVATE\s*WINDOW|'
+             r'DECLARE|DEFINE\s*BAR|DEFINE\s*BOX|DEFINE\s*MENU|'
+             r'DEFINE\s*PAD|DEFINE\s*POPUP|DEFINE\s*WINDOW|DELETE|'
+             r'DELETE\s*FILE|DELETE\s*TAG|DIMENSION|DIRECTORY|DISPLAY|'
+             r'DISPLAY\s*FILES|DISPLAY\s*MEMORY|DISPLAY\s*STATUS|'
+             r'DISPLAY\s*STRUCTURE|DO|EDIT|EJECT|EJECT\s*PAGE|ERASE|'
+             r'EXIT|EXPORT|EXTERNAL|FILER|FIND|FLUSH|FUNCTION|GATHER|'
+             r'GETEXPR|GO|GOTO|HELP|HIDE\s*MENU|HIDE\s*POPUP|'
+             r'HIDE\s*WINDOW|IMPORT|INDEX|INPUT|INSERT|JOIN|KEYBOARD|'
+             r'LABEL|LIST|LOAD|LOCATE|LOOP|MENU|MENU\s*TO|MODIFY\s*COMMAND|'
+             r'MODIFY\s*FILE|MODIFY\s*GENERAL|MODIFY\s*LABEL|MODIFY\s*MEMO|'
+             r'MODIFY\s*MENU|MODIFY\s*PROJECT|MODIFY\s*QUERY|'
+             r'MODIFY\s*REPORT|MODIFY\s*SCREEN|MODIFY\s*STRUCTURE|'
+             r'MODIFY\s*WINDOW|MOVE\s*POPUP|MOVE\s*WINDOW|NOTE|'
+             r'ON\s*APLABOUT|ON\s*BAR|ON\s*ERROR|ON\s*ESCAPE|'
+             r'ON\s*EXIT\s*BAR|ON\s*EXIT\s*MENU|ON\s*EXIT\s*PAD|'
+             r'ON\s*EXIT\s*POPUP|ON\s*KEY|ON\s*KEY\s*=|ON\s*KEY\s*LABEL|'
+             r'ON\s*MACHELP|ON\s*PAD|ON\s*PAGE|ON\s*READERROR|'
+             r'ON\s*SELECTION\s*BAR|ON\s*SELECTION\s*MENU|'
+             r'ON\s*SELECTION\s*PAD|ON\s*SELECTION\s*POPUP|ON\s*SHUTDOWN|'
+             r'PACK|PARAMETERS|PLAY\s*MACRO|POP\s*KEY|POP\s*MENU|'
+             r'POP\s*POPUP|PRIVATE|PROCEDURE|PUBLIC|PUSH\s*KEY|'
+             r'PUSH\s*MENU|PUSH\s*POPUP|QUIT|READ|READ\s*MENU|RECALL|'
+             r'REINDEX|RELEASE|RELEASE\s*MODULE|RENAME|REPLACE|'
+             r'REPLACE\s*FROM\s*ARRAY|REPORT|RESTORE\s*FROM|'
+             r'RESTORE\s*MACROS|RESTORE\s*SCREEN|RESTORE\s*WINDOW|'
+             r'RESUME|RETRY|RETURN|RUN|RUN\s*\/N"|RUNSCRIPT|'
+             r'SAVE\s*MACROS|SAVE\s*SCREEN|SAVE\s*TO|SAVE\s*WINDOWS|'
+             r'SCATTER|SCROLL|SEEK|SELECT|SET|SET\s*ALTERNATE|'
+             r'SET\s*ANSI|SET\s*APLABOUT|SET\s*AUTOSAVE|SET\s*BELL|'
+             r'SET\s*BLINK|SET\s*BLOCKSIZE|SET\s*BORDER|SET\s*BRSTATUS|'
+             r'SET\s*CARRY|SET\s*CENTURY|SET\s*CLEAR|SET\s*CLOCK|'
+             r'SET\s*COLLATE|SET\s*COLOR\s*OF|SET\s*COLOR\s*OF\s*SCHEME|'
+             r'SET\s*COLOR\s*SET|SET\s*COLOR\s*TO|SET\s*COMPATIBLE|'
+             r'SET\s*CONFIRM|SET\s*CONSOLE|SET\s*CURRENCY|SET\s*CURSOR|'
+             r'SET\s*DATE|SET\s*DEBUG|SET\s*DECIMALS|SET\s*DEFAULT|'
+             r'SET\s*DELETED|SET\s*DELIMITERS|SET\s*DEVELOPMENT|'
+             r'SET\s*DEVICE|SET\s*DISPLAY|SET\s*DOHISTORY|SET\s*ECHO|'
+             r'SET\s*ESCAPE|SET\s*EXACT|SET\s*EXCLUSIVE|SET\s*FIELDS|'
+             r'SET\s*FILTER|SET\s*FIXED|SET\s*FORMAT|SET\s*FULLPATH|'
+             r'SET\s*FUNCTION|SET\s*HEADINGS|SET\s*HELP|SET\s*HELPFILTER|'
+             r'SET\s*HOURS|SET\s*INDEX|SET\s*INTENSITY|SET\s*KEY|'
+             r'SET\s*KEYCOMP|SET\s*LIBRARY|SET\s*LOCK|SET\s*LOGERRORS|'
+             r'SET\s*MACDESKTOP|SET\s*MACHELP|SET\s*MACKEY|SET\s*MARGIN|'
+             r'SET\s*MARK\s*OF|SET\s*MARK\s*TO|SET\s*MEMOWIDTH|'
+             r'SET\s*MESSAGE|SET\s*MOUSE|SET\s*MULTILOCKS|SET\s*NEAR|'
+             r'SET\s*NOCPTRANS|SET\s*NOTIFY|SET\s*ODOMETER|SET\s*OPTIMIZE|'
+             r'SET\s*ORDER|SET\s*PALETTE|SET\s*PATH|SET\s*PDSETUP|'
+             r'SET\s*POINT|SET\s*PRINTER|SET\s*PROCEDURE|SET\s*READBORDER|'
+             r'SET\s*REFRESH|SET\s*RELATION|SET\s*RELATION\s*OFF|'
+             r'SET\s*REPROCESS|SET\s*RESOURCE|SET\s*SAFETY|SET\s*SCOREBOARD|'
+             r'SET\s*SEPARATOR|SET\s*SHADOWS|SET\s*SKIP|SET\s*SKIP\s*OF|'
+             r'SET\s*SPACE|SET\s*STATUS|SET\s*STATUS\s*BAR|SET\s*STEP|'
+             r'SET\s*STICKY|SET\s*SYSMENU|SET\s*TALK|SET\s*TEXTMERGE|'
+             r'SET\s*TEXTMERGE\s*DELIMITERS|SET\s*TOPIC|SET\s*TRBETWEEN|'
+             r'SET\s*TYPEAHEAD|SET\s*UDFPARMS|SET\s*UNIQUE|SET\s*VIEW|'
+             r'SET\s*VOLUME|SET\s*WINDOW\s*OF\s*MEMO|SET\s*XCMDFILE|'
+             r'SHOW\s*GET|SHOW\s*GETS|SHOW\s*MENU|SHOW\s*OBJECT|'
+             r'SHOW\s*POPUP|SHOW\s*WINDOW|SIZE\s*POPUP|SKIP|SORT|'
+             r'STORE|SUM|SUSPEND|TOTAL|TYPE|UNLOCK|UPDATE|USE|WAIT|'
+             r'ZAP|ZOOM\s*WINDOW|DO\s*CASE|CASE|OTHERWISE|ENDCASE|'
+             r'DO\s*WHILE|ENDDO|FOR|ENDFOR|NEXT|IF|ELSE|ENDIF|PRINTJOB|'
+             r'ENDPRINTJOB|SCAN|ENDSCAN|TEXT|ENDTEXT|=)',
+                Keyword.Reserved, '#pop'),
+            (r'#\s*(IF|ELIF|ELSE|ENDIF|DEFINE|IFDEF|IFNDEF|INCLUDE)',
+                Comment.Preproc, '#pop'),
+            (r'(m\.)?[a-z_]\w*', Name.Variable, '#pop'),
+            (r'.', Text, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/freefem.py b/.venv/Lib/site-packages/pygments/lexers/freefem.py
new file mode 100644 (file)
index 0000000..87b066b
--- /dev/null
@@ -0,0 +1,893 @@
+"""
+    pygments.lexers.freefem
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for FreeFem++ language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.token import Comment, Operator, Keyword, Name
+
+from pygments.lexers.c_cpp import CppLexer
+
+__all__ = ['FreeFemLexer']
+
+
+class FreeFemLexer(CppLexer):
+    """
+    For FreeFem++ source.
+
+    This is an extension of the CppLexer, as the FreeFem Language is a superset
+    of C++.
+    """
+
+    name = 'Freefem'
+    url = 'https://freefem.org/'
+    aliases = ['freefem']
+    filenames = ['*.edp']
+    mimetypes = ['text/x-freefem']
+    version_added = '2.4'
+
+    # Language operators
+    operators = {'+', '-', '*', '.*', '/', './', '%', '^', '^-1', ':', '\''}
+
+    # types
+    types = {'bool', 'border', 'complex', 'dmatrix', 'fespace', 'func', 'gslspline',
+             'ifstream', 'int', 'macro', 'matrix', 'mesh', 'mesh3', 'mpiComm',
+             'mpiGroup', 'mpiRequest', 'NewMacro', 'EndMacro', 'ofstream', 'Pmmap',
+             'problem', 'Psemaphore', 'real', 'solve', 'string', 'varf'}
+
+    # finite element spaces
+    fespaces = {'BDM1', 'BDM1Ortho', 'Edge03d', 'Edge13d', 'Edge23d', 'FEQF', 'HCT',
+                'P0', 'P03d', 'P0Edge', 'P1', 'P13d', 'P1b', 'P1b3d', 'P1bl', 'P1bl3d',
+                'P1dc', 'P1Edge', 'P1nc', 'P2', 'P23d', 'P2b', 'P2BR', 'P2dc', 'P2Edge',
+                'P2h', 'P2Morley', 'P2pnc', 'P3', 'P3dc', 'P3Edge', 'P4', 'P4dc',
+                'P4Edge', 'P5Edge', 'RT0', 'RT03d', 'RT0Ortho', 'RT1', 'RT1Ortho',
+                'RT2', 'RT2Ortho'}
+
+    # preprocessor
+    preprocessor = {'ENDIFMACRO', 'include', 'IFMACRO', 'load'}
+
+    # Language keywords
+    keywords = {
+                'adj',
+                'append',
+                'area',
+                'ARGV',
+                'be',
+                'binary',
+                'BoundaryEdge',
+                'bordermeasure',
+                'CG',
+                'Cholesky',
+                'cin',
+                'cout',
+                'Crout',
+                'default',
+                'diag',
+                'edgeOrientation',
+                'endl',
+                'false',
+                'ffind',
+                'FILE',
+                'find',
+                'fixed',
+                'flush',
+                'GMRES',
+                'good',
+                'hTriangle',
+                'im',
+                'imax',
+                'imin',
+                'InternalEdge',
+                'l1',
+                'l2',
+                'label',
+                'lenEdge',
+                'length',
+                'LINE',
+                'linfty',
+                'LU',
+                'm',
+                'max',
+                'measure',
+                'min',
+                'mpiAnySource',
+                'mpiBAND',
+                'mpiBXOR',
+                'mpiCommWorld',
+                'mpiLAND',
+                'mpiLOR',
+                'mpiLXOR',
+                'mpiMAX',
+                'mpiMIN',
+                'mpiPROD',
+                'mpirank',
+                'mpisize',
+                'mpiSUM',
+                'mpiUndefined',
+                'n',
+                'N',
+                'nbe',
+                'ndof',
+                'ndofK',
+                'noshowbase',
+                'noshowpos',
+                'notaregion',
+                'nt',
+                'nTonEdge',
+                'nuEdge',
+                'nuTriangle',
+                'nv',
+                'P',
+                'pi',
+                'precision',
+                'qf1pE',
+                'qf1pElump',
+                'qf1pT',
+                'qf1pTlump',
+                'qfV1',
+                'qfV1lump',
+                'qf2pE',
+                'qf2pT',
+                'qf2pT4P1',
+                'qfV2',
+                'qf3pE',
+                'qf4pE',
+                'qf5pE',
+                'qf5pT',
+                'qfV5',
+                'qf7pT',
+                'qf9pT',
+                'qfnbpE',
+                'quantile',
+                're',
+                'region',
+                'rfind',
+                'scientific',
+                'searchMethod',
+                'setw',
+                'showbase',
+                'showpos',
+                'sparsesolver',
+                'sum',
+                'tellp',
+                'true',
+                'UMFPACK',
+                'unused',
+                'whoinElement',
+                'verbosity',
+                'version',
+                'volume',
+                'x',
+                'y',
+                'z'
+    }
+
+    # Language shipped functions and class ( )
+    functions = {
+                'abs',
+                'acos',
+                'acosh',
+                'adaptmesh',
+                'adj',
+                'AffineCG',
+                'AffineGMRES',
+                'arg',
+                'asin',
+                'asinh',
+                'assert',
+                'atan',
+                'atan2',
+                'atanh',
+                'atof',
+                'atoi',
+                'BFGS',
+                'broadcast',
+                'buildlayers',
+                'buildmesh',
+                'ceil',
+                'chi',
+                'complexEigenValue',
+                'copysign',
+                'change',
+                'checkmovemesh',
+                'clock',
+                'cmaes',
+                'conj',
+                'convect',
+                'cos',
+                'cosh',
+                'cube',
+                'd',
+                'dd',
+                'dfft',
+                'diffnp',
+                'diffpos',
+                'dimKrylov',
+                'dist',
+                'dumptable',
+                'dx',
+                'dxx',
+                'dxy',
+                'dxz',
+                'dy',
+                'dyx',
+                'dyy',
+                'dyz',
+                'dz',
+                'dzx',
+                'dzy',
+                'dzz',
+                'EigenValue',
+                'emptymesh',
+                'erf',
+                'erfc',
+                'exec',
+                'exit',
+                'exp',
+                'fdim',
+                'floor',
+                'fmax',
+                'fmin',
+                'fmod',
+                'freeyams',
+                'getARGV',
+                'getline',
+                'gmshload',
+                'gmshload3',
+                'gslcdfugaussianP',
+                'gslcdfugaussianQ',
+                'gslcdfugaussianPinv',
+                'gslcdfugaussianQinv',
+                'gslcdfgaussianP',
+                'gslcdfgaussianQ',
+                'gslcdfgaussianPinv',
+                'gslcdfgaussianQinv',
+                'gslcdfgammaP',
+                'gslcdfgammaQ',
+                'gslcdfgammaPinv',
+                'gslcdfgammaQinv',
+                'gslcdfcauchyP',
+                'gslcdfcauchyQ',
+                'gslcdfcauchyPinv',
+                'gslcdfcauchyQinv',
+                'gslcdflaplaceP',
+                'gslcdflaplaceQ',
+                'gslcdflaplacePinv',
+                'gslcdflaplaceQinv',
+                'gslcdfrayleighP',
+                'gslcdfrayleighQ',
+                'gslcdfrayleighPinv',
+                'gslcdfrayleighQinv',
+                'gslcdfchisqP',
+                'gslcdfchisqQ',
+                'gslcdfchisqPinv',
+                'gslcdfchisqQinv',
+                'gslcdfexponentialP',
+                'gslcdfexponentialQ',
+                'gslcdfexponentialPinv',
+                'gslcdfexponentialQinv',
+                'gslcdfexppowP',
+                'gslcdfexppowQ',
+                'gslcdftdistP',
+                'gslcdftdistQ',
+                'gslcdftdistPinv',
+                'gslcdftdistQinv',
+                'gslcdffdistP',
+                'gslcdffdistQ',
+                'gslcdffdistPinv',
+                'gslcdffdistQinv',
+                'gslcdfbetaP',
+                'gslcdfbetaQ',
+                'gslcdfbetaPinv',
+                'gslcdfbetaQinv',
+                'gslcdfflatP',
+                'gslcdfflatQ',
+                'gslcdfflatPinv',
+                'gslcdfflatQinv',
+                'gslcdflognormalP',
+                'gslcdflognormalQ',
+                'gslcdflognormalPinv',
+                'gslcdflognormalQinv',
+                'gslcdfgumbel1P',
+                'gslcdfgumbel1Q',
+                'gslcdfgumbel1Pinv',
+                'gslcdfgumbel1Qinv',
+                'gslcdfgumbel2P',
+                'gslcdfgumbel2Q',
+                'gslcdfgumbel2Pinv',
+                'gslcdfgumbel2Qinv',
+                'gslcdfweibullP',
+                'gslcdfweibullQ',
+                'gslcdfweibullPinv',
+                'gslcdfweibullQinv',
+                'gslcdfparetoP',
+                'gslcdfparetoQ',
+                'gslcdfparetoPinv',
+                'gslcdfparetoQinv',
+                'gslcdflogisticP',
+                'gslcdflogisticQ',
+                'gslcdflogisticPinv',
+                'gslcdflogisticQinv',
+                'gslcdfbinomialP',
+                'gslcdfbinomialQ',
+                'gslcdfpoissonP',
+                'gslcdfpoissonQ',
+                'gslcdfgeometricP',
+                'gslcdfgeometricQ',
+                'gslcdfnegativebinomialP',
+                'gslcdfnegativebinomialQ',
+                'gslcdfpascalP',
+                'gslcdfpascalQ',
+                'gslinterpakima',
+                'gslinterpakimaperiodic',
+                'gslinterpcsplineperiodic',
+                'gslinterpcspline',
+                'gslinterpsteffen',
+                'gslinterplinear',
+                'gslinterppolynomial',
+                'gslranbernoullipdf',
+                'gslranbeta',
+                'gslranbetapdf',
+                'gslranbinomialpdf',
+                'gslranexponential',
+                'gslranexponentialpdf',
+                'gslranexppow',
+                'gslranexppowpdf',
+                'gslrancauchy',
+                'gslrancauchypdf',
+                'gslranchisq',
+                'gslranchisqpdf',
+                'gslranerlang',
+                'gslranerlangpdf',
+                'gslranfdist',
+                'gslranfdistpdf',
+                'gslranflat',
+                'gslranflatpdf',
+                'gslrangamma',
+                'gslrangammaint',
+                'gslrangammapdf',
+                'gslrangammamt',
+                'gslrangammaknuth',
+                'gslrangaussian',
+                'gslrangaussianratiomethod',
+                'gslrangaussianziggurat',
+                'gslrangaussianpdf',
+                'gslranugaussian',
+                'gslranugaussianratiomethod',
+                'gslranugaussianpdf',
+                'gslrangaussiantail',
+                'gslrangaussiantailpdf',
+                'gslranugaussiantail',
+                'gslranugaussiantailpdf',
+                'gslranlandau',
+                'gslranlandaupdf',
+                'gslrangeometricpdf',
+                'gslrangumbel1',
+                'gslrangumbel1pdf',
+                'gslrangumbel2',
+                'gslrangumbel2pdf',
+                'gslranlogistic',
+                'gslranlogisticpdf',
+                'gslranlognormal',
+                'gslranlognormalpdf',
+                'gslranlogarithmicpdf',
+                'gslrannegativebinomialpdf',
+                'gslranpascalpdf',
+                'gslranpareto',
+                'gslranparetopdf',
+                'gslranpoissonpdf',
+                'gslranrayleigh',
+                'gslranrayleighpdf',
+                'gslranrayleightail',
+                'gslranrayleightailpdf',
+                'gslrantdist',
+                'gslrantdistpdf',
+                'gslranlaplace',
+                'gslranlaplacepdf',
+                'gslranlevy',
+                'gslranweibull',
+                'gslranweibullpdf',
+                'gslsfairyAi',
+                'gslsfairyBi',
+                'gslsfairyAiscaled',
+                'gslsfairyBiscaled',
+                'gslsfairyAideriv',
+                'gslsfairyBideriv',
+                'gslsfairyAiderivscaled',
+                'gslsfairyBiderivscaled',
+                'gslsfairyzeroAi',
+                'gslsfairyzeroBi',
+                'gslsfairyzeroAideriv',
+                'gslsfairyzeroBideriv',
+                'gslsfbesselJ0',
+                'gslsfbesselJ1',
+                'gslsfbesselJn',
+                'gslsfbesselY0',
+                'gslsfbesselY1',
+                'gslsfbesselYn',
+                'gslsfbesselI0',
+                'gslsfbesselI1',
+                'gslsfbesselIn',
+                'gslsfbesselI0scaled',
+                'gslsfbesselI1scaled',
+                'gslsfbesselInscaled',
+                'gslsfbesselK0',
+                'gslsfbesselK1',
+                'gslsfbesselKn',
+                'gslsfbesselK0scaled',
+                'gslsfbesselK1scaled',
+                'gslsfbesselKnscaled',
+                'gslsfbesselj0',
+                'gslsfbesselj1',
+                'gslsfbesselj2',
+                'gslsfbesseljl',
+                'gslsfbessely0',
+                'gslsfbessely1',
+                'gslsfbessely2',
+                'gslsfbesselyl',
+                'gslsfbesseli0scaled',
+                'gslsfbesseli1scaled',
+                'gslsfbesseli2scaled',
+                'gslsfbesselilscaled',
+                'gslsfbesselk0scaled',
+                'gslsfbesselk1scaled',
+                'gslsfbesselk2scaled',
+                'gslsfbesselklscaled',
+                'gslsfbesselJnu',
+                'gslsfbesselYnu',
+                'gslsfbesselInuscaled',
+                'gslsfbesselInu',
+                'gslsfbesselKnuscaled',
+                'gslsfbesselKnu',
+                'gslsfbessellnKnu',
+                'gslsfbesselzeroJ0',
+                'gslsfbesselzeroJ1',
+                'gslsfbesselzeroJnu',
+                'gslsfclausen',
+                'gslsfhydrogenicR1',
+                'gslsfdawson',
+                'gslsfdebye1',
+                'gslsfdebye2',
+                'gslsfdebye3',
+                'gslsfdebye4',
+                'gslsfdebye5',
+                'gslsfdebye6',
+                'gslsfdilog',
+                'gslsfmultiply',
+                'gslsfellintKcomp',
+                'gslsfellintEcomp',
+                'gslsfellintPcomp',
+                'gslsfellintDcomp',
+                'gslsfellintF',
+                'gslsfellintE',
+                'gslsfellintRC',
+                'gslsferfc',
+                'gslsflogerfc',
+                'gslsferf',
+                'gslsferfZ',
+                'gslsferfQ',
+                'gslsfhazard',
+                'gslsfexp',
+                'gslsfexpmult',
+                'gslsfexpm1',
+                'gslsfexprel',
+                'gslsfexprel2',
+                'gslsfexpreln',
+                'gslsfexpintE1',
+                'gslsfexpintE2',
+                'gslsfexpintEn',
+                'gslsfexpintE1scaled',
+                'gslsfexpintE2scaled',
+                'gslsfexpintEnscaled',
+                'gslsfexpintEi',
+                'gslsfexpintEiscaled',
+                'gslsfShi',
+                'gslsfChi',
+                'gslsfexpint3',
+                'gslsfSi',
+                'gslsfCi',
+                'gslsfatanint',
+                'gslsffermidiracm1',
+                'gslsffermidirac0',
+                'gslsffermidirac1',
+                'gslsffermidirac2',
+                'gslsffermidiracint',
+                'gslsffermidiracmhalf',
+                'gslsffermidirachalf',
+                'gslsffermidirac3half',
+                'gslsffermidiracinc0',
+                'gslsflngamma',
+                'gslsfgamma',
+                'gslsfgammastar',
+                'gslsfgammainv',
+                'gslsftaylorcoeff',
+                'gslsffact',
+                'gslsfdoublefact',
+                'gslsflnfact',
+                'gslsflndoublefact',
+                'gslsflnchoose',
+                'gslsfchoose',
+                'gslsflnpoch',
+                'gslsfpoch',
+                'gslsfpochrel',
+                'gslsfgammaincQ',
+                'gslsfgammaincP',
+                'gslsfgammainc',
+                'gslsflnbeta',
+                'gslsfbeta',
+                'gslsfbetainc',
+                'gslsfgegenpoly1',
+                'gslsfgegenpoly2',
+                'gslsfgegenpoly3',
+                'gslsfgegenpolyn',
+                'gslsfhyperg0F1',
+                'gslsfhyperg1F1int',
+                'gslsfhyperg1F1',
+                'gslsfhypergUint',
+                'gslsfhypergU',
+                'gslsfhyperg2F0',
+                'gslsflaguerre1',
+                'gslsflaguerre2',
+                'gslsflaguerre3',
+                'gslsflaguerren',
+                'gslsflambertW0',
+                'gslsflambertWm1',
+                'gslsflegendrePl',
+                'gslsflegendreP1',
+                'gslsflegendreP2',
+                'gslsflegendreP3',
+                'gslsflegendreQ0',
+                'gslsflegendreQ1',
+                'gslsflegendreQl',
+                'gslsflegendrePlm',
+                'gslsflegendresphPlm',
+                'gslsflegendrearraysize',
+                'gslsfconicalPhalf',
+                'gslsfconicalPmhalf',
+                'gslsfconicalP0',
+                'gslsfconicalP1',
+                'gslsfconicalPsphreg',
+                'gslsfconicalPcylreg',
+                'gslsflegendreH3d0',
+                'gslsflegendreH3d1',
+                'gslsflegendreH3d',
+                'gslsflog',
+                'gslsflogabs',
+                'gslsflog1plusx',
+                'gslsflog1plusxmx',
+                'gslsfpowint',
+                'gslsfpsiint',
+                'gslsfpsi',
+                'gslsfpsi1piy',
+                'gslsfpsi1int',
+                'gslsfpsi1',
+                'gslsfpsin',
+                'gslsfsynchrotron1',
+                'gslsfsynchrotron2',
+                'gslsftransport2',
+                'gslsftransport3',
+                'gslsftransport4',
+                'gslsftransport5',
+                'gslsfsin',
+                'gslsfcos',
+                'gslsfhypot',
+                'gslsfsinc',
+                'gslsflnsinh',
+                'gslsflncosh',
+                'gslsfanglerestrictsymm',
+                'gslsfanglerestrictpos',
+                'gslsfzetaint',
+                'gslsfzeta',
+                'gslsfzetam1',
+                'gslsfzetam1int',
+                'gslsfhzeta',
+                'gslsfetaint',
+                'gslsfeta',
+                'imag',
+                'int1d',
+                'int2d',
+                'int3d',
+                'intalledges',
+                'intallfaces',
+                'interpolate',
+                'invdiff',
+                'invdiffnp',
+                'invdiffpos',
+                'Isend',
+                'isInf',
+                'isNaN',
+                'isoline',
+                'Irecv',
+                'j0',
+                'j1',
+                'jn',
+                'jump',
+                'lgamma',
+                'LinearCG',
+                'LinearGMRES',
+                'log',
+                'log10',
+                'lrint',
+                'lround',
+                'max',
+                'mean',
+                'medit',
+                'min',
+                'mmg3d',
+                'movemesh',
+                'movemesh23',
+                'mpiAlltoall',
+                'mpiAlltoallv',
+                'mpiAllgather',
+                'mpiAllgatherv',
+                'mpiAllReduce',
+                'mpiBarrier',
+                'mpiGather',
+                'mpiGatherv',
+                'mpiRank',
+                'mpiReduce',
+                'mpiScatter',
+                'mpiScatterv',
+                'mpiSize',
+                'mpiWait',
+                'mpiWaitAny',
+                'mpiWtick',
+                'mpiWtime',
+                'mshmet',
+                'NaN',
+                'NLCG',
+                'on',
+                'plot',
+                'polar',
+                'Post',
+                'pow',
+                'processor',
+                'processorblock',
+                'projection',
+                'randinit',
+                'randint31',
+                'randint32',
+                'random',
+                'randreal1',
+                'randreal2',
+                'randreal3',
+                'randres53',
+                'Read',
+                'readmesh',
+                'readmesh3',
+                'Recv',
+                'rint',
+                'round',
+                'savemesh',
+                'savesol',
+                'savevtk',
+                'seekg',
+                'Sent',
+                'set',
+                'sign',
+                'signbit',
+                'sin',
+                'sinh',
+                'sort',
+                'splitComm',
+                'splitmesh',
+                'sqrt',
+                'square',
+                'srandom',
+                'srandomdev',
+                'Stringification',
+                'swap',
+                'system',
+                'tan',
+                'tanh',
+                'tellg',
+                'tetg',
+                'tetgconvexhull',
+                'tetgreconstruction',
+                'tetgtransfo',
+                'tgamma',
+                'triangulate',
+                'trunc',
+                'Wait',
+                'Write',
+                'y0',
+                'y1',
+                'yn'
+    }
+
+    # function parameters
+    parameters = {
+                'A',
+                'A1',
+                'abserror',
+                'absolute',
+                'aniso',
+                'aspectratio',
+                'B',
+                'B1',
+                'bb',
+                'beginend',
+                'bin',
+                'boundary',
+                'bw',
+                'close',
+                'cmm',
+                'coef',
+                'composante',
+                'cutoff',
+                'datafilename',
+                'dataname',
+                'dim',
+                'distmax',
+                'displacement',
+                'doptions',
+                'dparams',
+                'eps',
+                'err',
+                'errg',
+                'facemerge',
+                'facetcl',
+                'factorize',
+                'file',
+                'fill',
+                'fixedborder',
+                'flabel',
+                'flags',
+                'floatmesh',
+                'floatsol',
+                'fregion',
+                'gradation',
+                'grey',
+                'hmax',
+                'hmin',
+                'holelist',
+                'hsv',
+                'init',
+                'inquire',
+                'inside',
+                'IsMetric',
+                'iso',
+                'ivalue',
+                'keepbackvertices',
+                'label',
+                'labeldown',
+                'labelmid',
+                'labelup',
+                'levelset',
+                'loptions',
+                'lparams',
+                'maxit',
+                'maxsubdiv',
+                'meditff',
+                'mem',
+                'memory',
+                'metric',
+                'mode',
+                'nbarrow',
+                'nbiso',
+                'nbiter',
+                'nbjacoby',
+                'nboffacetcl',
+                'nbofholes',
+                'nbofregions',
+                'nbregul',
+                'nbsmooth',
+                'nbvx',
+                'ncv',
+                'nev',
+                'nomeshgeneration',
+                'normalization',
+                'omega',
+                'op',
+                'optimize',
+                'option',
+                'options',
+                'order',
+                'orientation',
+                'periodic',
+                'power',
+                'precon',
+                'prev',
+                'ps',
+                'ptmerge',
+                'qfe',
+                'qforder',
+                'qft',
+                'qfV',
+                'ratio',
+                'rawvector',
+                'reffacelow',
+                'reffacemid',
+                'reffaceup',
+                'refnum',
+                'reftet',
+                'reftri',
+                'region',
+                'regionlist',
+                'renumv',
+                'rescaling',
+                'ridgeangle',
+                'save',
+                'sigma',
+                'sizeofvolume',
+                'smoothing',
+                'solver',
+                'sparams',
+                'split',
+                'splitin2',
+                'splitpbedge',
+                'stop',
+                'strategy',
+                'swap',
+                'switch',
+                'sym',
+                't',
+                'tgv',
+                'thetamax',
+                'tol',
+                'tolpivot',
+                'tolpivotsym',
+                'transfo',
+                'U2Vc',
+                'value',
+                'varrow',
+                'vector',
+                'veps',
+                'viso',
+                'wait',
+                'width',
+                'withsurfacemesh',
+                'WindowIndex',
+                'which',
+                'zbound'
+    }
+
+    # deprecated
+    deprecated = {'fixeborder'}
+
+    # do not highlight
+    suppress_highlight = {
+                'alignof',
+                'asm',
+                'constexpr',
+                'decltype',
+                'div',
+                'double',
+                'grad',
+                'mutable',
+                'namespace',
+                'noexcept',
+                'restrict',
+                'static_assert',
+                'template',
+                'this',
+                'thread_local',
+                'typeid',
+                'typename',
+                'using'
+    }
+
+    def get_tokens_unprocessed(self, text, stack=('root',)):
+        for index, token, value in CppLexer.get_tokens_unprocessed(self, text, stack):
+            if value in self.operators:
+                yield index, Operator, value
+            elif value in self.types:
+                yield index, Keyword.Type, value
+            elif value in self.fespaces:
+                yield index, Name.Class, value
+            elif value in self.preprocessor:
+                yield index, Comment.Preproc, value
+            elif value in self.keywords:
+                yield index, Keyword.Reserved, value
+            elif value in self.functions:
+                yield index, Name.Function, value
+            elif value in self.parameters:
+                yield index, Keyword.Pseudo, value
+            elif value in self.suppress_highlight:
+                yield index, Name, value
+            else:
+                yield index, token, value
diff --git a/.venv/Lib/site-packages/pygments/lexers/func.py b/.venv/Lib/site-packages/pygments/lexers/func.py
new file mode 100644 (file)
index 0000000..d8c912a
--- /dev/null
@@ -0,0 +1,110 @@
+"""
+    pygments.lexers.func
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for FunC.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Whitespace, Punctuation
+
+__all__ = ['FuncLexer']
+
+
+class FuncLexer(RegexLexer):
+    """
+    For FunC source code.
+    """
+
+    name = 'FunC'
+    aliases = ['func', 'fc']
+    filenames = ['*.fc', '*.func']
+    url = 'https://docs.ton.org/develop/func/overview'
+    version_added = ''
+
+    # 1. Does not start from "
+    # 2. Can start from ` and end with `, containing any character
+    # 3. Starts with underscore or { or } and have more than 1 character after it
+    # 4. Starts with letter, contains letters, numbers and underscores
+    identifier = r'(?!")(`([^`]+)`|((?=_)_|(?=\{)\{|(?=\})\}|(?![_`{}]))([^;,\[\]\(\)\s~.]+))'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+
+            include('keywords'),
+            include('strings'),
+            include('directives'),
+            include('numeric'),
+            include('comments'),
+            include('storage'),
+            include('functions'),
+            include('variables'),
+
+            (r'[.;(),\[\]~{}]', Punctuation)
+        ],
+        'keywords': [
+            (words((
+                '<=>', '>=', '<=', '!=', '==', '^>>', '~>>',
+                '>>', '<<', '/%', '^%', '~%', '^/', '~/', '+=',
+                '-=', '*=', '/=', '~/=', '^/=', '%=', '^%=', '<<=',
+                '>>=', '~>>=', '^>>=', '&=', '|=', '^=', '^', '=',
+                '~', '/', '%', '-', '*', '+','>',
+                '<', '&', '|', ':', '?'), prefix=r'(?<=\s)', suffix=r'(?=\s)'),
+             Operator),
+            (words((
+                'if', 'ifnot',
+                'else', 'elseif', 'elseifnot',
+                'while', 'do', 'until', 'repeat',
+                'return', 'impure', 'method_id',
+                'forall', 'asm', 'inline', 'inline_ref'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (words(('true', 'false'), prefix=r'\b', suffix=r'\b'), Keyword.Constant),
+        ],
+        'directives': [
+            (r'#include|#pragma', Keyword, 'directive'),
+        ],
+        'directive': [
+            include('strings'),
+            (r'\s+', Whitespace),
+            (r'version|not-version', Keyword),
+            (r'(>=|<=|=|>|<|\^)?([0-9]+)(.[0-9]+)?(.[0-9]+)?', Number), # version
+            (r';', Text, '#pop')
+        ],
+        'strings': [
+            (r'\"([^\n\"]+)\"[Hhcusa]?', String),
+        ],
+        'numeric': [
+            (r'\b(-?(?!_)([\d_]+|0x[\d_a-fA-F]+)|0b[1_0]+)(?<!_)(?=[\s\)\],;])', Number)
+        ],
+        'comments': [
+            (r';;([^\n]*)', Comment.Singleline),
+            (r'\{-', Comment.Multiline, 'comment'),
+        ],
+        'comment': [
+            (r'[^-}{]+', Comment.Multiline),
+            (r'\{-', Comment.Multiline, '#push'),
+            (r'-\}', Comment.Multiline, '#pop'),
+            (r'[-}{]', Comment.Multiline),
+        ],
+        'storage': [
+            (words((
+                'var', 'int', 'slice', 'tuple',
+                'cell', 'builder', 'cont', '_'),
+                prefix=r'\b', suffix=r'(?=[\s\(\),\[\]])'),
+             Keyword.Type),
+            (words(('global', 'const'), prefix=r'\b', suffix=r'\b'), Keyword.Constant),
+        ],
+        'variables': [
+            (identifier, Name.Variable),
+        ],
+        'functions': [
+            # identifier followed by (
+            (identifier + r'(?=[\(])', Name.Function),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/functional.py b/.venv/Lib/site-packages/pygments/lexers/functional.py
new file mode 100644 (file)
index 0000000..6a051d8
--- /dev/null
@@ -0,0 +1,21 @@
+"""
+    pygments.lexers.functional
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexer classes previously contained in this module.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# ruff: noqa: F401
+from pygments.lexers.lisp import SchemeLexer, CommonLispLexer, RacketLexer, \
+    NewLispLexer, ShenLexer
+from pygments.lexers.haskell import HaskellLexer, LiterateHaskellLexer, \
+    KokaLexer
+from pygments.lexers.theorem import CoqLexer
+from pygments.lexers.erlang import ErlangLexer, ErlangShellLexer, \
+    ElixirConsoleLexer, ElixirLexer
+from pygments.lexers.ml import SMLLexer, OcamlLexer, OpaLexer
+
+__all__ = []
diff --git a/.venv/Lib/site-packages/pygments/lexers/futhark.py b/.venv/Lib/site-packages/pygments/lexers/futhark.py
new file mode 100644 (file)
index 0000000..dd2efe8
--- /dev/null
@@ -0,0 +1,105 @@
+"""
+    pygments.lexers.futhark
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Futhark language
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+from pygments import unistring as uni
+
+__all__ = ['FutharkLexer']
+
+
+class FutharkLexer(RegexLexer):
+    """
+    A Futhark lexer
+    """
+    name = 'Futhark'
+    url = 'https://futhark-lang.org/'
+    aliases = ['futhark']
+    filenames = ['*.fut']
+    mimetypes = ['text/x-futhark']
+    version_added = '2.8'
+
+    num_types = ('i8', 'i16', 'i32', 'i64', 'u8', 'u16', 'u32', 'u64', 'f32', 'f64')
+
+    other_types = ('bool', )
+
+    reserved = ('if', 'then', 'else', 'def', 'let', 'loop', 'in', 'with',
+                'type', 'type~', 'type^',
+                'val', 'entry', 'for', 'while', 'do', 'case', 'match',
+                'include', 'import', 'module', 'open', 'local', 'assert', '_')
+
+    ascii = ('NUL', 'SOH', '[SE]TX', 'EOT', 'ENQ', 'ACK',
+             'BEL', 'BS', 'HT', 'LF', 'VT', 'FF', 'CR', 'S[OI]', 'DLE',
+             'DC[1-4]', 'NAK', 'SYN', 'ETB', 'CAN',
+             'EM', 'SUB', 'ESC', '[FGRU]S', 'SP', 'DEL')
+
+    num_postfix = r'({})?'.format('|'.join(num_types))
+
+    identifier_re = '[a-zA-Z_][a-zA-Z_0-9\']*'
+
+    # opstart_re = '+\-\*/%=\!><\|&\^'
+
+    tokens = {
+        'root': [
+            (r'--(.*?)$', Comment.Single),
+            (r'\s+', Whitespace),
+            (r'\(\)', Punctuation),
+            (r'\b({})(?!\')\b'.format('|'.join(reserved)), Keyword.Reserved),
+            (r'\b({})(?!\')\b'.format('|'.join(num_types + other_types)), Keyword.Type),
+
+            # Identifiers
+            (r'#\[([a-zA-Z_\(\) ]*)\]', Comment.Preproc),
+            (rf'[#!]?({identifier_re}\.)*{identifier_re}', Name),
+
+            (r'\\', Operator),
+            (r'[-+/%=!><|&*^][-+/%=!><|&*^.]*', Operator),
+            (r'[][(),:;`{}?.\'~^]', Punctuation),
+
+            #  Numbers
+            (r'0[xX]_*[\da-fA-F](_*[\da-fA-F])*_*[pP][+-]?\d(_*\d)*' + num_postfix,
+             Number.Float),
+            (r'0[xX]_*[\da-fA-F](_*[\da-fA-F])*\.[\da-fA-F](_*[\da-fA-F])*'
+             r'(_*[pP][+-]?\d(_*\d)*)?' + num_postfix, Number.Float),
+            (r'\d(_*\d)*_*[eE][+-]?\d(_*\d)*' + num_postfix, Number.Float),
+            (r'\d(_*\d)*\.\d(_*\d)*(_*[eE][+-]?\d(_*\d)*)?' + num_postfix, Number.Float),
+            (r'0[bB]_*[01](_*[01])*' + num_postfix, Number.Bin),
+            (r'0[xX]_*[\da-fA-F](_*[\da-fA-F])*' + num_postfix, Number.Hex),
+            (r'\d(_*\d)*' + num_postfix, Number.Integer),
+
+            #  Character/String Literals
+            (r"'", String.Char, 'character'),
+            (r'"', String, 'string'),
+            #  Special
+            (r'\[[a-zA-Z_\d]*\]', Keyword.Type),
+            (r'\(\)', Name.Builtin),
+        ],
+        'character': [
+            # Allows multi-chars, incorrectly.
+            (r"[^\\']'", String.Char, '#pop'),
+            (r"\\", String.Escape, 'escape'),
+            ("'", String.Char, '#pop'),
+        ],
+        'string': [
+            (r'[^\\"]+', String),
+            (r"\\", String.Escape, 'escape'),
+            ('"', String, '#pop'),
+        ],
+
+        'escape': [
+            (r'[abfnrtv"\'&\\]', String.Escape, '#pop'),
+            (r'\^[][' + uni.Lu + r'@^_]', String.Escape, '#pop'),
+            ('|'.join(ascii), String.Escape, '#pop'),
+            (r'o[0-7]+', String.Escape, '#pop'),
+            (r'x[\da-fA-F]+', String.Escape, '#pop'),
+            (r'\d+', String.Escape, '#pop'),
+            (r'(\s+)(\\)', bygroups(Whitespace, String.Escape), '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/gcodelexer.py b/.venv/Lib/site-packages/pygments/lexers/gcodelexer.py
new file mode 100644 (file)
index 0000000..9e968bd
--- /dev/null
@@ -0,0 +1,35 @@
+"""
+    pygments.lexers.gcodelexer
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the G Code Language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Comment, Name, Text, Keyword, Number
+
+__all__ = ['GcodeLexer']
+
+
+class GcodeLexer(RegexLexer):
+    """
+    For gcode source code.
+    """
+    name = 'g-code'
+    aliases = ['gcode']
+    filenames = ['*.gcode']
+    url = 'https://en.wikipedia.org/wiki/G-code'
+    version_added = '2.9'
+
+    tokens = {
+        'root': [
+            (r';.*\n', Comment),
+            (r'^[gmGM]\d{1,4}\s', Name.Builtin),  # M or G commands
+            (r'([^gGmM])([+-]?\d*[.]?\d+)', bygroups(Keyword, Number)),
+            (r'\s', Text.Whitespace),
+            (r'.*\n', Text),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/gdscript.py b/.venv/Lib/site-packages/pygments/lexers/gdscript.py
new file mode 100644 (file)
index 0000000..6dfe589
--- /dev/null
@@ -0,0 +1,189 @@
+"""
+    pygments.lexers.gdscript
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for GDScript.
+
+    Modified by Daniel J. Ramirez <djrmuv@gmail.com> based on the original
+    python.py.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, default, words, \
+    combined
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ["GDScriptLexer"]
+
+
+class GDScriptLexer(RegexLexer):
+    """
+    For GDScript source code.
+    """
+
+    name = "GDScript"
+    url = 'https://www.godotengine.org'
+    aliases = ["gdscript", "gd"]
+    filenames = ["*.gd"]
+    mimetypes = ["text/x-gdscript", "application/x-gdscript"]
+    version_added = ''
+
+    def innerstring_rules(ttype):
+        return [
+            # the old style '%s' % (...) string formatting
+            (r"%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?"
+             "[hlL]?[E-GXc-giorsux%]",
+             String.Interpol),
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"%\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # unhandled string formatting sign
+            (r"%", ttype),
+            # newlines are an error (use "nl" state)
+        ]
+
+    tokens = {
+        "root": [
+            (r"\n", Whitespace),
+            (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")',
+             bygroups(Whitespace, String.Affix, String.Doc)),
+            (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')",
+             bygroups(Whitespace, String.Affix, String.Doc)),
+            (r"[^\S\n]+", Whitespace),
+            (r"#.*$", Comment.Single),
+            (r"[]{}:(),;[]", Punctuation),
+            (r"(\\)(\n)", bygroups(Text, Whitespace)),
+            (r"\\", Text),
+            (r"(in|and|or|not)\b", Operator.Word),
+            (r"!=|==|<<|>>|&&|\+=|-=|\*=|/=|%=|&=|\|=|\|\||[-~+/*%=<>&^.!|$]",
+             Operator),
+            include("keywords"),
+            (r"(func)(\s+)", bygroups(Keyword, Whitespace), "funcname"),
+            (r"(class)(\s+)", bygroups(Keyword, Whitespace), "classname"),
+            include("builtins"),
+            ('([rR]|[uUbB][rR]|[rR][uUbB])(""")',
+             bygroups(String.Affix, String.Double),
+             "tdqs"),
+            ("([rR]|[uUbB][rR]|[rR][uUbB])(''')",
+             bygroups(String.Affix, String.Single),
+             "tsqs"),
+            ('([rR]|[uUbB][rR]|[rR][uUbB])(")',
+             bygroups(String.Affix, String.Double),
+             "dqs"),
+            ("([rR]|[uUbB][rR]|[rR][uUbB])(')",
+             bygroups(String.Affix, String.Single),
+             "sqs"),
+            ('([uUbB]?)(""")',
+             bygroups(String.Affix, String.Double),
+             combined("stringescape", "tdqs")),
+            ("([uUbB]?)(''')",
+             bygroups(String.Affix, String.Single),
+             combined("stringescape", "tsqs")),
+            ('([uUbB]?)(")',
+             bygroups(String.Affix, String.Double),
+             combined("stringescape", "dqs")),
+            ("([uUbB]?)(')",
+             bygroups(String.Affix, String.Single),
+             combined("stringescape", "sqs")),
+            include("name"),
+            include("numbers"),
+        ],
+        "keywords": [
+            (words(("and", "in", "not", "or", "as", "breakpoint", "class",
+                    "class_name", "extends", "is", "func", "setget", "signal",
+                    "tool", "const", "enum", "export", "onready", "static",
+                    "var", "break", "continue", "if", "elif", "else", "for",
+                    "pass", "return", "match", "while", "remote", "master",
+                    "puppet", "remotesync", "mastersync", "puppetsync"),
+                   suffix=r"\b"), Keyword),
+        ],
+        "builtins": [
+            (words(("Color8", "ColorN", "abs", "acos", "asin", "assert", "atan",
+                    "atan2", "bytes2var", "ceil", "char", "clamp", "convert",
+                    "cos", "cosh", "db2linear", "decimals", "dectime", "deg2rad",
+                    "dict2inst", "ease", "exp", "floor", "fmod", "fposmod",
+                    "funcref", "hash", "inst2dict", "instance_from_id", "is_inf",
+                    "is_nan", "lerp", "linear2db", "load", "log", "max", "min",
+                    "nearest_po2", "pow", "preload", "print", "print_stack",
+                    "printerr", "printraw", "prints", "printt", "rad2deg",
+                    "rand_range", "rand_seed", "randf", "randi", "randomize",
+                    "range", "round", "seed", "sign", "sin", "sinh", "sqrt",
+                    "stepify", "str", "str2var", "tan", "tan", "tanh",
+                    "type_exist", "typeof", "var2bytes", "var2str", "weakref",
+                    "yield"), prefix=r"(?<!\.)", suffix=r"\b"),
+             Name.Builtin),
+            (r"((?<!\.)(self|false|true)|(PI|TAU|NAN|INF)" r")\b",
+             Name.Builtin.Pseudo),
+            (words(("bool", "int", "float", "String", "NodePath", "Vector2",
+                    "Rect2", "Transform2D", "Vector3", "Rect3", "Plane", "Quat",
+                    "Basis", "Transform", "Color", "RID", "Object", "NodePath",
+                    "Dictionary", "Array", "PackedByteArray", "PackedInt32Array",
+                    "PackedInt64Array", "PackedFloat32Array", "PackedFloat64Array",
+                    "PackedStringArray", "PackedVector2Array", "PackedVector3Array",
+                    "PackedColorArray", "null", "void"),
+                   prefix=r"(?<!\.)", suffix=r"\b"),
+             Name.Builtin.Type),
+        ],
+        "numbers": [
+            (r"(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?", Number.Float),
+            (r"\d+[eE][+-]?[0-9]+j?", Number.Float),
+            (r"0[xX][a-fA-F0-9]+", Number.Hex),
+            (r"\d+j?", Number.Integer),
+        ],
+        "name": [(r"[a-zA-Z_]\w*", Name)],
+        "funcname": [(r"[a-zA-Z_]\w*", Name.Function, "#pop"), default("#pop")],
+        "classname": [(r"[a-zA-Z_]\w*", Name.Class, "#pop")],
+        "stringescape": [
+            (
+                r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+                r"U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})",
+                String.Escape,
+            )
+        ],
+        "strings-single": innerstring_rules(String.Single),
+        "strings-double": innerstring_rules(String.Double),
+        "dqs": [
+            (r'"', String.Double, "#pop"),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include("strings-double"),
+        ],
+        "sqs": [
+            (r"'", String.Single, "#pop"),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include("strings-single"),
+        ],
+        "tdqs": [
+            (r'"""', String.Double, "#pop"),
+            include("strings-double"),
+            (r"\n", Whitespace),
+        ],
+        "tsqs": [
+            (r"'''", String.Single, "#pop"),
+            include("strings-single"),
+            (r"\n", Whitespace),
+        ],
+    }
+
+    def analyse_text(text):
+        score = 0.0
+
+        if re.search(
+            r"func (_ready|_init|_input|_process|_unhandled_input)", text
+        ):
+            score += 0.8
+
+        if re.search(
+            r"(extends |class_name |onready |preload|load|setget|func [^_])",
+            text
+        ):
+            score += 0.4
+
+        if re.search(r"(var|const|enum|export|signal|tool)", text):
+            score += 0.2
+
+        return min(score, 1.0)
diff --git a/.venv/Lib/site-packages/pygments/lexers/gleam.py b/.venv/Lib/site-packages/pygments/lexers/gleam.py
new file mode 100644 (file)
index 0000000..19047e1
--- /dev/null
@@ -0,0 +1,74 @@
+"""
+    pygments.lexers.gleam
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Gleam programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, bygroups
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['GleamLexer']
+
+
+class GleamLexer(RegexLexer):
+    """
+    Lexer for the Gleam programming language (version 1.0.0).
+    """
+
+    name = 'Gleam'
+    url = 'https://gleam.run/'
+    filenames = ['*.gleam']
+    aliases = ['gleam']
+    mimetypes = ['text/x-gleam']
+    version_added = '2.19'
+
+    keywords = words((
+        'as', 'assert', 'auto', 'case', 'const', 'delegate', 'derive', 'echo',
+        'else', 'fn', 'if', 'implement', 'import', 'let', 'macro', 'opaque',
+        'panic', 'pub', 'test', 'todo', 'type', 'use',
+    ), suffix=r'\b')
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'(///.*?)(\n)', bygroups(String.Doc, Whitespace)),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+
+            # Keywords
+            (keywords, Keyword),
+            (r'([a-zA-Z_]+)(\.)', bygroups(Keyword, Punctuation)),
+
+            # Punctuation
+            (r'[()\[\]{}:;,@]+', Punctuation),
+            (r'(#|!=|!|==|\|>|\|\||\||\->|<\-|&&|<<|>>|\.\.|\.|=)', Punctuation),
+
+            # Operators
+            (r'(<>|\+\.?|\-\.?|\*\.?|/\.?|%\.?|<=\.?|>=\.?|<\.?|>\.?|=)', Operator),
+
+            # Strings
+            (r'"(\\"|[^"])*"', String),
+
+            # Identifiers
+            (r'\b(let)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Variable)),
+            (r'\b(fn)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Function)),
+            (r'[a-zA-Z_/]\w*', Name),
+
+            # numbers
+            (r'(\d+(_\d+)*\.(?!\.)(\d+(_\d+)*)?|\.\d+(_\d+)*)([eEf][+-]?[0-9]+)?', Number.Float),
+            (r'\d+(_\d+)*[eEf][+-]?[0-9]+', Number.Float),
+            (r'0[xX][a-fA-F0-9]+(_[a-fA-F0-9]+)*(\.([a-fA-F0-9]+(_[a-fA-F0-9]+)*)?)?p[+-]?\d+', Number.Float),
+            (r'0[bB][01]+(_[01]+)*', Number.Bin),
+            (r'0[oO][0-7]+(_[0-7]+)*', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+(_[a-fA-F0-9]+)*', Number.Hex),
+            (r'\d+(_\d+)*', Number.Integer),
+
+            # Whitespace
+            (r'\s+', Whitespace),
+
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/go.py b/.venv/Lib/site-packages/pygments/lexers/go.py
new file mode 100644 (file)
index 0000000..77a0fbc
--- /dev/null
@@ -0,0 +1,97 @@
+"""
+    pygments.lexers.go
+    ~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Google Go language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['GoLexer']
+
+
+class GoLexer(RegexLexer):
+    """
+    For Go source.
+    """
+    name = 'Go'
+    url = 'https://go.dev/'
+    filenames = ['*.go']
+    aliases = ['go', 'golang']
+    mimetypes = ['text/x-gosrc']
+    version_added = '1.2'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'(\\)(\n)', bygroups(Text, Whitespace)),  # line continuations
+            (r'//(.*?)$', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'(import|package)\b', Keyword.Namespace),
+            (r'(var|func|struct|map|chan|type|interface|const)\b',
+             Keyword.Declaration),
+            (words((
+                'break', 'default', 'select', 'case', 'defer', 'go',
+                'else', 'goto', 'switch', 'fallthrough', 'if', 'range',
+                'continue', 'for', 'return'), suffix=r'\b'),
+             Keyword),
+            (r'(true|false|iota|nil)\b', Keyword.Constant),
+            # It seems the builtin types aren't actually keywords, but
+            # can be used as functions. So we need two declarations.
+            (words((
+                'uint', 'uint8', 'uint16', 'uint32', 'uint64',
+                'int', 'int8', 'int16', 'int32', 'int64',
+                'float', 'float32', 'float64',
+                'complex64', 'complex128', 'byte', 'rune',
+                'string', 'bool', 'error', 'uintptr', 'any', 'comparable',
+                'print', 'println', 'panic', 'recover', 'close', 'complex',
+                'real', 'imag', 'len', 'cap', 'append', 'copy', 'delete',
+                'new', 'make', 'min', 'max', 'clear'), suffix=r'\b(\()'),
+             bygroups(Name.Builtin, Punctuation)),
+            (words((
+                'uint', 'uint8', 'uint16', 'uint32', 'uint64',
+                'int', 'int8', 'int16', 'int32', 'int64',
+                'float', 'float32', 'float64',
+                'complex64', 'complex128', 'byte', 'rune',
+                'string', 'bool', 'error', 'uintptr', 'any', 'comparable'), suffix=r'\b'),
+             Keyword.Type),
+            # imaginary_lit
+            (r'\d+i', Number),
+            (r'\d+\.\d*([Ee][-+]\d+)?i', Number),
+            (r'\.\d+([Ee][-+]\d+)?i', Number),
+            (r'\d+[Ee][-+]\d+i', Number),
+            # float_lit
+            (r'\d+(\.\d+[eE][+\-]?\d+|'
+             r'\.\d*|[eE][+\-]?\d+)', Number.Float),
+            (r'\.\d+([eE][+\-]?\d+)?', Number.Float),
+            # int_lit
+            # -- octal_lit
+            (r'0[0-7]+', Number.Oct),
+            # -- hex_lit
+            (r'0[xX][0-9a-fA-F]+', Number.Hex),
+            # -- decimal_lit
+            (r'(0|[1-9][0-9]*)', Number.Integer),
+            # char_lit
+            (r"""'(\\['"\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}"""
+             r"""|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|[^\\])'""",
+             String.Char),
+            # StringLiteral
+            # -- raw_string_lit
+            (r'`[^`]*`', String),
+            # -- interpreted_string_lit
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            # Tokens
+            (r'(<<=|>>=|<<|>>|<=|>=|&\^=|&\^|\+=|-=|\*=|/=|%=|&=|\|=|&&|\|\|'
+             r'|<-|\+\+|--|==|!=|:=|\.\.\.|[+\-*/%&]'
+             r'|~|\|)', Operator),
+            (r'[|^<>=!()\[\]{}.,;:]', Punctuation),
+            # identifier
+            (r'[^\W\d]\w*', Name.Other),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/grammar_notation.py b/.venv/Lib/site-packages/pygments/lexers/grammar_notation.py
new file mode 100644 (file)
index 0000000..45274fd
--- /dev/null
@@ -0,0 +1,262 @@
+"""
+    pygments.lexers.grammar_notation
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for grammar notations like BNF.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include, this, using, words
+from pygments.token import Comment, Keyword, Literal, Name, Number, \
+    Operator, Punctuation, String, Text, Whitespace
+
+__all__ = ['BnfLexer', 'AbnfLexer', 'JsgfLexer', 'PegLexer']
+
+
+class BnfLexer(RegexLexer):
+    """
+    This lexer is for grammar notations which are similar to
+    original BNF.
+
+    In order to maximize a number of targets of this lexer,
+    let's decide some designs:
+
+    * We don't distinguish `Terminal Symbol`.
+
+    * We do assume that `NonTerminal Symbol` are always enclosed
+      with arrow brackets.
+
+    * We do assume that `NonTerminal Symbol` may include
+      any printable characters except arrow brackets and ASCII 0x20.
+      This assumption is for `RBNF <http://www.rfc-base.org/txt/rfc-5511.txt>`_.
+
+    * We do assume that target notation doesn't support comment.
+
+    * We don't distinguish any operators and punctuation except
+      `::=`.
+
+    Though these decision making might cause too minimal highlighting
+    and you might be disappointed, but it is reasonable for us.
+    """
+
+    name = 'BNF'
+    aliases = ['bnf']
+    filenames = ['*.bnf']
+    mimetypes = ['text/x-bnf']
+    url = 'https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form'
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            (r'(<)([ -;=?-~]+)(>)',
+             bygroups(Punctuation, Name.Class, Punctuation)),
+
+            # an only operator
+            (r'::=', Operator),
+
+            # fallback
+            (r'[^<>:]+', Text),  # for performance
+            (r'.', Text),
+        ],
+    }
+
+
+class AbnfLexer(RegexLexer):
+    """
+    Lexer for IETF 7405 ABNF.
+
+    (Updates `5234 <http://www.ietf.org/rfc/rfc5234.txt>`_) grammars.
+    """
+
+    name = 'ABNF'
+    url = 'http://www.ietf.org/rfc/rfc7405.txt'
+    aliases = ['abnf']
+    filenames = ['*.abnf']
+    mimetypes = ['text/x-abnf']
+    version_added = '2.1'
+
+    _core_rules = (
+        'ALPHA', 'BIT', 'CHAR', 'CR', 'CRLF', 'CTL', 'DIGIT',
+        'DQUOTE', 'HEXDIG', 'HTAB', 'LF', 'LWSP', 'OCTET',
+        'SP', 'VCHAR', 'WSP')
+
+    tokens = {
+        'root': [
+            # comment
+            (r';.*$', Comment.Single),
+
+            # quoted
+            #   double quote itself in this state, it is as '%x22'.
+            (r'(%[si])?"[^"]*"', Literal),
+
+            # binary (but i have never seen...)
+            (r'%b[01]+\-[01]+\b', Literal),  # range
+            (r'%b[01]+(\.[01]+)*\b', Literal),  # concat
+
+            # decimal
+            (r'%d[0-9]+\-[0-9]+\b', Literal),  # range
+            (r'%d[0-9]+(\.[0-9]+)*\b', Literal),  # concat
+
+            # hexadecimal
+            (r'%x[0-9a-fA-F]+\-[0-9a-fA-F]+\b', Literal),  # range
+            (r'%x[0-9a-fA-F]+(\.[0-9a-fA-F]+)*\b', Literal),  # concat
+
+            # repetition (<a>*<b>element) including nRule
+            (r'\b[0-9]+\*[0-9]+', Operator),
+            (r'\b[0-9]+\*', Operator),
+            (r'\b[0-9]+', Operator),
+            (r'\*', Operator),
+
+            # Strictly speaking, these are not keyword but
+            # are called `Core Rule'.
+            (words(_core_rules, suffix=r'\b'), Keyword),
+
+            # nonterminals (ALPHA *(ALPHA / DIGIT / "-"))
+            (r'[a-zA-Z][a-zA-Z0-9-]*\b', Name.Class),
+
+            # operators
+            (r'(=/|=|/)', Operator),
+
+            # punctuation
+            (r'[\[\]()]', Punctuation),
+
+            # fallback
+            (r'\s+', Whitespace),
+            (r'.', Text),
+        ],
+    }
+
+
+class JsgfLexer(RegexLexer):
+    """
+    For JSpeech Grammar Format grammars.
+    """
+    name = 'JSGF'
+    url = 'https://www.w3.org/TR/jsgf/'
+    aliases = ['jsgf']
+    filenames = ['*.jsgf']
+    mimetypes = ['application/jsgf', 'application/x-jsgf', 'text/jsgf']
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('non-comments'),
+        ],
+        'comments': [
+            (r'/\*\*(?!/)', Comment.Multiline, 'documentation comment'),
+            (r'/\*[\w\W]*?\*/', Comment.Multiline),
+            (r'//.*$', Comment.Single),
+        ],
+        'non-comments': [
+            (r'\A#JSGF[^;]*', Comment.Preproc),
+            (r'\s+', Whitespace),
+            (r';', Punctuation),
+            (r'[=|()\[\]*+]', Operator),
+            (r'/[^/]+/', Number.Float),
+            (r'"', String.Double, 'string'),
+            (r'\{', String.Other, 'tag'),
+            (words(('import', 'public'), suffix=r'\b'), Keyword.Reserved),
+            (r'grammar\b', Keyword.Reserved, 'grammar name'),
+            (r'(<)(NULL|VOID)(>)',
+             bygroups(Punctuation, Name.Builtin, Punctuation)),
+            (r'<', Punctuation, 'rulename'),
+            (r'\w+|[^\s;=|()\[\]*+/"{<\w]+', Text),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'\\.', String.Escape),
+            (r'[^\\"]+', String.Double),
+        ],
+        'tag': [
+            (r'\}', String.Other, '#pop'),
+            (r'\\.', String.Escape),
+            (r'[^\\}]+', String.Other),
+        ],
+        'grammar name': [
+            (r';', Punctuation, '#pop'),
+            (r'\s+', Whitespace),
+            (r'\.', Punctuation),
+            (r'[^;\s.]+', Name.Namespace),
+        ],
+        'rulename': [
+            (r'>', Punctuation, '#pop'),
+            (r'\*', Punctuation),
+            (r'\s+', Whitespace),
+            (r'([^.>]+)(\s*)(\.)', bygroups(Name.Namespace, Text, Punctuation)),
+            (r'[^.>]+', Name.Constant),
+        ],
+        'documentation comment': [
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'^(\s*)(\*?)(\s*)(@(?:example|see))(\s+)'
+             r'([\w\W]*?(?=(?:^\s*\*?\s*@|\*/)))',
+             bygroups(Whitespace, Comment.Multiline, Whitespace, Comment.Special,
+                      Whitespace, using(this, state='example'))),
+            (r'(^\s*\*?\s*)(@\S*)',
+             bygroups(Comment.Multiline, Comment.Special)),
+            (r'[^*\n@]+|\w|\W', Comment.Multiline),
+        ],
+        'example': [
+            (r'(\n\s*)(\*)', bygroups(Whitespace, Comment.Multiline)),
+            include('non-comments'),
+            (r'.', Comment.Multiline),
+        ],
+    }
+
+
+class PegLexer(RegexLexer):
+    """
+    This lexer is for Parsing Expression Grammars (PEG).
+
+    Various implementations of PEG have made different decisions
+    regarding the syntax, so let's try to be accommodating:
+
+    * `<-`, `←`, `:`, and `=` are all accepted as rule operators.
+
+    * Both `|` and `/` are choice operators.
+
+    * `^`, `↑`, and `~` are cut operators.
+
+    * A single `a-z` character immediately before a string, or
+      multiple `a-z` characters following a string, are part of the
+      string (e.g., `r"..."` or `"..."ilmsuxa`).
+    """
+
+    name = 'PEG'
+    url = 'https://bford.info/pub/lang/peg.pdf'
+    aliases = ['peg']
+    filenames = ['*.peg']
+    mimetypes = ['text/x-peg']
+    version_added = '2.6'
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'#.*$', Comment.Single),
+
+            # All operators
+            (r'<-|[←:=/|&!?*+^↑~]', Operator),
+
+            # Other punctuation
+            (r'[()]', Punctuation),
+
+            # Keywords
+            (r'\.', Keyword),
+
+            # Character classes
+            (r'(\[)([^\]]*(?:\\.[^\]\\]*)*)(\])',
+             bygroups(Punctuation, String, Punctuation)),
+
+            # Single and double quoted strings (with optional modifiers)
+            (r'[a-z]?"[^"\\]*(?:\\.[^"\\]*)*"[a-z]*', String.Double),
+            (r"[a-z]?'[^'\\]*(?:\\.[^'\\]*)*'[a-z]*", String.Single),
+
+            # Nonterminals are not whitespace, operators, or punctuation
+            (r'[^\s<←:=/|&!?*+\^↑~()\[\]"\'#]+', Name.Class),
+
+            # Fallback
+            (r'.', Text),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/graph.py b/.venv/Lib/site-packages/pygments/lexers/graph.py
new file mode 100644 (file)
index 0000000..01d7574
--- /dev/null
@@ -0,0 +1,108 @@
+"""
+    pygments.lexers.graph
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for graph query languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this, words
+from pygments.token import Keyword, Punctuation, Comment, Operator, Name,\
+    String, Number, Whitespace
+
+
+__all__ = ['CypherLexer']
+
+
+class CypherLexer(RegexLexer):
+    """
+    For Cypher Query Language
+
+    For the Cypher version in Neo4j 3.3
+    """
+    name = 'Cypher'
+    url = 'https://neo4j.com/docs/developer-manual/3.3/cypher/'
+    aliases = ['cypher']
+    filenames = ['*.cyp', '*.cypher']
+    version_added = '2.0'
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            include('clauses'),
+            include('keywords'),
+            include('relations'),
+            include('strings'),
+            include('whitespace'),
+            include('barewords'),
+            include('comment'),
+        ],
+        'keywords': [
+            (r'(create|order|match|limit|set|skip|start|return|with|where|'
+             r'delete|foreach|not|by|true|false)\b', Keyword),
+        ],
+        'clauses': [
+            # based on https://neo4j.com/docs/cypher-refcard/3.3/
+            (r'(create)(\s+)(index|unique)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(drop)(\s+)(contraint|index)(\s+)(on)\b',
+                bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword)),
+            (r'(ends)(\s+)(with)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(is)(\s+)(node)(\s+)(key)\b',
+                bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword)),
+            (r'(is)(\s+)(null|unique)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(load)(\s+)(csv)(\s+)(from)\b',
+                bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword)),
+            (r'(on)(\s+)(match|create)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(optional)(\s+)(match)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(order)(\s+)(by)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(starts)(\s+)(with)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(union)(\s+)(all)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(using)(\s+)(periodic)(\s+)(commit)\b',
+                bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword)),
+            (r'(using)(\s+)(index)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(using)(\s+)(range|text|point)(\s+)(index)\b',
+                bygroups(Keyword, Whitespace, Name, Whitespace, Keyword)),
+            (words((
+                'all', 'any', 'as', 'asc', 'ascending', 'assert', 'call', 'case', 'create',
+                'delete', 'desc', 'descending', 'distinct', 'end', 'fieldterminator',
+                'foreach', 'in', 'limit', 'match', 'merge', 'none', 'not', 'null',
+                'remove', 'return', 'set', 'skip', 'single', 'start', 'then', 'union',
+                'unwind', 'yield', 'where', 'when', 'with', 'collect'), suffix=r'\b'), Keyword),
+        ],
+        'relations': [
+            (r'(-\[)(.*?)(\]->)', bygroups(Operator, using(this), Operator)),
+            (r'(<-\[)(.*?)(\]-)', bygroups(Operator, using(this), Operator)),
+            (r'(-\[)(.*?)(\]-)', bygroups(Operator, using(this), Operator)),
+            (r'-->|<--|\[|\]', Operator),
+            (r'<|>|<>|=|<=|=>|\(|\)|\||:|,|;', Punctuation),
+            (r'[.*{}]', Punctuation),
+        ],
+        'strings': [
+            (r'([\'"])(?:\\[tbnrf\'"\\]|[^\\])*?\1', String),
+            (r'`(?:``|[^`])+`', Name.Variable),
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+        ],
+        'barewords': [
+            (r'[a-z]\w*', Name),
+            (r'\d+', Number),
+        ],
+        'comment': [
+            (r'//.*$', Comment.Single),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/graphics.py b/.venv/Lib/site-packages/pygments/lexers/graphics.py
new file mode 100644 (file)
index 0000000..400be4f
--- /dev/null
@@ -0,0 +1,794 @@
+"""
+    pygments.lexers.graphics
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for computer graphics and plotting related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include, bygroups, using, \
+    this, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, \
+    Number, Punctuation, String, Whitespace
+
+__all__ = ['GLShaderLexer', 'PostScriptLexer', 'AsymptoteLexer', 'GnuplotLexer',
+           'PovrayLexer', 'HLSLShaderLexer']
+
+
+class GLShaderLexer(RegexLexer):
+    """
+    GLSL (OpenGL Shader) lexer.
+    """
+    name = 'GLSL'
+    aliases = ['glsl']
+    filenames = ['*.vert', '*.frag', '*.geo']
+    mimetypes = ['text/x-glslsrc']
+    url = 'https://www.khronos.org/api/opengl'
+    version_added = '1.1'
+
+    tokens = {
+        'root': [
+            (r'#(?:.*\\\n)*.*$', Comment.Preproc),
+            (r'//.*$', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'\+|-|~|!=?|\*|/|%|<<|>>|<=?|>=?|==?|&&?|\^|\|\|?',
+             Operator),
+            (r'[?:]', Operator),  # quick hack for ternary
+            (r'\bdefined\b', Operator),
+            (r'[;{}(),\[\]]', Punctuation),
+            # FIXME when e is present, no decimal point needed
+            (r'[+-]?\d*\.\d+([eE][-+]?\d+)?', Number.Float),
+            (r'[+-]?\d+\.\d*([eE][-+]?\d+)?', Number.Float),
+            (r'0[xX][0-9a-fA-F]*', Number.Hex),
+            (r'0[0-7]*', Number.Oct),
+            (r'[1-9][0-9]*', Number.Integer),
+            (words((
+                # Storage qualifiers
+                'attribute', 'const', 'uniform', 'varying',
+                'buffer', 'shared', 'in', 'out',
+                # Layout qualifiers
+                'layout',
+                # Interpolation qualifiers
+                'flat', 'smooth', 'noperspective',
+                # Auxiliary qualifiers
+                'centroid', 'sample', 'patch',
+                # Parameter qualifiers. Some double as Storage qualifiers
+                'inout',
+                # Precision qualifiers
+                'lowp', 'mediump', 'highp', 'precision',
+                # Invariance qualifiers
+                'invariant',
+                # Precise qualifiers
+                'precise',
+                # Memory qualifiers
+                'coherent', 'volatile', 'restrict', 'readonly', 'writeonly',
+                # Statements
+                'break', 'continue', 'do', 'for', 'while', 'switch',
+                'case', 'default', 'if', 'else', 'subroutine',
+                'discard', 'return', 'struct'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (words((
+                # Boolean values
+                'true', 'false'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword.Constant),
+            (words((
+                # Miscellaneous types
+                'void', 'atomic_uint',
+                # Floating-point scalars and vectors
+                'float', 'vec2', 'vec3', 'vec4',
+                'double', 'dvec2', 'dvec3', 'dvec4',
+                # Integer scalars and vectors
+                'int', 'ivec2', 'ivec3', 'ivec4',
+                'uint', 'uvec2', 'uvec3', 'uvec4',
+                # Boolean scalars and vectors
+                'bool', 'bvec2', 'bvec3', 'bvec4',
+                # Matrices
+                'mat2', 'mat3', 'mat4', 'dmat2', 'dmat3', 'dmat4',
+                'mat2x2', 'mat2x3', 'mat2x4', 'dmat2x2', 'dmat2x3', 'dmat2x4',
+                'mat3x2', 'mat3x3', 'mat3x4', 'dmat3x2', 'dmat3x3',
+                'dmat3x4', 'mat4x2', 'mat4x3', 'mat4x4', 'dmat4x2', 'dmat4x3', 'dmat4x4',
+                # Floating-point samplers
+                'sampler1D', 'sampler2D', 'sampler3D', 'samplerCube',
+                'sampler1DArray', 'sampler2DArray', 'samplerCubeArray',
+                'sampler2DRect', 'samplerBuffer',
+                'sampler2DMS', 'sampler2DMSArray',
+                # Shadow samplers
+                'sampler1DShadow', 'sampler2DShadow', 'samplerCubeShadow',
+                'sampler1DArrayShadow', 'sampler2DArrayShadow',
+                'samplerCubeArrayShadow', 'sampler2DRectShadow',
+                # Signed integer samplers
+                'isampler1D', 'isampler2D', 'isampler3D', 'isamplerCube',
+                'isampler1DArray', 'isampler2DArray', 'isamplerCubeArray',
+                'isampler2DRect', 'isamplerBuffer',
+                'isampler2DMS', 'isampler2DMSArray',
+                # Unsigned integer samplers
+                'usampler1D', 'usampler2D', 'usampler3D', 'usamplerCube',
+                'usampler1DArray', 'usampler2DArray', 'usamplerCubeArray',
+                'usampler2DRect', 'usamplerBuffer',
+                'usampler2DMS', 'usampler2DMSArray',
+                # Floating-point image types
+                'image1D', 'image2D', 'image3D', 'imageCube',
+                'image1DArray', 'image2DArray', 'imageCubeArray',
+                'image2DRect', 'imageBuffer',
+                'image2DMS', 'image2DMSArray',
+                # Signed integer image types
+                'iimage1D', 'iimage2D', 'iimage3D', 'iimageCube',
+                'iimage1DArray', 'iimage2DArray', 'iimageCubeArray',
+                'iimage2DRect', 'iimageBuffer',
+                'iimage2DMS', 'iimage2DMSArray',
+                # Unsigned integer image types
+                'uimage1D', 'uimage2D', 'uimage3D', 'uimageCube',
+                'uimage1DArray', 'uimage2DArray', 'uimageCubeArray',
+                'uimage2DRect', 'uimageBuffer',
+                'uimage2DMS', 'uimage2DMSArray'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword.Type),
+            (words((
+                # Reserved for future use.
+                'common', 'partition', 'active', 'asm', 'class',
+                'union', 'enum', 'typedef', 'template', 'this',
+                'resource', 'goto', 'inline', 'noinline', 'public',
+                'static', 'extern', 'external', 'interface', 'long',
+                'short', 'half', 'fixed', 'unsigned', 'superp', 'input',
+                'output', 'hvec2', 'hvec3', 'hvec4', 'fvec2', 'fvec3',
+                'fvec4', 'sampler3DRect', 'filter', 'sizeof', 'cast',
+                'namespace', 'using'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+            # All names beginning with "gl_" are reserved.
+            (r'gl_\w*', Name.Builtin),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'\.', Punctuation),
+            (r'\s+', Whitespace),
+        ],
+    }
+
+
+class HLSLShaderLexer(RegexLexer):
+    """
+    HLSL (Microsoft Direct3D Shader) lexer.
+    """
+    name = 'HLSL'
+    aliases = ['hlsl']
+    filenames = ['*.hlsl', '*.hlsli']
+    mimetypes = ['text/x-hlsl']
+    url = 'https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl'
+    version_added = '2.3'
+
+    tokens = {
+        'root': [
+            (r'#(?:.*\\\n)*.*$', Comment.Preproc),
+            (r'//.*$', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'\+|-|~|!=?|\*|/|%|<<|>>|<=?|>=?|==?|&&?|\^|\|\|?',
+             Operator),
+            (r'[?:]', Operator),  # quick hack for ternary
+            (r'\bdefined\b', Operator),
+            (r'[;{}(),.\[\]]', Punctuation),
+            # FIXME when e is present, no decimal point needed
+            (r'[+-]?\d*\.\d+([eE][-+]?\d+)?f?', Number.Float),
+            (r'[+-]?\d+\.\d*([eE][-+]?\d+)?f?', Number.Float),
+            (r'0[xX][0-9a-fA-F]*', Number.Hex),
+            (r'0[0-7]*', Number.Oct),
+            (r'[1-9][0-9]*', Number.Integer),
+            (r'"', String, 'string'),
+            (words((
+                'asm','asm_fragment','break','case','cbuffer','centroid','class',
+                'column_major','compile','compile_fragment','const','continue',
+                'default','discard','do','else','export','extern','for','fxgroup',
+                'globallycoherent','groupshared','if','in','inline','inout',
+                'interface','line','lineadj','linear','namespace','nointerpolation',
+                'noperspective','NULL','out','packoffset','pass','pixelfragment',
+                'point','precise','return','register','row_major','sample',
+                'sampler','shared','stateblock','stateblock_state','static',
+                'struct','switch','tbuffer','technique','technique10',
+                'technique11','texture','typedef','triangle','triangleadj',
+                'uniform','vertexfragment','volatile','while'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (words(('true','false'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Constant),
+            (words((
+                'auto','catch','char','const_cast','delete','dynamic_cast','enum',
+                'explicit','friend','goto','long','mutable','new','operator',
+                'private','protected','public','reinterpret_cast','short','signed',
+                'sizeof','static_cast','template','this','throw','try','typename',
+                'union','unsigned','using','virtual'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+            (words((
+                'dword','matrix','snorm','string','unorm','unsigned','void','vector',
+                'BlendState','Buffer','ByteAddressBuffer','ComputeShader',
+                'DepthStencilState','DepthStencilView','DomainShader',
+                'GeometryShader','HullShader','InputPatch','LineStream',
+                'OutputPatch','PixelShader','PointStream','RasterizerState',
+                'RenderTargetView','RasterizerOrderedBuffer',
+                'RasterizerOrderedByteAddressBuffer',
+                'RasterizerOrderedStructuredBuffer','RasterizerOrderedTexture1D',
+                'RasterizerOrderedTexture1DArray','RasterizerOrderedTexture2D',
+                'RasterizerOrderedTexture2DArray','RasterizerOrderedTexture3D',
+                'RWBuffer','RWByteAddressBuffer','RWStructuredBuffer',
+                'RWTexture1D','RWTexture1DArray','RWTexture2D','RWTexture2DArray',
+                'RWTexture3D','SamplerState','SamplerComparisonState',
+                'StructuredBuffer','Texture1D','Texture1DArray','Texture2D',
+                'Texture2DArray','Texture2DMS','Texture2DMSArray','Texture3D',
+                'TextureCube','TextureCubeArray','TriangleStream','VertexShader'),
+                prefix=r'\b', suffix=r'\b'),
+             Keyword.Type),
+            (words((
+                'bool','double','float','int','half','min16float','min10float',
+                'min16int','min12int','min16uint','uint'),
+                prefix=r'\b', suffix=r'([1-4](x[1-4])?)?\b'),
+             Keyword.Type),     # vector and matrix types
+            (words((
+                'abort','abs','acos','all','AllMemoryBarrier',
+                'AllMemoryBarrierWithGroupSync','any','AppendStructuredBuffer',
+                'asdouble','asfloat','asin','asint','asuint','asuint','atan',
+                'atan2','ceil','CheckAccessFullyMapped','clamp','clip',
+                'CompileShader','ConsumeStructuredBuffer','cos','cosh','countbits',
+                'cross','D3DCOLORtoUBYTE4','ddx','ddx_coarse','ddx_fine','ddy',
+                'ddy_coarse','ddy_fine','degrees','determinant',
+                'DeviceMemoryBarrier','DeviceMemoryBarrierWithGroupSync','distance',
+                'dot','dst','errorf','EvaluateAttributeAtCentroid',
+                'EvaluateAttributeAtSample','EvaluateAttributeSnapped','exp',
+                'exp2','f16tof32','f32tof16','faceforward','firstbithigh',
+                'firstbitlow','floor','fma','fmod','frac','frexp','fwidth',
+                'GetRenderTargetSampleCount','GetRenderTargetSamplePosition',
+                'GlobalOrderedCountIncrement','GroupMemoryBarrier',
+                'GroupMemoryBarrierWithGroupSync','InterlockedAdd','InterlockedAnd',
+                'InterlockedCompareExchange','InterlockedCompareStore',
+                'InterlockedExchange','InterlockedMax','InterlockedMin',
+                'InterlockedOr','InterlockedXor','isfinite','isinf','isnan',
+                'ldexp','length','lerp','lit','log','log10','log2','mad','max',
+                'min','modf','msad4','mul','noise','normalize','pow','printf',
+                'Process2DQuadTessFactorsAvg','Process2DQuadTessFactorsMax',
+                'Process2DQuadTessFactorsMin','ProcessIsolineTessFactors',
+                'ProcessQuadTessFactorsAvg','ProcessQuadTessFactorsMax',
+                'ProcessQuadTessFactorsMin','ProcessTriTessFactorsAvg',
+                'ProcessTriTessFactorsMax','ProcessTriTessFactorsMin',
+                'QuadReadLaneAt','QuadSwapX','QuadSwapY','radians','rcp',
+                'reflect','refract','reversebits','round','rsqrt','saturate',
+                'sign','sin','sincos','sinh','smoothstep','sqrt','step','tan',
+                'tanh','tex1D','tex1D','tex1Dbias','tex1Dgrad','tex1Dlod',
+                'tex1Dproj','tex2D','tex2D','tex2Dbias','tex2Dgrad','tex2Dlod',
+                'tex2Dproj','tex3D','tex3D','tex3Dbias','tex3Dgrad','tex3Dlod',
+                'tex3Dproj','texCUBE','texCUBE','texCUBEbias','texCUBEgrad',
+                'texCUBElod','texCUBEproj','transpose','trunc','WaveAllBitAnd',
+                'WaveAllMax','WaveAllMin','WaveAllBitOr','WaveAllBitXor',
+                'WaveAllEqual','WaveAllProduct','WaveAllSum','WaveAllTrue',
+                'WaveAnyTrue','WaveBallot','WaveGetLaneCount','WaveGetLaneIndex',
+                'WaveGetOrderedIndex','WaveIsHelperLane','WaveOnce',
+                'WavePrefixProduct','WavePrefixSum','WaveReadFirstLane',
+                'WaveReadLaneAt'),
+                prefix=r'\b', suffix=r'\b'),
+             Name.Builtin),     # built-in functions
+            (words((
+                'SV_ClipDistance','SV_ClipDistance0','SV_ClipDistance1',
+                'SV_Culldistance','SV_CullDistance0','SV_CullDistance1',
+                'SV_Coverage','SV_Depth','SV_DepthGreaterEqual',
+                'SV_DepthLessEqual','SV_DispatchThreadID','SV_DomainLocation',
+                'SV_GroupID','SV_GroupIndex','SV_GroupThreadID','SV_GSInstanceID',
+                'SV_InnerCoverage','SV_InsideTessFactor','SV_InstanceID',
+                'SV_IsFrontFace','SV_OutputControlPointID','SV_Position',
+                'SV_PrimitiveID','SV_RenderTargetArrayIndex','SV_SampleIndex',
+                'SV_StencilRef','SV_TessFactor','SV_VertexID',
+                'SV_ViewportArrayIndex'),
+                prefix=r'\b', suffix=r'\b'),
+             Name.Decorator),   # system-value semantics
+            (r'\bSV_Target[0-7]?\b', Name.Decorator),
+            (words((
+                'allow_uav_condition','branch','call','domain','earlydepthstencil',
+                'fastopt','flatten','forcecase','instance','loop','maxtessfactor',
+                'numthreads','outputcontrolpoints','outputtopology','partitioning',
+                'patchconstantfunc','unroll'),
+                prefix=r'\b', suffix=r'\b'),
+             Name.Decorator),   # attributes
+            (r'[a-zA-Z_]\w*', Name),
+            (r'\\$', Comment.Preproc),  # backslash at end of line -- usually macro continuation
+            (r'\s+', Whitespace),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|'
+             r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+    }
+
+
+class PostScriptLexer(RegexLexer):
+    """
+    Lexer for PostScript files.
+    """
+    name = 'PostScript'
+    url = 'https://en.wikipedia.org/wiki/PostScript'
+    aliases = ['postscript', 'postscr']
+    filenames = ['*.ps', '*.eps']
+    mimetypes = ['application/postscript']
+    version_added = '1.4'
+
+    delimiter = r'()<>\[\]{}/%\s'
+    delimiter_end = rf'(?=[{delimiter}])'
+
+    valid_name_chars = rf'[^{delimiter}]'
+    valid_name = rf"{valid_name_chars}+{delimiter_end}"
+
+    tokens = {
+        'root': [
+            # All comment types
+            (r'^%!.+$', Comment.Preproc),
+            (r'%%.*$', Comment.Special),
+            (r'(^%.*\n){2,}', Comment.Multiline),
+            (r'%.*$', Comment.Single),
+
+            # String literals are awkward; enter separate state.
+            (r'\(', String, 'stringliteral'),
+
+            (r'[{}<>\[\]]', Punctuation),
+
+            # Numbers
+            (r'<[0-9A-Fa-f]+>' + delimiter_end, Number.Hex),
+            # Slight abuse: use Oct to signify any explicit base system
+            (r'[0-9]+\#(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)'
+             r'((e|E)[0-9]+)?' + delimiter_end, Number.Oct),
+            (r'(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)((e|E)[0-9]+)?'
+             + delimiter_end, Number.Float),
+            (r'(\-|\+)?[0-9]+' + delimiter_end, Number.Integer),
+
+            # References
+            (rf'\/{valid_name}', Name.Variable),
+
+            # Names
+            (valid_name, Name.Function),      # Anything else is executed
+
+            # These keywords taken from
+            # <http://www.math.ubc.ca/~cass/graphics/manual/pdf/a1.pdf>
+            # Is there an authoritative list anywhere that doesn't involve
+            # trawling documentation?
+
+            (r'(false|true)' + delimiter_end, Keyword.Constant),
+
+            # Conditionals / flow control
+            (r'(eq|ne|g[et]|l[et]|and|or|not|if(?:else)?|for(?:all)?)'
+             + delimiter_end, Keyword.Reserved),
+
+            (words((
+                'abs', 'add', 'aload', 'arc', 'arcn', 'array', 'atan', 'begin',
+                'bind', 'ceiling', 'charpath', 'clip', 'closepath', 'concat',
+                'concatmatrix', 'copy', 'cos', 'currentlinewidth', 'currentmatrix',
+                'currentpoint', 'curveto', 'cvi', 'cvs', 'def', 'defaultmatrix',
+                'dict', 'dictstackoverflow', 'div', 'dtransform', 'dup', 'end',
+                'exch', 'exec', 'exit', 'exp', 'fill', 'findfont', 'floor', 'get',
+                'getinterval', 'grestore', 'gsave', 'gt', 'identmatrix', 'idiv',
+                'idtransform', 'index', 'invertmatrix', 'itransform', 'length',
+                'lineto', 'ln', 'load', 'log', 'loop', 'matrix', 'mod', 'moveto',
+                'mul', 'neg', 'newpath', 'pathforall', 'pathbbox', 'pop', 'print',
+                'pstack', 'put', 'quit', 'rand', 'rangecheck', 'rcurveto', 'repeat',
+                'restore', 'rlineto', 'rmoveto', 'roll', 'rotate', 'round', 'run',
+                'save', 'scale', 'scalefont', 'setdash', 'setfont', 'setgray',
+                'setlinecap', 'setlinejoin', 'setlinewidth', 'setmatrix',
+                'setrgbcolor', 'shfill', 'show', 'showpage', 'sin', 'sqrt',
+                'stack', 'stringwidth', 'stroke', 'strokepath', 'sub', 'syntaxerror',
+                'transform', 'translate', 'truncate', 'typecheck', 'undefined',
+                'undefinedfilename', 'undefinedresult'), suffix=delimiter_end),
+             Name.Builtin),
+
+            (r'\s+', Whitespace),
+        ],
+
+        'stringliteral': [
+            (r'[^()\\]+', String),
+            (r'\\', String.Escape, 'escape'),
+            (r'\(', String, '#push'),
+            (r'\)', String, '#pop'),
+        ],
+
+        'escape': [
+            (r'[0-8]{3}|n|r|t|b|f|\\|\(|\)', String.Escape, '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class AsymptoteLexer(RegexLexer):
+    """
+    For Asymptote source code.
+    """
+    name = 'Asymptote'
+    url = 'http://asymptote.sf.net/'
+    aliases = ['asymptote', 'asy']
+    filenames = ['*.asy']
+    mimetypes = ['text/x-asymptote']
+    version_added = '1.2'
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/\*.*?\*/)+'
+
+    tokens = {
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'(\\)(\n)', bygroups(Text, Whitespace)),  # line continuation
+            (r'//(\n|(.|\n)*?[^\\]\n)', Comment),
+            (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment),
+        ],
+        'statements': [
+            # simple string (TeX friendly)
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            # C style string (with character escapes)
+            (r"'", String, 'string'),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[Ll]?', Number.Hex),
+            (r'0[0-7]+[Ll]?', Number.Oct),
+            (r'\d+[Ll]?', Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.]', Punctuation),
+            (r'\b(case)(.+?)(:)', bygroups(Keyword, using(this), Text)),
+            (r'(and|controls|tension|atleast|curl|if|else|while|for|do|'
+             r'return|break|continue|struct|typedef|new|access|import|'
+             r'unravel|from|include|quote|static|public|private|restricted|'
+             r'this|explicit|true|false|null|cycle|newframe|operator)\b', Keyword),
+            # Since an asy-type-name can be also an asy-function-name,
+            # in the following we test if the string "  [a-zA-Z]" follows
+            # the Keyword.Type.
+            # Of course it is not perfect !
+            (r'(Braid|FitResult|Label|Legend|TreeNode|abscissa|arc|arrowhead|'
+             r'binarytree|binarytreeNode|block|bool|bool3|bounds|bqe|circle|'
+             r'conic|coord|coordsys|cputime|ellipse|file|filltype|frame|grid3|'
+             r'guide|horner|hsv|hyperbola|indexedTransform|int|inversion|key|'
+             r'light|line|linefit|marginT|marker|mass|object|pair|parabola|path|'
+             r'path3|pen|picture|point|position|projection|real|revolution|'
+             r'scaleT|scientific|segment|side|slice|splitface|string|surface|'
+             r'tensionSpecifier|ticklocate|ticksgridT|tickvalues|transform|'
+             r'transformation|tree|triangle|trilinear|triple|vector|'
+             r'vertex|void)(?=\s+[a-zA-Z])', Keyword.Type),
+            # Now the asy-type-name which are not asy-function-name
+            # except yours !
+            # Perhaps useless
+            (r'(Braid|FitResult|TreeNode|abscissa|arrowhead|block|bool|bool3|'
+             r'bounds|coord|frame|guide|horner|int|linefit|marginT|pair|pen|'
+             r'picture|position|real|revolution|slice|splitface|ticksgridT|'
+             r'tickvalues|tree|triple|vertex|void)\b', Keyword.Type),
+            (r'[a-zA-Z_]\w*:(?!:)', Name.Label),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'root': [
+            include('whitespace'),
+            # functions
+            (r'((?:[\w*\s])+?(?:\s|\*))'  # return arguments
+             r'([a-zA-Z_]\w*)'            # method name
+             r'(\s*\([^;]*?\))'           # signature
+             r'(' + _ws + r')(\{)',
+             bygroups(using(this), Name.Function, using(this), using(this),
+                      Punctuation),
+             'function'),
+            # function declarations
+            (r'((?:[\w*\s])+?(?:\s|\*))'  # return arguments
+             r'([a-zA-Z_]\w*)'            # method name
+             r'(\s*\([^;]*?\))'           # signature
+             r'(' + _ws + r')(;)',
+             bygroups(using(this), Name.Function, using(this), using(this),
+                      Punctuation)),
+            default('statement'),
+        ],
+        'statement': [
+            include('whitespace'),
+            include('statements'),
+            ('[{}]', Punctuation),
+            (';', Punctuation, '#pop'),
+        ],
+        'function': [
+            include('whitespace'),
+            include('statements'),
+            (';', Punctuation),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'string': [
+            (r"'", String, '#pop'),
+            (r'\\([\\abfnrtv"\'?]|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'\n', String),
+            (r"[^\\'\n]+", String),  # all other characters
+            (r'\\\n', String),
+            (r'\\n', String),        # line continuation
+            (r'\\', String),         # stray backslash
+        ],
+    }
+
+    def get_tokens_unprocessed(self, text):
+        from pygments.lexers._asy_builtins import ASYFUNCNAME, ASYVARNAME
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name and value in ASYFUNCNAME:
+                token = Name.Function
+            elif token is Name and value in ASYVARNAME:
+                token = Name.Variable
+            yield index, token, value
+
+
+def _shortened(word):
+    dpos = word.find('$')
+    return '|'.join(word[:dpos] + word[dpos+1:i] + r'\b'
+                    for i in range(len(word), dpos, -1))
+
+
+def _shortened_many(*words):
+    return '|'.join(map(_shortened, words))
+
+
+class GnuplotLexer(RegexLexer):
+    """
+    For Gnuplot plotting scripts.
+    """
+
+    name = 'Gnuplot'
+    url = 'http://gnuplot.info/'
+    aliases = ['gnuplot']
+    filenames = ['*.plot', '*.plt']
+    mimetypes = ['text/x-gnuplot']
+    version_added = '0.11'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            (_shortened('bi$nd'), Keyword, 'bind'),
+            (_shortened_many('ex$it', 'q$uit'), Keyword, 'quit'),
+            (_shortened('f$it'), Keyword, 'fit'),
+            (r'(if)(\s*)(\()', bygroups(Keyword, Text, Punctuation), 'if'),
+            (r'else\b', Keyword),
+            (_shortened('pa$use'), Keyword, 'pause'),
+            (_shortened_many('p$lot', 'rep$lot', 'sp$lot'), Keyword, 'plot'),
+            (_shortened('sa$ve'), Keyword, 'save'),
+            (_shortened('se$t'), Keyword, ('genericargs', 'optionarg')),
+            (_shortened_many('sh$ow', 'uns$et'),
+             Keyword, ('noargs', 'optionarg')),
+            (_shortened_many('low$er', 'ra$ise', 'ca$ll', 'cd$', 'cl$ear',
+                             'h$elp', '\\?$', 'hi$story', 'l$oad', 'pr$int',
+                             'pwd$', 're$read', 'res$et', 'scr$eendump',
+                             'she$ll', 'sy$stem', 'up$date'),
+             Keyword, 'genericargs'),
+            (_shortened_many('pwd$', 're$read', 'res$et', 'scr$eendump',
+                             'she$ll', 'test$'),
+             Keyword, 'noargs'),
+            (r'([a-zA-Z_]\w*)(\s*)(=)',
+             bygroups(Name.Variable, Whitespace, Operator), 'genericargs'),
+            (r'([a-zA-Z_]\w*)(\s*)(\()(.*?)(\))(\s*)(=)',
+             bygroups(Name.Function, Whitespace, Punctuation,
+                      Text, Punctuation, Whitespace, Operator), 'genericargs'),
+            (r'@[a-zA-Z_]\w*', Name.Constant),  # macros
+            (r';', Keyword),
+        ],
+        'comment': [
+            (r'[^\\\n]+', Comment),
+            (r'\\\n', Comment),
+            (r'\\', Comment),
+            # don't add the newline to the Comment token
+            default('#pop'),
+        ],
+        'whitespace': [
+            ('#', Comment, 'comment'),
+            (r'[ \t\v\f]+', Whitespace),
+        ],
+        'noargs': [
+            include('whitespace'),
+            # semicolon and newline end the argument list
+            (r';', Punctuation, '#pop'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'dqstring': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),   # all other characters
+            (r'\\\n', String),        # line continuation
+            (r'\\', String),          # stray backslash
+            (r'\n', Whitespace, '#pop'),  # newline ends the string too
+        ],
+        'sqstring': [
+            (r"''", String),          # escaped single quote
+            (r"'", String, '#pop'),
+            (r"[^\\'\n]+", String),   # all other characters
+            (r'\\\n', String),        # line continuation
+            (r'\\', String),          # normal backslash
+            (r'\n', Whitespace, '#pop'),  # newline ends the string too
+        ],
+        'genericargs': [
+            include('noargs'),
+            (r'"', String, 'dqstring'),
+            (r"'", String, 'sqstring'),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+', Number.Float),
+            (r'(\d+\.\d*|\.\d+)', Number.Float),
+            (r'-?\d+', Number.Integer),
+            ('[,.~!%^&*+=|?:<>/-]', Operator),
+            (r'[{}()\[\]]', Punctuation),
+            (r'(eq|ne)\b', Operator.Word),
+            (r'([a-zA-Z_]\w*)(\s*)(\()',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'@[a-zA-Z_]\w*', Name.Constant),  # macros
+            (r'(\\)(\n)', bygroups(Text, Whitespace)),
+        ],
+        'optionarg': [
+            include('whitespace'),
+            (_shortened_many(
+                "a$ll", "an$gles", "ar$row", "au$toscale", "b$ars", "bor$der",
+                "box$width", "cl$abel", "c$lip", "cn$trparam", "co$ntour", "da$ta",
+                "data$file", "dg$rid3d", "du$mmy", "enc$oding", "dec$imalsign",
+                "fit$", "font$path", "fo$rmat", "fu$nction", "fu$nctions", "g$rid",
+                "hid$den3d", "his$torysize", "is$osamples", "k$ey", "keyt$itle",
+                "la$bel", "li$nestyle", "ls$", "loa$dpath", "loc$ale", "log$scale",
+                "mac$ros", "map$ping", "map$ping3d", "mar$gin", "lmar$gin",
+                "rmar$gin", "tmar$gin", "bmar$gin", "mo$use", "multi$plot",
+                "mxt$ics", "nomxt$ics", "mx2t$ics", "nomx2t$ics", "myt$ics",
+                "nomyt$ics", "my2t$ics", "nomy2t$ics", "mzt$ics", "nomzt$ics",
+                "mcbt$ics", "nomcbt$ics", "of$fsets", "or$igin", "o$utput",
+                "pa$rametric", "pm$3d", "pal$ette", "colorb$ox", "p$lot",
+                "poi$ntsize", "pol$ar", "pr$int", "obj$ect", "sa$mples", "si$ze",
+                "st$yle", "su$rface", "table$", "t$erminal", "termo$ptions", "ti$cs",
+                "ticsc$ale", "ticsl$evel", "timef$mt", "tim$estamp", "tit$le",
+                "v$ariables", "ve$rsion", "vi$ew", "xyp$lane", "xda$ta", "x2da$ta",
+                "yda$ta", "y2da$ta", "zda$ta", "cbda$ta", "xl$abel", "x2l$abel",
+                "yl$abel", "y2l$abel", "zl$abel", "cbl$abel", "xti$cs", "noxti$cs",
+                "x2ti$cs", "nox2ti$cs", "yti$cs", "noyti$cs", "y2ti$cs", "noy2ti$cs",
+                "zti$cs", "nozti$cs", "cbti$cs", "nocbti$cs", "xdti$cs", "noxdti$cs",
+                "x2dti$cs", "nox2dti$cs", "ydti$cs", "noydti$cs", "y2dti$cs",
+                "noy2dti$cs", "zdti$cs", "nozdti$cs", "cbdti$cs", "nocbdti$cs",
+                "xmti$cs", "noxmti$cs", "x2mti$cs", "nox2mti$cs", "ymti$cs",
+                "noymti$cs", "y2mti$cs", "noy2mti$cs", "zmti$cs", "nozmti$cs",
+                "cbmti$cs", "nocbmti$cs", "xr$ange", "x2r$ange", "yr$ange",
+                "y2r$ange", "zr$ange", "cbr$ange", "rr$ange", "tr$ange", "ur$ange",
+                "vr$ange", "xzeroa$xis", "x2zeroa$xis", "yzeroa$xis", "y2zeroa$xis",
+                "zzeroa$xis", "zeroa$xis", "z$ero"), Name.Builtin, '#pop'),
+        ],
+        'bind': [
+            ('!', Keyword, '#pop'),
+            (_shortened('all$windows'), Name.Builtin),
+            include('genericargs'),
+        ],
+        'quit': [
+            (r'gnuplot\b', Keyword),
+            include('noargs'),
+        ],
+        'fit': [
+            (r'via\b', Name.Builtin),
+            include('plot'),
+        ],
+        'if': [
+            (r'\)', Punctuation, '#pop'),
+            include('genericargs'),
+        ],
+        'pause': [
+            (r'(mouse|any|button1|button2|button3)\b', Name.Builtin),
+            (_shortened('key$press'), Name.Builtin),
+            include('genericargs'),
+        ],
+        'plot': [
+            (_shortened_many('ax$es', 'axi$s', 'bin$ary', 'ev$ery', 'i$ndex',
+                             'mat$rix', 's$mooth', 'thru$', 't$itle',
+                             'not$itle', 'u$sing', 'w$ith'),
+             Name.Builtin),
+            include('genericargs'),
+        ],
+        'save': [
+            (_shortened_many('f$unctions', 's$et', 't$erminal', 'v$ariables'),
+             Name.Builtin),
+            include('genericargs'),
+        ],
+    }
+
+
+class PovrayLexer(RegexLexer):
+    """
+    For Persistence of Vision Raytracer files.
+    """
+    name = 'POVRay'
+    url = 'http://www.povray.org/'
+    aliases = ['pov']
+    filenames = ['*.pov', '*.inc']
+    mimetypes = ['text/x-povray']
+    version_added = '0.11'
+
+    tokens = {
+        'root': [
+            (r'/\*[\w\W]*?\*/', Comment.Multiline),
+            (r'//.*$', Comment.Single),
+            (r'(?s)"(?:\\.|[^"\\])+"', String.Double),
+            (words((
+                'break', 'case', 'debug', 'declare', 'default', 'define', 'else',
+                'elseif', 'end', 'error', 'fclose', 'fopen', 'for', 'if', 'ifdef',
+                'ifndef', 'include', 'local', 'macro', 'range', 'read', 'render',
+                'statistics', 'switch', 'undef', 'version', 'warning', 'while',
+                'write'), prefix=r'#', suffix=r'\b'),
+             Comment.Preproc),
+            (words((
+                'aa_level', 'aa_threshold', 'abs', 'acos', 'acosh', 'adaptive', 'adc_bailout',
+                'agate', 'agate_turb', 'all', 'alpha', 'ambient', 'ambient_light', 'angle',
+                'aperture', 'arc_angle', 'area_light', 'asc', 'asin', 'asinh', 'assumed_gamma',
+                'atan', 'atan2', 'atanh', 'atmosphere', 'atmospheric_attenuation',
+                'attenuating', 'average', 'background', 'black_hole', 'blue', 'blur_samples',
+                'bounded_by', 'box_mapping', 'bozo', 'break', 'brick', 'brick_size',
+                'brightness', 'brilliance', 'bumps', 'bumpy1', 'bumpy2', 'bumpy3', 'bump_map',
+                'bump_size', 'case', 'caustics', 'ceil', 'checker', 'chr', 'clipped_by', 'clock',
+                'color', 'color_map', 'colour', 'colour_map', 'component', 'composite', 'concat',
+                'confidence', 'conic_sweep', 'constant', 'control0', 'control1', 'cos', 'cosh',
+                'count', 'crackle', 'crand', 'cube', 'cubic_spline', 'cylindrical_mapping',
+                'debug', 'declare', 'default', 'degrees', 'dents', 'diffuse', 'direction',
+                'distance', 'distance_maximum', 'div', 'dust', 'dust_type', 'eccentricity',
+                'else', 'emitting', 'end', 'error', 'error_bound', 'exp', 'exponent',
+                'fade_distance', 'fade_power', 'falloff', 'falloff_angle', 'false',
+                'file_exists', 'filter', 'finish', 'fisheye', 'flatness', 'flip', 'floor',
+                'focal_point', 'fog', 'fog_alt', 'fog_offset', 'fog_type', 'frequency', 'gif',
+                'global_settings', 'glowing', 'gradient', 'granite', 'gray_threshold',
+                'green', 'halo', 'hexagon', 'hf_gray_16', 'hierarchy', 'hollow', 'hypercomplex',
+                'if', 'ifdef', 'iff', 'image_map', 'incidence', 'include', 'int', 'interpolate',
+                'inverse', 'ior', 'irid', 'irid_wavelength', 'jitter', 'lambda', 'leopard',
+                'linear', 'linear_spline', 'linear_sweep', 'location', 'log', 'looks_like',
+                'look_at', 'low_error_factor', 'mandel', 'map_type', 'marble', 'material_map',
+                'matrix', 'max', 'max_intersections', 'max_iteration', 'max_trace_level',
+                'max_value', 'metallic', 'min', 'minimum_reuse', 'mod', 'mortar',
+                'nearest_count', 'no', 'normal', 'normal_map', 'no_shadow', 'number_of_waves',
+                'octaves', 'off', 'offset', 'omega', 'omnimax', 'on', 'once', 'onion', 'open',
+                'orthographic', 'panoramic', 'pattern1', 'pattern2', 'pattern3',
+                'perspective', 'pgm', 'phase', 'phong', 'phong_size', 'pi', 'pigment',
+                'pigment_map', 'planar_mapping', 'png', 'point_at', 'pot', 'pow', 'ppm',
+                'precision', 'pwr', 'quadratic_spline', 'quaternion', 'quick_color',
+                'quick_colour', 'quilted', 'radial', 'radians', 'radiosity', 'radius', 'rainbow',
+                'ramp_wave', 'rand', 'range', 'reciprocal', 'recursion_limit', 'red',
+                'reflection', 'refraction', 'render', 'repeat', 'rgb', 'rgbf', 'rgbft', 'rgbt',
+                'right', 'ripples', 'rotate', 'roughness', 'samples', 'scale', 'scallop_wave',
+                'scattering', 'seed', 'shadowless', 'sin', 'sine_wave', 'sinh', 'sky', 'sky_sphere',
+                'slice', 'slope_map', 'smooth', 'specular', 'spherical_mapping', 'spiral',
+                'spiral1', 'spiral2', 'spotlight', 'spotted', 'sqr', 'sqrt', 'statistics', 'str',
+                'strcmp', 'strength', 'strlen', 'strlwr', 'strupr', 'sturm', 'substr', 'switch', 'sys',
+                't', 'tan', 'tanh', 'test_camera_1', 'test_camera_2', 'test_camera_3',
+                'test_camera_4', 'texture', 'texture_map', 'tga', 'thickness', 'threshold',
+                'tightness', 'tile2', 'tiles', 'track', 'transform', 'translate', 'transmit',
+                'triangle_wave', 'true', 'ttf', 'turbulence', 'turb_depth', 'type',
+                'ultra_wide_angle', 'up', 'use_color', 'use_colour', 'use_index', 'u_steps',
+                'val', 'variance', 'vaxis_rotate', 'vcross', 'vdot', 'version', 'vlength',
+                'vnormalize', 'volume_object', 'volume_rendered', 'vol_with_light',
+                'vrotate', 'v_steps', 'warning', 'warp', 'water_level', 'waves', 'while', 'width',
+                'wood', 'wrinkles', 'yes'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (words((
+                'bicubic_patch', 'blob', 'box', 'camera', 'cone', 'cubic', 'cylinder', 'difference',
+                'disc', 'height_field', 'intersection', 'julia_fractal', 'lathe',
+                'light_source', 'merge', 'mesh', 'object', 'plane', 'poly', 'polygon', 'prism',
+                'quadric', 'quartic', 'smooth_triangle', 'sor', 'sphere', 'superellipsoid',
+                'text', 'torus', 'triangle', 'union'), suffix=r'\b'),
+             Name.Builtin),
+            (r'\b(x|y|z|u|v)\b', Name.Builtin.Pseudo),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'[0-9]*\.[0-9]+', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'[\[\](){}<>;,]', Punctuation),
+            (r'[-+*/=.|&]|<=|>=|!=', Operator),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r'\s+', Whitespace),
+        ]
+    }
+
+    def analyse_text(text):
+        """POVRAY is similar to JSON/C, but the combination of camera and
+        light_source is probably not very likely elsewhere. HLSL or GLSL
+        are similar (GLSL even has #version), but they miss #declare, and
+        light_source/camera are not keywords anywhere else -- it's fair
+        to assume though that any POVRAY scene must have a camera and
+        lightsource."""
+        result = 0
+        if '#version' in text:
+            result += 0.05
+        if '#declare' in text:
+            result += 0.05
+        if 'camera' in text:
+            result += 0.05
+        if 'light_source' in text:
+            result += 0.1
+
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/graphql.py b/.venv/Lib/site-packages/pygments/lexers/graphql.py
new file mode 100644 (file)
index 0000000..7de5b6e
--- /dev/null
@@ -0,0 +1,176 @@
+"""
+    pygments.lexers.graphql
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for GraphQL, an open-source data query and manipulation
+    language for APIs.
+
+    More information:
+    https://graphql.org/
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include, bygroups, default
+from pygments.token import (Comment, Keyword, Name, Number, Punctuation, String,
+                            Whitespace)
+
+
+__all__ = ["GraphQLLexer"]
+
+OPERATION_TYPES = ("query", "mutation", "subscription")
+BUILTIN_TYPES = ("Int", "Float", "String", "Boolean", "ID")
+BOOLEAN_VALUES = ("true", "false", "null")
+KEYWORDS = (
+    "type",
+    "schema",
+    "extend",
+    "enum",
+    "scalar",
+    "implements",
+    "interface",
+    "union",
+    "input",
+    "directive",
+    "QUERY",
+    "MUTATION",
+    "SUBSCRIPTION",
+    "FIELD",
+    "FRAGMENT_DEFINITION",
+    "FRAGMENT_SPREAD",
+    "INLINE_FRAGMENT",
+    "SCHEMA",
+    "SCALAR",
+    "OBJECT",
+    "FIELD_DEFINITION",
+    "ARGUMENT_DEFINITION",
+    "INTERFACE",
+    "UNION",
+    "ENUM",
+    "ENUM_VALUE",
+    "INPUT_OBJECT",
+    "INPUT_FIELD_DEFINITION",
+)
+
+
+class GraphQLLexer(RegexLexer):
+    """
+    Lexer for GraphQL syntax
+    """
+    name = "GraphQL"
+    aliases = ["graphql"]
+    filenames = ["*.graphql"]
+    url = "https://graphql.org"
+    version_added = '2.16'
+
+    tokens = {
+        "ignored_tokens": [
+            (r"\s+", Whitespace),  # Whitespaces
+            (r"#.*$", Comment),
+            (",", Punctuation),  # Insignificant commas
+        ],
+        "value": [
+            include("ignored_tokens"),
+            (r"-?\d+(?![.eE])", Number.Integer, "#pop"),
+            (
+                r"-?\d+(\.\d+)?([eE][+-]?\d+)?",
+                Number.Float,
+                "#pop",
+            ),
+            (r'"', String, ("#pop", "string")),
+            (words(BOOLEAN_VALUES, suffix=r"\b"), Name.Builtin, "#pop"),
+            (r"\$[a-zA-Z_]\w*", Name.Variable, "#pop"),
+            (r"[a-zA-Z_]\w*", Name.Constant, "#pop"),
+            (r"\[", Punctuation, ("#pop", "list_value")),
+            (r"\{", Punctuation, ("#pop", "object_value")),
+        ],
+        "list_value": [
+            include("ignored_tokens"),
+            ("]", Punctuation, "#pop"),
+            default("value"),
+        ],
+        "object_value": [
+            include("ignored_tokens"),
+            (r"[a-zA-Z_]\w*", Name),
+            (r":", Punctuation, "value"),
+            (r"\}", Punctuation, "#pop"),
+        ],
+        "string": [
+            (r'\\(["\\/bfnrt]|u[a-fA-F0-9]{4})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'"', String, "#pop"),
+        ],
+        "root": [
+            include("ignored_tokens"),
+            (words(OPERATION_TYPES, suffix=r"\b"), Keyword, "operation"),
+            (words(KEYWORDS, suffix=r"\b"), Keyword),
+            (r"\{", Punctuation, "selection_set"),
+            (r"fragment\b", Keyword, "fragment_definition"),
+        ],
+        "operation": [
+            include("ignored_tokens"),
+            (r"[a-zA-Z_]\w*", Name.Function),
+            (r"\(", Punctuation, "variable_definition"),
+            (r"\{", Punctuation, ("#pop", "selection_set")),
+        ],
+        "variable_definition": [
+            include("ignored_tokens"),
+            (r"\$[a-zA-Z_]\w*", Name.Variable),
+            (r"[\]!]", Punctuation),
+            (r":", Punctuation, "type"),
+            (r"=", Punctuation, "value"),
+            (r"\)", Punctuation, "#pop"),
+        ],
+        "type": [
+            include("ignored_tokens"),
+            (r"\[", Punctuation),
+            (words(BUILTIN_TYPES, suffix=r"\b"), Name.Builtin, "#pop"),
+            (r"[a-zA-Z_]\w*", Name.Class, "#pop"),
+        ],
+        "selection_set": [
+            include("ignored_tokens"),
+            (r"([a-zA-Z_]\w*)(\s*)(:)", bygroups(Name.Label, Whitespace, Punctuation)),
+            (r"[a-zA-Z_]\w*", Name),  # Field
+            (
+                r"(\.\.\.)(\s+)(on)\b",
+                bygroups(Punctuation, Whitespace, Keyword),
+                "inline_fragment",
+            ),
+            (r"\.\.\.", Punctuation, "fragment_spread"),
+            (r"\(", Punctuation, "arguments"),
+            (r"@[a-zA-Z_]\w*", Name.Decorator, "directive"),
+            (r"\{", Punctuation, "selection_set"),
+            (r"\}", Punctuation, "#pop"),
+        ],
+        "directive": [
+            include("ignored_tokens"),
+            (r"\(", Punctuation, ("#pop", "arguments")),
+        ],
+        "arguments": [
+            include("ignored_tokens"),
+            (r"[a-zA-Z_]\w*", Name),
+            (r":", Punctuation, "value"),
+            (r"\)", Punctuation, "#pop"),
+        ],
+        # Fragments
+        "fragment_definition": [
+            include("ignored_tokens"),
+            (r"[\]!]", Punctuation),  # For NamedType
+            (r"on\b", Keyword, "type"),
+            (r"[a-zA-Z_]\w*", Name.Function),
+            (r"@[a-zA-Z_]\w*", Name.Decorator, "directive"),
+            (r"\{", Punctuation, ("#pop", "selection_set")),
+        ],
+        "fragment_spread": [
+            include("ignored_tokens"),
+            (r"@[a-zA-Z_]\w*", Name.Decorator, "directive"),
+            (r"[a-zA-Z_]\w*", Name, "#pop"),  # Fragment name
+        ],
+        "inline_fragment": [
+            include("ignored_tokens"),
+            (r"[a-zA-Z_]\w*", Name.Class),  # Type condition
+            (r"@[a-zA-Z_]\w*", Name.Decorator, "directive"),
+            (r"\{", Punctuation, ("#pop", "selection_set")),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/graphviz.py b/.venv/Lib/site-packages/pygments/lexers/graphviz.py
new file mode 100644 (file)
index 0000000..6b48415
--- /dev/null
@@ -0,0 +1,58 @@
+"""
+    pygments.lexers.graphviz
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the DOT language (graphviz).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Comment, Keyword, Operator, Name, String, Number, \
+    Punctuation, Whitespace
+
+
+__all__ = ['GraphvizLexer']
+
+
+class GraphvizLexer(RegexLexer):
+    """
+    For graphviz DOT graph description language.
+    """
+    name = 'Graphviz'
+    url = 'https://www.graphviz.org/doc/info/lang.html'
+    aliases = ['graphviz', 'dot']
+    filenames = ['*.gv', '*.dot']
+    mimetypes = ['text/x-graphviz', 'text/vnd.graphviz']
+    version_added = '2.8'
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'(#|//).*?$', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'(?i)(node|edge|graph|digraph|subgraph|strict)\b', Keyword),
+            (r'--|->', Operator),
+            (r'[{}[\]:;,]', Punctuation),
+            (r'(\b\D\w*)(\s*)(=)(\s*)',
+                bygroups(Name.Attribute, Whitespace, Punctuation, Whitespace),
+                'attr_id'),
+            (r'\b(n|ne|e|se|s|sw|w|nw|c|_)\b', Name.Builtin),
+            (r'\b\D\w*', Name.Tag),  # node
+            (r'[-]?((\.[0-9]+)|([0-9]+(\.[0-9]*)?))', Number),
+            (r'"(\\"|[^"])*?"', Name.Tag),  # quoted node
+            (r'<', Punctuation, 'xml'),
+        ],
+        'attr_id': [
+            (r'\b\D\w*', String, '#pop'),
+            (r'[-]?((\.[0-9]+)|([0-9]+(\.[0-9]*)?))', Number, '#pop'),
+            (r'"(\\"|[^"])*?"', String.Double, '#pop'),
+            (r'<', Punctuation, ('#pop', 'xml')),
+        ],
+        'xml': [
+            (r'<', Punctuation, '#push'),
+            (r'>', Punctuation, '#pop'),
+            (r'\s+', Whitespace),
+            (r'[^<>\s]', Name.Tag),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/gsql.py b/.venv/Lib/site-packages/pygments/lexers/gsql.py
new file mode 100644 (file)
index 0000000..9ff1878
--- /dev/null
@@ -0,0 +1,103 @@
+"""
+    pygments.lexers.gsql
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for TigerGraph GSQL graph query language
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this, words
+from pygments.token import Keyword, Punctuation, Comment, Operator, Name, \
+    String, Number, Whitespace
+
+__all__ = ["GSQLLexer"]
+
+
+class GSQLLexer(RegexLexer):
+
+    """
+    For GSQL queries (version 3.x).
+    """
+
+    name = 'GSQL'
+    url = 'https://docs.tigergraph.com/dev/gsql-ref'
+    aliases = ['gsql']
+    filenames = ['*.gsql']
+    version_added = '2.10'
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            include('comment'),
+            include('keywords'),
+            include('clauses'),
+            include('accums'),
+            include('relations'),
+            include('strings'),
+            include('whitespace'),
+            include('barewords'),
+            include('operators'),
+        ],
+        'comment': [
+            (r'\#.*', Comment.Single),
+            (r'/\*(.|\n)*?\*/', Comment.Multiline),
+        ],
+        'keywords': [
+            (words((
+                'ACCUM', 'AND', 'ANY', 'API', 'AS', 'ASC', 'AVG', 'BAG', 'BATCH',
+                'BETWEEN', 'BOOL', 'BOTH', 'BREAK', 'BY', 'CASE', 'CATCH', 'COALESCE',
+                'COMPRESS', 'CONTINUE', 'COUNT', 'CREATE', 'DATETIME', 'DATETIME_ADD',
+                'DATETIME_SUB', 'DELETE', 'DESC', 'DISTRIBUTED', 'DO', 'DOUBLE',
+                'EDGE', 'ELSE', 'END', 'ESCAPE', 'EXCEPTION', 'FALSE', 'FILE',
+                'FILTER', 'FLOAT', 'FOREACH', 'FOR', 'FROM', 'GRAPH', 'GROUP',
+                'GSQL_INT_MAX', 'GSQL_INT_MIN', 'GSQL_UINT_MAX', 'HAVING', 'IF',
+                'IN', 'INSERT', 'INT', 'INTERPRET', 'INTERSECT', 'INTERVAL', 'INTO',
+                'IS', 'ISEMPTY', 'JSONARRAY', 'JSONOBJECT', 'LASTHOP', 'LEADING',
+                'LIKE', 'LIMIT', 'LIST', 'LOAD_ACCUM', 'LOG', 'MAP', 'MATCH', 'MAX',
+                'MIN', 'MINUS', 'NOT', 'NOW', 'NULL', 'OFFSET', 'OR', 'ORDER', 'PATH',
+                'PER', 'PINNED', 'POST_ACCUM', 'POST-ACCUM', 'PRIMARY_ID', 'PRINT',
+                'QUERY', 'RAISE', 'RANGE', 'REPLACE', 'RESET_COLLECTION_ACCUM',
+                'RETURN', 'RETURNS', 'RUN', 'SAMPLE', 'SELECT', 'SELECT_VERTEX',
+                'SET', 'SRC', 'STATIC', 'STRING', 'SUM', 'SYNTAX', 'TARGET',
+                'TAGSTGT', 'THEN', 'TO', 'TO_CSV', 'TO_DATETIME', 'TRAILING',
+                'TRIM', 'TRUE', 'TRY', 'TUPLE', 'TYPEDEF', 'UINT', 'UNION', 'UPDATE',
+                'VALUES', 'VERTEX', 'WHEN', 'WHERE', 'WHILE', 'WITH'),
+                   prefix=r'(?<!\.)', suffix=r'\b'), Keyword),
+        ],
+        'clauses': [
+            (words(('accum', 'having', 'limit', 'order', 'postAccum', 'sample', 'where')),
+             Name.Builtin),
+        ],
+        'accums': [
+            (words(('andaccum', 'arrayaccum', 'avgaccum', 'bagaccum', 'bitwiseandaccum',
+                    'bitwiseoraccum', 'groupbyaccum', 'heapaccum', 'listaccum',
+                    'MapAccum', 'maxaccum', 'minaccum', 'oraccum', 'setaccum',
+                    'sumaccum')), Name.Builtin),
+        ],
+        'relations': [
+            (r'(-\s?)(\(.*\:\w?\))(\s?-)', bygroups(Operator, using(this), Operator)),
+            (r'->|<-', Operator),
+            (r'[.*{}\[\]\<\>\_]', Punctuation),
+        ],
+        'strings': [
+            (r'"([^"\\]|\\.)*"', String),
+            (r'@{1,2}\w+', Name.Variable),
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+        ],
+        'barewords': [
+            (r'[a-z]\w*', Name),
+            (r'(\d+\.\d+|\d+)', Number),
+        ],
+        'operators': [
+            (r'\$|[^0-9|\/|\-](\-\=|\+\=|\*\=|\\\=|\=|\=\=|\=\=\=|'
+             r'\+|\-|\*|\\|\+\=|\>|\<)[^\>|\/]', Operator),
+            (r'(\||\(|\)|\,|\;|\=|\-|\+|\*|\/|\>|\<|\:)', Operator),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/hare.py b/.venv/Lib/site-packages/pygments/lexers/hare.py
new file mode 100644 (file)
index 0000000..56548d5
--- /dev/null
@@ -0,0 +1,73 @@
+"""
+    pygments.lexers.hare
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Hare language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['HareLexer']
+
+class HareLexer(RegexLexer):
+    """
+    Lexer for the Hare programming language.
+    """
+    name = 'Hare'
+    url = 'https://harelang.org/'
+    aliases = ['hare']
+    filenames = ['*.ha']
+    mimetypes = ['text/x-hare']
+    version_added = '2.19'
+
+    _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
+    _ws1 = r'\s*(?:/[*].*?[*]/\s*)?'
+
+    tokens = {
+        'whitespace': [
+            (r'^use.*;', Comment.Preproc),
+            (r'@[a-z]+', Comment.Preproc),
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'//.*?$', Comment.Single),
+        ],
+        'statements': [
+            (r'"', String, 'string'),
+            (r'`[^`]*`', String),
+            (r"'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'0o[0-7]+[LlUu]*', Number.Oct),
+            (r'\d+[zui]?(\d+)?', Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (words(('as', 'is', '=>', '..', '...')), Operator),
+            (r'[()\[\],.{};]+', Punctuation),
+            (words(('abort', 'align', 'alloc', 'append', 'assert', 'case',
+                'const', 'def', 'defer', 'delete', 'else', 'enum', 'export',
+                'fn', 'for', 'free', 'if', 'let', 'len', 'match', 'offset',
+                'return', 'static', 'struct', 'switch', 'type', 'union',
+                'yield', 'vastart', 'vaarg', 'vaend'),
+                suffix=r'\b'), Keyword),
+            (r'(bool|int|uint|uintptr|u8|u16|u32|u64|i8|i16|i32|i64|f32|f64|null|done|never|void|nullable|rune|size|valist)\b',
+             Keyword.Type),
+            (r'(true|false|null)\b', Name.Builtin),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|'
+             r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\', String),  # stray backslash
+        ],
+        'root': [
+            include('whitespace'),
+            include('statements'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/haskell.py b/.venv/Lib/site-packages/pygments/lexers/haskell.py
new file mode 100644 (file)
index 0000000..0a9f2c1
--- /dev/null
@@ -0,0 +1,866 @@
+"""
+    pygments.lexers.haskell
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Haskell and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, do_insertions, \
+    default, include, inherit, line_re
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+from pygments import unistring as uni
+
+__all__ = ['HaskellLexer', 'HspecLexer', 'IdrisLexer', 'AgdaLexer', 'CryptolLexer',
+           'LiterateHaskellLexer', 'LiterateIdrisLexer', 'LiterateAgdaLexer',
+           'LiterateCryptolLexer', 'KokaLexer']
+
+
+class HaskellLexer(RegexLexer):
+    """
+    A Haskell lexer based on the lexemes defined in the Haskell 98 Report.
+    """
+    name = 'Haskell'
+    url = 'https://www.haskell.org/'
+    aliases = ['haskell', 'hs']
+    filenames = ['*.hs']
+    mimetypes = ['text/x-haskell']
+    version_added = '0.8'
+
+    reserved = ('case', 'class', 'data', 'default', 'deriving', 'do', 'else',
+                'family', 'if', 'in', 'infix[lr]?', 'instance',
+                'let', 'newtype', 'of', 'then', 'type', 'where', '_')
+    ascii = ('NUL', 'SOH', '[SE]TX', 'EOT', 'ENQ', 'ACK',
+             'BEL', 'BS', 'HT', 'LF', 'VT', 'FF', 'CR', 'S[OI]', 'DLE',
+             'DC[1-4]', 'NAK', 'SYN', 'ETB', 'CAN',
+             'EM', 'SUB', 'ESC', '[FGRU]S', 'SP', 'DEL')
+
+    tokens = {
+        'root': [
+            # Whitespace:
+            (r'\s+', Whitespace),
+            # (r'--\s*|.*$', Comment.Doc),
+            (r'--(?![!#$%&*+./<=>?@^|_~:\\]).*?$', Comment.Single),
+            (r'\{-', Comment.Multiline, 'comment'),
+            # Lexemes:
+            #  Identifiers
+            (r'\bimport\b', Keyword.Reserved, 'import'),
+            (r'\bmodule\b', Keyword.Reserved, 'module'),
+            (r'\berror\b', Name.Exception),
+            (r'\b({})(?!\')\b'.format('|'.join(reserved)), Keyword.Reserved),
+            (r"'[^\\]'", String.Char),  # this has to come before the TH quote
+            (r'^[_' + uni.Ll + r'][\w\']*', Name.Function),
+            (r"'?[_" + uni.Ll + r"][\w']*", Name),
+            (r"('')?[" + uni.Lu + r"][\w\']*", Keyword.Type),
+            (r"(')[" + uni.Lu + r"][\w\']*", Keyword.Type),
+            (r"(')\[[^\]]*\]", Keyword.Type),  # tuples and lists get special treatment in GHC
+            (r"(')\([^)]*\)", Keyword.Type),  # ..
+            (r"(')[:!#$%&*+.\\/<=>?@^|~-]+", Keyword.Type),  # promoted type operators
+            #  Operators
+            (r'\\(?![:!#$%&*+.\\/<=>?@^|~-]+)', Name.Function),  # lambda operator
+            (r'(<-|::|->|=>|=)(?![:!#$%&*+.\\/<=>?@^|~-]+)', Operator.Word),  # specials
+            (r':[:!#$%&*+.\\/<=>?@^|~-]*', Keyword.Type),  # Constructor operators
+            (r'[:!#$%&*+.\\/<=>?@^|~-]+', Operator),  # Other operators
+            #  Numbers
+            (r'0[xX]_*[\da-fA-F](_*[\da-fA-F])*_*[pP][+-]?\d(_*\d)*', Number.Float),
+            (r'0[xX]_*[\da-fA-F](_*[\da-fA-F])*\.[\da-fA-F](_*[\da-fA-F])*'
+             r'(_*[pP][+-]?\d(_*\d)*)?', Number.Float),
+            (r'\d(_*\d)*_*[eE][+-]?\d(_*\d)*', Number.Float),
+            (r'\d(_*\d)*\.\d(_*\d)*(_*[eE][+-]?\d(_*\d)*)?', Number.Float),
+            (r'0[bB]_*[01](_*[01])*', Number.Bin),
+            (r'0[oO]_*[0-7](_*[0-7])*', Number.Oct),
+            (r'0[xX]_*[\da-fA-F](_*[\da-fA-F])*', Number.Hex),
+            (r'\d(_*\d)*', Number.Integer),
+            #  Character/String Literals
+            (r"'", String.Char, 'character'),
+            (r'"', String, 'string'),
+            #  Special
+            (r'\[\]', Keyword.Type),
+            (r'\(\)', Name.Builtin),
+            (r'[][(),;`{}]', Punctuation),
+        ],
+        'import': [
+            # Import statements
+            (r'\s+', Whitespace),
+            (r'"', String, 'string'),
+            # after "funclist" state
+            (r'\)', Punctuation, '#pop'),
+            (r'qualified\b', Keyword),
+            # import X as Y
+            (r'([' + uni.Lu + r'][\w.]*)(\s+)(as)(\s+)([' + uni.Lu + r'][\w.]*)',
+             bygroups(Name.Namespace, Whitespace, Keyword, Whitespace, Name), '#pop'),
+            # import X hiding (functions)
+            (r'([' + uni.Lu + r'][\w.]*)(\s+)(hiding)(\s+)(\()',
+             bygroups(Name.Namespace, Whitespace, Keyword, Whitespace, Punctuation), 'funclist'),
+            # import X (functions)
+            (r'([' + uni.Lu + r'][\w.]*)(\s+)(\()',
+             bygroups(Name.Namespace, Whitespace, Punctuation), 'funclist'),
+            # import X
+            (r'[\w.]+', Name.Namespace, '#pop'),
+        ],
+        'module': [
+            (r'\s+', Whitespace),
+            (r'([' + uni.Lu + r'][\w.]*)(\s+)(\()',
+             bygroups(Name.Namespace, Whitespace, Punctuation), 'funclist'),
+            (r'[' + uni.Lu + r'][\w.]*', Name.Namespace, '#pop'),
+        ],
+        'funclist': [
+            (r'\s+', Whitespace),
+            (r'[' + uni.Lu + r']\w*', Keyword.Type),
+            (r'(_[\w\']+|[' + uni.Ll + r'][\w\']*)', Name.Function),
+            (r'--(?![!#$%&*+./<=>?@^|_~:\\]).*?$', Comment.Single),
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r',', Punctuation),
+            (r'[:!#$%&*+.\\/<=>?@^|~-]+', Operator),
+            # (HACK, but it makes sense to push two instances, believe me)
+            (r'\(', Punctuation, ('funclist', 'funclist')),
+            (r'\)', Punctuation, '#pop:2'),
+        ],
+        # NOTE: the next four states are shared in the AgdaLexer; make sure
+        # any change is compatible with Agda as well or copy over and change
+        'comment': [
+            # Multiline Comments
+            (r'[^-{}]+', Comment.Multiline),
+            (r'\{-', Comment.Multiline, '#push'),
+            (r'-\}', Comment.Multiline, '#pop'),
+            (r'[-{}]', Comment.Multiline),
+        ],
+        'character': [
+            # Allows multi-chars, incorrectly.
+            (r"[^\\']'", String.Char, '#pop'),
+            (r"\\", String.Escape, 'escape'),
+            ("'", String.Char, '#pop'),
+        ],
+        'string': [
+            (r'[^\\"]+', String),
+            (r"\\", String.Escape, 'escape'),
+            ('"', String, '#pop'),
+        ],
+        'escape': [
+            (r'[abfnrtv"\'&\\]', String.Escape, '#pop'),
+            (r'\^[][' + uni.Lu + r'@^_]', String.Escape, '#pop'),
+            ('|'.join(ascii), String.Escape, '#pop'),
+            (r'o[0-7]+', String.Escape, '#pop'),
+            (r'x[\da-fA-F]+', String.Escape, '#pop'),
+            (r'\d+', String.Escape, '#pop'),
+            (r'(\s+)(\\)', bygroups(Whitespace, String.Escape), '#pop'),
+        ],
+    }
+
+
+class HspecLexer(HaskellLexer):
+    """
+    A Haskell lexer with support for Hspec constructs.
+    """
+
+    name = 'Hspec'
+    aliases = ['hspec']
+    filenames = ['*Spec.hs']
+    mimetypes = []
+    version_added = '2.4'
+
+    tokens = {
+        'root': [
+            (r'(it)(\s*)("[^"]*")', bygroups(Text, Whitespace, String.Doc)),
+            (r'(describe)(\s*)("[^"]*")', bygroups(Text, Whitespace, String.Doc)),
+            (r'(context)(\s*)("[^"]*")', bygroups(Text, Whitespace, String.Doc)),
+            inherit,
+        ],
+    }
+
+
+class IdrisLexer(RegexLexer):
+    """
+    A lexer for the dependently typed programming language Idris.
+
+    Based on the Haskell and Agda Lexer.
+    """
+    name = 'Idris'
+    url = 'https://www.idris-lang.org/'
+    aliases = ['idris', 'idr']
+    filenames = ['*.idr']
+    mimetypes = ['text/x-idris']
+    version_added = '2.0'
+
+    reserved = ('case', 'class', 'data', 'default', 'using', 'do', 'else',
+                'if', 'in', 'infix[lr]?', 'instance', 'rewrite', 'auto',
+                'namespace', 'codata', 'mutual', 'private', 'public', 'abstract',
+                'total', 'partial',
+                'interface', 'implementation', 'export', 'covering', 'constructor',
+                'let', 'proof', 'of', 'then', 'static', 'where', '_', 'with',
+                'pattern',  'term',  'syntax', 'prefix',
+                'postulate', 'parameters', 'record', 'dsl', 'impossible', 'implicit',
+                'tactics', 'intros', 'intro', 'compute', 'refine', 'exact', 'trivial')
+
+    ascii = ('NUL', 'SOH', '[SE]TX', 'EOT', 'ENQ', 'ACK',
+             'BEL', 'BS', 'HT', 'LF', 'VT', 'FF', 'CR', 'S[OI]', 'DLE',
+             'DC[1-4]', 'NAK', 'SYN', 'ETB', 'CAN',
+             'EM', 'SUB', 'ESC', '[FGRU]S', 'SP', 'DEL')
+
+    directives = ('lib', 'link', 'flag', 'include', 'hide', 'freeze', 'access',
+                  'default', 'logging', 'dynamic', 'name', 'error_handlers', 'language')
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'^(\s*)(%({}))'.format('|'.join(directives)),
+             bygroups(Whitespace, Keyword.Reserved)),
+            (r'(\s*)(--(?![!#$%&*+./<=>?@^|_~:\\]).*?)$', bygroups(Whitespace, Comment.Single)),
+            (r'(\s*)(\|{3}.*?)$', bygroups(Whitespace, Comment.Single)),
+            (r'(\s*)(\{-)', bygroups(Whitespace, Comment.Multiline), 'comment'),
+            # Declaration
+            (r'^(\s*)([^\s(){}]+)(\s*)(:)(\s*)',
+             bygroups(Whitespace, Name.Function, Whitespace, Operator.Word, Whitespace)),
+            #  Identifiers
+            (r'\b({})(?!\')\b'.format('|'.join(reserved)), Keyword.Reserved),
+            (r'(import|module)(\s+)', bygroups(Keyword.Reserved, Whitespace), 'module'),
+            (r"('')?[A-Z][\w\']*", Keyword.Type),
+            (r'[a-z][\w\']*', Text),
+            #  Special Symbols
+            (r'(<-|::|->|=>|=)', Operator.Word),  # specials
+            (r'([(){}\[\]:!#$%&*+.\\/<=>?@^|~-]+)', Operator.Word),  # specials
+            #  Numbers
+            (r'\d+[eE][+-]?\d+', Number.Float),
+            (r'\d+\.\d+([eE][+-]?\d+)?', Number.Float),
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            # Strings
+            (r"'", String.Char, 'character'),
+            (r'"', String, 'string'),
+            (r'[^\s(){}]+', Text),
+            (r'\s+?', Whitespace),  # Whitespace
+        ],
+        'module': [
+            (r'\s+', Whitespace),
+            (r'([A-Z][\w.]*)(\s+)(\()',
+             bygroups(Name.Namespace, Whitespace, Punctuation), 'funclist'),
+            (r'[A-Z][\w.]*', Name.Namespace, '#pop'),
+        ],
+        'funclist': [
+            (r'\s+', Whitespace),
+            (r'[A-Z]\w*', Keyword.Type),
+            (r'(_[\w\']+|[a-z][\w\']*)', Name.Function),
+            (r'--.*$', Comment.Single),
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r',', Punctuation),
+            (r'[:!#$%&*+.\\/<=>?@^|~-]+', Operator),
+            # (HACK, but it makes sense to push two instances, believe me)
+            (r'\(', Punctuation, ('funclist', 'funclist')),
+            (r'\)', Punctuation, '#pop:2'),
+        ],
+        # NOTE: the next four states are shared in the AgdaLexer; make sure
+        # any change is compatible with Agda as well or copy over and change
+        'comment': [
+            # Multiline Comments
+            (r'[^-{}]+', Comment.Multiline),
+            (r'\{-', Comment.Multiline, '#push'),
+            (r'-\}', Comment.Multiline, '#pop'),
+            (r'[-{}]', Comment.Multiline),
+        ],
+        'character': [
+            # Allows multi-chars, incorrectly.
+            (r"[^\\']", String.Char),
+            (r"\\", String.Escape, 'escape'),
+            ("'", String.Char, '#pop'),
+        ],
+        'string': [
+            (r'[^\\"]+', String),
+            (r"\\", String.Escape, 'escape'),
+            ('"', String, '#pop'),
+        ],
+        'escape': [
+            (r'[abfnrtv"\'&\\]', String.Escape, '#pop'),
+            (r'\^[][A-Z@^_]', String.Escape, '#pop'),
+            ('|'.join(ascii), String.Escape, '#pop'),
+            (r'o[0-7]+', String.Escape, '#pop'),
+            (r'x[\da-fA-F]+', String.Escape, '#pop'),
+            (r'\d+', String.Escape, '#pop'),
+            (r'(\s+)(\\)', bygroups(Whitespace, String.Escape), '#pop')
+        ],
+    }
+
+
+class AgdaLexer(RegexLexer):
+    """
+    For the Agda dependently typed functional programming language and
+    proof assistant.
+    """
+
+    name = 'Agda'
+    url = 'http://wiki.portal.chalmers.se/agda/pmwiki.php'
+    aliases = ['agda']
+    filenames = ['*.agda']
+    mimetypes = ['text/x-agda']
+    version_added = '2.0'
+
+    reserved = (
+        'abstract', 'codata', 'coinductive', 'constructor', 'data', 'do',
+        'eta-equality', 'field', 'forall', 'hiding', 'in', 'inductive', 'infix',
+        'infixl', 'infixr', 'instance', 'interleaved', 'let', 'macro', 'mutual',
+        'no-eta-equality', 'opaque', 'open', 'overlap', 'pattern', 'postulate', 'primitive',
+        'private', 'quote', 'quoteTerm', 'record', 'renaming', 'rewrite',
+        'syntax', 'tactic', 'unfolding', 'unquote', 'unquoteDecl', 'unquoteDef', 'using',
+        'variable', 'where', 'with',
+    )
+
+    tokens = {
+        'root': [
+            # Declaration
+            (r'^(\s*)([^\s(){}]+)(\s*)(:)(\s*)',
+             bygroups(Whitespace, Name.Function, Whitespace,
+                      Operator.Word, Whitespace)),
+            # Comments
+            (r'--(?![!#$%&*+./<=>?@^|_~:\\]).*?$', Comment.Single),
+            (r'\{-', Comment.Multiline, 'comment'),
+            # Holes
+            (r'\{!', Comment.Directive, 'hole'),
+            # Lexemes:
+            #  Identifiers
+            (r'\b({})(?!\')\b'.format('|'.join(reserved)), Keyword.Reserved),
+            (r'(import|module)(\s+)', bygroups(Keyword.Reserved, Whitespace),
+             'module'),
+            (r'\b(Set|Prop)[\u2080-\u2089]*\b', Keyword.Type),
+            #  Special Symbols
+            (r'(\(|\)|\{|\})', Operator),
+            (r'(\.{1,3}|\||\u03BB|\u2200|\u2192|:|=|->)', Operator.Word),
+            #  Numbers
+            (r'\d+[eE][+-]?\d+', Number.Float),
+            (r'\d+\.\d+([eE][+-]?\d+)?', Number.Float),
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            # Strings
+            (r"'", String.Char, 'character'),
+            (r'"', String, 'string'),
+            (r'[^\s(){}]+', Text),
+            (r'\s+?', Whitespace),  # Whitespace
+        ],
+        'hole': [
+            # Holes
+            (r'[^!{}]+', Comment.Directive),
+            (r'\{!', Comment.Directive, '#push'),
+            (r'!\}', Comment.Directive, '#pop'),
+            (r'[!{}]', Comment.Directive),
+        ],
+        'module': [
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r'[a-zA-Z][\w.\']*', Name, '#pop'),
+            (r'[\W0-9_]+', Text)
+        ],
+        'comment': HaskellLexer.tokens['comment'],
+        'character': HaskellLexer.tokens['character'],
+        'string': HaskellLexer.tokens['string'],
+        'escape': HaskellLexer.tokens['escape']
+    }
+
+
+class CryptolLexer(RegexLexer):
+    """
+    FIXME: A Cryptol2 lexer based on the lexemes defined in the Haskell 98 Report.
+    """
+    name = 'Cryptol'
+    aliases = ['cryptol', 'cry']
+    filenames = ['*.cry']
+    mimetypes = ['text/x-cryptol']
+    url = 'https://www.cryptol.net'
+    version_added = '2.0'
+
+    reserved = ('Arith', 'Bit', 'Cmp', 'False', 'Inf', 'True', 'else',
+                'export', 'extern', 'fin', 'if', 'import', 'inf', 'lg2',
+                'max', 'min', 'module', 'newtype', 'pragma', 'property',
+                'then', 'type', 'where', 'width')
+    ascii = ('NUL', 'SOH', '[SE]TX', 'EOT', 'ENQ', 'ACK',
+             'BEL', 'BS', 'HT', 'LF', 'VT', 'FF', 'CR', 'S[OI]', 'DLE',
+             'DC[1-4]', 'NAK', 'SYN', 'ETB', 'CAN',
+             'EM', 'SUB', 'ESC', '[FGRU]S', 'SP', 'DEL')
+
+    tokens = {
+        'root': [
+            # Whitespace:
+            (r'\s+', Whitespace),
+            # (r'--\s*|.*$', Comment.Doc),
+            (r'//.*$', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+            # Lexemes:
+            #  Identifiers
+            (r'\bimport\b', Keyword.Reserved, 'import'),
+            (r'\bmodule\b', Keyword.Reserved, 'module'),
+            (r'\berror\b', Name.Exception),
+            (r'\b({})(?!\')\b'.format('|'.join(reserved)), Keyword.Reserved),
+            (r'^[_a-z][\w\']*', Name.Function),
+            (r"'?[_a-z][\w']*", Name),
+            (r"('')?[A-Z][\w\']*", Keyword.Type),
+            #  Operators
+            (r'\\(?![:!#$%&*+.\\/<=>?@^|~-]+)', Name.Function),  # lambda operator
+            (r'(<-|::|->|=>|=)(?![:!#$%&*+.\\/<=>?@^|~-]+)', Operator.Word),  # specials
+            (r':[:!#$%&*+.\\/<=>?@^|~-]*', Keyword.Type),  # Constructor operators
+            (r'[:!#$%&*+.\\/<=>?@^|~-]+', Operator),  # Other operators
+            #  Numbers
+            (r'\d+[eE][+-]?\d+', Number.Float),
+            (r'\d+\.\d+([eE][+-]?\d+)?', Number.Float),
+            (r'0[oO][0-7]+', Number.Oct),
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            #  Character/String Literals
+            (r"'", String.Char, 'character'),
+            (r'"', String, 'string'),
+            #  Special
+            (r'\[\]', Keyword.Type),
+            (r'\(\)', Name.Builtin),
+            (r'[][(),;`{}]', Punctuation),
+        ],
+        'import': [
+            # Import statements
+            (r'\s+', Whitespace),
+            (r'"', String, 'string'),
+            # after "funclist" state
+            (r'\)', Punctuation, '#pop'),
+            (r'qualified\b', Keyword),
+            # import X as Y
+            (r'([A-Z][\w.]*)(\s+)(as)(\s+)([A-Z][\w.]*)',
+             bygroups(Name.Namespace, Whitespace, Keyword, Whitespace, Name), '#pop'),
+            # import X hiding (functions)
+            (r'([A-Z][\w.]*)(\s+)(hiding)(\s+)(\()',
+             bygroups(Name.Namespace, Whitespace, Keyword, Whitespace, Punctuation), 'funclist'),
+            # import X (functions)
+            (r'([A-Z][\w.]*)(\s+)(\()',
+             bygroups(Name.Namespace, Whitespace, Punctuation), 'funclist'),
+            # import X
+            (r'[\w.]+', Name.Namespace, '#pop'),
+        ],
+        'module': [
+            (r'\s+', Whitespace),
+            (r'([A-Z][\w.]*)(\s+)(\()',
+             bygroups(Name.Namespace, Whitespace, Punctuation), 'funclist'),
+            (r'[A-Z][\w.]*', Name.Namespace, '#pop'),
+        ],
+        'funclist': [
+            (r'\s+', Whitespace),
+            (r'[A-Z]\w*', Keyword.Type),
+            (r'(_[\w\']+|[a-z][\w\']*)', Name.Function),
+            # TODO: these don't match the comments in docs, remove.
+            # (r'--(?![!#$%&*+./<=>?@^|_~:\\]).*?$', Comment.Single),
+            # (r'{-', Comment.Multiline, 'comment'),
+            (r',', Punctuation),
+            (r'[:!#$%&*+.\\/<=>?@^|~-]+', Operator),
+            # (HACK, but it makes sense to push two instances, believe me)
+            (r'\(', Punctuation, ('funclist', 'funclist')),
+            (r'\)', Punctuation, '#pop:2'),
+        ],
+        'comment': [
+            # Multiline Comments
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'character': [
+            # Allows multi-chars, incorrectly.
+            (r"[^\\']'", String.Char, '#pop'),
+            (r"\\", String.Escape, 'escape'),
+            ("'", String.Char, '#pop'),
+        ],
+        'string': [
+            (r'[^\\"]+', String),
+            (r"\\", String.Escape, 'escape'),
+            ('"', String, '#pop'),
+        ],
+        'escape': [
+            (r'[abfnrtv"\'&\\]', String.Escape, '#pop'),
+            (r'\^[][A-Z@^_]', String.Escape, '#pop'),
+            ('|'.join(ascii), String.Escape, '#pop'),
+            (r'o[0-7]+', String.Escape, '#pop'),
+            (r'x[\da-fA-F]+', String.Escape, '#pop'),
+            (r'\d+', String.Escape, '#pop'),
+            (r'(\s+)(\\)', bygroups(Whitespace, String.Escape), '#pop'),
+        ],
+    }
+
+    EXTRA_KEYWORDS = {'join', 'split', 'reverse', 'transpose', 'width',
+                      'length', 'tail', '<<', '>>', '<<<', '>>>', 'const',
+                      'reg', 'par', 'seq', 'ASSERT', 'undefined', 'error',
+                      'trace'}
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name and value in self.EXTRA_KEYWORDS:
+                yield index, Name.Builtin, value
+            else:
+                yield index, token, value
+
+
+class LiterateLexer(Lexer):
+    """
+    Base class for lexers of literate file formats based on LaTeX or Bird-style
+    (prefixing each code line with ">").
+
+    Additional options accepted:
+
+    `litstyle`
+        If given, must be ``"bird"`` or ``"latex"``.  If not given, the style
+        is autodetected: if the first non-whitespace character in the source
+        is a backslash or percent character, LaTeX is assumed, else Bird.
+    """
+
+    bird_re = re.compile(r'(>[ \t]*)(.*\n)')
+
+    def __init__(self, baselexer, **options):
+        self.baselexer = baselexer
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        style = self.options.get('litstyle')
+        if style is None:
+            style = (text.lstrip()[0:1] in '%\\') and 'latex' or 'bird'
+
+        code = ''
+        insertions = []
+        if style == 'bird':
+            # bird-style
+            for match in line_re.finditer(text):
+                line = match.group()
+                m = self.bird_re.match(line)
+                if m:
+                    insertions.append((len(code),
+                                       [(0, Comment.Special, m.group(1))]))
+                    code += m.group(2)
+                else:
+                    insertions.append((len(code), [(0, Text, line)]))
+        else:
+            # latex-style
+            from pygments.lexers.markup import TexLexer
+            lxlexer = TexLexer(**self.options)
+            codelines = 0
+            latex = ''
+            for match in line_re.finditer(text):
+                line = match.group()
+                if codelines:
+                    if line.lstrip().startswith('\\end{code}'):
+                        codelines = 0
+                        latex += line
+                    else:
+                        code += line
+                elif line.lstrip().startswith('\\begin{code}'):
+                    codelines = 1
+                    latex += line
+                    insertions.append((len(code),
+                                       list(lxlexer.get_tokens_unprocessed(latex))))
+                    latex = ''
+                else:
+                    latex += line
+            insertions.append((len(code),
+                               list(lxlexer.get_tokens_unprocessed(latex))))
+        yield from do_insertions(insertions, self.baselexer.get_tokens_unprocessed(code))
+
+
+class LiterateHaskellLexer(LiterateLexer):
+    """
+    For Literate Haskell (Bird-style or LaTeX) source.
+
+    Additional options accepted:
+
+    `litstyle`
+        If given, must be ``"bird"`` or ``"latex"``.  If not given, the style
+        is autodetected: if the first non-whitespace character in the source
+        is a backslash or percent character, LaTeX is assumed, else Bird.
+    """
+    name = 'Literate Haskell'
+    aliases = ['literate-haskell', 'lhaskell', 'lhs']
+    filenames = ['*.lhs']
+    mimetypes = ['text/x-literate-haskell']
+    url = 'https://wiki.haskell.org/Literate_programming'
+    version_added = '0.9'
+
+    def __init__(self, **options):
+        hslexer = HaskellLexer(**options)
+        LiterateLexer.__init__(self, hslexer, **options)
+
+
+class LiterateIdrisLexer(LiterateLexer):
+    """
+    For Literate Idris (Bird-style or LaTeX) source.
+
+    Additional options accepted:
+
+    `litstyle`
+        If given, must be ``"bird"`` or ``"latex"``.  If not given, the style
+        is autodetected: if the first non-whitespace character in the source
+        is a backslash or percent character, LaTeX is assumed, else Bird.
+    """
+    name = 'Literate Idris'
+    aliases = ['literate-idris', 'lidris', 'lidr']
+    filenames = ['*.lidr']
+    mimetypes = ['text/x-literate-idris']
+    url = 'https://idris2.readthedocs.io/en/latest/reference/literate.html'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        hslexer = IdrisLexer(**options)
+        LiterateLexer.__init__(self, hslexer, **options)
+
+
+class LiterateAgdaLexer(LiterateLexer):
+    """
+    For Literate Agda source.
+
+    Additional options accepted:
+
+    `litstyle`
+        If given, must be ``"bird"`` or ``"latex"``.  If not given, the style
+        is autodetected: if the first non-whitespace character in the source
+        is a backslash or percent character, LaTeX is assumed, else Bird.
+    """
+    name = 'Literate Agda'
+    aliases = ['literate-agda', 'lagda']
+    filenames = ['*.lagda']
+    mimetypes = ['text/x-literate-agda']
+    url = 'https://agda.readthedocs.io/en/latest/tools/literate-programming.html'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        agdalexer = AgdaLexer(**options)
+        LiterateLexer.__init__(self, agdalexer, litstyle='latex', **options)
+
+
+class LiterateCryptolLexer(LiterateLexer):
+    """
+    For Literate Cryptol (Bird-style or LaTeX) source.
+
+    Additional options accepted:
+
+    `litstyle`
+        If given, must be ``"bird"`` or ``"latex"``.  If not given, the style
+        is autodetected: if the first non-whitespace character in the source
+        is a backslash or percent character, LaTeX is assumed, else Bird.
+    """
+    name = 'Literate Cryptol'
+    aliases = ['literate-cryptol', 'lcryptol', 'lcry']
+    filenames = ['*.lcry']
+    mimetypes = ['text/x-literate-cryptol']
+    url = 'https://www.cryptol.net'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        crylexer = CryptolLexer(**options)
+        LiterateLexer.__init__(self, crylexer, **options)
+
+
+class KokaLexer(RegexLexer):
+    """
+    Lexer for the Koka language.
+    """
+
+    name = 'Koka'
+    url = 'https://koka-lang.github.io/koka/doc/index.html'
+    aliases = ['koka']
+    filenames = ['*.kk', '*.kki']
+    mimetypes = ['text/x-koka']
+    version_added = '1.6'
+
+    keywords = [
+        'infix', 'infixr', 'infixl',
+        'type', 'cotype', 'rectype', 'alias',
+        'struct', 'con',
+        'fun', 'function', 'val', 'var',
+        'external',
+        'if', 'then', 'else', 'elif', 'return', 'match',
+        'private', 'public', 'private',
+        'module', 'import', 'as',
+        'include', 'inline',
+        'rec',
+        'try', 'yield', 'enum',
+        'interface', 'instance',
+    ]
+
+    # keywords that are followed by a type
+    typeStartKeywords = [
+        'type', 'cotype', 'rectype', 'alias', 'struct', 'enum',
+    ]
+
+    # keywords valid in a type
+    typekeywords = [
+        'forall', 'exists', 'some', 'with',
+    ]
+
+    # builtin names and special names
+    builtin = [
+        'for', 'while', 'repeat',
+        'foreach', 'foreach-indexed',
+        'error', 'catch', 'finally',
+        'cs', 'js', 'file', 'ref', 'assigned',
+    ]
+
+    # symbols that can be in an operator
+    symbols = r'[$%&*+@!/\\^~=.:\-?|<>]+'
+
+    # symbol boundary: an operator keyword should not be followed by any of these
+    sboundary = '(?!' + symbols + ')'
+
+    # name boundary: a keyword should not be followed by any of these
+    boundary = r'(?![\w/])'
+
+    # koka token abstractions
+    tokenType = Name.Attribute
+    tokenTypeDef = Name.Class
+    tokenConstructor = Generic.Emph
+
+    # main lexer
+    tokens = {
+        'root': [
+            include('whitespace'),
+
+            # go into type mode
+            (r'::?' + sboundary, tokenType, 'type'),
+            (r'(alias)(\s+)([a-z]\w*)?', bygroups(Keyword, Whitespace, tokenTypeDef),
+             'alias-type'),
+            (r'(struct)(\s+)([a-z]\w*)?', bygroups(Keyword, Whitespace, tokenTypeDef),
+             'struct-type'),
+            ((r'({})'.format('|'.join(typeStartKeywords))) +
+             r'(\s+)([a-z]\w*)?', bygroups(Keyword, Whitespace, tokenTypeDef),
+             'type'),
+
+            # special sequences of tokens (we use ?: for non-capturing group as
+            # required by 'bygroups')
+            (r'(module)(\s+)(interface(?=\s))?(\s+)?((?:[a-z]\w*/)*[a-z]\w*)',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Namespace)),
+            (r'(import)(\s+)((?:[a-z]\w*/)*[a-z]\w*)'
+             r'(?:(\s*)(=)(\s*)(qualified)?(\s*)'
+             r'((?:[a-z]\w*/)*[a-z]\w*))?',
+             bygroups(Keyword, Whitespace, Name.Namespace, Whitespace, Keyword, Whitespace,
+                      Keyword, Whitespace, Name.Namespace)),
+
+            (r'^(public|private)?(\s+)?(function|fun|val)'
+             r'(\s+)([a-z]\w*|\((?:' + symbols + r'|/)\))',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Function)),
+            (r'^(?:(public|private)(?=\s+external))?((?<!^)\s+)?(external)(\s+)(inline(?=\s))?(\s+)?'
+             r'([a-z]\w*|\((?:' + symbols + r'|/)\))',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword, Whitespace, Name.Function)),
+
+            # keywords
+            (r'({})'.format('|'.join(typekeywords)) + boundary, Keyword.Type),
+            (r'({})'.format('|'.join(keywords)) + boundary, Keyword),
+            (r'({})'.format('|'.join(builtin)) + boundary, Keyword.Pseudo),
+            (r'::?|:=|\->|[=.]' + sboundary, Keyword),
+
+            # names
+            (r'((?:[a-z]\w*/)*)([A-Z]\w*)',
+             bygroups(Name.Namespace, tokenConstructor)),
+            (r'((?:[a-z]\w*/)*)([a-z]\w*)', bygroups(Name.Namespace, Name)),
+            (r'((?:[a-z]\w*/)*)(\((?:' + symbols + r'|/)\))',
+             bygroups(Name.Namespace, Name)),
+            (r'_\w*', Name.Variable),
+
+            # literal string
+            (r'@"', String.Double, 'litstring'),
+
+            # operators
+            (symbols + "|/(?![*/])", Operator),
+            (r'`', Operator),
+            (r'[{}()\[\];,]', Punctuation),
+
+            # literals. No check for literal characters with len > 1
+            (r'[0-9]+\.[0-9]+([eE][\-+]?[0-9]+)?', Number.Float),
+            (r'0[xX][0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+
+            (r"'", String.Char, 'char'),
+            (r'"', String.Double, 'string'),
+        ],
+
+        # type started by alias
+        'alias-type': [
+            (r'=', Keyword),
+            include('type')
+        ],
+
+        # type started by struct
+        'struct-type': [
+            (r'(?=\((?!,*\)))', Punctuation, '#pop'),
+            include('type')
+        ],
+
+        # type started by colon
+        'type': [
+            (r'[(\[<]', tokenType, 'type-nested'),
+            include('type-content')
+        ],
+
+        # type nested in brackets: can contain parameters, comma etc.
+        'type-nested': [
+            (r'[)\]>]', tokenType, '#pop'),
+            (r'[(\[<]', tokenType, 'type-nested'),
+            (r',', tokenType),
+            (r'([a-z]\w*)(\s*)(:)(?!:)',
+             bygroups(Name, Whitespace, tokenType)),  # parameter name
+            include('type-content')
+        ],
+
+        # shared contents of a type
+        'type-content': [
+            include('whitespace'),
+
+            # keywords
+            (r'({})'.format('|'.join(typekeywords)) + boundary, Keyword),
+            (r'(?=(({})'.format('|'.join(keywords)) + boundary + '))',
+             Keyword, '#pop'),  # need to match because names overlap...
+
+            # kinds
+            (r'[EPHVX]' + boundary, tokenType),
+
+            # type names
+            (r'[a-z][0-9]*(?![\w/])', tokenType),
+            (r'_\w*', tokenType.Variable),  # Generic.Emph
+            (r'((?:[a-z]\w*/)*)([A-Z]\w*)',
+             bygroups(Name.Namespace, tokenType)),
+            (r'((?:[a-z]\w*/)*)([a-z]\w+)',
+             bygroups(Name.Namespace, tokenType)),
+
+            # type keyword operators
+            (r'::|->|[.:|]', tokenType),
+
+            # catchall
+            default('#pop')
+        ],
+
+        # comments and literals
+        'whitespace': [
+            (r'(\n\s*)(#.*)$', bygroups(Whitespace, Comment.Preproc)),
+            (r'\s+', Whitespace),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'//.*$', Comment.Single)
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'litstring': [
+            (r'[^"]+', String.Double),
+            (r'""', String.Escape),
+            (r'"', String.Double, '#pop'),
+        ],
+        'string': [
+            (r'[^\\"\n]+', String.Double),
+            include('escape-sequence'),
+            (r'["\n]', String.Double, '#pop'),
+        ],
+        'char': [
+            (r'[^\\\'\n]+', String.Char),
+            include('escape-sequence'),
+            (r'[\'\n]', String.Char, '#pop'),
+        ],
+        'escape-sequence': [
+            (r'\\[nrt\\"\']', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            # Yes, \U literals are 6 hex digits.
+            (r'\\U[0-9a-fA-F]{6}', String.Escape)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/haxe.py b/.venv/Lib/site-packages/pygments/lexers/haxe.py
new file mode 100644 (file)
index 0000000..66bd2a3
--- /dev/null
@@ -0,0 +1,935 @@
+"""
+    pygments.lexers.haxe
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Haxe and related stuff.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import ExtendedRegexLexer, RegexLexer, include, bygroups, \
+    default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+
+__all__ = ['HaxeLexer', 'HxmlLexer']
+
+
+class HaxeLexer(ExtendedRegexLexer):
+    """
+    For Haxe source code.
+    """
+
+    name = 'Haxe'
+    url = 'http://haxe.org/'
+    aliases = ['haxe', 'hxsl', 'hx']
+    filenames = ['*.hx', '*.hxsl']
+    mimetypes = ['text/haxe', 'text/x-haxe', 'text/x-hx']
+    version_added = '1.3'
+
+    # keywords extracted from lexer.mll in the haxe compiler source
+    keyword = (r'(?:function|class|static|var|if|else|while|do|for|'
+               r'break|return|continue|extends|implements|import|'
+               r'switch|case|default|public|private|try|untyped|'
+               r'catch|new|this|throw|extern|enum|in|interface|'
+               r'cast|override|dynamic|typedef|package|'
+               r'inline|using|null|true|false|abstract)\b')
+
+    # idtype in lexer.mll
+    typeid = r'_*[A-Z]\w*'
+
+    # combined ident and dollar and idtype
+    ident = r'(?:_*[a-z]\w*|_+[0-9]\w*|' + typeid + r'|_+|\$\w+)'
+
+    binop = (r'(?:%=|&=|\|=|\^=|\+=|\-=|\*=|/=|<<=|>\s*>\s*=|>\s*>\s*>\s*=|==|'
+             r'!=|<=|>\s*=|&&|\|\||<<|>>>|>\s*>|\.\.\.|<|>|%|&|\||\^|\+|\*|'
+             r'/|\-|=>|=)')
+
+    # ident except keywords
+    ident_no_keyword = r'(?!' + keyword + ')' + ident
+
+    flags = re.DOTALL | re.MULTILINE
+
+    preproc_stack = []
+
+    def preproc_callback(self, match, ctx):
+        proc = match.group(2)
+
+        if proc == 'if':
+            # store the current stack
+            self.preproc_stack.append(ctx.stack[:])
+        elif proc in ['else', 'elseif']:
+            # restore the stack back to right before #if
+            if self.preproc_stack:
+                ctx.stack = self.preproc_stack[-1][:]
+        elif proc == 'end':
+            # remove the saved stack of previous #if
+            if self.preproc_stack:
+                self.preproc_stack.pop()
+
+        # #if and #elseif should follow by an expr
+        if proc in ['if', 'elseif']:
+            ctx.stack.append('preproc-expr')
+
+        # #error can be optionally follow by the error msg
+        if proc in ['error']:
+            ctx.stack.append('preproc-error')
+
+        yield match.start(), Comment.Preproc, '#' + proc
+        ctx.pos = match.end()
+
+    tokens = {
+        'root': [
+            include('spaces'),
+            include('meta'),
+            (r'(?:package)\b', Keyword.Namespace, ('semicolon', 'package')),
+            (r'(?:import)\b', Keyword.Namespace, ('semicolon', 'import')),
+            (r'(?:using)\b', Keyword.Namespace, ('semicolon', 'using')),
+            (r'(?:extern|private)\b', Keyword.Declaration),
+            (r'(?:abstract)\b', Keyword.Declaration, 'abstract'),
+            (r'(?:class|interface)\b', Keyword.Declaration, 'class'),
+            (r'(?:enum)\b', Keyword.Declaration, 'enum'),
+            (r'(?:typedef)\b', Keyword.Declaration, 'typedef'),
+
+            # top-level expression
+            # although it is not supported in haxe, but it is common to write
+            # expression in web pages the positive lookahead here is to prevent
+            # an infinite loop at the EOF
+            (r'(?=.)', Text, 'expr-statement'),
+        ],
+
+        # space/tab/comment/preproc
+        'spaces': [
+            (r'\s+', Whitespace),
+            (r'//[^\n\r]*', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'(#)(if|elseif|else|end|error)\b', preproc_callback),
+        ],
+
+        'string-single-interpol': [
+            (r'\$\{', String.Interpol, ('string-interpol-close', 'expr')),
+            (r'\$\$', String.Escape),
+            (r'\$(?=' + ident + ')', String.Interpol, 'ident'),
+            include('string-single'),
+        ],
+
+        'string-single': [
+            (r"'", String.Single, '#pop'),
+            (r'\\.', String.Escape),
+            (r'.', String.Single),
+        ],
+
+        'string-double': [
+            (r'"', String.Double, '#pop'),
+            (r'\\.', String.Escape),
+            (r'.', String.Double),
+        ],
+
+        'string-interpol-close': [
+            (r'\$'+ident, String.Interpol),
+            (r'\}', String.Interpol, '#pop'),
+        ],
+
+        'package': [
+            include('spaces'),
+            (ident, Name.Namespace),
+            (r'\.', Punctuation, 'import-ident'),
+            default('#pop'),
+        ],
+
+        'import': [
+            include('spaces'),
+            (ident, Name.Namespace),
+            (r'\*', Keyword),  # wildcard import
+            (r'\.', Punctuation, 'import-ident'),
+            (r'in', Keyword.Namespace, 'ident'),
+            default('#pop'),
+        ],
+
+        'import-ident': [
+            include('spaces'),
+            (r'\*', Keyword, '#pop'),  # wildcard import
+            (ident, Name.Namespace, '#pop'),
+        ],
+
+        'using': [
+            include('spaces'),
+            (ident, Name.Namespace),
+            (r'\.', Punctuation, 'import-ident'),
+            default('#pop'),
+        ],
+
+        'preproc-error': [
+            (r'\s+', Whitespace),
+            (r"'", String.Single, ('#pop', 'string-single')),
+            (r'"', String.Double, ('#pop', 'string-double')),
+            default('#pop'),
+        ],
+
+        'preproc-expr': [
+            (r'\s+', Whitespace),
+            (r'\!', Comment.Preproc),
+            (r'\(', Comment.Preproc, ('#pop', 'preproc-parenthesis')),
+
+            (ident, Comment.Preproc, '#pop'),
+
+            # Float
+            (r'\.[0-9]+', Number.Float),
+            (r'[0-9]+[eE][+\-]?[0-9]+', Number.Float),
+            (r'[0-9]+\.[0-9]*[eE][+\-]?[0-9]+', Number.Float),
+            (r'[0-9]+\.[0-9]+', Number.Float),
+            (r'[0-9]+\.(?!' + ident + r'|\.\.)', Number.Float),
+
+            # Int
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+
+            # String
+            (r"'", String.Single, ('#pop', 'string-single')),
+            (r'"', String.Double, ('#pop', 'string-double')),
+        ],
+
+        'preproc-parenthesis': [
+            (r'\s+', Whitespace),
+            (r'\)', Comment.Preproc, '#pop'),
+            default('preproc-expr-in-parenthesis'),
+        ],
+
+        'preproc-expr-chain': [
+            (r'\s+', Whitespace),
+            (binop, Comment.Preproc, ('#pop', 'preproc-expr-in-parenthesis')),
+            default('#pop'),
+        ],
+
+        # same as 'preproc-expr' but able to chain 'preproc-expr-chain'
+        'preproc-expr-in-parenthesis': [
+            (r'\s+', Whitespace),
+            (r'\!', Comment.Preproc),
+            (r'\(', Comment.Preproc,
+             ('#pop', 'preproc-expr-chain', 'preproc-parenthesis')),
+
+            (ident, Comment.Preproc, ('#pop', 'preproc-expr-chain')),
+
+            # Float
+            (r'\.[0-9]+', Number.Float, ('#pop', 'preproc-expr-chain')),
+            (r'[0-9]+[eE][+\-]?[0-9]+', Number.Float, ('#pop', 'preproc-expr-chain')),
+            (r'[0-9]+\.[0-9]*[eE][+\-]?[0-9]+', Number.Float, ('#pop', 'preproc-expr-chain')),
+            (r'[0-9]+\.[0-9]+', Number.Float, ('#pop', 'preproc-expr-chain')),
+            (r'[0-9]+\.(?!' + ident + r'|\.\.)', Number.Float, ('#pop', 'preproc-expr-chain')),
+
+            # Int
+            (r'0x[0-9a-fA-F]+', Number.Hex, ('#pop', 'preproc-expr-chain')),
+            (r'[0-9]+', Number.Integer, ('#pop', 'preproc-expr-chain')),
+
+            # String
+            (r"'", String.Single,
+             ('#pop', 'preproc-expr-chain', 'string-single')),
+            (r'"', String.Double,
+             ('#pop', 'preproc-expr-chain', 'string-double')),
+        ],
+
+        'abstract': [
+            include('spaces'),
+            default(('#pop', 'abstract-body', 'abstract-relation',
+                    'abstract-opaque', 'type-param-constraint', 'type-name')),
+        ],
+
+        'abstract-body': [
+            include('spaces'),
+            (r'\{', Punctuation, ('#pop', 'class-body')),
+        ],
+
+        'abstract-opaque': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'parenthesis-close', 'type')),
+            default('#pop'),
+        ],
+
+        'abstract-relation': [
+            include('spaces'),
+            (r'(?:to|from)', Keyword.Declaration, 'type'),
+            (r',', Punctuation),
+            default('#pop'),
+        ],
+
+        'meta': [
+            include('spaces'),
+            (r'@', Name.Decorator, ('meta-body', 'meta-ident', 'meta-colon')),
+        ],
+
+        # optional colon
+        'meta-colon': [
+            include('spaces'),
+            (r':', Name.Decorator, '#pop'),
+            default('#pop'),
+        ],
+
+        # same as 'ident' but set token as Name.Decorator instead of Name
+        'meta-ident': [
+            include('spaces'),
+            (ident, Name.Decorator, '#pop'),
+        ],
+
+        'meta-body': [
+            include('spaces'),
+            (r'\(', Name.Decorator, ('#pop', 'meta-call')),
+            default('#pop'),
+        ],
+
+        'meta-call': [
+            include('spaces'),
+            (r'\)', Name.Decorator, '#pop'),
+            default(('#pop', 'meta-call-sep', 'expr')),
+        ],
+
+        'meta-call-sep': [
+            include('spaces'),
+            (r'\)', Name.Decorator, '#pop'),
+            (r',', Punctuation, ('#pop', 'meta-call')),
+        ],
+
+        'typedef': [
+            include('spaces'),
+            default(('#pop', 'typedef-body', 'type-param-constraint',
+                     'type-name')),
+        ],
+
+        'typedef-body': [
+            include('spaces'),
+            (r'=', Operator, ('#pop', 'optional-semicolon', 'type')),
+        ],
+
+        'enum': [
+            include('spaces'),
+            default(('#pop', 'enum-body', 'bracket-open',
+                     'type-param-constraint', 'type-name')),
+        ],
+
+        'enum-body': [
+            include('spaces'),
+            include('meta'),
+            (r'\}', Punctuation, '#pop'),
+            (ident_no_keyword, Name, ('enum-member', 'type-param-constraint')),
+        ],
+
+        'enum-member': [
+            include('spaces'),
+            (r'\(', Punctuation,
+             ('#pop', 'semicolon', 'flag', 'function-param')),
+            default(('#pop', 'semicolon', 'flag')),
+        ],
+
+        'class': [
+            include('spaces'),
+            default(('#pop', 'class-body', 'bracket-open', 'extends',
+                     'type-param-constraint', 'type-name')),
+        ],
+
+        'extends': [
+            include('spaces'),
+            (r'(?:extends|implements)\b', Keyword.Declaration, 'type'),
+            (r',', Punctuation),  # the comma is made optional here, since haxe2
+                                  # requires the comma but haxe3 does not allow it
+            default('#pop'),
+        ],
+
+        'bracket-open': [
+            include('spaces'),
+            (r'\{', Punctuation, '#pop'),
+        ],
+
+        'bracket-close': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+
+        'class-body': [
+            include('spaces'),
+            include('meta'),
+            (r'\}', Punctuation, '#pop'),
+            (r'(?:static|public|private|override|dynamic|inline|macro)\b',
+             Keyword.Declaration),
+            default('class-member'),
+        ],
+
+        'class-member': [
+            include('spaces'),
+            (r'(var)\b', Keyword.Declaration,
+             ('#pop', 'optional-semicolon', 'var')),
+            (r'(function)\b', Keyword.Declaration,
+             ('#pop', 'optional-semicolon', 'class-method')),
+        ],
+
+        # local function, anonymous or not
+        'function-local': [
+            include('spaces'),
+            (ident_no_keyword, Name.Function,
+             ('#pop', 'optional-expr', 'flag', 'function-param',
+              'parenthesis-open', 'type-param-constraint')),
+            default(('#pop', 'optional-expr', 'flag', 'function-param',
+                     'parenthesis-open', 'type-param-constraint')),
+        ],
+
+        'optional-expr': [
+            include('spaces'),
+            include('expr'),
+            default('#pop'),
+        ],
+
+        'class-method': [
+            include('spaces'),
+            (ident, Name.Function, ('#pop', 'optional-expr', 'flag',
+                                    'function-param', 'parenthesis-open',
+                                    'type-param-constraint')),
+        ],
+
+        # function arguments
+        'function-param': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+            (r'\?', Punctuation),
+            (ident_no_keyword, Name,
+             ('#pop', 'function-param-sep', 'assign', 'flag')),
+        ],
+
+        'function-param-sep': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'function-param')),
+        ],
+
+        'prop-get-set': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'parenthesis-close',
+                                  'prop-get-set-opt', 'comma', 'prop-get-set-opt')),
+            default('#pop'),
+        ],
+
+        'prop-get-set-opt': [
+            include('spaces'),
+            (r'(?:default|null|never|dynamic|get|set)\b', Keyword, '#pop'),
+            (ident_no_keyword, Text, '#pop'),  # custom getter/setter
+        ],
+
+        'expr-statement': [
+            include('spaces'),
+            # makes semicolon optional here, just to avoid checking the last
+            # one is bracket or not.
+            default(('#pop', 'optional-semicolon', 'expr')),
+        ],
+
+        'expr': [
+            include('spaces'),
+            (r'@', Name.Decorator, ('#pop', 'optional-expr', 'meta-body',
+                                    'meta-ident', 'meta-colon')),
+            (r'(?:\+\+|\-\-|~(?!/)|!|\-)', Operator),
+            (r'\(', Punctuation, ('#pop', 'expr-chain', 'parenthesis')),
+            (r'(?:static|public|private|override|dynamic|inline)\b',
+             Keyword.Declaration),
+            (r'(?:function)\b', Keyword.Declaration, ('#pop', 'expr-chain',
+                                                      'function-local')),
+            (r'\{', Punctuation, ('#pop', 'expr-chain', 'bracket')),
+            (r'(?:true|false|null)\b', Keyword.Constant, ('#pop', 'expr-chain')),
+            (r'(?:this)\b', Keyword, ('#pop', 'expr-chain')),
+            (r'(?:cast)\b', Keyword, ('#pop', 'expr-chain', 'cast')),
+            (r'(?:try)\b', Keyword, ('#pop', 'catch', 'expr')),
+            (r'(?:var)\b', Keyword.Declaration, ('#pop', 'var')),
+            (r'(?:new)\b', Keyword, ('#pop', 'expr-chain', 'new')),
+            (r'(?:switch)\b', Keyword, ('#pop', 'switch')),
+            (r'(?:if)\b', Keyword, ('#pop', 'if')),
+            (r'(?:do)\b', Keyword, ('#pop', 'do')),
+            (r'(?:while)\b', Keyword, ('#pop', 'while')),
+            (r'(?:for)\b', Keyword, ('#pop', 'for')),
+            (r'(?:untyped|throw)\b', Keyword),
+            (r'(?:return)\b', Keyword, ('#pop', 'optional-expr')),
+            (r'(?:macro)\b', Keyword, ('#pop', 'macro')),
+            (r'(?:continue|break)\b', Keyword, '#pop'),
+            (r'(?:\$\s*[a-z]\b|\$(?!'+ident+'))', Name, ('#pop', 'dollar')),
+            (ident_no_keyword, Name, ('#pop', 'expr-chain')),
+
+            # Float
+            (r'\.[0-9]+', Number.Float, ('#pop', 'expr-chain')),
+            (r'[0-9]+[eE][+\-]?[0-9]+', Number.Float, ('#pop', 'expr-chain')),
+            (r'[0-9]+\.[0-9]*[eE][+\-]?[0-9]+', Number.Float, ('#pop', 'expr-chain')),
+            (r'[0-9]+\.[0-9]+', Number.Float, ('#pop', 'expr-chain')),
+            (r'[0-9]+\.(?!' + ident + r'|\.\.)', Number.Float, ('#pop', 'expr-chain')),
+
+            # Int
+            (r'0x[0-9a-fA-F]+', Number.Hex, ('#pop', 'expr-chain')),
+            (r'[0-9]+', Number.Integer, ('#pop', 'expr-chain')),
+
+            # String
+            (r"'", String.Single, ('#pop', 'expr-chain', 'string-single-interpol')),
+            (r'"', String.Double, ('#pop', 'expr-chain', 'string-double')),
+
+            # EReg
+            (r'~/(\\\\|\\[^\\]|[^/\\\n])*/[gimsu]*', String.Regex, ('#pop', 'expr-chain')),
+
+            # Array
+            (r'\[', Punctuation, ('#pop', 'expr-chain', 'array-decl')),
+        ],
+
+        'expr-chain': [
+            include('spaces'),
+            (r'(?:\+\+|\-\-)', Operator),
+            (binop, Operator, ('#pop', 'expr')),
+            (r'(?:in)\b', Keyword, ('#pop', 'expr')),
+            (r'\?', Operator, ('#pop', 'expr', 'ternary', 'expr')),
+            (r'(\.)(' + ident_no_keyword + ')', bygroups(Punctuation, Name)),
+            (r'\[', Punctuation, 'array-access'),
+            (r'\(', Punctuation, 'call'),
+            default('#pop'),
+        ],
+
+        # macro reification
+        'macro': [
+            include('spaces'),
+            include('meta'),
+            (r':', Punctuation, ('#pop', 'type')),
+
+            (r'(?:extern|private)\b', Keyword.Declaration),
+            (r'(?:abstract)\b', Keyword.Declaration, ('#pop', 'optional-semicolon', 'abstract')),
+            (r'(?:class|interface)\b', Keyword.Declaration, ('#pop', 'optional-semicolon', 'macro-class')),
+            (r'(?:enum)\b', Keyword.Declaration, ('#pop', 'optional-semicolon', 'enum')),
+            (r'(?:typedef)\b', Keyword.Declaration, ('#pop', 'optional-semicolon', 'typedef')),
+
+            default(('#pop', 'expr')),
+        ],
+
+        'macro-class': [
+            (r'\{', Punctuation, ('#pop', 'class-body')),
+            include('class')
+        ],
+
+        # cast can be written as "cast expr" or "cast(expr, type)"
+        'cast': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'parenthesis-close',
+                                  'cast-type', 'expr')),
+            default(('#pop', 'expr')),
+        ],
+
+        # optionally give a type as the 2nd argument of cast()
+        'cast-type': [
+            include('spaces'),
+            (r',', Punctuation, ('#pop', 'type')),
+            default('#pop'),
+        ],
+
+        'catch': [
+            include('spaces'),
+            (r'(?:catch)\b', Keyword, ('expr', 'function-param',
+                                       'parenthesis-open')),
+            default('#pop'),
+        ],
+
+        # do-while loop
+        'do': [
+            include('spaces'),
+            default(('#pop', 'do-while', 'expr')),
+        ],
+
+        # the while after do
+        'do-while': [
+            include('spaces'),
+            (r'(?:while)\b', Keyword, ('#pop', 'parenthesis',
+                                       'parenthesis-open')),
+        ],
+
+        'while': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'expr', 'parenthesis')),
+        ],
+
+        'for': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'expr', 'parenthesis')),
+        ],
+
+        'if': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'else', 'optional-semicolon', 'expr',
+                                  'parenthesis')),
+        ],
+
+        'else': [
+            include('spaces'),
+            (r'(?:else)\b', Keyword, ('#pop', 'expr')),
+            default('#pop'),
+        ],
+
+        'switch': [
+            include('spaces'),
+            default(('#pop', 'switch-body', 'bracket-open', 'expr')),
+        ],
+
+        'switch-body': [
+            include('spaces'),
+            (r'(?:case|default)\b', Keyword, ('case-block', 'case')),
+            (r'\}', Punctuation, '#pop'),
+        ],
+
+        'case': [
+            include('spaces'),
+            (r':', Punctuation, '#pop'),
+            default(('#pop', 'case-sep', 'case-guard', 'expr')),
+        ],
+
+        'case-sep': [
+            include('spaces'),
+            (r':', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'case')),
+        ],
+
+        'case-guard': [
+            include('spaces'),
+            (r'(?:if)\b', Keyword, ('#pop', 'parenthesis', 'parenthesis-open')),
+            default('#pop'),
+        ],
+
+        # optional multiple expr under a case
+        'case-block': [
+            include('spaces'),
+            (r'(?!(?:case|default)\b|\})', Keyword, 'expr-statement'),
+            default('#pop'),
+        ],
+
+        'new': [
+            include('spaces'),
+            default(('#pop', 'call', 'parenthesis-open', 'type')),
+        ],
+
+        'array-decl': [
+            include('spaces'),
+            (r'\]', Punctuation, '#pop'),
+            default(('#pop', 'array-decl-sep', 'expr')),
+        ],
+
+        'array-decl-sep': [
+            include('spaces'),
+            (r'\]', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'array-decl')),
+        ],
+
+        'array-access': [
+            include('spaces'),
+            default(('#pop', 'array-access-close', 'expr')),
+        ],
+
+        'array-access-close': [
+            include('spaces'),
+            (r'\]', Punctuation, '#pop'),
+        ],
+
+        'comma': [
+            include('spaces'),
+            (r',', Punctuation, '#pop'),
+        ],
+
+        'colon': [
+            include('spaces'),
+            (r':', Punctuation, '#pop'),
+        ],
+
+        'semicolon': [
+            include('spaces'),
+            (r';', Punctuation, '#pop'),
+        ],
+
+        'optional-semicolon': [
+            include('spaces'),
+            (r';', Punctuation, '#pop'),
+            default('#pop'),
+        ],
+
+        # identity that CAN be a Haxe keyword
+        'ident': [
+            include('spaces'),
+            (ident, Name, '#pop'),
+        ],
+
+        'dollar': [
+            include('spaces'),
+            (r'\{', Punctuation, ('#pop', 'expr-chain', 'bracket-close', 'expr')),
+            default(('#pop', 'expr-chain')),
+        ],
+
+        'type-name': [
+            include('spaces'),
+            (typeid, Name, '#pop'),
+        ],
+
+        'type-full-name': [
+            include('spaces'),
+            (r'\.', Punctuation, 'ident'),
+            default('#pop'),
+        ],
+
+        'type': [
+            include('spaces'),
+            (r'\?', Punctuation),
+            (ident, Name, ('#pop', 'type-check', 'type-full-name')),
+            (r'\{', Punctuation, ('#pop', 'type-check', 'type-struct')),
+            (r'\(', Punctuation, ('#pop', 'type-check', 'type-parenthesis')),
+        ],
+
+        'type-parenthesis': [
+            include('spaces'),
+            default(('#pop', 'parenthesis-close', 'type')),
+        ],
+
+        'type-check': [
+            include('spaces'),
+            (r'->', Punctuation, ('#pop', 'type')),
+            (r'<(?!=)', Punctuation, 'type-param'),
+            default('#pop'),
+        ],
+
+        'type-struct': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+            (r'\?', Punctuation),
+            (r'>', Punctuation, ('comma', 'type')),
+            (ident_no_keyword, Name, ('#pop', 'type-struct-sep', 'type', 'colon')),
+            include('class-body'),
+        ],
+
+        'type-struct-sep': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'type-struct')),
+        ],
+
+        # type-param can be a normal type or a constant literal...
+        'type-param-type': [
+            # Float
+            (r'\.[0-9]+', Number.Float, '#pop'),
+            (r'[0-9]+[eE][+\-]?[0-9]+', Number.Float, '#pop'),
+            (r'[0-9]+\.[0-9]*[eE][+\-]?[0-9]+', Number.Float, '#pop'),
+            (r'[0-9]+\.[0-9]+', Number.Float, '#pop'),
+            (r'[0-9]+\.(?!' + ident + r'|\.\.)', Number.Float, '#pop'),
+
+            # Int
+            (r'0x[0-9a-fA-F]+', Number.Hex, '#pop'),
+            (r'[0-9]+', Number.Integer, '#pop'),
+
+            # String
+            (r"'", String.Single, ('#pop', 'string-single')),
+            (r'"', String.Double, ('#pop', 'string-double')),
+
+            # EReg
+            (r'~/(\\\\|\\[^\\]|[^/\\\n])*/[gim]*', String.Regex, '#pop'),
+
+            # Array
+            (r'\[', Operator, ('#pop', 'array-decl')),
+
+            include('type'),
+        ],
+
+        # type-param part of a type
+        # ie. the <A,B> path in Map<A,B>
+        'type-param': [
+            include('spaces'),
+            default(('#pop', 'type-param-sep', 'type-param-type')),
+        ],
+
+        'type-param-sep': [
+            include('spaces'),
+            (r'>', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'type-param')),
+        ],
+
+        # optional type-param that may include constraint
+        # ie. <T:Constraint, T2:(ConstraintA,ConstraintB)>
+        'type-param-constraint': [
+            include('spaces'),
+            (r'<(?!=)', Punctuation, ('#pop', 'type-param-constraint-sep',
+                                      'type-param-constraint-flag', 'type-name')),
+            default('#pop'),
+        ],
+
+        'type-param-constraint-sep': [
+            include('spaces'),
+            (r'>', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'type-param-constraint-sep',
+                                 'type-param-constraint-flag', 'type-name')),
+        ],
+
+        # the optional constraint inside type-param
+        'type-param-constraint-flag': [
+            include('spaces'),
+            (r':', Punctuation, ('#pop', 'type-param-constraint-flag-type')),
+            default('#pop'),
+        ],
+
+        'type-param-constraint-flag-type': [
+            include('spaces'),
+            (r'\(', Punctuation, ('#pop', 'type-param-constraint-flag-type-sep',
+                                  'type')),
+            default(('#pop', 'type')),
+        ],
+
+        'type-param-constraint-flag-type-sep': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation, 'type'),
+        ],
+
+        # a parenthesis expr that contain exactly one expr
+        'parenthesis': [
+            include('spaces'),
+            default(('#pop', 'parenthesis-close', 'flag', 'expr')),
+        ],
+
+        'parenthesis-open': [
+            include('spaces'),
+            (r'\(', Punctuation, '#pop'),
+        ],
+
+        'parenthesis-close': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+        ],
+
+        'var': [
+            include('spaces'),
+            (ident_no_keyword, Text, ('#pop', 'var-sep', 'assign', 'flag', 'prop-get-set')),
+        ],
+
+        # optional more var decl.
+        'var-sep': [
+            include('spaces'),
+            (r',', Punctuation, ('#pop', 'var')),
+            default('#pop'),
+        ],
+
+        # optional assignment
+        'assign': [
+            include('spaces'),
+            (r'=', Operator, ('#pop', 'expr')),
+            default('#pop'),
+        ],
+
+        # optional type flag
+        'flag': [
+            include('spaces'),
+            (r':', Punctuation, ('#pop', 'type')),
+            default('#pop'),
+        ],
+
+        # colon as part of a ternary operator (?:)
+        'ternary': [
+            include('spaces'),
+            (r':', Operator, '#pop'),
+        ],
+
+        # function call
+        'call': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+            default(('#pop', 'call-sep', 'expr')),
+        ],
+
+        # after a call param
+        'call-sep': [
+            include('spaces'),
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'call')),
+        ],
+
+        # bracket can be block or object
+        'bracket': [
+            include('spaces'),
+            (r'(?!(?:\$\s*[a-z]\b|\$(?!'+ident+')))' + ident_no_keyword, Name,
+             ('#pop', 'bracket-check')),
+            (r"'", String.Single, ('#pop', 'bracket-check', 'string-single')),
+            (r'"', String.Double, ('#pop', 'bracket-check', 'string-double')),
+            default(('#pop', 'block')),
+        ],
+
+        'bracket-check': [
+            include('spaces'),
+            (r':', Punctuation, ('#pop', 'object-sep', 'expr')),  # is object
+            default(('#pop', 'block', 'optional-semicolon', 'expr-chain')),  # is block
+        ],
+
+        # code block
+        'block': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+            default('expr-statement'),
+        ],
+
+        # object in key-value pairs
+        'object': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+            default(('#pop', 'object-sep', 'expr', 'colon', 'ident-or-string'))
+        ],
+
+        # a key of an object
+        'ident-or-string': [
+            include('spaces'),
+            (ident_no_keyword, Name, '#pop'),
+            (r"'", String.Single, ('#pop', 'string-single')),
+            (r'"', String.Double, ('#pop', 'string-double')),
+        ],
+
+        # after a key-value pair in object
+        'object-sep': [
+            include('spaces'),
+            (r'\}', Punctuation, '#pop'),
+            (r',', Punctuation, ('#pop', 'object')),
+        ],
+
+
+
+    }
+
+    def analyse_text(text):
+        if re.match(r'\w+\s*:\s*\w', text):
+            return 0.3
+
+
+class HxmlLexer(RegexLexer):
+    """
+    Lexer for haXe build files.
+    """
+    name = 'Hxml'
+    url = 'https://haxe.org/manual/compiler-usage-hxml.html'
+    aliases = ['haxeml', 'hxml']
+    filenames = ['*.hxml']
+    version_added = '1.6'
+
+    tokens = {
+        'root': [
+            # Separator
+            (r'(--)(next)', bygroups(Punctuation, Generic.Heading)),
+            # Compiler switches with one dash
+            (r'(-)(prompt|debug|v)', bygroups(Punctuation, Keyword.Keyword)),
+            # Compilerswitches with two dashes
+            (r'(--)(neko-source|flash-strict|flash-use-stage|no-opt|no-traces|'
+             r'no-inline|times|no-output)', bygroups(Punctuation, Keyword)),
+            # Targets and other options that take an argument
+            (r'(-)(cpp|js|neko|x|as3|swf9?|swf-lib|php|xml|main|lib|D|resource|'
+             r'cp|cmd)( +)(.+)',
+             bygroups(Punctuation, Keyword, Whitespace, String)),
+            # Options that take only numerical arguments
+            (r'(-)(swf-version)( +)(\d+)',
+             bygroups(Punctuation, Keyword, Whitespace, Number.Integer)),
+            # An Option that defines the size, the fps and the background
+            # color of an flash movie
+            (r'(-)(swf-header)( +)(\d+)(:)(\d+)(:)(\d+)(:)([A-Fa-f0-9]{6})',
+             bygroups(Punctuation, Keyword, Whitespace, Number.Integer,
+                      Punctuation, Number.Integer, Punctuation, Number.Integer,
+                      Punctuation, Number.Hex)),
+            # options with two dashes that takes arguments
+            (r'(--)(js-namespace|php-front|php-lib|remap|gen-hx-classes)( +)'
+             r'(.+)', bygroups(Punctuation, Keyword, Whitespace, String)),
+            # Single line comment, multiline ones are not allowed.
+            (r'#.*', Comment.Single)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/hdl.py b/.venv/Lib/site-packages/pygments/lexers/hdl.py
new file mode 100644 (file)
index 0000000..d22b66f
--- /dev/null
@@ -0,0 +1,466 @@
+"""
+    pygments.lexers.hdl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for hardware descriptor languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, include, using, this, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['VerilogLexer', 'SystemVerilogLexer', 'VhdlLexer']
+
+
+class VerilogLexer(RegexLexer):
+    """
+    For verilog source code with preprocessor directives.
+    """
+    name = 'verilog'
+    aliases = ['verilog', 'v']
+    filenames = ['*.v']
+    mimetypes = ['text/x-verilog']
+    url = 'https://en.wikipedia.org/wiki/Verilog'
+    version_added = '1.4'
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
+
+    tokens = {
+        'root': [
+            (r'^\s*`define', Comment.Preproc, 'macro'),
+            (r'\s+', Whitespace),
+            (r'(\\)(\n)', bygroups(String.Escape, Whitespace)),  # line continuation
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'[{}#@]', Punctuation),
+            (r'L?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'([0-9]+)|(\'h)[0-9a-fA-F]+', Number.Hex),
+            (r'([0-9]+)|(\'b)[01]+', Number.Bin),
+            (r'([0-9]+)|(\'d)[0-9]+', Number.Integer),
+            (r'([0-9]+)|(\'o)[0-7]+', Number.Oct),
+            (r'\'[01xz]', Number),
+            (r'\d+[Ll]?', Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.;\']', Punctuation),
+            (r'`[a-zA-Z_]\w*', Name.Constant),
+
+            (r'^(\s*)(package)(\s+)', bygroups(Whitespace, Keyword.Namespace, Text)),
+            (r'^(\s*)(import)(\s+)', bygroups(Whitespace, Keyword.Namespace, Text),
+             'import'),
+
+            (words((
+                'always', 'always_comb', 'always_ff', 'always_latch', 'and',
+                'assign', 'automatic', 'begin', 'break', 'buf', 'bufif0', 'bufif1',
+                'case', 'casex', 'casez', 'cmos', 'const', 'continue', 'deassign',
+                'default', 'defparam', 'disable', 'do', 'edge', 'else', 'end', 'endcase',
+                'endfunction', 'endgenerate', 'endmodule', 'endpackage', 'endprimitive',
+                'endspecify', 'endtable', 'endtask', 'enum', 'event', 'final', 'for',
+                'force', 'forever', 'fork', 'function', 'generate', 'genvar', 'highz0',
+                'highz1', 'if', 'initial', 'inout', 'input', 'integer', 'join', 'large',
+                'localparam', 'macromodule', 'medium', 'module', 'nand', 'negedge',
+                'nmos', 'nor', 'not', 'notif0', 'notif1', 'or', 'output', 'packed',
+                'parameter', 'pmos', 'posedge', 'primitive', 'pull0', 'pull1',
+                'pulldown', 'pullup', 'rcmos', 'ref', 'release', 'repeat', 'return',
+                'rnmos', 'rpmos', 'rtran', 'rtranif0', 'rtranif1', 'scalared', 'signed',
+                'small', 'specify', 'specparam', 'strength', 'string', 'strong0',
+                'strong1', 'struct', 'table', 'task', 'tran', 'tranif0', 'tranif1',
+                'type', 'typedef', 'unsigned', 'var', 'vectored', 'void', 'wait',
+                'weak0', 'weak1', 'while', 'xnor', 'xor'), suffix=r'\b'),
+             Keyword),
+
+            (words((
+                'accelerate', 'autoexpand_vectornets', 'celldefine', 'default_nettype',
+                'else', 'elsif', 'endcelldefine', 'endif', 'endprotect', 'endprotected',
+                'expand_vectornets', 'ifdef', 'ifndef', 'include', 'noaccelerate',
+                'noexpand_vectornets', 'noremove_gatenames', 'noremove_netnames',
+                'nounconnected_drive', 'protect', 'protected', 'remove_gatenames',
+                'remove_netnames', 'resetall', 'timescale', 'unconnected_drive',
+                'undef'), prefix=r'`', suffix=r'\b'),
+             Comment.Preproc),
+
+            (words((
+                'bits', 'bitstoreal', 'bitstoshortreal', 'countdrivers', 'display', 'fclose',
+                'fdisplay', 'finish', 'floor', 'fmonitor', 'fopen', 'fstrobe', 'fwrite',
+                'getpattern', 'history', 'incsave', 'input', 'itor', 'key', 'list', 'log',
+                'monitor', 'monitoroff', 'monitoron', 'nokey', 'nolog', 'printtimescale',
+                'random', 'readmemb', 'readmemh', 'realtime', 'realtobits', 'reset',
+                'reset_count', 'reset_value', 'restart', 'rtoi', 'save', 'scale', 'scope',
+                'shortrealtobits', 'showscopes', 'showvariables', 'showvars', 'sreadmemb',
+                'sreadmemh', 'stime', 'stop', 'strobe', 'time', 'timeformat', 'write'),
+                prefix=r'\$', suffix=r'\b'),
+             Name.Builtin),
+
+            (words((
+                'byte', 'shortint', 'int', 'longint', 'integer', 'time',
+                'bit', 'logic', 'reg', 'supply0', 'supply1', 'tri', 'triand',
+                'trior', 'tri0', 'tri1', 'trireg', 'uwire', 'wire', 'wand', 'wor'
+                'shortreal', 'real', 'realtime'), suffix=r'\b'),
+             Keyword.Type),
+            (r'[a-zA-Z_]\w*:(?!:)', Name.Label),
+            (r'\$?[a-zA-Z_]\w*', Name),
+            (r'\\(\S+)', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'(\\)(\n)', bygroups(String.Escape, Whitespace)),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'import': [
+            (r'[\w:]+\*?', Name.Namespace, '#pop')
+        ]
+    }
+
+    def analyse_text(text):
+        """Verilog code will use one of reg/wire/assign for sure, and that
+        is not common elsewhere."""
+        result = 0
+        if 'reg' in text:
+            result += 0.1
+        if 'wire' in text:
+            result += 0.1
+        if 'assign' in text:
+            result += 0.1
+
+        return result
+
+
+class SystemVerilogLexer(RegexLexer):
+    """
+    Extends verilog lexer to recognise all SystemVerilog keywords from IEEE
+    1800-2009 standard.
+    """
+    name = 'systemverilog'
+    aliases = ['systemverilog', 'sv']
+    filenames = ['*.sv', '*.svh']
+    mimetypes = ['text/x-systemverilog']
+    url = 'https://en.wikipedia.org/wiki/SystemVerilog'
+    version_added = '1.5'
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
+
+    tokens = {
+        'root': [
+            (r'^(\s*)(`define)', bygroups(Whitespace, Comment.Preproc), 'macro'),
+            (r'^(\s*)(package)(\s+)', bygroups(Whitespace, Keyword.Namespace, Whitespace)),
+            (r'^(\s*)(import)(\s+)', bygroups(Whitespace, Keyword.Namespace, Whitespace), 'import'),
+
+            (r'\s+', Whitespace),
+            (r'(\\)(\n)', bygroups(String.Escape, Whitespace)),  # line continuation
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'[{}#@]', Punctuation),
+            (r'L?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+
+            (r'([1-9][_0-9]*)?\s*\'[sS]?[bB]\s*[xXzZ?01][_xXzZ?01]*',
+             Number.Bin),
+            (r'([1-9][_0-9]*)?\s*\'[sS]?[oO]\s*[xXzZ?0-7][_xXzZ?0-7]*',
+             Number.Oct),
+            (r'([1-9][_0-9]*)?\s*\'[sS]?[dD]\s*[xXzZ?0-9][_xXzZ?0-9]*',
+             Number.Integer),
+            (r'([1-9][_0-9]*)?\s*\'[sS]?[hH]\s*[xXzZ?0-9a-fA-F][_xXzZ?0-9a-fA-F]*',
+             Number.Hex),
+
+            (r'\'[01xXzZ]', Number),
+            (r'[0-9][_0-9]*', Number.Integer),
+
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (words(('inside', 'dist'), suffix=r'\b'), Operator.Word),
+
+            (r'[()\[\],.;\'$]', Punctuation),
+            (r'`[a-zA-Z_]\w*', Name.Constant),
+
+            (words((
+                'accept_on', 'alias', 'always', 'always_comb', 'always_ff',
+                'always_latch', 'and', 'assert', 'assign', 'assume', 'automatic',
+                'before', 'begin', 'bind', 'bins', 'binsof', 'break', 'buf',
+                'bufif0', 'bufif1', 'case', 'casex', 'casez', 'cell',
+                'checker', 'clocking', 'cmos', 'config',
+                'constraint', 'context', 'continue', 'cover', 'covergroup',
+                'coverpoint', 'cross', 'deassign', 'default', 'defparam', 'design',
+                'disable', 'do', 'edge', 'else', 'end', 'endcase',
+                'endchecker', 'endclocking', 'endconfig', 'endfunction',
+                'endgenerate', 'endgroup', 'endinterface', 'endmodule', 'endpackage',
+                'endprimitive', 'endprogram', 'endproperty', 'endsequence',
+                'endspecify', 'endtable', 'endtask', 'enum', 'eventually',
+                'expect', 'export', 'extern', 'final', 'first_match',
+                'for', 'force', 'foreach', 'forever', 'fork', 'forkjoin', 'function',
+                'generate', 'genvar', 'global', 'highz0', 'highz1', 'if', 'iff',
+                'ifnone', 'ignore_bins', 'illegal_bins', 'implies', 'implements', 'import',
+                'incdir', 'include', 'initial', 'inout', 'input',
+                'instance', 'interconnect', 'interface', 'intersect', 'join',
+                'join_any', 'join_none', 'large', 'let', 'liblist', 'library',
+                'local', 'localparam', 'macromodule', 'matches',
+                'medium', 'modport', 'module', 'nand', 'negedge', 'nettype', 'new', 'nexttime',
+                'nmos', 'nor', 'noshowcancelled', 'not', 'notif0', 'notif1', 'null',
+                'or', 'output', 'package', 'packed', 'parameter', 'pmos', 'posedge',
+                'primitive', 'priority', 'program', 'property', 'protected', 'pull0',
+                'pull1', 'pulldown', 'pullup', 'pulsestyle_ondetect',
+                'pulsestyle_onevent', 'pure', 'rand', 'randc', 'randcase',
+                'randsequence', 'rcmos', 'ref',
+                'reject_on', 'release', 'repeat', 'restrict', 'return', 'rnmos',
+                'rpmos', 'rtran', 'rtranif0', 'rtranif1', 's_always', 's_eventually',
+                's_nexttime', 's_until', 's_until_with', 'scalared', 'sequence',
+                'showcancelled', 'small', 'soft', 'solve',
+                'specify', 'specparam', 'static', 'strong', 'strong0',
+                'strong1', 'struct', 'super', 'sync_accept_on',
+                'sync_reject_on', 'table', 'tagged', 'task', 'this', 'throughout',
+                'timeprecision', 'timeunit', 'tran', 'tranif0', 'tranif1',
+                'typedef', 'union', 'unique', 'unique0', 'until',
+                'until_with', 'untyped', 'use', 'vectored',
+                'virtual', 'wait', 'wait_order', 'weak', 'weak0',
+                'weak1', 'while', 'wildcard', 'with', 'within',
+                'xnor', 'xor'),
+                suffix=r'\b'),
+             Keyword),
+
+            (r'(class)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Class)),
+            (r'(extends)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Class)),
+            (r'(endclass\b)(?:(\s*)(:)(\s*)([a-zA-Z_]\w*))?',
+             bygroups(Keyword.Declaration, Whitespace, Punctuation, Whitespace, Name.Class)),
+
+            (words((
+                # Variable types
+                'bit', 'byte', 'chandle', 'const', 'event', 'int', 'integer',
+                'logic', 'longint', 'real', 'realtime', 'reg', 'shortint',
+                'shortreal', 'signed', 'string', 'time', 'type', 'unsigned',
+                'var', 'void',
+                # Net types
+                'supply0', 'supply1', 'tri', 'triand', 'trior', 'trireg',
+                'tri0', 'tri1', 'uwire', 'wand', 'wire', 'wor'),
+                suffix=r'\b'),
+             Keyword.Type),
+
+            (words((
+                '`__FILE__', '`__LINE__', '`begin_keywords', '`celldefine',
+                '`default_nettype', '`define', '`else', '`elsif', '`end_keywords',
+                '`endcelldefine', '`endif', '`ifdef', '`ifndef', '`include',
+                '`line', '`nounconnected_drive', '`pragma', '`resetall',
+                '`timescale', '`unconnected_drive', '`undef', '`undefineall'),
+                suffix=r'\b'),
+             Comment.Preproc),
+
+            (words((
+                # Simulation control tasks (20.2)
+                '$exit', '$finish', '$stop',
+                # Simulation time functions (20.3)
+                '$realtime', '$stime', '$time',
+                # Timescale tasks (20.4)
+                '$printtimescale', '$timeformat',
+                # Conversion functions
+                '$bitstoreal', '$bitstoshortreal', '$cast', '$itor',
+                '$realtobits', '$rtoi', '$shortrealtobits', '$signed',
+                '$unsigned',
+                # Data query functions (20.6)
+                '$bits', '$isunbounded', '$typename',
+                # Array query functions (20.7)
+                '$dimensions', '$high', '$increment', '$left', '$low', '$right',
+                '$size', '$unpacked_dimensions',
+                # Math functions (20.8)
+                '$acos', '$acosh', '$asin', '$asinh', '$atan', '$atan2',
+                '$atanh', '$ceil', '$clog2', '$cos', '$cosh', '$exp', '$floor',
+                '$hypot', '$ln', '$log10', '$pow', '$sin', '$sinh', '$sqrt',
+                '$tan', '$tanh',
+                # Bit vector system functions (20.9)
+                '$countbits', '$countones', '$isunknown', '$onehot', '$onehot0',
+                # Severity tasks (20.10)
+                '$info', '$error', '$fatal', '$warning',
+                # Assertion control tasks (20.12)
+                '$assertcontrol', '$assertfailoff', '$assertfailon',
+                '$assertkill', '$assertnonvacuouson', '$assertoff', '$asserton',
+                '$assertpassoff', '$assertpasson', '$assertvacuousoff',
+                # Sampled value system functions (20.13)
+                '$changed', '$changed_gclk', '$changing_gclk', '$falling_gclk',
+                '$fell', '$fell_gclk', '$future_gclk', '$past', '$past_gclk',
+                '$rising_gclk', '$rose', '$rose_gclk', '$sampled', '$stable',
+                '$stable_gclk', '$steady_gclk',
+                # Coverage control functions (20.14)
+                '$coverage_control', '$coverage_get', '$coverage_get_max',
+                '$coverage_merge', '$coverage_save', '$get_coverage',
+                '$load_coverage_db', '$set_coverage_db_name',
+                # Probabilistic distribution functions (20.15)
+                '$dist_chi_square', '$dist_erlang', '$dist_exponential',
+                '$dist_normal', '$dist_poisson', '$dist_t', '$dist_uniform',
+                '$random',
+                # Stochastic analysis tasks and functions (20.16)
+                '$q_add', '$q_exam', '$q_full', '$q_initialize', '$q_remove',
+                # PLA modeling tasks (20.17)
+                '$async$and$array', '$async$and$plane', '$async$nand$array',
+                '$async$nand$plane', '$async$nor$array', '$async$nor$plane',
+                '$async$or$array', '$async$or$plane', '$sync$and$array',
+                '$sync$and$plane', '$sync$nand$array', '$sync$nand$plane',
+                '$sync$nor$array', '$sync$nor$plane', '$sync$or$array',
+                '$sync$or$plane',
+                # Miscellaneous tasks and functions (20.18)
+                '$system',
+                # Display tasks (21.2)
+                '$display', '$displayb', '$displayh', '$displayo', '$monitor',
+                '$monitorb', '$monitorh', '$monitoro', '$monitoroff',
+                '$monitoron', '$strobe', '$strobeb', '$strobeh', '$strobeo',
+                '$write', '$writeb', '$writeh', '$writeo',
+                # File I/O tasks and functions (21.3)
+                '$fclose', '$fdisplay', '$fdisplayb', '$fdisplayh',
+                '$fdisplayo', '$feof', '$ferror', '$fflush', '$fgetc', '$fgets',
+                '$fmonitor', '$fmonitorb', '$fmonitorh', '$fmonitoro', '$fopen',
+                '$fread', '$fscanf', '$fseek', '$fstrobe', '$fstrobeb',
+                '$fstrobeh', '$fstrobeo', '$ftell', '$fwrite', '$fwriteb',
+                '$fwriteh', '$fwriteo', '$rewind', '$sformat', '$sformatf',
+                '$sscanf', '$swrite', '$swriteb', '$swriteh', '$swriteo',
+                '$ungetc',
+                # Memory load tasks (21.4)
+                '$readmemb', '$readmemh',
+                # Memory dump tasks (21.5)
+                '$writememb', '$writememh',
+                # Command line input (21.6)
+                '$test$plusargs', '$value$plusargs',
+                # VCD tasks (21.7)
+                '$dumpall', '$dumpfile', '$dumpflush', '$dumplimit', '$dumpoff',
+                '$dumpon', '$dumpports', '$dumpportsall', '$dumpportsflush',
+                '$dumpportslimit', '$dumpportsoff', '$dumpportson', '$dumpvars',
+                ), suffix=r'\b'),
+             Name.Builtin),
+
+            (r'[a-zA-Z_]\w*:(?!:)', Name.Label),
+            (r'\$?[a-zA-Z_]\w*', Name),
+            (r'\\(\S+)', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'(\\)(\n)', bygroups(String.Escape, Whitespace)),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'//.*?$', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'import': [
+            (r'[\w:]+\*?', Name.Namespace, '#pop')
+        ]
+    }
+
+
+class VhdlLexer(RegexLexer):
+    """
+    For VHDL source code.
+    """
+    name = 'vhdl'
+    aliases = ['vhdl']
+    filenames = ['*.vhdl', '*.vhd']
+    mimetypes = ['text/x-vhdl']
+    url = 'https://en.wikipedia.org/wiki/VHDL'
+    version_added = '1.5'
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'(\\)(\n)', bygroups(String.Escape, Whitespace)),  # line continuation
+            (r'--.*?$', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r"'(U|X|0|1|Z|W|L|H|-)'", String.Char),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r"'[a-z_]\w*", Name.Attribute),
+            (r'[()\[\],.;\']', Punctuation),
+            (r'"[^\n\\"]*"', String),
+
+            (r'(library)(\s+)([a-z_]\w*)',
+             bygroups(Keyword, Whitespace, Name.Namespace)),
+            (r'(use)(\s+)(entity)', bygroups(Keyword, Whitespace, Keyword)),
+            (r'(use)(\s+)([a-z_][\w.]*\.)(all)',
+             bygroups(Keyword, Whitespace, Name.Namespace, Keyword)),
+            (r'(use)(\s+)([a-z_][\w.]*)',
+             bygroups(Keyword, Whitespace, Name.Namespace)),
+            (r'(std|ieee)(\.[a-z_]\w*)',
+             bygroups(Name.Namespace, Name.Namespace)),
+            (words(('std', 'ieee', 'work'), suffix=r'\b'),
+             Name.Namespace),
+            (r'(entity|component)(\s+)([a-z_]\w*)',
+             bygroups(Keyword, Whitespace, Name.Class)),
+            (r'(architecture|configuration)(\s+)([a-z_]\w*)(\s+)'
+             r'(of)(\s+)([a-z_]\w*)(\s+)(is)',
+             bygroups(Keyword, Whitespace, Name.Class, Whitespace, Keyword, Whitespace,
+                      Name.Class, Whitespace, Keyword)),
+            (r'([a-z_]\w*)(:)(\s+)(process|for)',
+             bygroups(Name.Class, Operator, Whitespace, Keyword)),
+            (r'(end)(\s+)', bygroups(using(this), Whitespace), 'endblock'),
+
+            include('types'),
+            include('keywords'),
+            include('numbers'),
+
+            (r'[a-z_]\w*', Name),
+        ],
+        'endblock': [
+            include('keywords'),
+            (r'[a-z_]\w*', Name.Class),
+            (r'\s+', Whitespace),
+            (r';', Punctuation, '#pop'),
+        ],
+        'types': [
+            (words((
+                'boolean', 'bit', 'character', 'severity_level', 'integer', 'time',
+                'delay_length', 'natural', 'positive', 'string', 'bit_vector',
+                'file_open_kind', 'file_open_status', 'std_ulogic', 'std_ulogic_vector',
+                'std_logic', 'std_logic_vector', 'signed', 'unsigned'), suffix=r'\b'),
+             Keyword.Type),
+        ],
+        'keywords': [
+            (words((
+                'abs', 'access', 'after', 'alias', 'all', 'and',
+                'architecture', 'array', 'assert', 'attribute', 'begin', 'block',
+                'body', 'buffer', 'bus', 'case', 'component', 'configuration',
+                'constant', 'disconnect', 'downto', 'else', 'elsif', 'end',
+                'entity', 'exit', 'file', 'for', 'function', 'generate',
+                'generic', 'group', 'guarded', 'if', 'impure', 'in',
+                'inertial', 'inout', 'is', 'label', 'library', 'linkage',
+                'literal', 'loop', 'map', 'mod', 'nand', 'new',
+                'next', 'nor', 'not', 'null', 'of', 'on',
+                'open', 'or', 'others', 'out', 'package', 'port',
+                'postponed', 'procedure', 'process', 'pure', 'range', 'record',
+                'register', 'reject', 'rem', 'return', 'rol', 'ror', 'select',
+                'severity', 'signal', 'shared', 'sla', 'sll', 'sra',
+                'srl', 'subtype', 'then', 'to', 'transport', 'type',
+                'units', 'until', 'use', 'variable', 'wait', 'when',
+                'while', 'with', 'xnor', 'xor'), suffix=r'\b'),
+             Keyword),
+        ],
+        'numbers': [
+            (r'\d{1,2}#[0-9a-f_]+#?', Number.Integer),
+            (r'\d+', Number.Integer),
+            (r'(\d+\.\d*|\.\d+|\d+)E[+-]?\d+', Number.Float),
+            (r'X"[0-9a-f_]+"', Number.Hex),
+            (r'O"[0-7_]+"', Number.Oct),
+            (r'B"[01_]+"', Number.Bin),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/hexdump.py b/.venv/Lib/site-packages/pygments/lexers/hexdump.py
new file mode 100644 (file)
index 0000000..4da4edb
--- /dev/null
@@ -0,0 +1,102 @@
+"""
+    pygments.lexers.hexdump
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for hexadecimal dumps.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include
+from pygments.token import Name, Number, String, Punctuation, Whitespace
+
+__all__ = ['HexdumpLexer']
+
+
+class HexdumpLexer(RegexLexer):
+    """
+    For typical hex dump output formats by the UNIX and GNU/Linux tools ``hexdump``,
+    ``hd``, ``hexcat``, ``od`` and ``xxd``, and the DOS tool ``DEBUG``. For example:
+
+    .. sourcecode:: hexdump
+
+        00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
+        00000010  02 00 3e 00 01 00 00 00  c5 48 40 00 00 00 00 00  |..>......H@.....|
+
+    The specific supported formats are the outputs of:
+
+    * ``hexdump FILE``
+    * ``hexdump -C FILE`` -- the `canonical` format used in the example.
+    * ``hd FILE`` -- same as ``hexdump -C FILE``.
+    * ``hexcat FILE``
+    * ``od -t x1z FILE``
+    * ``xxd FILE``
+    * ``DEBUG.EXE FILE.COM`` and entering ``d`` to the prompt.
+    """
+    name = 'Hexdump'
+    aliases = ['hexdump']
+    url = 'https://en.wikipedia.org/wiki/Hex_dump'
+    version_added = '2.1'
+
+    hd = r'[0-9A-Ha-h]'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            include('offset'),
+            (r'('+hd+r'{2})(\-)('+hd+r'{2})',
+             bygroups(Number.Hex, Punctuation, Number.Hex)),
+            (hd+r'{2}', Number.Hex),
+            (r'(\s{2,3})(\>)(.{16})(\<)$',
+             bygroups(Whitespace, Punctuation, String, Punctuation), 'bracket-strings'),
+            (r'(\s{2,3})(\|)(.{16})(\|)$',
+             bygroups(Whitespace, Punctuation, String, Punctuation), 'piped-strings'),
+            (r'(\s{2,3})(\>)(.{1,15})(\<)$',
+             bygroups(Whitespace, Punctuation, String, Punctuation)),
+            (r'(\s{2,3})(\|)(.{1,15})(\|)$',
+             bygroups(Whitespace, Punctuation, String, Punctuation)),
+            (r'(\s{2,3})(.{1,15})$', bygroups(Whitespace, String)),
+            (r'(\s{2,3})(.{16}|.{20})$', bygroups(Whitespace, String), 'nonpiped-strings'),
+            (r'\s', Whitespace),
+            (r'^\*', Punctuation),
+        ],
+        'offset': [
+            (r'^('+hd+'+)(:)', bygroups(Name.Label, Punctuation), 'offset-mode'),
+            (r'^'+hd+'+', Name.Label),
+        ],
+        'offset-mode': [
+            (r'\s', Whitespace, '#pop'),
+            (hd+'+', Name.Label),
+            (r':', Punctuation)
+        ],
+        'piped-strings': [
+            (r'\n', Whitespace),
+            include('offset'),
+            (hd+r'{2}', Number.Hex),
+            (r'(\s{2,3})(\|)(.{1,16})(\|)$',
+             bygroups(Whitespace, Punctuation, String, Punctuation)),
+            (r'\s', Whitespace),
+            (r'^\*', Punctuation),
+        ],
+        'bracket-strings': [
+            (r'\n', Whitespace),
+            include('offset'),
+            (hd+r'{2}', Number.Hex),
+            (r'(\s{2,3})(\>)(.{1,16})(\<)$',
+             bygroups(Whitespace, Punctuation, String, Punctuation)),
+            (r'\s', Whitespace),
+            (r'^\*', Punctuation),
+        ],
+        'nonpiped-strings': [
+            (r'\n', Whitespace),
+            include('offset'),
+            (r'('+hd+r'{2})(\-)('+hd+r'{2})',
+             bygroups(Number.Hex, Punctuation, Number.Hex)),
+            (hd+r'{2}', Number.Hex),
+            (r'(\s{19,})(.{1,20}?)$', bygroups(Whitespace, String)),
+            (r'(\s{2,3})(.{1,20})$', bygroups(Whitespace, String)),
+            (r'\s', Whitespace),
+            (r'^\*', Punctuation),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/html.py b/.venv/Lib/site-packages/pygments/lexers/html.py
new file mode 100644 (file)
index 0000000..66ba660
--- /dev/null
@@ -0,0 +1,670 @@
+"""
+    pygments.lexers.html
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for HTML, XML and related markup.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, bygroups, \
+    default, using, inherit, this
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Punctuation, Whitespace
+from pygments.util import looks_like_xml, html_doctype_matches
+
+from pygments.lexers.javascript import JavascriptLexer
+from pygments.lexers.jvm import ScalaLexer
+from pygments.lexers.css import CssLexer, _indentation, _starts_block
+from pygments.lexers.ruby import RubyLexer
+
+__all__ = ['HtmlLexer', 'DtdLexer', 'XmlLexer', 'XsltLexer', 'HamlLexer',
+           'ScamlLexer', 'PugLexer', 'VueLexer', 'UrlEncodedLexer']
+
+
+class HtmlLexer(RegexLexer):
+    """
+    For HTML 4 and XHTML 1 markup. Nested JavaScript and CSS is highlighted
+    by the appropriate lexer.
+    """
+
+    name = 'HTML'
+    url = 'https://html.spec.whatwg.org/'
+    aliases = ['html']
+    filenames = ['*.html', '*.htm', '*.xhtml', '*.xslt']
+    mimetypes = ['text/html', 'application/xhtml+xml']
+    version_added = ''
+
+    flags = re.IGNORECASE | re.DOTALL
+    tokens = {
+        'root': [
+            ('[^<&]+', Text),
+            (r'&\S*?;', Name.Entity),
+            (r'\<\!\[CDATA\[.*?\]\]\>', Comment.Preproc),
+            (r'<!--.*?-->', Comment.Multiline),
+            (r'<\?.*?\?>', Comment.Preproc),
+            ('<![^>]*>', Comment.Preproc),
+            (r'(<)(\s*)(script)(\s*)',
+             bygroups(Punctuation, Text, Name.Tag, Text),
+             ('script-content', 'tag')),
+            (r'(<)(\s*)(style)(\s*)',
+             bygroups(Punctuation, Text, Name.Tag, Text),
+             ('style-content', 'tag')),
+            # note: this allows tag names not used in HTML like <x:with-dash>,
+            # this is to support yet-unknown template engines and the like
+            (r'(<)(\s*)([\w:.-]+)',
+             bygroups(Punctuation, Text, Name.Tag), 'tag'),
+            (r'(<)(\s*)(/)(\s*)([\w:.-]+)(\s*)(>)',
+             bygroups(Punctuation, Text, Punctuation, Text, Name.Tag, Text,
+                      Punctuation)),
+        ],
+        'tag': [
+            (r'\s+', Text),
+            (r'([\w:-]+\s*)(=)(\s*)', bygroups(Name.Attribute, Operator, Text),
+             'attr'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'(/?)(\s*)(>)', bygroups(Punctuation, Text, Punctuation), '#pop'),
+        ],
+        'script-content': [
+            (r'(<)(\s*)(/)(\s*)(script)(\s*)(>)',
+             bygroups(Punctuation, Text, Punctuation, Text, Name.Tag, Text,
+                      Punctuation), '#pop'),
+            (r'.+?(?=<\s*/\s*script\s*>)', using(JavascriptLexer)),
+            # fallback cases for when there is no closing script tag
+            # first look for newline and then go back into root state
+            # if that fails just read the rest of the file
+            # this is similar to the error handling logic in lexer.py
+            (r'.+?\n', using(JavascriptLexer), '#pop'),
+            (r'.+', using(JavascriptLexer), '#pop'),
+        ],
+        'style-content': [
+            (r'(<)(\s*)(/)(\s*)(style)(\s*)(>)',
+             bygroups(Punctuation, Text, Punctuation, Text, Name.Tag, Text,
+                      Punctuation),'#pop'),
+            (r'.+?(?=<\s*/\s*style\s*>)', using(CssLexer)),
+            # fallback cases for when there is no closing style tag
+            # first look for newline and then go back into root state
+            # if that fails just read the rest of the file
+            # this is similar to the error handling logic in lexer.py
+            (r'.+?\n', using(CssLexer), '#pop'),
+            (r'.+', using(CssLexer), '#pop'),
+        ],
+        'attr': [
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if html_doctype_matches(text):
+            return 0.5
+
+
+class DtdLexer(RegexLexer):
+    """
+    A lexer for DTDs (Document Type Definitions).
+    """
+
+    flags = re.MULTILINE | re.DOTALL
+
+    name = 'DTD'
+    aliases = ['dtd']
+    filenames = ['*.dtd']
+    mimetypes = ['application/xml-dtd']
+    url = 'https://en.wikipedia.org/wiki/Document_type_definition'
+    version_added = '1.5'
+
+    tokens = {
+        'root': [
+            include('common'),
+
+            (r'(<!ELEMENT)(\s+)(\S+)',
+                bygroups(Keyword, Text, Name.Tag), 'element'),
+            (r'(<!ATTLIST)(\s+)(\S+)',
+                bygroups(Keyword, Text, Name.Tag), 'attlist'),
+            (r'(<!ENTITY)(\s+)(\S+)',
+                bygroups(Keyword, Text, Name.Entity), 'entity'),
+            (r'(<!NOTATION)(\s+)(\S+)',
+                bygroups(Keyword, Text, Name.Tag), 'notation'),
+            (r'(<!\[)([^\[\s]+)(\s*)(\[)',  # conditional sections
+                bygroups(Keyword, Name.Entity, Text, Keyword)),
+
+            (r'(<!DOCTYPE)(\s+)([^>\s]+)',
+                bygroups(Keyword, Text, Name.Tag)),
+            (r'PUBLIC|SYSTEM', Keyword.Constant),
+            (r'[\[\]>]', Keyword),
+        ],
+
+        'common': [
+            (r'\s+', Text),
+            (r'(%|&)[^;]*;', Name.Entity),
+            ('<!--', Comment, 'comment'),
+            (r'[(|)*,?+]', Operator),
+            (r'"[^"]*"', String.Double),
+            (r'\'[^\']*\'', String.Single),
+        ],
+
+        'comment': [
+            ('[^-]+', Comment),
+            ('-->', Comment, '#pop'),
+            ('-', Comment),
+        ],
+
+        'element': [
+            include('common'),
+            (r'EMPTY|ANY|#PCDATA', Keyword.Constant),
+            (r'[^>\s|()?+*,]+', Name.Tag),
+            (r'>', Keyword, '#pop'),
+        ],
+
+        'attlist': [
+            include('common'),
+            (r'CDATA|IDREFS|IDREF|ID|NMTOKENS|NMTOKEN|ENTITIES|ENTITY|NOTATION',
+             Keyword.Constant),
+            (r'#REQUIRED|#IMPLIED|#FIXED', Keyword.Constant),
+            (r'xml:space|xml:lang', Keyword.Reserved),
+            (r'[^>\s|()?+*,]+', Name.Attribute),
+            (r'>', Keyword, '#pop'),
+        ],
+
+        'entity': [
+            include('common'),
+            (r'SYSTEM|PUBLIC|NDATA', Keyword.Constant),
+            (r'[^>\s|()?+*,]+', Name.Entity),
+            (r'>', Keyword, '#pop'),
+        ],
+
+        'notation': [
+            include('common'),
+            (r'SYSTEM|PUBLIC', Keyword.Constant),
+            (r'[^>\s|()?+*,]+', Name.Attribute),
+            (r'>', Keyword, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if not looks_like_xml(text) and \
+           ('<!ELEMENT' in text or '<!ATTLIST' in text or '<!ENTITY' in text):
+            return 0.8
+
+
+class XmlLexer(RegexLexer):
+    """
+    Generic lexer for XML (eXtensible Markup Language).
+    """
+
+    flags = re.MULTILINE | re.DOTALL
+
+    name = 'XML'
+    aliases = ['xml']
+    filenames = ['*.xml', '*.xsl', '*.rss', '*.xslt', '*.xsd',
+                 '*.wsdl', '*.wsf']
+    mimetypes = ['text/xml', 'application/xml', 'image/svg+xml',
+                 'application/rss+xml', 'application/atom+xml']
+    url = 'https://www.w3.org/XML'
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'[^<&\s]+', Text),
+            (r'[^<&\S]+', Whitespace),
+            (r'&\S*?;', Name.Entity),
+            (r'\<\!\[CDATA\[.*?\]\]\>', Comment.Preproc),
+            (r'<!--.*?-->', Comment.Multiline),
+            (r'<\?.*?\?>', Comment.Preproc),
+            ('<![^>]*>', Comment.Preproc),
+            (r'<\s*[\w:.-]+', Name.Tag, 'tag'),
+            (r'<\s*/\s*[\w:.-]+\s*>', Name.Tag),
+        ],
+        'tag': [
+            (r'\s+', Whitespace),
+            (r'[\w.:-]+\s*=', Name.Attribute, 'attr'),
+            (r'/?\s*>', Name.Tag, '#pop'),
+        ],
+        'attr': [
+            (r'\s+', Whitespace),
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if looks_like_xml(text):
+            return 0.45  # less than HTML
+
+
+class XsltLexer(XmlLexer):
+    """
+    A lexer for XSLT.
+    """
+
+    name = 'XSLT'
+    aliases = ['xslt']
+    filenames = ['*.xsl', '*.xslt', '*.xpl']  # xpl is XProc
+    mimetypes = ['application/xsl+xml', 'application/xslt+xml']
+    url = 'https://www.w3.org/TR/xslt-30'
+    version_added = '0.10'
+
+    EXTRA_KEYWORDS = {
+        'apply-imports', 'apply-templates', 'attribute',
+        'attribute-set', 'call-template', 'choose', 'comment',
+        'copy', 'copy-of', 'decimal-format', 'element', 'fallback',
+        'for-each', 'if', 'import', 'include', 'key', 'message',
+        'namespace-alias', 'number', 'otherwise', 'output', 'param',
+        'preserve-space', 'processing-instruction', 'sort',
+        'strip-space', 'stylesheet', 'template', 'text', 'transform',
+        'value-of', 'variable', 'when', 'with-param'
+    }
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in XmlLexer.get_tokens_unprocessed(self, text):
+            m = re.match('</?xsl:([^>]*)/?>?', value)
+
+            if token is Name.Tag and m and m.group(1) in self.EXTRA_KEYWORDS:
+                yield index, Keyword, value
+            else:
+                yield index, token, value
+
+    def analyse_text(text):
+        if looks_like_xml(text) and '<xsl' in text:
+            return 0.8
+
+
+class HamlLexer(ExtendedRegexLexer):
+    """
+    For Haml markup.
+    """
+
+    name = 'Haml'
+    aliases = ['haml']
+    filenames = ['*.haml']
+    mimetypes = ['text/x-haml']
+    url = 'https://haml.info'
+    version_added = '1.3'
+
+    flags = re.IGNORECASE
+    # Haml can include " |\n" anywhere,
+    # which is ignored and used to wrap long lines.
+    # To accommodate this, use this custom faux dot instead.
+    _dot = r'(?: \|\n(?=.* \|)|.)'
+
+    # In certain places, a comma at the end of the line
+    # allows line wrapping as well.
+    _comma_dot = r'(?:,\s*\n|' + _dot + ')'
+    tokens = {
+        'root': [
+            (r'[ \t]*\n', Text),
+            (r'[ \t]*', _indentation),
+        ],
+
+        'css': [
+            (r'\.[\w:-]+', Name.Class, 'tag'),
+            (r'\#[\w:-]+', Name.Function, 'tag'),
+        ],
+
+        'eval-or-plain': [
+            (r'[&!]?==', Punctuation, 'plain'),
+            (r'([&!]?[=~])(' + _comma_dot + r'*\n)',
+             bygroups(Punctuation, using(RubyLexer)),
+             'root'),
+            default('plain'),
+        ],
+
+        'content': [
+            include('css'),
+            (r'%[\w:-]+', Name.Tag, 'tag'),
+            (r'!!!' + _dot + r'*\n', Name.Namespace, '#pop'),
+            (r'(/)(\[' + _dot + r'*?\])(' + _dot + r'*\n)',
+             bygroups(Comment, Comment.Special, Comment),
+             '#pop'),
+            (r'/' + _dot + r'*\n', _starts_block(Comment, 'html-comment-block'),
+             '#pop'),
+            (r'-#' + _dot + r'*\n', _starts_block(Comment.Preproc,
+                                                  'haml-comment-block'), '#pop'),
+            (r'(-)(' + _comma_dot + r'*\n)',
+             bygroups(Punctuation, using(RubyLexer)),
+             '#pop'),
+            (r':' + _dot + r'*\n', _starts_block(Name.Decorator, 'filter-block'),
+             '#pop'),
+            include('eval-or-plain'),
+        ],
+
+        'tag': [
+            include('css'),
+            (r'\{(,\n|' + _dot + r')*?\}', using(RubyLexer)),
+            (r'\[' + _dot + r'*?\]', using(RubyLexer)),
+            (r'\(', Text, 'html-attributes'),
+            (r'/[ \t]*\n', Punctuation, '#pop:2'),
+            (r'[<>]{1,2}(?=[ \t=])', Punctuation),
+            include('eval-or-plain'),
+        ],
+
+        'plain': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text),
+            (r'(#\{)(' + _dot + r'*?)(\})',
+             bygroups(String.Interpol, using(RubyLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+
+        'html-attributes': [
+            (r'\s+', Text),
+            (r'[\w:-]+[ \t]*=', Name.Attribute, 'html-attribute-value'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'\)', Text, '#pop'),
+        ],
+
+        'html-attribute-value': [
+            (r'[ \t]+', Text),
+            (r'\w+', Name.Variable, '#pop'),
+            (r'@\w+', Name.Variable.Instance, '#pop'),
+            (r'\$\w+', Name.Variable.Global, '#pop'),
+            (r"'(\\\\|\\[^\\]|[^'\\\n])*'", String, '#pop'),
+            (r'"(\\\\|\\[^\\]|[^"\\\n])*"', String, '#pop'),
+        ],
+
+        'html-comment-block': [
+            (_dot + '+', Comment),
+            (r'\n', Text, 'root'),
+        ],
+
+        'haml-comment-block': [
+            (_dot + '+', Comment.Preproc),
+            (r'\n', Text, 'root'),
+        ],
+
+        'filter-block': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Name.Decorator),
+            (r'(#\{)(' + _dot + r'*?)(\})',
+             bygroups(String.Interpol, using(RubyLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+    }
+
+
+class ScamlLexer(ExtendedRegexLexer):
+    """
+    For Scaml markup.  Scaml is Haml for Scala.
+    """
+
+    name = 'Scaml'
+    aliases = ['scaml']
+    filenames = ['*.scaml']
+    mimetypes = ['text/x-scaml']
+    url = 'https://scalate.github.io/scalate/'
+    version_added = '1.4'
+
+    flags = re.IGNORECASE
+    # Scaml does not yet support the " |\n" notation to
+    # wrap long lines.  Once it does, use the custom faux
+    # dot instead.
+    # _dot = r'(?: \|\n(?=.* \|)|.)'
+    _dot = r'.'
+
+    tokens = {
+        'root': [
+            (r'[ \t]*\n', Text),
+            (r'[ \t]*', _indentation),
+        ],
+
+        'css': [
+            (r'\.[\w:-]+', Name.Class, 'tag'),
+            (r'\#[\w:-]+', Name.Function, 'tag'),
+        ],
+
+        'eval-or-plain': [
+            (r'[&!]?==', Punctuation, 'plain'),
+            (r'([&!]?[=~])(' + _dot + r'*\n)',
+             bygroups(Punctuation, using(ScalaLexer)),
+             'root'),
+            default('plain'),
+        ],
+
+        'content': [
+            include('css'),
+            (r'%[\w:-]+', Name.Tag, 'tag'),
+            (r'!!!' + _dot + r'*\n', Name.Namespace, '#pop'),
+            (r'(/)(\[' + _dot + r'*?\])(' + _dot + r'*\n)',
+             bygroups(Comment, Comment.Special, Comment),
+             '#pop'),
+            (r'/' + _dot + r'*\n', _starts_block(Comment, 'html-comment-block'),
+             '#pop'),
+            (r'-#' + _dot + r'*\n', _starts_block(Comment.Preproc,
+                                                  'scaml-comment-block'), '#pop'),
+            (r'(-@\s*)(import)?(' + _dot + r'*\n)',
+             bygroups(Punctuation, Keyword, using(ScalaLexer)),
+             '#pop'),
+            (r'(-)(' + _dot + r'*\n)',
+             bygroups(Punctuation, using(ScalaLexer)),
+             '#pop'),
+            (r':' + _dot + r'*\n', _starts_block(Name.Decorator, 'filter-block'),
+             '#pop'),
+            include('eval-or-plain'),
+        ],
+
+        'tag': [
+            include('css'),
+            (r'\{(,\n|' + _dot + r')*?\}', using(ScalaLexer)),
+            (r'\[' + _dot + r'*?\]', using(ScalaLexer)),
+            (r'\(', Text, 'html-attributes'),
+            (r'/[ \t]*\n', Punctuation, '#pop:2'),
+            (r'[<>]{1,2}(?=[ \t=])', Punctuation),
+            include('eval-or-plain'),
+        ],
+
+        'plain': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text),
+            (r'(#\{)(' + _dot + r'*?)(\})',
+             bygroups(String.Interpol, using(ScalaLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+
+        'html-attributes': [
+            (r'\s+', Text),
+            (r'[\w:-]+[ \t]*=', Name.Attribute, 'html-attribute-value'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'\)', Text, '#pop'),
+        ],
+
+        'html-attribute-value': [
+            (r'[ \t]+', Text),
+            (r'\w+', Name.Variable, '#pop'),
+            (r'@\w+', Name.Variable.Instance, '#pop'),
+            (r'\$\w+', Name.Variable.Global, '#pop'),
+            (r"'(\\\\|\\[^\\]|[^'\\\n])*'", String, '#pop'),
+            (r'"(\\\\|\\[^\\]|[^"\\\n])*"', String, '#pop'),
+        ],
+
+        'html-comment-block': [
+            (_dot + '+', Comment),
+            (r'\n', Text, 'root'),
+        ],
+
+        'scaml-comment-block': [
+            (_dot + '+', Comment.Preproc),
+            (r'\n', Text, 'root'),
+        ],
+
+        'filter-block': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Name.Decorator),
+            (r'(#\{)(' + _dot + r'*?)(\})',
+             bygroups(String.Interpol, using(ScalaLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+    }
+
+
+class PugLexer(ExtendedRegexLexer):
+    """
+    For Pug markup.
+    Pug is a variant of Scaml, see:
+    http://scalate.fusesource.org/documentation/scaml-reference.html
+    """
+
+    name = 'Pug'
+    aliases = ['pug', 'jade']
+    filenames = ['*.pug', '*.jade']
+    mimetypes = ['text/x-pug', 'text/x-jade']
+    url = 'https://pugjs.org'
+    version_added = '1.4'
+
+    flags = re.IGNORECASE
+    _dot = r'.'
+
+    tokens = {
+        'root': [
+            (r'[ \t]*\n', Text),
+            (r'[ \t]*', _indentation),
+        ],
+
+        'css': [
+            (r'\.[\w:-]+', Name.Class, 'tag'),
+            (r'\#[\w:-]+', Name.Function, 'tag'),
+        ],
+
+        'eval-or-plain': [
+            (r'[&!]?==', Punctuation, 'plain'),
+            (r'([&!]?[=~])(' + _dot + r'*\n)',
+             bygroups(Punctuation, using(ScalaLexer)),  'root'),
+            default('plain'),
+        ],
+
+        'content': [
+            include('css'),
+            (r'!!!' + _dot + r'*\n', Name.Namespace, '#pop'),
+            (r'(/)(\[' + _dot + r'*?\])(' + _dot + r'*\n)',
+             bygroups(Comment, Comment.Special, Comment),
+             '#pop'),
+            (r'/' + _dot + r'*\n', _starts_block(Comment, 'html-comment-block'),
+             '#pop'),
+            (r'-#' + _dot + r'*\n', _starts_block(Comment.Preproc,
+                                                  'scaml-comment-block'), '#pop'),
+            (r'(-@\s*)(import)?(' + _dot + r'*\n)',
+             bygroups(Punctuation, Keyword, using(ScalaLexer)),
+             '#pop'),
+            (r'(-)(' + _dot + r'*\n)',
+             bygroups(Punctuation, using(ScalaLexer)),
+             '#pop'),
+            (r':' + _dot + r'*\n', _starts_block(Name.Decorator, 'filter-block'),
+             '#pop'),
+            (r'[\w:-]+', Name.Tag, 'tag'),
+            (r'\|', Text, 'eval-or-plain'),
+        ],
+
+        'tag': [
+            include('css'),
+            (r'\{(,\n|' + _dot + r')*?\}', using(ScalaLexer)),
+            (r'\[' + _dot + r'*?\]', using(ScalaLexer)),
+            (r'\(', Text, 'html-attributes'),
+            (r'/[ \t]*\n', Punctuation, '#pop:2'),
+            (r'[<>]{1,2}(?=[ \t=])', Punctuation),
+            include('eval-or-plain'),
+        ],
+
+        'plain': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text),
+            (r'(#\{)(' + _dot + r'*?)(\})',
+             bygroups(String.Interpol, using(ScalaLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+
+        'html-attributes': [
+            (r'\s+', Text),
+            (r'[\w:-]+[ \t]*=', Name.Attribute, 'html-attribute-value'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'\)', Text, '#pop'),
+        ],
+
+        'html-attribute-value': [
+            (r'[ \t]+', Text),
+            (r'\w+', Name.Variable, '#pop'),
+            (r'@\w+', Name.Variable.Instance, '#pop'),
+            (r'\$\w+', Name.Variable.Global, '#pop'),
+            (r"'(\\\\|\\[^\\]|[^'\\\n])*'", String, '#pop'),
+            (r'"(\\\\|\\[^\\]|[^"\\\n])*"', String, '#pop'),
+        ],
+
+        'html-comment-block': [
+            (_dot + '+', Comment),
+            (r'\n', Text, 'root'),
+        ],
+
+        'scaml-comment-block': [
+            (_dot + '+', Comment.Preproc),
+            (r'\n', Text, 'root'),
+        ],
+
+        'filter-block': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Name.Decorator),
+            (r'(#\{)(' + _dot + r'*?)(\})',
+             bygroups(String.Interpol, using(ScalaLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+    }
+JadeLexer = PugLexer  # compat
+
+
+class UrlEncodedLexer(RegexLexer):
+    """
+    Lexer for urlencoded data
+    """
+
+    name = 'urlencoded'
+    aliases = ['urlencoded']
+    mimetypes = ['application/x-www-form-urlencoded']
+    url = 'https://en.wikipedia.org/wiki/Percent-encoding'
+    version_added = '2.16'
+
+    tokens = {
+        'root': [
+            ('([^&=]*)(=)([^=&]*)(&?)', bygroups(Name.Tag, Operator, String, Punctuation)),
+        ],
+    }
+    
+
+class VueLexer(HtmlLexer):
+    """
+    For Vue Single-File Component.
+    """
+
+    name = 'Vue'
+    url = 'https://vuejs.org/api/sfc-spec.html'
+    aliases = ['vue']
+    filenames = ['*.vue']
+    mimetypes = []
+    version_added = '2.19'
+
+    flags = re.IGNORECASE | re.DOTALL
+    tokens = {
+        'root': [
+            (r'(\{\{)(.*?)(\}\})', bygroups(Comment.Preproc,
+             using(JavascriptLexer), Comment.Preproc)),
+            ('[^<&{]+', Text),
+            inherit,
+        ],
+        'tag': [
+            (r'\s+', Text),
+            (r'((?:[@:]|v-)(?:[.\w:-]|\[[^\]]*?\])+\s*)(=)(\s*)',
+             bygroups(using(this, state=['name']), Operator, Text),
+             'attr-directive'),
+            (r'([\w:-]+\s*)(=)(\s*)', bygroups(Name.Attribute, Operator, Text),
+             'attr'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'(/?)(\s*)(>)', bygroups(Punctuation, Text, Punctuation), '#pop'),
+        ],
+        'name': [
+            (r'[\w-]+', Name.Attribute),
+            (r'[:@.]', Punctuation),
+            (r'(\[)([^\]]*?)(\])', bygroups(Comment.Preproc,
+             using(JavascriptLexer), Comment.Preproc)),
+        ],
+        'attr-directive': [
+            (r'(["\'])(.*?)(\1)', bygroups(String,
+             using(JavascriptLexer), String), '#pop'),
+            (r'[^\s>]+', using(JavascriptLexer), '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/idl.py b/.venv/Lib/site-packages/pygments/lexers/idl.py
new file mode 100644 (file)
index 0000000..21b8d31
--- /dev/null
@@ -0,0 +1,284 @@
+"""
+    pygments.lexers.idl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for IDL.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, words, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, Number, \
+    String, Whitespace
+
+__all__ = ['IDLLexer']
+
+
+class IDLLexer(RegexLexer):
+    """
+    Pygments Lexer for IDL (Interactive Data Language).
+    """
+    name = 'IDL'
+    url = 'https://www.l3harrisgeospatial.com/Software-Technology/IDL'
+    aliases = ['idl']
+    filenames = ['*.pro']
+    mimetypes = ['text/idl']
+    version_added = '1.6'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    _RESERVED = (
+        'and', 'begin', 'break', 'case', 'common', 'compile_opt',
+        'continue', 'do', 'else', 'end', 'endcase', 'endelse',
+        'endfor', 'endforeach', 'endif', 'endrep', 'endswitch',
+        'endwhile', 'eq', 'for', 'foreach', 'forward_function',
+        'function', 'ge', 'goto', 'gt', 'if', 'inherits', 'le',
+        'lt', 'mod', 'ne', 'not', 'of', 'on_ioerror', 'or', 'pro',
+        'repeat', 'switch', 'then', 'until', 'while', 'xor')
+    """Reserved words from: http://www.exelisvis.com/docs/reswords.html"""
+
+    _BUILTIN_LIB = (
+        'abs', 'acos', 'adapt_hist_equal', 'alog', 'alog10',
+        'amoeba', 'annotate', 'app_user_dir', 'app_user_dir_query',
+        'arg_present', 'array_equal', 'array_indices', 'arrow',
+        'ascii_template', 'asin', 'assoc', 'atan', 'axis',
+        'a_correlate', 'bandpass_filter', 'bandreject_filter',
+        'barplot', 'bar_plot', 'beseli', 'beselj', 'beselk',
+        'besely', 'beta', 'bilinear', 'binary_template', 'bindgen',
+        'binomial', 'bin_date', 'bit_ffs', 'bit_population',
+        'blas_axpy', 'blk_con', 'box_cursor', 'breakpoint',
+        'broyden', 'butterworth', 'bytarr', 'byte', 'byteorder',
+        'bytscl', 'caldat', 'calendar', 'call_external',
+        'call_function', 'call_method', 'call_procedure', 'canny',
+        'catch', 'cd', r'cdf_\w*', 'ceil', 'chebyshev',
+        'check_math',
+        'chisqr_cvf', 'chisqr_pdf', 'choldc', 'cholsol', 'cindgen',
+        'cir_3pnt', 'close', 'cluster', 'cluster_tree', 'clust_wts',
+        'cmyk_convert', 'colorbar', 'colorize_sample',
+        'colormap_applicable', 'colormap_gradient',
+        'colormap_rotation', 'colortable', 'color_convert',
+        'color_exchange', 'color_quan', 'color_range_map', 'comfit',
+        'command_line_args', 'complex', 'complexarr', 'complexround',
+        'compute_mesh_normals', 'cond', 'congrid', 'conj',
+        'constrained_min', 'contour', 'convert_coord', 'convol',
+        'convol_fft', 'coord2to3', 'copy_lun', 'correlate', 'cos',
+        'cosh', 'cpu', 'cramer', 'create_cursor', 'create_struct',
+        'create_view', 'crossp', 'crvlength', 'cti_test',
+        'ct_luminance', 'cursor', 'curvefit', 'cvttobm', 'cv_coord',
+        'cw_animate', 'cw_animate_getp', 'cw_animate_load',
+        'cw_animate_run', 'cw_arcball', 'cw_bgroup', 'cw_clr_index',
+        'cw_colorsel', 'cw_defroi', 'cw_field', 'cw_filesel',
+        'cw_form', 'cw_fslider', 'cw_light_editor',
+        'cw_light_editor_get', 'cw_light_editor_set', 'cw_orient',
+        'cw_palette_editor', 'cw_palette_editor_get',
+        'cw_palette_editor_set', 'cw_pdmenu', 'cw_rgbslider',
+        'cw_tmpl', 'cw_zoom', 'c_correlate', 'dblarr', 'db_exists',
+        'dcindgen', 'dcomplex', 'dcomplexarr', 'define_key',
+        'define_msgblk', 'define_msgblk_from_file', 'defroi',
+        'defsysv', 'delvar', 'dendrogram', 'dendro_plot', 'deriv',
+        'derivsig', 'determ', 'device', 'dfpmin', 'diag_matrix',
+        'dialog_dbconnect', 'dialog_message', 'dialog_pickfile',
+        'dialog_printersetup', 'dialog_printjob',
+        'dialog_read_image', 'dialog_write_image', 'digital_filter',
+        'dilate', 'dindgen', 'dissolve', 'dist', 'distance_measure',
+        'dlm_load', 'dlm_register', 'doc_library', 'double',
+        'draw_roi', 'edge_dog', 'efont', 'eigenql', 'eigenvec',
+        'ellipse', 'elmhes', 'emboss', 'empty', 'enable_sysrtn',
+        'eof', r'eos_\w*', 'erase', 'erf', 'erfc', 'erfcx',
+        'erode', 'errorplot', 'errplot', 'estimator_filter',
+        'execute', 'exit', 'exp', 'expand', 'expand_path', 'expint',
+        'extrac', 'extract_slice', 'factorial', 'fft', 'filepath',
+        'file_basename', 'file_chmod', 'file_copy', 'file_delete',
+        'file_dirname', 'file_expand_path', 'file_info',
+        'file_lines', 'file_link', 'file_mkdir', 'file_move',
+        'file_poll_input', 'file_readlink', 'file_same',
+        'file_search', 'file_test', 'file_which', 'findgen',
+        'finite', 'fix', 'flick', 'float', 'floor', 'flow3',
+        'fltarr', 'flush', 'format_axis_values', 'free_lun',
+        'fstat', 'fulstr', 'funct', 'fv_test', 'fx_root',
+        'fz_roots', 'f_cvf', 'f_pdf', 'gamma', 'gamma_ct',
+        'gauss2dfit', 'gaussfit', 'gaussian_function', 'gaussint',
+        'gauss_cvf', 'gauss_pdf', 'gauss_smooth', 'getenv',
+        'getwindows', 'get_drive_list', 'get_dxf_objects',
+        'get_kbrd', 'get_login_info', 'get_lun', 'get_screen_size',
+        'greg2jul', r'grib_\w*', 'grid3', 'griddata',
+        'grid_input', 'grid_tps', 'gs_iter',
+        r'h5[adfgirst]_\w*', 'h5_browser', 'h5_close',
+        'h5_create', 'h5_get_libversion', 'h5_open', 'h5_parse',
+        'hanning', 'hash', r'hdf_\w*', 'heap_free',
+        'heap_gc', 'heap_nosave', 'heap_refcount', 'heap_save',
+        'help', 'hilbert', 'histogram', 'hist_2d', 'hist_equal',
+        'hls', 'hough', 'hqr', 'hsv', 'h_eq_ct', 'h_eq_int',
+        'i18n_multibytetoutf8', 'i18n_multibytetowidechar',
+        'i18n_utf8tomultibyte', 'i18n_widechartomultibyte',
+        'ibeta', 'icontour', 'iconvertcoord', 'idelete', 'identity',
+        'idlexbr_assistant', 'idlitsys_createtool', 'idl_base64',
+        'idl_validname', 'iellipse', 'igamma', 'igetcurrent',
+        'igetdata', 'igetid', 'igetproperty', 'iimage', 'image',
+        'image_cont', 'image_statistics', 'imaginary', 'imap',
+        'indgen', 'intarr', 'interpol', 'interpolate',
+        'interval_volume', 'int_2d', 'int_3d', 'int_tabulated',
+        'invert', 'ioctl', 'iopen', 'iplot', 'ipolygon',
+        'ipolyline', 'iputdata', 'iregister', 'ireset', 'iresolve',
+        'irotate', 'ir_filter', 'isa', 'isave', 'iscale',
+        'isetcurrent', 'isetproperty', 'ishft', 'isocontour',
+        'isosurface', 'isurface', 'itext', 'itranslate', 'ivector',
+        'ivolume', 'izoom', 'i_beta', 'journal', 'json_parse',
+        'json_serialize', 'jul2greg', 'julday', 'keyword_set',
+        'krig2d', 'kurtosis', 'kw_test', 'l64indgen', 'label_date',
+        'label_region', 'ladfit', 'laguerre', 'laplacian',
+        'la_choldc', 'la_cholmprove', 'la_cholsol', 'la_determ',
+        'la_eigenproblem', 'la_eigenql', 'la_eigenvec', 'la_elmhes',
+        'la_gm_linear_model', 'la_hqr', 'la_invert',
+        'la_least_squares', 'la_least_square_equality',
+        'la_linear_equation', 'la_ludc', 'la_lumprove', 'la_lusol',
+        'la_svd', 'la_tridc', 'la_trimprove', 'la_triql',
+        'la_trired', 'la_trisol', 'least_squares_filter', 'leefilt',
+        'legend', 'legendre', 'linbcg', 'lindgen', 'linfit',
+        'linkimage', 'list', 'll_arc_distance', 'lmfit', 'lmgr',
+        'lngamma', 'lnp_test', 'loadct', 'locale_get',
+        'logical_and', 'logical_or', 'logical_true', 'lon64arr',
+        'lonarr', 'long', 'long64', 'lsode', 'ludc', 'lumprove',
+        'lusol', 'lu_complex', 'machar', 'make_array', 'make_dll',
+        'make_rt', 'map', 'mapcontinents', 'mapgrid', 'map_2points',
+        'map_continents', 'map_grid', 'map_image', 'map_patch',
+        'map_proj_forward', 'map_proj_image', 'map_proj_info',
+        'map_proj_init', 'map_proj_inverse', 'map_set',
+        'matrix_multiply', 'matrix_power', 'max', 'md_test',
+        'mean', 'meanabsdev', 'mean_filter', 'median', 'memory',
+        'mesh_clip', 'mesh_decimate', 'mesh_issolid', 'mesh_merge',
+        'mesh_numtriangles', 'mesh_obj', 'mesh_smooth',
+        'mesh_surfacearea', 'mesh_validate', 'mesh_volume',
+        'message', 'min', 'min_curve_surf', 'mk_html_help',
+        'modifyct', 'moment', 'morph_close', 'morph_distance',
+        'morph_gradient', 'morph_hitormiss', 'morph_open',
+        'morph_thin', 'morph_tophat', 'multi', 'm_correlate',
+        r'ncdf_\w*', 'newton', 'noise_hurl', 'noise_pick',
+        'noise_scatter', 'noise_slur', 'norm', 'n_elements',
+        'n_params', 'n_tags', 'objarr', 'obj_class', 'obj_destroy',
+        'obj_hasmethod', 'obj_isa', 'obj_new', 'obj_valid',
+        'online_help', 'on_error', 'open', 'oplot', 'oploterr',
+        'parse_url', 'particle_trace', 'path_cache', 'path_sep',
+        'pcomp', 'plot', 'plot3d', 'ploterr', 'plots', 'plot_3dbox',
+        'plot_field', 'pnt_line', 'point_lun', 'polarplot',
+        'polar_contour', 'polar_surface', 'poly', 'polyfill',
+        'polyfillv', 'polygon', 'polyline', 'polyshade', 'polywarp',
+        'poly_2d', 'poly_area', 'poly_fit', 'popd', 'powell',
+        'pref_commit', 'pref_get', 'pref_set', 'prewitt', 'primes',
+        'print', 'printd', 'product', 'profile', 'profiler',
+        'profiles', 'project_vol', 'psafm', 'pseudo',
+        'ps_show_fonts', 'ptrarr', 'ptr_free', 'ptr_new',
+        'ptr_valid', 'pushd', 'p_correlate', 'qgrid3', 'qhull',
+        'qromb', 'qromo', 'qsimp', 'query_ascii', 'query_bmp',
+        'query_csv', 'query_dicom', 'query_gif', 'query_image',
+        'query_jpeg', 'query_jpeg2000', 'query_mrsid', 'query_pict',
+        'query_png', 'query_ppm', 'query_srf', 'query_tiff',
+        'query_wav', 'radon', 'randomn', 'randomu', 'ranks',
+        'rdpix', 'read', 'reads', 'readu', 'read_ascii',
+        'read_binary', 'read_bmp', 'read_csv', 'read_dicom',
+        'read_gif', 'read_image', 'read_interfile', 'read_jpeg',
+        'read_jpeg2000', 'read_mrsid', 'read_pict', 'read_png',
+        'read_ppm', 'read_spr', 'read_srf', 'read_sylk',
+        'read_tiff', 'read_wav', 'read_wave', 'read_x11_bitmap',
+        'read_xwd', 'real_part', 'rebin', 'recall_commands',
+        'recon3', 'reduce_colors', 'reform', 'region_grow',
+        'register_cursor', 'regress', 'replicate',
+        'replicate_inplace', 'resolve_all', 'resolve_routine',
+        'restore', 'retall', 'return', 'reverse', 'rk4', 'roberts',
+        'rot', 'rotate', 'round', 'routine_filepath',
+        'routine_info', 'rs_test', 'r_correlate', 'r_test',
+        'save', 'savgol', 'scale3', 'scale3d', 'scope_level',
+        'scope_traceback', 'scope_varfetch', 'scope_varname',
+        'search2d', 'search3d', 'sem_create', 'sem_delete',
+        'sem_lock', 'sem_release', 'setenv', 'set_plot',
+        'set_shading', 'sfit', 'shade_surf', 'shade_surf_irr',
+        'shade_volume', 'shift', 'shift_diff', 'shmdebug', 'shmmap',
+        'shmunmap', 'shmvar', 'show3', 'showfont', 'simplex', 'sin',
+        'sindgen', 'sinh', 'size', 'skewness', 'skip_lun',
+        'slicer3', 'slide_image', 'smooth', 'sobel', 'socket',
+        'sort', 'spawn', 'spher_harm', 'sph_4pnt', 'sph_scat',
+        'spline', 'spline_p', 'spl_init', 'spl_interp', 'sprsab',
+        'sprsax', 'sprsin', 'sprstp', 'sqrt', 'standardize',
+        'stddev', 'stop', 'strarr', 'strcmp', 'strcompress',
+        'streamline', 'stregex', 'stretch', 'string', 'strjoin',
+        'strlen', 'strlowcase', 'strmatch', 'strmessage', 'strmid',
+        'strpos', 'strput', 'strsplit', 'strtrim', 'struct_assign',
+        'struct_hide', 'strupcase', 'surface', 'surfr', 'svdc',
+        'svdfit', 'svsol', 'swap_endian', 'swap_endian_inplace',
+        'symbol', 'systime', 's_test', 't3d', 'tag_names', 'tan',
+        'tanh', 'tek_color', 'temporary', 'tetra_clip',
+        'tetra_surface', 'tetra_volume', 'text', 'thin', 'threed',
+        'timegen', 'time_test2', 'tm_test', 'total', 'trace',
+        'transpose', 'triangulate', 'trigrid', 'triql', 'trired',
+        'trisol', 'tri_surf', 'truncate_lun', 'ts_coef', 'ts_diff',
+        'ts_fcast', 'ts_smooth', 'tv', 'tvcrs', 'tvlct', 'tvrd',
+        'tvscl', 'typename', 't_cvt', 't_pdf', 'uindgen', 'uint',
+        'uintarr', 'ul64indgen', 'ulindgen', 'ulon64arr', 'ulonarr',
+        'ulong', 'ulong64', 'uniq', 'unsharp_mask', 'usersym',
+        'value_locate', 'variance', 'vector', 'vector_field', 'vel',
+        'velovect', 'vert_t3d', 'voigt', 'voronoi', 'voxel_proj',
+        'wait', 'warp_tri', 'watershed', 'wdelete', 'wf_draw',
+        'where', 'widget_base', 'widget_button', 'widget_combobox',
+        'widget_control', 'widget_displaycontextmen', 'widget_draw',
+        'widget_droplist', 'widget_event', 'widget_info',
+        'widget_label', 'widget_list', 'widget_propertysheet',
+        'widget_slider', 'widget_tab', 'widget_table',
+        'widget_text', 'widget_tree', 'widget_tree_move',
+        'widget_window', 'wiener_filter', 'window', 'writeu',
+        'write_bmp', 'write_csv', 'write_gif', 'write_image',
+        'write_jpeg', 'write_jpeg2000', 'write_nrif', 'write_pict',
+        'write_png', 'write_ppm', 'write_spr', 'write_srf',
+        'write_sylk', 'write_tiff', 'write_wav', 'write_wave',
+        'wset', 'wshow', 'wtn', 'wv_applet', 'wv_cwt',
+        'wv_cw_wavelet', 'wv_denoise', 'wv_dwt', 'wv_fn_coiflet',
+        'wv_fn_daubechies', 'wv_fn_gaussian', 'wv_fn_haar',
+        'wv_fn_morlet', 'wv_fn_paul', 'wv_fn_symlet',
+        'wv_import_data', 'wv_import_wavelet', 'wv_plot3d_wps',
+        'wv_plot_multires', 'wv_pwt', 'wv_tool_denoise',
+        'xbm_edit', 'xdisplayfile', 'xdxf', 'xfont',
+        'xinteranimate', 'xloadct', 'xmanager', 'xmng_tmpl',
+        'xmtool', 'xobjview', 'xobjview_rotate',
+        'xobjview_write_image', 'xpalette', 'xpcolor', 'xplot3d',
+        'xregistered', 'xroi', 'xsq_test', 'xsurface', 'xvaredit',
+        'xvolume', 'xvolume_rotate', 'xvolume_write_image',
+        'xyouts', 'zoom', 'zoom_24')
+    """Functions from: http://www.exelisvis.com/docs/routines-1.html"""
+
+    tokens = {
+        'root': [
+            (r'(^\s*)(;.*?)(\n)', bygroups(Whitespace, Comment.Single,
+                Whitespace)),
+            (words(_RESERVED, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(_BUILTIN_LIB, prefix=r'\b', suffix=r'\b'), Name.Builtin),
+            (r'\+=|-=|\^=|\*=|/=|#=|##=|<=|>=|=', Operator),
+            (r'\+\+|--|->|\+|-|##|#|\*|/|<|>|&&|\^|~|\|\|\?|:', Operator),
+            (r'\b(mod=|lt=|le=|eq=|ne=|ge=|gt=|not=|and=|or=|xor=)', Operator),
+            (r'\b(mod|lt|le|eq|ne|ge|gt|not|and|or|xor)\b', Operator),
+            (r'"[^\"]*"', String.Double),
+            (r"'[^\']*'", String.Single),
+            (r'\b[+\-]?([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)(D|E)?([+\-]?[0-9]+)?\b',
+             Number.Float),
+            (r'\b\'[+\-]?[0-9A-F]+\'X(U?(S?|L{1,2})|B)\b', Number.Hex),
+            (r'\b\'[+\-]?[0-7]+\'O(U?(S?|L{1,2})|B)\b', Number.Oct),
+            (r'\b[+\-]?[0-9]+U?L{1,2}\b', Number.Integer.Long),
+            (r'\b[+\-]?[0-9]+U?S?\b', Number.Integer),
+            (r'\b[+\-]?[0-9]+B\b', Number),
+            (r'[ \t]+', Whitespace),
+            (r'\n', Whitespace),
+            (r'.', Text),
+        ]
+    }
+
+    def analyse_text(text):
+        """endelse seems to be unique to IDL, endswitch is rare at least."""
+        result = 0
+
+        if 'endelse' in text:
+            result += 0.2
+        if 'endswitch' in text:
+            result += 0.01
+
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/igor.py b/.venv/Lib/site-packages/pygments/lexers/igor.py
new file mode 100644 (file)
index 0000000..136c5b8
--- /dev/null
@@ -0,0 +1,435 @@
+"""
+    pygments.lexers.igor
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Igor Pro.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Keyword, Name, String, Whitespace
+
+__all__ = ['IgorLexer']
+
+
+class IgorLexer(RegexLexer):
+    """
+    Pygments Lexer for Igor Pro procedure files (.ipf).
+    """
+
+    name = 'Igor'
+    aliases = ['igor', 'igorpro']
+    filenames = ['*.ipf']
+    mimetypes = ['text/ipf']
+    url = 'http://www.wavemetrics.com'
+    version_added = '2.0'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    flowControl = (
+        'if', 'else', 'elseif', 'endif', 'for', 'endfor', 'strswitch', 'switch',
+        'case', 'default', 'endswitch', 'do', 'while', 'try', 'catch', 'endtry',
+        'break', 'continue', 'return', 'AbortOnRTE', 'AbortOnValue'
+    )
+    types = (
+        'variable', 'string', 'constant', 'strconstant', 'NVAR', 'SVAR', 'WAVE',
+        'STRUCT', 'dfref', 'funcref', 'char', 'uchar', 'int16', 'uint16', 'int32',
+        'uint32', 'int64', 'uint64', 'float', 'double', 'int'
+    )
+    keywords = (
+        'override', 'ThreadSafe', 'MultiThread', 'static',  'Proc',
+        'Picture', 'Prompt', 'DoPrompt', 'macro', 'window', 'function', 'end',
+        'Structure', 'EndStructure', 'EndMacro', 'Menu', 'SubMenu'
+    )
+    operations = (
+        'Abort', 'AddFIFOData', 'AddFIFOVectData', 'AddMovieAudio', 'AddMovieFrame',
+        'AddWavesToBoxPlot', 'AddWavesToViolinPlot', 'AdoptFiles', 'APMath', 'Append',
+        'AppendBoxPlot', 'AppendImage', 'AppendLayoutObject', 'AppendMatrixContour',
+        'AppendText', 'AppendToGizmo', 'AppendToGraph', 'AppendToLayout',
+        'AppendToTable', 'AppendViolinPlot', 'AppendXYZContour', 'AutoPositionWindow',
+        'AxonTelegraphFindServers', 'BackgroundInfo', 'Beep', 'BezierToPolygon',
+        'BoundingBall', 'BoxSmooth', 'BrowseURL', 'BuildMenu', 'Button', 'cd', 'Chart',
+        'CheckBox', 'CheckDisplayed', 'ChooseColor', 'Close', 'CloseHelp', 'CloseMovie',
+        'CloseProc', 'ColorScale', 'ColorTab2Wave', 'Concatenate', 'ControlBar',
+        'ControlInfo', 'ControlUpdate', 'ConvertGlobalStringTextEncoding', 'ConvexHull',
+        'Convolve', 'CopyDimLabels', 'CopyFile', 'CopyFolder', 'CopyScales', 'Correlate',
+        'CreateAliasShortcut', 'CreateBrowser', 'Cross', 'CtrlBackground', 'CtrlFIFO',
+        'CtrlNamedBackground', 'Cursor', 'CurveFit', 'CustomControl', 'CWT',
+        'DAQmx_AI_SetupReader', 'DAQmx_AO_SetOutputs', 'DAQmx_CTR_CountEdges',
+        'DAQmx_CTR_OutputPulse', 'DAQmx_CTR_Period', 'DAQmx_CTR_PulseWidth',
+        'DAQmx_DeviceInfo', 'DAQmx_DIO_Config', 'DAQmx_DIO_WriteNewData', 'DAQmx_Scan',
+        'DAQmx_WaveformGen', 'Debugger', 'DebuggerOptions', 'DefaultFont',
+        'DefaultGuiControls', 'DefaultGuiFont', 'DefaultTextEncoding', 'DefineGuide',
+        'DelayUpdate', 'DeleteAnnotations', 'DeleteFile', 'DeleteFolder', 'DeletePoints',
+        'Differentiate', 'dir', 'Display', 'DisplayHelpTopic', 'DisplayProcedure',
+        'DoAlert', 'DoIgorMenu', 'DoUpdate', 'DoWindow', 'DoXOPIdle', 'DPSS',
+        'DrawAction', 'DrawArc', 'DrawBezier', 'DrawLine', 'DrawOval', 'DrawPICT',
+        'DrawPoly', 'DrawRect', 'DrawRRect', 'DrawText', 'DrawUserShape', 'DSPDetrend',
+        'DSPPeriodogram', 'Duplicate', 'DuplicateDataFolder', 'DWT', 'EdgeStats', 'Edit',
+        'ErrorBars', 'EstimatePeakSizes', 'Execute', 'ExecuteScriptText',
+        'ExperimentInfo', 'ExperimentModified', 'ExportGizmo', 'Extract',
+        'FastGaussTransform', 'FastOp', 'FBinRead', 'FBinWrite', 'FCALL_CallFunction',
+        'FCALL_FreeLibrary', 'FCALL_GetFunctionList', 'FCALL_GetParamTypeList',
+        'FCALL_LoadLibrary', 'FCALL_Version', 'FFT', 'FGetPos', 'FIFOStatus',
+        'FIFO2Wave', 'FilterFIR', 'FilterIIR', 'FindAPeak', 'FindContour',
+        'FindDuplicates', 'FindLevel', 'FindLevels', 'FindPeak', 'FindPointsInPoly',
+        'FindRoots', 'FindSequence', 'FindValue', 'FMaxFlat', 'FPClustering', 'fprintf',
+        'FReadLine', 'FSetPos', 'FStatus', 'FTPCreateDirectory', 'FTPDelete',
+        'FTPDownload', 'FTPUpload', 'FuncFit', 'FuncFitMD', 'GBLoadWave', 'GetAxis',
+        'GetCamera', 'GetFileFolderInfo', 'GetGizmo', 'GetLastUserMenuInfo',
+        'GetMarquee', 'GetMouse', 'GetSelection', 'GetWindow', 'GISCreateVectorLayer',
+        'GISGetRasterInfo', 'GISGetRegisteredFileInfo', 'GISGetVectorLayerInfo',
+        'GISLoadRasterData', 'GISLoadVectorData', 'GISRasterizeVectorData',
+        'GISRegisterFile', 'GISTransformCoords', 'GISUnRegisterFile',
+        'GISWriteFieldData', 'GISWriteGeometryData', 'GISWriteRaster',
+        'GPIBReadBinaryWave2', 'GPIBReadBinary2', 'GPIBReadWave2', 'GPIBRead2',
+        'GPIBWriteBinaryWave2', 'GPIBWriteBinary2', 'GPIBWriteWave2', 'GPIBWrite2',
+        'GPIB2', 'GraphNormal', 'GraphWaveDraw', 'GraphWaveEdit', 'Grep', 'GroupBox',
+        'Hanning', 'HCluster', 'HDFInfo', 'HDFReadImage', 'HDFReadSDS', 'HDFReadVset',
+        'HDF5CloseFile', 'HDF5CloseGroup', 'HDF5Control', 'HDF5CreateFile',
+        'HDF5CreateGroup', 'HDF5CreateLink', 'HDF5DimensionScale', 'HDF5Dump',
+        'HDF5DumpErrors', 'HDF5FlushFile', 'HDF5ListAttributes', 'HDF5ListGroup',
+        'HDF5LoadData', 'HDF5LoadGroup', 'HDF5LoadImage', 'HDF5OpenFile',
+         'HDF5OpenGroup', 'HDF5SaveData', 'HDF5SaveGroup', 'HDF5SaveImage',
+         'HDF5UnlinkObject', 'HideIgorMenus', 'HideInfo', 'HideProcedures', 'HideTools',
+         'HilbertTransform', 'Histogram', 'ICA', 'IFFT', 'ImageAnalyzeParticles',
+         'ImageBlend', 'ImageBoundaryToMask', 'ImageComposite', 'ImageEdgeDetection',
+         'ImageFileInfo', 'ImageFilter', 'ImageFocus', 'ImageFromXYZ',
+         'ImageGenerateROIMask', 'ImageGLCM', 'ImageHistModification', 'ImageHistogram',
+         'ImageInterpolate', 'ImageLineProfile', 'ImageLoad', 'ImageMorphology',
+         'ImageRegistration', 'ImageRemoveBackground', 'ImageRestore', 'ImageRotate',
+         'ImageSave', 'ImageSeedFill', 'ImageSkeleton3d', 'ImageSnake', 'ImageStats',
+         'ImageThreshold', 'ImageTransform', 'ImageUnwrapPhase', 'ImageWindow',
+         'IndexSort', 'InsertPoints', 'InstantFrequency', 'Integrate', 'IntegrateODE',
+         'Integrate2D', 'Interpolate2', 'Interpolate3D', 'Interp3DPath', 'ITCCloseAll2',
+         'ITCCloseDevice2', 'ITCConfigAllChannels2', 'ITCConfigChannelReset2',
+         'ITCConfigChannelUpload2', 'ITCConfigChannel2', 'ITCFIFOAvailableAll2',
+         'ITCFIFOAvailable2', 'ITCGetAllChannelsConfig2', 'ITCGetChannelConfig2',
+         'ITCGetCurrentDevice2', 'ITCGetDeviceInfo2', 'ITCGetDevices2',
+         'ITCGetErrorString2', 'ITCGetSerialNumber2', 'ITCGetState2', 'ITCGetVersions2',
+         'ITCInitialize2', 'ITCOpenDevice2', 'ITCReadADC2', 'ITCReadDigital2',
+         'ITCReadTimer2', 'ITCSelectDevice2', 'ITCSetDAC2', 'ITCSetGlobals2',
+         'ITCSetModes2', 'ITCSetState2', 'ITCStartAcq2', 'ITCStopAcq2',
+         'ITCUpdateFIFOPositionAll2', 'ITCUpdateFIFOPosition2', 'ITCWriteDigital2',
+         'JCAMPLoadWave', 'JointHistogram', 'JSONXOP_AddTree', 'JSONXOP_AddValue',
+         'JSONXOP_Dump', 'JSONXOP_GetArraySize', 'JSONXOP_GetKeys',
+         'JSONXOP_GetMaxArraySize', 'JSONXOP_GetType', 'JSONXOP_GetValue', 'JSONXOP_New',
+         'JSONXOP_Parse', 'JSONXOP_Release', 'JSONXOP_Remove', 'JSONXOP_Version',
+         'KillBackground', 'KillControl', 'KillDataFolder', 'KillFIFO', 'KillFreeAxis',
+         'KillPath', 'KillPICTs', 'KillStrings', 'KillVariables', 'KillWaves',
+         'KillWindow', 'KMeans', 'Label', 'Layout', 'LayoutPageAction',
+         'LayoutSlideShow', 'Legend', 'LinearFeedbackShiftRegister', 'ListBox',
+         'LoadData', 'LoadPackagePreferences', 'LoadPICT', 'LoadWave', 'Loess',
+         'LombPeriodogram', 'Make', 'MakeIndex', 'MarkPerfTestTime', 'MatrixBalance',
+         'MatrixConvolve', 'MatrixCorr', 'MatrixEigenV', 'MatrixFactor', 'MatrixFilter',
+         'MatrixGaussJ', 'MatrixGLM', 'MatrixInverse', 'MatrixLinearSolve',
+         'MatrixLinearSolveTD', 'MatrixLLS', 'MatrixLUBkSub', 'MatrixLUD', 'MatrixLUDTD',
+         'MatrixMultiply', 'MatrixMultiplyAdd', 'MatrixOP', 'MatrixReverseBalance',
+         'MatrixSchur', 'MatrixSolve', 'MatrixSparse', 'MatrixSVBkSub', 'MatrixSVD',
+         'MatrixTranspose', 'MCC_FindServers', 'MeasureStyledText',
+         'MFR_CheckForNewBricklets', 'MFR_CloseResultFile', 'MFR_CreateOverviewTable',
+         'MFR_GetBrickletCount', 'MFR_GetBrickletData', 'MFR_GetBrickletDeployData',
+         'MFR_GetBrickletMetaData', 'MFR_GetBrickletRawData', 'MFR_GetReportTemplate',
+         'MFR_GetResultFileMetaData', 'MFR_GetResultFileName',
+         'MFR_GetVernissageVersion', 'MFR_GetVersion', 'MFR_GetXOPErrorMessage',
+         'MFR_OpenResultFile', 'MLLoadWave', 'Modify', 'ModifyBoxPlot', 'ModifyBrowser',
+         'ModifyCamera', 'ModifyContour', 'ModifyControl', 'ModifyControlList',
+         'ModifyFreeAxis', 'ModifyGizmo', 'ModifyGraph', 'ModifyImage', 'ModifyLayout',
+         'ModifyPanel', 'ModifyProcedure', 'ModifyTable', 'ModifyViolinPlot',
+         'ModifyWaterfall', 'MoveDataFolder', 'MoveFile', 'MoveFolder', 'MoveString',
+         'MoveSubwindow', 'MoveVariable', 'MoveWave', 'MoveWindow', 'MultiTaperPSD',
+         'MultiThreadingControl', 'NC_CloseFile', 'NC_DumpErrors', 'NC_Inquire',
+         'NC_ListAttributes', 'NC_ListObjects', 'NC_LoadData', 'NC_OpenFile',
+         'NeuralNetworkRun', 'NeuralNetworkTrain', 'NewCamera', 'NewDataFolder',
+         'NewFIFO', 'NewFIFOChan', 'NewFreeAxis', 'NewGizmo', 'NewImage', 'NewLayout',
+         'NewMovie', 'NewNotebook', 'NewPanel', 'NewPath', 'NewWaterfall', 'NILoadWave',
+         'NI4882', 'Note', 'Notebook', 'NotebookAction', 'Open', 'OpenHelp',
+         'OpenNotebook', 'Optimize', 'ParseOperationTemplate', 'PathInfo',
+         'PauseForUser', 'PauseUpdate', 'PCA', 'PlayMovie', 'PlayMovieAction',
+         'PlaySound', 'PolygonOp', 'PopupContextualMenu', 'PopupMenu', 'Preferences',
+         'PrimeFactors', 'Print', 'printf', 'PrintGraphs', 'PrintLayout',
+         'PrintNotebook', 'PrintSettings', 'PrintTable', 'Project', 'PulseStats',
+         'PutScrapText', 'pwd', 'Quit', 'RatioFromNumber', 'Redimension', 'Remez',
+         'Remove', 'RemoveContour', 'RemoveFromGizmo', 'RemoveFromGraph',
+         'RemoveFromLayout', 'RemoveFromTable', 'RemoveImage', 'RemoveLayoutObjects',
+         'RemovePath', 'Rename', 'RenameDataFolder', 'RenamePath', 'RenamePICT',
+         'RenameWindow', 'ReorderImages', 'ReorderTraces', 'ReplaceText', 'ReplaceWave',
+         'Resample', 'ResumeUpdate', 'Reverse', 'Rotate', 'Save', 'SaveData',
+         'SaveExperiment', 'SaveGizmoCopy', 'SaveGraphCopy', 'SaveNotebook',
+         'SavePackagePreferences', 'SavePICT', 'SaveTableCopy', 'SetActiveSubwindow',
+         'SetAxis', 'SetBackground', 'SetDashPattern', 'SetDataFolder', 'SetDimLabel',
+         'SetDrawEnv', 'SetDrawLayer', 'SetFileFolderInfo', 'SetFormula',
+         'SetIdlePeriod', 'SetIgorHook', 'SetIgorMenuMode', 'SetIgorOption',
+         'SetMarquee', 'SetProcessSleep', 'SetRandomSeed', 'SetScale', 'SetVariable',
+         'SetWaveLock', 'SetWaveTextEncoding', 'SetWindow', 'ShowIgorMenus', 'ShowInfo',
+         'ShowTools', 'Silent', 'Sleep', 'Slider', 'Smooth', 'SmoothCustom', 'Sort',
+         'SortColumns', 'SoundInRecord', 'SoundInSet', 'SoundInStartChart',
+         'SoundInStatus', 'SoundInStopChart', 'SoundLoadWave', 'SoundSaveWave',
+         'SphericalInterpolate', 'SphericalTriangulate', 'SplitString', 'SplitWave',
+         'sprintf', 'SQLHighLevelOp', 'sscanf', 'Stack', 'StackWindows',
+         'StatsAngularDistanceTest', 'StatsANOVA1Test', 'StatsANOVA2NRTest',
+         'StatsANOVA2RMTest', 'StatsANOVA2Test', 'StatsChiTest',
+         'StatsCircularCorrelationTest', 'StatsCircularMeans', 'StatsCircularMoments',
+         'StatsCircularTwoSampleTest', 'StatsCochranTest', 'StatsContingencyTable',
+         'StatsDIPTest', 'StatsDunnettTest', 'StatsFriedmanTest', 'StatsFTest',
+         'StatsHodgesAjneTest', 'StatsJBTest', 'StatsKDE', 'StatsKendallTauTest',
+         'StatsKSTest', 'StatsKWTest', 'StatsLinearCorrelationTest',
+         'StatsLinearRegression', 'StatsMultiCorrelationTest', 'StatsNPMCTest',
+         'StatsNPNominalSRTest', 'StatsQuantiles', 'StatsRankCorrelationTest',
+         'StatsResample', 'StatsSample', 'StatsScheffeTest', 'StatsShapiroWilkTest',
+         'StatsSignTest', 'StatsSRTest', 'StatsTTest', 'StatsTukeyTest',
+         'StatsVariancesTest', 'StatsWatsonUSquaredTest', 'StatsWatsonWilliamsTest',
+         'StatsWheelerWatsonTest', 'StatsWilcoxonRankTest', 'StatsWRCorrelationTest',
+         'STFT', 'StructFill', 'StructGet', 'StructPut', 'SumDimension', 'SumSeries',
+         'TabControl', 'Tag', 'TDMLoadData', 'TDMSaveData', 'TextBox', 'TextHistogram',
+         'Text2Bezier', 'ThreadGroupPutDF', 'ThreadStart', 'TickWavesFromAxis', 'Tile',
+         'TileWindows', 'TitleBox', 'ToCommandLine', 'ToolsGrid', 'Triangulate3d',
+         'TUFXOP_AcquireLock', 'TUFXOP_Clear', 'TUFXOP_GetStorage', 'TUFXOP_Init',
+         'TUFXOP_ReleaseLock', 'TUFXOP_RunningInMainThread', 'TUFXOP_Version', 'Unwrap',
+         'UnzipFile', 'URLRequest', 'ValDisplay', 'VDTClosePort2', 'VDTGetPortList2',
+         'VDTGetStatus2', 'VDTOpenPort2', 'VDTOperationsPort2', 'VDTReadBinaryWave2',
+         'VDTReadBinary2', 'VDTReadHexWave2', 'VDTReadHex2', 'VDTReadWave2', 'VDTRead2',
+         'VDTTerminalPort2', 'VDTWriteBinaryWave2', 'VDTWriteBinary2',
+         'VDTWriteHexWave2', 'VDTWriteHex2', 'VDTWriteWave2', 'VDTWrite2', 'VDT2',
+         'VISAControl', 'VISARead', 'VISAReadBinary', 'VISAReadBinaryWave',
+         'VISAReadWave', 'VISAWrite', 'VISAWriteBinary', 'VISAWriteBinaryWave',
+         'VISAWriteWave', 'WaveMeanStdv', 'WaveStats', 'WaveTracking', 'WaveTransform',
+         'wfprintf', 'WignerTransform', 'WindowFunction', 'XLLoadWave'
+    )
+    functions = (
+        'abs', 'acos', 'acosh', 'AddListItem', 'AiryA', 'AiryAD', 'AiryB', 'AiryBD',
+         'alog', 'AnnotationInfo', 'AnnotationList', 'area', 'areaXY', 'asin', 'asinh',
+         'atan', 'atanh', 'atan2', 'AxisInfo', 'AxisLabel', 'AxisList',
+         'AxisValFromPixel', 'AxonTelegraphAGetDataNum', 'AxonTelegraphAGetDataString',
+         'AxonTelegraphAGetDataStruct', 'AxonTelegraphGetDataNum',
+         'AxonTelegraphGetDataString', 'AxonTelegraphGetDataStruct',
+         'AxonTelegraphGetTimeoutMs', 'AxonTelegraphSetTimeoutMs', 'Base64Decode',
+         'Base64Encode', 'Besseli', 'Besselj', 'Besselk', 'Bessely', 'beta', 'betai',
+         'BinarySearch', 'BinarySearchInterp', 'binomial', 'binomialln', 'binomialNoise',
+         'cabs', 'CaptureHistory', 'CaptureHistoryStart', 'ceil', 'centerOfMass',
+         'centerOfMassXY', 'cequal', 'char2num', 'chebyshev', 'chebyshevU', 'CheckName',
+         'ChildWindowList', 'CleanupName', 'cmplx', 'cmpstr', 'conj', 'ContourInfo',
+         'ContourNameList', 'ContourNameToWaveRef', 'ContourZ', 'ControlNameList',
+         'ConvertTextEncoding', 'cos', 'cosh', 'cosIntegral', 'cot', 'coth',
+         'CountObjects', 'CountObjectsDFR', 'cpowi', 'CreateDataObjectName',
+         'CreationDate', 'csc', 'csch', 'CsrInfo', 'CsrWave', 'CsrWaveRef', 'CsrXWave',
+         'CsrXWaveRef', 'CTabList', 'DataFolderDir', 'DataFolderExists',
+         'DataFolderList', 'DataFolderRefChanges', 'DataFolderRefsEqual',
+         'DataFolderRefStatus', 'date', 'datetime', 'DateToJulian', 'date2secs',
+         'Dawson', 'defined', 'deltax', 'digamma', 'dilogarithm', 'DimDelta',
+         'DimOffset', 'DimSize', 'ei', 'ellipticE', 'ellipticK', 'enoise', 'equalWaves',
+         'erf', 'erfc', 'erfcw', 'erfcx', 'exists', 'exp', 'expInt', 'expIntegralE1',
+         'expNoise', 'factorial', 'Faddeeva', 'fakedata', 'faverage', 'faverageXY',
+         'fDAQmx_AI_ChannelConfigs', 'fDAQmx_AI_GetReader', 'fDAQmx_AO_UpdateOutputs',
+         'fDAQmx_ConnectTerminals', 'fDAQmx_CTR_Finished', 'fDAQmx_CTR_IsFinished',
+         'fDAQmx_CTR_IsPulseFinished', 'fDAQmx_CTR_ReadCounter',
+         'fDAQmx_CTR_ReadWithOptions', 'fDAQmx_CTR_SetPulseFrequency',
+         'fDAQmx_CTR_Start', 'fDAQmx_DeviceNames', 'fDAQmx_DIO_Finished',
+         'fDAQmx_DIO_PortWidth', 'fDAQmx_DIO_Read', 'fDAQmx_DIO_Write',
+         'fDAQmx_DisconnectTerminals', 'fDAQmx_ErrorString', 'fDAQmx_ExternalCalDate',
+         'fDAQmx_NumAnalogInputs', 'fDAQmx_NumAnalogOutputs', 'fDAQmx_NumCounters',
+         'fDAQmx_NumDIOPorts', 'fDAQmx_ReadChan', 'fDAQmx_ReadNamedChan',
+         'fDAQmx_ResetDevice', 'fDAQmx_ScanGetAvailable', 'fDAQmx_ScanGetNextIndex',
+         'fDAQmx_ScanStart', 'fDAQmx_ScanStop', 'fDAQmx_ScanWait',
+         'fDAQmx_ScanWaitWithTimeout', 'fDAQmx_SelfCalDate', 'fDAQmx_SelfCalibration',
+         'fDAQmx_WaveformStart', 'fDAQmx_WaveformStop', 'fDAQmx_WF_IsFinished',
+         'fDAQmx_WF_WaitUntilFinished', 'fDAQmx_WriteChan', 'FetchURL', 'FindDimLabel',
+         'FindListItem', 'floor', 'FontList', 'FontSizeHeight', 'FontSizeStringWidth',
+         'FresnelCos', 'FresnelSin', 'FuncRefInfo', 'FunctionInfo', 'FunctionList',
+         'FunctionPath', 'gamma', 'gammaEuler', 'gammaInc', 'gammaNoise', 'gammln',
+         'gammp', 'gammq', 'Gauss', 'Gauss1D', 'Gauss2D', 'gcd', 'GeometricMean',
+         'GetBrowserLine', 'GetBrowserSelection', 'GetDataFolder', 'GetDataFolderDFR',
+         'GetDefaultFont', 'GetDefaultFontSize', 'GetDefaultFontStyle', 'GetDimLabel',
+         'GetEnvironmentVariable', 'GetErrMessage', 'GetFormula',
+         'GetIndependentModuleName', 'GetIndexedObjName', 'GetIndexedObjNameDFR',
+         'GetKeyState', 'GetRTErrMessage', 'GetRTError', 'GetRTLocation', 'GetRTLocInfo',
+         'GetRTStackInfo', 'GetScrapText', 'GetUserData', 'GetWavesDataFolder',
+         'GetWavesDataFolderDFR', 'GetWindowBrowserSelection', 'GISGetAllFileFormats',
+         'GISSRefsAreEqual', 'GizmoInfo', 'GizmoScale', 'gnoise', 'GrepList',
+         'GrepString', 'GuideInfo', 'GuideNameList', 'Hash', 'hcsr', 'HDF5AttributeInfo',
+         'HDF5DatasetInfo', 'HDF5LibraryInfo', 'HDF5LinkInfo', 'HDF5TypeInfo', 'hermite',
+         'hermiteGauss', 'HyperGNoise', 'HyperGPFQ', 'HyperG0F1', 'HyperG1F1',
+         'HyperG2F1', 'i', 'IgorInfo', 'IgorVersion', 'imag', 'ImageInfo',
+         'ImageNameList', 'ImageNameToWaveRef', 'IndependentModuleList', 'IndexedDir',
+         'IndexedFile', 'IndexToScale', 'Inf', 'Integrate1D', 'interp', 'Interp2D',
+         'Interp3D', 'inverseERF', 'inverseERFC', 'ItemsInList', 'JacobiCn', 'JacobiSn',
+         'JulianToDate', 'Laguerre', 'LaguerreA', 'LaguerreGauss', 'LambertW',
+         'LayoutInfo', 'leftx', 'LegendreA', 'limit', 'ListMatch', 'ListToTextWave',
+         'ListToWaveRefWave', 'ln', 'log', 'logNormalNoise', 'lorentzianNoise',
+         'LowerStr', 'MacroInfo', 'MacroList', 'MacroPath', 'magsqr', 'MandelbrotPoint',
+         'MarcumQ', 'MatrixCondition', 'MatrixDet', 'MatrixDot', 'MatrixRank',
+         'MatrixTrace', 'max', 'MCC_AutoBridgeBal', 'MCC_AutoFastComp',
+         'MCC_AutoPipetteOffset', 'MCC_AutoSlowComp', 'MCC_AutoWholeCellComp',
+         'MCC_GetBridgeBalEnable', 'MCC_GetBridgeBalResist', 'MCC_GetFastCompCap',
+         'MCC_GetFastCompTau', 'MCC_GetHolding', 'MCC_GetHoldingEnable', 'MCC_GetMode',
+         'MCC_GetNeutralizationCap', 'MCC_GetNeutralizationEnable',
+         'MCC_GetOscKillerEnable', 'MCC_GetPipetteOffset', 'MCC_GetPrimarySignalGain',
+         'MCC_GetPrimarySignalHPF', 'MCC_GetPrimarySignalLPF', 'MCC_GetRsCompBandwidth',
+         'MCC_GetRsCompCorrection', 'MCC_GetRsCompEnable', 'MCC_GetRsCompPrediction',
+         'MCC_GetSecondarySignalGain', 'MCC_GetSecondarySignalLPF', 'MCC_GetSlowCompCap',
+         'MCC_GetSlowCompTau', 'MCC_GetSlowCompTauX20Enable',
+        'MCC_GetSlowCurrentInjEnable', 'MCC_GetSlowCurrentInjLevel',
+        'MCC_GetSlowCurrentInjSetlTime', 'MCC_GetWholeCellCompCap',
+        'MCC_GetWholeCellCompEnable', 'MCC_GetWholeCellCompResist',
+        'MCC_SelectMultiClamp700B', 'MCC_SetBridgeBalEnable', 'MCC_SetBridgeBalResist',
+        'MCC_SetFastCompCap', 'MCC_SetFastCompTau', 'MCC_SetHolding',
+        'MCC_SetHoldingEnable', 'MCC_SetMode', 'MCC_SetNeutralizationCap',
+        'MCC_SetNeutralizationEnable', 'MCC_SetOscKillerEnable', 'MCC_SetPipetteOffset',
+        'MCC_SetPrimarySignalGain', 'MCC_SetPrimarySignalHPF', 'MCC_SetPrimarySignalLPF',
+        'MCC_SetRsCompBandwidth', 'MCC_SetRsCompCorrection', 'MCC_SetRsCompEnable',
+        'MCC_SetRsCompPrediction', 'MCC_SetSecondarySignalGain',
+        'MCC_SetSecondarySignalLPF', 'MCC_SetSlowCompCap', 'MCC_SetSlowCompTau',
+        'MCC_SetSlowCompTauX20Enable', 'MCC_SetSlowCurrentInjEnable',
+        'MCC_SetSlowCurrentInjLevel', 'MCC_SetSlowCurrentInjSetlTime',
+        'MCC_SetTimeoutMs', 'MCC_SetWholeCellCompCap', 'MCC_SetWholeCellCompEnable',
+        'MCC_SetWholeCellCompResist', 'mean', 'median', 'min', 'mod', 'ModDate',
+        'MPFXEMGPeak', 'MPFXExpConvExpPeak', 'MPFXGaussPeak', 'MPFXLorentzianPeak',
+        'MPFXVoigtPeak', 'NameOfWave', 'NaN', 'NewFreeDataFolder', 'NewFreeWave', 'norm',
+        'NormalizeUnicode', 'note', 'NumberByKey', 'numpnts', 'numtype',
+        'NumVarOrDefault', 'num2char', 'num2istr', 'num2str', 'NVAR_Exists',
+        'OperationList', 'PadString', 'PanelResolution', 'ParamIsDefault',
+        'ParseFilePath', 'PathList', 'pcsr', 'Pi', 'PICTInfo', 'PICTList',
+        'PixelFromAxisVal', 'pnt2x', 'poissonNoise', 'poly', 'PolygonArea', 'poly2D',
+        'PossiblyQuoteName', 'ProcedureText', 'ProcedureVersion', 'p2rect', 'qcsr',
+        'real', 'RemoveByKey', 'RemoveEnding', 'RemoveFromList', 'RemoveListItem',
+        'ReplaceNumberByKey', 'ReplaceString', 'ReplaceStringByKey', 'ReplicateString',
+        'rightx', 'round', 'r2polar', 'sawtooth', 'scaleToIndex', 'ScreenResolution',
+        'sec', 'sech', 'Secs2Date', 'Secs2Time', 'SelectNumber', 'SelectString',
+        'SetEnvironmentVariable', 'sign', 'sin', 'sinc', 'sinh', 'sinIntegral',
+        'SortList', 'SpecialCharacterInfo', 'SpecialCharacterList', 'SpecialDirPath',
+        'SphericalBessJ', 'SphericalBessJD', 'SphericalBessY', 'SphericalBessYD',
+        'SphericalHarmonics', 'SQLAllocHandle', 'SQLAllocStmt',
+        'SQLBinaryWavesToTextWave', 'SQLBindCol', 'SQLBindParameter', 'SQLBrowseConnect',
+        'SQLBulkOperations', 'SQLCancel', 'SQLCloseCursor', 'SQLColAttributeNum',
+        'SQLColAttributeStr', 'SQLColumnPrivileges', 'SQLColumns', 'SQLConnect',
+        'SQLDataSources', 'SQLDescribeCol', 'SQLDescribeParam', 'SQLDisconnect',
+        'SQLDriverConnect', 'SQLDrivers', 'SQLEndTran', 'SQLError', 'SQLExecDirect',
+        'SQLExecute', 'SQLFetch', 'SQLFetchScroll', 'SQLForeignKeys', 'SQLFreeConnect',
+        'SQLFreeEnv', 'SQLFreeHandle', 'SQLFreeStmt', 'SQLGetConnectAttrNum',
+        'SQLGetConnectAttrStr', 'SQLGetCursorName', 'SQLGetDataNum', 'SQLGetDataStr',
+        'SQLGetDescFieldNum', 'SQLGetDescFieldStr', 'SQLGetDescRec',
+        'SQLGetDiagFieldNum', 'SQLGetDiagFieldStr', 'SQLGetDiagRec', 'SQLGetEnvAttrNum',
+        'SQLGetEnvAttrStr', 'SQLGetFunctions', 'SQLGetInfoNum', 'SQLGetInfoStr',
+        'SQLGetStmtAttrNum', 'SQLGetStmtAttrStr', 'SQLGetTypeInfo', 'SQLMoreResults',
+        'SQLNativeSql', 'SQLNumParams', 'SQLNumResultCols', 'SQLNumResultRowsIfKnown',
+        'SQLNumRowsFetched', 'SQLParamData', 'SQLPrepare', 'SQLPrimaryKeys',
+        'SQLProcedureColumns', 'SQLProcedures', 'SQLPutData', 'SQLReinitialize',
+        'SQLRowCount', 'SQLSetConnectAttrNum', 'SQLSetConnectAttrStr',
+        'SQLSetCursorName', 'SQLSetDescFieldNum', 'SQLSetDescFieldStr', 'SQLSetDescRec',
+        'SQLSetEnvAttrNum', 'SQLSetEnvAttrStr', 'SQLSetPos', 'SQLSetStmtAttrNum',
+        'SQLSetStmtAttrStr', 'SQLSpecialColumns', 'SQLStatistics', 'SQLTablePrivileges',
+        'SQLTables', 'SQLTextWaveToBinaryWaves', 'SQLTextWaveTo2DBinaryWave',
+        'SQLUpdateBoundValues', 'SQLXOPCheckState', 'SQL2DBinaryWaveToTextWave', 'sqrt',
+        'StartMSTimer', 'StatsBetaCDF', 'StatsBetaPDF', 'StatsBinomialCDF',
+        'StatsBinomialPDF', 'StatsCauchyCDF', 'StatsCauchyPDF', 'StatsChiCDF',
+        'StatsChiPDF', 'StatsCMSSDCDF', 'StatsCorrelation', 'StatsDExpCDF',
+        'StatsDExpPDF', 'StatsErlangCDF', 'StatsErlangPDF', 'StatsErrorPDF',
+        'StatsEValueCDF', 'StatsEValuePDF', 'StatsExpCDF', 'StatsExpPDF', 'StatsFCDF',
+        'StatsFPDF', 'StatsFriedmanCDF', 'StatsGammaCDF', 'StatsGammaPDF',
+        'StatsGeometricCDF', 'StatsGeometricPDF', 'StatsGEVCDF', 'StatsGEVPDF',
+        'StatsHyperGCDF', 'StatsHyperGPDF', 'StatsInvBetaCDF', 'StatsInvBinomialCDF',
+        'StatsInvCauchyCDF', 'StatsInvChiCDF', 'StatsInvCMSSDCDF', 'StatsInvDExpCDF',
+        'StatsInvEValueCDF', 'StatsInvExpCDF', 'StatsInvFCDF', 'StatsInvFriedmanCDF',
+        'StatsInvGammaCDF', 'StatsInvGeometricCDF', 'StatsInvKuiperCDF',
+        'StatsInvLogisticCDF', 'StatsInvLogNormalCDF', 'StatsInvMaxwellCDF',
+        'StatsInvMooreCDF', 'StatsInvNBinomialCDF', 'StatsInvNCChiCDF', 'StatsInvNCFCDF',
+        'StatsInvNormalCDF', 'StatsInvParetoCDF', 'StatsInvPoissonCDF',
+        'StatsInvPowerCDF', 'StatsInvQCDF', 'StatsInvQpCDF', 'StatsInvRayleighCDF',
+        'StatsInvRectangularCDF', 'StatsInvSpearmanCDF', 'StatsInvStudentCDF',
+        'StatsInvTopDownCDF', 'StatsInvTriangularCDF', 'StatsInvUsquaredCDF',
+        'StatsInvVonMisesCDF', 'StatsInvWeibullCDF', 'StatsKuiperCDF',
+        'StatsLogisticCDF', 'StatsLogisticPDF', 'StatsLogNormalCDF', 'StatsLogNormalPDF',
+        'StatsMaxwellCDF', 'StatsMaxwellPDF', 'StatsMedian', 'StatsMooreCDF',
+        'StatsNBinomialCDF', 'StatsNBinomialPDF', 'StatsNCChiCDF', 'StatsNCChiPDF',
+        'StatsNCFCDF', 'StatsNCFPDF', 'StatsNCTCDF', 'StatsNCTPDF', 'StatsNormalCDF',
+        'StatsNormalPDF', 'StatsParetoCDF', 'StatsParetoPDF', 'StatsPermute',
+        'StatsPoissonCDF', 'StatsPoissonPDF', 'StatsPowerCDF', 'StatsPowerNoise',
+        'StatsPowerPDF', 'StatsQCDF', 'StatsQpCDF', 'StatsRayleighCDF',
+        'StatsRayleighPDF', 'StatsRectangularCDF', 'StatsRectangularPDF', 'StatsRunsCDF',
+        'StatsSpearmanRhoCDF', 'StatsStudentCDF', 'StatsStudentPDF', 'StatsTopDownCDF',
+        'StatsTriangularCDF', 'StatsTriangularPDF', 'StatsTrimmedMean',
+        'StatsUSquaredCDF', 'StatsVonMisesCDF', 'StatsVonMisesNoise', 'StatsVonMisesPDF',
+        'StatsWaldCDF', 'StatsWaldPDF', 'StatsWeibullCDF', 'StatsWeibullPDF',
+        'StopMSTimer', 'StringByKey', 'stringCRC', 'StringFromList', 'StringList',
+        'stringmatch', 'StringToUnsignedByteWave', 'strlen', 'strsearch',
+        'StrVarOrDefault', 'str2num', 'StudentA', 'StudentT', 'sum', 'SVAR_Exists',
+        'TableInfo', 'TagVal', 'TagWaveRef', 'tan', 'tanh', 'TDMAddChannel',
+        'TDMAddGroup', 'TDMAppendDataValues', 'TDMAppendDataValuesTime',
+        'TDMChannelPropertyExists', 'TDMCloseChannel', 'TDMCloseFile', 'TDMCloseGroup',
+        'TDMCreateChannelProperty', 'TDMCreateFile', 'TDMCreateFileProperty',
+        'TDMCreateGroupProperty', 'TDMFilePropertyExists', 'TDMGetChannelPropertyNames',
+        'TDMGetChannelPropertyNum', 'TDMGetChannelPropertyStr',
+        'TDMGetChannelPropertyTime', 'TDMGetChannelPropertyType', 'TDMGetChannels',
+        'TDMGetChannelStringPropertyLen', 'TDMGetDataType', 'TDMGetDataValues',
+        'TDMGetDataValuesTime', 'TDMGetFilePropertyNames', 'TDMGetFilePropertyNum',
+        'TDMGetFilePropertyStr', 'TDMGetFilePropertyTime', 'TDMGetFilePropertyType',
+        'TDMGetFileStringPropertyLen', 'TDMGetGroupPropertyNames',
+        'TDMGetGroupPropertyNum', 'TDMGetGroupPropertyStr', 'TDMGetGroupPropertyTime',
+        'TDMGetGroupPropertyType', 'TDMGetGroups', 'TDMGetGroupStringPropertyLen',
+        'TDMGetLibraryErrorDescription', 'TDMGetNumChannelProperties',
+        'TDMGetNumChannels', 'TDMGetNumDataValues', 'TDMGetNumFileProperties',
+        'TDMGetNumGroupProperties', 'TDMGetNumGroups', 'TDMGroupPropertyExists',
+        'TDMOpenFile', 'TDMOpenFileEx', 'TDMRemoveChannel', 'TDMRemoveGroup',
+        'TDMReplaceDataValues', 'TDMReplaceDataValuesTime', 'TDMSaveFile',
+        'TDMSetChannelPropertyNum', 'TDMSetChannelPropertyStr',
+        'TDMSetChannelPropertyTime', 'TDMSetDataValues', 'TDMSetDataValuesTime',
+        'TDMSetFilePropertyNum', 'TDMSetFilePropertyStr', 'TDMSetFilePropertyTime',
+        'TDMSetGroupPropertyNum', 'TDMSetGroupPropertyStr', 'TDMSetGroupPropertyTime',
+        'TextEncodingCode', 'TextEncodingName', 'TextFile', 'ThreadGroupCreate',
+        'ThreadGroupGetDF', 'ThreadGroupGetDFR', 'ThreadGroupRelease', 'ThreadGroupWait',
+        'ThreadProcessorCount', 'ThreadReturnValue', 'ticks', 'time', 'TraceFromPixel',
+        'TraceInfo', 'TraceNameList', 'TraceNameToWaveRef', 'TrimString', 'trunc',
+        'UniqueName', 'UnPadString', 'UnsetEnvironmentVariable', 'UpperStr', 'URLDecode',
+        'URLEncode', 'VariableList', 'Variance', 'vcsr', 'viAssertIntrSignal',
+        'viAssertTrigger', 'viAssertUtilSignal', 'viClear', 'viClose', 'viDisableEvent',
+        'viDiscardEvents', 'viEnableEvent', 'viFindNext', 'viFindRsrc', 'viGetAttribute',
+        'viGetAttributeString', 'viGpibCommand', 'viGpibControlATN', 'viGpibControlREN',
+        'viGpibPassControl', 'viGpibSendIFC', 'viIn8', 'viIn16', 'viIn32', 'viLock',
+        'viMapAddress', 'viMapTrigger', 'viMemAlloc', 'viMemFree', 'viMoveIn8',
+        'viMoveIn16', 'viMoveIn32', 'viMoveOut8', 'viMoveOut16', 'viMoveOut32', 'viOpen',
+        'viOpenDefaultRM', 'viOut8', 'viOut16', 'viOut32', 'viPeek8', 'viPeek16',
+        'viPeek32', 'viPoke8', 'viPoke16', 'viPoke32', 'viRead', 'viReadSTB',
+        'viSetAttribute', 'viSetAttributeString', 'viStatusDesc', 'viTerminate',
+        'viUnlock', 'viUnmapAddress', 'viUnmapTrigger', 'viUsbControlIn',
+        'viUsbControlOut', 'viVxiCommandQuery', 'viWaitOnEvent', 'viWrite', 'VoigtFunc',
+        'VoigtPeak', 'WaveCRC', 'WaveDataToString', 'WaveDims', 'WaveExists', 'WaveHash',
+        'WaveInfo', 'WaveList', 'WaveMax', 'WaveMin', 'WaveMinAndMax', 'WaveModCount',
+        'WaveName', 'WaveRefIndexed', 'WaveRefIndexedDFR', 'WaveRefsEqual',
+        'WaveRefWaveToList', 'WaveTextEncoding', 'WaveType', 'WaveUnits',
+        'WhichListItem', 'WinList', 'WinName', 'WinRecreation', 'WinType', 'wnoise',
+        'xcsr', 'XWaveName', 'XWaveRefFromTrace', 'x2pnt', 'zcsr', 'ZernikeR',
+        'zeromq_client_connect', 'zeromq_client_recv', 'zeromq_client_send',
+        'zeromq_handler_start', 'zeromq_handler_stop', 'zeromq_pub_bind',
+        'zeromq_pub_send', 'zeromq_server_bind', 'zeromq_server_recv',
+        'zeromq_server_send', 'zeromq_set', 'zeromq_set_logging_template', 'zeromq_stop',
+        'zeromq_sub_add_filter', 'zeromq_sub_connect', 'zeromq_sub_recv',
+        'zeromq_sub_remove_filter', 'zeromq_test_callfunction',
+        'zeromq_test_serializeWave', 'zeta'
+    )
+
+    tokens = {
+        'root': [
+            (r'//.*$', Comment.Single),
+            (r'"([^"\\]|\\.)*"', String),
+            # Flow Control.
+            (words(flowControl, prefix=r'\b', suffix=r'\b'), Keyword),
+            # Types.
+            (words(types, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+            # Keywords.
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword.Reserved),
+            # Built-in operations.
+            (words(operations, prefix=r'\b', suffix=r'\b'), Name.Class),
+            # Built-in functions.
+            (words(functions, prefix=r'\b', suffix=r'\b'), Name.Function),
+            # Compiler directives.
+            (r'^#(include|pragma|define|undef|ifdef|ifndef|if|elif|else|endif)',
+             Name.Decorator),
+            (r'\s+', Whitespace),
+            (r'[^a-z"/]+$', Text),
+            (r'.', Text),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/inferno.py b/.venv/Lib/site-packages/pygments/lexers/inferno.py
new file mode 100644 (file)
index 0000000..b5caf55
--- /dev/null
@@ -0,0 +1,95 @@
+"""
+    pygments.lexers.inferno
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Inferno os and all the related stuff.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, default
+from pygments.token import Punctuation, Comment, Operator, Keyword, \
+    Name, String, Number, Whitespace
+
+__all__ = ['LimboLexer']
+
+
+class LimboLexer(RegexLexer):
+    """
+    Lexer for Limbo programming language
+
+    TODO:
+        - maybe implement better var declaration highlighting
+        - some simple syntax error highlighting
+    """
+    name = 'Limbo'
+    url = 'http://www.vitanuova.com/inferno/limbo.html'
+    aliases = ['limbo']
+    filenames = ['*.b']
+    mimetypes = ['text/limbo']
+    version_added = '2.0'
+
+    tokens = {
+        'whitespace': [
+            (r'^(\s*)([a-zA-Z_]\w*:)(\s*\n)',
+             bygroups(Whitespace, Name.Label, Whitespace)),
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'#(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|'
+             r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String), # all other characters
+            (r'\\', String), # stray backslash
+        ],
+        'statements': [
+            (r'"', String, 'string'),
+            (r"'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])', Number.Float),
+            (r'16r[0-9a-fA-F]+', Number.Hex),
+            (r'8r[0-7]+', Number.Oct),
+            (r'((([1-3]\d)|([2-9]))r)?(\d+)', Number.Integer),
+            (r'[()\[\],.]', Punctuation),
+            (r'[~!%^&*+=|?:<>/-]|(->)|(<-)|(=>)|(::)', Operator),
+            (r'(alt|break|case|continue|cyclic|do|else|exit'
+             r'for|hd|if|implement|import|include|len|load|or'
+             r'pick|return|spawn|tagof|tl|to|while)\b', Keyword),
+            (r'(byte|int|big|real|string|array|chan|list|adt'
+             r'|fn|ref|of|module|self|type)\b', Keyword.Type),
+            (r'(con|iota|nil)\b', Keyword.Constant),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'statement' : [
+            include('whitespace'),
+            include('statements'),
+            ('[{}]', Punctuation),
+            (';', Punctuation, '#pop'),
+        ],
+        'root': [
+            include('whitespace'),
+            default('statement'),
+        ],
+    }
+
+    def analyse_text(text):
+        # Any limbo module implements something
+        if re.search(r'^implement \w+;', text, re.MULTILINE):
+            return 0.7
+
+# TODO:
+#   - Make lexers for:
+#       - asm sources
+#       - man pages
+#       - mkfiles
+#       - module definitions
+#       - namespace definitions
+#       - shell scripts
+#       - maybe keyfiles and fonts
+#   they all seem to be quite similar to their equivalents
+#   from unix world, so there should not be a lot of problems
diff --git a/.venv/Lib/site-packages/pygments/lexers/installers.py b/.venv/Lib/site-packages/pygments/lexers/installers.py
new file mode 100644 (file)
index 0000000..3f12a25
--- /dev/null
@@ -0,0 +1,352 @@
+"""
+    pygments.lexers.installers
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for installer/packager DSLs and formats.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Punctuation, Generic, Number, Whitespace
+
+__all__ = ['NSISLexer', 'RPMSpecLexer',
+           'DebianSourcesLexer', 'SourcesListLexer',
+           'DebianControlLexer']
+
+
+class NSISLexer(RegexLexer):
+    """
+    For NSIS scripts.
+    """
+    name = 'NSIS'
+    url = 'http://nsis.sourceforge.net/'
+    aliases = ['nsis', 'nsi', 'nsh']
+    filenames = ['*.nsi', '*.nsh']
+    mimetypes = ['text/x-nsis']
+    version_added = '1.6'
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'([;#].*)(\n)', bygroups(Comment, Whitespace)),
+            (r"'.*?'", String.Single),
+            (r'"', String.Double, 'str_double'),
+            (r'`', String.Backtick, 'str_backtick'),
+            include('macro'),
+            include('interpol'),
+            include('basic'),
+            (r'\$\{[a-z_|][\w|]*\}', Keyword.Pseudo),
+            (r'/[a-z_]\w*', Name.Attribute),
+            (r'\s+', Whitespace),
+            (r'[\w.]+', Text),
+        ],
+        'basic': [
+            (r'(\n)(Function)(\s+)([._a-z][.\w]*)\b',
+             bygroups(Whitespace, Keyword, Whitespace, Name.Function)),
+            (r'\b([_a-z]\w*)(::)([a-z][a-z0-9]*)\b',
+             bygroups(Keyword.Namespace, Punctuation, Name.Function)),
+            (r'\b([_a-z]\w*)(:)', bygroups(Name.Label, Punctuation)),
+            (r'(\b[ULS]|\B)([!<>=]?=|\<\>?|\>)\B', Operator),
+            (r'[|+-]', Operator),
+            (r'\\', Punctuation),
+            (r'\b(Abort|Add(?:BrandingImage|Size)|'
+             r'Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|'
+             r'BG(?:Font|Gradient)|BrandingText|BringToFront|Call(?:InstDLL)?|'
+             r'(?:Sub)?Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|'
+             r'ComponentText|CopyFiles|CRCCheck|'
+             r'Create(?:Directory|Font|Shortcut)|Delete(?:INI(?:Sec|Str)|'
+             r'Reg(?:Key|Value))?|DetailPrint|DetailsButtonText|'
+             r'Dir(?:Show|Text|Var|Verify)|(?:Disabled|Enabled)Bitmap|'
+             r'EnableWindow|EnumReg(?:Key|Value)|Exch|Exec(?:Shell|Wait)?|'
+             r'ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|'
+             r'Read(?:Byte)?|Seek|Write(?:Byte)?)?|'
+             r'Find(?:Close|First|Next|Window)|FlushINI|Function(?:End)?|'
+             r'Get(?:CurInstType|CurrentAddress|DlgItem|DLLVersion(?:Local)?|'
+             r'ErrorLevel|FileTime(?:Local)?|FullPathName|FunctionAddress|'
+             r'InstDirError|LabelAddress|TempFileName)|'
+             r'Goto|HideWindow|Icon|'
+             r'If(?:Abort|Errors|FileExists|RebootFlag|Silent)|'
+             r'InitPluginsDir|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|'
+             r'Inst(?:ProgressFlags|Type(?:[GS]etText)?)|Int(?:CmpU?|Fmt|Op)|'
+             r'IsWindow|LangString(?:UP)?|'
+             r'License(?:BkColor|Data|ForceSelection|LangString|Text)|'
+             r'LoadLanguageFile|LockWindow|Log(?:Set|Text)|MessageBox|'
+             r'MiscButtonText|Name|Nop|OutFile|(?:Uninst)?Page(?:Ex(?:End)?)?|'
+             r'PluginDir|Pop|Push|Quit|Read(?:(?:Env|INI|Reg)Str|RegDWORD)|'
+             r'Reboot|(?:Un)?RegDLL|Rename|RequestExecutionLevel|ReserveFile|'
+             r'Return|RMDir|SearchPath|Section(?:Divider|End|'
+             r'(?:(?:Get|Set)(?:Flags|InstTypes|Size|Text))|Group(?:End)?|In)?|'
+             r'SendMessage|Set(?:AutoClose|BrandingImage|Compress(?:ionLevel|'
+             r'or(?:DictSize)?)?|CtlColors|CurInstType|DatablockOptimize|'
+             r'DateSave|Details(?:Print|View)|Error(?:s|Level)|FileAttributes|'
+             r'Font|OutPath|Overwrite|PluginUnload|RebootFlag|ShellVarContext|'
+             r'Silent|StaticBkColor)|'
+             r'Show(?:(?:I|Uni)nstDetails|Window)|Silent(?:Un)?Install|Sleep|'
+             r'SpaceTexts|Str(?:CmpS?|Cpy|Len)|SubSection(?:End)?|'
+             r'Uninstall(?:ButtonText|(?:Sub)?Caption|EXEName|Icon|Text)|'
+             r'UninstPage|Var|VI(?:AddVersionKey|ProductVersion)|WindowIcon|'
+             r'Write(?:INIStr|Reg(:?Bin|DWORD|(?:Expand)?Str)|Uninstaller)|'
+             r'XPStyle)\b', Keyword),
+            (r'\b(CUR|END|(?:FILE_ATTRIBUTE_)?'
+             r'(?:ARCHIVE|HIDDEN|NORMAL|OFFLINE|READONLY|SYSTEM|TEMPORARY)|'
+             r'HK(CC|CR|CU|DD|LM|PD|U)|'
+             r'HKEY_(?:CLASSES_ROOT|CURRENT_(?:CONFIG|USER)|DYN_DATA|'
+             r'LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|'
+             r'ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|'
+             r'MB_(?:ABORTRETRYIGNORE|DEFBUTTON[1-4]|'
+             r'ICON(?:EXCLAMATION|INFORMATION|QUESTION|STOP)|'
+             r'OK(?:CANCEL)?|RETRYCANCEL|RIGHT|SETFOREGROUND|TOPMOST|USERICON|'
+             r'YESNO(?:CANCEL)?)|SET|SHCTX|'
+             r'SW_(?:HIDE|SHOW(?:MAXIMIZED|MINIMIZED|NORMAL))|'
+             r'admin|all|auto|both|bottom|bzip2|checkbox|colored|current|false|'
+             r'force|hide|highest|if(?:diff|newer)|lastused|leave|left|'
+             r'listonly|lzma|nevershow|none|normal|off|on|pop|push|'
+             r'radiobuttons|right|show|silent|silentlog|smooth|textonly|top|'
+             r'true|try|user|zlib)\b', Name.Constant),
+        ],
+        'macro': [
+            (r'\!(addincludedir(?:dir)?|addplugindir|appendfile|cd|define|'
+             r'delfilefile|echo(?:message)?|else|endif|error|execute|'
+             r'if(?:macro)?n?(?:def)?|include|insertmacro|macro(?:end)?|packhdr|'
+             r'search(?:parse|replace)|system|tempfilesymbol|undef|verbose|'
+             r'warning)\b', Comment.Preproc),
+        ],
+        'interpol': [
+            (r'\$(R?[0-9])', Name.Builtin.Pseudo),    # registers
+            (r'\$(ADMINTOOLS|APPDATA|CDBURN_AREA|COOKIES|COMMONFILES(?:32|64)|'
+             r'DESKTOP|DOCUMENTS|EXE(?:DIR|FILE|PATH)|FAVORITES|FONTS|HISTORY|'
+             r'HWNDPARENT|INTERNET_CACHE|LOCALAPPDATA|MUSIC|NETHOOD|PICTURES|'
+             r'PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES(?:32|64)|QUICKLAUNCH|'
+             r'RECENT|RESOURCES(?:_LOCALIZED)?|SENDTO|SM(?:PROGRAMS|STARTUP)|'
+             r'STARTMENU|SYSDIR|TEMP(?:LATES)?|VIDEOS|WINDIR|\{NSISDIR\})',
+             Name.Builtin),
+            (r'\$(CMDLINE|INSTDIR|OUTDIR|LANGUAGE)', Name.Variable.Global),
+            (r'\$[a-z_]\w*', Name.Variable),
+        ],
+        'str_double': [
+            (r'"', String.Double, '#pop'),
+            (r'\$(\\[nrt"]|\$)', String.Escape),
+            include('interpol'),
+            (r'[^"]+', String.Double),
+        ],
+        'str_backtick': [
+            (r'`', String.Double, '#pop'),
+            (r'\$(\\[nrt"]|\$)', String.Escape),
+            include('interpol'),
+            (r'[^`]+', String.Double),
+        ],
+    }
+
+
+class RPMSpecLexer(RegexLexer):
+    """
+    For RPM ``.spec`` files.
+    """
+
+    name = 'RPMSpec'
+    aliases = ['spec']
+    filenames = ['*.spec']
+    mimetypes = ['text/x-rpm-spec']
+    url = 'https://rpm-software-management.github.io/rpm/manual/spec.html'
+    version_added = '1.6'
+
+    _directives = ('(?:package|prep|build|install|clean|check|pre[a-z]*|'
+                   'post[a-z]*|trigger[a-z]*|files)')
+
+    tokens = {
+        'root': [
+            (r'#.*$', Comment),
+            include('basic'),
+        ],
+        'description': [
+            (r'^(%' + _directives + ')(.*)$',
+             bygroups(Name.Decorator, Text), '#pop'),
+            (r'\s+', Whitespace),
+            (r'.', Text),
+        ],
+        'changelog': [
+            (r'\*.*$', Generic.Subheading),
+            (r'^(%' + _directives + ')(.*)$',
+             bygroups(Name.Decorator, Text), '#pop'),
+            (r'\s+', Whitespace),
+            (r'.', Text),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            include('interpol'),
+            (r'.', String.Double),
+        ],
+        'basic': [
+            include('macro'),
+            (r'(?i)^(Name|Version|Release|Epoch|Summary|Group|License|Packager|'
+             r'Vendor|Icon|URL|Distribution|Prefix|Patch[0-9]*|Source[0-9]*|'
+             r'Requires\(?[a-z]*\)?|[a-z]+Req|Obsoletes|Suggests|Provides|Conflicts|'
+             r'Build[a-z]+|[a-z]+Arch|Auto[a-z]+)(:)(.*)$',
+             bygroups(Generic.Heading, Punctuation, using(this))),
+            (r'^%description', Name.Decorator, 'description'),
+            (r'^%changelog', Name.Decorator, 'changelog'),
+            (r'^(%' + _directives + ')(.*)$', bygroups(Name.Decorator, Text)),
+            (r'%(attr|defattr|dir|doc(?:dir)?|setup|config(?:ure)?|'
+             r'make(?:install)|ghost|patch[0-9]+|find_lang|exclude|verify)',
+             Keyword),
+            include('interpol'),
+            (r"'.*?'", String.Single),
+            (r'"', String.Double, 'string'),
+            (r'\s+', Whitespace),
+            (r'.', Text),
+        ],
+        'macro': [
+            (r'%define.*$', Comment.Preproc),
+            (r'%\{\!\?.*%define.*\}', Comment.Preproc),
+            (r'(%(?:if(?:n?arch)?|else(?:if)?|endif))(.*)$',
+             bygroups(Comment.Preproc, Text)),
+        ],
+        'interpol': [
+            (r'%\{?__[a-z_]+\}?', Name.Function),
+            (r'%\{?_([a-z_]+dir|[a-z_]+path|prefix)\}?', Keyword.Pseudo),
+            (r'%\{\?\w+\}', Name.Variable),
+            (r'\$\{?RPM_[A-Z0-9_]+\}?', Name.Variable.Global),
+            (r'%\{[a-zA-Z]\w+\}', Keyword.Constant),
+        ]
+    }
+
+
+class DebianSourcesLexer(RegexLexer):
+    """
+    Lexer that highlights debian.sources files.
+    """
+
+    name = 'Debian Sources file'
+    aliases = ['debian.sources']
+    filenames = ['*.sources']
+    version_added = '2.19'
+    url = 'https://manpages.debian.org/bookworm/apt/sources.list.5.en.html#THE_DEB_AND_DEB-SRC_TYPES:_GENERAL_FORMAT'
+
+    tokens = {
+        'root': [
+            (r'^(Signed-By)(:)(\s*)', bygroups(Keyword, Punctuation, Whitespace), 'signed-by'),
+            (r'^([a-zA-Z\-0-9\.]*?)(:)(\s*)(.*?)$',
+             bygroups(Keyword, Punctuation, Whitespace, String)),
+        ],
+        'signed-by': [
+            (r' -----END PGP PUBLIC KEY BLOCK-----\n', Text, '#pop'),
+            (r'.+\n', Text),
+        ],        
+    }
+
+
+class SourcesListLexer(RegexLexer):
+    """
+    Lexer that highlights debian sources.list files.
+    """
+
+    name = 'Debian Sourcelist'
+    aliases = ['debsources', 'sourceslist', 'sources.list']
+    filenames = ['sources.list']
+    version_added = '0.7'
+    mimetype = ['application/x-debian-sourceslist']
+    url = 'https://wiki.debian.org/SourcesList'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'#.*?$', Comment),
+            (r'^(deb(?:-src)?)(\s+)',
+             bygroups(Keyword, Whitespace), 'distribution')
+        ],
+        'distribution': [
+            (r'#.*?$', Comment, '#pop'),
+            (r'\$\(ARCH\)', Name.Variable),
+            (r'[^\s$[]+', String),
+            (r'\[', String.Other, 'escaped-distribution'),
+            (r'\$', String),
+            (r'\s+', Whitespace, 'components')
+        ],
+        'escaped-distribution': [
+            (r'\]', String.Other, '#pop'),
+            (r'\$\(ARCH\)', Name.Variable),
+            (r'[^\]$]+', String.Other),
+            (r'\$', String.Other)
+        ],
+        'components': [
+            (r'#.*?$', Comment, '#pop:2'),
+            (r'$', Text, '#pop:2'),
+            (r'\s+', Whitespace),
+            (r'\S+', Keyword.Pseudo),
+        ]
+    }
+
+    def analyse_text(text):
+        for line in text.splitlines():
+            line = line.strip()
+            if line.startswith('deb ') or line.startswith('deb-src '):
+                return True
+
+
+class DebianControlLexer(RegexLexer):
+    """
+    Lexer for Debian ``control`` files and ``apt-cache show <pkg>`` outputs.
+    """
+    name = 'Debian Control file'
+    url = 'https://www.debian.org/doc/debian-policy/ch-controlfields.html'
+    aliases = ['debcontrol', 'control']
+    filenames = ['control']
+    version_added = '0.9'
+
+    tokens = {
+        'root': [
+            (r'^(Description)', Keyword, 'description'),
+            (r'^(Maintainer|Uploaders|Changed-By)(:)(\s*)',
+             bygroups(Keyword, Punctuation, Whitespace),
+             'maintainer'),
+            (r'^((?:Build-|Pre-)?Depends(?:-Indep|-Arch)?)(:)(\s*)',
+             bygroups(Keyword, Punctuation, Whitespace), 'package_list'),
+            (r'^(Recommends|Suggests|Enhances|Breaks|Replaces|Provides|Conflicts)(:)(\s*)',
+             bygroups(Keyword, Punctuation, Whitespace), 'package_list'),
+            (r'^((?:Python-)?Version)(:)(\s*)(\S+)$',
+             bygroups(Keyword, Punctuation, Whitespace, Number)),
+            (r'^((?:Installed-)?Size)(:)(\s*)(\S+)$',
+             bygroups(Keyword, Punctuation, Whitespace, Number)),
+            (r'^(MD5Sum|SHA1|SHA256)(:)(\s*)(\S+)$',
+             bygroups(Keyword, Punctuation, Whitespace, Number)),
+            (r'^([a-zA-Z\-0-9\.]*?)(:)(\s*)(.*?)$',
+             bygroups(Keyword, Punctuation, Whitespace, String)),
+        ],
+        'maintainer': [
+            (r'<[^>]+>$', Generic.Strong, '#pop'),
+            (r'<[^>]+>', Generic.Strong),
+            (r',\n?', Whitespace),
+            (r'[^,<]+$', Text, '#pop'),
+            (r'[^,<]+', Text),
+        ],
+        'description': [
+            (r'(.*)(Homepage)(: )(\S+)',
+             bygroups(Text, String, Name, Name.Class)),
+            (r':.*\n', Generic.Strong),
+            (r' .*\n', Text),
+            default('#pop'),
+        ],
+        'package_list': [
+            (r'(\$)(\{)(\w+)(\s*)(:)(\s*)(\w+)(\})',
+             bygroups(Operator, Punctuation, Name.Entity, Whitespace,
+                      Punctuation, Whitespace, Text, Punctuation)),
+            (r'\(', Punctuation, 'package_list_vers'),
+            (r'\|', Operator),
+            (r'\n\s', Whitespace),
+            (r'\n', Whitespace, '#pop'),
+            (r'[,\s]', Text),
+            (r'[+.a-zA-Z0-9-]+', Name.Function),
+            (r'\[.*?\]', Name.Entity),
+        ],
+        'package_list_vers': [
+            (r'\)', Punctuation, '#pop'),
+            (r'([><=]+)(\s*)([^)]+)', bygroups(Operator, Whitespace, Number)),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/int_fiction.py b/.venv/Lib/site-packages/pygments/lexers/int_fiction.py
new file mode 100644 (file)
index 0000000..b142c54
--- /dev/null
@@ -0,0 +1,1370 @@
+"""
+    pygments.lexers.int_fiction
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for interactive fiction languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, \
+    this, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Generic
+
+__all__ = ['Inform6Lexer', 'Inform6TemplateLexer', 'Inform7Lexer',
+           'Tads3Lexer']
+
+
+class Inform6Lexer(RegexLexer):
+    """
+    For Inform 6 source code.
+    """
+
+    name = 'Inform 6'
+    url = 'http://inform-fiction.org/'
+    aliases = ['inform6', 'i6']
+    filenames = ['*.inf']
+    version_added = '2.0'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    _name = r'[a-zA-Z_]\w*'
+
+    # Inform 7 maps these four character classes to their ASCII
+    # equivalents. To support Inform 6 inclusions within Inform 7,
+    # Inform6Lexer maps them too.
+    _dash = '\\-\u2010-\u2014'
+    _dquote = '"\u201c\u201d'
+    _squote = "'\u2018\u2019"
+    _newline = '\\n\u0085\u2028\u2029'
+
+    tokens = {
+        'root': [
+            (rf'\A(!%[^{_newline}]*[{_newline}])+', Comment.Preproc,
+             'directive'),
+            default('directive')
+        ],
+        '_whitespace': [
+            (r'\s+', Text),
+            (rf'![^{_newline}]*', Comment.Single)
+        ],
+        'default': [
+            include('_whitespace'),
+            (r'\[', Punctuation, 'many-values'),  # Array initialization
+            (r':|(?=;)', Punctuation, '#pop'),
+            (r'<', Punctuation),  # Second angle bracket in an action statement
+            default(('expression', '_expression'))
+        ],
+
+        # Expressions
+        '_expression': [
+            include('_whitespace'),
+            (r'(?=sp\b)', Text, '#pop'),
+            (rf'(?=[{_dquote}{_squote}$0-9#a-zA-Z_])', Text,
+             ('#pop', 'value')),
+            (rf'\+\+|[{_dash}]{{1,2}}(?!>)|~~?', Operator),
+            (rf'(?=[()\[{_dash},?@{{:;])', Text, '#pop')
+        ],
+        'expression': [
+            include('_whitespace'),
+            (r'\(', Punctuation, ('expression', '_expression')),
+            (r'\)', Punctuation, '#pop'),
+            (r'\[', Punctuation, ('#pop', 'statements', 'locals')),
+            (rf'>(?=(\s+|(![^{_newline}]*))*[>;])', Punctuation),
+            (rf'\+\+|[{_dash}]{{2}}(?!>)', Operator),
+            (r',', Punctuation, '_expression'),
+            (rf'&&?|\|\|?|[=~><]?=|[{_dash}]{{1,2}}>?|\.\.?[&#]?|::|[<>+*/%]',
+             Operator, '_expression'),
+            (r'(has|hasnt|in|notin|ofclass|or|provides)\b', Operator.Word,
+             '_expression'),
+            (r'sp\b', Name),
+            (r'\?~?', Name.Label, 'label?'),
+            (r'[@{]', Error),
+            default('#pop')
+        ],
+        '_assembly-expression': [
+            (r'\(', Punctuation, ('#push', '_expression')),
+            (r'[\[\]]', Punctuation),
+            (rf'[{_dash}]>', Punctuation, '_expression'),
+            (r'sp\b', Keyword.Pseudo),
+            (r';', Punctuation, '#pop:3'),
+            include('expression')
+        ],
+        '_for-expression': [
+            (r'\)', Punctuation, '#pop:2'),
+            (r':', Punctuation, '#pop'),
+            include('expression')
+        ],
+        '_keyword-expression': [
+            (r'(from|near|to)\b', Keyword, '_expression'),
+            include('expression')
+        ],
+        '_list-expression': [
+            (r',', Punctuation, '#pop'),
+            include('expression')
+        ],
+        '_object-expression': [
+            (r'has\b', Keyword.Declaration, '#pop'),
+            include('_list-expression')
+        ],
+
+        # Values
+        'value': [
+            include('_whitespace'),
+            # Strings
+            (rf'[{_squote}][^@][{_squote}]', String.Char, '#pop'),
+            (rf'([{_squote}])(@\{{[0-9a-fA-F]*\}})([{_squote}])',
+             bygroups(String.Char, String.Escape, String.Char), '#pop'),
+            (rf'([{_squote}])(@.{{2}})([{_squote}])',
+             bygroups(String.Char, String.Escape, String.Char), '#pop'),
+            (rf'[{_squote}]', String.Single, ('#pop', 'dictionary-word')),
+            (rf'[{_dquote}]', String.Double, ('#pop', 'string')),
+            # Numbers
+            (rf'\$[<>]?[+{_dash}][0-9]*\.?[0-9]*([eE][+{_dash}]?[0-9]+)?',
+             Number.Float, '#pop'),
+            (r'\$[0-9a-fA-F]+', Number.Hex, '#pop'),
+            (r'\$\$[01]+', Number.Bin, '#pop'),
+            (r'[0-9]+', Number.Integer, '#pop'),
+            # Values prefixed by hashes
+            (rf'(##|#a\$)({_name})', bygroups(Operator, Name), '#pop'),
+            (rf'(#g\$)({_name})',
+             bygroups(Operator, Name.Variable.Global), '#pop'),
+            (r'#[nw]\$', Operator, ('#pop', 'obsolete-dictionary-word')),
+            (rf'(#r\$)({_name})', bygroups(Operator, Name.Function), '#pop'),
+            (r'#', Name.Builtin, ('#pop', 'system-constant')),
+            # System functions
+            (words((
+                'child', 'children', 'elder', 'eldest', 'glk', 'indirect', 'metaclass',
+                'parent', 'random', 'sibling', 'younger', 'youngest'), suffix=r'\b'),
+             Name.Builtin, '#pop'),
+            # Metaclasses
+            (r'(?i)(Class|Object|Routine|String)\b', Name.Builtin, '#pop'),
+            # Veneer routines
+            (words((
+                'Box__Routine', 'CA__Pr', 'CDefArt', 'CInDefArt', 'Cl__Ms',
+                'Copy__Primitive', 'CP__Tab', 'DA__Pr', 'DB__Pr', 'DefArt', 'Dynam__String',
+                'EnglishNumber', 'Glk__Wrap', 'IA__Pr', 'IB__Pr', 'InDefArt', 'Main__',
+                'Meta__class', 'OB__Move', 'OB__Remove', 'OC__Cl', 'OP__Pr', 'Print__Addr',
+                'Print__PName', 'PrintShortName', 'RA__Pr', 'RA__Sc', 'RL__Pr', 'R_Process',
+                'RT__ChG', 'RT__ChGt', 'RT__ChLDB', 'RT__ChLDW', 'RT__ChPR', 'RT__ChPrintA',
+                'RT__ChPrintC', 'RT__ChPrintO', 'RT__ChPrintS', 'RT__ChPS', 'RT__ChR',
+                'RT__ChSTB', 'RT__ChSTW', 'RT__ChT', 'RT__Err', 'RT__TrPS', 'RV__Pr',
+                'Symb__Tab', 'Unsigned__Compare', 'WV__Pr', 'Z__Region'),
+                prefix='(?i)', suffix=r'\b'),
+             Name.Builtin, '#pop'),
+            # Other built-in symbols
+            (words((
+                'call', 'copy', 'create', 'DEBUG', 'destroy', 'DICT_CHAR_SIZE',
+                'DICT_ENTRY_BYTES', 'DICT_IS_UNICODE', 'DICT_WORD_SIZE', 'DOUBLE_HI_INFINITY',
+                'DOUBLE_HI_NAN', 'DOUBLE_HI_NINFINITY', 'DOUBLE_LO_INFINITY', 'DOUBLE_LO_NAN',
+                'DOUBLE_LO_NINFINITY', 'false', 'FLOAT_INFINITY', 'FLOAT_NAN', 'FLOAT_NINFINITY',
+                'GOBJFIELD_CHAIN', 'GOBJFIELD_CHILD', 'GOBJFIELD_NAME', 'GOBJFIELD_PARENT',
+                'GOBJFIELD_PROPTAB', 'GOBJFIELD_SIBLING', 'GOBJ_EXT_START',
+                'GOBJ_TOTAL_LENGTH', 'Grammar__Version', 'INDIV_PROP_START', 'INFIX',
+                'infix__watching', 'MODULE_MODE', 'name', 'nothing', 'NUM_ATTR_BYTES', 'print',
+                'print_to_array', 'recreate', 'remaining', 'self', 'sender', 'STRICT_MODE',
+                'sw__var', 'sys__glob0', 'sys__glob1', 'sys__glob2', 'sys_statusline_flag',
+                'TARGET_GLULX', 'TARGET_ZCODE', 'temp__global2', 'temp__global3',
+                'temp__global4', 'temp_global', 'true', 'USE_MODULES', 'WORDSIZE'),
+                prefix='(?i)', suffix=r'\b'),
+             Name.Builtin, '#pop'),
+            # Other values
+            (_name, Name, '#pop')
+        ],
+        'value?': [
+            include('value'),
+            default('#pop')
+        ],
+        # Strings
+        'dictionary-word': [
+            (rf'[~^]+|//[^{_squote}]*', String.Escape),
+            (rf'[^~^/\\@({{{_squote}]+', String.Single),
+            (r'[/({]', String.Single),
+            (r'@\{[0-9a-fA-F]*\}', String.Escape),
+            (r'@.{2}', String.Escape),
+            (rf'[{_squote}]', String.Single, '#pop')
+        ],
+        'string': [
+            (r'[~^]+', String.Escape),
+            (rf'[^~^\\@({{{_dquote}]+', String.Double),
+            (r'[({]', String.Double),
+            (r'\\', String.Escape),
+            (rf'@(\\\s*[{_newline}]\s*)*@((\\\s*[{_newline}]\s*)*[0-9])*', String.Escape),
+            (rf'@(\\\s*[{_newline}]\s*)*[({{]((\\\s*[{_newline}]\s*)*[0-9a-zA-Z_])*'
+             rf'(\\\s*[{_newline}]\s*)*[)}}]',
+             String.Escape),
+            (rf'@(\\\s*[{_newline}]\s*)*.(\\\s*[{_newline}]\s*)*.',
+             String.Escape),
+            (rf'[{_dquote}]', String.Double, '#pop')
+        ],
+        'plain-string': [
+            (rf'[^~^\\({{\[\]{_dquote}]+', String.Double),
+            (r'[~^({\[\]]', String.Double),
+            (r'\\', String.Escape),
+            (rf'[{_dquote}]', String.Double, '#pop')
+        ],
+        # Names
+        '_constant': [
+            include('_whitespace'),
+            (_name, Name.Constant, '#pop'),
+            include('value')
+        ],
+        'constant*': [
+            include('_whitespace'),
+            (r',', Punctuation),
+            (r'=', Punctuation, 'value?'),
+            (_name, Name.Constant, 'value?'),
+            default('#pop')
+        ],
+        '_global': [
+            include('_whitespace'),
+            (_name, Name.Variable.Global, '#pop'),
+            include('value')
+        ],
+        'label?': [
+            include('_whitespace'),
+            (_name, Name.Label, '#pop'),
+            default('#pop')
+        ],
+        'variable?': [
+            include('_whitespace'),
+            (_name, Name.Variable, '#pop'),
+            default('#pop')
+        ],
+        # Values after hashes
+        'obsolete-dictionary-word': [
+            (r'\S\w*', String.Other, '#pop')
+        ],
+        'system-constant': [
+            include('_whitespace'),
+            (_name, Name.Builtin, '#pop')
+        ],
+
+        # Directives
+        'directive': [
+            include('_whitespace'),
+            (r'#', Punctuation),
+            (r';', Punctuation, '#pop'),
+            (r'\[', Punctuation,
+             ('default', 'statements', 'locals', 'routine-name?')),
+            (words((
+                'abbreviate', 'endif', 'dictionary', 'ifdef', 'iffalse', 'ifndef', 'ifnot',
+                'iftrue', 'ifv3', 'ifv5', 'release', 'serial', 'switches', 'system_file',
+                'version'), prefix='(?i)', suffix=r'\b'),
+             Keyword, 'default'),
+            (r'(?i)(array|global)\b', Keyword,
+             ('default', 'directive-keyword?', '_global')),
+            (r'(?i)attribute\b', Keyword, ('default', 'alias?', '_constant')),
+            (r'(?i)class\b', Keyword,
+             ('object-body', 'duplicates', 'class-name')),
+            (r'(?i)(constant|default)\b', Keyword,
+             ('default', 'constant*')),
+            (r'(?i)(end\b)(.*)', bygroups(Keyword, Text)),
+            (r'(?i)(extend|verb)\b', Keyword, 'grammar'),
+            (r'(?i)fake_action\b', Keyword, ('default', '_constant')),
+            (r'(?i)import\b', Keyword, 'manifest'),
+            (r'(?i)(include|link|origsource)\b', Keyword,
+             ('default', 'before-plain-string?')),
+            (r'(?i)(lowstring|undef)\b', Keyword, ('default', '_constant')),
+            (r'(?i)message\b', Keyword, ('default', 'diagnostic')),
+            (r'(?i)(nearby|object)\b', Keyword,
+             ('object-body', '_object-head')),
+            (r'(?i)property\b', Keyword,
+             ('default', 'alias?', '_constant', 'property-keyword*')),
+            (r'(?i)replace\b', Keyword,
+             ('default', 'routine-name?', 'routine-name?')),
+            (r'(?i)statusline\b', Keyword, ('default', 'directive-keyword?')),
+            (r'(?i)stub\b', Keyword, ('default', 'routine-name?')),
+            (r'(?i)trace\b', Keyword,
+             ('default', 'trace-keyword?', 'trace-keyword?')),
+            (r'(?i)zcharacter\b', Keyword,
+             ('default', 'directive-keyword?', 'directive-keyword?')),
+            (_name, Name.Class, ('object-body', '_object-head'))
+        ],
+        # [, Replace, Stub
+        'routine-name?': [
+            include('_whitespace'),
+            (_name, Name.Function, '#pop'),
+            default('#pop')
+        ],
+        'locals': [
+            include('_whitespace'),
+            (r';', Punctuation, '#pop'),
+            (r'\*', Punctuation),
+            (r'"', String.Double, 'plain-string'),
+            (_name, Name.Variable)
+        ],
+        # Array
+        'many-values': [
+            include('_whitespace'),
+            (r';', Punctuation),
+            (r'\]', Punctuation, '#pop'),
+            (r':', Error),
+            default(('expression', '_expression'))
+        ],
+        # Attribute, Property
+        'alias?': [
+            include('_whitespace'),
+            (r'alias\b', Keyword, ('#pop', '_constant')),
+            default('#pop')
+        ],
+        # Class, Object, Nearby
+        'class-name': [
+            include('_whitespace'),
+            (r'(?=[,;]|(class|has|private|with)\b)', Text, '#pop'),
+            (_name, Name.Class, '#pop')
+        ],
+        'duplicates': [
+            include('_whitespace'),
+            (r'\(', Punctuation, ('#pop', 'expression', '_expression')),
+            default('#pop')
+        ],
+        '_object-head': [
+            (rf'[{_dash}]>', Punctuation),
+            (r'(class|has|private|with)\b', Keyword.Declaration, '#pop'),
+            include('_global')
+        ],
+        'object-body': [
+            include('_whitespace'),
+            (r';', Punctuation, '#pop:2'),
+            (r',', Punctuation),
+            (r'class\b', Keyword.Declaration, 'class-segment'),
+            (r'(has|private|with)\b', Keyword.Declaration),
+            (r':', Error),
+            default(('_object-expression', '_expression'))
+        ],
+        'class-segment': [
+            include('_whitespace'),
+            (r'(?=[,;]|(class|has|private|with)\b)', Text, '#pop'),
+            (_name, Name.Class),
+            default('value')
+        ],
+        # Extend, Verb
+        'grammar': [
+            include('_whitespace'),
+            (r'=', Punctuation, ('#pop', 'default')),
+            (r'\*', Punctuation, ('#pop', 'grammar-line')),
+            default('_directive-keyword')
+        ],
+        'grammar-line': [
+            include('_whitespace'),
+            (r';', Punctuation, '#pop'),
+            (r'[/*]', Punctuation),
+            (rf'[{_dash}]>', Punctuation, 'value'),
+            (r'(noun|scope)\b', Keyword, '=routine'),
+            default('_directive-keyword')
+        ],
+        '=routine': [
+            include('_whitespace'),
+            (r'=', Punctuation, 'routine-name?'),
+            default('#pop')
+        ],
+        # Import
+        'manifest': [
+            include('_whitespace'),
+            (r';', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'(?i)global\b', Keyword, '_global'),
+            default('_global')
+        ],
+        # Include, Link, Message
+        'diagnostic': [
+            include('_whitespace'),
+            (rf'[{_dquote}]', String.Double, ('#pop', 'message-string')),
+            default(('#pop', 'before-plain-string?', 'directive-keyword?'))
+        ],
+        'before-plain-string?': [
+            include('_whitespace'),
+            (rf'[{_dquote}]', String.Double, ('#pop', 'plain-string')),
+            default('#pop')
+        ],
+        'message-string': [
+            (r'[~^]+', String.Escape),
+            include('plain-string')
+        ],
+
+        # Keywords used in directives
+        '_directive-keyword!': [
+            include('_whitespace'),
+            (words((
+                'additive', 'alias', 'buffer', 'class', 'creature', 'data', 'error', 'fatalerror',
+                'first', 'has', 'held', 'individual', 'initial', 'initstr', 'last', 'long', 'meta',
+                'multi', 'multiexcept', 'multiheld', 'multiinside', 'noun', 'number', 'only',
+                'private', 'replace', 'reverse', 'scope', 'score', 'special', 'string', 'table',
+                'terminating', 'time', 'topic', 'warning', 'with'), suffix=r'\b'),
+             Keyword, '#pop'),
+            (r'static\b', Keyword),
+            (rf'[{_dash}]{{1,2}}>|[+=]', Punctuation, '#pop')
+        ],
+        '_directive-keyword': [
+            include('_directive-keyword!'),
+            include('value')
+        ],
+        'directive-keyword?': [
+            include('_directive-keyword!'),
+            default('#pop')
+        ],
+        'property-keyword*': [
+            include('_whitespace'),
+            (words(('additive', 'individual', 'long'),
+                suffix=rf'\b(?=(\s*|(![^{_newline}]*[{_newline}]))*[_a-zA-Z])'),
+             Keyword),
+            default('#pop')
+        ],
+        'trace-keyword?': [
+            include('_whitespace'),
+            (words((
+                'assembly', 'dictionary', 'expressions', 'lines', 'linker',
+                'objects', 'off', 'on', 'symbols', 'tokens', 'verbs'), suffix=r'\b'),
+             Keyword, '#pop'),
+            default('#pop')
+        ],
+
+        # Statements
+        'statements': [
+            include('_whitespace'),
+            (r'\]', Punctuation, '#pop'),
+            (r'[;{}]', Punctuation),
+            (words((
+                'box', 'break', 'continue', 'default', 'give', 'inversion',
+                'new_line', 'quit', 'read', 'remove', 'return', 'rfalse', 'rtrue',
+                'spaces', 'string', 'until'), suffix=r'\b'),
+             Keyword, 'default'),
+            (r'(do|else)\b', Keyword),
+            (r'(font|style)\b', Keyword,
+             ('default', 'miscellaneous-keyword?')),
+            (r'for\b', Keyword, ('for', '(?')),
+            (r'(if|switch|while)', Keyword,
+             ('expression', '_expression', '(?')),
+            (r'(jump|save|restore)\b', Keyword, ('default', 'label?')),
+            (r'objectloop\b', Keyword,
+             ('_keyword-expression', 'variable?', '(?')),
+            (rf'print(_ret)?\b|(?=[{_dquote}])', Keyword, 'print-list'),
+            (r'\.', Name.Label, 'label?'),
+            (r'@', Keyword, 'opcode'),
+            (r'#(?![agrnw]\$|#)', Punctuation, 'directive'),
+            (r'<', Punctuation, 'default'),
+            (r'move\b', Keyword,
+             ('default', '_keyword-expression', '_expression')),
+            default(('default', '_keyword-expression', '_expression'))
+        ],
+        'miscellaneous-keyword?': [
+            include('_whitespace'),
+            (r'(bold|fixed|from|near|off|on|reverse|roman|to|underline)\b',
+             Keyword, '#pop'),
+            (r'(a|A|an|address|char|name|number|object|property|string|the|'
+             rf'The)\b(?=(\s+|(![^{_newline}]*))*\))', Keyword.Pseudo,
+             '#pop'),
+            (rf'{_name}(?=(\s+|(![^{_newline}]*))*\))', Name.Function,
+             '#pop'),
+            default('#pop')
+        ],
+        '(?': [
+            include('_whitespace'),
+            (r'\(', Punctuation, '#pop'),
+            default('#pop')
+        ],
+        'for': [
+            include('_whitespace'),
+            (r';', Punctuation, ('_for-expression', '_expression')),
+            default(('_for-expression', '_expression'))
+        ],
+        'print-list': [
+            include('_whitespace'),
+            (r';', Punctuation, '#pop'),
+            (r':', Error),
+            default(('_list-expression', '_expression', '_list-expression', 'form'))
+        ],
+        'form': [
+            include('_whitespace'),
+            (r'\(', Punctuation, ('#pop', 'miscellaneous-keyword?')),
+            default('#pop')
+        ],
+
+        # Assembly
+        'opcode': [
+            include('_whitespace'),
+            (rf'[{_dquote}]', String.Double, ('operands', 'plain-string')),
+            (rf'[{_dash}]{{1,2}}>', Punctuation, 'operands'),
+            (_name, Keyword, 'operands')
+        ],
+        'operands': [
+            (r':', Error),
+            default(('_assembly-expression', '_expression'))
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text):
+        # 'in' is either a keyword or an operator.
+        # If the token two tokens after 'in' is ')', 'in' is a keyword:
+        #   objectloop(a in b)
+        # Otherwise, it is an operator:
+        #   objectloop(a in b && true)
+        objectloop_queue = []
+        objectloop_token_count = -1
+        previous_token = None
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self,
+                                                                     text):
+            if previous_token is Name.Variable and value == 'in':
+                objectloop_queue = [[index, token, value]]
+                objectloop_token_count = 2
+            elif objectloop_token_count > 0:
+                if token not in Comment and token not in Text:
+                    objectloop_token_count -= 1
+                objectloop_queue.append((index, token, value))
+            else:
+                if objectloop_token_count == 0:
+                    if objectloop_queue[-1][2] == ')':
+                        objectloop_queue[0][1] = Keyword
+                    while objectloop_queue:
+                        yield objectloop_queue.pop(0)
+                    objectloop_token_count = -1
+                yield index, token, value
+            if token not in Comment and token not in Text:
+                previous_token = token
+        while objectloop_queue:
+            yield objectloop_queue.pop(0)
+
+    def analyse_text(text):
+        """We try to find a keyword which seem relatively common, unfortunately
+        there is a decent overlap with Smalltalk keywords otherwise here.."""
+        result = 0
+        if re.search('\borigsource\b', text, re.IGNORECASE):
+            result += 0.05
+
+        return result
+
+
+class Inform7Lexer(RegexLexer):
+    """
+    For Inform 7 source code.
+    """
+
+    name = 'Inform 7'
+    url = 'http://inform7.com/'
+    aliases = ['inform7', 'i7']
+    filenames = ['*.ni', '*.i7x']
+    version_added = '2.0'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    _dash = Inform6Lexer._dash
+    _dquote = Inform6Lexer._dquote
+    _newline = Inform6Lexer._newline
+    _start = rf'\A|(?<=[{_newline}])'
+
+    # There are three variants of Inform 7, differing in how to
+    # interpret at signs and braces in I6T. In top-level inclusions, at
+    # signs in the first column are inweb syntax. In phrase definitions
+    # and use options, tokens in braces are treated as I7. Use options
+    # also interpret "{N}".
+    tokens = {}
+    token_variants = ['+i6t-not-inline', '+i6t-inline', '+i6t-use-option']
+
+    for level in token_variants:
+        tokens[level] = {
+            '+i6-root': list(Inform6Lexer.tokens['root']),
+            '+i6t-root': [  # For Inform6TemplateLexer
+                (rf'[^{Inform6Lexer._newline}]*', Comment.Preproc,
+                 ('directive', '+p'))
+            ],
+            'root': [
+                (r'(\|?\s)+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (rf'[{_dquote}]', Generic.Heading,
+                 ('+main', '+titling', '+titling-string')),
+                default(('+main', '+heading?'))
+            ],
+            '+titling-string': [
+                (rf'[^{_dquote}]+', Generic.Heading),
+                (rf'[{_dquote}]', Generic.Heading, '#pop')
+            ],
+            '+titling': [
+                (r'\[', Comment.Multiline, '+comment'),
+                (rf'[^{_dquote}.;:|{_newline}]+', Generic.Heading),
+                (rf'[{_dquote}]', Generic.Heading, '+titling-string'),
+                (rf'[{_newline}]{{2}}|(?<=[\s{_dquote}])\|[\s{_dquote}]',
+                 Text, ('#pop', '+heading?')),
+                (rf'[.;:]|(?<=[\s{_dquote}])\|', Text, '#pop'),
+                (rf'[|{_newline}]', Generic.Heading)
+            ],
+            '+main': [
+                (rf'(?i)[^{_dquote}:a\[(|{_newline}]+', Text),
+                (rf'[{_dquote}]', String.Double, '+text'),
+                (r':', Text, '+phrase-definition'),
+                (r'(?i)\bas\b', Text, '+use-option'),
+                (r'\[', Comment.Multiline, '+comment'),
+                (rf'(\([{_dash}])(.*?)([{_dash}]\))',
+                 bygroups(Punctuation,
+                          using(this, state=('+i6-root', 'directive'),
+                                i6t='+i6t-not-inline'), Punctuation)),
+                (rf'({_start}|(?<=[\s;:.{_dquote}]))\|\s|[{_newline}]{{2,}}', Text, '+heading?'),
+                (rf'(?i)[a(|{_newline}]', Text)
+            ],
+            '+phrase-definition': [
+                (r'\s+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (rf'(\([{_dash}])(.*?)([{_dash}]\))',
+                 bygroups(Punctuation,
+                          using(this, state=('+i6-root', 'directive',
+                                             'default', 'statements'),
+                                i6t='+i6t-inline'), Punctuation), '#pop'),
+                default('#pop')
+            ],
+            '+use-option': [
+                (r'\s+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (rf'(\([{_dash}])(.*?)([{_dash}]\))',
+                 bygroups(Punctuation,
+                          using(this, state=('+i6-root', 'directive'),
+                                i6t='+i6t-use-option'), Punctuation), '#pop'),
+                default('#pop')
+            ],
+            '+comment': [
+                (r'[^\[\]]+', Comment.Multiline),
+                (r'\[', Comment.Multiline, '#push'),
+                (r'\]', Comment.Multiline, '#pop')
+            ],
+            '+text': [
+                (rf'[^\[{_dquote}]+', String.Double),
+                (r'\[.*?\]', String.Interpol),
+                (rf'[{_dquote}]', String.Double, '#pop')
+            ],
+            '+heading?': [
+                (r'(\|?\s)+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (rf'[{_dash}]{{4}}\s+', Text, '+documentation-heading'),
+                (rf'[{_dash}]{{1,3}}', Text),
+                (rf'(?i)(volume|book|part|chapter|section)\b[^{_newline}]*',
+                 Generic.Heading, '#pop'),
+                default('#pop')
+            ],
+            '+documentation-heading': [
+                (r'\s+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (r'(?i)documentation\s+', Text, '+documentation-heading2'),
+                default('#pop')
+            ],
+            '+documentation-heading2': [
+                (r'\s+', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+                (rf'[{_dash}]{{4}}\s', Text, '+documentation'),
+                default('#pop:2')
+            ],
+            '+documentation': [
+                (rf'(?i)({_start})\s*(chapter|example)\s*:[^{_newline}]*', Generic.Heading),
+                (rf'(?i)({_start})\s*section\s*:[^{_newline}]*',
+                 Generic.Subheading),
+                (rf'(({_start})\t.*?[{_newline}])+',
+                 using(this, state='+main')),
+                (rf'[^{_newline}\[]+|[{_newline}\[]', Text),
+                (r'\[', Comment.Multiline, '+comment'),
+            ],
+            '+i6t-not-inline': [
+                (rf'({_start})@c( .*?)?([{_newline}]|\Z)',
+                 Comment.Preproc),
+                (rf'({_start})@([{_dash}]+|Purpose:)[^{_newline}]*',
+                 Comment.Preproc),
+                (rf'({_start})@p( .*?)?([{_newline}]|\Z)',
+                 Generic.Heading, '+p')
+            ],
+            '+i6t-use-option': [
+                include('+i6t-not-inline'),
+                (r'(\{)(N)(\})', bygroups(Punctuation, Text, Punctuation))
+            ],
+            '+i6t-inline': [
+                (r'(\{)(\S[^}]*)?(\})',
+                 bygroups(Punctuation, using(this, state='+main'),
+                          Punctuation))
+            ],
+            '+i6t': [
+                (rf'(\{{[{_dash}])(![^}}]*)(\}}?)',
+                 bygroups(Punctuation, Comment.Single, Punctuation)),
+                (rf'(\{{[{_dash}])(lines)(:)([^}}]*)(\}}?)',
+                 bygroups(Punctuation, Keyword, Punctuation, Text,
+                          Punctuation), '+lines'),
+                (rf'(\{{[{_dash}])([^:}}]*)(:?)([^}}]*)(\}}?)',
+                 bygroups(Punctuation, Keyword, Punctuation, Text,
+                          Punctuation)),
+                (r'(\(\+)(.*?)(\+\)|\Z)',
+                 bygroups(Punctuation, using(this, state='+main'),
+                          Punctuation))
+            ],
+            '+p': [
+                (r'[^@]+', Comment.Preproc),
+                (rf'({_start})@c( .*?)?([{_newline}]|\Z)',
+                 Comment.Preproc, '#pop'),
+                (rf'({_start})@([{_dash}]|Purpose:)', Comment.Preproc),
+                (rf'({_start})@p( .*?)?([{_newline}]|\Z)',
+                 Generic.Heading),
+                (r'@', Comment.Preproc)
+            ],
+            '+lines': [
+                (rf'({_start})@c( .*?)?([{_newline}]|\Z)',
+                 Comment.Preproc),
+                (rf'({_start})@([{_dash}]|Purpose:)[^{_newline}]*',
+                 Comment.Preproc),
+                (rf'({_start})@p( .*?)?([{_newline}]|\Z)',
+                 Generic.Heading, '+p'),
+                (rf'({_start})@\w*[ {_newline}]', Keyword),
+                (rf'![^{_newline}]*', Comment.Single),
+                (rf'(\{{)([{_dash}]endlines)(\}})',
+                 bygroups(Punctuation, Keyword, Punctuation), '#pop'),
+                (rf'[^@!{{]+?([{_newline}]|\Z)|.', Text)
+            ]
+        }
+        # Inform 7 can include snippets of Inform 6 template language,
+        # so all of Inform6Lexer's states are copied here, with
+        # modifications to account for template syntax. Inform7Lexer's
+        # own states begin with '+' to avoid name conflicts. Some of
+        # Inform6Lexer's states begin with '_': these are not modified.
+        # They deal with template syntax either by including modified
+        # states, or by matching r'' then pushing to modified states.
+        for token in Inform6Lexer.tokens:
+            if token == 'root':
+                continue
+            tokens[level][token] = list(Inform6Lexer.tokens[token])
+            if not token.startswith('_'):
+                tokens[level][token][:0] = [include('+i6t'), include(level)]
+
+    def __init__(self, **options):
+        level = options.get('i6t', '+i6t-not-inline')
+        if level not in self._all_tokens:
+            self._tokens = self.__class__.process_tokendef(level)
+        else:
+            self._tokens = self._all_tokens[level]
+        RegexLexer.__init__(self, **options)
+
+
+class Inform6TemplateLexer(Inform7Lexer):
+    """
+    For Inform 6 template code.
+    """
+
+    name = 'Inform 6 template'
+    aliases = ['i6t']
+    filenames = ['*.i6t']
+    version_added = '2.0'
+
+    def get_tokens_unprocessed(self, text, stack=('+i6t-root',)):
+        return Inform7Lexer.get_tokens_unprocessed(self, text, stack)
+
+
+class Tads3Lexer(RegexLexer):
+    """
+    For TADS 3 source code.
+    """
+
+    name = 'TADS 3'
+    aliases = ['tads3']
+    filenames = ['*.t']
+    url = 'https://www.tads.org'
+    version_added = ''
+
+    flags = re.DOTALL | re.MULTILINE
+
+    _comment_single = r'(?://(?:[^\\\n]|\\+[\w\W])*$)'
+    _comment_multiline = r'(?:/\*(?:[^*]|\*(?!/))*\*/)'
+    _escape = (r'(?:\\(?:[\n\\<>"\'^v bnrt]|u[\da-fA-F]{,4}|x[\da-fA-F]{,2}|'
+               r'[0-3]?[0-7]{1,2}))')
+    _name = r'(?:[_a-zA-Z]\w*)'
+    _no_quote = r'(?=\s|\\?>)'
+    _operator = (r'(?:&&|\|\||\+\+|--|\?\?|::|[.,@\[\]~]|'
+                 r'(?:[=+\-*/%!&|^]|<<?|>>?>?)=?)')
+    _ws = rf'(?:\\|\s|{_comment_single}|{_comment_multiline})'
+    _ws_pp = rf'(?:\\\n|[^\S\n]|{_comment_single}|{_comment_multiline})'
+
+    def _make_string_state(triple, double, verbatim=None, _escape=_escape):
+        if verbatim:
+            verbatim = ''.join([f'(?:{re.escape(c.lower())}|{re.escape(c.upper())})'
+                                for c in verbatim])
+        char = r'"' if double else r"'"
+        token = String.Double if double else String.Single
+        escaped_quotes = rf'+|{char}(?!{char}{{2}})' if triple else r''
+        prefix = '{}{}'.format('t' if triple else '', 'd' if double else 's')
+        tag_state_name = f'{prefix}qt'
+        state = []
+        if triple:
+            state += [
+                (rf'{char}{{3,}}', token, '#pop'),
+                (rf'\\{char}+', String.Escape),
+                (char, token)
+            ]
+        else:
+            state.append((char, token, '#pop'))
+        state += [
+            include('s/verbatim'),
+            (rf'[^\\<&{{}}{char}]+', token)
+        ]
+        if verbatim:
+            # This regex can't use `(?i)` because escape sequences are
+            # case-sensitive. `<\XMP>` works; `<\xmp>` doesn't.
+            state.append((rf'\\?<(/|\\\\|(?!{_escape})\\){verbatim}(?=[\s=>])',
+                          Name.Tag, ('#pop', f'{prefix}qs', tag_state_name)))
+        else:
+            state += [
+                (rf'\\?<!([^><\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*>?', Comment.Multiline),
+                (r'(?i)\\?<listing(?=[\s=>]|\\>)', Name.Tag,
+                 ('#pop', f'{prefix}qs/listing', tag_state_name)),
+                (r'(?i)\\?<xmp(?=[\s=>]|\\>)', Name.Tag,
+                 ('#pop', f'{prefix}qs/xmp', tag_state_name)),
+                (rf'\\?<([^\s=><\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*', Name.Tag,
+                 tag_state_name),
+                include('s/entity')
+            ]
+        state += [
+            include('s/escape'),
+            (rf'\{{([^}}<\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*\}}', String.Interpol),
+            (r'[\\&{}<]', token)
+        ]
+        return state
+
+    def _make_tag_state(triple, double, _escape=_escape):
+        char = r'"' if double else r"'"
+        quantifier = r'{3,}' if triple else r''
+        state_name = '{}{}qt'.format('t' if triple else '', 'd' if double else 's')
+        token = String.Double if double else String.Single
+        escaped_quotes = rf'+|{char}(?!{char}{{2}})' if triple else r''
+        return [
+            (rf'{char}{quantifier}', token, '#pop:2'),
+            (r'(\s|\\\n)+', Text),
+            (r'(=)(\\?")', bygroups(Punctuation, String.Double),
+             f'dqs/{state_name}'),
+            (r"(=)(\\?')", bygroups(Punctuation, String.Single),
+             f'sqs/{state_name}'),
+            (r'=', Punctuation, f'uqs/{state_name}'),
+            (r'\\?>', Name.Tag, '#pop'),
+            (rf'\{{([^}}<\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*\}}', String.Interpol),
+            (rf'([^\s=><\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)+', Name.Attribute),
+            include('s/escape'),
+            include('s/verbatim'),
+            include('s/entity'),
+            (r'[\\{}&]', Name.Attribute)
+        ]
+
+    def _make_attribute_value_state(terminator, host_triple, host_double,
+                                    _escape=_escape):
+        token = (String.Double if terminator == r'"' else
+                 String.Single if terminator == r"'" else String.Other)
+        host_char = r'"' if host_double else r"'"
+        host_quantifier = r'{3,}' if host_triple else r''
+        host_token = String.Double if host_double else String.Single
+        escaped_quotes = (rf'+|{host_char}(?!{host_char}{{2}})'
+                          if host_triple else r'')
+        return [
+            (rf'{host_char}{host_quantifier}', host_token, '#pop:3'),
+            (r'{}{}'.format(r'' if token is String.Other else r'\\?', terminator),
+             token, '#pop'),
+            include('s/verbatim'),
+            include('s/entity'),
+            (rf'\{{([^}}<\\{host_char}]|<(?!<)|\\{host_char}{escaped_quotes}|{_escape}|\\.)*\}}', String.Interpol),
+            (r'([^\s"\'<%s{}\\&])+' % (r'>' if token is String.Other else r''),
+             token),
+            include('s/escape'),
+            (r'["\'\s&{<}\\]', token)
+        ]
+
+    tokens = {
+        'root': [
+            ('\ufeff', Text),
+            (r'\{', Punctuation, 'object-body'),
+            (r';+', Punctuation),
+            (r'(?=(argcount|break|case|catch|continue|default|definingobj|'
+             r'delegated|do|else|for|foreach|finally|goto|if|inherited|'
+             r'invokee|local|nil|new|operator|replaced|return|self|switch|'
+             r'targetobj|targetprop|throw|true|try|while)\b)', Text, 'block'),
+            (rf'({_name})({_ws}*)(\()',
+             bygroups(Name.Function, using(this, state='whitespace'),
+                      Punctuation),
+             ('block?/root', 'more/parameters', 'main/parameters')),
+            include('whitespace'),
+            (r'\++', Punctuation),
+            (r'[^\s!"%-(*->@-_a-z{-~]+', Error),  # Averts an infinite loop
+            (r'(?!\Z)', Text, 'main/root')
+        ],
+        'main/root': [
+            include('main/basic'),
+            default(('#pop', 'object-body/no-braces', 'classes', 'class'))
+        ],
+        'object-body/no-braces': [
+            (r';', Punctuation, '#pop'),
+            (r'\{', Punctuation, ('#pop', 'object-body')),
+            include('object-body')
+        ],
+        'object-body': [
+            (r';', Punctuation),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+            (r':', Punctuation, ('classes', 'class')),
+            (rf'({_name}?)({_ws}*)(\()',
+             bygroups(Name.Function, using(this, state='whitespace'),
+                      Punctuation),
+             ('block?', 'more/parameters', 'main/parameters')),
+            (rf'({_name})({_ws}*)(\{{)',
+             bygroups(Name.Function, using(this, state='whitespace'),
+                      Punctuation), 'block'),
+            (rf'({_name})({_ws}*)(:)',
+             bygroups(Name.Variable, using(this, state='whitespace'),
+                      Punctuation),
+             ('object-body/no-braces', 'classes', 'class')),
+            include('whitespace'),
+            (rf'->|{_operator}', Punctuation, 'main'),
+            default('main/object-body')
+        ],
+        'main/object-body': [
+            include('main/basic'),
+            (rf'({_name})({_ws}*)(=?)',
+             bygroups(Name.Variable, using(this, state='whitespace'),
+                      Punctuation), ('#pop', 'more', 'main')),
+            default('#pop:2')
+        ],
+        'block?/root': [
+            (r'\{', Punctuation, ('#pop', 'block')),
+            include('whitespace'),
+            (r'(?=[\[\'"<(:])', Text,  # It might be a VerbRule macro.
+             ('#pop', 'object-body/no-braces', 'grammar', 'grammar-rules')),
+            # It might be a macro like DefineAction.
+            default(('#pop', 'object-body/no-braces'))
+        ],
+        'block?': [
+            (r'\{', Punctuation, ('#pop', 'block')),
+            include('whitespace'),
+            default('#pop')
+        ],
+        'block/basic': [
+            (r'[;:]+', Punctuation),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+            (r'default\b', Keyword.Reserved),
+            (rf'({_name})({_ws}*)(:)',
+             bygroups(Name.Label, using(this, state='whitespace'),
+                      Punctuation)),
+            include('whitespace')
+        ],
+        'block': [
+            include('block/basic'),
+            (r'(?!\Z)', Text, ('more', 'main'))
+        ],
+        'block/embed': [
+            (r'>>', String.Interpol, '#pop'),
+            include('block/basic'),
+            (r'(?!\Z)', Text, ('more/embed', 'main'))
+        ],
+        'main/basic': [
+            include('whitespace'),
+            (r'\(', Punctuation, ('#pop', 'more', 'main')),
+            (r'\[', Punctuation, ('#pop', 'more/list', 'main')),
+            (r'\{', Punctuation, ('#pop', 'more/inner', 'main/inner',
+                                  'more/parameters', 'main/parameters')),
+            (r'\*|\.{3}', Punctuation, '#pop'),
+            (r'(?i)0x[\da-f]+', Number.Hex, '#pop'),
+            (r'(\d+\.(?!\.)\d*|\.\d+)([eE][-+]?\d+)?|\d+[eE][-+]?\d+',
+             Number.Float, '#pop'),
+            (r'0[0-7]+', Number.Oct, '#pop'),
+            (r'\d+', Number.Integer, '#pop'),
+            (r'"""', String.Double, ('#pop', 'tdqs')),
+            (r"'''", String.Single, ('#pop', 'tsqs')),
+            (r'"', String.Double, ('#pop', 'dqs')),
+            (r"'", String.Single, ('#pop', 'sqs')),
+            (r'R"""', String.Regex, ('#pop', 'tdqr')),
+            (r"R'''", String.Regex, ('#pop', 'tsqr')),
+            (r'R"', String.Regex, ('#pop', 'dqr')),
+            (r"R'", String.Regex, ('#pop', 'sqr')),
+            # Two-token keywords
+            (rf'(extern)({_ws}+)(object\b)',
+             bygroups(Keyword.Reserved, using(this, state='whitespace'),
+                      Keyword.Reserved)),
+            (rf'(function|method)({_ws}*)(\()',
+             bygroups(Keyword.Reserved, using(this, state='whitespace'),
+                      Punctuation),
+             ('#pop', 'block?', 'more/parameters', 'main/parameters')),
+            (rf'(modify)({_ws}+)(grammar\b)',
+             bygroups(Keyword.Reserved, using(this, state='whitespace'),
+                      Keyword.Reserved),
+             ('#pop', 'object-body/no-braces', ':', 'grammar')),
+            (rf'(new)({_ws}+(?=(?:function|method)\b))',
+             bygroups(Keyword.Reserved, using(this, state='whitespace'))),
+            (rf'(object)({_ws}+)(template\b)',
+             bygroups(Keyword.Reserved, using(this, state='whitespace'),
+                      Keyword.Reserved), ('#pop', 'template')),
+            (rf'(string)({_ws}+)(template\b)',
+             bygroups(Keyword, using(this, state='whitespace'),
+                      Keyword.Reserved), ('#pop', 'function-name')),
+            # Keywords
+            (r'(argcount|definingobj|invokee|replaced|targetobj|targetprop)\b',
+             Name.Builtin, '#pop'),
+            (r'(break|continue|goto)\b', Keyword.Reserved, ('#pop', 'label')),
+            (r'(case|extern|if|intrinsic|return|static|while)\b',
+             Keyword.Reserved),
+            (r'catch\b', Keyword.Reserved, ('#pop', 'catch')),
+            (r'class\b', Keyword.Reserved,
+             ('#pop', 'object-body/no-braces', 'class')),
+            (r'(default|do|else|finally|try)\b', Keyword.Reserved, '#pop'),
+            (r'(dictionary|property)\b', Keyword.Reserved,
+             ('#pop', 'constants')),
+            (r'enum\b', Keyword.Reserved, ('#pop', 'enum')),
+            (r'export\b', Keyword.Reserved, ('#pop', 'main')),
+            (r'(for|foreach)\b', Keyword.Reserved,
+             ('#pop', 'more/inner', 'main/inner')),
+            (r'(function|method)\b', Keyword.Reserved,
+             ('#pop', 'block?', 'function-name')),
+            (r'grammar\b', Keyword.Reserved,
+             ('#pop', 'object-body/no-braces', 'grammar')),
+            (r'inherited\b', Keyword.Reserved, ('#pop', 'inherited')),
+            (r'local\b', Keyword.Reserved,
+             ('#pop', 'more/local', 'main/local')),
+            (r'(modify|replace|switch|throw|transient)\b', Keyword.Reserved,
+             '#pop'),
+            (r'new\b', Keyword.Reserved, ('#pop', 'class')),
+            (r'(nil|true)\b', Keyword.Constant, '#pop'),
+            (r'object\b', Keyword.Reserved, ('#pop', 'object-body/no-braces')),
+            (r'operator\b', Keyword.Reserved, ('#pop', 'operator')),
+            (r'propertyset\b', Keyword.Reserved,
+             ('#pop', 'propertyset', 'main')),
+            (r'self\b', Name.Builtin.Pseudo, '#pop'),
+            (r'template\b', Keyword.Reserved, ('#pop', 'template')),
+            # Operators
+            (rf'(__objref|defined)({_ws}*)(\()',
+             bygroups(Operator.Word, using(this, state='whitespace'),
+                      Operator), ('#pop', 'more/__objref', 'main')),
+            (r'delegated\b', Operator.Word),
+            # Compiler-defined macros and built-in properties
+            (r'(__DATE__|__DEBUG|__LINE__|__FILE__|'
+             r'__TADS_MACRO_FORMAT_VERSION|__TADS_SYS_\w*|__TADS_SYSTEM_NAME|'
+             r'__TADS_VERSION_MAJOR|__TADS_VERSION_MINOR|__TADS3|__TIME__|'
+             r'construct|finalize|grammarInfo|grammarTag|lexicalParent|'
+             r'miscVocab|sourceTextGroup|sourceTextGroupName|'
+             r'sourceTextGroupOrder|sourceTextOrder)\b', Name.Builtin, '#pop')
+        ],
+        'main': [
+            include('main/basic'),
+            (_name, Name, '#pop'),
+            default('#pop')
+        ],
+        'more/basic': [
+            (r'\(', Punctuation, ('more/list', 'main')),
+            (r'\[', Punctuation, ('more', 'main')),
+            (r'\.{3}', Punctuation),
+            (r'->|\.\.', Punctuation, 'main'),
+            (r'(?=;)|[:)\]]', Punctuation, '#pop'),
+            include('whitespace'),
+            (_operator, Operator, 'main'),
+            (r'\?', Operator, ('main', 'more/conditional', 'main')),
+            (rf'(is|not)({_ws}+)(in\b)',
+             bygroups(Operator.Word, using(this, state='whitespace'),
+                      Operator.Word)),
+            (r'[^\s!"%-_a-z{-~]+', Error)  # Averts an infinite loop
+        ],
+        'more': [
+            include('more/basic'),
+            default('#pop')
+        ],
+        # Then expression (conditional operator)
+        'more/conditional': [
+            (r':(?!:)', Operator, '#pop'),
+            include('more')
+        ],
+        # Embedded expressions
+        'more/embed': [
+            (r'>>', String.Interpol, '#pop:2'),
+            include('more')
+        ],
+        # For/foreach loop initializer or short-form anonymous function
+        'main/inner': [
+            (r'\(', Punctuation, ('#pop', 'more/inner', 'main/inner')),
+            (r'local\b', Keyword.Reserved, ('#pop', 'main/local')),
+            include('main')
+        ],
+        'more/inner': [
+            (r'\}', Punctuation, '#pop'),
+            (r',', Punctuation, 'main/inner'),
+            (r'(in|step)\b', Keyword, 'main/inner'),
+            include('more')
+        ],
+        # Local
+        'main/local': [
+            (_name, Name.Variable, '#pop'),
+            include('whitespace')
+        ],
+        'more/local': [
+            (r',', Punctuation, 'main/local'),
+            include('more')
+        ],
+        # List
+        'more/list': [
+            (r'[,:]', Punctuation, 'main'),
+            include('more')
+        ],
+        # Parameter list
+        'main/parameters': [
+            (rf'({_name})({_ws}*)(?=:)',
+             bygroups(Name.Variable, using(this, state='whitespace')), '#pop'),
+            (rf'({_name})({_ws}+)({_name})',
+             bygroups(Name.Class, using(this, state='whitespace'),
+                      Name.Variable), '#pop'),
+            (r'\[+', Punctuation),
+            include('main/basic'),
+            (_name, Name.Variable, '#pop'),
+            default('#pop')
+        ],
+        'more/parameters': [
+            (rf'(:)({_ws}*(?=[?=,:)]))',
+             bygroups(Punctuation, using(this, state='whitespace'))),
+            (r'[?\]]+', Punctuation),
+            (r'[:)]', Punctuation, ('#pop', 'multimethod?')),
+            (r',', Punctuation, 'main/parameters'),
+            (r'=', Punctuation, ('more/parameter', 'main')),
+            include('more')
+        ],
+        'more/parameter': [
+            (r'(?=[,)])', Text, '#pop'),
+            include('more')
+        ],
+        'multimethod?': [
+            (r'multimethod\b', Keyword, '#pop'),
+            include('whitespace'),
+            default('#pop')
+        ],
+
+        # Statements and expressions
+        'more/__objref': [
+            (r',', Punctuation, 'mode'),
+            (r'\)', Operator, '#pop'),
+            include('more')
+        ],
+        'mode': [
+            (r'(error|warn)\b', Keyword, '#pop'),
+            include('whitespace')
+        ],
+        'catch': [
+            (r'\(+', Punctuation),
+            (_name, Name.Exception, ('#pop', 'variables')),
+            include('whitespace')
+        ],
+        'enum': [
+            include('whitespace'),
+            (r'token\b', Keyword, ('#pop', 'constants')),
+            default(('#pop', 'constants'))
+        ],
+        'grammar': [
+            (r'\)+', Punctuation),
+            (r'\(', Punctuation, 'grammar-tag'),
+            (r':', Punctuation, 'grammar-rules'),
+            (_name, Name.Class),
+            include('whitespace')
+        ],
+        'grammar-tag': [
+            include('whitespace'),
+            (r'"""([^\\"<]|""?(?!")|\\"+|\\.|<(?!<))+("{3,}|<<)|'
+             r'R"""([^\\"]|""?(?!")|\\"+|\\.)+"{3,}|'
+             r"'''([^\\'<]|''?(?!')|\\'+|\\.|<(?!<))+('{3,}|<<)|"
+             r"R'''([^\\']|''?(?!')|\\'+|\\.)+'{3,}|"
+             r'"([^\\"<]|\\.|<(?!<))+("|<<)|R"([^\\"]|\\.)+"|'
+             r"'([^\\'<]|\\.|<(?!<))+('|<<)|R'([^\\']|\\.)+'|"
+             r"([^)\s\\/]|/(?![/*]))+|\)", String.Other, '#pop')
+        ],
+        'grammar-rules': [
+            include('string'),
+            include('whitespace'),
+            (rf'(\[)({_ws}*)(badness)',
+             bygroups(Punctuation, using(this, state='whitespace'), Keyword),
+             'main'),
+            (rf'->|{_operator}|[()]', Punctuation),
+            (_name, Name.Constant),
+            default('#pop:2')
+        ],
+        ':': [
+            (r':', Punctuation, '#pop')
+        ],
+        'function-name': [
+            (r'(<<([^>]|>>>|>(?!>))*>>)+', String.Interpol),
+            (rf'(?={_name}?{_ws}*[({{])', Text, '#pop'),
+            (_name, Name.Function, '#pop'),
+            include('whitespace')
+        ],
+        'inherited': [
+            (r'<', Punctuation, ('#pop', 'classes', 'class')),
+            include('whitespace'),
+            (_name, Name.Class, '#pop'),
+            default('#pop')
+        ],
+        'operator': [
+            (r'negate\b', Operator.Word, '#pop'),
+            include('whitespace'),
+            (_operator, Operator),
+            default('#pop')
+        ],
+        'propertyset': [
+            (r'\(', Punctuation, ('more/parameters', 'main/parameters')),
+            (r'\{', Punctuation, ('#pop', 'object-body')),
+            include('whitespace')
+        ],
+        'template': [
+            (r'(?=;)', Text, '#pop'),
+            include('string'),
+            (r'inherited\b', Keyword.Reserved),
+            include('whitespace'),
+            (rf'->|\?|{_operator}', Punctuation),
+            (_name, Name.Variable)
+        ],
+
+        # Identifiers
+        'class': [
+            (r'\*|\.{3}', Punctuation, '#pop'),
+            (r'object\b', Keyword.Reserved, '#pop'),
+            (r'transient\b', Keyword.Reserved),
+            (_name, Name.Class, '#pop'),
+            include('whitespace'),
+            default('#pop')
+        ],
+        'classes': [
+            (r'[:,]', Punctuation, 'class'),
+            include('whitespace'),
+            (r'>', Punctuation, '#pop'),
+            default('#pop')
+        ],
+        'constants': [
+            (r',+', Punctuation),
+            (r';', Punctuation, '#pop'),
+            (r'property\b', Keyword.Reserved),
+            (_name, Name.Constant),
+            include('whitespace')
+        ],
+        'label': [
+            (_name, Name.Label, '#pop'),
+            include('whitespace'),
+            default('#pop')
+        ],
+        'variables': [
+            (r',+', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+            include('whitespace'),
+            (_name, Name.Variable)
+        ],
+
+        # Whitespace and comments
+        'whitespace': [
+            (rf'^{_ws_pp}*#({_comment_multiline}|[^\n]|(?<=\\)\n)*\n?',
+             Comment.Preproc),
+            (_comment_single, Comment.Single),
+            (_comment_multiline, Comment.Multiline),
+            (rf'\\+\n+{_ws_pp}*#?|\n+|([^\S\n]|\\)+', Text)
+        ],
+
+        # Strings
+        'string': [
+            (r'"""', String.Double, 'tdqs'),
+            (r"'''", String.Single, 'tsqs'),
+            (r'"', String.Double, 'dqs'),
+            (r"'", String.Single, 'sqs')
+        ],
+        's/escape': [
+            (rf'\{{\{{|\}}\}}|{_escape}', String.Escape)
+        ],
+        's/verbatim': [
+            (r'<<\s*(as\s+decreasingly\s+likely\s+outcomes|cycling|else|end|'
+             r'first\s+time|one\s+of|only|or|otherwise|'
+             r'(sticky|(then\s+)?(purely\s+)?at)\s+random|stopping|'
+             r'(then\s+)?(half\s+)?shuffled|\|\|)\s*>>', String.Interpol),
+            (rf'<<(%(_({_escape}|\\?.)|[\-+ ,#]|\[\d*\]?)*\d*\.?\d*({_escape}|\\?.)|'
+             r'\s*((else|otherwise)\s+)?(if|unless)\b)?',
+             String.Interpol, ('block/embed', 'more/embed', 'main'))
+        ],
+        's/entity': [
+            (r'(?i)&(#(x[\da-f]+|\d+)|[a-z][\da-z]*);?', Name.Entity)
+        ],
+        'tdqs': _make_string_state(True, True),
+        'tsqs': _make_string_state(True, False),
+        'dqs': _make_string_state(False, True),
+        'sqs': _make_string_state(False, False),
+        'tdqs/listing': _make_string_state(True, True, 'listing'),
+        'tsqs/listing': _make_string_state(True, False, 'listing'),
+        'dqs/listing': _make_string_state(False, True, 'listing'),
+        'sqs/listing': _make_string_state(False, False, 'listing'),
+        'tdqs/xmp': _make_string_state(True, True, 'xmp'),
+        'tsqs/xmp': _make_string_state(True, False, 'xmp'),
+        'dqs/xmp': _make_string_state(False, True, 'xmp'),
+        'sqs/xmp': _make_string_state(False, False, 'xmp'),
+
+        # Tags
+        'tdqt': _make_tag_state(True, True),
+        'tsqt': _make_tag_state(True, False),
+        'dqt': _make_tag_state(False, True),
+        'sqt': _make_tag_state(False, False),
+        'dqs/tdqt': _make_attribute_value_state(r'"', True, True),
+        'dqs/tsqt': _make_attribute_value_state(r'"', True, False),
+        'dqs/dqt': _make_attribute_value_state(r'"', False, True),
+        'dqs/sqt': _make_attribute_value_state(r'"', False, False),
+        'sqs/tdqt': _make_attribute_value_state(r"'", True, True),
+        'sqs/tsqt': _make_attribute_value_state(r"'", True, False),
+        'sqs/dqt': _make_attribute_value_state(r"'", False, True),
+        'sqs/sqt': _make_attribute_value_state(r"'", False, False),
+        'uqs/tdqt': _make_attribute_value_state(_no_quote, True, True),
+        'uqs/tsqt': _make_attribute_value_state(_no_quote, True, False),
+        'uqs/dqt': _make_attribute_value_state(_no_quote, False, True),
+        'uqs/sqt': _make_attribute_value_state(_no_quote, False, False),
+
+        # Regular expressions
+        'tdqr': [
+            (r'[^\\"]+', String.Regex),
+            (r'\\"*', String.Regex),
+            (r'"{3,}', String.Regex, '#pop'),
+            (r'"', String.Regex)
+        ],
+        'tsqr': [
+            (r"[^\\']+", String.Regex),
+            (r"\\'*", String.Regex),
+            (r"'{3,}", String.Regex, '#pop'),
+            (r"'", String.Regex)
+        ],
+        'dqr': [
+            (r'[^\\"]+', String.Regex),
+            (r'\\"?', String.Regex),
+            (r'"', String.Regex, '#pop')
+        ],
+        'sqr': [
+            (r"[^\\']+", String.Regex),
+            (r"\\'?", String.Regex),
+            (r"'", String.Regex, '#pop')
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text, **kwargs):
+        pp = rf'^{self._ws_pp}*#{self._ws_pp}*'
+        if_false_level = 0
+        for index, token, value in (
+            RegexLexer.get_tokens_unprocessed(self, text, **kwargs)):
+            if if_false_level == 0:  # Not in a false #if
+                if (token is Comment.Preproc and
+                    re.match(rf'{pp}if{self._ws_pp}+(0|nil){self._ws_pp}*$\n?', value)):
+                    if_false_level = 1
+            else:  # In a false #if
+                if token is Comment.Preproc:
+                    if (if_false_level == 1 and
+                          re.match(rf'{pp}el(if|se)\b', value)):
+                        if_false_level = 0
+                    elif re.match(rf'{pp}if', value):
+                        if_false_level += 1
+                    elif re.match(rf'{pp}endif\b', value):
+                        if_false_level -= 1
+                else:
+                    token = Comment
+            yield index, token, value
+
+    def analyse_text(text):
+        """This is a rather generic descriptive language without strong
+        identifiers. It looks like a 'GameMainDef' has to be present,
+        and/or a 'versionInfo' with an 'IFID' field."""
+        result = 0
+        if '__TADS' in text or 'GameMainDef' in text:
+            result += 0.2
+
+        # This is a fairly unique keyword which is likely used in source as well
+        if 'versionInfo' in text and 'IFID' in text:
+            result += 0.1
+
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/iolang.py b/.venv/Lib/site-packages/pygments/lexers/iolang.py
new file mode 100644 (file)
index 0000000..0269384
--- /dev/null
@@ -0,0 +1,61 @@
+"""
+    pygments.lexers.iolang
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Io language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Comment, Operator, Keyword, Name, String, Number, \
+    Whitespace
+
+__all__ = ['IoLexer']
+
+
+class IoLexer(RegexLexer):
+    """
+    For Io (a small, prototype-based programming language) source.
+    """
+    name = 'Io'
+    url = 'http://iolanguage.com/'
+    filenames = ['*.io']
+    aliases = ['io']
+    mimetypes = ['text/x-iosrc']
+    version_added = '0.10'
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            # Comments
+            (r'//(.*?)$', Comment.Single),
+            (r'#(.*?)$', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'/\+', Comment.Multiline, 'nestedcomment'),
+            # DoubleQuotedString
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            # Operators
+            (r'::=|:=|=|\(|\)|;|,|\*|-|\+|>|<|@|!|/|\||\^|\.|%|&|\[|\]|\{|\}',
+             Operator),
+            # keywords
+            (r'(clone|do|doFile|doString|method|for|if|else|elseif|then)\b',
+             Keyword),
+            # constants
+            (r'(nil|false|true)\b', Name.Constant),
+            # names
+            (r'(Object|list|List|Map|args|Sequence|Coroutine|File)\b',
+             Name.Builtin),
+            (r'[a-zA-Z_]\w*', Name),
+            # numbers
+            (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+', Number.Integer)
+        ],
+        'nestedcomment': [
+            (r'[^+/]+', Comment.Multiline),
+            (r'/\+', Comment.Multiline, '#push'),
+            (r'\+/', Comment.Multiline, '#pop'),
+            (r'[+/]', Comment.Multiline),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/j.py b/.venv/Lib/site-packages/pygments/lexers/j.py
new file mode 100644 (file)
index 0000000..1eb418e
--- /dev/null
@@ -0,0 +1,151 @@
+"""
+    pygments.lexers.j
+    ~~~~~~~~~~~~~~~~~
+
+    Lexer for the J programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include, bygroups
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Whitespace
+
+__all__ = ['JLexer']
+
+
+class JLexer(RegexLexer):
+    """
+    For J source code.
+    """
+
+    name = 'J'
+    url = 'http://jsoftware.com/'
+    aliases = ['j']
+    filenames = ['*.ijs']
+    mimetypes = ['text/x-j']
+    version_added = '2.1'
+
+    validName = r'\b[a-zA-Z]\w*'
+
+    tokens = {
+        'root': [
+            # Shebang script
+            (r'#!.*$', Comment.Preproc),
+
+            # Comments
+            (r'NB\..*', Comment.Single),
+            (r'(\n+\s*)(Note)', bygroups(Whitespace, Comment.Multiline),
+                'comment'),
+            (r'(\s*)(Note.*)', bygroups(Whitespace, Comment.Single)),
+
+            # Whitespace
+            (r'\s+', Whitespace),
+
+            # Strings
+            (r"'", String, 'singlequote'),
+
+            # Definitions
+            (r'0\s+:\s*0', Name.Entity, 'nounDefinition'),
+            (r'(noun)(\s+)(define)(\s*)$', bygroups(Name.Entity, Whitespace,
+                Name.Entity, Whitespace), 'nounDefinition'),
+            (r'([1-4]|13)\s+:\s*0\b',
+                Name.Function, 'explicitDefinition'),
+            (r'(adverb|conjunction|dyad|monad|verb)(\s+)(define)\b',
+                bygroups(Name.Function, Whitespace, Name.Function),
+                'explicitDefinition'),
+
+            # Flow Control
+            (words(('for_', 'goto_', 'label_'), suffix=validName+r'\.'), Name.Label),
+            (words((
+                'assert', 'break', 'case', 'catch', 'catchd',
+                'catcht', 'continue', 'do', 'else', 'elseif',
+                'end', 'fcase', 'for', 'if', 'return',
+                'select', 'throw', 'try', 'while', 'whilst',
+                ), suffix=r'\.'), Name.Label),
+
+            # Variable Names
+            (validName, Name.Variable),
+
+            # Standard Library
+            (words((
+                'ARGV', 'CR', 'CRLF', 'DEL', 'Debug',
+                'EAV', 'EMPTY', 'FF', 'JVERSION', 'LF',
+                'LF2', 'Note', 'TAB', 'alpha17', 'alpha27',
+                'apply', 'bind', 'boxopen', 'boxxopen', 'bx',
+                'clear', 'cutLF', 'cutopen', 'datatype', 'def',
+                'dfh', 'drop', 'each', 'echo', 'empty',
+                'erase', 'every', 'evtloop', 'exit', 'expand',
+                'fetch', 'file2url', 'fixdotdot', 'fliprgb', 'getargs',
+                'getenv', 'hfd', 'inv', 'inverse', 'iospath',
+                'isatty', 'isutf8', 'items', 'leaf', 'list',
+                'nameclass', 'namelist', 'names', 'nc',
+                'nl', 'on', 'pick', 'rows',
+                'script', 'scriptd', 'sign', 'sminfo', 'smoutput',
+                'sort', 'split', 'stderr', 'stdin', 'stdout',
+                'table', 'take', 'timespacex', 'timex', 'tmoutput',
+                'toCRLF', 'toHOST', 'toJ', 'tolower', 'toupper',
+                'type', 'ucp', 'ucpcount', 'usleep', 'utf8',
+                'uucp',
+                )), Name.Function),
+
+            # Copula
+            (r'=[.:]', Operator),
+
+            # Builtins
+            (r'[-=+*#$%@!~`^&";:.,<>{}\[\]\\|/?]', Operator),
+
+            # Short Keywords
+            (r'[abCdDeEfHiIjLMoprtT]\.',  Keyword.Reserved),
+            (r'[aDiLpqsStux]\:', Keyword.Reserved),
+            (r'(_[0-9])\:', Keyword.Constant),
+
+            # Parens
+            (r'\(', Punctuation, 'parentheses'),
+
+            # Numbers
+            include('numbers'),
+        ],
+
+        'comment': [
+            (r'[^)]', Comment.Multiline),
+            (r'^\)', Comment.Multiline, '#pop'),
+            (r'[)]', Comment.Multiline),
+        ],
+
+        'explicitDefinition': [
+            (r'\b[nmuvxy]\b', Name.Decorator),
+            include('root'),
+            (r'[^)]', Name),
+            (r'^\)', Name.Label, '#pop'),
+            (r'[)]', Name),
+        ],
+
+        'numbers': [
+            (r'\b_{1,2}\b', Number),
+            (r'_?\d+(\.\d+)?(\s*[ejr]\s*)_?\d+(\.?=\d+)?', Number),
+            (r'_?\d+\.(?=\d+)', Number.Float),
+            (r'_?\d+x', Number.Integer.Long),
+            (r'_?\d+', Number.Integer),
+        ],
+
+        'nounDefinition': [
+            (r'[^)]+', String),
+            (r'^\)', Name.Label, '#pop'),
+            (r'[)]', String),
+        ],
+
+        'parentheses': [
+            (r'\)', Punctuation, '#pop'),
+            # include('nounDefinition'),
+            include('explicitDefinition'),
+            include('root'),
+        ],
+
+        'singlequote': [
+            (r"[^']+", String),
+            (r"''", String),
+            (r"'", String, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/javascript.py b/.venv/Lib/site-packages/pygments/lexers/javascript.py
new file mode 100644 (file)
index 0000000..d361b6e
--- /dev/null
@@ -0,0 +1,1591 @@
+"""
+    pygments.lexers.javascript
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for JavaScript and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import bygroups, combined, default, do_insertions, include, \
+    inherit, Lexer, RegexLexer, this, using, words, line_re
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Other, Generic, Whitespace
+from pygments.util import get_bool_opt
+import pygments.unistring as uni
+
+__all__ = ['JavascriptLexer', 'KalLexer', 'LiveScriptLexer', 'DartLexer',
+           'TypeScriptLexer', 'LassoLexer', 'ObjectiveJLexer',
+           'CoffeeScriptLexer', 'MaskLexer', 'EarlGreyLexer', 'JuttleLexer',
+           'NodeConsoleLexer']
+
+JS_IDENT_START = ('(?:[$_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') +
+                  ']|\\\\u[a-fA-F0-9]{4})')
+JS_IDENT_PART = ('(?:[$' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',
+                                       'Mn', 'Mc', 'Nd', 'Pc') +
+                 '\u200c\u200d]|\\\\u[a-fA-F0-9]{4})')
+JS_IDENT = JS_IDENT_START + '(?:' + JS_IDENT_PART + ')*'
+
+
+class JavascriptLexer(RegexLexer):
+    """
+    For JavaScript source code.
+    """
+
+    name = 'JavaScript'
+    url = 'https://www.ecma-international.org/publications-and-standards/standards/ecma-262/'
+    aliases = ['javascript', 'js']
+    filenames = ['*.js', '*.jsm', '*.mjs', '*.cjs']
+    mimetypes = ['application/javascript', 'application/x-javascript',
+                 'text/x-javascript', 'text/javascript']
+    version_added = ''
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Whitespace),
+            (r'<!--', Comment),
+            (r'//.*?$', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gimuysd]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Whitespace, '#pop')
+        ],
+        'root': [
+            (r'\A#! ?/.*?$', Comment.Hashbang),  # recognized by node.js
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+
+            # Numeric literals
+            (r'0[bB][01]+n?', Number.Bin),
+            (r'0[oO]?[0-7]+n?', Number.Oct),  # Browsers support "0o7" and "07" (< ES5) notations
+            (r'0[xX][0-9a-fA-F]+n?', Number.Hex),
+            (r'[0-9]+n', Number.Integer),  # Javascript BigInt requires an "n" postfix
+            # Javascript doesn't have actual integer literals, so every other
+            # numeric literal is handled by the regex below (including "normal")
+            # integers
+            (r'(\.[0-9]+|[0-9]+\.[0-9]*|[0-9]+)([eE][-+]?[0-9]+)?', Number.Float),
+
+            (r'\.\.\.|=>', Punctuation),
+            (r'\+\+|--|~|\?\?=?|\?|:|\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|(?:\*\*|\|\||&&|[-<>+*%&|^/]))=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+
+            (r'(typeof|instanceof|in|void|delete|new)\b', Operator.Word, 'slashstartsregex'),
+
+            # Match stuff like: constructor
+            (r'\b(constructor|from|as)\b', Keyword.Reserved),
+
+            (r'(for|in|while|do|break|return|continue|switch|case|default|if|else|'
+             r'throw|try|catch|finally|yield|await|async|this|of|static|export|'
+             r'import|debugger|extends|super)\b', Keyword, 'slashstartsregex'),
+            (r'(var|let|const|with|function|class)\b', Keyword.Declaration, 'slashstartsregex'),
+
+            (r'(abstract|boolean|byte|char|double|enum|final|float|goto|'
+             r'implements|int|interface|long|native|package|private|protected|'
+             r'public|short|synchronized|throws|transient|volatile)\b', Keyword.Reserved),
+            (r'(true|false|null|NaN|Infinity|undefined)\b', Keyword.Constant),
+
+            (r'(Array|Boolean|Date|BigInt|Function|Math|ArrayBuffer|'
+             r'Number|Object|RegExp|String|Promise|Proxy|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'eval|isFinite|isNaN|parseFloat|parseInt|DataView|'
+             r'document|window|globalThis|global|Symbol|Intl|'
+             r'WeakSet|WeakMap|Set|Map|Reflect|JSON|Atomics|'
+             r'Int(?:8|16|32)Array|BigInt64Array|Float32Array|Float64Array|'
+             r'Uint8ClampedArray|Uint(?:8|16|32)Array|BigUint64Array)\b', Name.Builtin),
+
+            (r'((?:Eval|Internal|Range|Reference|Syntax|Type|URI)?Error)\b', Name.Exception),
+
+            # Match stuff like: super(argument, list)
+            (r'(super)(\s*)(\([\w,?.$\s]+\s*\))',
+             bygroups(Keyword, Whitespace), 'slashstartsregex'),
+            # Match stuff like: function() {...}
+            (r'([a-zA-Z_?.$][\w?.$]*)(?=\(\) \{)', Name.Other, 'slashstartsregex'),
+
+            (JS_IDENT, Name.Other),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'`', String.Backtick, 'interp'),
+            # private identifier
+            (r'#[a-zA-Z_]\w*', Name),
+        ],
+        'interp': [
+            (r'`', String.Backtick, '#pop'),
+            (r'\\.', String.Backtick),
+            (r'\$\{', String.Interpol, 'interp-inside'),
+            (r'\$', String.Backtick),
+            (r'[^`\\$]+', String.Backtick),
+        ],
+        'interp-inside': [
+            # TODO: should this include single-line comments and allow nesting strings?
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+    }
+
+
+class TypeScriptLexer(JavascriptLexer):
+    """
+    For TypeScript source code.
+    """
+
+    name = 'TypeScript'
+    url = 'https://www.typescriptlang.org/'
+    aliases = ['typescript', 'ts']
+    filenames = ['*.ts']
+    mimetypes = ['application/x-typescript', 'text/x-typescript']
+    version_added = '1.6'
+
+    # Higher priority than the TypoScriptLexer, as TypeScript is far more
+    # common these days
+    priority = 0.5
+
+    tokens = {
+        'root': [
+            (r'(abstract|implements|private|protected|public|readonly)\b',
+                Keyword, 'slashstartsregex'),
+            (r'(enum|interface|override)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'\b(declare|type)\b', Keyword.Reserved),
+            # Match variable type keywords
+            (r'\b(string|boolean|number)\b', Keyword.Type),
+            # Match stuff like: module name {...}
+            (r'\b(module)(\s*)([\w?.$]+)(\s*)',
+             bygroups(Keyword.Reserved, Whitespace, Name.Other, Whitespace), 'slashstartsregex'),
+            # Match stuff like: (function: return type)
+            (r'([\w?.$]+)(\s*)(:)(\s*)([\w?.$]+)',
+             bygroups(Name.Other, Whitespace, Operator, Whitespace, Keyword.Type)),
+            # Match stuff like: Decorators
+            (r'@' + JS_IDENT, Keyword.Declaration),
+            inherit,
+            # private identifier
+            (r'#[a-zA-Z_]\w*', Name),
+        ],
+    }
+
+
+class KalLexer(RegexLexer):
+    """
+    For Kal source code.
+    """
+
+    name = 'Kal'
+    url = 'http://rzimmerman.github.io/kal'
+    aliases = ['kal']
+    filenames = ['*.kal']
+    mimetypes = ['text/kal', 'application/kal']
+    version_added = '2.0'
+
+    flags = re.DOTALL
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Whitespace),
+            (r'###[^#].*?###', Comment.Multiline),
+            (r'(#(?!##[^#]).*?)(\n)', bygroups(Comment.Single, Whitespace)),
+        ],
+        'functiondef': [
+            (r'([$a-zA-Z_][\w$]*)(\s*)', bygroups(Name.Function, Whitespace),
+                '#pop'),
+            include('commentsandwhitespace'),
+        ],
+        'classdef': [
+            (r'\b(inherits)(\s+)(from)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'([$a-zA-Z_][\w$]*)(?=\s*\n)', Name.Class, '#pop'),
+            (r'[$a-zA-Z_][\w$]*\b', Name.Class),
+            include('commentsandwhitespace'),
+        ],
+        'listcomprehension': [
+            (r'\]', Punctuation, '#pop'),
+            (r'\b(property|value)\b', Keyword),
+            include('root'),
+        ],
+        'waitfor': [
+            (r'\n', Whitespace, '#pop'),
+            (r'\bfrom\b', Keyword),
+            include('root'),
+        ],
+        'root': [
+            include('commentsandwhitespace'),
+            (r'/(?! )(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gimuysd]+\b|\B)', String.Regex),
+            (r'\?|:|_(?=\n)|==?|!=|-(?!>)|[<>+*/-]=?',
+             Operator),
+            (r'\b(and|or|isnt|is|not|but|bitwise|mod|\^|xor|exists|'
+             r'doesnt\s+exist)\b', Operator.Word),
+            (r'(\([^()]+\))?(\s*)(>)',
+                bygroups(Name.Function, Whitespace, Punctuation)),
+            (r'[{(]', Punctuation),
+            (r'\[', Punctuation, 'listcomprehension'),
+            (r'[})\].,]', Punctuation),
+            (r'\b(function|method|task)\b', Keyword.Declaration, 'functiondef'),
+            (r'\bclass\b', Keyword.Declaration, 'classdef'),
+            (r'\b(safe(?=\s))?(\s*)(wait(?=\s))(\s+)(for)\b',
+                bygroups(Keyword, Whitespace, Keyword, Whitespace,
+                    Keyword), 'waitfor'),
+            (r'\b(me|this)(\.[$a-zA-Z_][\w.$]*)?\b', Name.Variable.Instance),
+            (r'(?<![.$])(run)(\s+)(in)(\s+)(parallel)\b',
+                bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword)),
+            (r'(?<![.$])(for)(\s+)(parallel|series)?\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(?<![.$])(except)(\s+)(when)?\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(?<![.$])(fail)(\s+)(with)?\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(?<![.$])(inherits)(\s+)(from)?\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (r'(?<![.$])(for)(\s+)(parallel|series)?\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (words((
+                'in', 'of', 'while', 'until', 'break', 'return', 'continue',
+                'when', 'if', 'unless', 'else', 'otherwise', 'throw', 'raise',
+                'try', 'catch', 'finally', 'new', 'delete', 'typeof',
+                'instanceof', 'super'), prefix=r'(?<![.$])', suffix=r'\b'),
+                Keyword),
+            (words((
+                'true', 'false', 'yes', 'no', 'on', 'off', 'null', 'nothing',
+                'none', 'NaN', 'Infinity', 'undefined'), prefix=r'(?<![.$])',
+                suffix=r'\b'), Keyword.Constant),
+            (words((
+                'Array', 'Boolean', 'Date', 'Error', 'Function', 'Math',
+                'Number', 'Object', 'RegExp', 'String', 'decodeURI',
+                'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'eval',
+                'isFinite', 'isNaN', 'isSafeInteger', 'parseFloat', 'parseInt',
+                'document', 'window', 'globalThis', 'Symbol', 'print'),
+                suffix=r'\b'), Name.Builtin),
+            (r'([$a-zA-Z_][\w.$]*)(\s*)(:|[+\-*/]?\=)?\b',
+                bygroups(Name.Variable, Whitespace, Operator)),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            ('"""', String, 'tdqs'),
+            ("'''", String, 'tsqs'),
+            ('"', String, 'dqs'),
+            ("'", String, 'sqs'),
+        ],
+        'strings': [
+            (r'[^#\\\'"]+', String),
+            # note that all kal strings are multi-line.
+            # hashmarks, quotes and backslashes must be parsed one at a time
+        ],
+        'interpoling_string': [
+            (r'\}', String.Interpol, "#pop"),
+            include('root')
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            (r'\\.|\'', String),  # double-quoted string don't need ' escapes
+            (r'#\{', String.Interpol, "interpoling_string"),
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            (r'#|\\.|"', String),  # single quoted strings don't need " escapses
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            (r'\\.|\'|"', String),  # no need to escape quotes in triple-string
+            (r'#\{', String.Interpol, "interpoling_string"),
+            include('strings'),
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop'),
+            (r'#|\\.|\'|"', String),  # no need to escape quotes in triple-strings
+            include('strings')
+        ],
+    }
+
+
+class LiveScriptLexer(RegexLexer):
+    """
+    For LiveScript source code.
+    """
+
+    name = 'LiveScript'
+    url = 'https://livescript.net/'
+    aliases = ['livescript', 'live-script']
+    filenames = ['*.ls']
+    mimetypes = ['text/livescript']
+    version_added = '1.6'
+
+    flags = re.DOTALL
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Whitespace),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'(#.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+        ],
+        'multilineregex': [
+            include('commentsandwhitespace'),
+            (r'//([gimuysd]+\b|\B)', String.Regex, '#pop'),
+            (r'/', String.Regex),
+            (r'[^/#]+', String.Regex)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'//', String.Regex, ('#pop', 'multilineregex')),
+            (r'/(?! )(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gimuysd]+\b|\B)', String.Regex, '#pop'),
+            (r'/', Operator, '#pop'),
+            default('#pop'),
+        ],
+        'root': [
+            (r'\A(?=\s|/)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'(?:\([^()]+\))?[ ]*[~-]{1,2}>|'
+             r'(?:\(?[^()\n]+\)?)?[ ]*<[~-]{1,2}', Name.Function),
+            (r'\+\+|&&|(?<![.$])\b(?:and|x?or|is|isnt|not)\b|\?|:|=|'
+             r'\|\||\\(?=\n)|(<<|>>>?|==?|!=?|'
+             r'~(?!\~?>)|-(?!\-?>)|<(?!\[)|(?<!\])>|'
+             r'[+*`%&|^/])=?',
+             Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(?<![.$])(for|own|in|of|while|until|loop|break|'
+             r'return|continue|switch|when|then|if|unless|else|'
+             r'throw|try|catch|finally|new|delete|typeof|instanceof|super|'
+             r'extends|this|class|by|const|var|to|til)\b', Keyword,
+             'slashstartsregex'),
+            (r'(?<![.$])(true|false|yes|no|on|off|'
+             r'null|NaN|Infinity|undefined|void)\b',
+             Keyword.Constant),
+            (r'(Array|Boolean|Date|Error|Function|Math|'
+             r'Number|Object|RegExp|String|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'eval|isFinite|isNaN|parseFloat|parseInt|document|window|'
+             r'globalThis|Symbol|Symbol|BigInt)\b', Name.Builtin),
+            (r'([$a-zA-Z_][\w.\-:$]*)(\s*)([:=])(\s+)',
+                bygroups(Name.Variable, Whitespace, Operator, Whitespace),
+                'slashstartsregex'),
+            (r'(@[$a-zA-Z_][\w.\-:$]*)(\s*)([:=])(\s+)',
+                bygroups(Name.Variable.Instance, Whitespace, Operator,
+                    Whitespace),
+                'slashstartsregex'),
+            (r'@', Name.Other, 'slashstartsregex'),
+            (r'@?[$a-zA-Z_][\w-]*', Name.Other, 'slashstartsregex'),
+            (r'[0-9]+\.[0-9]+([eE][0-9]+)?[fd]?(?:[a-zA-Z_]+)?', Number.Float),
+            (r'[0-9]+(~[0-9a-z]+)?(?:[a-zA-Z_]+)?', Number.Integer),
+            ('"""', String, 'tdqs'),
+            ("'''", String, 'tsqs'),
+            ('"', String, 'dqs'),
+            ("'", String, 'sqs'),
+            (r'\\\S+', String),
+            (r'<\[.*?\]>', String),
+        ],
+        'strings': [
+            (r'[^#\\\'"]+', String),
+            # note that all coffee script strings are multi-line.
+            # hashmarks, quotes and backslashes must be parsed one at a time
+        ],
+        'interpoling_string': [
+            (r'\}', String.Interpol, "#pop"),
+            include('root')
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            (r'\\.|\'', String),  # double-quoted string don't need ' escapes
+            (r'#\{', String.Interpol, "interpoling_string"),
+            (r'#', String),
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            (r'#|\\.|"', String),  # single quoted strings don't need " escapses
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            (r'\\.|\'|"', String),  # no need to escape quotes in triple-string
+            (r'#\{', String.Interpol, "interpoling_string"),
+            (r'#', String),
+            include('strings'),
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop'),
+            (r'#|\\.|\'|"', String),  # no need to escape quotes in triple-strings
+            include('strings')
+        ],
+    }
+
+
+class DartLexer(RegexLexer):
+    """
+    For Dart source code.
+    """
+
+    name = 'Dart'
+    url = 'http://dart.dev/'
+    aliases = ['dart']
+    filenames = ['*.dart']
+    mimetypes = ['text/x-dart']
+    version_added = '1.5'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            include('string_literal'),
+            (r'#!(.*?)$', Comment.Preproc),
+            (r'\b(import|export)\b', Keyword, 'import_decl'),
+            (r'\b(library|source|part of|part)\b', Keyword),
+            (r'[^\S\n]+', Whitespace),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'\b(class|extension|mixin)\b(\s+)',
+             bygroups(Keyword.Declaration, Whitespace), 'class'),
+            (r'\b(as|assert|break|case|catch|const|continue|default|do|else|finally|'
+             r'for|if|in|is|new|rethrow|return|super|switch|this|throw|try|while)\b',
+             Keyword),
+            (r'\b(abstract|async|await|const|covariant|extends|external|factory|final|'
+             r'get|implements|late|native|on|operator|required|set|static|sync|typedef|'
+             r'var|with|yield)\b', Keyword.Declaration),
+            (r'\b(bool|double|dynamic|int|num|Function|Never|Null|Object|String|void)\b',
+             Keyword.Type),
+            (r'\b(false|null|true)\b', Keyword.Constant),
+            (r'[~!%^&*+=|?:<>/-]|as\b', Operator),
+            (r'@[a-zA-Z_$]\w*', Name.Decorator),
+            (r'[a-zA-Z_$]\w*:', Name.Label),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'[(){}\[\],.;]', Punctuation),
+            (r'0[xX][0-9a-fA-F]+', Number.Hex),
+            # DIGIT+ (‘.’ DIGIT*)? EXPONENT?
+            (r'\d+(\.\d*)?([eE][+-]?\d+)?', Number),
+            (r'\.\d+([eE][+-]?\d+)?', Number),  # ‘.’ DIGIT+ EXPONENT?
+            (r'\n', Whitespace)
+            # pseudo-keyword negate intentionally left out
+        ],
+        'class': [
+            (r'[a-zA-Z_$]\w*', Name.Class, '#pop')
+        ],
+        'import_decl': [
+            include('string_literal'),
+            (r'\s+', Whitespace),
+            (r'\b(as|deferred|show|hide)\b', Keyword),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'\,', Punctuation),
+            (r'\;', Punctuation, '#pop')
+        ],
+        'string_literal': [
+            # Raw strings.
+            (r'r"""([\w\W]*?)"""', String.Double),
+            (r"r'''([\w\W]*?)'''", String.Single),
+            (r'r"(.*?)"', String.Double),
+            (r"r'(.*?)'", String.Single),
+            # Normal Strings.
+            (r'"""', String.Double, 'string_double_multiline'),
+            (r"'''", String.Single, 'string_single_multiline'),
+            (r'"', String.Double, 'string_double'),
+            (r"'", String.Single, 'string_single')
+        ],
+        'string_common': [
+            (r"\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\{[0-9A-Fa-f]*\}|[a-z'\"$\\])",
+             String.Escape),
+            (r'(\$)([a-zA-Z_]\w*)', bygroups(String.Interpol, Name)),
+            (r'(\$\{)(.*?)(\})',
+             bygroups(String.Interpol, using(this), String.Interpol))
+        ],
+        'string_double': [
+            (r'"', String.Double, '#pop'),
+            (r'[^"$\\\n]+', String.Double),
+            include('string_common'),
+            (r'\$+', String.Double)
+        ],
+        'string_double_multiline': [
+            (r'"""', String.Double, '#pop'),
+            (r'[^"$\\]+', String.Double),
+            include('string_common'),
+            (r'(\$|\")+', String.Double)
+        ],
+        'string_single': [
+            (r"'", String.Single, '#pop'),
+            (r"[^'$\\\n]+", String.Single),
+            include('string_common'),
+            (r'\$+', String.Single)
+        ],
+        'string_single_multiline': [
+            (r"'''", String.Single, '#pop'),
+            (r'[^\'$\\]+', String.Single),
+            include('string_common'),
+            (r'(\$|\')+', String.Single)
+        ]
+    }
+
+
+class LassoLexer(RegexLexer):
+    """
+    For Lasso source code, covering both Lasso 9
+    syntax and LassoScript for Lasso 8.6 and earlier. For Lasso embedded in
+    HTML, use the `LassoHtmlLexer`.
+
+    Additional options accepted:
+
+    `builtinshighlighting`
+        If given and ``True``, highlight builtin types, traits, methods, and
+        members (default: ``True``).
+    `requiredelimiters`
+        If given and ``True``, only highlight code between delimiters as Lasso
+        (default: ``False``).
+    """
+
+    name = 'Lasso'
+    aliases = ['lasso', 'lassoscript']
+    filenames = ['*.lasso', '*.lasso[89]']
+    version_added = '1.6'
+    alias_filenames = ['*.incl', '*.inc', '*.las']
+    mimetypes = ['text/x-lasso']
+    url = 'https://www.lassosoft.com'
+
+    flags = re.IGNORECASE | re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'^#![ \S]+lasso9\b', Comment.Preproc, 'lasso'),
+            (r'(?=\[|<)', Other, 'delimiters'),
+            (r'\s+', Whitespace),
+            default(('delimiters', 'lassofile')),
+        ],
+        'delimiters': [
+            (r'\[no_square_brackets\]', Comment.Preproc, 'nosquarebrackets'),
+            (r'\[noprocess\]', Comment.Preproc, 'noprocess'),
+            (r'\[', Comment.Preproc, 'squarebrackets'),
+            (r'<\?(lasso(script)?|=)', Comment.Preproc, 'anglebrackets'),
+            (r'<(!--.*?-->)?', Other),
+            (r'[^[<]+', Other),
+        ],
+        'nosquarebrackets': [
+            (r'\[noprocess\]', Comment.Preproc, 'noprocess'),
+            (r'\[', Other),
+            (r'<\?(lasso(script)?|=)', Comment.Preproc, 'anglebrackets'),
+            (r'<(!--.*?-->)?', Other),
+            (r'[^[<]+', Other),
+        ],
+        'noprocess': [
+            (r'\[/noprocess\]', Comment.Preproc, '#pop'),
+            (r'\[', Other),
+            (r'[^[]', Other),
+        ],
+        'squarebrackets': [
+            (r'\]', Comment.Preproc, '#pop'),
+            include('lasso'),
+        ],
+        'anglebrackets': [
+            (r'\?>', Comment.Preproc, '#pop'),
+            include('lasso'),
+        ],
+        'lassofile': [
+            (r'\]|\?>', Comment.Preproc, '#pop'),
+            include('lasso'),
+        ],
+        'whitespacecomments': [
+            (r'\s+', Whitespace),
+            (r'(//.*?)(\s*)$', bygroups(Comment.Single, Whitespace)),
+            (r'/\*\*!.*?\*/', String.Doc),
+            (r'/\*.*?\*/', Comment.Multiline),
+        ],
+        'lasso': [
+            # whitespace/comments
+            include('whitespacecomments'),
+
+            # literals
+            (r'\d*\.\d+(e[+-]?\d+)?', Number.Float),
+            (r'0x[\da-f]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'(infinity|NaN)\b', Number),
+            (r"'", String.Single, 'singlestring'),
+            (r'"', String.Double, 'doublestring'),
+            (r'`[^`]*`', String.Backtick),
+
+            # names
+            (r'\$[a-z_][\w.]*', Name.Variable),
+            (r'#([a-z_][\w.]*|\d+\b)', Name.Variable.Instance),
+            (r"(\.)(\s*)('[a-z_][\w.]*')",
+                bygroups(Name.Builtin.Pseudo, Whitespace, Name.Variable.Class)),
+            (r"(self)(\s*)(->)(\s*)('[a-z_][\w.]*')",
+                bygroups(Name.Builtin.Pseudo, Whitespace, Operator, Whitespace,
+                    Name.Variable.Class)),
+            (r'(\.\.?)(\s*)([a-z_][\w.]*(=(?!=))?)',
+                bygroups(Name.Builtin.Pseudo, Whitespace, Name.Other.Member)),
+            (r'(->\\?|&)(\s*)([a-z_][\w.]*(=(?!=))?)',
+                bygroups(Operator, Whitespace, Name.Other.Member)),
+            (r'(?<!->)(self|inherited|currentcapture|givenblock)\b',
+                Name.Builtin.Pseudo),
+            (r'-(?!infinity)[a-z_][\w.]*', Name.Attribute),
+            (r'(::)(\s*)([a-z_][\w.]*)',
+                bygroups(Punctuation, Whitespace, Name.Label)),
+            (r'(error_(code|msg)_\w+|Error_AddError|Error_ColumnRestriction|'
+             r'Error_DatabaseConnectionUnavailable|Error_DatabaseTimeout|'
+             r'Error_DeleteError|Error_FieldRestriction|Error_FileNotFound|'
+             r'Error_InvalidDatabase|Error_InvalidPassword|'
+             r'Error_InvalidUsername|Error_ModuleNotFound|'
+             r'Error_NoError|Error_NoPermission|Error_OutOfMemory|'
+             r'Error_ReqColumnMissing|Error_ReqFieldMissing|'
+             r'Error_RequiredColumnMissing|Error_RequiredFieldMissing|'
+             r'Error_UpdateError)\b', Name.Exception),
+
+            # definitions
+            (r'(define)(\s+)([a-z_][\w.]*)(\s*)(=>)(\s*)(type|trait|thread)\b',
+                bygroups(Keyword.Declaration, Whitespace, Name.Class,
+                    Whitespace, Operator, Whitespace, Keyword)),
+            (r'(define)(\s+)([a-z_][\w.]*)(\s*)(->)(\s*)([a-z_][\w.]*=?|[-+*/%])',
+                bygroups(Keyword.Declaration, Whitespace, Name.Class,
+                    Whitespace, Operator, Whitespace, Name.Function),
+                'signature'),
+            (r'(define)(\s+)([a-z_][\w.]*)',
+                bygroups(Keyword.Declaration, Whitespace, Name.Function), 'signature'),
+            (r'(public|protected|private|provide)(\s+)(([a-z_][\w.]*=?|[-+*/%])'
+             r'(?=\s*\())', bygroups(Keyword, Whitespace, Name.Function),
+                'signature'),
+            (r'(public|protected|private|provide)(\s+)([a-z_][\w.]*)',
+                bygroups(Keyword, Whitespace, Name.Function)),
+
+            # keywords
+            (r'(true|false|none|minimal|full|all|void)\b', Keyword.Constant),
+            (r'(local|var|variable|global|data(?=\s))\b', Keyword.Declaration),
+            (r'(array|date|decimal|duration|integer|map|pair|string|tag|xml|'
+             r'null|boolean|bytes|keyword|list|locale|queue|set|stack|'
+             r'staticarray)\b', Keyword.Type),
+            (r'([a-z_][\w.]*)(\s+)(in)\b', bygroups(Name, Whitespace, Keyword)),
+            (r'(let|into)(\s+)([a-z_][\w.]*)', bygroups(Keyword, Whitespace, Name)),
+            (r'require\b', Keyword, 'requiresection'),
+            (r'(/?)(Namespace_Using)\b', bygroups(Punctuation, Keyword.Namespace)),
+            (r'(/?)(Cache|Database_Names|Database_SchemaNames|'
+             r'Database_TableNames|Define_Tag|Define_Type|Email_Batch|'
+             r'Encode_Set|HTML_Comment|Handle|Handle_Error|Header|If|Inline|'
+             r'Iterate|LJAX_Target|Link|Link_CurrentAction|Link_CurrentGroup|'
+             r'Link_CurrentRecord|Link_Detail|Link_FirstGroup|Link_FirstRecord|'
+             r'Link_LastGroup|Link_LastRecord|Link_NextGroup|Link_NextRecord|'
+             r'Link_PrevGroup|Link_PrevRecord|Log|Loop|Output_None|Portal|'
+             r'Private|Protect|Records|Referer|Referrer|Repeating|ResultSet|'
+             r'Rows|Search_Args|Search_Arguments|Select|Sort_Args|'
+             r'Sort_Arguments|Thread_Atomic|Value_List|While|Abort|Case|Else|'
+             r'Fail_If|Fail_IfNot|Fail|If_Empty|If_False|If_Null|If_True|'
+             r'Loop_Abort|Loop_Continue|Loop_Count|Params|Params_Up|Return|'
+             r'Return_Value|Run_Children|SOAP_DefineTag|SOAP_LastRequest|'
+             r'SOAP_LastResponse|Tag_Name|ascending|average|by|define|'
+             r'descending|do|equals|frozen|group|handle_failure|import|in|into|'
+             r'join|let|match|max|min|on|order|parent|protected|provide|public|'
+             r'require|returnhome|skip|split_thread|sum|take|thread|to|trait|'
+             r'type|where|with|yield|yieldhome)\b',
+                bygroups(Punctuation, Keyword)),
+
+            # other
+            (r',', Punctuation, 'commamember'),
+            (r'(and|or|not)\b', Operator.Word),
+            (r'([a-z_][\w.]*)(\s*)(::)(\s*)([a-z_][\w.]*)?(\s*=(?!=))',
+                bygroups(Name, Whitespace, Punctuation, Whitespace, Name.Label,
+                    Operator)),
+            (r'(/?)([\w.]+)', bygroups(Punctuation, Name.Other)),
+            (r'(=)(n?bw|n?ew|n?cn|lte?|gte?|n?eq|n?rx|ft)\b',
+                bygroups(Operator, Operator.Word)),
+            (r':=|[-+*/%=<>&|!?\\]+', Operator),
+            (r'[{}():;,@^]', Punctuation),
+        ],
+        'singlestring': [
+            (r"'", String.Single, '#pop'),
+            (r"[^'\\]+", String.Single),
+            include('escape'),
+            (r"\\", String.Single),
+        ],
+        'doublestring': [
+            (r'"', String.Double, '#pop'),
+            (r'[^"\\]+', String.Double),
+            include('escape'),
+            (r'\\', String.Double),
+        ],
+        'escape': [
+            (r'\\(U[\da-f]{8}|u[\da-f]{4}|x[\da-f]{1,2}|[0-7]{1,3}|:[^:\n\r]+:|'
+             r'[abefnrtv?"\'\\]|$)', String.Escape),
+        ],
+        'signature': [
+            (r'=>', Operator, '#pop'),
+            (r'\)', Punctuation, '#pop'),
+            (r'[(,]', Punctuation, 'parameter'),
+            include('lasso'),
+        ],
+        'parameter': [
+            (r'\)', Punctuation, '#pop'),
+            (r'-?[a-z_][\w.]*', Name.Attribute, '#pop'),
+            (r'\.\.\.', Name.Builtin.Pseudo),
+            include('lasso'),
+        ],
+        'requiresection': [
+            (r'(([a-z_][\w.]*=?|[-+*/%])(?=\s*\())', Name, 'requiresignature'),
+            (r'(([a-z_][\w.]*=?|[-+*/%])(?=(\s*::\s*[\w.]+)?\s*,))', Name),
+            (r'[a-z_][\w.]*=?|[-+*/%]', Name, '#pop'),
+            (r'(::)(\s*)([a-z_][\w.]*)',
+                bygroups(Punctuation, Whitespace, Name.Label)),
+            (r',', Punctuation),
+            include('whitespacecomments'),
+        ],
+        'requiresignature': [
+            (r'(\)(?=(\s*::\s*[\w.]+)?\s*,))', Punctuation, '#pop'),
+            (r'\)', Punctuation, '#pop:2'),
+            (r'-?[a-z_][\w.]*', Name.Attribute),
+            (r'(::)(\s*)([a-z_][\w.]*)',
+                bygroups(Punctuation, Whitespace, Name.Label)),
+            (r'\.\.\.', Name.Builtin.Pseudo),
+            (r'[(,]', Punctuation),
+            include('whitespacecomments'),
+        ],
+        'commamember': [
+            (r'(([a-z_][\w.]*=?|[-+*/%])'
+             r'(?=\s*(\(([^()]*\([^()]*\))*[^)]*\)\s*)?(::[\w.\s]+)?=>))',
+                Name.Function, 'signature'),
+            include('whitespacecomments'),
+            default('#pop'),
+        ],
+    }
+
+    def __init__(self, **options):
+        self.builtinshighlighting = get_bool_opt(
+            options, 'builtinshighlighting', True)
+        self.requiredelimiters = get_bool_opt(
+            options, 'requiredelimiters', False)
+
+        self._builtins = set()
+        self._members = set()
+        if self.builtinshighlighting:
+            from pygments.lexers._lasso_builtins import BUILTINS, MEMBERS
+            for key, value in BUILTINS.items():
+                self._builtins.update(value)
+            for key, value in MEMBERS.items():
+                self._members.update(value)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        if self.requiredelimiters:
+            stack.append('delimiters')
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if (token is Name.Other and value.lower() in self._builtins or
+                    token is Name.Other.Member and
+                    value.lower().rstrip('=') in self._members):
+                yield index, Name.Builtin, value
+                continue
+            yield index, token, value
+
+    def analyse_text(text):
+        rv = 0.0
+        if 'bin/lasso9' in text:
+            rv += 0.8
+        if re.search(r'<\?lasso', text, re.I):
+            rv += 0.4
+        if re.search(r'local\(', text, re.I):
+            rv += 0.4
+        return rv
+
+
+class ObjectiveJLexer(RegexLexer):
+    """
+    For Objective-J source code with preprocessor directives.
+    """
+
+    name = 'Objective-J'
+    aliases = ['objective-j', 'objectivej', 'obj-j', 'objj']
+    filenames = ['*.j']
+    mimetypes = ['text/x-objective-j']
+    url = 'https://www.cappuccino.dev/learn/objective-j.html'
+    version_added = '1.3'
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//[^\n]*\n|/[*](?:[^*]|[*][^/])*[*]/)*'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+
+            # function definition
+            (r'^(' + _ws + r'[+-]' + _ws + r')([(a-zA-Z_].*?[^(])(' + _ws + r'\{)',
+             bygroups(using(this), using(this, state='function_signature'),
+                      using(this))),
+
+            # class definition
+            (r'(@interface|@implementation)(\s+)', bygroups(Keyword, Whitespace),
+             'classname'),
+            (r'(@class|@protocol)(\s*)', bygroups(Keyword, Whitespace),
+             'forward_classname'),
+            (r'(\s*)(@end)(\s*)', bygroups(Whitespace, Keyword, Whitespace)),
+
+            include('statements'),
+            ('[{()}]', Punctuation),
+            (';', Punctuation),
+        ],
+        'whitespace': [
+            (r'(@import)(\s+)("(?:\\\\|\\"|[^"])*")',
+             bygroups(Comment.Preproc, Whitespace, String.Double)),
+            (r'(@import)(\s+)(<(?:\\\\|\\>|[^>])*>)',
+             bygroups(Comment.Preproc, Whitespace, String.Double)),
+            (r'(#(?:include|import))(\s+)("(?:\\\\|\\"|[^"])*")',
+             bygroups(Comment.Preproc, Whitespace, String.Double)),
+            (r'(#(?:include|import))(\s+)(<(?:\\\\|\\>|[^>])*>)',
+             bygroups(Comment.Preproc, Whitespace, String.Double)),
+
+            (r'#if\s+0', Comment.Preproc, 'if0'),
+            (r'#', Comment.Preproc, 'macro'),
+
+            (r'\s+', Whitespace),
+            (r'(\\)(\n)',
+                bygroups(String.Escape, Whitespace)),  # line continuation
+            (r'//(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            (r'<!--', Comment),
+        ],
+        'slashstartsregex': [
+            include('whitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop'),
+        ],
+        'badregex': [
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'statements': [
+            (r'(L|@)?"', String, 'string'),
+            (r"(L|@)?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'",
+             String.Char),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[Ll]?', Number.Hex),
+            (r'0[0-7]+[Ll]?', Number.Oct),
+            (r'\d+[Ll]?', Number.Integer),
+
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?',
+             Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+
+            (r'(for|in|while|do|break|return|continue|switch|case|default|if|'
+             r'else|throw|try|catch|finally|new|delete|typeof|instanceof|void|'
+             r'prototype|__proto__)\b', Keyword, 'slashstartsregex'),
+
+            (r'(var|with|function)\b', Keyword.Declaration, 'slashstartsregex'),
+
+            (r'(@selector|@private|@protected|@public|@encode|'
+             r'@synchronized|@try|@throw|@catch|@finally|@end|@property|'
+             r'@synthesize|@dynamic|@for|@accessors|new)\b', Keyword),
+
+            (r'(int|long|float|short|double|char|unsigned|signed|void|'
+             r'id|BOOL|bool|boolean|IBOutlet|IBAction|SEL|@outlet|@action)\b',
+             Keyword.Type),
+
+            (r'(self|super)\b', Name.Builtin),
+
+            (r'(TRUE|YES|FALSE|NO|Nil|nil|NULL)\b', Keyword.Constant),
+            (r'(true|false|null|NaN|Infinity|undefined)\b', Keyword.Constant),
+            (r'(ABS|ASIN|ACOS|ATAN|ATAN2|SIN|COS|TAN|EXP|POW|CEIL|FLOOR|ROUND|'
+             r'MIN|MAX|RAND|SQRT|E|LN2|LN10|LOG2E|LOG10E|PI|PI2|PI_2|SQRT1_2|'
+             r'SQRT2)\b', Keyword.Constant),
+
+            (r'(Array|Boolean|Date|Error|Function|Math|'
+             r'Number|Object|RegExp|String|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'Error|eval|isFinite|isNaN|parseFloat|parseInt|document|this|'
+             r'window|globalThis|Symbol)\b', Name.Builtin),
+
+            (r'([$a-zA-Z_]\w*)(' + _ws + r')(?=\()',
+             bygroups(Name.Function, using(this))),
+
+            (r'[$a-zA-Z_]\w*', Name),
+        ],
+        'classname': [
+            # interface definition that inherits
+            (r'([a-zA-Z_]\w*)(' + _ws + r':' + _ws +
+             r')([a-zA-Z_]\w*)?',
+             bygroups(Name.Class, using(this), Name.Class), '#pop'),
+            # interface definition for a category
+            (r'([a-zA-Z_]\w*)(' + _ws + r'\()([a-zA-Z_]\w*)(\))',
+             bygroups(Name.Class, using(this), Name.Label, Text), '#pop'),
+            # simple interface / implementation
+            (r'([a-zA-Z_]\w*)', Name.Class, '#pop'),
+        ],
+        'forward_classname': [
+            (r'([a-zA-Z_]\w*)(\s*)(,)(\s*)',
+             bygroups(Name.Class, Whitespace, Text, Whitespace), '#push'),
+            (r'([a-zA-Z_]\w*)(\s*)(;?)',
+             bygroups(Name.Class, Whitespace, Text), '#pop'),
+        ],
+        'function_signature': [
+            include('whitespace'),
+
+            # start of a selector w/ parameters
+            (r'(\(' + _ws + r')'                # open paren
+             r'([a-zA-Z_]\w+)'                  # return type
+             r'(' + _ws + r'\)' + _ws + r')'    # close paren
+             r'([$a-zA-Z_]\w+' + _ws + r':)',   # function name
+             bygroups(using(this), Keyword.Type, using(this),
+                      Name.Function), 'function_parameters'),
+
+            # no-param function
+            (r'(\(' + _ws + r')'                # open paren
+             r'([a-zA-Z_]\w+)'                  # return type
+             r'(' + _ws + r'\)' + _ws + r')'    # close paren
+             r'([$a-zA-Z_]\w+)',                # function name
+             bygroups(using(this), Keyword.Type, using(this),
+                      Name.Function), "#pop"),
+
+            # no return type given, start of a selector w/ parameters
+            (r'([$a-zA-Z_]\w+' + _ws + r':)',   # function name
+             bygroups(Name.Function), 'function_parameters'),
+
+            # no return type given, no-param function
+            (r'([$a-zA-Z_]\w+)',                # function name
+             bygroups(Name.Function), "#pop"),
+
+            default('#pop'),
+        ],
+        'function_parameters': [
+            include('whitespace'),
+
+            # parameters
+            (r'(\(' + _ws + ')'                 # open paren
+             r'([^)]+)'                        # type
+             r'(' + _ws + r'\)' + _ws + r')'    # close paren
+             r'([$a-zA-Z_]\w+)',      # param name
+             bygroups(using(this), Keyword.Type, using(this), Text)),
+
+            # one piece of a selector name
+            (r'([$a-zA-Z_]\w+' + _ws + r':)',   # function name
+             Name.Function),
+
+            # smallest possible selector piece
+            (r'(:)', Name.Function),
+
+            # var args
+            (r'(,' + _ws + r'\.\.\.)', using(this)),
+
+            # param name
+            (r'([$a-zA-Z_]\w+)', Text),
+        ],
+        'expression': [
+            (r'([$a-zA-Z_]\w*)(\()', bygroups(Name.Function,
+                                              Punctuation)),
+            (r'(\))', Punctuation, "#pop"),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'(\\)(\n)', bygroups(String.Escape, Whitespace)),  # line continuation
+            (r'\\', String),  # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace), '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Whitespace),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'),
+            (r'(.*?)(\n)', bygroups(Comment, Whitespace)),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\s*@import\s+[<"]', text, re.MULTILINE):
+            # special directive found in most Objective-J files
+            return True
+        return False
+
+
+class CoffeeScriptLexer(RegexLexer):
+    """
+    For CoffeeScript source code.
+    """
+
+    name = 'CoffeeScript'
+    url = 'http://coffeescript.org'
+    aliases = ['coffeescript', 'coffee-script', 'coffee']
+    filenames = ['*.coffee']
+    mimetypes = ['text/coffeescript']
+    version_added = '1.3'
+
+    _operator_re = (
+        r'\+\+|~|&&|\band\b|\bor\b|\bis\b|\bisnt\b|\bnot\b|\?|:|'
+        r'\|\||\\(?=\n)|'
+        r'(<<|>>>?|==?(?!>)|!=?|=(?!>)|-(?!>)|[<>+*`%&|\^/])=?')
+
+    flags = re.DOTALL
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Whitespace),
+            (r'###[^#].*?###', Comment.Multiline),
+            (r'(#(?!##[^#]).*?)(\n)', bygroups(Comment.Single, Whitespace)),
+        ],
+        'multilineregex': [
+            (r'[^/#]+', String.Regex),
+            (r'///([gimuysd]+\b|\B)', String.Regex, '#pop'),
+            (r'#\{', String.Interpol, 'interpoling_string'),
+            (r'[/#]', String.Regex),
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'///', String.Regex, ('#pop', 'multilineregex')),
+            (r'/(?! )(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gimuysd]+\b|\B)', String.Regex, '#pop'),
+            # This isn't really guarding against mishighlighting well-formed
+            # code, just the ability to infinite-loop between root and
+            # slashstartsregex.
+            (r'/', Operator, '#pop'),
+            default('#pop'),
+        ],
+        'root': [
+            include('commentsandwhitespace'),
+            (r'\A(?=\s|/)', Text, 'slashstartsregex'),
+            (_operator_re, Operator, 'slashstartsregex'),
+            (r'(?:\([^()]*\))?\s*[=-]>', Name.Function, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(?<![.$])(for|own|in|of|while|until|'
+             r'loop|break|return|continue|'
+             r'switch|when|then|if|unless|else|'
+             r'throw|try|catch|finally|new|delete|typeof|instanceof|super|'
+             r'extends|this|class|by)\b', Keyword, 'slashstartsregex'),
+            (r'(?<![.$])(true|false|yes|no|on|off|null|'
+             r'NaN|Infinity|undefined)\b',
+             Keyword.Constant),
+            (r'(Array|Boolean|Date|Error|Function|Math|'
+             r'Number|Object|RegExp|String|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'eval|isFinite|isNaN|parseFloat|parseInt|document|window|globalThis|Symbol)\b',
+             Name.Builtin),
+            (r'([$a-zA-Z_][\w.:$]*)(\s*)([:=])(\s+)',
+                bygroups(Name.Variable, Whitespace, Operator, Whitespace),
+                'slashstartsregex'),
+            (r'(@[$a-zA-Z_][\w.:$]*)(\s*)([:=])(\s+)',
+                bygroups(Name.Variable.Instance, Whitespace, Operator, Whitespace),
+                'slashstartsregex'),
+            (r'@', Name.Other, 'slashstartsregex'),
+            (r'@?[$a-zA-Z_][\w$]*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            ('"""', String, 'tdqs'),
+            ("'''", String, 'tsqs'),
+            ('"', String, 'dqs'),
+            ("'", String, 'sqs'),
+        ],
+        'strings': [
+            (r'[^#\\\'"]+', String),
+            # note that all coffee script strings are multi-line.
+            # hashmarks, quotes and backslashes must be parsed one at a time
+        ],
+        'interpoling_string': [
+            (r'\}', String.Interpol, "#pop"),
+            include('root')
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            (r'\\.|\'', String),  # double-quoted string don't need ' escapes
+            (r'#\{', String.Interpol, "interpoling_string"),
+            (r'#', String),
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            (r'#|\\.|"', String),  # single quoted strings don't need " escapses
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            (r'\\.|\'|"', String),  # no need to escape quotes in triple-string
+            (r'#\{', String.Interpol, "interpoling_string"),
+            (r'#', String),
+            include('strings'),
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop'),
+            (r'#|\\.|\'|"', String),  # no need to escape quotes in triple-strings
+            include('strings')
+        ],
+    }
+
+
+class MaskLexer(RegexLexer):
+    """
+    For Mask markup.
+    """
+    name = 'Mask'
+    url = 'https://github.com/atmajs/MaskJS'
+    aliases = ['mask']
+    filenames = ['*.mask']
+    mimetypes = ['text/x-mask']
+    version_added = '2.0'
+
+    flags = re.MULTILINE | re.IGNORECASE | re.DOTALL
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'[{};>]', Punctuation),
+            (r"'''", String, 'string-trpl-single'),
+            (r'"""', String, 'string-trpl-double'),
+            (r"'", String, 'string-single'),
+            (r'"', String, 'string-double'),
+            (r'([\w-]+)', Name.Tag, 'node'),
+            (r'([^.#;{>\s]+)', Name.Class, 'node'),
+            (r'(#[\w-]+)', Name.Function, 'node'),
+            (r'(\.[\w-]+)', Name.Variable.Class, 'node')
+        ],
+        'string-base': [
+            (r'\\.', String.Escape),
+            (r'~\[', String.Interpol, 'interpolation'),
+            (r'.', String.Single),
+        ],
+        'string-single': [
+            (r"'", String.Single, '#pop'),
+            include('string-base')
+        ],
+        'string-double': [
+            (r'"', String.Single, '#pop'),
+            include('string-base')
+        ],
+        'string-trpl-single': [
+            (r"'''", String.Single, '#pop'),
+            include('string-base')
+        ],
+        'string-trpl-double': [
+            (r'"""', String.Single, '#pop'),
+            include('string-base')
+        ],
+        'interpolation': [
+            (r'\]', String.Interpol, '#pop'),
+            (r'(\s*)(:)', bygroups(Whitespace, String.Interpol), 'expression'),
+            (r'(\s*)(\w+)(:)', bygroups(Whitespace, Name.Other, Punctuation)),
+            (r'[^\]]+', String.Interpol)
+        ],
+        'expression': [
+            (r'[^\]]+', using(JavascriptLexer), '#pop')
+        ],
+        'node': [
+            (r'\s+', Whitespace),
+            (r'\.', Name.Variable.Class, 'node-class'),
+            (r'\#', Name.Function, 'node-id'),
+            (r'(style)([ \t]*)(=)',
+                bygroups(Name.Attribute, Whitespace, Operator),
+                'node-attr-style-value'),
+            (r'([\w:-]+)([ \t]*)(=)',
+                bygroups(Name.Attribute, Whitespace, Operator),
+                'node-attr-value'),
+            (r'[\w:-]+', Name.Attribute),
+            (r'[>{;]', Punctuation, '#pop')
+        ],
+        'node-class': [
+            (r'[\w-]+', Name.Variable.Class),
+            (r'~\[', String.Interpol, 'interpolation'),
+            default('#pop')
+        ],
+        'node-id': [
+            (r'[\w-]+', Name.Function),
+            (r'~\[', String.Interpol, 'interpolation'),
+            default('#pop')
+        ],
+        'node-attr-value': [
+            (r'\s+', Whitespace),
+            (r'\w+', Name.Variable, '#pop'),
+            (r"'", String, 'string-single-pop2'),
+            (r'"', String, 'string-double-pop2'),
+            default('#pop')
+        ],
+        'node-attr-style-value': [
+            (r'\s+', Whitespace),
+            (r"'", String.Single, 'css-single-end'),
+            (r'"', String.Single, 'css-double-end'),
+            include('node-attr-value')
+        ],
+        'css-base': [
+            (r'\s+', Whitespace),
+            (r";", Punctuation),
+            (r"[\w\-]+\s*:", Name.Builtin)
+        ],
+        'css-single-end': [
+            include('css-base'),
+            (r"'", String.Single, '#pop:2'),
+            (r"[^;']+", Name.Entity)
+        ],
+        'css-double-end': [
+            include('css-base'),
+            (r'"', String.Single, '#pop:2'),
+            (r'[^;"]+', Name.Entity)
+        ],
+        'string-single-pop2': [
+            (r"'", String.Single, '#pop:2'),
+            include('string-base')
+        ],
+        'string-double-pop2': [
+            (r'"', String.Single, '#pop:2'),
+            include('string-base')
+        ],
+    }
+
+
+class EarlGreyLexer(RegexLexer):
+    """
+    For Earl-Grey source code.
+
+    .. versionadded: 2.1
+    """
+
+    name = 'Earl Grey'
+    aliases = ['earl-grey', 'earlgrey', 'eg']
+    filenames = ['*.eg']
+    mimetypes = ['text/x-earl-grey']
+    url = 'https://github.com/breuleux/earl-grey'
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            include('control'),
+            (r'[^\S\n]+', Text),
+            (r'(;;.*)(\n)', bygroups(Comment, Whitespace)),
+            (r'[\[\]{}:(),;]', Punctuation),
+            (r'(\\)(\n)', bygroups(String.Escape, Whitespace)),
+            (r'\\', Text),
+            include('errors'),
+            (words((
+                'with', 'where', 'when', 'and', 'not', 'or', 'in',
+                'as', 'of', 'is'),
+                prefix=r'(?<=\s|\[)', suffix=r'(?![\w$\-])'),
+             Operator.Word),
+            (r'[*@]?->', Name.Function),
+            (r'[+\-*/~^<>%&|?!@#.]*=', Operator.Word),
+            (r'\.{2,3}', Operator.Word),  # Range Operator
+            (r'([+*/~^<>&|?!]+)|([#\-](?=\s))|@@+(?=\s)|=+', Operator),
+            (r'(?<![\w$\-])(var|let)(?:[^\w$])', Keyword.Declaration),
+            include('keywords'),
+            include('builtins'),
+            include('assignment'),
+            (r'''(?x)
+                (?:()([a-zA-Z$_](?:[\w$\-]*[\w$])?)|
+                   (?<=[\s{\[(])(\.)([a-zA-Z$_](?:[\w$\-]*[\w$])?))
+                (?=.*%)''',
+             bygroups(Punctuation, Name.Tag, Punctuation, Name.Class.Start), 'dbs'),
+            (r'[rR]?`', String.Backtick, 'bt'),
+            (r'[rR]?```', String.Backtick, 'tbt'),
+            (r'(?<=[\s\[{(,;])\.([a-zA-Z$_](?:[\w$\-]*[\w$])?)'
+             r'(?=[\s\]}),;])', String.Symbol),
+            include('nested'),
+            (r'(?:[rR]|[rR]\.[gmi]{1,3})?"', String, combined('stringescape', 'dqs')),
+            (r'(?:[rR]|[rR]\.[gmi]{1,3})?\'', String, combined('stringescape', 'sqs')),
+            (r'"""', String, combined('stringescape', 'tdqs')),
+            include('tuple'),
+            include('import_paths'),
+            include('name'),
+            include('numbers'),
+        ],
+        'dbs': [
+            (r'(\.)([a-zA-Z$_](?:[\w$\-]*[\w$])?)(?=[.\[\s])',
+             bygroups(Punctuation, Name.Class.DBS)),
+            (r'(\[)([\^#][a-zA-Z$_](?:[\w$\-]*[\w$])?)(\])',
+             bygroups(Punctuation, Name.Entity.DBS, Punctuation)),
+            (r'\s+', Whitespace),
+            (r'%', Operator.DBS, '#pop'),
+        ],
+        'import_paths': [
+            (r'(?<=[\s:;,])(\.{1,3}(?:[\w\-]*/)*)(\w(?:[\w\-]*\w)*)(?=[\s;,])',
+             bygroups(Text.Whitespace, Text)),
+        ],
+        'assignment': [
+            (r'(\.)?([a-zA-Z$_](?:[\w$\-]*[\w$])?)'
+             r'(?=\s+[+\-*/~^<>%&|?!@#.]*\=\s)',
+             bygroups(Punctuation, Name.Variable))
+        ],
+        'errors': [
+            (words(('Error', 'TypeError', 'ReferenceError'),
+                   prefix=r'(?<![\w\-$.])', suffix=r'(?![\w\-$.])'),
+             Name.Exception),
+            (r'''(?x)
+                (?<![\w$])
+                E\.[\w$](?:[\w$\-]*[\w$])?
+                (?:\.[\w$](?:[\w$\-]*[\w$])?)*
+                (?=[({\[?!\s])''',
+             Name.Exception),
+        ],
+        'control': [
+            (r'''(?x)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)
+                (?!\n)\s+
+                (?!and|as|each\*|each|in|is|mod|of|or|when|where|with)
+                (?=(?:[+\-*/~^<>%&|?!@#.])?[a-zA-Z$_](?:[\w$-]*[\w$])?)''',
+             Keyword.Control),
+            (r'([a-zA-Z$_](?:[\w$-]*[\w$])?)(?!\n)(\s+)(?=[\'"\d{\[(])',
+             bygroups(Keyword.Control, Whitespace)),
+            (r'''(?x)
+                (?:
+                    (?<=[%=])|
+                    (?<=[=\-]>)|
+                    (?<=with|each|with)|
+                    (?<=each\*|where)
+                )(\s+)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)(:)''',
+             bygroups(Whitespace, Keyword.Control, Punctuation)),
+            (r'''(?x)
+                (?<![+\-*/~^<>%&|?!@#.])(\s+)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)(:)''',
+             bygroups(Whitespace, Keyword.Control, Punctuation)),
+        ],
+        'nested': [
+            (r'''(?x)
+                (?<=[\w$\]})])(\.)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)
+                (?=\s+with(?:\s|\n))''',
+             bygroups(Punctuation, Name.Function)),
+            (r'''(?x)
+                (?<!\s)(\.)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)
+                (?=[}\]).,;:\s])''',
+             bygroups(Punctuation, Name.Field)),
+            (r'''(?x)
+                (?<=[\w$\]})])(\.)
+                ([a-zA-Z$_](?:[\w$-]*[\w$])?)
+                (?=[\[{(:])''',
+             bygroups(Punctuation, Name.Function)),
+        ],
+        'keywords': [
+            (words((
+                'each', 'each*', 'mod', 'await', 'break', 'chain',
+                'continue', 'elif', 'expr-value', 'if', 'match',
+                'return', 'yield', 'pass', 'else', 'require', 'var',
+                'let', 'async', 'method', 'gen'),
+                prefix=r'(?<![\w\-$.])', suffix=r'(?![\w\-$.])'),
+             Keyword.Pseudo),
+            (words(('this', 'self', '@'),
+                   prefix=r'(?<![\w\-$.])', suffix=r'(?![\w\-$])'),
+             Keyword.Constant),
+            (words((
+                'Function', 'Object', 'Array', 'String', 'Number',
+                'Boolean', 'ErrorFactory', 'ENode', 'Promise'),
+                prefix=r'(?<![\w\-$.])', suffix=r'(?![\w\-$])'),
+             Keyword.Type),
+        ],
+        'builtins': [
+            (words((
+                'send', 'object', 'keys', 'items', 'enumerate', 'zip',
+                'product', 'neighbours', 'predicate', 'equal',
+                'nequal', 'contains', 'repr', 'clone', 'range',
+                'getChecker', 'get-checker', 'getProperty', 'get-property',
+                'getProjector', 'get-projector', 'consume', 'take',
+                'promisify', 'spawn', 'constructor'),
+                prefix=r'(?<![\w\-#.])', suffix=r'(?![\w\-.])'),
+             Name.Builtin),
+            (words((
+                'true', 'false', 'null', 'undefined'),
+                prefix=r'(?<![\w\-$.])', suffix=r'(?![\w\-$.])'),
+             Name.Constant),
+        ],
+        'name': [
+            (r'@([a-zA-Z$_](?:[\w$-]*[\w$])?)', Name.Variable.Instance),
+            (r'([a-zA-Z$_](?:[\w$-]*[\w$])?)(\+\+|\-\-)?',
+             bygroups(Name.Symbol, Operator.Word))
+        ],
+        'tuple': [
+            (r'#[a-zA-Z_][\w\-]*(?=[\s{(,;])', Name.Namespace)
+        ],
+        'interpoling_string': [
+            (r'\}', String.Interpol, '#pop'),
+            include('root')
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'strings': [
+            (r'[^\\\'"]', String),
+            (r'[\'"\\]', String),
+            (r'\n', String)  # All strings are multiline in EG
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),
+            (r'\{', String.Interpol, 'interpoling_string'),
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            include('strings'),
+        ],
+        'bt': [
+            (r'`', String.Backtick, '#pop'),
+            (r'(?<!`)\n', String.Backtick),
+            (r'\^=?', String.Escape),
+            (r'.+', String.Backtick),
+        ],
+        'tbt': [
+            (r'```', String.Backtick, '#pop'),
+            (r'\n', String.Backtick),
+            (r'\^=?', String.Escape),
+            (r'[^`]+', String.Backtick),
+        ],
+        'numbers': [
+            (r'\d+\.(?!\.)\d*([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+', Number.Float),
+            (r'8r[0-7]+', Number.Oct),
+            (r'2r[01]+', Number.Bin),
+            (r'16r[a-fA-F0-9]+', Number.Hex),
+            (r'([3-79]|[12][0-9]|3[0-6])r[a-zA-Z\d]+(\.[a-zA-Z\d]+)?',
+             Number.Radix),
+            (r'\d+', Number.Integer)
+        ],
+    }
+
+
+class JuttleLexer(RegexLexer):
+    """
+    For Juttle source code.
+    """
+
+    name = 'Juttle'
+    url = 'http://juttle.github.io/'
+    aliases = ['juttle']
+    filenames = ['*.juttle']
+    mimetypes = ['application/juttle', 'application/x-juttle',
+                 'text/x-juttle', 'text/juttle']
+    version_added = '2.2'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Whitespace),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gimuysd]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r':\d{2}:\d{2}:\d{2}(\.\d*)?:', String.Moment),
+            (r':(now|beginning|end|forever|yesterday|today|tomorrow|'
+             r'(\d+(\.\d*)?|\.\d+)(ms|[smhdwMy])?):', String.Moment),
+            (r':\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d*)?)?'
+             r'(Z|[+-]\d{2}:\d{2}|[+-]\d{4})?:', String.Moment),
+            (r':((\d+(\.\d*)?|\.\d+)[ ]+)?(millisecond|second|minute|hour|'
+             r'day|week|month|year)[s]?'
+             r'(([ ]+and[ ]+(\d+[ ]+)?(millisecond|second|minute|hour|'
+             r'day|week|month|year)[s]?)'
+             r'|[ ]+(ago|from[ ]+now))*:', String.Moment),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(import|return|continue|if|else)\b', Keyword, 'slashstartsregex'),
+            (r'(var|const|function|reducer|sub|input)\b', Keyword.Declaration,
+             'slashstartsregex'),
+            (r'(batch|emit|filter|head|join|keep|pace|pass|put|read|reduce|remove|'
+             r'sequence|skip|sort|split|tail|unbatch|uniq|view|write)\b',
+             Keyword.Reserved),
+            (r'(true|false|null|Infinity)\b', Keyword.Constant),
+            (r'(Array|Date|Juttle|Math|Number|Object|RegExp|String)\b',
+             Name.Builtin),
+            (JS_IDENT, Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ]
+
+    }
+
+
+class NodeConsoleLexer(Lexer):
+    """
+    For parsing within an interactive Node.js REPL, such as:
+
+    .. sourcecode:: nodejsrepl
+
+        > let a = 3
+        undefined
+        > a
+        3
+        > let b = '4'
+        undefined
+        > b
+        '4'
+        > b == a
+        false
+
+    .. versionadded: 2.10
+    """
+    name = 'Node.js REPL console session'
+    aliases = ['nodejsrepl', ]
+    mimetypes = ['text/x-nodejsrepl', ]
+    url = 'https://nodejs.org'
+    version_added = ''
+
+    def get_tokens_unprocessed(self, text):
+        jslexer = JavascriptLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+
+        for match in line_re.finditer(text):
+            line = match.group()
+            if line.startswith('> '):
+                insertions.append((len(curcode),
+                    [(0, Generic.Prompt, line[:1]),
+                     (1, Whitespace, line[1:2])]))
+
+                curcode += line[2:]
+            elif line.startswith('...'):
+                # node does a nested ... thing depending on depth
+                code = line.lstrip('.')
+                lead = len(line) - len(code)
+
+                insertions.append((len(curcode),
+                    [(0, Generic.Prompt, line[:lead])]))
+
+                curcode += code
+            else:
+                if curcode:
+                    yield from do_insertions(insertions,
+                        jslexer.get_tokens_unprocessed(curcode))
+
+                    curcode = ''
+                    insertions = []
+
+                yield from do_insertions([],
+                    jslexer.get_tokens_unprocessed(line))
+
+        if curcode:
+            yield from do_insertions(insertions,
+                jslexer.get_tokens_unprocessed(curcode))
diff --git a/.venv/Lib/site-packages/pygments/lexers/jmespath.py b/.venv/Lib/site-packages/pygments/lexers/jmespath.py
new file mode 100644 (file)
index 0000000..67374c2
--- /dev/null
@@ -0,0 +1,69 @@
+"""
+    pygments.lexers.jmespath
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the JMESPath language
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include
+from pygments.token import String, Punctuation, Whitespace, Name, Operator, \
+    Number, Literal, Keyword
+
+__all__ = ['JMESPathLexer']
+
+
+class JMESPathLexer(RegexLexer):
+    """
+    For JMESPath queries.
+    """
+    name = 'JMESPath'
+    url = 'https://jmespath.org'
+    filenames = ['*.jp']
+    aliases = ['jmespath', 'jp']
+    version_added = ''
+
+    tokens = {
+        'string': [
+            (r"'(\\(.|\n)|[^'\\])*'", String),
+        ],
+        'punctuation': [
+            (r'(\[\?|[\.\*\[\],:\(\)\{\}\|])', Punctuation),
+        ],
+        'ws': [
+            (r" |\t|\n|\r", Whitespace)
+        ],
+        "dq-identifier": [
+            (r'[^\\"]+', Name.Variable),
+            (r'\\"', Name.Variable),
+            (r'.', Punctuation, '#pop'),
+        ],
+        'identifier': [
+            (r'(&)?(")', bygroups(Name.Variable, Punctuation), 'dq-identifier'),
+            (r'(")?(&?[A-Za-z][A-Za-z0-9_-]*)(")?', bygroups(Punctuation, Name.Variable, Punctuation)),
+        ],
+        'root': [
+            include('ws'),
+            include('string'),
+            (r'(==|!=|<=|>=|<|>|&&|\|\||!)', Operator),
+            include('punctuation'),
+            (r'@', Name.Variable.Global),
+            (r'(&?[A-Za-z][A-Za-z0-9_]*)(\()', bygroups(Name.Function, Punctuation)),
+            (r'(&)(\()', bygroups(Name.Variable, Punctuation)),
+            include('identifier'),
+            (r'-?\d+', Number),
+            (r'`', Literal, 'literal'),
+        ],
+        'literal': [
+            include('ws'),
+            include('string'),
+            include('punctuation'),
+            (r'(false|true|null)\b', Keyword.Constant),
+            include('identifier'),
+            (r'-?\d+\.?\d*([eE][-+]\d+)?', Number),
+            (r'\\`', Literal),
+            (r'`', Literal, '#pop'),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/jslt.py b/.venv/Lib/site-packages/pygments/lexers/jslt.py
new file mode 100644 (file)
index 0000000..f2cc5df
--- /dev/null
@@ -0,0 +1,94 @@
+"""
+    pygments.lexers.jslt
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the JSLT language
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, combined, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Whitespace
+
+
+__all__ = ['JSLTLexer']
+
+
+_WORD_END = r'(?=[^0-9A-Z_a-z-])'
+
+
+class JSLTLexer(RegexLexer):
+    """
+    For JSLT source.
+    """
+    name = 'JSLT'
+    url = 'https://github.com/schibsted/jslt'
+    filenames = ['*.jslt']
+    aliases = ['jslt']
+    mimetypes = ['text/x-jslt']
+    version_added = '2.10'
+
+    tokens = {
+        'root': [
+            (r'[\t\n\f\r ]+', Whitespace),
+            (r'//.*(\n|\Z)', Comment.Single),
+            (r'-?(0|[1-9][0-9]*)', Number.Integer),
+            (r'-?(0|[1-9][0-9]*)(.[0-9]+a)?([Ee][+-]?[0-9]+)', Number.Float),
+            (r'"([^"\\]|\\.)*"', String.Double),
+            (r'[(),:\[\]{}]', Punctuation),
+            (r'(!=|[<=>]=?)', Operator),
+            (r'[*+/|-]', Operator),
+            (r'\.', Operator),
+            (words(('import',), suffix=_WORD_END), Keyword.Namespace, combined('import-path', 'whitespace')),
+            (words(('as',), suffix=_WORD_END), Keyword.Namespace, combined('import-alias', 'whitespace')),
+            (words(('let',), suffix=_WORD_END), Keyword.Declaration, combined('constant', 'whitespace')),
+            (words(('def',), suffix=_WORD_END), Keyword.Declaration, combined('function', 'whitespace')),
+            (words(('false', 'null', 'true'), suffix=_WORD_END), Keyword.Constant),
+            (words(('else', 'for', 'if'), suffix=_WORD_END), Keyword),
+            (words(('and', 'or'), suffix=_WORD_END), Operator.Word),
+            (words((
+                'all', 'any', 'array', 'boolean', 'capture', 'ceiling',
+                'contains', 'ends-with', 'error', 'flatten', 'floor',
+                'format-time', 'from-json', 'get-key', 'hash-int', 'index-of',
+                'is-array', 'is-boolean', 'is-decimal', 'is-integer',
+                'is-number', 'is-object', 'is-string', 'join', 'lowercase',
+                'max', 'min', 'mod', 'not', 'now', 'number', 'parse-time',
+                'parse-url', 'random', 'replace', 'round', 'sha256-hex', 'size',
+                'split', 'starts-with', 'string', 'sum', 'test', 'to-json',
+                'trim', 'uppercase', 'zip', 'zip-with-index', 'fallback'), suffix=_WORD_END),
+             Name.Builtin),
+            (r'[A-Z_a-z][0-9A-Z_a-z-]*:[A-Z_a-z][0-9A-Z_a-z-]*', Name.Function),
+            (r'[A-Z_a-z][0-9A-Z_a-z-]*', Name),
+            (r'\$[A-Z_a-z][0-9A-Z_a-z-]*', Name.Variable),
+        ],
+        'constant': [
+            (r'[A-Z_a-z][0-9A-Z_a-z-]*', Name.Variable, 'root'),
+        ],
+        'function': [
+            (r'[A-Z_a-z][0-9A-Z_a-z-]*', Name.Function, combined('function-parameter-list', 'whitespace')),
+        ],
+        'function-parameter-list': [
+            (r'\(', Punctuation, combined('function-parameters', 'whitespace')),
+        ],
+        'function-parameters': [
+            (r',', Punctuation),
+            (r'\)', Punctuation, 'root'),
+            (r'[A-Z_a-z][0-9A-Z_a-z-]*', Name.Variable),
+        ],
+        'import-path': [
+            (r'"([^"]|\\.)*"', String.Symbol, 'root'),
+        ],
+        'import-alias': [
+            (r'[A-Z_a-z][0-9A-Z_a-z-]*', Name.Namespace, 'root'),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'\\.', String.Escape),
+        ],
+        'whitespace': [
+            (r'[\t\n\f\r ]+', Whitespace),
+            (r'//.*(\n|\Z)', Comment.Single),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/json5.py b/.venv/Lib/site-packages/pygments/lexers/json5.py
new file mode 100644 (file)
index 0000000..35d769c
--- /dev/null
@@ -0,0 +1,83 @@
+"""
+    pygments.lexers.json5
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Json5 file format.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import include, RegexLexer, words
+from pygments.token import Comment, Keyword, Name, Number, Punctuation, \
+    String, Whitespace
+
+__all__ = ['Json5Lexer']
+
+
+def string_rules(quote_mark):
+    return [
+        (rf"[^{quote_mark}\\]+", String),
+        (r"\\.", String.Escape),
+        (r"\\", Punctuation),
+        (quote_mark, String, '#pop'),
+    ]
+
+
+def quoted_field_name(quote_mark):
+    return [
+        (rf'([^{quote_mark}\\]|\\.)*{quote_mark}',
+         Name.Variable, ('#pop', 'object_value'))
+    ]
+
+
+class Json5Lexer(RegexLexer):
+    """Lexer for JSON5 data structures."""
+
+    name = 'JSON5'
+    aliases = ['json5']
+    filenames = ['*.json5']
+    url = "https://json5.org"
+    version_added = '2.19'
+    tokens = {
+        '_comments': [
+            (r'(//|#).*\n', Comment.Single),
+            (r'/\*\*([^/]|/(?!\*))*\*/', String.Doc),
+            (r'/\*([^/]|/(?!\*))*\*/', Comment),
+        ],
+        'root': [
+            include('_comments'),
+            (r"'", String, 'singlestring'),
+            (r'"', String, 'doublestring'),
+            (r'[+-]?0[xX][0-9a-fA-F]+', Number.Hex),
+            (r'[+-.]?[0-9]+[.]?[0-9]?([eE][-]?[0-9]+)?', Number.Float),
+            (r'\{', Punctuation, 'object'),
+            (r'\[', Punctuation, 'array'),
+            (words(['false', 'Infinity', '+Infinity', '-Infinity', 'NaN',
+                    'null', 'true',], suffix=r'\b'), Keyword),
+            (r'\s+', Whitespace),
+            (r':', Punctuation),
+        ],
+        'singlestring': string_rules("'"),
+        'doublestring': string_rules('"'),
+        'array': [
+            (r',', Punctuation),
+            (r'\]', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'object': [
+            (r'\s+', Whitespace),
+            (r'\}', Punctuation, '#pop'),
+            (r'\b([^:]+)', Name.Variable, 'object_value'),
+            (r'"', Name.Variable, 'double_field_name'),
+            (r"'", Name.Variable, 'single_field_name'),
+            include('_comments'),
+        ],
+        'double_field_name': quoted_field_name('"'),
+        'single_field_name': quoted_field_name("'"),
+        'object_value': [
+            (r',', Punctuation, '#pop'),
+            (r'\}', Punctuation, '#pop:2'),
+            include('root'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/jsonnet.py b/.venv/Lib/site-packages/pygments/lexers/jsonnet.py
new file mode 100644 (file)
index 0000000..f9aa595
--- /dev/null
@@ -0,0 +1,169 @@
+"""
+    pygments.lexers.jsonnet
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Jsonnet data templating language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import include, RegexLexer, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text, Whitespace
+
+__all__ = ['JsonnetLexer']
+
+jsonnet_token = r'[^\W\d]\w*'
+jsonnet_function_token = jsonnet_token + r'(?=\()'
+
+
+def string_rules(quote_mark):
+    return [
+        (rf"[^{quote_mark}\\]", String),
+        (r"\\.", String.Escape),
+        (quote_mark, String, '#pop'),
+    ]
+
+
+def quoted_field_name(quote_mark):
+    return [
+        (rf'([^{quote_mark}\\]|\\.)*{quote_mark}',
+         Name.Variable, 'field_separator')
+    ]
+
+
+class JsonnetLexer(RegexLexer):
+    """Lexer for Jsonnet source code."""
+
+    name = 'Jsonnet'
+    aliases = ['jsonnet']
+    filenames = ['*.jsonnet', '*.libsonnet']
+    url = "https://jsonnet.org"
+    version_added = ''
+    tokens = {
+        # Not used by itself
+        '_comments': [
+            (r'(//|#).*\n', Comment.Single),
+            (r'/\*\*([^/]|/(?!\*))*\*/', String.Doc),
+            (r'/\*([^/]|/(?!\*))*\*/', Comment),
+        ],
+        'root': [
+            include('_comments'),
+            (r"@'.*'", String),
+            (r'@".*"', String),
+            (r"'", String, 'singlestring'),
+            (r'"', String, 'doublestring'),
+            (r'\|\|\|(.|\n)*\|\|\|', String),
+            # Jsonnet has no integers, only an IEEE754 64-bit float
+            (r'[+-]?[0-9]+(.[0-9])?', Number.Float),
+            # Omit : despite spec because it appears to be used as a field
+            # separator
+            (r'[!$~+\-&|^=<>*/%]', Operator),
+            (r'\{', Punctuation, 'object'),
+            (r'\[', Punctuation, 'array'),
+            (r'local\b', Keyword, ('local_name')),
+            (r'assert\b', Keyword, 'assert'),
+            (words([
+                'assert', 'else', 'error', 'false', 'for', 'if', 'import',
+                'importstr', 'in', 'null', 'tailstrict', 'then', 'self',
+                'super', 'true',
+             ], suffix=r'\b'), Keyword),
+            (r'\s+', Whitespace),
+            (r'function(?=\()', Keyword, 'function_params'),
+            (r'std\.' + jsonnet_function_token, Name.Builtin, 'function_args'),
+            (jsonnet_function_token, Name.Function, 'function_args'),
+            (jsonnet_token, Name.Variable),
+            (r'[\.()]', Punctuation),
+        ],
+        'singlestring': string_rules("'"),
+        'doublestring': string_rules('"'),
+        'array': [
+            (r',', Punctuation),
+            (r'\]', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'local_name': [
+            (jsonnet_function_token, Name.Function, 'function_params'),
+            (jsonnet_token, Name.Variable),
+            (r'\s+', Whitespace),
+            ('(?==)', Whitespace, ('#pop', 'local_value')),
+        ],
+        'local_value': [
+            (r'=', Operator),
+            (r';', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'assert': [
+            (r':', Punctuation),
+            (r';', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'function_params': [
+            (jsonnet_token, Name.Variable),
+            (r'\(', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'\s+', Whitespace),
+            (r'=', Operator, 'function_param_default'),
+        ],
+        'function_args': [
+            (r'\(', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'\s+', Whitespace),
+            include('root'),
+        ],
+        'object': [
+            (r'\s+', Whitespace),
+            (r'local\b', Keyword, 'object_local_name'),
+            (r'assert\b', Keyword, 'object_assert'),
+            (r'\[', Operator, 'field_name_expr'),
+            (fr'(?={jsonnet_token})', Text, 'field_name'),
+            (r'\}', Punctuation, '#pop'),
+            (r'"', Name.Variable, 'double_field_name'),
+            (r"'", Name.Variable, 'single_field_name'),
+            include('_comments'),
+        ],
+        'field_name': [
+            (jsonnet_function_token, Name.Function,
+                ('field_separator', 'function_params')
+             ),
+            (jsonnet_token, Name.Variable, 'field_separator'),
+        ],
+        'double_field_name': quoted_field_name('"'),
+        'single_field_name': quoted_field_name("'"),
+        'field_name_expr': [
+            (r'\]', Operator, 'field_separator'),
+            include('root'),
+        ],
+        'function_param_default': [
+            (r'(?=[,\)])', Whitespace, '#pop'),
+            include('root'),
+        ],
+        'field_separator': [
+            (r'\s+', Whitespace),
+            (r'\+?::?:?', Punctuation, ('#pop', '#pop', 'field_value')),
+            include('_comments'),
+        ],
+        'field_value': [
+            (r',', Punctuation, '#pop'),
+            (r'\}', Punctuation, '#pop:2'),
+            include('root'),
+        ],
+        'object_assert': [
+            (r':', Punctuation),
+            (r',', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'object_local_name': [
+            (jsonnet_token, Name.Variable, ('#pop', 'object_local_value')),
+            (r'\s+', Whitespace),
+        ],
+        'object_local_value': [
+            (r'=', Operator),
+            (r',', Punctuation, '#pop'),
+            (r'\}', Punctuation, '#pop:2'),
+            include('root'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/jsx.py b/.venv/Lib/site-packages/pygments/lexers/jsx.py
new file mode 100644 (file)
index 0000000..6124d8c
--- /dev/null
@@ -0,0 +1,100 @@
+"""
+    pygments.lexers.jsx
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for JSX (React) and TSX (TypeScript flavor).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import bygroups, default, include, inherit
+from pygments.lexers.javascript import JavascriptLexer, TypeScriptLexer
+from pygments.token import Name, Operator, Punctuation, String, Text, \
+    Whitespace
+
+__all__ = ['JsxLexer', 'TsxLexer']
+
+_JSX_RULES = {
+    "jsx": [
+        (r"</?>", Punctuation),  # JSXFragment <>|</>
+        (r"(<)(\w+)(\.?)", bygroups(Punctuation, Name.Tag, Punctuation), "tag"),
+        (
+            r"(</)(\w+)(>)",
+            bygroups(Punctuation, Name.Tag, Punctuation),
+        ),
+        (
+            r"(</)(\w+)",
+            bygroups(Punctuation, Name.Tag),
+            "fragment",
+        ),  # Same for React.Context
+    ],
+    "tag": [
+        (r"\s+", Whitespace),
+        (r"([\w-]+)(\s*)(=)(\s*)", bygroups(Name.Attribute, Whitespace, Operator, Whitespace), "attr"),
+        (r"[{}]+", Punctuation),
+        (r"[\w\.]+", Name.Attribute),
+        (r"(/?)(\s*)(>)", bygroups(Punctuation, Text, Punctuation), "#pop"),
+    ],
+    "fragment": [
+        (r"(.)(\w+)", bygroups(Punctuation, Name.Attribute)),
+        (r"(>)", bygroups(Punctuation), "#pop"),
+    ],
+    "attr": [
+        (r"\{", Punctuation, "expression"),
+        (r'".*?"', String, "#pop"),
+        (r"'.*?'", String, "#pop"),
+        default("#pop"),
+    ],
+    "expression": [
+        (r"\{", Punctuation, "#push"),
+        (r"\}", Punctuation, "#pop"),
+        include("root"),
+    ],
+}
+
+
+class JsxLexer(JavascriptLexer):
+    """For JavaScript Syntax Extension (JSX).
+    """
+
+    name = "JSX"
+    aliases = ["jsx", "react"]
+    filenames = ["*.jsx", "*.react"]
+    mimetypes = ["text/jsx", "text/typescript-jsx"]
+    url = "https://facebook.github.io/jsx/"
+    version_added = '2.17'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    # Use same tokens as `JavascriptLexer`, but with tags and attributes support
+    tokens = {
+        "root": [
+            include("jsx"),
+            inherit,
+        ],
+    **_JSX_RULES}
+
+
+class TsxLexer(TypeScriptLexer):
+    """For TypeScript with embedded JSX
+    """
+
+    name = "TSX"
+    aliases = ["tsx"]
+    filenames = ["*.tsx"]
+    mimetypes = ["text/typescript-tsx"]
+    url = "https://www.typescriptlang.org/docs/handbook/jsx.html"
+    version_added = '2.19'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    # Use same tokens as `TypescriptLexer`, but with tags and attributes support
+    tokens = {
+        "root": [
+            include("jsx"),
+            inherit,
+        ],
+    **_JSX_RULES}
diff --git a/.venv/Lib/site-packages/pygments/lexers/julia.py b/.venv/Lib/site-packages/pygments/lexers/julia.py
new file mode 100644 (file)
index 0000000..77d8baf
--- /dev/null
@@ -0,0 +1,294 @@
+"""
+    pygments.lexers.julia
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Julia language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, do_insertions, \
+    words, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+from pygments.util import shebang_matches
+from pygments.lexers._julia_builtins import OPERATORS_LIST, DOTTED_OPERATORS_LIST, \
+    KEYWORD_LIST, BUILTIN_LIST, LITERAL_LIST
+
+__all__ = ['JuliaLexer', 'JuliaConsoleLexer']
+
+# see https://docs.julialang.org/en/v1/manual/variables/#Allowed-Variable-Names
+allowed_variable = \
+    '(?:[a-zA-Z_\u00A1-\U0010ffff][a-zA-Z_0-9!\u00A1-\U0010ffff]*)'
+# see https://github.com/JuliaLang/julia/blob/master/src/flisp/julia_opsuffs.h
+operator_suffixes = r'[²³¹ʰʲʳʷʸˡˢˣᴬᴮᴰᴱᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾᴿᵀᵁᵂᵃᵇᵈᵉᵍᵏᵐᵒᵖᵗᵘᵛᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᶜᶠᶥᶦᶫᶰᶸᶻᶿ′″‴‵‶‷⁗⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₕₖₗₘₙₚₛₜⱼⱽ]*'
+
+class JuliaLexer(RegexLexer):
+    """
+    For Julia source code.
+    """
+
+    name = 'Julia'
+    url = 'https://julialang.org/'
+    aliases = ['julia', 'jl']
+    filenames = ['*.jl']
+    mimetypes = ['text/x-julia', 'application/x-julia']
+    version_added = '1.6'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'[^\S\n]+', Whitespace),
+            (r'#=', Comment.Multiline, "blockcomment"),
+            (r'#.*$', Comment),
+            (r'[\[\](),;]', Punctuation),
+
+            # symbols
+            #   intercept range expressions first
+            (r'(' + allowed_variable + r')(\s*)(:)(' + allowed_variable + ')',
+                bygroups(Name, Whitespace, Operator, Name)),
+            #   then match :name which does not follow closing brackets, digits, or the
+            #   ::, <:, and :> operators
+            (r'(?<![\]):<>\d.])(:' + allowed_variable + ')', String.Symbol),
+
+            # type assertions - excludes expressions like ::typeof(sin) and ::avec[1]
+            (r'(?<=::)(\s*)(' + allowed_variable + r')\b(?![(\[])',
+             bygroups(Whitespace, Keyword.Type)),
+            # type comparisons
+            # - MyType <: A or MyType >: A
+            ('(' + allowed_variable + r')(\s*)([<>]:)(\s*)(' + allowed_variable + r')\b(?![(\[])',
+                bygroups(Keyword.Type, Whitespace, Operator, Whitespace, Keyword.Type)),
+            # - <: B or >: B
+            (r'([<>]:)(\s*)(' + allowed_variable + r')\b(?![(\[])',
+                bygroups(Operator, Whitespace, Keyword.Type)),
+            # - A <: or A >:
+            (r'\b(' + allowed_variable + r')(\s*)([<>]:)',
+                bygroups(Keyword.Type, Whitespace, Operator)),
+
+            # operators
+            # Suffixes aren't actually allowed on all operators, but we'll ignore that
+            # since those cases are invalid Julia code.
+            (words([*OPERATORS_LIST, *DOTTED_OPERATORS_LIST],
+                   suffix=operator_suffixes), Operator),
+            (words(['.' + o for o in DOTTED_OPERATORS_LIST],
+                   suffix=operator_suffixes), Operator),
+            (words(['...', '..']), Operator),
+
+            # NOTE
+            # Patterns below work only for definition sites and thus hardly reliable.
+            #
+            # functions
+            # (r'(function)(\s+)(' + allowed_variable + ')',
+            #  bygroups(Keyword, Text, Name.Function)),
+
+            # chars
+            (r"'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,3}|\\u[a-fA-F0-9]{1,4}|"
+             r"\\U[a-fA-F0-9]{1,6}|[^\\\'\n])'", String.Char),
+
+            # try to match trailing transpose
+            (r'(?<=[.\w)\]])(\'' + operator_suffixes + ')+', Operator),
+
+            # raw strings
+            (r'(raw)(""")', bygroups(String.Affix, String), 'tqrawstring'),
+            (r'(raw)(")', bygroups(String.Affix, String), 'rawstring'),
+            # regular expressions
+            (r'(r)(""")', bygroups(String.Affix, String.Regex), 'tqregex'),
+            (r'(r)(")', bygroups(String.Affix, String.Regex), 'regex'),
+            # other strings
+            (r'(' + allowed_variable + ')?(""")',
+             bygroups(String.Affix, String), 'tqstring'),
+            (r'(' + allowed_variable + ')?(")',
+             bygroups(String.Affix, String), 'string'),
+
+            # backticks
+            (r'(' + allowed_variable + ')?(```)',
+             bygroups(String.Affix, String.Backtick), 'tqcommand'),
+            (r'(' + allowed_variable + ')?(`)',
+             bygroups(String.Affix, String.Backtick), 'command'),
+
+            # type names
+            # - names that begin a curly expression
+            ('(' + allowed_variable + r')(\{)',
+                bygroups(Keyword.Type, Punctuation), 'curly'),
+            # - names as part of bare 'where'
+            (r'(where)(\s+)(' + allowed_variable + ')',
+                bygroups(Keyword, Whitespace, Keyword.Type)),
+            # - curly expressions in general
+            (r'(\{)', Punctuation, 'curly'),
+            # - names as part of type declaration
+            (r'(abstract|primitive)([ \t]+)(type\b)([\s()]+)(' +
+                allowed_variable + r')',
+                bygroups(Keyword, Whitespace, Keyword, Text, Keyword.Type)),
+            (r'(mutable(?=[ \t]))?([ \t]+)?(struct\b)([\s()]+)(' +
+                allowed_variable + r')',
+                bygroups(Keyword, Whitespace, Keyword, Text, Keyword.Type)),
+
+            # macros
+            (r'@' + allowed_variable, Name.Decorator),
+            (words([*OPERATORS_LIST, '..', '.', *DOTTED_OPERATORS_LIST],
+                prefix='@', suffix=operator_suffixes), Name.Decorator),
+
+            # keywords
+            (words(KEYWORD_LIST, suffix=r'\b'), Keyword),
+            # builtin types
+            (words(BUILTIN_LIST, suffix=r'\b'), Keyword.Type),
+            # builtin literals
+            (words(LITERAL_LIST, suffix=r'\b'), Name.Builtin),
+
+            # names
+            (allowed_variable, Name),
+
+            # numbers
+            (r'(\d+((_\d+)+)?\.(?!\.)(\d+((_\d+)+)?)?|\.\d+((_\d+)+)?)([eEf][+-]?[0-9]+)?', Number.Float),
+            (r'\d+((_\d+)+)?[eEf][+-]?[0-9]+', Number.Float),
+            (r'0x[a-fA-F0-9]+((_[a-fA-F0-9]+)+)?(\.([a-fA-F0-9]+((_[a-fA-F0-9]+)+)?)?)?p[+-]?\d+', Number.Float),
+            (r'0b[01]+((_[01]+)+)?', Number.Bin),
+            (r'0o[0-7]+((_[0-7]+)+)?', Number.Oct),
+            (r'0x[a-fA-F0-9]+((_[a-fA-F0-9]+)+)?', Number.Hex),
+            (r'\d+((_\d+)+)?', Number.Integer),
+
+            # single dot operator matched last to permit e.g. ".1" as a float
+            (words(['.']), Operator),
+        ],
+
+        "blockcomment": [
+            (r'[^=#]', Comment.Multiline),
+            (r'#=', Comment.Multiline, '#push'),
+            (r'=#', Comment.Multiline, '#pop'),
+            (r'[=#]', Comment.Multiline),
+        ],
+
+        'curly': [
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+            (allowed_variable, Keyword.Type),
+            include('root'),
+        ],
+
+        'tqrawstring': [
+            (r'"""', String, '#pop'),
+            (r'([^"]|"[^"][^"])+', String),
+        ],
+        'rawstring': [
+            (r'"', String, '#pop'),
+            (r'\\"', String.Escape),
+            (r'([^"\\]|\\[^"])+', String),
+        ],
+
+        # Interpolation is defined as "$" followed by the shortest full
+        # expression, which is something we can't parse.  Include the most
+        # common cases here: $word, and $(paren'd expr).
+        'interp': [
+            (r'\$' + allowed_variable, String.Interpol),
+            (r'(\$)(\()', bygroups(String.Interpol, Punctuation), 'in-intp'),
+        ],
+        'in-intp': [
+            (r'\(', Punctuation, '#push'),
+            (r'\)', Punctuation, '#pop'),
+            include('root'),
+        ],
+
+        'string': [
+            (r'(")(' + allowed_variable + r'|\d+)?',
+             bygroups(String, String.Affix), '#pop'),
+            # FIXME: This escape pattern is not perfect.
+            (r'\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)', String.Escape),
+            include('interp'),
+            # @printf and @sprintf formats
+            (r'%[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]',
+             String.Interpol),
+            (r'[^"$%\\]+', String),
+            (r'.', String),
+        ],
+        'tqstring': [
+            (r'(""")(' + allowed_variable + r'|\d+)?',
+             bygroups(String, String.Affix), '#pop'),
+            (r'\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)', String.Escape),
+            include('interp'),
+            (r'[^"$%\\]+', String),
+            (r'.', String),
+        ],
+
+        'regex': [
+            (r'(")([imsxa]*)?', bygroups(String.Regex, String.Affix), '#pop'),
+            (r'\\"', String.Regex),
+            (r'[^\\"]+', String.Regex),
+        ],
+
+        'tqregex': [
+            (r'(""")([imsxa]*)?', bygroups(String.Regex, String.Affix), '#pop'),
+            (r'[^"]+', String.Regex),
+        ],
+
+        'command': [
+            (r'(`)(' + allowed_variable + r'|\d+)?',
+             bygroups(String.Backtick, String.Affix), '#pop'),
+            (r'\\[`$]', String.Escape),
+            include('interp'),
+            (r'[^\\`$]+', String.Backtick),
+            (r'.', String.Backtick),
+        ],
+        'tqcommand': [
+            (r'(```)(' + allowed_variable + r'|\d+)?',
+             bygroups(String.Backtick, String.Affix), '#pop'),
+            (r'\\\$', String.Escape),
+            include('interp'),
+            (r'[^\\`$]+', String.Backtick),
+            (r'.', String.Backtick),
+        ],
+    }
+
+    def analyse_text(text):
+        return shebang_matches(text, r'julia')
+
+
+class JuliaConsoleLexer(Lexer):
+    """
+    For Julia console sessions. Modeled after MatlabSessionLexer.
+    """
+    name = 'Julia console'
+    aliases = ['jlcon', 'julia-repl']
+    url = 'https://julialang.org/'
+    version_added = '1.6'
+    _example = "jlcon/console"
+
+    def get_tokens_unprocessed(self, text):
+        jllexer = JuliaLexer(**self.options)
+        start = 0
+        curcode = ''
+        insertions = []
+        output = False
+        error = False
+
+        for line in text.splitlines(keepends=True):
+            if line.startswith('julia>'):
+                insertions.append((len(curcode), [(0, Generic.Prompt, line[:6])]))
+                curcode += line[6:]
+                output = False
+                error = False
+            elif line.startswith('help?>') or line.startswith('shell>'):
+                yield start, Generic.Prompt, line[:6]
+                yield start + 6, Text, line[6:]
+                output = False
+                error = False
+            elif line.startswith('      ') and not output:
+                insertions.append((len(curcode), [(0, Whitespace, line[:6])]))
+                curcode += line[6:]
+            else:
+                if curcode:
+                    yield from do_insertions(
+                        insertions, jllexer.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+                if line.startswith('ERROR: ') or error:
+                    yield start, Generic.Error, line
+                    error = True
+                else:
+                    yield start, Generic.Output, line
+                output = True
+            start += len(line)
+
+        if curcode:
+            yield from do_insertions(
+                insertions, jllexer.get_tokens_unprocessed(curcode))
diff --git a/.venv/Lib/site-packages/pygments/lexers/jvm.py b/.venv/Lib/site-packages/pygments/lexers/jvm.py
new file mode 100644 (file)
index 0000000..3ca257a
--- /dev/null
@@ -0,0 +1,1802 @@
+"""
+    pygments.lexers.jvm
+    ~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexers for JVM languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, bygroups, using, \
+    this, combined, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+from pygments.util import shebang_matches
+from pygments import unistring as uni
+
+__all__ = ['JavaLexer', 'ScalaLexer', 'GosuLexer', 'GosuTemplateLexer',
+           'GroovyLexer', 'IokeLexer', 'ClojureLexer', 'ClojureScriptLexer',
+           'KotlinLexer', 'XtendLexer', 'AspectJLexer', 'CeylonLexer',
+           'PigLexer', 'GoloLexer', 'JasminLexer', 'SarlLexer']
+
+
+class JavaLexer(RegexLexer):
+    """
+    For Java source code.
+    """
+
+    name = 'Java'
+    url = 'https://www.oracle.com/technetwork/java/'
+    aliases = ['java']
+    filenames = ['*.java']
+    mimetypes = ['text/x-java']
+    version_added = ''
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'(^\s*)((?:(?:public|private|protected|static|strictfp)(?:\s+))*)(record)\b',
+             bygroups(Whitespace, using(this), Keyword.Declaration), 'class'),
+            (r'[^\S\n]+', Whitespace),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/\*.*?\*/', Comment.Multiline),
+            # keywords: go before method names to avoid lexing "throw new XYZ"
+            # as a method signature
+            (r'(assert|break|case|catch|continue|default|do|else|finally|for|'
+             r'if|goto|instanceof|new|return|switch|this|throw|try|while)\b',
+             Keyword),
+            # method names
+            (r'((?:(?:[^\W\d]|\$)[\w.\[\]$<>?]*\s+)+?)'  # return arguments
+             r'((?:[^\W\d]|\$)[\w$]*)'                  # method name
+             r'(\s*)(\()',                              # signature start
+             bygroups(using(this), Name.Function, Whitespace, Punctuation)),
+            (r'@[^\W\d][\w.]*', Name.Decorator),
+            (r'(abstract|const|enum|extends|final|implements|native|private|'
+             r'protected|public|sealed|static|strictfp|super|synchronized|throws|'
+             r'transient|volatile|yield)\b', Keyword.Declaration),
+            (r'(boolean|byte|char|double|float|int|long|short|void)\b',
+             Keyword.Type),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Whitespace), 'import'),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(class|interface)\b', Keyword.Declaration, 'class'),
+            (r'(var)(\s+)', bygroups(Keyword.Declaration, Whitespace), 'var'),
+            (r'(import(?:\s+static)?)(\s+)', bygroups(Keyword.Namespace, Whitespace),
+             'import'),
+            (r'"""\n', String, 'multiline_string'),
+            (r'"', String, 'string'),
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
+            (r'(\.)((?:[^\W\d]|\$)[\w$]*)', bygroups(Punctuation,
+                                                     Name.Attribute)),
+            (r'^(\s*)(default)(:)', bygroups(Whitespace, Keyword, Punctuation)),
+            (r'^(\s*)((?:[^\W\d]|\$)[\w$]*)(:)', bygroups(Whitespace, Name.Label,
+                                                          Punctuation)),
+            (r'([^\W\d]|\$)[\w$]*', Name),
+            (r'([0-9][0-9_]*\.([0-9][0-9_]*)?|'
+             r'\.[0-9][0-9_]*)'
+             r'([eE][+\-]?[0-9][0-9_]*)?[fFdD]?|'
+             r'[0-9][eE][+\-]?[0-9][0-9_]*[fFdD]?|'
+             r'[0-9]([eE][+\-]?[0-9][0-9_]*)?[fFdD]|'
+             r'0[xX]([0-9a-fA-F][0-9a-fA-F_]*\.?|'
+             r'([0-9a-fA-F][0-9a-fA-F_]*)?\.[0-9a-fA-F][0-9a-fA-F_]*)'
+             r'[pP][+\-]?[0-9][0-9_]*[fFdD]?', Number.Float),
+            (r'0[xX][0-9a-fA-F][0-9a-fA-F_]*[lL]?', Number.Hex),
+            (r'0[bB][01][01_]*[lL]?', Number.Bin),
+            (r'0[0-7_]+[lL]?', Number.Oct),
+            (r'0|[1-9][0-9_]*[lL]?', Number.Integer),
+            (r'[~^*!%&\[\]<>|+=/?-]', Operator),
+            (r'[{}();:.,]', Punctuation),
+            (r'\n', Whitespace)
+        ],
+        'class': [
+            (r'\s+', Text),
+            (r'([^\W\d]|\$)[\w$]*', Name.Class, '#pop')
+        ],
+        'var': [
+            (r'([^\W\d]|\$)[\w$]*', Name, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+        'multiline_string': [
+            (r'"""', String, '#pop'),
+            (r'"', String),
+            include('string')
+        ],
+        'string': [
+            (r'[^\\"]+', String),
+            (r'\\\\', String),  # Escaped backslash
+            (r'\\"', String),  # Escaped quote
+            (r'\\', String),  # Bare backslash
+            (r'"', String, '#pop'),  # Closing quote
+        ],
+    }
+
+
+class AspectJLexer(JavaLexer):
+    """
+    For AspectJ source code.
+    """
+
+    name = 'AspectJ'
+    url = 'http://www.eclipse.org/aspectj/'
+    aliases = ['aspectj']
+    filenames = ['*.aj']
+    mimetypes = ['text/x-aspectj']
+    version_added = '1.6'
+
+    aj_keywords = {
+        'aspect', 'pointcut', 'privileged', 'call', 'execution',
+        'initialization', 'preinitialization', 'handler', 'get', 'set',
+        'staticinitialization', 'target', 'args', 'within', 'withincode',
+        'cflow', 'cflowbelow', 'annotation', 'before', 'after', 'around',
+        'proceed', 'throwing', 'returning', 'adviceexecution', 'declare',
+        'parents', 'warning', 'error', 'soft', 'precedence', 'thisJoinPoint',
+        'thisJoinPointStaticPart', 'thisEnclosingJoinPointStaticPart',
+        'issingleton', 'perthis', 'pertarget', 'percflow', 'percflowbelow',
+        'pertypewithin', 'lock', 'unlock', 'thisAspectInstance'
+    }
+    aj_inter_type = {'parents:', 'warning:', 'error:', 'soft:', 'precedence:'}
+    aj_inter_type_annotation = {'@type', '@method', '@constructor', '@field'}
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in JavaLexer.get_tokens_unprocessed(self, text):
+            if token is Name and value in self.aj_keywords:
+                yield index, Keyword, value
+            elif token is Name.Label and value in self.aj_inter_type:
+                yield index, Keyword, value[:-1]
+                yield index, Operator, value[-1]
+            elif token is Name.Decorator and value in self.aj_inter_type_annotation:
+                yield index, Keyword, value
+            else:
+                yield index, token, value
+
+
+class ScalaLexer(RegexLexer):
+    """
+    For Scala source code.
+    """
+
+    name = 'Scala'
+    url = 'http://www.scala-lang.org'
+    aliases = ['scala']
+    filenames = ['*.scala']
+    mimetypes = ['text/x-scala']
+    version_added = ''
+
+    flags = re.MULTILINE | re.DOTALL
+
+    opchar = '[!#%&*\\-\\/:?@^' + uni.combine('Sm', 'So') + ']'
+    letter = '[_\\$' + uni.combine('Ll', 'Lu', 'Lo', 'Nl', 'Lt') + ']'
+    upperLetter = '[' + uni.combine('Lu', 'Lt') + ']'
+    letterOrDigit = f'(?:{letter}|[0-9])'
+    letterOrDigitNoDollarSign = '(?:{}|[0-9])'.format(letter.replace('\\$', ''))
+    alphaId = f'{letter}+'
+    simpleInterpolatedVariable  = f'{letter}{letterOrDigitNoDollarSign}*'
+    idrest = f'{letter}{letterOrDigit}*(?:(?<=_){opchar}+)?'
+    idUpper = f'{upperLetter}{letterOrDigit}*(?:(?<=_){opchar}+)?'
+    plainid = f'(?:{idrest}|{opchar}+)'
+    backQuotedId = r'`[^`]+`'
+    anyId = rf'(?:{plainid}|{backQuotedId})'
+    notStartOfComment = r'(?!//|/\*)'
+    endOfLineMaybeWithComment = r'(?=\s*(//|$))'
+
+    keywords = (
+        'new', 'return', 'throw', 'classOf', 'isInstanceOf', 'asInstanceOf',
+        'else', 'if', 'then', 'do', 'while', 'for', 'yield', 'match', 'case',
+        'catch', 'finally', 'try'
+    )
+
+    operators = (
+        '<%', '=:=', '<:<', '<%<', '>:', '<:', '=', '==', '!=', '<=', '>=',
+        '<>', '<', '>', '<-', '←', '->', '→', '=>', '⇒', '?', '@', '|', '-',
+        '+', '*', '%', '~', '\\'
+    )
+
+    storage_modifiers = (
+        'private', 'protected', 'synchronized', '@volatile', 'abstract',
+        'final', 'lazy', 'sealed', 'implicit', 'override', '@transient',
+        '@native'
+    )
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            include('script-header'),
+            include('imports'),
+            include('exports'),
+            include('storage-modifiers'),
+            include('annotations'),
+            include('using'),
+            include('declarations'),
+            include('inheritance'),
+            include('extension'),
+            include('end'),
+            include('constants'),
+            include('strings'),
+            include('symbols'),
+            include('singleton-type'),
+            include('inline'),
+            include('quoted'),
+            include('keywords'),
+            include('operators'),
+            include('punctuation'),
+            include('names'),
+        ],
+
+        # Includes:
+        'whitespace': [
+            (r'\s+', Whitespace),
+        ],
+        'comments': [
+            (r'//.*?\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+        ],
+        'script-header': [
+            (r'^#!([^\n]*)$', Comment.Hashbang),
+        ],
+        'imports': [
+            (r'\b(import)(\s+)', bygroups(Keyword, Whitespace), 'import-path'),
+        ],
+        'exports': [
+            (r'\b(export)(\s+)(given)(\s+)',
+                bygroups(Keyword, Whitespace, Keyword, Whitespace), 'export-path'),
+            (r'\b(export)(\s+)', bygroups(Keyword, Whitespace), 'export-path'),
+        ],
+        'storage-modifiers': [
+            (words(storage_modifiers, prefix=r'\b', suffix=r'\b'), Keyword),
+            # Only highlight soft modifiers if they are eventually followed by
+            # the correct keyword. Note that soft modifiers can be followed by a
+            # sequence of regular modifiers; [a-z\s]* skips those, and we just
+            # check that the soft modifier is applied to a supported statement.
+            (r'\b(transparent|opaque|infix|open|inline)\b(?=[a-z\s]*\b'
+             r'(def|val|var|given|type|class|trait|object|enum)\b)', Keyword),
+        ],
+        'annotations': [
+            (rf'@{idrest}', Name.Decorator),
+        ],
+        'using': [
+            # using is a soft keyword, can only be used in the first position of
+            # a parameter or argument list.
+            (r'(\()(\s*)(using)(\s)', bygroups(Punctuation, Whitespace, Keyword, Whitespace)),
+        ],
+        'declarations': [
+            (rf'\b(def)\b(\s*){notStartOfComment}({anyId})?',
+             bygroups(Keyword, Whitespace, Name.Function)),
+            (rf'\b(trait)\b(\s*){notStartOfComment}({anyId})?',
+                bygroups(Keyword, Whitespace, Name.Class)),
+            (rf'\b(?:(case)(\s+))?(class|object|enum)\b(\s*){notStartOfComment}({anyId})?',
+                bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Class)),
+            (rf'(?<!\.)\b(type)\b(\s*){notStartOfComment}({anyId})?',
+                bygroups(Keyword, Whitespace, Name.Class)),
+            (r'\b(val|var)\b', Keyword.Declaration),
+            (rf'\b(package)(\s+)(object)\b(\s*){notStartOfComment}({anyId})?',
+                bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Namespace)),
+            (r'\b(package)(\s+)', bygroups(Keyword, Whitespace), 'package'),
+            (rf'\b(given)\b(\s*)({idUpper})',
+                bygroups(Keyword, Whitespace, Name.Class)),
+            (rf'\b(given)\b(\s*)({anyId})?',
+                bygroups(Keyword, Whitespace, Name)),
+        ],
+        'inheritance': [
+            (r'\b(extends|with|derives)\b(\s*)'
+             rf'({idUpper}|{backQuotedId}|(?=\([^\)]+=>)|(?={plainid})|(?="))?',
+                bygroups(Keyword, Whitespace, Name.Class)),
+        ],
+        'extension': [
+            (r'\b(extension)(\s+)(?=[\[\(])', bygroups(Keyword, Whitespace)),
+        ],
+        'end': [
+            # end is a soft keyword, should only be highlighted in certain cases
+            (r'\b(end)(\s+)(if|while|for|match|new|extension|val|var)\b',
+                bygroups(Keyword, Whitespace, Keyword)),
+            (rf'\b(end)(\s+)({idUpper}){endOfLineMaybeWithComment}',
+                bygroups(Keyword, Whitespace, Name.Class)),
+            (rf'\b(end)(\s+)({backQuotedId}|{plainid})?{endOfLineMaybeWithComment}',
+                bygroups(Keyword, Whitespace, Name.Namespace)),
+        ],
+        'punctuation': [
+            (r'[{}()\[\];,.]', Punctuation),
+            (r'(?<!:):(?!:)', Punctuation),
+        ],
+        'keywords': [
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword),
+        ],
+        'operators': [
+            (rf'({opchar}{{2,}})(\s+)', bygroups(Operator, Whitespace)),
+            (r'/(?![/*])', Operator),
+            (words(operators), Operator),
+            (rf'(?<!{opchar})(!|&&|\|\|)(?!{opchar})', Operator),
+        ],
+        'constants': [
+            (r'\b(this|super)\b', Name.Builtin.Pseudo),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'0[xX][0-9a-fA-F_]*', Number.Hex),
+            (r'([0-9][0-9_]*\.[0-9][0-9_]*|\.[0-9][0-9_]*)'
+             r'([eE][+-]?[0-9][0-9_]*)?[fFdD]?', Number.Float),
+            (r'[0-9]+([eE][+-]?[0-9]+)?[fFdD]', Number.Float),
+            (r'[0-9]+([eE][+-]?[0-9]+)[fFdD]?', Number.Float),
+            (r'[0-9]+[lL]', Number.Integer.Long),
+            (r'[0-9]+', Number.Integer),
+            (r'""".*?"""(?!")', String),
+            (r'"(\\\\|\\"|[^"])*"', String),
+            (r"(')(\\.)(')", bygroups(String.Char, String.Escape, String.Char)),
+            (r"'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
+        ],
+        "strings": [
+            (r'[fs]"""', String, 'interpolated-string-triple'),
+            (r'[fs]"', String, 'interpolated-string'),
+            (r'raw"(\\\\|\\"|[^"])*"', String),
+        ],
+        'symbols': [
+            (rf"('{plainid})(?!')", String.Symbol),
+        ],
+        'singleton-type': [
+            (r'(\.)(type)\b', bygroups(Punctuation, Keyword)),
+        ],
+        'inline': [
+            # inline is a soft modifier, only highlighted if followed by if,
+            # match or parameters.
+            (rf'\b(inline)(?=\s+({plainid}|{backQuotedId})\s*:)',
+                Keyword),
+            (r'\b(inline)\b(?=(?:.(?!\b(?:val|def|given)\b))*\b(if|match)\b)',
+                Keyword),
+        ],
+        'quoted': [
+            # '{...} or ${...}
+            (r"['$]\{(?!')", Punctuation),
+            # '[...]
+            (r"'\[(?!')", Punctuation),
+        ],
+        'names': [
+            (idUpper, Name.Class),
+            (anyId, Name),
+        ],
+
+        # States
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'import-path': [
+            (r'(?<=[\n;:])', Text, '#pop'),
+            include('comments'),
+            (r'\b(given)\b', Keyword),
+            include('qualified-name'),
+            (r'\{', Punctuation, 'import-path-curly-brace'),
+        ],
+        'import-path-curly-brace': [
+            include('whitespace'),
+            include('comments'),
+            (r'\b(given)\b', Keyword),
+            (r'=>', Operator),
+            (r'\}', Punctuation, '#pop'),
+            (r',', Punctuation),
+            (r'[\[\]]', Punctuation),
+            include('qualified-name'),
+        ],
+        'export-path': [
+            (r'(?<=[\n;:])', Text, '#pop'),
+            include('comments'),
+            include('qualified-name'),
+            (r'\{', Punctuation, 'export-path-curly-brace'),
+        ],
+        'export-path-curly-brace': [
+            include('whitespace'),
+            include('comments'),
+            (r'=>', Operator),
+            (r'\}', Punctuation, '#pop'),
+            (r',', Punctuation),
+            include('qualified-name'),
+        ],
+        'package': [
+            (r'(?<=[\n;])', Text, '#pop'),
+            (r':', Punctuation, '#pop'),
+            include('comments'),
+            include('qualified-name'),
+        ],
+        'interpolated-string-triple': [
+            (r'"""(?!")', String, '#pop'),
+            (r'"', String),
+            include('interpolated-string-common'),
+        ],
+        'interpolated-string': [
+            (r'"', String, '#pop'),
+            include('interpolated-string-common'),
+        ],
+        'interpolated-string-brace': [
+            (r'\}', String.Interpol, '#pop'),
+            (r'\{', Punctuation, 'interpolated-string-nested-brace'),
+            include('root'),
+        ],
+        'interpolated-string-nested-brace': [
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+            include('root'),
+        ],
+
+        # Helpers
+        'qualified-name': [
+            (idUpper, Name.Class),
+            (rf'({anyId})(\.)', bygroups(Name.Namespace, Punctuation)),
+            (r'\.', Punctuation),
+            (anyId, Name),
+            (r'[^\S\n]+', Whitespace),
+        ],
+        'interpolated-string-common': [
+            (r'[^"$\\]+', String),
+            (r'\$\$', String.Escape),
+            (rf'(\$)({simpleInterpolatedVariable})',
+                bygroups(String.Interpol, Name)),
+            (r'\$\{', String.Interpol, 'interpolated-string-brace'),
+            (r'\\.', String),
+        ],
+    }
+
+
+class GosuLexer(RegexLexer):
+    """
+    For Gosu source code.
+    """
+
+    name = 'Gosu'
+    aliases = ['gosu']
+    filenames = ['*.gs', '*.gsx', '*.gsp', '*.vark']
+    mimetypes = ['text/x-gosu']
+    url = 'https://gosu-lang.github.io'
+    version_added = '1.5'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)'  # modifiers etc.
+             r'([a-zA-Z_]\w*)'                       # method name
+             r'(\s*)(\()',                           # signature start
+             bygroups(using(this), Name.Function, Whitespace, Operator)),
+            (r'[^\S\n]+', Whitespace),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w.]*', Name.Decorator),
+            (r'(in|as|typeof|statictypeof|typeis|typeas|if|else|foreach|for|'
+             r'index|while|do|continue|break|return|try|catch|finally|this|'
+             r'throw|new|switch|case|default|eval|super|outer|classpath|'
+             r'using)\b', Keyword),
+            (r'(var|delegate|construct|function|private|internal|protected|'
+             r'public|abstract|override|final|static|extends|transient|'
+             r'implements|represents|readonly)\b', Keyword.Declaration),
+            (r'(property)(\s+)(get|set)?', bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration)),
+            (r'(boolean|byte|char|double|float|int|long|short|void|block)\b',
+             Keyword.Type),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Whitespace)),
+            (r'(true|false|null|NaN|Infinity)\b', Keyword.Constant),
+            (r'(class|interface|enhancement|enum)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Class)),
+            (r'(uses)(\s+)([\w.]+\*?)',
+             bygroups(Keyword.Namespace, Whitespace, Name.Namespace)),
+            (r'"', String, 'string'),
+            (r'(\??[.#])([a-zA-Z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            (r'(:)([a-zA-Z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'and|or|not|[\\~^*!%&\[\](){}<>|+=:;,./?-]', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'\n', Whitespace)
+        ],
+        'templateText': [
+            (r'(\\<)|(\\\$)', String),
+            (r'(<%@\s+)(extends|params)',
+             bygroups(Operator, Name.Decorator), 'stringTemplate'),
+            (r'<%!--.*?--%>', Comment.Multiline),
+            (r'(<%)|(<%=)', Operator, 'stringTemplate'),
+            (r'\$\{', Operator, 'stringTemplateShorthand'),
+            (r'.', String)
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            include('templateText')
+        ],
+        'stringTemplate': [
+            (r'"', String, 'string'),
+            (r'%>', Operator, '#pop'),
+            include('root')
+        ],
+        'stringTemplateShorthand': [
+            (r'"', String, 'string'),
+            (r'\{', Operator, 'stringTemplateShorthand'),
+            (r'\}', Operator, '#pop'),
+            include('root')
+        ],
+    }
+
+
+class GosuTemplateLexer(Lexer):
+    """
+    For Gosu templates.
+    """
+
+    name = 'Gosu Template'
+    aliases = ['gst']
+    filenames = ['*.gst']
+    mimetypes = ['text/x-gosu-template']
+    url = 'https://gosu-lang.github.io'
+    version_added = '1.5'
+
+    def get_tokens_unprocessed(self, text):
+        lexer = GosuLexer()
+        stack = ['templateText']
+        yield from lexer.get_tokens_unprocessed(text, stack)
+
+
+class GroovyLexer(RegexLexer):
+    """
+    For Groovy source code.
+    """
+
+    name = 'Groovy'
+    url = 'https://groovy-lang.org/'
+    aliases = ['groovy']
+    filenames = ['*.groovy','*.gradle']
+    mimetypes = ['text/x-groovy']
+    version_added = '1.5'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # Groovy allows a file to start with a shebang
+            (r'#!(.*?)$', Comment.Preproc, 'base'),
+            default('base'),
+        ],
+        'base': [
+            (r'[^\S\n]+', Whitespace),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/\*.*?\*/', Comment.Multiline),
+            # keywords: go before method names to avoid lexing "throw new XYZ"
+            # as a method signature
+            (r'(assert|break|case|catch|continue|default|do|else|finally|for|'
+             r'if|goto|instanceof|new|return|switch|this|throw|try|while|in|as)\b',
+             Keyword),
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)'  # return arguments
+             r'('
+             r'[a-zA-Z_]\w*'                        # method name
+             r'|"(?:\\\\|\\[^\\]|[^"\\])*"'         # or double-quoted method name
+             r"|'(?:\\\\|\\[^\\]|[^'\\])*'"         # or single-quoted method name
+             r')'
+             r'(\s*)(\()',                          # signature start
+             bygroups(using(this), Name.Function, Whitespace, Operator)),
+            (r'@[a-zA-Z_][\w.]*', Name.Decorator),
+            (r'(abstract|const|enum|extends|final|implements|native|private|'
+             r'protected|public|static|strictfp|super|synchronized|throws|'
+             r'transient|volatile)\b', Keyword.Declaration),
+            (r'(def|boolean|byte|char|double|float|int|long|short|void)\b',
+             Keyword.Type),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Whitespace)),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(class|interface)(\s+)', bygroups(Keyword.Declaration, Whitespace),
+             'class'),
+            (r'(import)(\s+)', bygroups(Keyword.Namespace, Whitespace), 'import'),
+            (r'""".*?"""', String.Double),
+            (r"'''.*?'''", String.Single),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'\$/((?!/\$).)*/\$', String),
+            (r'/(\\\\|\\[^\\]|[^/\\])*/', String),
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
+            (r'(\.)([a-zA-Z_]\w*)', bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'[~^*!%&\[\](){}<>|+=:;,./?-]', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Whitespace)
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+    }
+
+    def analyse_text(text):
+        return shebang_matches(text, r'groovy')
+
+
+class IokeLexer(RegexLexer):
+    """
+    For Ioke (a strongly typed, dynamic,
+    prototype based programming language) source.
+    """
+    name = 'Ioke'
+    url = 'https://ioke.org/'
+    filenames = ['*.ik']
+    aliases = ['ioke', 'ik']
+    mimetypes = ['text/x-iokesrc']
+    version_added = '1.4'
+    tokens = {
+        'interpolatableText': [
+            (r'(\\b|\\e|\\t|\\n|\\f|\\r|\\"|\\\\|\\#|\\\Z|\\u[0-9a-fA-F]{1,4}'
+             r'|\\[0-3]?[0-7]?[0-7])', String.Escape),
+            (r'#\{', Punctuation, 'textInterpolationRoot')
+        ],
+
+        'text': [
+            (r'(?<!\\)"', String, '#pop'),
+            include('interpolatableText'),
+            (r'[^"]', String)
+        ],
+
+        'documentation': [
+            (r'(?<!\\)"', String.Doc, '#pop'),
+            include('interpolatableText'),
+            (r'[^"]', String.Doc)
+        ],
+
+        'textInterpolationRoot': [
+            (r'\}', Punctuation, '#pop'),
+            include('root')
+        ],
+
+        'slashRegexp': [
+            (r'(?<!\\)/[im-psux]*', String.Regex, '#pop'),
+            include('interpolatableText'),
+            (r'\\/', String.Regex),
+            (r'[^/]', String.Regex)
+        ],
+
+        'squareRegexp': [
+            (r'(?<!\\)][im-psux]*', String.Regex, '#pop'),
+            include('interpolatableText'),
+            (r'\\]', String.Regex),
+            (r'[^\]]', String.Regex)
+        ],
+
+        'squareText': [
+            (r'(?<!\\)]', String, '#pop'),
+            include('interpolatableText'),
+            (r'[^\]]', String)
+        ],
+
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+
+            # Comments
+            (r';(.*?)\n', Comment),
+            (r'\A#!(.*?)\n', Comment),
+
+            # Regexps
+            (r'#/', String.Regex, 'slashRegexp'),
+            (r'#r\[', String.Regex, 'squareRegexp'),
+
+            # Symbols
+            (r':[\w!:?]+', String.Symbol),
+            (r'[\w!:?]+:(?![\w!?])', String.Other),
+            (r':"(\\\\|\\[^\\]|[^"\\])*"', String.Symbol),
+
+            # Documentation
+            (r'((?<=fn\()|(?<=fnx\()|(?<=method\()|(?<=macro\()|(?<=lecro\()'
+             r'|(?<=syntax\()|(?<=dmacro\()|(?<=dlecro\()|(?<=dlecrox\()'
+             r'|(?<=dsyntax\())(\s*)"', String.Doc, 'documentation'),
+
+            # Text
+            (r'"', String, 'text'),
+            (r'#\[', String, 'squareText'),
+
+            # Mimic
+            (r'\w[\w!:?]+(?=\s*=.*mimic\s)', Name.Entity),
+
+            # Assignment
+            (r'[a-zA-Z_][\w!:?]*(?=[\s]*[+*/-]?=[^=].*($|\.))',
+             Name.Variable),
+
+            # keywords
+            (r'(break|cond|continue|do|ensure|for|for:dict|for:set|if|let|'
+             r'loop|p:for|p:for:dict|p:for:set|return|unless|until|while|'
+             r'with)(?![\w!:?])', Keyword.Reserved),
+
+            # Origin
+            (r'(eval|mimic|print|println)(?![\w!:?])', Keyword),
+
+            # Base
+            (r'(cell\?|cellNames|cellOwner\?|cellOwner|cells|cell|'
+             r'documentation|hash|identity|mimic|removeCell\!|undefineCell\!)'
+             r'(?![\w!:?])', Keyword),
+
+            # Ground
+            (r'(stackTraceAsText)(?![\w!:?])', Keyword),
+
+            # DefaultBehaviour Literals
+            (r'(dict|list|message|set)(?![\w!:?])', Keyword.Reserved),
+
+            # DefaultBehaviour Case
+            (r'(case|case:and|case:else|case:nand|case:nor|case:not|case:or|'
+             r'case:otherwise|case:xor)(?![\w!:?])', Keyword.Reserved),
+
+            # DefaultBehaviour Reflection
+            (r'(asText|become\!|derive|freeze\!|frozen\?|in\?|is\?|kind\?|'
+             r'mimic\!|mimics|mimics\?|prependMimic\!|removeAllMimics\!|'
+             r'removeMimic\!|same\?|send|thaw\!|uniqueHexId)'
+             r'(?![\w!:?])', Keyword),
+
+            # DefaultBehaviour Aspects
+            (r'(after|around|before)(?![\w!:?])', Keyword.Reserved),
+
+            # DefaultBehaviour
+            (r'(kind|cellDescriptionDict|cellSummary|genSym|inspect|notice)'
+             r'(?![\w!:?])', Keyword),
+            (r'(use|destructuring)', Keyword.Reserved),
+
+            # DefaultBehavior BaseBehavior
+            (r'(cell\?|cellOwner\?|cellOwner|cellNames|cells|cell|'
+             r'documentation|identity|removeCell!|undefineCell)'
+             r'(?![\w!:?])', Keyword),
+
+            # DefaultBehavior Internal
+            (r'(internal:compositeRegexp|internal:concatenateText|'
+             r'internal:createDecimal|internal:createNumber|'
+             r'internal:createRegexp|internal:createText)'
+             r'(?![\w!:?])', Keyword.Reserved),
+
+            # DefaultBehaviour Conditions
+            (r'(availableRestarts|bind|error\!|findRestart|handle|'
+             r'invokeRestart|rescue|restart|signal\!|warn\!)'
+             r'(?![\w!:?])', Keyword.Reserved),
+
+            # constants
+            (r'(nil|false|true)(?![\w!:?])', Name.Constant),
+
+            # names
+            (r'(Arity|Base|Call|Condition|DateTime|Aspects|Pointcut|'
+             r'Assignment|BaseBehavior|Boolean|Case|AndCombiner|Else|'
+             r'NAndCombiner|NOrCombiner|NotCombiner|OrCombiner|XOrCombiner|'
+             r'Conditions|Definitions|FlowControl|Internal|Literals|'
+             r'Reflection|DefaultMacro|DefaultMethod|DefaultSyntax|Dict|'
+             r'FileSystem|Ground|Handler|Hook|IO|IokeGround|Struct|'
+             r'LexicalBlock|LexicalMacro|List|Message|Method|Mixins|'
+             r'NativeMethod|Number|Origin|Pair|Range|Reflector|Regexp Match|'
+             r'Regexp|Rescue|Restart|Runtime|Sequence|Set|Symbol|'
+             r'System|Text|Tuple)(?![\w!:?])', Name.Builtin),
+
+            # functions
+            ('(generateMatchMethod|aliasMethod|\u03bb|\u028E|fnx|fn|method|'
+             'dmacro|dlecro|syntax|macro|dlecrox|lecrox|lecro|syntax)'
+             '(?![\\w!:?])', Name.Function),
+
+            # Numbers
+            (r'-?0[xX][0-9a-fA-F]+', Number.Hex),
+            (r'-?(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'-?\d+', Number.Integer),
+
+            (r'#\(', Punctuation),
+
+            # Operators
+            (r'(&&>>|\|\|>>|\*\*>>|:::|::|\.\.\.|===|\*\*>|\*\*=|&&>|&&=|'
+             r'\|\|>|\|\|=|\->>|\+>>|!>>|<>>>|<>>|&>>|%>>|#>>|@>>|/>>|\*>>|'
+             r'\?>>|\|>>|\^>>|~>>|\$>>|=>>|<<=|>>=|<=>|<\->|=~|!~|=>|\+\+|'
+             r'\-\-|<=|>=|==|!=|&&|\.\.|\+=|\-=|\*=|\/=|%=|&=|\^=|\|=|<\-|'
+             r'\+>|!>|<>|&>|%>|#>|\@>|\/>|\*>|\?>|\|>|\^>|~>|\$>|<\->|\->|'
+             r'<<|>>|\*\*|\?\||\?&|\|\||>|<|\*|\/|%|\+|\-|&|\^|\||=|\$|!|~|'
+             r'\?|#|\u2260|\u2218|\u2208|\u2209)', Operator),
+            (r'(and|nand|or|xor|nor|return|import)(?![\w!?])',
+             Operator),
+
+            # Punctuation
+            (r'(\`\`|\`|\'\'|\'|\.|\,|@@|@|\[|\]|\(|\)|\{|\})', Punctuation),
+
+            # kinds
+            (r'[A-Z][\w!:?]*', Name.Class),
+
+            # default cellnames
+            (r'[a-z_][\w!:?]*', Name)
+        ]
+    }
+
+
+class ClojureLexer(RegexLexer):
+    """
+    Lexer for Clojure source code.
+    """
+    name = 'Clojure'
+    url = 'http://clojure.org/'
+    aliases = ['clojure', 'clj']
+    filenames = ['*.clj', '*.cljc']
+    mimetypes = ['text/x-clojure', 'application/x-clojure']
+    version_added = '0.11'
+
+    special_forms = (
+        '.', 'def', 'do', 'fn', 'if', 'let', 'new', 'quote', 'var', 'loop'
+    )
+
+    # It's safe to consider 'ns' a declaration thing because it defines a new
+    # namespace.
+    declarations = (
+        'def-', 'defn', 'defn-', 'defmacro', 'defmulti', 'defmethod',
+        'defstruct', 'defonce', 'declare', 'definline', 'definterface',
+        'defprotocol', 'defrecord', 'deftype', 'defproject', 'ns'
+    )
+
+    builtins = (
+        '*', '+', '-', '->', '/', '<', '<=', '=', '==', '>', '>=', '..',
+        'accessor', 'agent', 'agent-errors', 'aget', 'alength', 'all-ns',
+        'alter', 'and', 'append-child', 'apply', 'array-map', 'aset',
+        'aset-boolean', 'aset-byte', 'aset-char', 'aset-double', 'aset-float',
+        'aset-int', 'aset-long', 'aset-short', 'assert', 'assoc', 'await',
+        'await-for', 'bean', 'binding', 'bit-and', 'bit-not', 'bit-or',
+        'bit-shift-left', 'bit-shift-right', 'bit-xor', 'boolean', 'branch?',
+        'butlast', 'byte', 'cast', 'char', 'children', 'class',
+        'clear-agent-errors', 'comment', 'commute', 'comp', 'comparator',
+        'complement', 'concat', 'conj', 'cons', 'constantly', 'cond', 'if-not',
+        'construct-proxy', 'contains?', 'count', 'create-ns', 'create-struct',
+        'cycle', 'dec',  'deref', 'difference', 'disj', 'dissoc', 'distinct',
+        'doall', 'doc', 'dorun', 'doseq', 'dosync', 'dotimes', 'doto',
+        'double', 'down', 'drop', 'drop-while', 'edit', 'end?', 'ensure',
+        'eval', 'every?', 'false?', 'ffirst', 'file-seq', 'filter', 'find',
+        'find-doc', 'find-ns', 'find-var', 'first', 'float', 'flush', 'for',
+        'fnseq', 'frest', 'gensym', 'get-proxy-class', 'get',
+        'hash-map', 'hash-set', 'identical?', 'identity', 'if-let', 'import',
+        'in-ns', 'inc', 'index', 'insert-child', 'insert-left', 'insert-right',
+        'inspect-table', 'inspect-tree', 'instance?', 'int', 'interleave',
+        'intersection', 'into', 'into-array', 'iterate', 'join', 'key', 'keys',
+        'keyword', 'keyword?', 'last', 'lazy-cat', 'lazy-cons', 'left',
+        'lefts', 'line-seq', 'list*', 'list', 'load', 'load-file',
+        'locking', 'long', 'loop', 'macroexpand', 'macroexpand-1',
+        'make-array', 'make-node', 'map', 'map-invert', 'map?', 'mapcat',
+        'max', 'max-key', 'memfn', 'merge', 'merge-with', 'meta', 'min',
+        'min-key', 'name', 'namespace', 'neg?', 'new', 'newline', 'next',
+        'nil?', 'node', 'not', 'not-any?', 'not-every?', 'not=', 'ns-imports',
+        'ns-interns', 'ns-map', 'ns-name', 'ns-publics', 'ns-refers',
+        'ns-resolve', 'ns-unmap', 'nth', 'nthrest', 'or', 'parse', 'partial',
+        'path', 'peek', 'pop', 'pos?', 'pr', 'pr-str', 'print', 'print-str',
+        'println', 'println-str', 'prn', 'prn-str', 'project', 'proxy',
+        'proxy-mappings', 'quot', 'rand', 'rand-int', 'range', 're-find',
+        're-groups', 're-matcher', 're-matches', 're-pattern', 're-seq',
+        'read', 'read-line', 'reduce', 'ref', 'ref-set', 'refer', 'rem',
+        'remove', 'remove-method', 'remove-ns', 'rename', 'rename-keys',
+        'repeat', 'replace', 'replicate', 'resolve', 'rest', 'resultset-seq',
+        'reverse', 'rfirst', 'right', 'rights', 'root', 'rrest', 'rseq',
+        'second', 'select', 'select-keys', 'send', 'send-off', 'seq',
+        'seq-zip', 'seq?', 'set', 'short', 'slurp', 'some', 'sort',
+        'sort-by', 'sorted-map', 'sorted-map-by', 'sorted-set',
+        'special-symbol?', 'split-at', 'split-with', 'str', 'string?',
+        'struct', 'struct-map', 'subs', 'subvec', 'symbol', 'symbol?',
+        'sync', 'take', 'take-nth', 'take-while', 'test', 'time', 'to-array',
+        'to-array-2d', 'tree-seq', 'true?', 'union', 'up', 'update-proxy',
+        'val', 'vals', 'var-get', 'var-set', 'var?', 'vector', 'vector-zip',
+        'vector?', 'when', 'when-first', 'when-let', 'when-not',
+        'with-local-vars', 'with-meta', 'with-open', 'with-out-str',
+        'xml-seq', 'xml-zip', 'zero?', 'zipmap', 'zipper')
+
+    # valid names for identifiers
+    # well, names can only not consist fully of numbers
+    # but this should be good enough for now
+
+    # TODO / should divide keywords/symbols into namespace/rest
+    # but that's hard, so just pretend / is part of the name
+    valid_name = r'(?!#)[\w!$%*+<=>?/.#|-]+'
+
+    tokens = {
+        'root': [
+            # the comments - always starting with semicolon
+            # and going to the end of the line
+            (r';.*$', Comment.Single),
+
+            # whitespaces - usually not relevant
+            (r',+', Text),
+            (r'\s+', Whitespace),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+/\d+', Number),
+            (r'-?\d+', Number.Integer),
+            (r'0x-?[abcdef\d]+', Number.Hex),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r"'" + valid_name, String.Symbol),
+            (r"\\(.|[a-z]+)", String.Char),
+
+            # keywords
+            (r'::?#?' + valid_name, String.Symbol),
+
+            # special operators
+            (r'~@|[`\'#^~&@]', Operator),
+
+            # highlight the special forms
+            (words(special_forms, suffix=' '), Keyword),
+
+            # Technically, only the special forms are 'keywords'. The problem
+            # is that only treating them as keywords means that things like
+            # 'defn' and 'ns' need to be highlighted as builtins. This is ugly
+            # and weird for most styles. So, as a compromise we're going to
+            # highlight them as Keyword.Declarations.
+            (words(declarations, suffix=' '), Keyword.Declaration),
+
+            # highlight the builtins
+            (words(builtins, suffix=' '), Name.Builtin),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Function),
+
+            # find the remaining variables
+            (valid_name, Name.Variable),
+
+            # Clojure accepts vector notation
+            (r'(\[|\])', Punctuation),
+
+            # Clojure accepts map notation
+            (r'(\{|\})', Punctuation),
+
+            # the famous parentheses!
+            (r'(\(|\))', Punctuation),
+        ],
+    }
+
+
+class ClojureScriptLexer(ClojureLexer):
+    """
+    Lexer for ClojureScript source code.
+    """
+    name = 'ClojureScript'
+    url = 'http://clojure.org/clojurescript'
+    aliases = ['clojurescript', 'cljs']
+    filenames = ['*.cljs']
+    mimetypes = ['text/x-clojurescript', 'application/x-clojurescript']
+    version_added = '2.0'
+
+
+class TeaLangLexer(RegexLexer):
+    """
+    For Tea source code. Only used within a
+    TeaTemplateLexer.
+
+    .. versionadded:: 1.5
+    """
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w\.\[\]]*\s+)+?)'  # return arguments
+             r'([a-zA-Z_]\w*)'                       # method name
+             r'(\s*)(\()',                           # signature start
+             bygroups(using(this), Name.Function, Whitespace, Operator)),
+            (r'[^\S\n]+', Whitespace),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w\.]*', Name.Decorator),
+            (r'(and|break|else|foreach|if|in|not|or|reverse)\b',
+             Keyword),
+            (r'(as|call|define)\b', Keyword.Declaration),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(template)(\s+)', bygroups(Keyword.Declaration, Whitespace), 'template'),
+            (r'(import)(\s+)', bygroups(Keyword.Namespace, Whitespace), 'import'),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'(\.)([a-zA-Z_]\w*)', bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_\$]\w*', Name),
+            (r'(isa|[.]{3}|[.]{2}|[=#!<>+-/%&;,.\*\\\(\)\[\]\{\}])', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Whitespace)
+        ],
+        'template': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+    }
+
+
+class CeylonLexer(RegexLexer):
+    """
+    For Ceylon source code.
+    """
+
+    name = 'Ceylon'
+    url = 'http://ceylon-lang.org/'
+    aliases = ['ceylon']
+    filenames = ['*.ceylon']
+    mimetypes = ['text/x-ceylon']
+    version_added = '1.6'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+'
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)'  # return arguments
+             r'([a-zA-Z_]\w*)'                      # method name
+             r'(\s*)(\()',                          # signature start
+             bygroups(using(this), Name.Function, Whitespace, Operator)),
+            (r'[^\S\n]+', Whitespace),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'(shared|abstract|formal|default|actual|variable|deprecated|small|'
+             r'late|literal|doc|by|see|throws|optional|license|tagged|final|native|'
+             r'annotation|sealed)\b', Name.Decorator),
+            (r'(break|case|catch|continue|else|finally|for|in|'
+             r'if|return|switch|this|throw|try|while|is|exists|dynamic|'
+             r'nonempty|then|outer|assert|let)\b', Keyword),
+            (r'(abstracts|extends|satisfies|'
+             r'super|given|of|out|assign)\b', Keyword.Declaration),
+            (r'(function|value|void|new)\b',
+             Keyword.Type),
+            (r'(assembly|module|package)(\s+)', bygroups(Keyword.Namespace, Whitespace)),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(class|interface|object|alias)(\s+)',
+             bygroups(Keyword.Declaration, Whitespace), 'class'),
+            (r'(import)(\s+)', bygroups(Keyword.Namespace, Whitespace), 'import'),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r"'\\.'|'[^\\]'|'\\\{#[0-9a-fA-F]{4}\}'", String.Char),
+            (r'(\.)([a-z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'[~^*!%&\[\](){}<>|+=:;,./?-]', Operator),
+            (r'\d{1,3}(_\d{3})+\.\d{1,3}(_\d{3})+[kMGTPmunpf]?', Number.Float),
+            (r'\d{1,3}(_\d{3})+\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?',
+             Number.Float),
+            (r'[0-9][0-9]*\.\d{1,3}(_\d{3})+[kMGTPmunpf]?', Number.Float),
+            (r'[0-9][0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?',
+             Number.Float),
+            (r'#([0-9a-fA-F]{4})(_[0-9a-fA-F]{4})+', Number.Hex),
+            (r'#[0-9a-fA-F]+', Number.Hex),
+            (r'\$([01]{4})(_[01]{4})+', Number.Bin),
+            (r'\$[01]+', Number.Bin),
+            (r'\d{1,3}(_\d{3})+[kMGTP]?', Number.Integer),
+            (r'[0-9]+[kMGTP]?', Number.Integer),
+            (r'\n', Whitespace)
+        ],
+        'class': [
+            (r'[A-Za-z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[a-z][\w.]*',
+             Name.Namespace, '#pop')
+        ],
+        'comment': [
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+    }
+
+
+class KotlinLexer(RegexLexer):
+    """
+    For Kotlin source code.
+    """
+
+    name = 'Kotlin'
+    url = 'http://kotlinlang.org/'
+    aliases = ['kotlin']
+    filenames = ['*.kt', '*.kts']
+    mimetypes = ['text/x-kotlin']
+    version_added = '1.5'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    kt_name = ('@?[_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl') + ']' +
+               '[' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc', 'Cf',
+                                 'Mn', 'Mc') + ']*')
+
+    kt_space_name = ('@?[_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl') + ']' +
+               '[' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc', 'Cf',
+                                 'Mn', 'Mc', 'Zs')
+                + r'\'~!%^&*()+=|\[\]:;,.<>/\?-]*')
+
+    kt_id = '(' + kt_name + '|`' + kt_space_name + '`)'
+
+    modifiers = (r'actual|abstract|annotation|companion|const|crossinline|'
+                r'data|enum|expect|external|final|infix|inline|inner|'
+                r'internal|lateinit|noinline|open|operator|override|private|'
+                r'protected|public|sealed|suspend|tailrec|value')
+
+    tokens = {
+        'root': [
+            # Whitespaces
+            (r'[^\S\n]+', Whitespace),
+            (r'\s+', Whitespace),
+            (r'\\$', String.Escape),  # line continuation
+            (r'\n', Whitespace),
+            # Comments
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'^(#!/.+?)(\n)', bygroups(Comment.Single, Whitespace)),  # shebang for kotlin scripts
+            (r'/[*].*?[*]/', Comment.Multiline),
+            # Keywords
+            (r'as\?', Keyword),
+            (r'(as|break|by|catch|constructor|continue|do|dynamic|else|finally|'
+             r'get|for|if|init|[!]*in|[!]*is|out|reified|return|set|super|this|'
+             r'throw|try|typealias|typeof|vararg|when|where|while)\b', Keyword),
+            (r'it\b', Name.Builtin),
+            # Built-in types
+            (words(('Boolean?', 'Byte?', 'Char?', 'Double?', 'Float?',
+             'Int?', 'Long?', 'Short?', 'String?', 'Any?', 'Unit?')), Keyword.Type),
+            (words(('Boolean', 'Byte', 'Char', 'Double', 'Float',
+             'Int', 'Long', 'Short', 'String', 'Any', 'Unit'), suffix=r'\b'), Keyword.Type),
+            # Constants
+            (r'(true|false|null)\b', Keyword.Constant),
+            # Imports
+            (r'(package|import)(\s+)(\S+)', bygroups(Keyword, Whitespace, Name.Namespace)),
+            # Dot access
+            (r'(\?\.)((?:[^\W\d]|\$)[\w$]*)', bygroups(Operator, Name.Attribute)),
+            (r'(\.)((?:[^\W\d]|\$)[\w$]*)', bygroups(Punctuation, Name.Attribute)),
+            # Annotations
+            (r'@[^\W\d][\w.]*', Name.Decorator),
+            # Labels
+            (r'[^\W\d][\w.]+@', Name.Decorator),
+            # Object expression
+            (r'(object)(\s+)(:)(\s+)', bygroups(Keyword, Whitespace, Punctuation, Whitespace), 'class'),
+            # Types
+            (r'((?:(?:' + modifiers + r'|fun)\s+)*)(class|interface|object)(\s+)',
+             bygroups(using(this, state='modifiers'), Keyword.Declaration, Whitespace), 'class'),
+            # Variables
+            (r'(var|val)(\s+)(\()', bygroups(Keyword.Declaration, Whitespace, Punctuation),
+             'destructuring_assignment'),
+            (r'((?:(?:' + modifiers + r')\s+)*)(var|val)(\s+)',
+             bygroups(using(this, state='modifiers'), Keyword.Declaration, Whitespace), 'variable'),
+            # Functions
+            (r'((?:(?:' + modifiers + r')\s+)*)(fun)(\s+)',
+             bygroups(using(this, state='modifiers'), Keyword.Declaration, Whitespace), 'function'),
+            # Operators
+            (r'::|!!|\?[:.]', Operator),
+            (r'[~^*!%&\[\]<>|+=/?-]', Operator),
+            # Punctuation
+            (r'[{}();:.,]', Punctuation),
+            # Strings
+            (r'"""', String, 'multiline_string'),
+            (r'"', String, 'string'),
+            (r"'\\.'|'[^\\]'", String.Char),
+            # Numbers
+            (r"[0-9](\.[0-9]*)?([eE][+-][0-9]+)?[flFL]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+            # Identifiers
+            (r'' + kt_id + r'((\?[^.])?)', Name) # additionally handle nullable types
+        ],
+        'class': [
+            (kt_id, Name.Class, '#pop')
+        ],
+        'variable': [
+            (kt_id, Name.Variable, '#pop')
+        ],
+        'destructuring_assignment': [
+            (r',', Punctuation),
+            (r'\s+', Whitespace),
+            (kt_id, Name.Variable),
+            (r'(:)(\s+)(' + kt_id + ')', bygroups(Punctuation, Whitespace, Name)),
+            (r'<', Operator, 'generic'),
+            (r'\)', Punctuation, '#pop')
+        ],
+        'function': [
+            (r'<', Operator, 'generic'),
+            (r'' + kt_id + r'(\.)' + kt_id, bygroups(Name, Punctuation, Name.Function), '#pop'),
+            (kt_id, Name.Function, '#pop')
+        ],
+        'generic': [
+            (r'(>)(\s*)', bygroups(Operator, Whitespace), '#pop'),
+            (r':', Punctuation),
+            (r'(reified|out|in)\b', Keyword),
+            (r',', Punctuation),
+            (r'\s+', Whitespace),
+            (kt_id, Name)
+        ],
+        'modifiers': [
+            (r'\w+', Keyword.Declaration),
+            (r'\s+', Whitespace),
+            default('#pop')
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            include('string_common')
+        ],
+        'multiline_string': [
+            (r'"""', String, '#pop'),
+            (r'"', String),
+            include('string_common')
+        ],
+        'string_common': [
+            (r'\\\\', String),  # escaped backslash
+            (r'\\"', String),  # escaped quote
+            (r'\\', String),  # bare backslash
+            (r'\$\{', String.Interpol, 'interpolation'),
+            (r'(\$)(\w+)', bygroups(String.Interpol, Name)),
+            (r'[^\\"$]+', String)
+        ],
+        'interpolation': [
+            (r'"', String),
+            (r'\$\{', String.Interpol, 'interpolation'),
+            (r'\{', Punctuation, 'scope'),
+            (r'\}', String.Interpol, '#pop'),
+            include('root')
+        ],
+        'scope': [
+            (r'\{', Punctuation, 'scope'),
+            (r'\}', Punctuation, '#pop'),
+            include('root')
+        ]
+    }
+
+
+class XtendLexer(RegexLexer):
+    """
+    For Xtend source code.
+    """
+
+    name = 'Xtend'
+    url = 'https://www.eclipse.org/xtend/'
+    aliases = ['xtend']
+    filenames = ['*.xtend']
+    mimetypes = ['text/x-xtend']
+    version_added = '1.6'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)'  # return arguments
+             r'([a-zA-Z_$][\w$]*)'                  # method name
+             r'(\s*)(\()',                          # signature start
+             bygroups(using(this), Name.Function, Whitespace, Operator)),
+            (r'[^\S\n]+', Whitespace),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w.]*', Name.Decorator),
+            (r'(assert|break|case|catch|continue|default|do|else|finally|for|'
+             r'if|goto|instanceof|new|return|switch|this|throw|try|while|IF|'
+             r'ELSE|ELSEIF|ENDIF|FOR|ENDFOR|SEPARATOR|BEFORE|AFTER)\b',
+             Keyword),
+            (r'(def|abstract|const|enum|extends|final|implements|native|private|'
+             r'protected|public|static|strictfp|super|synchronized|throws|'
+             r'transient|volatile|val|var)\b', Keyword.Declaration),
+            (r'(boolean|byte|char|double|float|int|long|short|void)\b',
+             Keyword.Type),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Whitespace)),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(class|interface)(\s+)', bygroups(Keyword.Declaration, Whitespace),
+             'class'),
+            (r'(import)(\s+)', bygroups(Keyword.Namespace, Whitespace), 'import'),
+            (r"(''')", String, 'template'),
+            (r'(\u00BB)', String, 'template'),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'[~^*!%&\[\](){}<>\|+=:;,./?-]', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Whitespace)
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+        'template': [
+            (r"'''", String, '#pop'),
+            (r'\u00AB', String, '#pop'),
+            (r'.', String)
+        ],
+    }
+
+
+class PigLexer(RegexLexer):
+    """
+    For Pig Latin source code.
+    """
+
+    name = 'Pig'
+    url = 'https://pig.apache.org/'
+    aliases = ['pig']
+    filenames = ['*.pig']
+    mimetypes = ['text/x-pig']
+    version_added = '2.0'
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'--.*', Comment),
+            (r'/\*[\w\W]*?\*/', Comment.Multiline),
+            (r'\\$', String.Escape),
+            (r'\\', Text),
+            (r'\'(?:\\[ntbrf\\\']|\\u[0-9a-f]{4}|[^\'\\\n\r])*\'', String),
+            include('keywords'),
+            include('types'),
+            include('builtins'),
+            include('punct'),
+            include('operators'),
+            (r'[0-9]*\.[0-9]+(e[0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Whitespace),
+            (r'([a-z_]\w*)(\s*)(\()',
+             bygroups(Name.Function, Whitespace, Punctuation)),
+            (r'[()#:]', Text),
+            (r'[^(:#\'")\s]+', Text),
+            (r'\S+\s+', Text)   # TODO: make tests pass without \s+
+        ],
+        'keywords': [
+            (r'(assert|and|any|all|arrange|as|asc|bag|by|cache|CASE|cat|cd|cp|'
+             r'%declare|%default|define|dense|desc|describe|distinct|du|dump|'
+             r'eval|exex|explain|filter|flatten|foreach|full|generate|group|'
+             r'help|if|illustrate|import|inner|input|into|is|join|kill|left|'
+             r'limit|load|ls|map|matches|mkdir|mv|not|null|onschema|or|order|'
+             r'outer|output|parallel|pig|pwd|quit|register|returns|right|rm|'
+             r'rmf|rollup|run|sample|set|ship|split|stderr|stdin|stdout|store|'
+             r'stream|through|union|using|void)\b', Keyword)
+        ],
+        'builtins': [
+            (r'(AVG|BinStorage|cogroup|CONCAT|copyFromLocal|copyToLocal|COUNT|'
+             r'cross|DIFF|MAX|MIN|PigDump|PigStorage|SIZE|SUM|TextLoader|'
+             r'TOKENIZE)\b', Name.Builtin)
+        ],
+        'types': [
+            (r'(bytearray|BIGINTEGER|BIGDECIMAL|chararray|datetime|double|float|'
+             r'int|long|tuple)\b', Keyword.Type)
+        ],
+        'punct': [
+            (r'[;(){}\[\]]', Punctuation),
+        ],
+        'operators': [
+            (r'[#=,./%+\-?]', Operator),
+            (r'(eq|gt|lt|gte|lte|neq|matches)\b', Operator),
+            (r'(==|<=|<|>=|>|!=)', Operator),
+        ],
+    }
+
+
+class GoloLexer(RegexLexer):
+    """
+    For Golo source code.
+    """
+
+    name = 'Golo'
+    url = 'http://golo-lang.org/'
+    filenames = ['*.golo']
+    aliases = ['golo']
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Whitespace),
+
+            (r'#.*$', Comment),
+
+            (r'(\^|\.\.\.|:|\?:|->|==|!=|=|\+|\*|%|/|<=|<|>=|>|=|\.)',
+                Operator),
+            (r'(?<=[^-])(-)(?=[^-])', Operator),
+
+            (r'(?<=[^`])(is|isnt|and|or|not|oftype|in|orIfNull)\b', Operator.Word),
+            (r'[]{}|(),[]', Punctuation),
+
+            (r'(module|import)(\s+)',
+                bygroups(Keyword.Namespace, Whitespace),
+                'modname'),
+            (r'\b([a-zA-Z_][\w$.]*)(::)',  bygroups(Name.Namespace, Punctuation)),
+            (r'\b([a-zA-Z_][\w$]*(?:\.[a-zA-Z_][\w$]*)+)\b', Name.Namespace),
+
+            (r'(let|var)(\s+)',
+                bygroups(Keyword.Declaration, Whitespace),
+                'varname'),
+            (r'(struct)(\s+)',
+                bygroups(Keyword.Declaration, Whitespace),
+                'structname'),
+            (r'(function)(\s+)',
+                bygroups(Keyword.Declaration, Whitespace),
+                'funcname'),
+
+            (r'(null|true|false)\b', Keyword.Constant),
+            (r'(augment|pimp'
+             r'|if|else|case|match|return'
+             r'|case|when|then|otherwise'
+             r'|while|for|foreach'
+             r'|try|catch|finally|throw'
+             r'|local'
+             r'|continue|break)\b', Keyword),
+
+            (r'(map|array|list|set|vector|tuple)(\[)',
+                bygroups(Name.Builtin, Punctuation)),
+            (r'(print|println|readln|raise|fun'
+             r'|asInterfaceInstance)\b', Name.Builtin),
+            (r'(`?[a-zA-Z_][\w$]*)(\()',
+                bygroups(Name.Function, Punctuation)),
+
+            (r'-?[\d_]*\.[\d_]*([eE][+-]?\d[\d_]*)?F?', Number.Float),
+            (r'0[0-7]+j?', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'-?\d[\d_]*L', Number.Integer.Long),
+            (r'-?\d[\d_]*', Number.Integer),
+
+            (r'`?[a-zA-Z_][\w$]*', Name),
+            (r'@[a-zA-Z_][\w$.]*', Name.Decorator),
+
+            (r'"""', String, combined('stringescape', 'triplestring')),
+            (r'"', String, combined('stringescape', 'doublestring')),
+            (r"'", String, combined('stringescape', 'singlestring')),
+            (r'----((.|\n)*?)----', String.Doc)
+
+        ],
+
+        'funcname': [
+            (r'`?[a-zA-Z_][\w$]*', Name.Function, '#pop'),
+        ],
+        'modname': [
+            (r'[a-zA-Z_][\w$.]*\*?', Name.Namespace, '#pop')
+        ],
+        'structname': [
+            (r'`?[\w.]+\*?', Name.Class, '#pop')
+        ],
+        'varname': [
+            (r'`?[a-zA-Z_][\w$]*', Name.Variable, '#pop'),
+        ],
+        'string': [
+            (r'[^\\\'"\n]+', String),
+            (r'[\'"\\]', String)
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'triplestring': [
+            (r'"""', String, '#pop'),
+            include('string'),
+            (r'\n', String),
+        ],
+        'doublestring': [
+            (r'"', String.Double, '#pop'),
+            include('string'),
+        ],
+        'singlestring': [
+            (r"'", String, '#pop'),
+            include('string'),
+        ],
+        'operators': [
+            (r'[#=,./%+\-?]', Operator),
+            (r'(eq|gt|lt|gte|lte|neq|matches)\b', Operator),
+            (r'(==|<=|<|>=|>|!=)', Operator),
+        ],
+    }
+
+
+class JasminLexer(RegexLexer):
+    """
+    For Jasmin assembly code.
+    """
+
+    name = 'Jasmin'
+    url = 'http://jasmin.sourceforge.net/'
+    aliases = ['jasmin', 'jasminxt']
+    filenames = ['*.j']
+    version_added = '2.0'
+
+    _whitespace = r' \n\t\r'
+    _ws = rf'(?:[{_whitespace}]+)'
+    _separator = rf'{_whitespace}:='
+    _break = rf'(?=[{_separator}]|$)'
+    _name = rf'[^{_separator}]+'
+    _unqualified_name = rf'(?:[^{_separator}.;\[/]+)'
+
+    tokens = {
+        'default': [
+            (r'\n', Whitespace, '#pop'),
+            (r"'", String.Single, ('#pop', 'quote')),
+            (r'"', String.Double, 'string'),
+            (r'=', Punctuation),
+            (r':', Punctuation, 'label'),
+            (_ws, Whitespace),
+            (r';.*', Comment.Single),
+            (rf'(\$[-+])?0x-?[\da-fA-F]+{_break}', Number.Hex),
+            (rf'(\$[-+]|\+)?-?\d+{_break}', Number.Integer),
+            (r'-?(\d+\.\d*|\.\d+)([eE][-+]?\d+)?[fFdD]?'
+             rf'[\x00-\x08\x0b\x0c\x0e-\x1f]*{_break}', Number.Float),
+            (rf'\${_name}', Name.Variable),
+
+            # Directives
+            (rf'\.annotation{_break}', Keyword.Reserved, 'annotation'),
+            (r'(\.attribute|\.bytecode|\.debug|\.deprecated|\.enclosing|'
+             r'\.interface|\.line|\.signature|\.source|\.stack|\.var|abstract|'
+             r'annotation|bridge|class|default|enum|field|final|fpstrict|'
+             r'interface|native|private|protected|public|signature|static|'
+             rf'synchronized|synthetic|transient|varargs|volatile){_break}',
+             Keyword.Reserved),
+            (rf'\.catch{_break}', Keyword.Reserved, 'caught-exception'),
+            (r'(\.class|\.implements|\.inner|\.super|inner|invisible|'
+             rf'invisibleparam|outer|visible|visibleparam){_break}',
+             Keyword.Reserved, 'class/convert-dots'),
+            (rf'\.field{_break}', Keyword.Reserved,
+             ('descriptor/convert-dots', 'field')),
+            (rf'(\.end|\.limit|use){_break}', Keyword.Reserved,
+             'no-verification'),
+            (rf'\.method{_break}', Keyword.Reserved, 'method'),
+            (rf'\.set{_break}', Keyword.Reserved, 'var'),
+            (rf'\.throws{_break}', Keyword.Reserved, 'exception'),
+            (rf'(from|offset|to|using){_break}', Keyword.Reserved, 'label'),
+            (rf'is{_break}', Keyword.Reserved,
+             ('descriptor/convert-dots', 'var')),
+            (rf'(locals|stack){_break}', Keyword.Reserved, 'verification'),
+            (rf'method{_break}', Keyword.Reserved, 'enclosing-method'),
+
+            # Instructions
+            (words((
+                'aaload', 'aastore', 'aconst_null', 'aload', 'aload_0', 'aload_1', 'aload_2',
+                'aload_3', 'aload_w', 'areturn', 'arraylength', 'astore', 'astore_0', 'astore_1',
+                'astore_2', 'astore_3', 'astore_w', 'athrow', 'baload', 'bastore', 'bipush',
+                'breakpoint', 'caload', 'castore', 'd2f', 'd2i', 'd2l', 'dadd', 'daload', 'dastore',
+                'dcmpg', 'dcmpl', 'dconst_0', 'dconst_1', 'ddiv', 'dload', 'dload_0', 'dload_1',
+                'dload_2', 'dload_3', 'dload_w', 'dmul', 'dneg', 'drem', 'dreturn', 'dstore', 'dstore_0',
+                'dstore_1', 'dstore_2', 'dstore_3', 'dstore_w', 'dsub', 'dup', 'dup2', 'dup2_x1',
+                'dup2_x2', 'dup_x1', 'dup_x2', 'f2d', 'f2i', 'f2l', 'fadd', 'faload', 'fastore', 'fcmpg',
+                'fcmpl', 'fconst_0', 'fconst_1', 'fconst_2', 'fdiv', 'fload', 'fload_0', 'fload_1',
+                'fload_2', 'fload_3', 'fload_w', 'fmul', 'fneg', 'frem', 'freturn', 'fstore', 'fstore_0',
+                'fstore_1', 'fstore_2', 'fstore_3', 'fstore_w', 'fsub', 'i2b', 'i2c', 'i2d', 'i2f', 'i2l',
+                'i2s', 'iadd', 'iaload', 'iand', 'iastore', 'iconst_0', 'iconst_1', 'iconst_2',
+                'iconst_3', 'iconst_4', 'iconst_5', 'iconst_m1', 'idiv', 'iinc', 'iinc_w', 'iload',
+                'iload_0', 'iload_1', 'iload_2', 'iload_3', 'iload_w', 'imul', 'ineg', 'int2byte',
+                'int2char', 'int2short', 'ior', 'irem', 'ireturn', 'ishl', 'ishr', 'istore', 'istore_0',
+                'istore_1', 'istore_2', 'istore_3', 'istore_w', 'isub', 'iushr', 'ixor', 'l2d', 'l2f',
+                'l2i', 'ladd', 'laload', 'land', 'lastore', 'lcmp', 'lconst_0', 'lconst_1', 'ldc2_w',
+                'ldiv', 'lload', 'lload_0', 'lload_1', 'lload_2', 'lload_3', 'lload_w', 'lmul', 'lneg',
+                'lookupswitch', 'lor', 'lrem', 'lreturn', 'lshl', 'lshr', 'lstore', 'lstore_0',
+                'lstore_1', 'lstore_2', 'lstore_3', 'lstore_w', 'lsub', 'lushr', 'lxor',
+                'monitorenter', 'monitorexit', 'nop', 'pop', 'pop2', 'ret', 'ret_w', 'return', 'saload',
+                'sastore', 'sipush', 'swap'), suffix=_break), Keyword.Reserved),
+            (rf'(anewarray|checkcast|instanceof|ldc|ldc_w|new){_break}',
+             Keyword.Reserved, 'class/no-dots'),
+            (r'invoke(dynamic|interface|nonvirtual|special|'
+             rf'static|virtual){_break}', Keyword.Reserved,
+             'invocation'),
+            (rf'(getfield|putfield){_break}', Keyword.Reserved,
+             ('descriptor/no-dots', 'field')),
+            (rf'(getstatic|putstatic){_break}', Keyword.Reserved,
+             ('descriptor/no-dots', 'static')),
+            (words((
+                'goto', 'goto_w', 'if_acmpeq', 'if_acmpne', 'if_icmpeq',
+                'if_icmpge', 'if_icmpgt', 'if_icmple', 'if_icmplt', 'if_icmpne',
+                'ifeq', 'ifge', 'ifgt', 'ifle', 'iflt', 'ifne', 'ifnonnull',
+                'ifnull', 'jsr', 'jsr_w'), suffix=_break),
+             Keyword.Reserved, 'label'),
+            (rf'(multianewarray|newarray){_break}', Keyword.Reserved,
+             'descriptor/convert-dots'),
+            (rf'tableswitch{_break}', Keyword.Reserved, 'table')
+        ],
+        'quote': [
+            (r"'", String.Single, '#pop'),
+            (r'\\u[\da-fA-F]{4}', String.Escape),
+            (r"[^'\\]+", String.Single)
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'\\([nrtfb"\'\\]|u[\da-fA-F]{4}|[0-3]?[0-7]{1,2})',
+             String.Escape),
+            (r'[^"\\]+', String.Double)
+        ],
+        'root': [
+            (r'\n+', Whitespace),
+            (r"'", String.Single, 'quote'),
+            include('default'),
+            (rf'({_name})([ \t\r]*)(:)',
+             bygroups(Name.Label, Whitespace, Punctuation)),
+            (_name, String.Other)
+        ],
+        'annotation': [
+            (r'\n', Whitespace, ('#pop', 'annotation-body')),
+            (rf'default{_break}', Keyword.Reserved,
+             ('#pop', 'annotation-default')),
+            include('default')
+        ],
+        'annotation-body': [
+            (r'\n+', Whitespace),
+            (rf'\.end{_break}', Keyword.Reserved, '#pop'),
+            include('default'),
+            (_name, String.Other, ('annotation-items', 'descriptor/no-dots'))
+        ],
+        'annotation-default': [
+            (r'\n+', Whitespace),
+            (rf'\.end{_break}', Keyword.Reserved, '#pop'),
+            include('default'),
+            default(('annotation-items', 'descriptor/no-dots'))
+        ],
+        'annotation-items': [
+            (r"'", String.Single, 'quote'),
+            include('default'),
+            (_name, String.Other)
+        ],
+        'caught-exception': [
+            (rf'all{_break}', Keyword, '#pop'),
+            include('exception')
+        ],
+        'class/convert-dots': [
+            include('default'),
+            (rf'(L)((?:{_unqualified_name}[/.])*)({_name})(;)',
+             bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation),
+             '#pop'),
+            (rf'((?:{_unqualified_name}[/.])*)({_name})',
+             bygroups(Name.Namespace, Name.Class), '#pop')
+        ],
+        'class/no-dots': [
+            include('default'),
+            (r'\[+', Punctuation, ('#pop', 'descriptor/no-dots')),
+            (rf'(L)((?:{_unqualified_name}/)*)({_name})(;)',
+             bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation),
+             '#pop'),
+            (rf'((?:{_unqualified_name}/)*)({_name})',
+             bygroups(Name.Namespace, Name.Class), '#pop')
+        ],
+        'descriptor/convert-dots': [
+            include('default'),
+            (r'\[+', Punctuation),
+            (rf'(L)((?:{_unqualified_name}[/.])*)({_name}?)(;)',
+             bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation),
+             '#pop'),
+            (rf'[^{_separator}\[)L]+', Keyword.Type, '#pop'),
+            default('#pop')
+        ],
+        'descriptor/no-dots': [
+            include('default'),
+            (r'\[+', Punctuation),
+            (rf'(L)((?:{_unqualified_name}/)*)({_name})(;)',
+             bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation),
+             '#pop'),
+            (rf'[^{_separator}\[)L]+', Keyword.Type, '#pop'),
+            default('#pop')
+        ],
+        'descriptors/convert-dots': [
+            (r'\)', Punctuation, '#pop'),
+            default('descriptor/convert-dots')
+        ],
+        'enclosing-method': [
+            (_ws, Whitespace),
+            (rf'(?=[^{_separator}]*\()', Text, ('#pop', 'invocation')),
+            default(('#pop', 'class/convert-dots'))
+        ],
+        'exception': [
+            include('default'),
+            (rf'((?:{_unqualified_name}[/.])*)({_name})',
+             bygroups(Name.Namespace, Name.Exception), '#pop')
+        ],
+        'field': [
+            (rf'static{_break}', Keyword.Reserved, ('#pop', 'static')),
+            include('default'),
+            (rf'((?:{_unqualified_name}[/.](?=[^{_separator}]*[/.]))*)({_unqualified_name}[/.])?({_name})',
+             bygroups(Name.Namespace, Name.Class, Name.Variable.Instance),
+             '#pop')
+        ],
+        'invocation': [
+            include('default'),
+            (rf'((?:{_unqualified_name}[/.](?=[^{_separator}(]*[/.]))*)({_unqualified_name}[/.])?({_name})(\()',
+             bygroups(Name.Namespace, Name.Class, Name.Function, Punctuation),
+             ('#pop', 'descriptor/convert-dots', 'descriptors/convert-dots',
+              'descriptor/convert-dots'))
+        ],
+        'label': [
+            include('default'),
+            (_name, Name.Label, '#pop')
+        ],
+        'method': [
+            include('default'),
+            (rf'({_name})(\()', bygroups(Name.Function, Punctuation),
+             ('#pop', 'descriptor/convert-dots', 'descriptors/convert-dots',
+              'descriptor/convert-dots'))
+        ],
+        'no-verification': [
+            (rf'(locals|method|stack){_break}', Keyword.Reserved, '#pop'),
+            include('default')
+        ],
+        'static': [
+            include('default'),
+            (rf'((?:{_unqualified_name}[/.](?=[^{_separator}]*[/.]))*)({_unqualified_name}[/.])?({_name})',
+             bygroups(Name.Namespace, Name.Class, Name.Variable.Class), '#pop')
+        ],
+        'table': [
+            (r'\n+', Whitespace),
+            (rf'default{_break}', Keyword.Reserved, '#pop'),
+            include('default'),
+            (_name, Name.Label)
+        ],
+        'var': [
+            include('default'),
+            (_name, Name.Variable, '#pop')
+        ],
+        'verification': [
+            include('default'),
+            (rf'(Double|Float|Integer|Long|Null|Top|UninitializedThis){_break}', Keyword, '#pop'),
+            (rf'Object{_break}', Keyword, ('#pop', 'class/no-dots')),
+            (rf'Uninitialized{_break}', Keyword, ('#pop', 'label'))
+        ]
+    }
+
+    def analyse_text(text):
+        score = 0
+        if re.search(r'^\s*\.class\s', text, re.MULTILINE):
+            score += 0.5
+            if re.search(r'^\s*[a-z]+_[a-z]+\b', text, re.MULTILINE):
+                score += 0.3
+        if re.search(r'^\s*\.(attribute|bytecode|debug|deprecated|enclosing|'
+                     r'inner|interface|limit|set|signature|stack)\b', text,
+                     re.MULTILINE):
+            score += 0.6
+        return min(score, 1.0)
+
+
+class SarlLexer(RegexLexer):
+    """
+    For SARL source code.
+    """
+
+    name = 'SARL'
+    url = 'http://www.sarl.io'
+    aliases = ['sarl']
+    filenames = ['*.sarl']
+    mimetypes = ['text/x-sarl']
+    version_added = '2.4'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)'  # return arguments
+             r'([a-zA-Z_$][\w$]*)'                      # method name
+             r'(\s*)(\()',                             # signature start
+             bygroups(using(this), Name.Function, Whitespace, Operator)),
+            (r'[^\S\n]+', Whitespace),
+            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w.]*', Name.Decorator),
+            (r'(as|break|case|catch|default|do|else|extends|extension|finally|'
+             r'fires|for|if|implements|instanceof|new|on|requires|return|super|'
+             r'switch|throw|throws|try|typeof|uses|while|with)\b',
+             Keyword),
+            (r'(abstract|def|dispatch|final|native|override|private|protected|'
+             r'public|static|strictfp|synchronized|transient|val|var|volatile)\b',
+             Keyword.Declaration),
+            (r'(boolean|byte|char|double|float|int|long|short|void)\b',
+             Keyword.Type),
+            (r'(package)(\s+)', bygroups(Keyword.Namespace, Whitespace)),
+            (r'(false|it|null|occurrence|this|true|void)\b', Keyword.Constant),
+            (r'(agent|annotation|artifact|behavior|capacity|class|enum|event|'
+             r'interface|skill|space)(\s+)', bygroups(Keyword.Declaration, Whitespace),
+             'class'),
+            (r'(import)(\s+)', bygroups(Keyword.Namespace, Whitespace), 'import'),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'[~^*!%&\[\](){}<>\|+=:;,./?-]', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Whitespace)
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/kuin.py b/.venv/Lib/site-packages/pygments/lexers/kuin.py
new file mode 100644 (file)
index 0000000..686a1c7
--- /dev/null
@@ -0,0 +1,332 @@
+"""
+    pygments.lexers.kuin
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Kuin language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, using, this, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+        Number, Punctuation, Whitespace
+
+__all__ = ['KuinLexer']
+
+
+class KuinLexer(RegexLexer):
+    """
+    For Kuin source code.
+    """
+    name = 'Kuin'
+    url = 'https://github.com/kuina/Kuin'
+    aliases = ['kuin']
+    filenames = ['*.kn']
+    version_added = '2.9'
+
+    tokens = {
+        'root': [
+            include('statement'),
+        ],
+        'statement': [
+            # Whitespace / Comment
+            include('whitespace'),
+
+            # Block-statement
+            (r'(\+?)([ \t]*)(\*?)([ \t]*)(\bfunc)([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*)',
+             bygroups(Keyword,Whitespace, Keyword, Whitespace,  Keyword,
+                      using(this), Name.Function), 'func_'),
+            (r'\b(class)([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*)',
+             bygroups(Keyword, using(this), Name.Class), 'class_'),
+            (r'\b(enum)([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*)',
+             bygroups(Keyword, using(this), Name.Constant), 'enum_'),
+            (r'\b(block)\b(?:([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*))?',
+             bygroups(Keyword, using(this), Name.Other), 'block_'),
+            (r'\b(ifdef)\b(?:([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*))?',
+             bygroups(Keyword, using(this), Name.Other), 'ifdef_'),
+            (r'\b(if)\b(?:([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*))?',
+             bygroups(Keyword, using(this), Name.Other), 'if_'),
+            (r'\b(switch)\b(?:([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*))?',
+             bygroups(Keyword, using(this), Name.Other), 'switch_'),
+            (r'\b(while)\b(?:([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*))?',
+             bygroups(Keyword, using(this), Name.Other), 'while_'),
+            (r'\b(for)\b(?:([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*))?',
+             bygroups(Keyword, using(this), Name.Other), 'for_'),
+            (r'\b(foreach)\b(?:([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*))?',
+             bygroups(Keyword, using(this), Name.Other), 'foreach_'),
+            (r'\b(try)\b(?:([ \t]+(?:\n\s*\|)*[ \t]*)([a-zA-Z_][0-9a-zA-Z_]*))?',
+             bygroups(Keyword, using(this), Name.Other), 'try_'),
+
+            # Line-statement
+            (r'\b(do)\b', Keyword, 'do'),
+            (r'(\+?[ \t]*\bvar)\b', Keyword, 'var'),
+            (r'\b(const)\b', Keyword, 'const'),
+            (r'\b(ret)\b', Keyword, 'ret'),
+            (r'\b(throw)\b', Keyword, 'throw'),
+            (r'\b(alias)\b', Keyword, 'alias'),
+            (r'\b(assert)\b', Keyword, 'assert'),
+            (r'\|', Text, 'continued_line'),
+            (r'[ \t]*\n', Whitespace),
+        ],
+
+        # Whitespace / Comment
+        'whitespace': [
+            (r'^([ \t]*)(;.*)', bygroups(Comment.Single, Whitespace)),
+            (r'[ \t]+(?![; \t])', Whitespace),
+            (r'\{', Comment.Multiline, 'multiline_comment'),
+        ],
+        'multiline_comment': [
+            (r'\{', Comment.Multiline, 'multiline_comment'),
+            (r'(?:\s*;.*|[^{}\n]+)', Comment.Multiline),
+            (r'\n', Comment.Multiline),
+            (r'\}', Comment.Multiline, '#pop'),
+        ],
+
+        # Block-statement
+        'func_': [
+            include('expr'),
+            (r'\n', Whitespace, 'func'),
+        ],
+        'func': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(func)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            include('statement'),
+        ],
+        'class_': [
+            include('expr'),
+            (r'\n', Whitespace, 'class'),
+        ],
+        'class': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(class)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            include('statement'),
+        ],
+        'enum_': [
+            include('expr'),
+            (r'\n', Whitespace, 'enum'),
+        ],
+        'enum': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(enum)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            include('expr'),
+            (r'\n', Whitespace),
+        ],
+        'block_': [
+            include('expr'),
+            (r'\n', Whitespace, 'block'),
+        ],
+        'block': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(block)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            include('statement'),
+            include('break'),
+            include('skip'),
+        ],
+        'ifdef_': [
+            include('expr'),
+            (r'\n', Whitespace, 'ifdef'),
+        ],
+        'ifdef': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(ifdef)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            (words(('rls', 'dbg'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Constant, 'ifdef_sp'),
+            include('statement'),
+            include('break'),
+            include('skip'),
+        ],
+        'ifdef_sp': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'if_': [
+            include('expr'),
+            (r'\n', Whitespace, 'if'),
+        ],
+        'if': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(if)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            (words(('elif', 'else'), prefix=r'\b', suffix=r'\b'), Keyword, 'if_sp'),
+            include('statement'),
+            include('break'),
+            include('skip'),
+        ],
+        'if_sp': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'switch_': [
+            include('expr'),
+            (r'\n', Whitespace, 'switch'),
+        ],
+        'switch': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(switch)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            (words(('case', 'default', 'to'), prefix=r'\b', suffix=r'\b'),
+             Keyword, 'switch_sp'),
+            include('statement'),
+            include('break'),
+            include('skip'),
+        ],
+        'switch_sp': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'while_': [
+            include('expr'),
+            (r'\n', Whitespace, 'while'),
+        ],
+        'while': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(while)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            include('statement'),
+            include('break'),
+            include('skip'),
+        ],
+        'for_': [
+            include('expr'),
+            (r'\n', Whitespace, 'for'),
+        ],
+        'for': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(for)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            include('statement'),
+            include('break'),
+            include('skip'),
+        ],
+        'foreach_': [
+            include('expr'),
+            (r'\n', Whitespace, 'foreach'),
+        ],
+        'foreach': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(foreach)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            include('statement'),
+            include('break'),
+            include('skip'),
+        ],
+        'try_': [
+            include('expr'),
+            (r'\n', Whitespace, 'try'),
+        ],
+        'try': [
+            (r'\b(end)([ \t]+(?:\n\s*\|)*[ \t]*)(try)\b',
+             bygroups(Keyword, using(this), Keyword), '#pop:2'),
+            (words(('catch', 'finally', 'to'), prefix=r'\b', suffix=r'\b'),
+             Keyword, 'try_sp'),
+            include('statement'),
+            include('break'),
+            include('skip'),
+        ],
+        'try_sp': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+
+        # Line-statement
+        'break': [
+            (r'\b(break)\b([ \t]+)([a-zA-Z_][0-9a-zA-Z_]*)',
+             bygroups(Keyword, using(this), Name.Other)),
+        ],
+        'skip': [
+            (r'\b(skip)\b([ \t]+)([a-zA-Z_][0-9a-zA-Z_]*)',
+             bygroups(Keyword, using(this), Name.Other)),
+        ],
+        'alias': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'assert': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'const': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'do': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'ret': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'throw': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'var': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'continued_line': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+
+        'expr': [
+            # Whitespace / Comment
+            include('whitespace'),
+
+            # Punctuation
+            (r'\(', Punctuation,),
+            (r'\)', Punctuation,),
+            (r'\[', Punctuation,),
+            (r'\]', Punctuation,),
+            (r',', Punctuation),
+
+            # Keyword
+            (words((
+                'true', 'false', 'null', 'inf'
+                ), prefix=r'\b', suffix=r'\b'), Keyword.Constant),
+            (words((
+                'me'
+                ), prefix=r'\b', suffix=r'\b'), Keyword),
+            (words((
+                'bit16', 'bit32', 'bit64', 'bit8', 'bool',
+                'char', 'class', 'dict', 'enum', 'float', 'func',
+                'int', 'list', 'queue', 'stack'
+                ), prefix=r'\b', suffix=r'\b'), Keyword.Type),
+
+            # Number
+            (r'\b[0-9]\.[0-9]+(?!\.)(:?e[\+-][0-9]+)?\b', Number.Float),
+            (r'\b2#[01]+(?:b(?:8|16|32|64))?\b', Number.Bin),
+            (r'\b8#[0-7]+(?:b(?:8|16|32|64))?\b', Number.Oct),
+            (r'\b16#[0-9A-F]+(?:b(?:8|16|32|64))?\b', Number.Hex),
+            (r'\b[0-9]+(?:b(?:8|16|32|64))?\b', Number.Decimal),
+
+            # String / Char
+            (r'"', String.Double, 'string'),
+            (r"'(?:\\.|.)+?'", String.Char),
+
+            # Operator
+            (r'(?:\.|\$(?:>|<)?)', Operator),
+            (r'(?:\^)', Operator),
+            (r'(?:\+|-|!|##?)', Operator),
+            (r'(?:\*|/|%)', Operator),
+            (r'(?:~)', Operator),
+            (r'(?:(?:=|<>)(?:&|\$)?|<=?|>=?)', Operator),
+            (r'(?:&)', Operator),
+            (r'(?:\|)', Operator),
+            (r'(?:\?)', Operator),
+            (r'(?::(?::|\+|-|\*|/|%|\^|~)?)', Operator),
+
+            # Identifier
+            (r"\b([a-zA-Z_][0-9a-zA-Z_]*)(?=@)\b", Name),
+            (r"(@)?\b([a-zA-Z_][0-9a-zA-Z_]*)\b",
+             bygroups(Name.Other, Name.Variable)),
+        ],
+
+        # String
+        'string': [
+            (r'(?:\\[^{\n]|[^"\\])+', String.Double),
+            (r'\\\{', String.Double, 'toStrInString'),
+            (r'"', String.Double, '#pop'),
+        ],
+        'toStrInString': [
+            include('expr'),
+            (r'\}', String.Double, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/kusto.py b/.venv/Lib/site-packages/pygments/lexers/kusto.py
new file mode 100644 (file)
index 0000000..ce32d5e
--- /dev/null
@@ -0,0 +1,93 @@
+"""
+    pygments.lexers.kusto
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Kusto Query Language (KQL).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import (Comment, Keyword, Name, Number, Punctuation,
+                            String, Whitespace)
+
+__all__ = ["KustoLexer"]
+
+# Although these all seem to be keywords
+# https://github.com/microsoft/Kusto-Query-Language/blob/master/src/Kusto.Language/Syntax/SyntaxFacts.cs
+# it appears that only the ones with tags here
+# https://github.com/microsoft/Kusto-Query-Language/blob/master/src/Kusto.Language/Parser/QueryGrammar.cs
+# are highlighted in the Azure portal log query editor.
+KUSTO_KEYWORDS = [
+    'and', 'as', 'between', 'by', 'consume', 'contains', 'containscs', 'count',
+    'distinct', 'evaluate', 'extend', 'facet', 'filter', 'find', 'fork',
+    'getschema', 'has', 'invoke', 'join', 'limit', 'lookup', 'make-series',
+    'matches regex', 'mv-apply', 'mv-expand', 'notcontains', 'notcontainscs',
+    '!contains', '!has', '!startswith', 'on', 'or', 'order', 'parse', 'parse-where',
+    'parse-kv', 'partition', 'print', 'project', 'project-away', 'project-keep',
+    'project-rename', 'project-reorder', 'range', 'reduce', 'regex', 'render',
+    'sample', 'sample-distinct', 'scan', 'search', 'serialize', 'sort', 'startswith',
+    'summarize', 'take', 'top', 'top-hitters', 'top-nested', 'typeof', 'union',
+    'where', 'bool', 'date', 'datetime', 'int', 'long', 'real', 'string', 'time'
+]
+
+# From
+# https://github.com/microsoft/Kusto-Query-Language/blob/master/src/Kusto.Language/Syntax/SyntaxFacts.cs
+KUSTO_PUNCTUATION = [
+    "(", ")", "[", "]", "{", "}", "|", "<|", "+", "-", "*", "/",
+    "%", ".." "!", "<", "<=", ">", ">=", "=", "==", "!=", "<>",
+    ":", ";", ",", "=~", "!~", "?", "=>",
+]
+
+
+class KustoLexer(RegexLexer):
+    """For Kusto Query Language source code.
+    """
+
+    name = "Kusto"
+    aliases = ["kql", "kusto"]
+    filenames = ["*.kql", "*.kusto", ".csl"]
+    url = "https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query"
+    version_added = '2.17'
+
+    tokens = {
+        "root": [
+            (r"\s+", Whitespace),
+            (words(KUSTO_KEYWORDS, suffix=r"\b"), Keyword),
+            (r"//.*", Comment),
+            (words(KUSTO_PUNCTUATION), Punctuation),
+            (r"[^\W\d]\w*", Name),
+            # Numbers can take the form 1, .1, 1., 1.1, 1.1111, etc.
+            (r"\d+[.]\d*|[.]\d+", Number.Float),
+            (r"\d+", Number.Integer),
+            (r"'", String, "single_string"),
+            (r'"', String, "double_string"),
+            (r"@'", String, "single_verbatim"),
+            (r'@"', String, "double_verbatim"),
+            (r"```", String, "multi_string"),
+        ],
+        "single_string": [
+            (r"'", String, "#pop"),
+            (r"\\.", String.Escape),
+            (r"[^'\\]+", String),
+        ],
+        "double_string": [
+            (r'"', String, "#pop"),
+            (r"\\.", String.Escape),
+            (r'[^"\\]+', String),
+        ],
+        "single_verbatim": [
+            (r"'", String, "#pop"),
+            (r"[^']+", String),
+        ],
+        "double_verbatim": [
+            (r'"', String, "#pop"),
+            (r'[^"]+', String),
+        ],
+        "multi_string": [
+            (r"[^`]+", String),
+            (r"```", String, "#pop"),
+            (r"`", String),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/ldap.py b/.venv/Lib/site-packages/pygments/lexers/ldap.py
new file mode 100644 (file)
index 0000000..65473da
--- /dev/null
@@ -0,0 +1,155 @@
+"""
+    pygments.lexers.ldap
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexers for LDAP.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+
+from pygments.lexer import RegexLexer, bygroups, default
+from pygments.token import Operator, Comment, Keyword, Literal, Name, String, \
+    Number, Punctuation, Whitespace, Escape
+
+__all__ = ['LdifLexer', 'LdaprcLexer']
+
+
+class LdifLexer(RegexLexer):
+
+    """
+    Lexer for LDIF
+    """
+
+    name = 'LDIF'
+    aliases = ['ldif']
+    filenames = ['*.ldif']
+    mimetypes = ["text/x-ldif"]
+    url = "https://datatracker.ietf.org/doc/html/rfc2849"
+    version_added = '2.17'
+
+    tokens = {
+        'root': [
+            (r'\s*\n', Whitespace),
+            (r'(-)(\n)', bygroups(Punctuation, Whitespace)),
+            (r'(#.*)(\n)', bygroups(Comment.Single, Whitespace)),
+            (r'(version)(:)([ \t]*)(.*)([ \t]*\n)', bygroups(Keyword,
+             Punctuation, Whitespace, Number.Integer, Whitespace)),
+            (r'(control)(:)([ \t]*)([\.0-9]+)([ \t]+)((?:true|false)?)([ \t]*)',
+                bygroups(Keyword, Punctuation, Whitespace, Name.Other, Whitespace, Keyword, Whitespace), "after-control"),
+            (r'(deleteoldrdn)(:)([ \n]*)([0-1]+)([ \t]*\n)',
+             bygroups(Keyword, Punctuation, Whitespace, Number, Whitespace)),
+            (r'(add|delete|replace)(::?)(\s*)(.*)([ \t]*\n)', bygroups(
+                Keyword, Punctuation, Whitespace, Name.Attribute, Whitespace)),
+            (r'(changetype)(:)([ \t]*)([a-z]*)([ \t]*\n)',
+             bygroups(Keyword, Punctuation, Whitespace, Keyword, Whitespace)),
+            (r'(dn|newrdn)(::)', bygroups(Keyword, Punctuation), "base64-dn"),
+            (r'(dn|newrdn)(:)', bygroups(Keyword, Punctuation), "dn"),
+            (r'(objectclass)(:)([ \t]*)([^ \t\n]*)([ \t]*\n)', bygroups(
+                Keyword, Punctuation, Whitespace, Name.Class, Whitespace)),
+            (r'([a-zA-Z]*|[0-9][0-9\.]*[0-9])(;)',
+             bygroups(Name.Attribute, Punctuation), "property"),
+            (r'([a-zA-Z]*|[0-9][0-9\.]*[0-9])(:<)',
+             bygroups(Name.Attribute, Punctuation), "url"),
+            (r'([a-zA-Z]*|[0-9][0-9\.]*[0-9])(::?)',
+             bygroups(Name.Attribute, Punctuation), "value"),
+        ],
+        "after-control": [
+            (r":<", Punctuation, ("#pop", "url")),
+            (r"::?", Punctuation, ("#pop", "value")),
+            default("#pop"),
+        ],
+        'property': [
+            (r'([-a-zA-Z0-9]*)(;)', bygroups(Name.Property, Punctuation)),
+            (r'([-a-zA-Z0-9]*)(:<)',
+             bygroups(Name.Property, Punctuation), ("#pop", "url")),
+            (r'([-a-zA-Z0-9]*)(::?)',
+             bygroups(Name.Property, Punctuation), ("#pop", "value")),
+        ],
+        'value': [
+            (r'(\s*)([^\n]+\S)(\n )',
+             bygroups(Whitespace, String, Whitespace)),
+            (r'(\s*)([^\n]+\S)(\n)',
+             bygroups(Whitespace, String, Whitespace), "#pop"),
+        ],
+        'url': [
+            (r'([ \t]*)(\S*)([ \t]*\n )',
+             bygroups(Whitespace, Comment.PreprocFile, Whitespace)),
+            (r'([ \t]*)(\S*)([ \t]*\n)', bygroups(Whitespace,
+             Comment.PreprocFile, Whitespace), "#pop"),
+        ],
+        "dn": [
+            (r'([ \t]*)([-a-zA-Z0-9\.]+)(=)', bygroups(Whitespace,
+             Name.Attribute, Operator), ("#pop", "dn-value")),
+        ],
+        "dn-value": [
+            (r'\\[^\n]', Escape),
+            (r',', Punctuation, ("#pop", "dn")),
+            (r'\+', Operator, ("#pop", "dn")),
+            (r'[^,\+\n]+', String),
+            (r'\n ', Whitespace),
+            (r'\n', Whitespace, "#pop"),
+        ],
+        "base64-dn": [
+            (r'([ \t]*)([^ \t\n][^ \t\n]*[^\n])([ \t]*\n )',
+             bygroups(Whitespace, Name, Whitespace)),
+            (r'([ \t]*)([^ \t\n][^ \t\n]*[^\n])([ \t]*\n)',
+             bygroups(Whitespace, Name, Whitespace), "#pop"),
+        ]
+    }
+
+
+class LdaprcLexer(RegexLexer):
+    """
+    Lexer for OpenLDAP configuration files.
+    """
+
+    name = 'LDAP configuration file'
+    aliases = ['ldapconf', 'ldaprc']
+    filenames = ['.ldaprc', 'ldaprc', 'ldap.conf']
+    mimetypes = ["text/x-ldapconf"]
+    url = 'https://www.openldap.org/software//man.cgi?query=ldap.conf&sektion=5&apropos=0&manpath=OpenLDAP+2.4-Release'
+    version_added = '2.17'
+
+    _sasl_keywords = r'SASL_(?:MECH|REALM|AUTHCID|AUTHZID|CBINDING)'
+    _tls_keywords = r'TLS_(?:CACERT|CACERTDIR|CERT|ECNAME|KEY|CIPHER_SUITE|PROTOCOL_MIN|RANDFILE|CRLFILE)'
+    _literal_keywords = rf'(?:URI|SOCKET_BIND_ADDRESSES|{_sasl_keywords}|{_tls_keywords})'
+    _boolean_keywords = r'GSSAPI_(?:ALLOW_REMOTE_PRINCIPAL|ENCRYPT|SIGN)|REFERRALS|SASL_NOCANON'
+    _integer_keywords = r'KEEPALIVE_(?:IDLE|PROBES|INTERVAL)|NETWORK_TIMEOUT|PORT|SIZELIMIT|TIMELIMIT|TIMEOUT'
+    _secprops = r'none|noanonymous|noplain|noactive|nodict|forwardsec|passcred|(?:minssf|maxssf|maxbufsize)=\d+'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'#.*', Comment.Single),
+            (r'\s+', Whitespace),
+            (rf'({_boolean_keywords})(\s+)(on|true|yes|off|false|no)$',
+             bygroups(Keyword, Whitespace, Keyword.Constant)),
+            (rf'({_integer_keywords})(\s+)(\d+)',
+             bygroups(Keyword, Whitespace, Number.Integer)),
+            (r'(VERSION)(\s+)(2|3)', bygroups(Keyword, Whitespace, Number.Integer)),
+            # Constants
+            (r'(DEREF)(\s+)(never|searching|finding|always)',
+             bygroups(Keyword, Whitespace, Keyword.Constant)),
+            (rf'(SASL_SECPROPS)(\s+)((?:{_secprops})(?:,{_secprops})*)',
+             bygroups(Keyword, Whitespace, Keyword.Constant)),
+            (r'(SASL_CBINDING)(\s+)(none|tls-unique|tls-endpoint)',
+             bygroups(Keyword, Whitespace, Keyword.Constant)),
+            (r'(TLS_REQ(?:CERT|SAN))(\s+)(allow|demand|hard|never|try)',
+             bygroups(Keyword, Whitespace, Keyword.Constant)),
+            (r'(TLS_CRLCHECK)(\s+)(none|peer|all)',
+             bygroups(Keyword, Whitespace, Keyword.Constant)),
+            # Literals
+            (r'(BASE|BINDDN)(\s+)(\S+)$',
+             bygroups(Keyword, Whitespace, Literal)),
+            # Accepts hostname with or without port.
+            (r'(HOST)(\s+)([a-z0-9]+)((?::(\d+))?)',
+             bygroups(Keyword, Whitespace, Literal, Number.Integer)),
+            (rf'({_literal_keywords})(\s+)(\S+)$',
+             bygroups(Keyword, Whitespace, Literal)),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/lean.py b/.venv/Lib/site-packages/pygments/lexers/lean.py
new file mode 100644 (file)
index 0000000..76af11f
--- /dev/null
@@ -0,0 +1,241 @@
+"""
+    pygments.lexers.lean
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Lean theorem prover.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, words, include
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Generic, Whitespace
+
+__all__ = ['Lean3Lexer', 'Lean4Lexer']
+
+class Lean3Lexer(RegexLexer):
+    """
+    For the Lean 3 theorem prover.
+    """
+    name = 'Lean'
+    url = 'https://leanprover-community.github.io/lean3'
+    aliases = ['lean', 'lean3']
+    filenames = ['*.lean']
+    mimetypes = ['text/x-lean', 'text/x-lean3']
+    version_added = '2.0'
+
+    # from https://github.com/leanprover/vscode-lean/blob/1589ca3a65e394b3789409707febbd2d166c9344/syntaxes/lean.json#L186C20-L186C217
+    _name_segment = (
+        "(?![λΠΣ])[_a-zA-Zα-ωΑ-Ωϊ-ϻἀ-῾℀-⅏𝒜-𝖟]"
+        "(?:(?![λΠΣ])[_a-zA-Zα-ωΑ-Ωϊ-ϻἀ-῾℀-⅏𝒜-𝖟0-9'ⁿ-₉ₐ-ₜᵢ-ᵪ])*")
+    _name = _name_segment + r"(\." + _name_segment + r")*"
+
+    tokens = {
+        'expression': [
+            (r'\s+', Whitespace),
+            (r'/--', String.Doc, 'docstring'),
+            (r'/-', Comment, 'comment'),
+            (r'--.*?$', Comment.Single),
+            (words((
+                    'forall', 'fun', 'Pi', 'from', 'have', 'show', 'assume', 'suffices',
+                    'let', 'if', 'else', 'then', 'in', 'with', 'calc', 'match',
+                    'do'
+                ), prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(('sorry', 'admit'), prefix=r'\b', suffix=r'\b'), Generic.Error),
+            (words(('Sort', 'Prop', 'Type'), prefix=r'\b', suffix=r'\b'), Keyword.Type),
+            (words((
+                '(', ')', ':', '{', '}', '[', ']', '⟨', '⟩', '‹', '›', '⦃', '⦄', ':=', ',',
+            )), Operator),
+            (_name, Name),
+            (r'``?' + _name, String.Symbol),
+            (r'0x[A-Za-z0-9]+', Number.Integer),
+            (r'0b[01]+', Number.Integer),
+            (r'\d+', Number.Integer),
+            (r'"', String.Double, 'string'),
+            (r"'(?:(\\[\\\"'nt])|(\\x[0-9a-fA-F]{2})|(\\u[0-9a-fA-F]{4})|.)'", String.Char),
+            (r'[~?][a-z][\w\']*:', Name.Variable),
+            (r'\S', Name.Builtin.Pseudo),
+        ],
+        'root': [
+            (words((
+                'import', 'renaming', 'hiding',
+                'namespace',
+                'local',
+                'private', 'protected', 'section',
+                'include', 'omit', 'section',
+                'protected', 'export',
+                'open',
+                'attribute',
+            ), prefix=r'\b', suffix=r'\b'), Keyword.Namespace),
+            (words((
+                'lemma', 'theorem', 'def', 'definition', 'example',
+                'axiom', 'axioms', 'constant', 'constants',
+                'universe', 'universes',
+                'inductive', 'coinductive', 'structure', 'extends',
+                'class', 'instance',
+                'abbreviation',
+
+                'noncomputable theory',
+
+                'noncomputable', 'mutual', 'meta',
+
+                'attribute',
+
+                'parameter', 'parameters',
+                'variable', 'variables',
+
+                'reserve', 'precedence',
+                'postfix', 'prefix', 'notation', 'infix', 'infixl', 'infixr',
+
+                'begin', 'by', 'end',
+
+                'set_option',
+                'run_cmd',
+            ), prefix=r'\b', suffix=r'\b'), Keyword.Declaration),
+            (r'@\[', Keyword.Declaration, 'attribute'),
+            (words((
+                '#eval', '#check', '#reduce', '#exit',
+                '#print', '#help',
+            ), suffix=r'\b'), Keyword),
+            include('expression')
+        ],
+        'attribute': [
+            (r'\]', Keyword.Declaration, '#pop'),
+            include('expression'),
+        ],
+        'comment': [
+            (r'[^/-]+', Comment.Multiline),
+            (r'/-', Comment.Multiline, '#push'),
+            (r'-/', Comment.Multiline, '#pop'),
+            (r'[/-]', Comment.Multiline)
+        ],
+        'docstring': [
+            (r'[^/-]+', String.Doc),
+            (r'-/', String.Doc, '#pop'),
+            (r'[/-]', String.Doc)
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            (r"(?:(\\[\\\"'nt])|(\\x[0-9a-fA-F]{2})|(\\u[0-9a-fA-F]{4}))", String.Escape),
+            ('"', String.Double, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if re.search(r'^import [a-z]', text, re.MULTILINE):
+            return 0.1
+
+
+LeanLexer = Lean3Lexer
+
+
+class Lean4Lexer(RegexLexer):
+    """
+    For the Lean 4 theorem prover.
+    """
+    
+    name = 'Lean4'
+    url = 'https://github.com/leanprover/lean4'
+    aliases = ['lean4']
+    filenames = ['*.lean']
+    mimetypes = ['text/x-lean4']
+    version_added = '2.18'
+
+    # same as Lean3Lexer, with `!` and `?` allowed
+    _name_segment = (
+        "(?![λΠΣ])[_a-zA-Zα-ωΑ-Ωϊ-ϻἀ-῾℀-⅏𝒜-𝖟]"
+        "(?:(?![λΠΣ])[_a-zA-Zα-ωΑ-Ωϊ-ϻἀ-῾℀-⅏𝒜-𝖟0-9'ⁿ-₉ₐ-ₜᵢ-ᵪ!?])*")
+    _name = _name_segment + r"(\." + _name_segment + r")*"
+
+    keywords1 = (
+        'import', 'unif_hint',
+        'renaming', 'inline', 'hiding', 'lemma', 'variable',
+        'theorem', 'axiom', 'inductive', 'structure', 'universe', 'alias',
+        '#help',  'precedence', 'postfix', 'prefix',
+        'infix', 'infixl', 'infixr', 'notation', '#eval',
+        '#check', '#reduce', '#exit', 'end', 'private', 'using', 'namespace',
+        'instance', 'section', 'protected',
+        'export', 'set_option', 'extends', 'open', 'example',
+        '#print', 'opaque',
+        'def', 'macro', 'elab', 'syntax', 'macro_rules', '#reduce', 'where',
+        'abbrev', 'noncomputable', 'class', 'attribute', '#synth', 'mutual',
+        'scoped', 'local',
+    )
+
+    keywords2 = (
+        'forall', 'fun', 'obtain', 'from', 'have', 'show', 'assume',
+        'let', 'if', 'else', 'then', 'by', 'in', 'with',
+        'calc', 'match', 'nomatch', 'do', 'at',
+    )
+
+    keywords3 = (
+        # Sorts
+        'Type', 'Prop', 'Sort',
+    )
+
+    operators = (
+        '!=', '#', '&', '&&', '*', '+', '-', '/', '@', '!',
+        '-.', '->', '.', '..', '...', '::', ':>', ';', ';;', '<',
+        '<-', '=', '==', '>', '_', '|', '||', '~', '=>', '<=', '>=',
+        '/\\', '\\/', '∀', 'Π', 'λ', '↔', '∧', '∨', '≠', '≤', '≥',
+        '¬', '⁻¹', '⬝', '▸', '→', '∃', '≈', '×', '⌞',
+        '⌟', '≡', '⟨', '⟩', "↦",
+    )
+
+    punctuation = ('(', ')', ':', '{', '}', '[', ']', '⦃', '⦄',
+                   ':=', ',')
+
+    tokens = {
+        'expression': [
+            (r'\s+', Whitespace),
+            (r'/--', String.Doc, 'docstring'),
+            (r'/-', Comment, 'comment'),
+            (r'--.*$', Comment.Single),
+            (words(keywords3, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+            (words(('sorry', 'admit'), prefix=r'\b', suffix=r'\b'), Generic.Error),
+            (words(operators), Name.Builtin.Pseudo),
+            (words(punctuation), Operator),
+            (_name_segment, Name),
+            (r'``?' + _name, String.Symbol),
+            (r'(?<=\.)\d+', Number),
+            (r'(\d+\.\d*)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'"', String.Double, 'string'),
+            (r'[~?][a-z][\w\']*:', Name.Variable),
+            (r'\S', Name.Builtin.Pseudo),
+        ],
+        'root': [
+            (words(keywords1, prefix=r'\b', suffix=r'\b'), Keyword.Namespace),
+            (words(keywords2, prefix=r'\b', suffix=r'\b'), Keyword),
+            (r'@\[', Keyword.Declaration, 'attribute'),
+            include('expression')
+        ],
+        'attribute': [
+            (r'\]', Keyword.Declaration, '#pop'),
+            include('expression'),
+        ],
+        'comment': [
+            # Multiline Comments
+            (r'[^/-]+', Comment.Multiline),
+            (r'/-', Comment.Multiline, '#push'),
+            (r'-/', Comment.Multiline, '#pop'),
+            (r'[/-]', Comment.Multiline)
+        ],
+        'docstring': [
+            (r'[^/-]+', String.Doc),
+            (r'-/', String.Doc, '#pop'),
+            (r'[/-]', String.Doc)
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            (r'\\[n"\\\n]', String.Escape),
+            ('"', String.Double, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if re.search(r'^import [A-Z]', text, re.MULTILINE):
+            return 0.1
diff --git a/.venv/Lib/site-packages/pygments/lexers/lilypond.py b/.venv/Lib/site-packages/pygments/lexers/lilypond.py
new file mode 100644 (file)
index 0000000..03c34ae
--- /dev/null
@@ -0,0 +1,225 @@
+"""
+    pygments.lexers.lilypond
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for LilyPond.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import bygroups, default, inherit, words
+from pygments.lexers.lisp import SchemeLexer
+from pygments.lexers._lilypond_builtins import (
+    keywords, pitch_language_names, clefs, scales, repeat_types, units,
+    chord_modifiers, pitches, music_functions, dynamics, articulations,
+    music_commands, markup_commands, grobs, translators, contexts,
+    context_properties, grob_properties, scheme_functions, paper_variables,
+    header_variables
+)
+from pygments.token import Token
+
+__all__ = ["LilyPondLexer"]
+
+# In LilyPond, (unquoted) name tokens only contain letters, hyphens,
+# and underscores, where hyphens and underscores must not start or end
+# a name token.
+#
+# Note that many of the entities listed as LilyPond built-in keywords
+# (in file `_lilypond_builtins.py`) are only valid if surrounded by
+# double quotes, for example, 'hufnagel-fa1'. This means that
+# `NAME_END_RE` doesn't apply to such entities in valid LilyPond code.
+NAME_END_RE = r"(?=\d|[^\w\-]|[\-_][\W\d])"
+
+def builtin_words(names, backslash, suffix=NAME_END_RE):
+    prefix = r"[\-_^]?"
+    if backslash == "mandatory":
+        prefix += r"\\"
+    elif backslash == "optional":
+        prefix += r"\\?"
+    else:
+        assert backslash == "disallowed"
+    return words(names, prefix, suffix)
+
+
+class LilyPondLexer(SchemeLexer):
+    """
+    Lexer for input to LilyPond, a text-based music typesetter.
+
+    .. important::
+
+       This lexer is meant to be used in conjunction with the ``lilypond`` style.
+    """
+    name = 'LilyPond'
+    url = 'https://lilypond.org'
+    aliases = ['lilypond']
+    filenames = ['*.ly']
+    mimetypes = []
+    version_added = '2.11'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    # Because parsing LilyPond input is very tricky (and in fact
+    # impossible without executing LilyPond when there is Scheme
+    # code in the file), this lexer does not try to recognize
+    # lexical modes. Instead, it catches the most frequent pieces
+    # of syntax, and, above all, knows about many kinds of builtins.
+
+    # In order to parse embedded Scheme, this lexer subclasses the SchemeLexer.
+    # It redefines the 'root' state entirely, and adds a rule for #{ #}
+    # to the 'value' state. The latter is used to parse a Scheme expression
+    # after #.
+
+    def get_tokens_unprocessed(self, text):
+        """Highlight Scheme variables as LilyPond builtins when applicable."""
+        for index, token, value in super().get_tokens_unprocessed(text):
+            if token is Token.Name.Function or token is Token.Name.Variable:
+                if value in scheme_functions:
+                    token = Token.Name.Builtin.SchemeFunction
+            elif token is Token.Name.Builtin:
+                token = Token.Name.Builtin.SchemeBuiltin
+            yield index, token, value
+
+    tokens = {
+        "root": [
+            # Whitespace.
+            (r"\s+", Token.Text.Whitespace),
+
+            # Multi-line comments. These are non-nestable.
+            (r"%\{.*?%\}", Token.Comment.Multiline),
+
+            # Simple comments.
+            (r"%.*?$", Token.Comment.Single),
+
+            # End of embedded LilyPond in Scheme.
+            (r"#\}", Token.Punctuation, "#pop"),
+
+            # Embedded Scheme, starting with # ("delayed"),
+            # or $ (immediate). #@ and and $@ are the lesser known
+            # "list splicing operators".
+            (r"[#$]@?", Token.Punctuation, "value"),
+
+            # Any kind of punctuation:
+            # - sequential music: { },
+            # - parallel music: << >>,
+            # - voice separator: << \\ >>,
+            # - chord: < >,
+            # - bar check: |,
+            # - dot in nested properties: \revert NoteHead.color,
+            # - equals sign in assignments and lists for various commands:
+            #   \override Stem.color = red,
+            # - comma as alternative syntax for lists: \time 3,3,2 4/4,
+            # - colon in tremolos: c:32,
+            # - double hyphen and underscore in lyrics: li -- ly -- pond __
+            #   (which must be preceded by ASCII whitespace)
+            (r"""(?x)
+               \\\\
+               | (?<= \s ) (?: -- | __ )
+               | [{}<>=.,:|]
+              """, Token.Punctuation),
+
+            # Pitches, with optional octavation marks, octave check,
+            # and forced or cautionary accidental.
+            (words(pitches, suffix=r"=?[',]*!?\??" + NAME_END_RE), Token.Pitch),
+
+            # Strings, optionally with direction specifier.
+            (r'[\-_^]?"', Token.String, "string"),
+
+            # Numbers.
+            (r"-?\d+\.\d+", Token.Number.Float), # 5. and .5 are not allowed
+            (r"-?\d+/\d+", Token.Number.Fraction),
+            # Integers, or durations with optional augmentation dots.
+            # We have no way to distinguish these, so we highlight
+            # them all as numbers.
+            #
+            # Normally, there is a space before the integer (being an
+            # argument to a music function), which we check here.  The
+            # case without a space is handled below (as a fingering
+            # number).
+            (r"""(?x)
+               (?<= \s ) -\d+
+               | (?: (?: \d+ | \\breve | \\longa | \\maxima )
+                     \.* )
+              """, Token.Number),
+            # Separates duration and duration multiplier highlighted as fraction.
+            (r"\*", Token.Number),
+
+            # Ties, slurs, manual beams.
+            (r"[~()[\]]", Token.Name.Builtin.Articulation),
+
+            # Predefined articulation shortcuts. A direction specifier is
+            # required here.
+            (r"[\-_^][>^_!.\-+]", Token.Name.Builtin.Articulation),
+
+            # Fingering numbers, string numbers.
+            (r"[\-_^]?\\?\d+", Token.Name.Builtin.Articulation),
+
+            # Builtins.
+            (builtin_words(keywords, "mandatory"), Token.Keyword),
+            (builtin_words(pitch_language_names, "disallowed"), Token.Name.PitchLanguage),
+            (builtin_words(clefs, "disallowed"), Token.Name.Builtin.Clef),
+            (builtin_words(scales, "mandatory"), Token.Name.Builtin.Scale),
+            (builtin_words(repeat_types, "disallowed"), Token.Name.Builtin.RepeatType),
+            (builtin_words(units, "mandatory"), Token.Number),
+            (builtin_words(chord_modifiers, "disallowed"), Token.ChordModifier),
+            (builtin_words(music_functions, "mandatory"), Token.Name.Builtin.MusicFunction),
+            (builtin_words(dynamics, "mandatory"), Token.Name.Builtin.Dynamic),
+            # Those like slurs that don't take a backslash are covered above.
+            (builtin_words(articulations, "mandatory"), Token.Name.Builtin.Articulation),
+            (builtin_words(music_commands, "mandatory"), Token.Name.Builtin.MusicCommand),
+            (builtin_words(markup_commands, "mandatory"), Token.Name.Builtin.MarkupCommand),
+            (builtin_words(grobs, "disallowed"), Token.Name.Builtin.Grob),
+            (builtin_words(translators, "disallowed"), Token.Name.Builtin.Translator),
+            # Optional backslash because of \layout { \context { \Score ... } }.
+            (builtin_words(contexts, "optional"), Token.Name.Builtin.Context),
+            (builtin_words(context_properties, "disallowed"), Token.Name.Builtin.ContextProperty),
+            (builtin_words(grob_properties, "disallowed"),
+             Token.Name.Builtin.GrobProperty,
+             "maybe-subproperties"),
+            # Optional backslashes here because output definitions are wrappers
+            # around modules.  Concretely, you can do, e.g.,
+            # \paper { oddHeaderMarkup = \evenHeaderMarkup }
+            (builtin_words(paper_variables, "optional"), Token.Name.Builtin.PaperVariable),
+            (builtin_words(header_variables, "optional"), Token.Name.Builtin.HeaderVariable),
+
+            # Other backslashed-escaped names (like dereferencing a
+            # music variable), possibly with a direction specifier.
+            (r"[\-_^]?\\.+?" + NAME_END_RE, Token.Name.BackslashReference),
+
+            # Definition of a variable. Support assignments to alist keys
+            # (myAlist.my-key.my-nested-key = \markup \spam \eggs).
+            (r"""(?x)
+               (?: [^\W\d] | - )+
+               (?= (?: [^\W\d] | [\-.] )* \s* = )
+              """, Token.Name.Lvalue),
+
+            # Virtually everything can appear in markup mode, so we highlight
+            # as text.  Try to get a complete word, or we might wrongly lex
+            # a suffix that happens to be a builtin as a builtin (e.g., "myStaff").
+            (r"([^\W\d]|-)+?" + NAME_END_RE, Token.Text),
+            (r".", Token.Text),
+        ],
+        "string": [
+            (r'"', Token.String, "#pop"),
+            (r'\\.', Token.String.Escape),
+            (r'[^\\"]+', Token.String),
+        ],
+        "value": [
+            # Scan a LilyPond value, then pop back since we had a
+            # complete expression.
+            (r"#\{", Token.Punctuation, ("#pop", "root")),
+            inherit,
+        ],
+        # Grob subproperties are undeclared and it would be tedious
+        # to maintain them by hand. Instead, this state allows recognizing
+        # everything that looks like a-known-property.foo.bar-baz as
+        # one single property name.
+        "maybe-subproperties": [
+            (r"\s+", Token.Text.Whitespace),
+            (r"(\.)((?:[^\W\d]|-)+?)" + NAME_END_RE,
+             bygroups(Token.Punctuation, Token.Name.Builtin.GrobProperty)),
+            default("#pop"),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/lisp.py b/.venv/Lib/site-packages/pygments/lexers/lisp.py
new file mode 100644 (file)
index 0000000..2c970d9
--- /dev/null
@@ -0,0 +1,3146 @@
+"""
+    pygments.lexers.lisp
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Lispy languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, words, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal, Error, Whitespace
+
+from pygments.lexers.python import PythonLexer
+
+from pygments.lexers._scheme_builtins import scheme_keywords, scheme_builtins
+
+__all__ = ['SchemeLexer', 'CommonLispLexer', 'HyLexer', 'RacketLexer',
+           'NewLispLexer', 'EmacsLispLexer', 'ShenLexer', 'CPSALexer',
+           'XtlangLexer', 'FennelLexer', 'JanetLexer']
+
+
+class SchemeLexer(RegexLexer):
+    """
+    A Scheme lexer.
+
+    This parser is checked with pastes from the LISP pastebin
+    at http://paste.lisp.org/ to cover as much syntax as possible.
+
+    It supports the full Scheme syntax as defined in R5RS.
+    """
+    name = 'Scheme'
+    url = 'http://www.scheme-reports.org/'
+    aliases = ['scheme', 'scm']
+    filenames = ['*.scm', '*.ss']
+    mimetypes = ['text/x-scheme', 'application/x-scheme']
+    version_added = '0.6'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    # valid names for identifiers
+    # well, names can only not consist fully of numbers
+    # but this should be good enough for now
+    valid_name = r'[\w!$%&*+,/:<=>?@^~|-]+'
+
+    # Use within verbose regexes
+    token_end = r'''
+      (?=
+        \s         # whitespace
+        | ;        # comment
+        | \#[;|!] # fancy comments
+        | [)\]]    # end delimiters
+        | $        # end of file
+      )
+    '''
+
+    # Recognizing builtins.
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in super().get_tokens_unprocessed(text):
+            if token is Name.Function or token is Name.Variable:
+                if value in scheme_keywords:
+                    yield index, Keyword, value
+                elif value in scheme_builtins:
+                    yield index, Name.Builtin, value
+                else:
+                    yield index, token, value
+            else:
+                yield index, token, value
+
+    # Scheme has funky syntactic rules for numbers. These are all
+    # valid number literals: 5.0e55|14, 14/13, -1+5j, +1@5, #b110,
+    # #o#Iinf.0-nan.0i.  This is adapted from the formal grammar given
+    # in http://www.r6rs.org/final/r6rs.pdf, section 4.2.1.  Take a
+    # deep breath ...
+
+    # It would be simpler if we could just not bother about invalid
+    # numbers like #b35. But we cannot parse 'abcdef' without #x as a
+    # number.
+
+    number_rules = {}
+    for base in (2, 8, 10, 16):
+        if base == 2:
+            digit = r'[01]'
+            radix = r'( \#[bB] )'
+        elif base == 8:
+            digit = r'[0-7]'
+            radix = r'( \#[oO] )'
+        elif base == 10:
+            digit = r'[0-9]'
+            radix = r'( (\#[dD])? )'
+        elif base == 16:
+            digit = r'[0-9a-fA-F]'
+            radix = r'( \#[xX] )'
+
+        # Radix, optional exactness indicator.
+        prefix = rf'''
+          (
+            {radix} (\#[iIeE])?
+            | \#[iIeE] {radix}
+          )
+        '''
+
+        # Simple unsigned number or fraction.
+        ureal = rf'''
+          (
+            {digit}+
+            ( / {digit}+ )?
+          )
+        '''
+
+        # Add decimal numbers.
+        if base == 10:
+            decimal = r'''
+              (
+                # Decimal part
+                (
+                  [0-9]+ ([.][0-9]*)?
+                  | [.][0-9]+
+                )
+
+                # Optional exponent
+                (
+                  [eEsSfFdDlL] [+-]? [0-9]+
+                )?
+
+                # Optional mantissa width
+                (
+                  \|[0-9]+
+                )?
+              )
+            '''
+            ureal = rf'''
+              (
+                {decimal} (?!/)
+                | {ureal}
+              )
+            '''
+
+        naninf = r'(nan.0|inf.0)'
+
+        real = rf'''
+          (
+            [+-] {naninf}  # Sign mandatory
+            | [+-]? {ureal}    # Sign optional
+          )
+        '''
+
+        complex_ = rf'''
+          (
+            {real}?  [+-]  ({naninf}|{ureal})?  i
+            | {real} (@ {real})?
+
+          )
+        '''
+
+        num = rf'''(?x)
+          (
+            {prefix}
+            {complex_}
+          )
+          # Need to ensure we have a full token. 1+ is not a
+          # number followed by something else, but a function
+          # name.
+          {token_end}
+        '''
+
+        number_rules[base] = num
+
+    # If you have a headache now, say thanks to RnRS editors.
+
+    # Doing it this way is simpler than splitting the number(10)
+    # regex in a floating-point and a no-floating-point version.
+    def decimal_cb(self, match):
+        if '.' in match.group():
+            token_type = Number.Float # includes [+-](inf|nan).0
+        else:
+            token_type = Number.Integer
+        yield match.start(), token_type, match.group()
+
+    # --
+
+    # The 'scheme-root' state parses as many expressions as needed, always
+    # delegating to the 'scheme-value' state. The latter parses one complete
+    # expression and immediately pops back. This is needed for the LilyPondLexer.
+    # When LilyPond encounters a #, it starts parsing embedded Scheme code, and
+    # returns to normal syntax after one expression. We implement this
+    # by letting the LilyPondLexer subclass the SchemeLexer. When it finds
+    # the #, the LilyPondLexer goes to the 'value' state, which then pops back
+    # to LilyPondLexer. The 'root' state of the SchemeLexer merely delegates the
+    # work to 'scheme-root'; this is so that LilyPondLexer can inherit
+    # 'scheme-root' and redefine 'root'.
+
+    tokens = {
+        'root': [
+            default('scheme-root'),
+        ],
+        'scheme-root': [
+            default('value'),
+        ],
+        'value': [
+            # the comments
+            # and going to the end of the line
+            (r';.*?$', Comment.Single),
+            # multi-line comment
+            (r'#\|', Comment.Multiline, 'multiline-comment'),
+            # commented form (entire sexpr following)
+            (r'#;[([]', Comment, 'commented-form'),
+            # commented datum
+            (r'#;', Comment, 'commented-datum'),
+            # signifies that the program text that follows is written with the
+            # lexical and datum syntax described in r6rs
+            (r'#!r6rs', Comment),
+
+            # whitespaces - usually not relevant
+            (r'\s+', Whitespace),
+
+            # numbers
+            (number_rules[2], Number.Bin, '#pop'),
+            (number_rules[8], Number.Oct, '#pop'),
+            (number_rules[10], decimal_cb, '#pop'),
+            (number_rules[16], Number.Hex, '#pop'),
+
+            # strings, symbols, keywords and characters
+            (r'"', String, 'string'),
+            (r"'" + valid_name, String.Symbol, "#pop"),
+            (r'#:' + valid_name, Keyword.Declaration, '#pop'),
+            (r"#\\([()/'\"._!§$%& ?=+-]|[a-zA-Z0-9]+)", String.Char, "#pop"),
+
+            # constants
+            (r'(#t|#f)', Name.Constant, '#pop'),
+
+            # special operators
+            (r"('|#|`|,@|,|\.)", Operator),
+
+            # first variable in a quoted string like
+            # '(this is syntactic sugar)
+            (r"(?<='\()" + valid_name, Name.Variable, '#pop'),
+            (r"(?<=#\()" + valid_name, Name.Variable, '#pop'),
+
+            # Functions -- note that this also catches variables
+            # defined in let/let*, but there is little that can
+            # be done about it.
+            (r'(?<=\()' + valid_name, Name.Function, '#pop'),
+
+            # find the remaining variables
+            (valid_name, Name.Variable, '#pop'),
+
+            # the famous parentheses!
+
+            # Push scheme-root to enter a state that will parse as many things
+            # as needed in the parentheses.
+            (r'[([]', Punctuation, 'scheme-root'),
+            # Pop one 'value', one 'scheme-root', and yet another 'value', so
+            # we get back to a state parsing expressions as needed in the
+            # enclosing context.
+            (r'[)\]]', Punctuation, '#pop:3'),
+        ],
+        'multiline-comment': [
+            (r'#\|', Comment.Multiline, '#push'),
+            (r'\|#', Comment.Multiline, '#pop'),
+            (r'[^|#]+', Comment.Multiline),
+            (r'[|#]', Comment.Multiline),
+        ],
+        'commented-form': [
+            (r'[([]', Comment, '#push'),
+            (r'[)\]]', Comment, '#pop'),
+            (r'[^()[\]]+', Comment),
+        ],
+        'commented-datum': [
+            (rf'(?x).*?{token_end}', Comment, '#pop'),
+        ],
+        'string': [
+            # Pops back from 'string', and pops 'value' as well.
+            ('"', String, '#pop:2'),
+            # Hex escape sequences, R6RS-style.
+            (r'\\x[0-9a-fA-F]+;', String.Escape),
+            # We try R6RS style first, but fall back to Guile-style.
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+            # Other special escape sequences implemented by Guile.
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\U[0-9a-fA-F]{6}', String.Escape),
+            # Escape sequences are not overly standardized. Recognizing
+            # a single character after the backslash should be good enough.
+            # NB: we have DOTALL.
+            (r'\\.', String.Escape),
+            # The rest
+            (r'[^\\"]+', String),
+        ]
+    }
+
+
+class CommonLispLexer(RegexLexer):
+    """
+    A Common Lisp lexer.
+    """
+    name = 'Common Lisp'
+    url = 'https://lisp-lang.org/'
+    aliases = ['common-lisp', 'cl', 'lisp']
+    filenames = ['*.cl', '*.lisp']
+    mimetypes = ['text/x-common-lisp']
+    version_added = '0.9'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    # couple of useful regexes
+
+    # characters that are not macro-characters and can be used to begin a symbol
+    nonmacro = r'\\.|[\w!$%&*+-/<=>?@\[\]^{}~]'
+    constituent = nonmacro + '|[#.:]'
+    terminated = r'(?=[ "()\'\n,;`])'  # whitespace or terminating macro characters
+
+    # symbol token, reverse-engineered from hyperspec
+    # Take a deep breath...
+    symbol = rf'(\|[^|]+\||(?:{nonmacro})(?:{constituent})*)'
+
+    def __init__(self, **options):
+        from pygments.lexers._cl_builtins import BUILTIN_FUNCTIONS, \
+            SPECIAL_FORMS, MACROS, LAMBDA_LIST_KEYWORDS, DECLARATIONS, \
+            BUILTIN_TYPES, BUILTIN_CLASSES
+        self.builtin_function = BUILTIN_FUNCTIONS
+        self.special_forms = SPECIAL_FORMS
+        self.macros = MACROS
+        self.lambda_list_keywords = LAMBDA_LIST_KEYWORDS
+        self.declarations = DECLARATIONS
+        self.builtin_types = BUILTIN_TYPES
+        self.builtin_classes = BUILTIN_CLASSES
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name.Variable:
+                if value in self.builtin_function:
+                    yield index, Name.Builtin, value
+                    continue
+                if value in self.special_forms:
+                    yield index, Keyword, value
+                    continue
+                if value in self.macros:
+                    yield index, Name.Builtin, value
+                    continue
+                if value in self.lambda_list_keywords:
+                    yield index, Keyword, value
+                    continue
+                if value in self.declarations:
+                    yield index, Keyword, value
+                    continue
+                if value in self.builtin_types:
+                    yield index, Keyword.Type, value
+                    continue
+                if value in self.builtin_classes:
+                    yield index, Name.Class, value
+                    continue
+            yield index, token, value
+
+    tokens = {
+        'root': [
+            default('body'),
+        ],
+        'multiline-comment': [
+            (r'#\|', Comment.Multiline, '#push'),  # (cf. Hyperspec 2.4.8.19)
+            (r'\|#', Comment.Multiline, '#pop'),
+            (r'[^|#]+', Comment.Multiline),
+            (r'[|#]', Comment.Multiline),
+        ],
+        'commented-form': [
+            (r'\(', Comment.Preproc, '#push'),
+            (r'\)', Comment.Preproc, '#pop'),
+            (r'[^()]+', Comment.Preproc),
+        ],
+        'body': [
+            # whitespace
+            (r'\s+', Whitespace),
+
+            # single-line comment
+            (r';.*$', Comment.Single),
+
+            # multi-line comment
+            (r'#\|', Comment.Multiline, 'multiline-comment'),
+
+            # encoding comment (?)
+            (r'#\d*Y.*$', Comment.Special),
+
+            # strings and characters
+            (r'"(\\.|\\\n|[^"\\])*"', String),
+            # quoting
+            (r":" + symbol, String.Symbol),
+            (r"::" + symbol, String.Symbol),
+            (r":#" + symbol, String.Symbol),
+            (r"'" + symbol, String.Symbol),
+            (r"'", Operator),
+            (r"`", Operator),
+
+            # decimal numbers
+            (r'[-+]?\d+\.?' + terminated, Number.Integer),
+            (r'[-+]?\d+/\d+' + terminated, Number),
+            (r'[-+]?(\d*\.\d+([defls][-+]?\d+)?|\d+(\.\d*)?[defls][-+]?\d+)' +
+             terminated, Number.Float),
+
+            # sharpsign strings and characters
+            (r"#\\." + terminated, String.Char),
+            (r"#\\" + symbol, String.Char),
+
+            # vector
+            (r'#\(', Operator, 'body'),
+
+            # bitstring
+            (r'#\d*\*[01]*', Literal.Other),
+
+            # uninterned symbol
+            (r'#:' + symbol, String.Symbol),
+
+            # read-time and load-time evaluation
+            (r'#[.,]', Operator),
+
+            # function shorthand
+            (r'#\'', Name.Function),
+
+            # binary rational
+            (r'#b[+-]?[01]+(/[01]+)?', Number.Bin),
+
+            # octal rational
+            (r'#o[+-]?[0-7]+(/[0-7]+)?', Number.Oct),
+
+            # hex rational
+            (r'#x[+-]?[0-9a-f]+(/[0-9a-f]+)?', Number.Hex),
+
+            # radix rational
+            (r'#\d+r[+-]?[0-9a-z]+(/[0-9a-z]+)?', Number),
+
+            # complex
+            (r'(#c)(\()', bygroups(Number, Punctuation), 'body'),
+
+            # array
+            (r'(#\d+a)(\()', bygroups(Literal.Other, Punctuation), 'body'),
+
+            # structure
+            (r'(#s)(\()', bygroups(Literal.Other, Punctuation), 'body'),
+
+            # path
+            (r'#p?"(\\.|[^"])*"', Literal.Other),
+
+            # reference
+            (r'#\d+=', Operator),
+            (r'#\d+#', Operator),
+
+            # read-time comment
+            (r'#+nil' + terminated + r'\s*\(', Comment.Preproc, 'commented-form'),
+
+            # read-time conditional
+            (r'#[+-]', Operator),
+
+            # special operators that should have been parsed already
+            (r'(,@|,|\.)', Operator),
+
+            # special constants
+            (r'(t|nil)' + terminated, Name.Constant),
+
+            # functions and variables
+            (r'\*' + symbol + r'\*', Name.Variable.Global),
+            (symbol, Name.Variable),
+
+            # parentheses
+            (r'\(', Punctuation, 'body'),
+            (r'\)', Punctuation, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        """Competes with Visual Prolog on *.cl"""
+        # This is a *really* good indicator (and not conflicting with Visual Prolog)
+        # '(defun ' first on a line
+        # section keyword alone on line e.g. 'clauses'
+        if re.search(r'^\s*\(defun\s', text):
+            return 0.8
+        else:
+            return 0
+
+
+class HyLexer(RegexLexer):
+    """
+    Lexer for Hy source code.
+    """
+    name = 'Hy'
+    url = 'http://hylang.org/'
+    aliases = ['hylang', 'hy']
+    filenames = ['*.hy']
+    mimetypes = ['text/x-hy', 'application/x-hy']
+    version_added = '2.0'
+
+    special_forms = (
+        'cond', 'for', '->', '->>', 'car',
+        'cdr', 'first', 'rest', 'let', 'when', 'unless',
+        'import', 'do', 'progn', 'get', 'slice', 'assoc', 'with-decorator',
+        ',', 'list_comp', 'kwapply', '~', 'is', 'in', 'is-not', 'not-in',
+        'quasiquote', 'unquote', 'unquote-splice', 'quote', '|', '<<=', '>>=',
+        'foreach', 'while',
+        'eval-and-compile', 'eval-when-compile'
+    )
+
+    declarations = (
+        'def', 'defn', 'defun', 'defmacro', 'defclass', 'lambda', 'fn', 'setv'
+    )
+
+    hy_builtins = ()
+
+    hy_core = (
+        'cycle', 'dec', 'distinct', 'drop', 'even?', 'filter', 'inc',
+        'instance?', 'iterable?', 'iterate', 'iterator?', 'neg?',
+        'none?', 'nth', 'numeric?', 'odd?', 'pos?', 'remove', 'repeat',
+        'repeatedly', 'take', 'take_nth', 'take_while', 'zero?'
+    )
+
+    builtins = hy_builtins + hy_core
+
+    # valid names for identifiers
+    # well, names can only not consist fully of numbers
+    # but this should be good enough for now
+    valid_name = r"[^ \t\n\r\f\v()[\]{};\"'`~]+"
+
+    def _multi_escape(entries):
+        return words(entries, suffix=' ')
+
+    tokens = {
+        'root': [
+            # the comments - always starting with semicolon
+            # and going to the end of the line
+            (r';.*$', Comment.Single),
+
+            # whitespaces - usually not relevant
+            (r'[ \t\n\r\f\v]+', Whitespace),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+            (r'0[0-7]+j?', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r"'" + valid_name, String.Symbol),
+            (r"\\(.|[a-z]+)", String.Char),
+            (r'^(\s*)([rRuU]{,2}"""(?:.|\n)*?""")', bygroups(Text, String.Doc)),
+            (r"^(\s*)([rRuU]{,2}'''(?:.|\n)*?''')", bygroups(Text, String.Doc)),
+
+            # keywords
+            (r'::?' + valid_name, String.Symbol),
+
+            # special operators
+            (r'~@|[`\'#^~&@]', Operator),
+
+            include('py-keywords'),
+            include('py-builtins'),
+
+            # highlight the special forms
+            (_multi_escape(special_forms), Keyword),
+
+            # Technically, only the special forms are 'keywords'. The problem
+            # is that only treating them as keywords means that things like
+            # 'defn' and 'ns' need to be highlighted as builtins. This is ugly
+            # and weird for most styles. So, as a compromise we're going to
+            # highlight them as Keyword.Declarations.
+            (_multi_escape(declarations), Keyword.Declaration),
+
+            # highlight the builtins
+            (_multi_escape(builtins), Name.Builtin),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Function),
+
+            # find the remaining variables
+            (valid_name, Name.Variable),
+
+            # Hy accepts vector notation
+            (r'(\[|\])', Punctuation),
+
+            # Hy accepts map notation
+            (r'(\{|\})', Punctuation),
+
+            # the famous parentheses!
+            (r'(\(|\))', Punctuation),
+
+        ],
+        'py-keywords': PythonLexer.tokens['keywords'],
+        'py-builtins': PythonLexer.tokens['builtins'],
+    }
+
+    def analyse_text(text):
+        if '(import ' in text or '(defn ' in text:
+            return 0.9
+
+
+class RacketLexer(RegexLexer):
+    """
+    Lexer for Racket source code (formerly
+    known as PLT Scheme).
+    """
+
+    name = 'Racket'
+    url = 'http://racket-lang.org/'
+    aliases = ['racket', 'rkt']
+    filenames = ['*.rkt', '*.rktd', '*.rktl']
+    mimetypes = ['text/x-racket', 'application/x-racket']
+    version_added = '1.6'
+
+    # Generated by example.rkt
+    _keywords = (
+        '#%app', '#%datum', '#%declare', '#%expression', '#%module-begin',
+        '#%plain-app', '#%plain-lambda', '#%plain-module-begin',
+        '#%printing-module-begin', '#%provide', '#%require',
+        '#%stratified-body', '#%top', '#%top-interaction',
+        '#%variable-reference', '->', '->*', '->*m', '->d', '->dm', '->i',
+        '->m', '...', ':do-in', '==', '=>', '_', 'absent', 'abstract',
+        'all-defined-out', 'all-from-out', 'and', 'any', 'augment', 'augment*',
+        'augment-final', 'augment-final*', 'augride', 'augride*', 'begin',
+        'begin-for-syntax', 'begin0', 'case', 'case->', 'case->m',
+        'case-lambda', 'class', 'class*', 'class-field-accessor',
+        'class-field-mutator', 'class/c', 'class/derived', 'combine-in',
+        'combine-out', 'command-line', 'compound-unit', 'compound-unit/infer',
+        'cond', 'cons/dc', 'contract', 'contract-out', 'contract-struct',
+        'contracted', 'define', 'define-compound-unit',
+        'define-compound-unit/infer', 'define-contract-struct',
+        'define-custom-hash-types', 'define-custom-set-types',
+        'define-for-syntax', 'define-local-member-name', 'define-logger',
+        'define-match-expander', 'define-member-name',
+        'define-module-boundary-contract', 'define-namespace-anchor',
+        'define-opt/c', 'define-sequence-syntax', 'define-serializable-class',
+        'define-serializable-class*', 'define-signature',
+        'define-signature-form', 'define-struct', 'define-struct/contract',
+        'define-struct/derived', 'define-syntax', 'define-syntax-rule',
+        'define-syntaxes', 'define-unit', 'define-unit-binding',
+        'define-unit-from-context', 'define-unit/contract',
+        'define-unit/new-import-export', 'define-unit/s', 'define-values',
+        'define-values-for-export', 'define-values-for-syntax',
+        'define-values/invoke-unit', 'define-values/invoke-unit/infer',
+        'define/augment', 'define/augment-final', 'define/augride',
+        'define/contract', 'define/final-prop', 'define/match',
+        'define/overment', 'define/override', 'define/override-final',
+        'define/private', 'define/public', 'define/public-final',
+        'define/pubment', 'define/subexpression-pos-prop',
+        'define/subexpression-pos-prop/name', 'delay', 'delay/idle',
+        'delay/name', 'delay/strict', 'delay/sync', 'delay/thread', 'do',
+        'else', 'except', 'except-in', 'except-out', 'export', 'extends',
+        'failure-cont', 'false', 'false/c', 'field', 'field-bound?', 'file',
+        'flat-murec-contract', 'flat-rec-contract', 'for', 'for*', 'for*/and',
+        'for*/async', 'for*/first', 'for*/fold', 'for*/fold/derived',
+        'for*/hash', 'for*/hasheq', 'for*/hasheqv', 'for*/last', 'for*/list',
+        'for*/lists', 'for*/mutable-set', 'for*/mutable-seteq',
+        'for*/mutable-seteqv', 'for*/or', 'for*/product', 'for*/set',
+        'for*/seteq', 'for*/seteqv', 'for*/stream', 'for*/sum', 'for*/vector',
+        'for*/weak-set', 'for*/weak-seteq', 'for*/weak-seteqv', 'for-label',
+        'for-meta', 'for-syntax', 'for-template', 'for/and', 'for/async',
+        'for/first', 'for/fold', 'for/fold/derived', 'for/hash', 'for/hasheq',
+        'for/hasheqv', 'for/last', 'for/list', 'for/lists', 'for/mutable-set',
+        'for/mutable-seteq', 'for/mutable-seteqv', 'for/or', 'for/product',
+        'for/set', 'for/seteq', 'for/seteqv', 'for/stream', 'for/sum',
+        'for/vector', 'for/weak-set', 'for/weak-seteq', 'for/weak-seteqv',
+        'gen:custom-write', 'gen:dict', 'gen:equal+hash', 'gen:set',
+        'gen:stream', 'generic', 'get-field', 'hash/dc', 'if', 'implies',
+        'import', 'include', 'include-at/relative-to',
+        'include-at/relative-to/reader', 'include/reader', 'inherit',
+        'inherit-field', 'inherit/inner', 'inherit/super', 'init',
+        'init-depend', 'init-field', 'init-rest', 'inner', 'inspect',
+        'instantiate', 'interface', 'interface*', 'invariant-assertion',
+        'invoke-unit', 'invoke-unit/infer', 'lambda', 'lazy', 'let', 'let*',
+        'let*-values', 'let-syntax', 'let-syntaxes', 'let-values', 'let/cc',
+        'let/ec', 'letrec', 'letrec-syntax', 'letrec-syntaxes',
+        'letrec-syntaxes+values', 'letrec-values', 'lib', 'link', 'local',
+        'local-require', 'log-debug', 'log-error', 'log-fatal', 'log-info',
+        'log-warning', 'match', 'match*', 'match*/derived', 'match-define',
+        'match-define-values', 'match-lambda', 'match-lambda*',
+        'match-lambda**', 'match-let', 'match-let*', 'match-let*-values',
+        'match-let-values', 'match-letrec', 'match-letrec-values',
+        'match/derived', 'match/values', 'member-name-key', 'mixin', 'module',
+        'module*', 'module+', 'nand', 'new', 'nor', 'object-contract',
+        'object/c', 'only', 'only-in', 'only-meta-in', 'open', 'opt/c', 'or',
+        'overment', 'overment*', 'override', 'override*', 'override-final',
+        'override-final*', 'parameterize', 'parameterize*',
+        'parameterize-break', 'parametric->/c', 'place', 'place*',
+        'place/context', 'planet', 'prefix', 'prefix-in', 'prefix-out',
+        'private', 'private*', 'prompt-tag/c', 'protect-out', 'provide',
+        'provide-signature-elements', 'provide/contract', 'public', 'public*',
+        'public-final', 'public-final*', 'pubment', 'pubment*', 'quasiquote',
+        'quasisyntax', 'quasisyntax/loc', 'quote', 'quote-syntax',
+        'quote-syntax/prune', 'recontract-out', 'recursive-contract',
+        'relative-in', 'rename', 'rename-in', 'rename-inner', 'rename-out',
+        'rename-super', 'require', 'send', 'send*', 'send+', 'send-generic',
+        'send/apply', 'send/keyword-apply', 'set!', 'set!-values',
+        'set-field!', 'shared', 'stream', 'stream*', 'stream-cons', 'struct',
+        'struct*', 'struct-copy', 'struct-field-index', 'struct-out',
+        'struct/c', 'struct/ctc', 'struct/dc', 'submod', 'super',
+        'super-instantiate', 'super-make-object', 'super-new', 'syntax',
+        'syntax-case', 'syntax-case*', 'syntax-id-rules', 'syntax-rules',
+        'syntax/loc', 'tag', 'this', 'this%', 'thunk', 'thunk*', 'time',
+        'unconstrained-domain->', 'unit', 'unit-from-context', 'unit/c',
+        'unit/new-import-export', 'unit/s', 'unless', 'unquote',
+        'unquote-splicing', 'unsyntax', 'unsyntax-splicing', 'values/drop',
+        'when', 'with-continuation-mark', 'with-contract',
+        'with-contract-continuation-mark', 'with-handlers', 'with-handlers*',
+        'with-method', 'with-syntax', 'λ'
+    )
+
+    # Generated by example.rkt
+    _builtins = (
+        '*', '*list/c', '+', '-', '/', '<', '</c', '<=', '<=/c', '=', '=/c',
+        '>', '>/c', '>=', '>=/c', 'abort-current-continuation', 'abs',
+        'absolute-path?', 'acos', 'add-between', 'add1', 'alarm-evt',
+        'always-evt', 'and/c', 'andmap', 'angle', 'any/c', 'append', 'append*',
+        'append-map', 'apply', 'argmax', 'argmin', 'arithmetic-shift',
+        'arity-at-least', 'arity-at-least-value', 'arity-at-least?',
+        'arity-checking-wrapper', 'arity-includes?', 'arity=?',
+        'arrow-contract-info', 'arrow-contract-info-accepts-arglist',
+        'arrow-contract-info-chaperone-procedure',
+        'arrow-contract-info-check-first-order', 'arrow-contract-info?',
+        'asin', 'assf', 'assoc', 'assq', 'assv', 'atan',
+        'bad-number-of-results', 'banner', 'base->-doms/c', 'base->-rngs/c',
+        'base->?', 'between/c', 'bitwise-and', 'bitwise-bit-field',
+        'bitwise-bit-set?', 'bitwise-ior', 'bitwise-not', 'bitwise-xor',
+        'blame-add-car-context', 'blame-add-cdr-context', 'blame-add-context',
+        'blame-add-missing-party', 'blame-add-nth-arg-context',
+        'blame-add-range-context', 'blame-add-unknown-context',
+        'blame-context', 'blame-contract', 'blame-fmt->-string',
+        'blame-missing-party?', 'blame-negative', 'blame-original?',
+        'blame-positive', 'blame-replace-negative', 'blame-source',
+        'blame-swap', 'blame-swapped?', 'blame-update', 'blame-value',
+        'blame?', 'boolean=?', 'boolean?', 'bound-identifier=?', 'box',
+        'box-cas!', 'box-immutable', 'box-immutable/c', 'box/c', 'box?',
+        'break-enabled', 'break-parameterization?', 'break-thread',
+        'build-chaperone-contract-property', 'build-compound-type-name',
+        'build-contract-property', 'build-flat-contract-property',
+        'build-list', 'build-path', 'build-path/convention-type',
+        'build-string', 'build-vector', 'byte-pregexp', 'byte-pregexp?',
+        'byte-ready?', 'byte-regexp', 'byte-regexp?', 'byte?', 'bytes',
+        'bytes->immutable-bytes', 'bytes->list', 'bytes->path',
+        'bytes->path-element', 'bytes->string/latin-1', 'bytes->string/locale',
+        'bytes->string/utf-8', 'bytes-append', 'bytes-append*',
+        'bytes-close-converter', 'bytes-convert', 'bytes-convert-end',
+        'bytes-converter?', 'bytes-copy', 'bytes-copy!',
+        'bytes-environment-variable-name?', 'bytes-fill!', 'bytes-join',
+        'bytes-length', 'bytes-no-nuls?', 'bytes-open-converter', 'bytes-ref',
+        'bytes-set!', 'bytes-utf-8-index', 'bytes-utf-8-length',
+        'bytes-utf-8-ref', 'bytes<?', 'bytes=?', 'bytes>?', 'bytes?', 'caaaar',
+        'caaadr', 'caaar', 'caadar', 'caaddr', 'caadr', 'caar', 'cadaar',
+        'cadadr', 'cadar', 'caddar', 'cadddr', 'caddr', 'cadr',
+        'call-in-nested-thread', 'call-with-atomic-output-file',
+        'call-with-break-parameterization',
+        'call-with-composable-continuation', 'call-with-continuation-barrier',
+        'call-with-continuation-prompt', 'call-with-current-continuation',
+        'call-with-default-reading-parameterization',
+        'call-with-escape-continuation', 'call-with-exception-handler',
+        'call-with-file-lock/timeout', 'call-with-immediate-continuation-mark',
+        'call-with-input-bytes', 'call-with-input-file',
+        'call-with-input-file*', 'call-with-input-string',
+        'call-with-output-bytes', 'call-with-output-file',
+        'call-with-output-file*', 'call-with-output-string',
+        'call-with-parameterization', 'call-with-semaphore',
+        'call-with-semaphore/enable-break', 'call-with-values', 'call/cc',
+        'call/ec', 'car', 'cartesian-product', 'cdaaar', 'cdaadr', 'cdaar',
+        'cdadar', 'cdaddr', 'cdadr', 'cdar', 'cddaar', 'cddadr', 'cddar',
+        'cdddar', 'cddddr', 'cdddr', 'cddr', 'cdr', 'ceiling', 'channel-get',
+        'channel-put', 'channel-put-evt', 'channel-put-evt?',
+        'channel-try-get', 'channel/c', 'channel?', 'chaperone-box',
+        'chaperone-channel', 'chaperone-continuation-mark-key',
+        'chaperone-contract-property?', 'chaperone-contract?', 'chaperone-evt',
+        'chaperone-hash', 'chaperone-hash-set', 'chaperone-of?',
+        'chaperone-procedure', 'chaperone-procedure*', 'chaperone-prompt-tag',
+        'chaperone-struct', 'chaperone-struct-type', 'chaperone-vector',
+        'chaperone?', 'char->integer', 'char-alphabetic?', 'char-blank?',
+        'char-ci<=?', 'char-ci<?', 'char-ci=?', 'char-ci>=?', 'char-ci>?',
+        'char-downcase', 'char-foldcase', 'char-general-category',
+        'char-graphic?', 'char-in', 'char-in/c', 'char-iso-control?',
+        'char-lower-case?', 'char-numeric?', 'char-punctuation?',
+        'char-ready?', 'char-symbolic?', 'char-title-case?', 'char-titlecase',
+        'char-upcase', 'char-upper-case?', 'char-utf-8-length',
+        'char-whitespace?', 'char<=?', 'char<?', 'char=?', 'char>=?', 'char>?',
+        'char?', 'check-duplicate-identifier', 'check-duplicates',
+        'checked-procedure-check-and-extract', 'choice-evt',
+        'class->interface', 'class-info', 'class-seal', 'class-unseal',
+        'class?', 'cleanse-path', 'close-input-port', 'close-output-port',
+        'coerce-chaperone-contract', 'coerce-chaperone-contracts',
+        'coerce-contract', 'coerce-contract/f', 'coerce-contracts',
+        'coerce-flat-contract', 'coerce-flat-contracts', 'collect-garbage',
+        'collection-file-path', 'collection-path', 'combinations', 'compile',
+        'compile-allow-set!-undefined', 'compile-context-preservation-enabled',
+        'compile-enforce-module-constants', 'compile-syntax',
+        'compiled-expression-recompile', 'compiled-expression?',
+        'compiled-module-expression?', 'complete-path?', 'complex?', 'compose',
+        'compose1', 'conjoin', 'conjugate', 'cons', 'cons/c', 'cons?', 'const',
+        'continuation-mark-key/c', 'continuation-mark-key?',
+        'continuation-mark-set->context', 'continuation-mark-set->list',
+        'continuation-mark-set->list*', 'continuation-mark-set-first',
+        'continuation-mark-set?', 'continuation-marks',
+        'continuation-prompt-available?', 'continuation-prompt-tag?',
+        'continuation?', 'contract-continuation-mark-key',
+        'contract-custom-write-property-proc', 'contract-exercise',
+        'contract-first-order', 'contract-first-order-passes?',
+        'contract-late-neg-projection', 'contract-name', 'contract-proc',
+        'contract-projection', 'contract-property?',
+        'contract-random-generate', 'contract-random-generate-fail',
+        'contract-random-generate-fail?',
+        'contract-random-generate-get-current-environment',
+        'contract-random-generate-stash', 'contract-random-generate/choose',
+        'contract-stronger?', 'contract-struct-exercise',
+        'contract-struct-generate', 'contract-struct-late-neg-projection',
+        'contract-struct-list-contract?', 'contract-val-first-projection',
+        'contract?', 'convert-stream', 'copy-directory/files', 'copy-file',
+        'copy-port', 'cos', 'cosh', 'count', 'current-blame-format',
+        'current-break-parameterization', 'current-code-inspector',
+        'current-command-line-arguments', 'current-compile',
+        'current-compiled-file-roots', 'current-continuation-marks',
+        'current-contract-region', 'current-custodian', 'current-directory',
+        'current-directory-for-user', 'current-drive',
+        'current-environment-variables', 'current-error-port', 'current-eval',
+        'current-evt-pseudo-random-generator',
+        'current-force-delete-permissions', 'current-future',
+        'current-gc-milliseconds', 'current-get-interaction-input-port',
+        'current-inexact-milliseconds', 'current-input-port',
+        'current-inspector', 'current-library-collection-links',
+        'current-library-collection-paths', 'current-load',
+        'current-load-extension', 'current-load-relative-directory',
+        'current-load/use-compiled', 'current-locale', 'current-logger',
+        'current-memory-use', 'current-milliseconds',
+        'current-module-declare-name', 'current-module-declare-source',
+        'current-module-name-resolver', 'current-module-path-for-load',
+        'current-namespace', 'current-output-port', 'current-parameterization',
+        'current-plumber', 'current-preserved-thread-cell-values',
+        'current-print', 'current-process-milliseconds', 'current-prompt-read',
+        'current-pseudo-random-generator', 'current-read-interaction',
+        'current-reader-guard', 'current-readtable', 'current-seconds',
+        'current-security-guard', 'current-subprocess-custodian-mode',
+        'current-thread', 'current-thread-group',
+        'current-thread-initial-stack-size',
+        'current-write-relative-directory', 'curry', 'curryr',
+        'custodian-box-value', 'custodian-box?', 'custodian-limit-memory',
+        'custodian-managed-list', 'custodian-memory-accounting-available?',
+        'custodian-require-memory', 'custodian-shutdown-all', 'custodian?',
+        'custom-print-quotable-accessor', 'custom-print-quotable?',
+        'custom-write-accessor', 'custom-write-property-proc', 'custom-write?',
+        'date', 'date*', 'date*-nanosecond', 'date*-time-zone-name', 'date*?',
+        'date-day', 'date-dst?', 'date-hour', 'date-minute', 'date-month',
+        'date-second', 'date-time-zone-offset', 'date-week-day', 'date-year',
+        'date-year-day', 'date?', 'datum->syntax', 'datum-intern-literal',
+        'default-continuation-prompt-tag', 'degrees->radians',
+        'delete-directory', 'delete-directory/files', 'delete-file',
+        'denominator', 'dict->list', 'dict-can-functional-set?',
+        'dict-can-remove-keys?', 'dict-clear', 'dict-clear!', 'dict-copy',
+        'dict-count', 'dict-empty?', 'dict-for-each', 'dict-has-key?',
+        'dict-implements/c', 'dict-implements?', 'dict-iter-contract',
+        'dict-iterate-first', 'dict-iterate-key', 'dict-iterate-next',
+        'dict-iterate-value', 'dict-key-contract', 'dict-keys', 'dict-map',
+        'dict-mutable?', 'dict-ref', 'dict-ref!', 'dict-remove',
+        'dict-remove!', 'dict-set', 'dict-set!', 'dict-set*', 'dict-set*!',
+        'dict-update', 'dict-update!', 'dict-value-contract', 'dict-values',
+        'dict?', 'directory-exists?', 'directory-list', 'disjoin', 'display',
+        'display-lines', 'display-lines-to-file', 'display-to-file',
+        'displayln', 'double-flonum?', 'drop', 'drop-common-prefix',
+        'drop-right', 'dropf', 'dropf-right', 'dump-memory-stats',
+        'dup-input-port', 'dup-output-port', 'dynamic->*', 'dynamic-get-field',
+        'dynamic-object/c', 'dynamic-place', 'dynamic-place*',
+        'dynamic-require', 'dynamic-require-for-syntax', 'dynamic-send',
+        'dynamic-set-field!', 'dynamic-wind', 'eighth', 'empty',
+        'empty-sequence', 'empty-stream', 'empty?',
+        'environment-variables-copy', 'environment-variables-names',
+        'environment-variables-ref', 'environment-variables-set!',
+        'environment-variables?', 'eof', 'eof-evt', 'eof-object?',
+        'ephemeron-value', 'ephemeron?', 'eprintf', 'eq-contract-val',
+        'eq-contract?', 'eq-hash-code', 'eq?', 'equal-contract-val',
+        'equal-contract?', 'equal-hash-code', 'equal-secondary-hash-code',
+        'equal<%>', 'equal?', 'equal?/recur', 'eqv-hash-code', 'eqv?', 'error',
+        'error-display-handler', 'error-escape-handler',
+        'error-print-context-length', 'error-print-source-location',
+        'error-print-width', 'error-value->string-handler', 'eval',
+        'eval-jit-enabled', 'eval-syntax', 'even?', 'evt/c', 'evt?',
+        'exact->inexact', 'exact-ceiling', 'exact-floor', 'exact-integer?',
+        'exact-nonnegative-integer?', 'exact-positive-integer?', 'exact-round',
+        'exact-truncate', 'exact?', 'executable-yield-handler', 'exit',
+        'exit-handler', 'exn', 'exn-continuation-marks', 'exn-message',
+        'exn:break', 'exn:break-continuation', 'exn:break:hang-up',
+        'exn:break:hang-up?', 'exn:break:terminate', 'exn:break:terminate?',
+        'exn:break?', 'exn:fail', 'exn:fail:contract',
+        'exn:fail:contract:arity', 'exn:fail:contract:arity?',
+        'exn:fail:contract:blame', 'exn:fail:contract:blame-object',
+        'exn:fail:contract:blame?', 'exn:fail:contract:continuation',
+        'exn:fail:contract:continuation?', 'exn:fail:contract:divide-by-zero',
+        'exn:fail:contract:divide-by-zero?',
+        'exn:fail:contract:non-fixnum-result',
+        'exn:fail:contract:non-fixnum-result?', 'exn:fail:contract:variable',
+        'exn:fail:contract:variable-id', 'exn:fail:contract:variable?',
+        'exn:fail:contract?', 'exn:fail:filesystem',
+        'exn:fail:filesystem:errno', 'exn:fail:filesystem:errno-errno',
+        'exn:fail:filesystem:errno?', 'exn:fail:filesystem:exists',
+        'exn:fail:filesystem:exists?', 'exn:fail:filesystem:missing-module',
+        'exn:fail:filesystem:missing-module-path',
+        'exn:fail:filesystem:missing-module?', 'exn:fail:filesystem:version',
+        'exn:fail:filesystem:version?', 'exn:fail:filesystem?',
+        'exn:fail:network', 'exn:fail:network:errno',
+        'exn:fail:network:errno-errno', 'exn:fail:network:errno?',
+        'exn:fail:network?', 'exn:fail:object', 'exn:fail:object?',
+        'exn:fail:out-of-memory', 'exn:fail:out-of-memory?', 'exn:fail:read',
+        'exn:fail:read-srclocs', 'exn:fail:read:eof', 'exn:fail:read:eof?',
+        'exn:fail:read:non-char', 'exn:fail:read:non-char?', 'exn:fail:read?',
+        'exn:fail:syntax', 'exn:fail:syntax-exprs',
+        'exn:fail:syntax:missing-module',
+        'exn:fail:syntax:missing-module-path',
+        'exn:fail:syntax:missing-module?', 'exn:fail:syntax:unbound',
+        'exn:fail:syntax:unbound?', 'exn:fail:syntax?', 'exn:fail:unsupported',
+        'exn:fail:unsupported?', 'exn:fail:user', 'exn:fail:user?',
+        'exn:fail?', 'exn:misc:match?', 'exn:missing-module-accessor',
+        'exn:missing-module?', 'exn:srclocs-accessor', 'exn:srclocs?', 'exn?',
+        'exp', 'expand', 'expand-once', 'expand-syntax', 'expand-syntax-once',
+        'expand-syntax-to-top-form', 'expand-to-top-form', 'expand-user-path',
+        'explode-path', 'expt', 'externalizable<%>', 'failure-result/c',
+        'false?', 'field-names', 'fifth', 'file->bytes', 'file->bytes-lines',
+        'file->lines', 'file->list', 'file->string', 'file->value',
+        'file-exists?', 'file-name-from-path', 'file-or-directory-identity',
+        'file-or-directory-modify-seconds', 'file-or-directory-permissions',
+        'file-position', 'file-position*', 'file-size',
+        'file-stream-buffer-mode', 'file-stream-port?', 'file-truncate',
+        'filename-extension', 'filesystem-change-evt',
+        'filesystem-change-evt-cancel', 'filesystem-change-evt?',
+        'filesystem-root-list', 'filter', 'filter-map', 'filter-not',
+        'filter-read-input-port', 'find-executable-path', 'find-files',
+        'find-library-collection-links', 'find-library-collection-paths',
+        'find-relative-path', 'find-system-path', 'findf', 'first',
+        'first-or/c', 'fixnum?', 'flat-contract', 'flat-contract-predicate',
+        'flat-contract-property?', 'flat-contract?', 'flat-named-contract',
+        'flatten', 'floating-point-bytes->real', 'flonum?', 'floor',
+        'flush-output', 'fold-files', 'foldl', 'foldr', 'for-each', 'force',
+        'format', 'fourth', 'fprintf', 'free-identifier=?',
+        'free-label-identifier=?', 'free-template-identifier=?',
+        'free-transformer-identifier=?', 'fsemaphore-count', 'fsemaphore-post',
+        'fsemaphore-try-wait?', 'fsemaphore-wait', 'fsemaphore?', 'future',
+        'future?', 'futures-enabled?', 'gcd', 'generate-member-key',
+        'generate-temporaries', 'generic-set?', 'generic?', 'gensym',
+        'get-output-bytes', 'get-output-string', 'get-preference',
+        'get/build-late-neg-projection', 'get/build-val-first-projection',
+        'getenv', 'global-port-print-handler', 'group-by', 'group-execute-bit',
+        'group-read-bit', 'group-write-bit', 'guard-evt', 'handle-evt',
+        'handle-evt?', 'has-blame?', 'has-contract?', 'hash', 'hash->list',
+        'hash-clear', 'hash-clear!', 'hash-copy', 'hash-copy-clear',
+        'hash-count', 'hash-empty?', 'hash-eq?', 'hash-equal?', 'hash-eqv?',
+        'hash-for-each', 'hash-has-key?', 'hash-iterate-first',
+        'hash-iterate-key', 'hash-iterate-key+value', 'hash-iterate-next',
+        'hash-iterate-pair', 'hash-iterate-value', 'hash-keys', 'hash-map',
+        'hash-placeholder?', 'hash-ref', 'hash-ref!', 'hash-remove',
+        'hash-remove!', 'hash-set', 'hash-set!', 'hash-set*', 'hash-set*!',
+        'hash-update', 'hash-update!', 'hash-values', 'hash-weak?', 'hash/c',
+        'hash?', 'hasheq', 'hasheqv', 'identifier-binding',
+        'identifier-binding-symbol', 'identifier-label-binding',
+        'identifier-prune-lexical-context',
+        'identifier-prune-to-source-module',
+        'identifier-remove-from-definition-context',
+        'identifier-template-binding', 'identifier-transformer-binding',
+        'identifier?', 'identity', 'if/c', 'imag-part', 'immutable?',
+        'impersonate-box', 'impersonate-channel',
+        'impersonate-continuation-mark-key', 'impersonate-hash',
+        'impersonate-hash-set', 'impersonate-procedure',
+        'impersonate-procedure*', 'impersonate-prompt-tag',
+        'impersonate-struct', 'impersonate-vector', 'impersonator-contract?',
+        'impersonator-ephemeron', 'impersonator-of?',
+        'impersonator-prop:application-mark', 'impersonator-prop:blame',
+        'impersonator-prop:contracted',
+        'impersonator-property-accessor-procedure?', 'impersonator-property?',
+        'impersonator?', 'implementation?', 'implementation?/c', 'in-bytes',
+        'in-bytes-lines', 'in-combinations', 'in-cycle', 'in-dict',
+        'in-dict-keys', 'in-dict-pairs', 'in-dict-values', 'in-directory',
+        'in-hash', 'in-hash-keys', 'in-hash-pairs', 'in-hash-values',
+        'in-immutable-hash', 'in-immutable-hash-keys',
+        'in-immutable-hash-pairs', 'in-immutable-hash-values',
+        'in-immutable-set', 'in-indexed', 'in-input-port-bytes',
+        'in-input-port-chars', 'in-lines', 'in-list', 'in-mlist',
+        'in-mutable-hash', 'in-mutable-hash-keys', 'in-mutable-hash-pairs',
+        'in-mutable-hash-values', 'in-mutable-set', 'in-naturals',
+        'in-parallel', 'in-permutations', 'in-port', 'in-producer', 'in-range',
+        'in-sequences', 'in-set', 'in-slice', 'in-stream', 'in-string',
+        'in-syntax', 'in-value', 'in-values*-sequence', 'in-values-sequence',
+        'in-vector', 'in-weak-hash', 'in-weak-hash-keys', 'in-weak-hash-pairs',
+        'in-weak-hash-values', 'in-weak-set', 'inexact->exact',
+        'inexact-real?', 'inexact?', 'infinite?', 'input-port-append',
+        'input-port?', 'inspector?', 'instanceof/c', 'integer->char',
+        'integer->integer-bytes', 'integer-bytes->integer', 'integer-in',
+        'integer-length', 'integer-sqrt', 'integer-sqrt/remainder', 'integer?',
+        'interface->method-names', 'interface-extension?', 'interface?',
+        'internal-definition-context-binding-identifiers',
+        'internal-definition-context-introduce',
+        'internal-definition-context-seal', 'internal-definition-context?',
+        'is-a?', 'is-a?/c', 'keyword->string', 'keyword-apply', 'keyword<?',
+        'keyword?', 'keywords-match', 'kill-thread', 'last', 'last-pair',
+        'lcm', 'length', 'liberal-define-context?', 'link-exists?', 'list',
+        'list*', 'list*of', 'list->bytes', 'list->mutable-set',
+        'list->mutable-seteq', 'list->mutable-seteqv', 'list->set',
+        'list->seteq', 'list->seteqv', 'list->string', 'list->vector',
+        'list->weak-set', 'list->weak-seteq', 'list->weak-seteqv',
+        'list-contract?', 'list-prefix?', 'list-ref', 'list-set', 'list-tail',
+        'list-update', 'list/c', 'list?', 'listen-port-number?', 'listof',
+        'load', 'load-extension', 'load-on-demand-enabled', 'load-relative',
+        'load-relative-extension', 'load/cd', 'load/use-compiled',
+        'local-expand', 'local-expand/capture-lifts',
+        'local-transformer-expand', 'local-transformer-expand/capture-lifts',
+        'locale-string-encoding', 'log', 'log-all-levels', 'log-level-evt',
+        'log-level?', 'log-max-level', 'log-message', 'log-receiver?',
+        'logger-name', 'logger?', 'magnitude', 'make-arity-at-least',
+        'make-base-empty-namespace', 'make-base-namespace', 'make-bytes',
+        'make-channel', 'make-chaperone-contract',
+        'make-continuation-mark-key', 'make-continuation-prompt-tag',
+        'make-contract', 'make-custodian', 'make-custodian-box',
+        'make-custom-hash', 'make-custom-hash-types', 'make-custom-set',
+        'make-custom-set-types', 'make-date', 'make-date*',
+        'make-derived-parameter', 'make-directory', 'make-directory*',
+        'make-do-sequence', 'make-empty-namespace',
+        'make-environment-variables', 'make-ephemeron', 'make-exn',
+        'make-exn:break', 'make-exn:break:hang-up', 'make-exn:break:terminate',
+        'make-exn:fail', 'make-exn:fail:contract',
+        'make-exn:fail:contract:arity', 'make-exn:fail:contract:blame',
+        'make-exn:fail:contract:continuation',
+        'make-exn:fail:contract:divide-by-zero',
+        'make-exn:fail:contract:non-fixnum-result',
+        'make-exn:fail:contract:variable', 'make-exn:fail:filesystem',
+        'make-exn:fail:filesystem:errno', 'make-exn:fail:filesystem:exists',
+        'make-exn:fail:filesystem:missing-module',
+        'make-exn:fail:filesystem:version', 'make-exn:fail:network',
+        'make-exn:fail:network:errno', 'make-exn:fail:object',
+        'make-exn:fail:out-of-memory', 'make-exn:fail:read',
+        'make-exn:fail:read:eof', 'make-exn:fail:read:non-char',
+        'make-exn:fail:syntax', 'make-exn:fail:syntax:missing-module',
+        'make-exn:fail:syntax:unbound', 'make-exn:fail:unsupported',
+        'make-exn:fail:user', 'make-file-or-directory-link',
+        'make-flat-contract', 'make-fsemaphore', 'make-generic',
+        'make-handle-get-preference-locked', 'make-hash',
+        'make-hash-placeholder', 'make-hasheq', 'make-hasheq-placeholder',
+        'make-hasheqv', 'make-hasheqv-placeholder',
+        'make-immutable-custom-hash', 'make-immutable-hash',
+        'make-immutable-hasheq', 'make-immutable-hasheqv',
+        'make-impersonator-property', 'make-input-port',
+        'make-input-port/read-to-peek', 'make-inspector',
+        'make-keyword-procedure', 'make-known-char-range-list',
+        'make-limited-input-port', 'make-list', 'make-lock-file-name',
+        'make-log-receiver', 'make-logger', 'make-mixin-contract',
+        'make-mutable-custom-set', 'make-none/c', 'make-object',
+        'make-output-port', 'make-parameter', 'make-parent-directory*',
+        'make-phantom-bytes', 'make-pipe', 'make-pipe-with-specials',
+        'make-placeholder', 'make-plumber', 'make-polar', 'make-prefab-struct',
+        'make-primitive-class', 'make-proj-contract',
+        'make-pseudo-random-generator', 'make-reader-graph', 'make-readtable',
+        'make-rectangular', 'make-rename-transformer',
+        'make-resolved-module-path', 'make-security-guard', 'make-semaphore',
+        'make-set!-transformer', 'make-shared-bytes', 'make-sibling-inspector',
+        'make-special-comment', 'make-srcloc', 'make-string',
+        'make-struct-field-accessor', 'make-struct-field-mutator',
+        'make-struct-type', 'make-struct-type-property',
+        'make-syntax-delta-introducer', 'make-syntax-introducer',
+        'make-temporary-file', 'make-tentative-pretty-print-output-port',
+        'make-thread-cell', 'make-thread-group', 'make-vector',
+        'make-weak-box', 'make-weak-custom-hash', 'make-weak-custom-set',
+        'make-weak-hash', 'make-weak-hasheq', 'make-weak-hasheqv',
+        'make-will-executor', 'map', 'match-equality-test',
+        'matches-arity-exactly?', 'max', 'mcar', 'mcdr', 'mcons', 'member',
+        'member-name-key-hash-code', 'member-name-key=?', 'member-name-key?',
+        'memf', 'memq', 'memv', 'merge-input', 'method-in-interface?', 'min',
+        'mixin-contract', 'module->exports', 'module->imports',
+        'module->language-info', 'module->namespace',
+        'module-compiled-cross-phase-persistent?', 'module-compiled-exports',
+        'module-compiled-imports', 'module-compiled-language-info',
+        'module-compiled-name', 'module-compiled-submodules',
+        'module-declared?', 'module-path-index-join',
+        'module-path-index-resolve', 'module-path-index-split',
+        'module-path-index-submodule', 'module-path-index?', 'module-path?',
+        'module-predefined?', 'module-provide-protected?', 'modulo', 'mpair?',
+        'mutable-set', 'mutable-seteq', 'mutable-seteqv', 'n->th',
+        'nack-guard-evt', 'namespace-anchor->empty-namespace',
+        'namespace-anchor->namespace', 'namespace-anchor?',
+        'namespace-attach-module', 'namespace-attach-module-declaration',
+        'namespace-base-phase', 'namespace-mapped-symbols',
+        'namespace-module-identifier', 'namespace-module-registry',
+        'namespace-require', 'namespace-require/constant',
+        'namespace-require/copy', 'namespace-require/expansion-time',
+        'namespace-set-variable-value!', 'namespace-symbol->identifier',
+        'namespace-syntax-introduce', 'namespace-undefine-variable!',
+        'namespace-unprotect-module', 'namespace-variable-value', 'namespace?',
+        'nan?', 'natural-number/c', 'negate', 'negative?', 'never-evt',
+        'new-∀/c', 'new-∃/c', 'newline', 'ninth', 'non-empty-listof',
+        'non-empty-string?', 'none/c', 'normal-case-path', 'normalize-arity',
+        'normalize-path', 'normalized-arity?', 'not', 'not/c', 'null', 'null?',
+        'number->string', 'number?', 'numerator', 'object%', 'object->vector',
+        'object-info', 'object-interface', 'object-method-arity-includes?',
+        'object-name', 'object-or-false=?', 'object=?', 'object?', 'odd?',
+        'one-of/c', 'open-input-bytes', 'open-input-file',
+        'open-input-output-file', 'open-input-string', 'open-output-bytes',
+        'open-output-file', 'open-output-nowhere', 'open-output-string',
+        'or/c', 'order-of-magnitude', 'ormap', 'other-execute-bit',
+        'other-read-bit', 'other-write-bit', 'output-port?', 'pair?',
+        'parameter-procedure=?', 'parameter/c', 'parameter?',
+        'parameterization?', 'parse-command-line', 'partition', 'path->bytes',
+        'path->complete-path', 'path->directory-path', 'path->string',
+        'path-add-suffix', 'path-convention-type', 'path-element->bytes',
+        'path-element->string', 'path-element?', 'path-for-some-system?',
+        'path-list-string->path-list', 'path-only', 'path-replace-suffix',
+        'path-string?', 'path<?', 'path?', 'pathlist-closure', 'peek-byte',
+        'peek-byte-or-special', 'peek-bytes', 'peek-bytes!', 'peek-bytes!-evt',
+        'peek-bytes-avail!', 'peek-bytes-avail!*', 'peek-bytes-avail!-evt',
+        'peek-bytes-avail!/enable-break', 'peek-bytes-evt', 'peek-char',
+        'peek-char-or-special', 'peek-string', 'peek-string!',
+        'peek-string!-evt', 'peek-string-evt', 'peeking-input-port',
+        'permutations', 'phantom-bytes?', 'pi', 'pi.f', 'pipe-content-length',
+        'place-break', 'place-channel', 'place-channel-get',
+        'place-channel-put', 'place-channel-put/get', 'place-channel?',
+        'place-dead-evt', 'place-enabled?', 'place-kill', 'place-location?',
+        'place-message-allowed?', 'place-sleep', 'place-wait', 'place?',
+        'placeholder-get', 'placeholder-set!', 'placeholder?',
+        'plumber-add-flush!', 'plumber-flush-all',
+        'plumber-flush-handle-remove!', 'plumber-flush-handle?', 'plumber?',
+        'poll-guard-evt', 'port->bytes', 'port->bytes-lines', 'port->lines',
+        'port->list', 'port->string', 'port-closed-evt', 'port-closed?',
+        'port-commit-peeked', 'port-count-lines!', 'port-count-lines-enabled',
+        'port-counts-lines?', 'port-display-handler', 'port-file-identity',
+        'port-file-unlock', 'port-next-location', 'port-number?',
+        'port-print-handler', 'port-progress-evt',
+        'port-provides-progress-evts?', 'port-read-handler',
+        'port-try-file-lock?', 'port-write-handler', 'port-writes-atomic?',
+        'port-writes-special?', 'port?', 'positive?', 'predicate/c',
+        'prefab-key->struct-type', 'prefab-key?', 'prefab-struct-key',
+        'preferences-lock-file-mode', 'pregexp', 'pregexp?', 'pretty-display',
+        'pretty-format', 'pretty-print', 'pretty-print-.-symbol-without-bars',
+        'pretty-print-abbreviate-read-macros', 'pretty-print-columns',
+        'pretty-print-current-style-table', 'pretty-print-depth',
+        'pretty-print-exact-as-decimal', 'pretty-print-extend-style-table',
+        'pretty-print-handler', 'pretty-print-newline',
+        'pretty-print-post-print-hook', 'pretty-print-pre-print-hook',
+        'pretty-print-print-hook', 'pretty-print-print-line',
+        'pretty-print-remap-stylable', 'pretty-print-show-inexactness',
+        'pretty-print-size-hook', 'pretty-print-style-table?',
+        'pretty-printing', 'pretty-write', 'primitive-closure?',
+        'primitive-result-arity', 'primitive?', 'print', 'print-as-expression',
+        'print-boolean-long-form', 'print-box', 'print-graph',
+        'print-hash-table', 'print-mpair-curly-braces',
+        'print-pair-curly-braces', 'print-reader-abbreviations',
+        'print-struct', 'print-syntax-width', 'print-unreadable',
+        'print-vector-length', 'printable/c', 'printable<%>', 'printf',
+        'println', 'procedure->method', 'procedure-arity',
+        'procedure-arity-includes/c', 'procedure-arity-includes?',
+        'procedure-arity?', 'procedure-closure-contents-eq?',
+        'procedure-extract-target', 'procedure-keywords',
+        'procedure-reduce-arity', 'procedure-reduce-keyword-arity',
+        'procedure-rename', 'procedure-result-arity', 'procedure-specialize',
+        'procedure-struct-type?', 'procedure?', 'process', 'process*',
+        'process*/ports', 'process/ports', 'processor-count', 'progress-evt?',
+        'promise-forced?', 'promise-running?', 'promise/c', 'promise/name?',
+        'promise?', 'prop:arity-string', 'prop:arrow-contract',
+        'prop:arrow-contract-get-info', 'prop:arrow-contract?', 'prop:blame',
+        'prop:chaperone-contract', 'prop:checked-procedure', 'prop:contract',
+        'prop:contracted', 'prop:custom-print-quotable', 'prop:custom-write',
+        'prop:dict', 'prop:dict/contract', 'prop:equal+hash', 'prop:evt',
+        'prop:exn:missing-module', 'prop:exn:srclocs',
+        'prop:expansion-contexts', 'prop:flat-contract',
+        'prop:impersonator-of', 'prop:input-port',
+        'prop:liberal-define-context', 'prop:object-name',
+        'prop:opt-chaperone-contract', 'prop:opt-chaperone-contract-get-test',
+        'prop:opt-chaperone-contract?', 'prop:orc-contract',
+        'prop:orc-contract-get-subcontracts', 'prop:orc-contract?',
+        'prop:output-port', 'prop:place-location', 'prop:procedure',
+        'prop:recursive-contract', 'prop:recursive-contract-unroll',
+        'prop:recursive-contract?', 'prop:rename-transformer', 'prop:sequence',
+        'prop:set!-transformer', 'prop:stream', 'proper-subset?',
+        'pseudo-random-generator->vector', 'pseudo-random-generator-vector?',
+        'pseudo-random-generator?', 'put-preferences', 'putenv', 'quotient',
+        'quotient/remainder', 'radians->degrees', 'raise',
+        'raise-argument-error', 'raise-arguments-error', 'raise-arity-error',
+        'raise-blame-error', 'raise-contract-error', 'raise-mismatch-error',
+        'raise-not-cons-blame-error', 'raise-range-error',
+        'raise-result-error', 'raise-syntax-error', 'raise-type-error',
+        'raise-user-error', 'random', 'random-seed', 'range', 'rational?',
+        'rationalize', 'read', 'read-accept-bar-quote', 'read-accept-box',
+        'read-accept-compiled', 'read-accept-dot', 'read-accept-graph',
+        'read-accept-infix-dot', 'read-accept-lang', 'read-accept-quasiquote',
+        'read-accept-reader', 'read-byte', 'read-byte-or-special',
+        'read-bytes', 'read-bytes!', 'read-bytes!-evt', 'read-bytes-avail!',
+        'read-bytes-avail!*', 'read-bytes-avail!-evt',
+        'read-bytes-avail!/enable-break', 'read-bytes-evt', 'read-bytes-line',
+        'read-bytes-line-evt', 'read-case-sensitive', 'read-cdot', 'read-char',
+        'read-char-or-special', 'read-curly-brace-as-paren',
+        'read-curly-brace-with-tag', 'read-decimal-as-inexact',
+        'read-eval-print-loop', 'read-language', 'read-line', 'read-line-evt',
+        'read-on-demand-source', 'read-square-bracket-as-paren',
+        'read-square-bracket-with-tag', 'read-string', 'read-string!',
+        'read-string!-evt', 'read-string-evt', 'read-syntax',
+        'read-syntax/recursive', 'read/recursive', 'readtable-mapping',
+        'readtable?', 'real->decimal-string', 'real->double-flonum',
+        'real->floating-point-bytes', 'real->single-flonum', 'real-in',
+        'real-part', 'real?', 'reencode-input-port', 'reencode-output-port',
+        'regexp', 'regexp-match', 'regexp-match*', 'regexp-match-evt',
+        'regexp-match-exact?', 'regexp-match-peek',
+        'regexp-match-peek-immediate', 'regexp-match-peek-positions',
+        'regexp-match-peek-positions*',
+        'regexp-match-peek-positions-immediate',
+        'regexp-match-peek-positions-immediate/end',
+        'regexp-match-peek-positions/end', 'regexp-match-positions',
+        'regexp-match-positions*', 'regexp-match-positions/end',
+        'regexp-match/end', 'regexp-match?', 'regexp-max-lookbehind',
+        'regexp-quote', 'regexp-replace', 'regexp-replace*',
+        'regexp-replace-quote', 'regexp-replaces', 'regexp-split',
+        'regexp-try-match', 'regexp?', 'relative-path?', 'relocate-input-port',
+        'relocate-output-port', 'remainder', 'remf', 'remf*', 'remove',
+        'remove*', 'remove-duplicates', 'remq', 'remq*', 'remv', 'remv*',
+        'rename-contract', 'rename-file-or-directory',
+        'rename-transformer-target', 'rename-transformer?', 'replace-evt',
+        'reroot-path', 'resolve-path', 'resolved-module-path-name',
+        'resolved-module-path?', 'rest', 'reverse', 'round', 'second',
+        'seconds->date', 'security-guard?', 'semaphore-peek-evt',
+        'semaphore-peek-evt?', 'semaphore-post', 'semaphore-try-wait?',
+        'semaphore-wait', 'semaphore-wait/enable-break', 'semaphore?',
+        'sequence->list', 'sequence->stream', 'sequence-add-between',
+        'sequence-andmap', 'sequence-append', 'sequence-count',
+        'sequence-filter', 'sequence-fold', 'sequence-for-each',
+        'sequence-generate', 'sequence-generate*', 'sequence-length',
+        'sequence-map', 'sequence-ormap', 'sequence-ref', 'sequence-tail',
+        'sequence/c', 'sequence?', 'set', 'set!-transformer-procedure',
+        'set!-transformer?', 'set->list', 'set->stream', 'set-add', 'set-add!',
+        'set-box!', 'set-clear', 'set-clear!', 'set-copy', 'set-copy-clear',
+        'set-count', 'set-empty?', 'set-eq?', 'set-equal?', 'set-eqv?',
+        'set-first', 'set-for-each', 'set-implements/c', 'set-implements?',
+        'set-intersect', 'set-intersect!', 'set-map', 'set-mcar!', 'set-mcdr!',
+        'set-member?', 'set-mutable?', 'set-phantom-bytes!',
+        'set-port-next-location!', 'set-remove', 'set-remove!', 'set-rest',
+        'set-some-basic-contracts!', 'set-subtract', 'set-subtract!',
+        'set-symmetric-difference', 'set-symmetric-difference!', 'set-union',
+        'set-union!', 'set-weak?', 'set/c', 'set=?', 'set?', 'seteq', 'seteqv',
+        'seventh', 'sgn', 'shared-bytes', 'shell-execute', 'shrink-path-wrt',
+        'shuffle', 'simple-form-path', 'simplify-path', 'sin',
+        'single-flonum?', 'sinh', 'sixth', 'skip-projection-wrapper?', 'sleep',
+        'some-system-path->string', 'sort', 'special-comment-value',
+        'special-comment?', 'special-filter-input-port', 'split-at',
+        'split-at-right', 'split-common-prefix', 'split-path', 'splitf-at',
+        'splitf-at-right', 'sqr', 'sqrt', 'srcloc', 'srcloc->string',
+        'srcloc-column', 'srcloc-line', 'srcloc-position', 'srcloc-source',
+        'srcloc-span', 'srcloc?', 'stop-after', 'stop-before', 'stream->list',
+        'stream-add-between', 'stream-andmap', 'stream-append', 'stream-count',
+        'stream-empty?', 'stream-filter', 'stream-first', 'stream-fold',
+        'stream-for-each', 'stream-length', 'stream-map', 'stream-ormap',
+        'stream-ref', 'stream-rest', 'stream-tail', 'stream/c', 'stream?',
+        'string', 'string->bytes/latin-1', 'string->bytes/locale',
+        'string->bytes/utf-8', 'string->immutable-string', 'string->keyword',
+        'string->list', 'string->number', 'string->path',
+        'string->path-element', 'string->some-system-path', 'string->symbol',
+        'string->uninterned-symbol', 'string->unreadable-symbol',
+        'string-append', 'string-append*', 'string-ci<=?', 'string-ci<?',
+        'string-ci=?', 'string-ci>=?', 'string-ci>?', 'string-contains?',
+        'string-copy', 'string-copy!', 'string-downcase',
+        'string-environment-variable-name?', 'string-fill!', 'string-foldcase',
+        'string-join', 'string-len/c', 'string-length', 'string-locale-ci<?',
+        'string-locale-ci=?', 'string-locale-ci>?', 'string-locale-downcase',
+        'string-locale-upcase', 'string-locale<?', 'string-locale=?',
+        'string-locale>?', 'string-no-nuls?', 'string-normalize-nfc',
+        'string-normalize-nfd', 'string-normalize-nfkc',
+        'string-normalize-nfkd', 'string-normalize-spaces', 'string-port?',
+        'string-prefix?', 'string-ref', 'string-replace', 'string-set!',
+        'string-split', 'string-suffix?', 'string-titlecase', 'string-trim',
+        'string-upcase', 'string-utf-8-length', 'string<=?', 'string<?',
+        'string=?', 'string>=?', 'string>?', 'string?', 'struct->vector',
+        'struct-accessor-procedure?', 'struct-constructor-procedure?',
+        'struct-info', 'struct-mutator-procedure?',
+        'struct-predicate-procedure?', 'struct-type-info',
+        'struct-type-make-constructor', 'struct-type-make-predicate',
+        'struct-type-property-accessor-procedure?', 'struct-type-property/c',
+        'struct-type-property?', 'struct-type?', 'struct:arity-at-least',
+        'struct:arrow-contract-info', 'struct:date', 'struct:date*',
+        'struct:exn', 'struct:exn:break', 'struct:exn:break:hang-up',
+        'struct:exn:break:terminate', 'struct:exn:fail',
+        'struct:exn:fail:contract', 'struct:exn:fail:contract:arity',
+        'struct:exn:fail:contract:blame',
+        'struct:exn:fail:contract:continuation',
+        'struct:exn:fail:contract:divide-by-zero',
+        'struct:exn:fail:contract:non-fixnum-result',
+        'struct:exn:fail:contract:variable', 'struct:exn:fail:filesystem',
+        'struct:exn:fail:filesystem:errno',
+        'struct:exn:fail:filesystem:exists',
+        'struct:exn:fail:filesystem:missing-module',
+        'struct:exn:fail:filesystem:version', 'struct:exn:fail:network',
+        'struct:exn:fail:network:errno', 'struct:exn:fail:object',
+        'struct:exn:fail:out-of-memory', 'struct:exn:fail:read',
+        'struct:exn:fail:read:eof', 'struct:exn:fail:read:non-char',
+        'struct:exn:fail:syntax', 'struct:exn:fail:syntax:missing-module',
+        'struct:exn:fail:syntax:unbound', 'struct:exn:fail:unsupported',
+        'struct:exn:fail:user', 'struct:srcloc',
+        'struct:wrapped-extra-arg-arrow', 'struct?', 'sub1', 'subbytes',
+        'subclass?', 'subclass?/c', 'subprocess', 'subprocess-group-enabled',
+        'subprocess-kill', 'subprocess-pid', 'subprocess-status',
+        'subprocess-wait', 'subprocess?', 'subset?', 'substring', 'suggest/c',
+        'symbol->string', 'symbol-interned?', 'symbol-unreadable?', 'symbol<?',
+        'symbol=?', 'symbol?', 'symbols', 'sync', 'sync/enable-break',
+        'sync/timeout', 'sync/timeout/enable-break', 'syntax->datum',
+        'syntax->list', 'syntax-arm', 'syntax-column', 'syntax-debug-info',
+        'syntax-disarm', 'syntax-e', 'syntax-line',
+        'syntax-local-bind-syntaxes', 'syntax-local-certifier',
+        'syntax-local-context', 'syntax-local-expand-expression',
+        'syntax-local-get-shadower', 'syntax-local-identifier-as-binding',
+        'syntax-local-introduce', 'syntax-local-lift-context',
+        'syntax-local-lift-expression', 'syntax-local-lift-module',
+        'syntax-local-lift-module-end-declaration',
+        'syntax-local-lift-provide', 'syntax-local-lift-require',
+        'syntax-local-lift-values-expression',
+        'syntax-local-make-definition-context',
+        'syntax-local-make-delta-introducer',
+        'syntax-local-module-defined-identifiers',
+        'syntax-local-module-exports',
+        'syntax-local-module-required-identifiers', 'syntax-local-name',
+        'syntax-local-phase-level', 'syntax-local-submodules',
+        'syntax-local-transforming-module-provides?', 'syntax-local-value',
+        'syntax-local-value/immediate', 'syntax-original?', 'syntax-position',
+        'syntax-property', 'syntax-property-preserved?',
+        'syntax-property-symbol-keys', 'syntax-protect', 'syntax-rearm',
+        'syntax-recertify', 'syntax-shift-phase-level', 'syntax-source',
+        'syntax-source-module', 'syntax-span', 'syntax-taint',
+        'syntax-tainted?', 'syntax-track-origin',
+        'syntax-transforming-module-expression?',
+        'syntax-transforming-with-lifts?', 'syntax-transforming?', 'syntax/c',
+        'syntax?', 'system', 'system*', 'system*/exit-code',
+        'system-big-endian?', 'system-idle-evt', 'system-language+country',
+        'system-library-subpath', 'system-path-convention-type', 'system-type',
+        'system/exit-code', 'tail-marks-match?', 'take', 'take-common-prefix',
+        'take-right', 'takef', 'takef-right', 'tan', 'tanh',
+        'tcp-abandon-port', 'tcp-accept', 'tcp-accept-evt',
+        'tcp-accept-ready?', 'tcp-accept/enable-break', 'tcp-addresses',
+        'tcp-close', 'tcp-connect', 'tcp-connect/enable-break', 'tcp-listen',
+        'tcp-listener?', 'tcp-port?', 'tentative-pretty-print-port-cancel',
+        'tentative-pretty-print-port-transfer', 'tenth', 'terminal-port?',
+        'the-unsupplied-arg', 'third', 'thread', 'thread-cell-ref',
+        'thread-cell-set!', 'thread-cell-values?', 'thread-cell?',
+        'thread-dead-evt', 'thread-dead?', 'thread-group?', 'thread-receive',
+        'thread-receive-evt', 'thread-resume', 'thread-resume-evt',
+        'thread-rewind-receive', 'thread-running?', 'thread-send',
+        'thread-suspend', 'thread-suspend-evt', 'thread-try-receive',
+        'thread-wait', 'thread/suspend-to-kill', 'thread?', 'time-apply',
+        'touch', 'transplant-input-port', 'transplant-output-port', 'true',
+        'truncate', 'udp-addresses', 'udp-bind!', 'udp-bound?', 'udp-close',
+        'udp-connect!', 'udp-connected?', 'udp-multicast-interface',
+        'udp-multicast-join-group!', 'udp-multicast-leave-group!',
+        'udp-multicast-loopback?', 'udp-multicast-set-interface!',
+        'udp-multicast-set-loopback!', 'udp-multicast-set-ttl!',
+        'udp-multicast-ttl', 'udp-open-socket', 'udp-receive!',
+        'udp-receive!*', 'udp-receive!-evt', 'udp-receive!/enable-break',
+        'udp-receive-ready-evt', 'udp-send', 'udp-send*', 'udp-send-evt',
+        'udp-send-ready-evt', 'udp-send-to', 'udp-send-to*', 'udp-send-to-evt',
+        'udp-send-to/enable-break', 'udp-send/enable-break', 'udp?', 'unbox',
+        'uncaught-exception-handler', 'unit?', 'unspecified-dom',
+        'unsupplied-arg?', 'use-collection-link-paths',
+        'use-compiled-file-paths', 'use-user-specific-search-paths',
+        'user-execute-bit', 'user-read-bit', 'user-write-bit', 'value-blame',
+        'value-contract', 'values', 'variable-reference->empty-namespace',
+        'variable-reference->module-base-phase',
+        'variable-reference->module-declaration-inspector',
+        'variable-reference->module-path-index',
+        'variable-reference->module-source', 'variable-reference->namespace',
+        'variable-reference->phase',
+        'variable-reference->resolved-module-path',
+        'variable-reference-constant?', 'variable-reference?', 'vector',
+        'vector->immutable-vector', 'vector->list',
+        'vector->pseudo-random-generator', 'vector->pseudo-random-generator!',
+        'vector->values', 'vector-append', 'vector-argmax', 'vector-argmin',
+        'vector-copy', 'vector-copy!', 'vector-count', 'vector-drop',
+        'vector-drop-right', 'vector-fill!', 'vector-filter',
+        'vector-filter-not', 'vector-immutable', 'vector-immutable/c',
+        'vector-immutableof', 'vector-length', 'vector-map', 'vector-map!',
+        'vector-member', 'vector-memq', 'vector-memv', 'vector-ref',
+        'vector-set!', 'vector-set*!', 'vector-set-performance-stats!',
+        'vector-split-at', 'vector-split-at-right', 'vector-take',
+        'vector-take-right', 'vector/c', 'vector?', 'vectorof', 'version',
+        'void', 'void?', 'weak-box-value', 'weak-box?', 'weak-set',
+        'weak-seteq', 'weak-seteqv', 'will-execute', 'will-executor?',
+        'will-register', 'will-try-execute', 'with-input-from-bytes',
+        'with-input-from-file', 'with-input-from-string',
+        'with-output-to-bytes', 'with-output-to-file', 'with-output-to-string',
+        'would-be-future', 'wrap-evt', 'wrapped-extra-arg-arrow',
+        'wrapped-extra-arg-arrow-extra-neg-party-argument',
+        'wrapped-extra-arg-arrow-real-func', 'wrapped-extra-arg-arrow?',
+        'writable<%>', 'write', 'write-byte', 'write-bytes',
+        'write-bytes-avail', 'write-bytes-avail*', 'write-bytes-avail-evt',
+        'write-bytes-avail/enable-break', 'write-char', 'write-special',
+        'write-special-avail*', 'write-special-evt', 'write-string',
+        'write-to-file', 'writeln', 'xor', 'zero?', '~.a', '~.s', '~.v', '~a',
+        '~e', '~r', '~s', '~v'
+    )
+
+    _opening_parenthesis = r'[([{]'
+    _closing_parenthesis = r'[)\]}]'
+    _delimiters = r'()[\]{}",\'`;\s'
+    _symbol = rf'(?:\|[^|]*\||\\[\w\W]|[^|\\{_delimiters}]+)+'
+    _exact_decimal_prefix = r'(?:#e)?(?:#d)?(?:#e)?'
+    _exponent = r'(?:[defls][-+]?\d+)'
+    _inexact_simple_no_hashes = r'(?:\d+(?:/\d+|\.\d*)?|\.\d+)'
+    _inexact_simple = (rf'(?:{_inexact_simple_no_hashes}|(?:\d+#+(?:\.#*|/\d+#*)?|\.\d+#+|'
+                       r'\d+(?:\.\d*#+|/\d+#+)))')
+    _inexact_normal_no_hashes = rf'(?:{_inexact_simple_no_hashes}{_exponent}?)'
+    _inexact_normal = rf'(?:{_inexact_simple}{_exponent}?)'
+    _inexact_special = r'(?:(?:inf|nan)\.[0f])'
+    _inexact_real = rf'(?:[-+]?{_inexact_normal}|[-+]{_inexact_special})'
+    _inexact_unsigned = rf'(?:{_inexact_normal}|{_inexact_special})'
+
+    tokens = {
+        'root': [
+            (_closing_parenthesis, Error),
+            (r'(?!\Z)', Text, 'unquoted-datum')
+        ],
+        'datum': [
+            (r'(?s)#;|#![ /]([^\\\n]|\\.)*', Comment),
+            (r';[^\n\r\x85\u2028\u2029]*', Comment.Single),
+            (r'#\|', Comment.Multiline, 'block-comment'),
+
+            # Whitespaces
+            (r'(?u)\s+', Whitespace),
+
+            # Numbers: Keep in mind Racket reader hash prefixes, which
+            # can denote the base or the type. These don't map neatly
+            # onto Pygments token types; some judgment calls here.
+
+            # #d or no prefix
+            (rf'(?i){_exact_decimal_prefix}[-+]?\d+(?=[{_delimiters}])',
+             Number.Integer, '#pop'),
+            (rf'(?i){_exact_decimal_prefix}[-+]?(\d+(\.\d*)?|\.\d+)([deflst][-+]?\d+)?(?=[{_delimiters}])', Number.Float, '#pop'),
+            (rf'(?i){_exact_decimal_prefix}[-+]?({_inexact_normal_no_hashes}([-+]{_inexact_normal_no_hashes}?i)?|[-+]{_inexact_normal_no_hashes}?i)(?=[{_delimiters}])', Number, '#pop'),
+
+            # Inexact without explicit #i
+            (rf'(?i)(#d)?({_inexact_real}([-+]{_inexact_unsigned}?i)?|[-+]{_inexact_unsigned}?i|{_inexact_real}@{_inexact_real})(?=[{_delimiters}])', Number.Float,
+             '#pop'),
+
+            # The remaining extflonums
+            (rf'(?i)(([-+]?{_inexact_simple}t[-+]?\d+)|[-+](inf|nan)\.t)(?=[{_delimiters}])', Number.Float, '#pop'),
+
+            # #b
+            (rf'(?iu)(#[ei])?#b{_symbol}', Number.Bin, '#pop'),
+
+            # #o
+            (rf'(?iu)(#[ei])?#o{_symbol}', Number.Oct, '#pop'),
+
+            # #x
+            (rf'(?iu)(#[ei])?#x{_symbol}', Number.Hex, '#pop'),
+
+            # #i is always inexact, i.e. float
+            (rf'(?iu)(#d)?#i{_symbol}', Number.Float, '#pop'),
+
+            # Strings and characters
+            (r'#?"', String.Double, ('#pop', 'string')),
+            (r'#<<(.+)\n(^(?!\1$).*$\n)*^\1$', String.Heredoc, '#pop'),
+            (r'#\\(u[\da-fA-F]{1,4}|U[\da-fA-F]{1,8})', String.Char, '#pop'),
+            (r'(?is)#\\([0-7]{3}|[a-z]+|.)', String.Char, '#pop'),
+            (r'(?s)#[pr]x#?"(\\?.)*?"', String.Regex, '#pop'),
+
+            # Constants
+            (r'#(true|false|[tTfF])', Name.Constant, '#pop'),
+
+            # Keyword argument names (e.g. #:keyword)
+            (rf'#:{_symbol}', Keyword.Declaration, '#pop'),
+
+            # Reader extensions
+            (r'(#lang |#!)(\S+)',
+             bygroups(Keyword.Namespace, Name.Namespace)),
+            (r'#reader', Keyword.Namespace, 'quoted-datum'),
+
+            # Other syntax
+            (rf"(?i)\.(?=[{_delimiters}])|#c[is]|#['`]|#,@?", Operator),
+            (rf"'|#[s&]|#hash(eqv?)?|#\d*(?={_opening_parenthesis})",
+             Operator, ('#pop', 'quoted-datum'))
+        ],
+        'datum*': [
+            (r'`|,@?', Operator),
+            (_symbol, String.Symbol, '#pop'),
+            (r'[|\\]', Error),
+            default('#pop')
+        ],
+        'list': [
+            (_closing_parenthesis, Punctuation, '#pop')
+        ],
+        'unquoted-datum': [
+            include('datum'),
+            (rf'quote(?=[{_delimiters}])', Keyword,
+             ('#pop', 'quoted-datum')),
+            (r'`', Operator, ('#pop', 'quasiquoted-datum')),
+            (rf'quasiquote(?=[{_delimiters}])', Keyword,
+             ('#pop', 'quasiquoted-datum')),
+            (_opening_parenthesis, Punctuation, ('#pop', 'unquoted-list')),
+            (words(_keywords, suffix=f'(?=[{_delimiters}])'),
+             Keyword, '#pop'),
+            (words(_builtins, suffix=f'(?=[{_delimiters}])'),
+             Name.Builtin, '#pop'),
+            (_symbol, Name, '#pop'),
+            include('datum*')
+        ],
+        'unquoted-list': [
+            include('list'),
+            (r'(?!\Z)', Text, 'unquoted-datum')
+        ],
+        'quasiquoted-datum': [
+            include('datum'),
+            (r',@?', Operator, ('#pop', 'unquoted-datum')),
+            (rf'unquote(-splicing)?(?=[{_delimiters}])', Keyword,
+             ('#pop', 'unquoted-datum')),
+            (_opening_parenthesis, Punctuation, ('#pop', 'quasiquoted-list')),
+            include('datum*')
+        ],
+        'quasiquoted-list': [
+            include('list'),
+            (r'(?!\Z)', Text, 'quasiquoted-datum')
+        ],
+        'quoted-datum': [
+            include('datum'),
+            (_opening_parenthesis, Punctuation, ('#pop', 'quoted-list')),
+            include('datum*')
+        ],
+        'quoted-list': [
+            include('list'),
+            (r'(?!\Z)', Text, 'quoted-datum')
+        ],
+        'block-comment': [
+            (r'#\|', Comment.Multiline, '#push'),
+            (r'\|#', Comment.Multiline, '#pop'),
+            (r'[^#|]+|.', Comment.Multiline)
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'(?s)\\([0-7]{1,3}|x[\da-fA-F]{1,2}|u[\da-fA-F]{1,4}|'
+             r'U[\da-fA-F]{1,8}|.)', String.Escape),
+            (r'[^\\"]+', String.Double)
+        ]
+    }
+
+
+class NewLispLexer(RegexLexer):
+    """
+    For newLISP source code (version 10.3.0).
+    """
+
+    name = 'NewLisp'
+    url = 'http://www.newlisp.org/'
+    aliases = ['newlisp']
+    filenames = ['*.lsp', '*.nl', '*.kif']
+    mimetypes = ['text/x-newlisp', 'application/x-newlisp']
+    version_added = '1.5'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    # list of built-in functions for newLISP version 10.3
+    builtins = (
+        '^', '--', '-', ':', '!', '!=', '?', '@', '*', '/', '&', '%', '+', '++',
+        '<', '<<', '<=', '=', '>', '>=', '>>', '|', '~', '$', '$0', '$1', '$10',
+        '$11', '$12', '$13', '$14', '$15', '$2', '$3', '$4', '$5', '$6', '$7',
+        '$8', '$9', '$args', '$idx', '$it', '$main-args', 'abort', 'abs',
+        'acos', 'acosh', 'add', 'address', 'amb', 'and',  'append-file',
+        'append', 'apply', 'args', 'array-list', 'array?', 'array', 'asin',
+        'asinh', 'assoc', 'atan', 'atan2', 'atanh', 'atom?', 'base64-dec',
+        'base64-enc', 'bayes-query', 'bayes-train', 'begin',
+        'beta', 'betai', 'bind', 'binomial', 'bits', 'callback',
+        'case', 'catch', 'ceil', 'change-dir', 'char', 'chop', 'Class', 'clean',
+        'close', 'command-event', 'cond', 'cons', 'constant',
+        'context?', 'context', 'copy-file', 'copy', 'cos', 'cosh', 'count',
+        'cpymem', 'crc32', 'crit-chi2', 'crit-z', 'current-line', 'curry',
+        'date-list', 'date-parse', 'date-value', 'date', 'debug', 'dec',
+        'def-new', 'default', 'define-macro', 'define',
+        'delete-file', 'delete-url', 'delete', 'destroy', 'det', 'device',
+        'difference', 'directory?', 'directory', 'div', 'do-until', 'do-while',
+        'doargs',  'dolist',  'dostring', 'dotimes',  'dotree', 'dump', 'dup',
+        'empty?', 'encrypt', 'ends-with', 'env', 'erf', 'error-event',
+        'eval-string', 'eval', 'exec', 'exists', 'exit', 'exp', 'expand',
+        'explode', 'extend', 'factor', 'fft', 'file-info', 'file?', 'filter',
+        'find-all', 'find', 'first', 'flat', 'float?', 'float', 'floor', 'flt',
+        'fn', 'for-all', 'for', 'fork', 'format', 'fv', 'gammai', 'gammaln',
+        'gcd', 'get-char', 'get-float', 'get-int', 'get-long', 'get-string',
+        'get-url', 'global?', 'global', 'if-not', 'if', 'ifft', 'import', 'inc',
+        'index', 'inf?', 'int', 'integer?', 'integer', 'intersect', 'invert',
+        'irr', 'join', 'lambda-macro', 'lambda?', 'lambda', 'last-error',
+        'last', 'legal?', 'length', 'let', 'letex', 'letn',
+        'list?', 'list', 'load', 'local', 'log', 'lookup',
+        'lower-case', 'macro?', 'main-args', 'MAIN', 'make-dir', 'map', 'mat',
+        'match', 'max', 'member', 'min', 'mod', 'module', 'mul', 'multiply',
+        'NaN?', 'net-accept', 'net-close', 'net-connect', 'net-error',
+        'net-eval', 'net-interface', 'net-ipv', 'net-listen', 'net-local',
+        'net-lookup', 'net-packet', 'net-peek', 'net-peer', 'net-ping',
+        'net-receive-from', 'net-receive-udp', 'net-receive', 'net-select',
+        'net-send-to', 'net-send-udp', 'net-send', 'net-service',
+        'net-sessions', 'new', 'nil?', 'nil', 'normal', 'not', 'now', 'nper',
+        'npv', 'nth', 'null?', 'number?', 'open', 'or', 'ostype', 'pack',
+        'parse-date', 'parse', 'peek', 'pipe', 'pmt', 'pop-assoc', 'pop',
+        'post-url', 'pow', 'prefix', 'pretty-print', 'primitive?', 'print',
+        'println', 'prob-chi2', 'prob-z', 'process', 'prompt-event',
+        'protected?', 'push', 'put-url', 'pv', 'quote?', 'quote', 'rand',
+        'random', 'randomize', 'read', 'read-char', 'read-expr', 'read-file',
+        'read-key', 'read-line', 'read-utf8', 'reader-event',
+        'real-path', 'receive', 'ref-all', 'ref', 'regex-comp', 'regex',
+        'remove-dir', 'rename-file', 'replace', 'reset', 'rest', 'reverse',
+        'rotate', 'round', 'save', 'search', 'seed', 'seek', 'select', 'self',
+        'semaphore', 'send', 'sequence', 'series', 'set-locale', 'set-ref-all',
+        'set-ref', 'set', 'setf',  'setq', 'sgn', 'share', 'signal', 'silent',
+        'sin', 'sinh', 'sleep', 'slice', 'sort', 'source', 'spawn', 'sqrt',
+        'starts-with', 'string?', 'string', 'sub', 'swap', 'sym', 'symbol?',
+        'symbols', 'sync', 'sys-error', 'sys-info', 'tan', 'tanh', 'term',
+        'throw-error', 'throw', 'time-of-day', 'time', 'timer', 'title-case',
+        'trace-highlight', 'trace', 'transpose', 'Tree', 'trim', 'true?',
+        'true', 'unicode', 'unify', 'unique', 'unless', 'unpack', 'until',
+        'upper-case', 'utf8', 'utf8len', 'uuid', 'wait-pid', 'when', 'while',
+        'write', 'write-char', 'write-file', 'write-line',
+        'xfer-event', 'xml-error', 'xml-parse', 'xml-type-tags', 'zero?',
+    )
+
+    # valid names
+    valid_name = r'([\w!$%&*+.,/<=>?@^~|-])+|(\[.*?\])+'
+
+    tokens = {
+        'root': [
+            # shebang
+            (r'#!(.*?)$', Comment.Preproc),
+            # comments starting with semicolon
+            (r';.*$', Comment.Single),
+            # comments starting with #
+            (r'#.*$', Comment.Single),
+
+            # whitespace
+            (r'\s+', Whitespace),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+
+            # braces
+            (r'\{', String, "bracestring"),
+
+            # [text] ... [/text] delimited strings
+            (r'\[text\]*', String, "tagstring"),
+
+            # 'special' operators...
+            (r"('|:)", Operator),
+
+            # highlight the builtins
+            (words(builtins, suffix=r'\b'),
+             Keyword),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Variable),
+
+            # the remaining variables
+            (valid_name, String.Symbol),
+
+            # parentheses
+            (r'(\(|\))', Punctuation),
+        ],
+
+        # braced strings...
+        'bracestring': [
+            (r'\{', String, "#push"),
+            (r'\}', String, "#pop"),
+            ('[^{}]+', String),
+        ],
+
+        # tagged [text]...[/text] delimited strings...
+        'tagstring': [
+            (r'(?s)(.*?)(\[/text\])', String, '#pop'),
+        ],
+    }
+
+
+class EmacsLispLexer(RegexLexer):
+    """
+    An ELisp lexer, parsing a stream and outputting the tokens
+    needed to highlight elisp code.
+    """
+    name = 'EmacsLisp'
+    aliases = ['emacs-lisp', 'elisp', 'emacs']
+    filenames = ['*.el']
+    mimetypes = ['text/x-elisp', 'application/x-elisp']
+    url = 'https://www.gnu.org/software/emacs'
+    version_added = '2.1'
+
+    flags = re.MULTILINE
+
+    # couple of useful regexes
+
+    # characters that are not macro-characters and can be used to begin a symbol
+    nonmacro = r'\\.|[\w!$%&*+-/<=>?@^{}~|]'
+    constituent = nonmacro + '|[#.:]'
+    terminated = r'(?=[ "()\]\'\n,;`])'  # whitespace or terminating macro characters
+
+    # symbol token, reverse-engineered from hyperspec
+    # Take a deep breath...
+    symbol = rf'((?:{nonmacro})(?:{constituent})*)'
+
+    macros = {
+        'atomic-change-group', 'case', 'block', 'cl-block', 'cl-callf', 'cl-callf2',
+        'cl-case', 'cl-decf', 'cl-declaim', 'cl-declare',
+        'cl-define-compiler-macro', 'cl-defmacro', 'cl-defstruct',
+        'cl-defsubst', 'cl-deftype', 'cl-defun', 'cl-destructuring-bind',
+        'cl-do', 'cl-do*', 'cl-do-all-symbols', 'cl-do-symbols', 'cl-dolist',
+        'cl-dotimes', 'cl-ecase', 'cl-etypecase', 'eval-when', 'cl-eval-when', 'cl-flet',
+        'cl-flet*', 'cl-function', 'cl-incf', 'cl-labels', 'cl-letf',
+        'cl-letf*', 'cl-load-time-value', 'cl-locally', 'cl-loop',
+        'cl-macrolet', 'cl-multiple-value-bind', 'cl-multiple-value-setq',
+        'cl-progv', 'cl-psetf', 'cl-psetq', 'cl-pushnew', 'cl-remf',
+        'cl-return', 'cl-return-from', 'cl-rotatef', 'cl-shiftf',
+        'cl-symbol-macrolet', 'cl-tagbody', 'cl-the', 'cl-typecase',
+        'combine-after-change-calls', 'condition-case-unless-debug', 'decf',
+        'declaim', 'declare', 'declare-function', 'def-edebug-spec',
+        'defadvice', 'defclass', 'defcustom', 'defface', 'defgeneric',
+        'defgroup', 'define-advice', 'define-alternatives',
+        'define-compiler-macro', 'define-derived-mode', 'define-generic-mode',
+        'define-global-minor-mode', 'define-globalized-minor-mode',
+        'define-minor-mode', 'define-modify-macro',
+        'define-obsolete-face-alias', 'define-obsolete-function-alias',
+        'define-obsolete-variable-alias', 'define-setf-expander',
+        'define-skeleton', 'defmacro', 'defmethod', 'defsetf', 'defstruct',
+        'defsubst', 'deftheme', 'deftype', 'defun', 'defvar-local',
+        'delay-mode-hooks', 'destructuring-bind', 'do', 'do*',
+        'do-all-symbols', 'do-symbols', 'dolist', 'dont-compile', 'dotimes',
+        'dotimes-with-progress-reporter', 'ecase', 'ert-deftest', 'etypecase',
+        'eval-and-compile', 'eval-when-compile', 'flet', 'ignore-errors',
+        'incf', 'labels', 'lambda', 'letrec', 'lexical-let', 'lexical-let*',
+        'loop', 'multiple-value-bind', 'multiple-value-setq', 'noreturn',
+        'oref', 'oref-default', 'oset', 'oset-default', 'pcase',
+        'pcase-defmacro', 'pcase-dolist', 'pcase-exhaustive', 'pcase-let',
+        'pcase-let*', 'pop', 'psetf', 'psetq', 'push', 'pushnew', 'remf',
+        'return', 'rotatef', 'rx', 'save-match-data', 'save-selected-window',
+        'save-window-excursion', 'setf', 'setq-local', 'shiftf',
+        'track-mouse', 'typecase', 'unless', 'use-package', 'when',
+        'while-no-input', 'with-case-table', 'with-category-table',
+        'with-coding-priority', 'with-current-buffer', 'with-demoted-errors',
+        'with-eval-after-load', 'with-file-modes', 'with-local-quit',
+        'with-output-to-string', 'with-output-to-temp-buffer',
+        'with-parsed-tramp-file-name', 'with-selected-frame',
+        'with-selected-window', 'with-silent-modifications', 'with-slots',
+        'with-syntax-table', 'with-temp-buffer', 'with-temp-file',
+        'with-temp-message', 'with-timeout', 'with-tramp-connection-property',
+        'with-tramp-file-property', 'with-tramp-progress-reporter',
+        'with-wrapper-hook', 'load-time-value', 'locally', 'macrolet', 'progv',
+        'return-from',
+    }
+
+    special_forms = {
+        'and', 'catch', 'cond', 'condition-case', 'defconst', 'defvar',
+        'function', 'if', 'interactive', 'let', 'let*', 'or', 'prog1',
+        'prog2', 'progn', 'quote', 'save-current-buffer', 'save-excursion',
+        'save-restriction', 'setq', 'setq-default', 'subr-arity',
+        'unwind-protect', 'while',
+    }
+
+    builtin_function = {
+        '%', '*', '+', '-', '/', '/=', '1+', '1-', '<', '<=', '=', '>', '>=',
+        'Snarf-documentation', 'abort-recursive-edit', 'abs',
+        'accept-process-output', 'access-file', 'accessible-keymaps', 'acos',
+        'active-minibuffer-window', 'add-face-text-property',
+        'add-name-to-file', 'add-text-properties', 'all-completions',
+        'append', 'apply', 'apropos-internal', 'aref', 'arrayp', 'aset',
+        'ash', 'asin', 'assoc', 'assoc-string', 'assq', 'atan', 'atom',
+        'autoload', 'autoload-do-load', 'backtrace', 'backtrace--locals',
+        'backtrace-debug', 'backtrace-eval', 'backtrace-frame',
+        'backward-char', 'backward-prefix-chars', 'barf-if-buffer-read-only',
+        'base64-decode-region', 'base64-decode-string',
+        'base64-encode-region', 'base64-encode-string', 'beginning-of-line',
+        'bidi-find-overridden-directionality', 'bidi-resolved-levels',
+        'bitmap-spec-p', 'bobp', 'bolp', 'bool-vector',
+        'bool-vector-count-consecutive', 'bool-vector-count-population',
+        'bool-vector-exclusive-or', 'bool-vector-intersection',
+        'bool-vector-not', 'bool-vector-p', 'bool-vector-set-difference',
+        'bool-vector-subsetp', 'bool-vector-union', 'boundp',
+        'buffer-base-buffer', 'buffer-chars-modified-tick',
+        'buffer-enable-undo', 'buffer-file-name', 'buffer-has-markers-at',
+        'buffer-list', 'buffer-live-p', 'buffer-local-value',
+        'buffer-local-variables', 'buffer-modified-p', 'buffer-modified-tick',
+        'buffer-name', 'buffer-size', 'buffer-string', 'buffer-substring',
+        'buffer-substring-no-properties', 'buffer-swap-text', 'bufferp',
+        'bury-buffer-internal', 'byte-code', 'byte-code-function-p',
+        'byte-to-position', 'byte-to-string', 'byteorder',
+        'call-interactively', 'call-last-kbd-macro', 'call-process',
+        'call-process-region', 'cancel-kbd-macro-events', 'capitalize',
+        'capitalize-region', 'capitalize-word', 'car', 'car-less-than-car',
+        'car-safe', 'case-table-p', 'category-docstring',
+        'category-set-mnemonics', 'category-table', 'category-table-p',
+        'ccl-execute', 'ccl-execute-on-string', 'ccl-program-p', 'cdr',
+        'cdr-safe', 'ceiling', 'char-after', 'char-before',
+        'char-category-set', 'char-charset', 'char-equal', 'char-or-string-p',
+        'char-resolve-modifiers', 'char-syntax', 'char-table-extra-slot',
+        'char-table-p', 'char-table-parent', 'char-table-range',
+        'char-table-subtype', 'char-to-string', 'char-width', 'characterp',
+        'charset-after', 'charset-id-internal', 'charset-plist',
+        'charset-priority-list', 'charsetp', 'check-coding-system',
+        'check-coding-systems-region', 'clear-buffer-auto-save-failure',
+        'clear-charset-maps', 'clear-face-cache', 'clear-font-cache',
+        'clear-image-cache', 'clear-string', 'clear-this-command-keys',
+        'close-font', 'clrhash', 'coding-system-aliases',
+        'coding-system-base', 'coding-system-eol-type', 'coding-system-p',
+        'coding-system-plist', 'coding-system-priority-list',
+        'coding-system-put', 'color-distance', 'color-gray-p',
+        'color-supported-p', 'combine-after-change-execute',
+        'command-error-default-function', 'command-remapping', 'commandp',
+        'compare-buffer-substrings', 'compare-strings',
+        'compare-window-configurations', 'completing-read',
+        'compose-region-internal', 'compose-string-internal',
+        'composition-get-gstring', 'compute-motion', 'concat', 'cons',
+        'consp', 'constrain-to-field', 'continue-process',
+        'controlling-tty-p', 'coordinates-in-window-p', 'copy-alist',
+        'copy-category-table', 'copy-file', 'copy-hash-table', 'copy-keymap',
+        'copy-marker', 'copy-sequence', 'copy-syntax-table', 'copysign',
+        'cos', 'current-active-maps', 'current-bidi-paragraph-direction',
+        'current-buffer', 'current-case-table', 'current-column',
+        'current-global-map', 'current-idle-time', 'current-indentation',
+        'current-input-mode', 'current-local-map', 'current-message',
+        'current-minor-mode-maps', 'current-time', 'current-time-string',
+        'current-time-zone', 'current-window-configuration',
+        'cygwin-convert-file-name-from-windows',
+        'cygwin-convert-file-name-to-windows', 'daemon-initialized',
+        'daemonp', 'dbus--init-bus', 'dbus-get-unique-name',
+        'dbus-message-internal', 'debug-timer-check', 'declare-equiv-charset',
+        'decode-big5-char', 'decode-char', 'decode-coding-region',
+        'decode-coding-string', 'decode-sjis-char', 'decode-time',
+        'default-boundp', 'default-file-modes', 'default-printer-name',
+        'default-toplevel-value', 'default-value', 'define-category',
+        'define-charset-alias', 'define-charset-internal',
+        'define-coding-system-alias', 'define-coding-system-internal',
+        'define-fringe-bitmap', 'define-hash-table-test', 'define-key',
+        'define-prefix-command', 'delete',
+        'delete-all-overlays', 'delete-and-extract-region', 'delete-char',
+        'delete-directory-internal', 'delete-field', 'delete-file',
+        'delete-frame', 'delete-other-windows-internal', 'delete-overlay',
+        'delete-process', 'delete-region', 'delete-terminal',
+        'delete-window-internal', 'delq', 'describe-buffer-bindings',
+        'describe-vector', 'destroy-fringe-bitmap', 'detect-coding-region',
+        'detect-coding-string', 'ding', 'directory-file-name',
+        'directory-files', 'directory-files-and-attributes', 'discard-input',
+        'display-supports-face-attributes-p', 'do-auto-save', 'documentation',
+        'documentation-property', 'downcase', 'downcase-region',
+        'downcase-word', 'draw-string', 'dump-colors', 'dump-emacs',
+        'dump-face', 'dump-frame-glyph-matrix', 'dump-glyph-matrix',
+        'dump-glyph-row', 'dump-redisplay-history', 'dump-tool-bar-row',
+        'elt', 'emacs-pid', 'encode-big5-char', 'encode-char',
+        'encode-coding-region', 'encode-coding-string', 'encode-sjis-char',
+        'encode-time', 'end-kbd-macro', 'end-of-line', 'eobp', 'eolp', 'eq',
+        'eql', 'equal', 'equal-including-properties', 'erase-buffer',
+        'error-message-string', 'eval', 'eval-buffer', 'eval-region',
+        'event-convert-list', 'execute-kbd-macro', 'exit-recursive-edit',
+        'exp', 'expand-file-name', 'expt', 'external-debugging-output',
+        'face-attribute-relative-p', 'face-attributes-as-vector', 'face-font',
+        'fboundp', 'fceiling', 'fetch-bytecode', 'ffloor',
+        'field-beginning', 'field-end', 'field-string',
+        'field-string-no-properties', 'file-accessible-directory-p',
+        'file-acl', 'file-attributes', 'file-attributes-lessp',
+        'file-directory-p', 'file-executable-p', 'file-exists-p',
+        'file-locked-p', 'file-modes', 'file-name-absolute-p',
+        'file-name-all-completions', 'file-name-as-directory',
+        'file-name-completion', 'file-name-directory',
+        'file-name-nondirectory', 'file-newer-than-file-p', 'file-readable-p',
+        'file-regular-p', 'file-selinux-context', 'file-symlink-p',
+        'file-system-info', 'file-system-info', 'file-writable-p',
+        'fillarray', 'find-charset-region', 'find-charset-string',
+        'find-coding-systems-region-internal', 'find-composition-internal',
+        'find-file-name-handler', 'find-font', 'find-operation-coding-system',
+        'float', 'float-time', 'floatp', 'floor', 'fmakunbound',
+        'following-char', 'font-at', 'font-drive-otf', 'font-face-attributes',
+        'font-family-list', 'font-get', 'font-get-glyphs',
+        'font-get-system-font', 'font-get-system-normal-font', 'font-info',
+        'font-match-p', 'font-otf-alternates', 'font-put',
+        'font-shape-gstring', 'font-spec', 'font-variation-glyphs',
+        'font-xlfd-name', 'fontp', 'fontset-font', 'fontset-info',
+        'fontset-list', 'fontset-list-all', 'force-mode-line-update',
+        'force-window-update', 'format', 'format-mode-line',
+        'format-network-address', 'format-time-string', 'forward-char',
+        'forward-comment', 'forward-line', 'forward-word',
+        'frame-border-width', 'frame-bottom-divider-width',
+        'frame-can-run-window-configuration-change-hook', 'frame-char-height',
+        'frame-char-width', 'frame-face-alist', 'frame-first-window',
+        'frame-focus', 'frame-font-cache', 'frame-fringe-width', 'frame-list',
+        'frame-live-p', 'frame-or-buffer-changed-p', 'frame-parameter',
+        'frame-parameters', 'frame-pixel-height', 'frame-pixel-width',
+        'frame-pointer-visible-p', 'frame-right-divider-width',
+        'frame-root-window', 'frame-scroll-bar-height',
+        'frame-scroll-bar-width', 'frame-selected-window', 'frame-terminal',
+        'frame-text-cols', 'frame-text-height', 'frame-text-lines',
+        'frame-text-width', 'frame-total-cols', 'frame-total-lines',
+        'frame-visible-p', 'framep', 'frexp', 'fringe-bitmaps-at-pos',
+        'fround', 'fset', 'ftruncate', 'funcall', 'funcall-interactively',
+        'function-equal', 'functionp', 'gap-position', 'gap-size',
+        'garbage-collect', 'gc-status', 'generate-new-buffer-name', 'get',
+        'get-buffer', 'get-buffer-create', 'get-buffer-process',
+        'get-buffer-window', 'get-byte', 'get-char-property',
+        'get-char-property-and-overlay', 'get-file-buffer', 'get-file-char',
+        'get-internal-run-time', 'get-load-suffixes', 'get-pos-property',
+        'get-process', 'get-screen-color', 'get-text-property',
+        'get-unicode-property-internal', 'get-unused-category',
+        'get-unused-iso-final-char', 'getenv-internal', 'gethash',
+        'gfile-add-watch', 'gfile-rm-watch', 'global-key-binding',
+        'gnutls-available-p', 'gnutls-boot', 'gnutls-bye', 'gnutls-deinit',
+        'gnutls-error-fatalp', 'gnutls-error-string', 'gnutls-errorp',
+        'gnutls-get-initstage', 'gnutls-peer-status',
+        'gnutls-peer-status-warning-describe', 'goto-char', 'gpm-mouse-start',
+        'gpm-mouse-stop', 'group-gid', 'group-real-gid',
+        'handle-save-session', 'handle-switch-frame', 'hash-table-count',
+        'hash-table-p', 'hash-table-rehash-size',
+        'hash-table-rehash-threshold', 'hash-table-size', 'hash-table-test',
+        'hash-table-weakness', 'iconify-frame', 'identity', 'image-flush',
+        'image-mask-p', 'image-metadata', 'image-size', 'imagemagick-types',
+        'imagep', 'indent-to', 'indirect-function', 'indirect-variable',
+        'init-image-library', 'inotify-add-watch', 'inotify-rm-watch',
+        'input-pending-p', 'insert', 'insert-and-inherit',
+        'insert-before-markers', 'insert-before-markers-and-inherit',
+        'insert-buffer-substring', 'insert-byte', 'insert-char',
+        'insert-file-contents', 'insert-startup-screen', 'int86',
+        'integer-or-marker-p', 'integerp', 'interactive-form', 'intern',
+        'intern-soft', 'internal--track-mouse', 'internal-char-font',
+        'internal-complete-buffer', 'internal-copy-lisp-face',
+        'internal-default-process-filter',
+        'internal-default-process-sentinel', 'internal-describe-syntax-value',
+        'internal-event-symbol-parse-modifiers',
+        'internal-face-x-get-resource', 'internal-get-lisp-face-attribute',
+        'internal-lisp-face-attribute-values', 'internal-lisp-face-empty-p',
+        'internal-lisp-face-equal-p', 'internal-lisp-face-p',
+        'internal-make-lisp-face', 'internal-make-var-non-special',
+        'internal-merge-in-global-face',
+        'internal-set-alternative-font-family-alist',
+        'internal-set-alternative-font-registry-alist',
+        'internal-set-font-selection-order',
+        'internal-set-lisp-face-attribute',
+        'internal-set-lisp-face-attribute-from-resource',
+        'internal-show-cursor', 'internal-show-cursor-p', 'interrupt-process',
+        'invisible-p', 'invocation-directory', 'invocation-name', 'isnan',
+        'iso-charset', 'key-binding', 'key-description',
+        'keyboard-coding-system', 'keymap-parent', 'keymap-prompt', 'keymapp',
+        'keywordp', 'kill-all-local-variables', 'kill-buffer', 'kill-emacs',
+        'kill-local-variable', 'kill-process', 'last-nonminibuffer-frame',
+        'lax-plist-get', 'lax-plist-put', 'ldexp', 'length',
+        'libxml-parse-html-region', 'libxml-parse-xml-region',
+        'line-beginning-position', 'line-end-position', 'line-pixel-height',
+        'list', 'list-fonts', 'list-system-processes', 'listp', 'load',
+        'load-average', 'local-key-binding', 'local-variable-if-set-p',
+        'local-variable-p', 'locale-info', 'locate-file-internal',
+        'lock-buffer', 'log', 'logand', 'logb', 'logior', 'lognot', 'logxor',
+        'looking-at', 'lookup-image', 'lookup-image-map', 'lookup-key',
+        'lower-frame', 'lsh', 'macroexpand', 'make-bool-vector',
+        'make-byte-code', 'make-category-set', 'make-category-table',
+        'make-char', 'make-char-table', 'make-directory-internal',
+        'make-frame-invisible', 'make-frame-visible', 'make-hash-table',
+        'make-indirect-buffer', 'make-keymap', 'make-list',
+        'make-local-variable', 'make-marker', 'make-network-process',
+        'make-overlay', 'make-serial-process', 'make-sparse-keymap',
+        'make-string', 'make-symbol', 'make-symbolic-link', 'make-temp-name',
+        'make-terminal-frame', 'make-variable-buffer-local',
+        'make-variable-frame-local', 'make-vector', 'makunbound',
+        'map-char-table', 'map-charset-chars', 'map-keymap',
+        'map-keymap-internal', 'mapatoms', 'mapc', 'mapcar', 'mapconcat',
+        'maphash', 'mark-marker', 'marker-buffer', 'marker-insertion-type',
+        'marker-position', 'markerp', 'match-beginning', 'match-data',
+        'match-end', 'matching-paren', 'max', 'max-char', 'md5', 'member',
+        'memory-info', 'memory-limit', 'memory-use-counts', 'memq', 'memql',
+        'menu-bar-menu-at-x-y', 'menu-or-popup-active-p',
+        'menu-or-popup-active-p', 'merge-face-attribute', 'message',
+        'message-box', 'message-or-box', 'min',
+        'minibuffer-completion-contents', 'minibuffer-contents',
+        'minibuffer-contents-no-properties', 'minibuffer-depth',
+        'minibuffer-prompt', 'minibuffer-prompt-end',
+        'minibuffer-selected-window', 'minibuffer-window', 'minibufferp',
+        'minor-mode-key-binding', 'mod', 'modify-category-entry',
+        'modify-frame-parameters', 'modify-syntax-entry',
+        'mouse-pixel-position', 'mouse-position', 'move-overlay',
+        'move-point-visually', 'move-to-column', 'move-to-window-line',
+        'msdos-downcase-filename', 'msdos-long-file-names', 'msdos-memget',
+        'msdos-memput', 'msdos-mouse-disable', 'msdos-mouse-enable',
+        'msdos-mouse-init', 'msdos-mouse-p', 'msdos-remember-default-colors',
+        'msdos-set-keyboard', 'msdos-set-mouse-buttons',
+        'multibyte-char-to-unibyte', 'multibyte-string-p', 'narrow-to-region',
+        'natnump', 'nconc', 'network-interface-info',
+        'network-interface-list', 'new-fontset', 'newline-cache-check',
+        'next-char-property-change', 'next-frame', 'next-overlay-change',
+        'next-property-change', 'next-read-file-uses-dialog-p',
+        'next-single-char-property-change', 'next-single-property-change',
+        'next-window', 'nlistp', 'nreverse', 'nth', 'nthcdr', 'null',
+        'number-or-marker-p', 'number-to-string', 'numberp',
+        'open-dribble-file', 'open-font', 'open-termscript',
+        'optimize-char-table', 'other-buffer', 'other-window-for-scrolling',
+        'overlay-buffer', 'overlay-end', 'overlay-get', 'overlay-lists',
+        'overlay-properties', 'overlay-put', 'overlay-recenter',
+        'overlay-start', 'overlayp', 'overlays-at', 'overlays-in',
+        'parse-partial-sexp', 'play-sound-internal', 'plist-get',
+        'plist-member', 'plist-put', 'point', 'point-marker', 'point-max',
+        'point-max-marker', 'point-min', 'point-min-marker',
+        'pos-visible-in-window-p', 'position-bytes', 'posix-looking-at',
+        'posix-search-backward', 'posix-search-forward', 'posix-string-match',
+        'posn-at-point', 'posn-at-x-y', 'preceding-char',
+        'prefix-numeric-value', 'previous-char-property-change',
+        'previous-frame', 'previous-overlay-change',
+        'previous-property-change', 'previous-single-char-property-change',
+        'previous-single-property-change', 'previous-window', 'prin1',
+        'prin1-to-string', 'princ', 'print', 'process-attributes',
+        'process-buffer', 'process-coding-system', 'process-command',
+        'process-connection', 'process-contact', 'process-datagram-address',
+        'process-exit-status', 'process-filter', 'process-filter-multibyte-p',
+        'process-id', 'process-inherit-coding-system-flag', 'process-list',
+        'process-mark', 'process-name', 'process-plist',
+        'process-query-on-exit-flag', 'process-running-child-p',
+        'process-send-eof', 'process-send-region', 'process-send-string',
+        'process-sentinel', 'process-status', 'process-tty-name',
+        'process-type', 'processp', 'profiler-cpu-log',
+        'profiler-cpu-running-p', 'profiler-cpu-start', 'profiler-cpu-stop',
+        'profiler-memory-log', 'profiler-memory-running-p',
+        'profiler-memory-start', 'profiler-memory-stop', 'propertize',
+        'purecopy', 'put', 'put-text-property',
+        'put-unicode-property-internal', 'puthash', 'query-font',
+        'query-fontset', 'quit-process', 'raise-frame', 'random', 'rassoc',
+        'rassq', 're-search-backward', 're-search-forward', 'read',
+        'read-buffer', 'read-char', 'read-char-exclusive',
+        'read-coding-system', 'read-command', 'read-event',
+        'read-from-minibuffer', 'read-from-string', 'read-function',
+        'read-key-sequence', 'read-key-sequence-vector',
+        'read-no-blanks-input', 'read-non-nil-coding-system', 'read-string',
+        'read-variable', 'recent-auto-save-p', 'recent-doskeys',
+        'recent-keys', 'recenter', 'recursion-depth', 'recursive-edit',
+        'redirect-debugging-output', 'redirect-frame-focus', 'redisplay',
+        'redraw-display', 'redraw-frame', 'regexp-quote', 'region-beginning',
+        'region-end', 'register-ccl-program', 'register-code-conversion-map',
+        'remhash', 'remove-list-of-text-properties', 'remove-text-properties',
+        'rename-buffer', 'rename-file', 'replace-match',
+        'reset-this-command-lengths', 'resize-mini-window-internal',
+        'restore-buffer-modified-p', 'resume-tty', 'reverse', 'round',
+        'run-hook-with-args', 'run-hook-with-args-until-failure',
+        'run-hook-with-args-until-success', 'run-hook-wrapped', 'run-hooks',
+        'run-window-configuration-change-hook', 'run-window-scroll-functions',
+        'safe-length', 'scan-lists', 'scan-sexps', 'scroll-down',
+        'scroll-left', 'scroll-other-window', 'scroll-right', 'scroll-up',
+        'search-backward', 'search-forward', 'secure-hash', 'select-frame',
+        'select-window', 'selected-frame', 'selected-window',
+        'self-insert-command', 'send-string-to-terminal', 'sequencep',
+        'serial-process-configure', 'set', 'set-buffer',
+        'set-buffer-auto-saved', 'set-buffer-major-mode',
+        'set-buffer-modified-p', 'set-buffer-multibyte', 'set-case-table',
+        'set-category-table', 'set-char-table-extra-slot',
+        'set-char-table-parent', 'set-char-table-range', 'set-charset-plist',
+        'set-charset-priority', 'set-coding-system-priority',
+        'set-cursor-size', 'set-default', 'set-default-file-modes',
+        'set-default-toplevel-value', 'set-file-acl', 'set-file-modes',
+        'set-file-selinux-context', 'set-file-times', 'set-fontset-font',
+        'set-frame-height', 'set-frame-position', 'set-frame-selected-window',
+        'set-frame-size', 'set-frame-width', 'set-fringe-bitmap-face',
+        'set-input-interrupt-mode', 'set-input-meta-mode', 'set-input-mode',
+        'set-keyboard-coding-system-internal', 'set-keymap-parent',
+        'set-marker', 'set-marker-insertion-type', 'set-match-data',
+        'set-message-beep', 'set-minibuffer-window',
+        'set-mouse-pixel-position', 'set-mouse-position',
+        'set-network-process-option', 'set-output-flow-control',
+        'set-process-buffer', 'set-process-coding-system',
+        'set-process-datagram-address', 'set-process-filter',
+        'set-process-filter-multibyte',
+        'set-process-inherit-coding-system-flag', 'set-process-plist',
+        'set-process-query-on-exit-flag', 'set-process-sentinel',
+        'set-process-window-size', 'set-quit-char',
+        'set-safe-terminal-coding-system-internal', 'set-screen-color',
+        'set-standard-case-table', 'set-syntax-table',
+        'set-terminal-coding-system-internal', 'set-terminal-local-value',
+        'set-terminal-parameter', 'set-text-properties', 'set-time-zone-rule',
+        'set-visited-file-modtime', 'set-window-buffer',
+        'set-window-combination-limit', 'set-window-configuration',
+        'set-window-dedicated-p', 'set-window-display-table',
+        'set-window-fringes', 'set-window-hscroll', 'set-window-margins',
+        'set-window-new-normal', 'set-window-new-pixel',
+        'set-window-new-total', 'set-window-next-buffers',
+        'set-window-parameter', 'set-window-point', 'set-window-prev-buffers',
+        'set-window-redisplay-end-trigger', 'set-window-scroll-bars',
+        'set-window-start', 'set-window-vscroll', 'setcar', 'setcdr',
+        'setplist', 'show-face-resources', 'signal', 'signal-process', 'sin',
+        'single-key-description', 'skip-chars-backward', 'skip-chars-forward',
+        'skip-syntax-backward', 'skip-syntax-forward', 'sleep-for', 'sort',
+        'sort-charsets', 'special-variable-p', 'split-char',
+        'split-window-internal', 'sqrt', 'standard-case-table',
+        'standard-category-table', 'standard-syntax-table', 'start-kbd-macro',
+        'start-process', 'stop-process', 'store-kbd-macro-event', 'string',
+        'string=', 'string<', 'string>', 'string-as-multibyte',
+        'string-as-unibyte', 'string-bytes', 'string-collate-equalp',
+        'string-collate-lessp', 'string-equal', 'string-greaterp',
+        'string-lessp', 'string-make-multibyte', 'string-make-unibyte',
+        'string-match', 'string-to-char', 'string-to-multibyte',
+        'string-to-number', 'string-to-syntax', 'string-to-unibyte',
+        'string-width', 'stringp', 'subr-name', 'subrp',
+        'subst-char-in-region', 'substitute-command-keys',
+        'substitute-in-file-name', 'substring', 'substring-no-properties',
+        'suspend-emacs', 'suspend-tty', 'suspicious-object', 'sxhash',
+        'symbol-function', 'symbol-name', 'symbol-plist', 'symbol-value',
+        'symbolp', 'syntax-table', 'syntax-table-p', 'system-groups',
+        'system-move-file-to-trash', 'system-name', 'system-users', 'tan',
+        'terminal-coding-system', 'terminal-list', 'terminal-live-p',
+        'terminal-local-value', 'terminal-name', 'terminal-parameter',
+        'terminal-parameters', 'terpri', 'test-completion',
+        'text-char-description', 'text-properties-at', 'text-property-any',
+        'text-property-not-all', 'this-command-keys',
+        'this-command-keys-vector', 'this-single-command-keys',
+        'this-single-command-raw-keys', 'time-add', 'time-less-p',
+        'time-subtract', 'tool-bar-get-system-style', 'tool-bar-height',
+        'tool-bar-pixel-width', 'top-level', 'trace-redisplay',
+        'trace-to-stderr', 'translate-region-internal', 'transpose-regions',
+        'truncate', 'try-completion', 'tty-display-color-cells',
+        'tty-display-color-p', 'tty-no-underline',
+        'tty-suppress-bold-inverse-default-colors', 'tty-top-frame',
+        'tty-type', 'type-of', 'undo-boundary', 'unencodable-char-position',
+        'unhandled-file-name-directory', 'unibyte-char-to-multibyte',
+        'unibyte-string', 'unicode-property-table-internal', 'unify-charset',
+        'unintern', 'unix-sync', 'unlock-buffer', 'upcase', 'upcase-initials',
+        'upcase-initials-region', 'upcase-region', 'upcase-word',
+        'use-global-map', 'use-local-map', 'user-full-name',
+        'user-login-name', 'user-real-login-name', 'user-real-uid',
+        'user-uid', 'variable-binding-locus', 'vconcat', 'vector',
+        'vector-or-char-table-p', 'vectorp', 'verify-visited-file-modtime',
+        'vertical-motion', 'visible-frame-list', 'visited-file-modtime',
+        'w16-get-clipboard-data', 'w16-selection-exists-p',
+        'w16-set-clipboard-data', 'w32-battery-status',
+        'w32-default-color-map', 'w32-define-rgb-color',
+        'w32-display-monitor-attributes-list', 'w32-frame-menu-bar-size',
+        'w32-frame-rect', 'w32-get-clipboard-data',
+        'w32-get-codepage-charset', 'w32-get-console-codepage',
+        'w32-get-console-output-codepage', 'w32-get-current-locale-id',
+        'w32-get-default-locale-id', 'w32-get-keyboard-layout',
+        'w32-get-locale-info', 'w32-get-valid-codepages',
+        'w32-get-valid-keyboard-layouts', 'w32-get-valid-locale-ids',
+        'w32-has-winsock', 'w32-long-file-name', 'w32-reconstruct-hot-key',
+        'w32-register-hot-key', 'w32-registered-hot-keys',
+        'w32-selection-exists-p', 'w32-send-sys-command',
+        'w32-set-clipboard-data', 'w32-set-console-codepage',
+        'w32-set-console-output-codepage', 'w32-set-current-locale',
+        'w32-set-keyboard-layout', 'w32-set-process-priority',
+        'w32-shell-execute', 'w32-short-file-name', 'w32-toggle-lock-key',
+        'w32-unload-winsock', 'w32-unregister-hot-key', 'w32-window-exists-p',
+        'w32notify-add-watch', 'w32notify-rm-watch',
+        'waiting-for-user-input-p', 'where-is-internal', 'widen',
+        'widget-apply', 'widget-get', 'widget-put',
+        'window-absolute-pixel-edges', 'window-at', 'window-body-height',
+        'window-body-width', 'window-bottom-divider-width', 'window-buffer',
+        'window-combination-limit', 'window-configuration-frame',
+        'window-configuration-p', 'window-dedicated-p',
+        'window-display-table', 'window-edges', 'window-end', 'window-frame',
+        'window-fringes', 'window-header-line-height', 'window-hscroll',
+        'window-inside-absolute-pixel-edges', 'window-inside-edges',
+        'window-inside-pixel-edges', 'window-left-child',
+        'window-left-column', 'window-line-height', 'window-list',
+        'window-list-1', 'window-live-p', 'window-margins',
+        'window-minibuffer-p', 'window-mode-line-height', 'window-new-normal',
+        'window-new-pixel', 'window-new-total', 'window-next-buffers',
+        'window-next-sibling', 'window-normal-size', 'window-old-point',
+        'window-parameter', 'window-parameters', 'window-parent',
+        'window-pixel-edges', 'window-pixel-height', 'window-pixel-left',
+        'window-pixel-top', 'window-pixel-width', 'window-point',
+        'window-prev-buffers', 'window-prev-sibling',
+        'window-redisplay-end-trigger', 'window-resize-apply',
+        'window-resize-apply-total', 'window-right-divider-width',
+        'window-scroll-bar-height', 'window-scroll-bar-width',
+        'window-scroll-bars', 'window-start', 'window-system',
+        'window-text-height', 'window-text-pixel-size', 'window-text-width',
+        'window-top-child', 'window-top-line', 'window-total-height',
+        'window-total-width', 'window-use-time', 'window-valid-p',
+        'window-vscroll', 'windowp', 'write-char', 'write-region',
+        'x-backspace-delete-keys-p', 'x-change-window-property',
+        'x-change-window-property', 'x-close-connection',
+        'x-close-connection', 'x-create-frame', 'x-create-frame',
+        'x-delete-window-property', 'x-delete-window-property',
+        'x-disown-selection-internal', 'x-display-backing-store',
+        'x-display-backing-store', 'x-display-color-cells',
+        'x-display-color-cells', 'x-display-grayscale-p',
+        'x-display-grayscale-p', 'x-display-list', 'x-display-list',
+        'x-display-mm-height', 'x-display-mm-height', 'x-display-mm-width',
+        'x-display-mm-width', 'x-display-monitor-attributes-list',
+        'x-display-pixel-height', 'x-display-pixel-height',
+        'x-display-pixel-width', 'x-display-pixel-width', 'x-display-planes',
+        'x-display-planes', 'x-display-save-under', 'x-display-save-under',
+        'x-display-screens', 'x-display-screens', 'x-display-visual-class',
+        'x-display-visual-class', 'x-family-fonts', 'x-file-dialog',
+        'x-file-dialog', 'x-file-dialog', 'x-focus-frame', 'x-frame-geometry',
+        'x-frame-geometry', 'x-get-atom-name', 'x-get-resource',
+        'x-get-selection-internal', 'x-hide-tip', 'x-hide-tip',
+        'x-list-fonts', 'x-load-color-file', 'x-menu-bar-open-internal',
+        'x-menu-bar-open-internal', 'x-open-connection', 'x-open-connection',
+        'x-own-selection-internal', 'x-parse-geometry', 'x-popup-dialog',
+        'x-popup-menu', 'x-register-dnd-atom', 'x-select-font',
+        'x-select-font', 'x-selection-exists-p', 'x-selection-owner-p',
+        'x-send-client-message', 'x-server-max-request-size',
+        'x-server-max-request-size', 'x-server-vendor', 'x-server-vendor',
+        'x-server-version', 'x-server-version', 'x-show-tip', 'x-show-tip',
+        'x-synchronize', 'x-synchronize', 'x-uses-old-gtk-dialog',
+        'x-window-property', 'x-window-property', 'x-wm-set-size-hint',
+        'xw-color-defined-p', 'xw-color-defined-p', 'xw-color-values',
+        'xw-color-values', 'xw-display-color-p', 'xw-display-color-p',
+        'yes-or-no-p', 'zlib-available-p', 'zlib-decompress-region',
+        'forward-point',
+    }
+
+    builtin_function_highlighted = {
+        'defvaralias', 'provide', 'require',
+        'with-no-warnings', 'define-widget', 'with-electric-help',
+        'throw', 'defalias', 'featurep'
+    }
+
+    lambda_list_keywords = {
+        '&allow-other-keys', '&aux', '&body', '&environment', '&key', '&optional',
+        '&rest', '&whole',
+    }
+
+    error_keywords = {
+        'cl-assert', 'cl-check-type', 'error', 'signal',
+        'user-error', 'warn',
+    }
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name.Variable:
+                if value in EmacsLispLexer.builtin_function:
+                    yield index, Name.Function, value
+                    continue
+                if value in EmacsLispLexer.special_forms:
+                    yield index, Keyword, value
+                    continue
+                if value in EmacsLispLexer.error_keywords:
+                    yield index, Name.Exception, value
+                    continue
+                if value in EmacsLispLexer.builtin_function_highlighted:
+                    yield index, Name.Builtin, value
+                    continue
+                if value in EmacsLispLexer.macros:
+                    yield index, Name.Builtin, value
+                    continue
+                if value in EmacsLispLexer.lambda_list_keywords:
+                    yield index, Keyword.Pseudo, value
+                    continue
+            yield index, token, value
+
+    tokens = {
+        'root': [
+            default('body'),
+        ],
+        'body': [
+            # whitespace
+            (r'\s+', Whitespace),
+
+            # single-line comment
+            (r';.*$', Comment.Single),
+
+            # strings and characters
+            (r'"', String, 'string'),
+            (r'\?([^\\]|\\.)', String.Char),
+            # quoting
+            (r":" + symbol, Name.Builtin),
+            (r"::" + symbol, String.Symbol),
+            (r"'" + symbol, String.Symbol),
+            (r"'", Operator),
+            (r"`", Operator),
+
+            # decimal numbers
+            (r'[-+]?\d+\.?' + terminated, Number.Integer),
+            (r'[-+]?\d+/\d+' + terminated, Number),
+            (r'[-+]?(\d*\.\d+([defls][-+]?\d+)?|\d+(\.\d*)?[defls][-+]?\d+)' +
+             terminated, Number.Float),
+
+            # vectors
+            (r'\[|\]', Punctuation),
+
+            # uninterned symbol
+            (r'#:' + symbol, String.Symbol),
+
+            # read syntax for char tables
+            (r'#\^\^?', Operator),
+
+            # function shorthand
+            (r'#\'', Name.Function),
+
+            # binary rational
+            (r'#[bB][+-]?[01]+(/[01]+)?', Number.Bin),
+
+            # octal rational
+            (r'#[oO][+-]?[0-7]+(/[0-7]+)?', Number.Oct),
+
+            # hex rational
+            (r'#[xX][+-]?[0-9a-fA-F]+(/[0-9a-fA-F]+)?', Number.Hex),
+
+            # radix rational
+            (r'#\d+r[+-]?[0-9a-zA-Z]+(/[0-9a-zA-Z]+)?', Number),
+
+            # reference
+            (r'#\d+=', Operator),
+            (r'#\d+#', Operator),
+
+            # special operators that should have been parsed already
+            (r'(,@|,|\.|:)', Operator),
+
+            # special constants
+            (r'(t|nil)' + terminated, Name.Constant),
+
+            # functions and variables
+            (r'\*' + symbol + r'\*', Name.Variable.Global),
+            (symbol, Name.Variable),
+
+            # parentheses
+            (r'#\(', Operator, 'body'),
+            (r'\(', Punctuation, 'body'),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'string': [
+            (r'[^"\\`]+', String),
+            (rf'`{symbol}\'', String.Symbol),
+            (r'`', String),
+            (r'\\.', String),
+            (r'\\\n', String),
+            (r'"', String, '#pop'),
+        ],
+    }
+
+
+class ShenLexer(RegexLexer):
+    """
+    Lexer for Shen source code.
+    """
+    name = 'Shen'
+    url = 'http://shenlanguage.org/'
+    aliases = ['shen']
+    filenames = ['*.shen']
+    mimetypes = ['text/x-shen', 'application/x-shen']
+    version_added = '2.1'
+
+    DECLARATIONS = (
+        'datatype', 'define', 'defmacro', 'defprolog', 'defcc',
+        'synonyms', 'declare', 'package', 'type', 'function',
+    )
+
+    SPECIAL_FORMS = (
+        'lambda', 'get', 'let', 'if', 'cases', 'cond', 'put', 'time', 'freeze',
+        'value', 'load', '$', 'protect', 'or', 'and', 'not', 'do', 'output',
+        'prolog?', 'trap-error', 'error', 'make-string', '/.', 'set', '@p',
+        '@s', '@v',
+    )
+
+    BUILTINS = (
+        '==', '=', '*', '+', '-', '/', '<', '>', '>=', '<=', '<-address',
+        '<-vector', 'abort', 'absvector', 'absvector?', 'address->', 'adjoin',
+        'append', 'arity', 'assoc', 'bind', 'boolean?', 'bound?', 'call', 'cd',
+        'close', 'cn', 'compile', 'concat', 'cons', 'cons?', 'cut', 'destroy',
+        'difference', 'element?', 'empty?', 'enable-type-theory',
+        'error-to-string', 'eval', 'eval-kl', 'exception', 'explode', 'external',
+        'fail', 'fail-if', 'file', 'findall', 'fix', 'fst', 'fwhen', 'gensym',
+        'get-time', 'hash', 'hd', 'hdstr', 'hdv', 'head', 'identical',
+        'implementation', 'in', 'include', 'include-all-but', 'inferences',
+        'input', 'input+', 'integer?', 'intern', 'intersection', 'is', 'kill',
+        'language', 'length', 'limit', 'lineread', 'loaded', 'macro', 'macroexpand',
+        'map', 'mapcan', 'maxinferences', 'mode', 'n->string', 'nl', 'nth', 'null',
+        'number?', 'occurrences', 'occurs-check', 'open', 'os', 'out', 'port',
+        'porters', 'pos', 'pr', 'preclude', 'preclude-all-but', 'print', 'profile',
+        'profile-results', 'ps', 'quit', 'read', 'read+', 'read-byte', 'read-file',
+        'read-file-as-bytelist', 'read-file-as-string', 'read-from-string',
+        'release', 'remove', 'return', 'reverse', 'run', 'save', 'set',
+        'simple-error', 'snd', 'specialise', 'spy', 'step', 'stinput', 'stoutput',
+        'str', 'string->n', 'string->symbol', 'string?', 'subst', 'symbol?',
+        'systemf', 'tail', 'tc', 'tc?', 'thaw', 'tl', 'tlstr', 'tlv', 'track',
+        'tuple?', 'undefmacro', 'unify', 'unify!', 'union', 'unprofile',
+        'unspecialise', 'untrack', 'variable?', 'vector', 'vector->', 'vector?',
+        'verified', 'version', 'warn', 'when', 'write-byte', 'write-to-file',
+        'y-or-n?',
+    )
+
+    BUILTINS_ANYWHERE = ('where', 'skip', '>>', '_', '!', '<e>', '<!>')
+
+    MAPPINGS = {s: Keyword for s in DECLARATIONS}
+    MAPPINGS.update((s, Name.Builtin) for s in BUILTINS)
+    MAPPINGS.update((s, Keyword) for s in SPECIAL_FORMS)
+
+    valid_symbol_chars = r'[\w!$%*+,<=>?/.\'@&#:-]'
+    valid_name = f'{valid_symbol_chars}+'
+    symbol_name = rf'[a-z!$%*+,<=>?/.\'@&#_-]{valid_symbol_chars}*'
+    variable = rf'[A-Z]{valid_symbol_chars}*'
+
+    tokens = {
+        'string': [
+            (r'"', String, '#pop'),
+            (r'c#\d{1,3};', String.Escape),
+            (r'~[ARS%]', String.Interpol),
+            (r'(?s).', String),
+        ],
+
+        'root': [
+            (r'(?s)\\\*.*?\*\\', Comment.Multiline),  # \* ... *\
+            (r'\\\\.*', Comment.Single),              # \\ ...
+            (r'\s+', Whitespace),
+            (r'_{5,}', Punctuation),
+            (r'={5,}', Punctuation),
+            (r'(;|:=|\||--?>|<--?)', Punctuation),
+            (r'(:-|:|\{|\})', Literal),
+            (r'[+-]*\d*\.\d+(e[+-]?\d+)?', Number.Float),
+            (r'[+-]*\d+', Number.Integer),
+            (r'"', String, 'string'),
+            (variable, Name.Variable),
+            (r'(true|false|<>|\[\])', Keyword.Pseudo),
+            (symbol_name, Literal),
+            (r'(\[|\]|\(|\))', Punctuation),
+        ],
+    }
+
+    def get_tokens_unprocessed(self, text):
+        tokens = RegexLexer.get_tokens_unprocessed(self, text)
+        tokens = self._process_symbols(tokens)
+        tokens = self._process_declarations(tokens)
+        return tokens
+
+    def _relevant(self, token):
+        return token not in (Text, Whitespace, Comment.Single, Comment.Multiline)
+
+    def _process_declarations(self, tokens):
+        opening_paren = False
+        for index, token, value in tokens:
+            yield index, token, value
+            if self._relevant(token):
+                if opening_paren and token == Keyword and value in self.DECLARATIONS:
+                    declaration = value
+                    yield from self._process_declaration(declaration, tokens)
+                opening_paren = value == '(' and token == Punctuation
+
+    def _process_symbols(self, tokens):
+        opening_paren = False
+        for index, token, value in tokens:
+            if opening_paren and token in (Literal, Name.Variable):
+                token = self.MAPPINGS.get(value, Name.Function)
+            elif token == Literal and value in self.BUILTINS_ANYWHERE:
+                token = Name.Builtin
+            opening_paren = value == '(' and token == Punctuation
+            yield index, token, value
+
+    def _process_declaration(self, declaration, tokens):
+        for index, token, value in tokens:
+            if self._relevant(token):
+                break
+            yield index, token, value
+
+        if declaration == 'datatype':
+            prev_was_colon = False
+            token = Keyword.Type if token == Literal else token
+            yield index, token, value
+            for index, token, value in tokens:
+                if prev_was_colon and token == Literal:
+                    token = Keyword.Type
+                yield index, token, value
+                if self._relevant(token):
+                    prev_was_colon = token == Literal and value == ':'
+        elif declaration == 'package':
+            token = Name.Namespace if token == Literal else token
+            yield index, token, value
+        elif declaration == 'define':
+            token = Name.Function if token == Literal else token
+            yield index, token, value
+            for index, token, value in tokens:
+                if self._relevant(token):
+                    break
+                yield index, token, value
+            if value == '{' and token == Literal:
+                yield index, Punctuation, value
+                for index, token, value in self._process_signature(tokens):
+                    yield index, token, value
+            else:
+                yield index, token, value
+        else:
+            token = Name.Function if token == Literal else token
+            yield index, token, value
+
+        return
+
+    def _process_signature(self, tokens):
+        for index, token, value in tokens:
+            if token == Literal and value == '}':
+                yield index, Punctuation, value
+                return
+            elif token in (Literal, Name.Function):
+                token = Name.Variable if value.istitle() else Keyword.Type
+            yield index, token, value
+
+
+class CPSALexer(RegexLexer):
+    """
+    A CPSA lexer based on the CPSA language as of version 2.2.12
+    """
+    name = 'CPSA'
+    aliases = ['cpsa']
+    filenames = ['*.cpsa']
+    mimetypes = []
+    url = 'https://web.cs.wpi.edu/~guttman/cs564/cpsauser.html'
+    version_added = '2.1'
+
+    # list of known keywords and builtins taken form vim 6.4 scheme.vim
+    # syntax file.
+    _keywords = (
+        'herald', 'vars', 'defmacro', 'include', 'defprotocol', 'defrole',
+        'defskeleton', 'defstrand', 'deflistener', 'non-orig', 'uniq-orig',
+        'pen-non-orig', 'precedes', 'trace', 'send', 'recv', 'name', 'text',
+        'skey', 'akey', 'data', 'mesg',
+    )
+    _builtins = (
+        'cat', 'enc', 'hash', 'privk', 'pubk', 'invk', 'ltk', 'gen', 'exp',
+    )
+
+    # valid names for identifiers
+    # well, names can only not consist fully of numbers
+    # but this should be good enough for now
+    valid_name = r'[\w!$%&*+,/:<=>?@^~|-]+'
+
+    tokens = {
+        'root': [
+            # the comments - always starting with semicolon
+            # and going to the end of the line
+            (r';.*$', Comment.Single),
+
+            # whitespaces - usually not relevant
+            (r'\s+', Whitespace),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+            # support for uncommon kinds of numbers -
+            # have to figure out what the characters mean
+            # (r'(#e|#i|#b|#o|#d|#x)[\d.]+', Number),
+
+            # strings, symbols and characters
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r"'" + valid_name, String.Symbol),
+            (r"#\\([()/'\"._!§$%& ?=+-]|[a-zA-Z0-9]+)", String.Char),
+
+            # constants
+            (r'(#t|#f)', Name.Constant),
+
+            # special operators
+            (r"('|#|`|,@|,|\.)", Operator),
+
+            # highlight the keywords
+            (words(_keywords, suffix=r'\b'), Keyword),
+
+            # first variable in a quoted string like
+            # '(this is syntactic sugar)
+            (r"(?<='\()" + valid_name, Name.Variable),
+            (r"(?<=#\()" + valid_name, Name.Variable),
+
+            # highlight the builtins
+            (words(_builtins, prefix=r'(?<=\()', suffix=r'\b'), Name.Builtin),
+
+            # the remaining functions
+            (r'(?<=\()' + valid_name, Name.Function),
+            # find the remaining variables
+            (valid_name, Name.Variable),
+
+            # the famous parentheses!
+            (r'(\(|\))', Punctuation),
+            (r'(\[|\])', Punctuation),
+        ],
+    }
+
+
+class XtlangLexer(RegexLexer):
+    """An xtlang lexer for the Extempore programming environment.
+
+    This is a mixture of Scheme and xtlang, really. Keyword lists are
+    taken from the Extempore Emacs mode
+    (https://github.com/extemporelang/extempore-emacs-mode)
+    """
+    name = 'xtlang'
+    url = 'http://extempore.moso.com.au'
+    aliases = ['extempore']
+    filenames = ['*.xtm']
+    mimetypes = []
+    version_added = '2.2'
+
+    common_keywords = (
+        'lambda', 'define', 'if', 'else', 'cond', 'and',
+        'or', 'let', 'begin', 'set!', 'map', 'for-each',
+    )
+    scheme_keywords = (
+        'do', 'delay', 'quasiquote', 'unquote', 'unquote-splicing', 'eval',
+        'case', 'let*', 'letrec', 'quote',
+    )
+    xtlang_bind_keywords = (
+        'bind-func', 'bind-val', 'bind-lib', 'bind-type', 'bind-alias',
+        'bind-poly', 'bind-dylib', 'bind-lib-func', 'bind-lib-val',
+    )
+    xtlang_keywords = (
+        'letz', 'memzone', 'cast', 'convert', 'dotimes', 'doloop',
+    )
+    common_functions = (
+        '*', '+', '-', '/', '<', '<=', '=', '>', '>=', '%', 'abs', 'acos',
+        'angle', 'append', 'apply', 'asin', 'assoc', 'assq', 'assv',
+        'atan', 'boolean?', 'caaaar', 'caaadr', 'caaar', 'caadar',
+        'caaddr', 'caadr', 'caar', 'cadaar', 'cadadr', 'cadar',
+        'caddar', 'cadddr', 'caddr', 'cadr', 'car', 'cdaaar',
+        'cdaadr', 'cdaar', 'cdadar', 'cdaddr', 'cdadr', 'cdar',
+        'cddaar', 'cddadr', 'cddar', 'cdddar', 'cddddr', 'cdddr',
+        'cddr', 'cdr', 'ceiling', 'cons', 'cos', 'floor', 'length',
+        'list', 'log', 'max', 'member', 'min', 'modulo', 'not',
+        'reverse', 'round', 'sin', 'sqrt', 'substring', 'tan',
+        'println', 'random', 'null?', 'callback', 'now',
+    )
+    scheme_functions = (
+        'call-with-current-continuation', 'call-with-input-file',
+        'call-with-output-file', 'call-with-values', 'call/cc',
+        'char->integer', 'char-alphabetic?', 'char-ci<=?', 'char-ci<?',
+        'char-ci=?', 'char-ci>=?', 'char-ci>?', 'char-downcase',
+        'char-lower-case?', 'char-numeric?', 'char-ready?',
+        'char-upcase', 'char-upper-case?', 'char-whitespace?',
+        'char<=?', 'char<?', 'char=?', 'char>=?', 'char>?', 'char?',
+        'close-input-port', 'close-output-port', 'complex?',
+        'current-input-port', 'current-output-port', 'denominator',
+        'display', 'dynamic-wind', 'eof-object?', 'eq?', 'equal?',
+        'eqv?', 'even?', 'exact->inexact', 'exact?', 'exp', 'expt',
+        'force', 'gcd', 'imag-part', 'inexact->exact', 'inexact?',
+        'input-port?', 'integer->char', 'integer?',
+        'interaction-environment', 'lcm', 'list->string',
+        'list->vector', 'list-ref', 'list-tail', 'list?', 'load',
+        'magnitude', 'make-polar', 'make-rectangular', 'make-string',
+        'make-vector', 'memq', 'memv', 'negative?', 'newline',
+        'null-environment', 'number->string', 'number?',
+        'numerator', 'odd?', 'open-input-file', 'open-output-file',
+        'output-port?', 'pair?', 'peek-char', 'port?', 'positive?',
+        'procedure?', 'quotient', 'rational?', 'rationalize', 'read',
+        'read-char', 'real-part', 'real?',
+        'remainder', 'scheme-report-environment', 'set-car!', 'set-cdr!',
+        'string', 'string->list', 'string->number', 'string->symbol',
+        'string-append', 'string-ci<=?', 'string-ci<?', 'string-ci=?',
+        'string-ci>=?', 'string-ci>?', 'string-copy', 'string-fill!',
+        'string-length', 'string-ref', 'string-set!', 'string<=?',
+        'string<?', 'string=?', 'string>=?', 'string>?', 'string?',
+        'symbol->string', 'symbol?', 'transcript-off', 'transcript-on',
+        'truncate', 'values', 'vector', 'vector->list', 'vector-fill!',
+        'vector-length', 'vector?',
+        'with-input-from-file', 'with-output-to-file', 'write',
+        'write-char', 'zero?',
+    )
+    xtlang_functions = (
+        'toString', 'afill!', 'pfill!', 'tfill!', 'tbind', 'vfill!',
+        'array-fill!', 'pointer-fill!', 'tuple-fill!', 'vector-fill!', 'free',
+        'array', 'tuple', 'list', '~', 'cset!', 'cref', '&', 'bor',
+        'ang-names', '<<', '>>', 'nil', 'printf', 'sprintf', 'null', 'now',
+        'pset!', 'pref-ptr', 'vset!', 'vref', 'aset!', 'aref', 'aref-ptr',
+        'tset!', 'tref', 'tref-ptr', 'salloc', 'halloc', 'zalloc', 'alloc',
+        'schedule', 'exp', 'log', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan',
+        'sqrt', 'expt', 'floor', 'ceiling', 'truncate', 'round',
+        'llvm_printf', 'push_zone', 'pop_zone', 'memzone', 'callback',
+        'llvm_sprintf', 'make-array', 'array-set!', 'array-ref',
+        'array-ref-ptr', 'pointer-set!', 'pointer-ref', 'pointer-ref-ptr',
+        'stack-alloc', 'heap-alloc', 'zone-alloc', 'make-tuple', 'tuple-set!',
+        'tuple-ref', 'tuple-ref-ptr', 'closure-set!', 'closure-ref', 'pref',
+        'pdref', 'impc_null', 'bitcast', 'void', 'ifret', 'ret->', 'clrun->',
+        'make-env-zone', 'make-env', '<>', 'dtof', 'ftod', 'i1tof',
+        'i1tod', 'i1toi8', 'i1toi32', 'i1toi64', 'i8tof', 'i8tod',
+        'i8toi1', 'i8toi32', 'i8toi64', 'i32tof', 'i32tod', 'i32toi1',
+        'i32toi8', 'i32toi64', 'i64tof', 'i64tod', 'i64toi1',
+        'i64toi8', 'i64toi32',
+    )
+
+    # valid names for Scheme identifiers (names cannot consist fully
+    # of numbers, but this should be good enough for now)
+    valid_scheme_name = r'[\w!$%&*+,/:<=>?@^~|-]+'
+
+    # valid characters in xtlang names & types
+    valid_xtlang_name = r'[\w.!-]+'
+    valid_xtlang_type = r'[]{}[\w<>,*/|!-]+'
+
+    tokens = {
+        # keep track of when we're exiting the xtlang form
+        'xtlang': [
+            (r'\(', Punctuation, '#push'),
+            (r'\)', Punctuation, '#pop'),
+
+            (r'(?<=bind-func\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-val\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-type\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-alias\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-poly\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-lib\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-dylib\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-lib-func\s)' + valid_xtlang_name, Name.Function),
+            (r'(?<=bind-lib-val\s)' + valid_xtlang_name, Name.Function),
+
+            # type annotations
+            (r':' + valid_xtlang_type, Keyword.Type),
+
+            # types
+            (r'(<' + valid_xtlang_type + r'>|\|' + valid_xtlang_type + r'\||/' +
+             valid_xtlang_type + r'/|' + valid_xtlang_type + r'\*)\**',
+             Keyword.Type),
+
+            # keywords
+            (words(xtlang_keywords, prefix=r'(?<=\()'), Keyword),
+
+            # builtins
+            (words(xtlang_functions, prefix=r'(?<=\()'), Name.Function),
+
+            include('common'),
+
+            # variables
+            (valid_xtlang_name, Name.Variable),
+        ],
+        'scheme': [
+            # quoted symbols
+            (r"'" + valid_scheme_name, String.Symbol),
+
+            # char literals
+            (r"#\\([()/'\"._!§$%& ?=+-]|[a-zA-Z0-9]+)", String.Char),
+
+            # special operators
+            (r"('|#|`|,@|,|\.)", Operator),
+
+            # keywords
+            (words(scheme_keywords, prefix=r'(?<=\()'), Keyword),
+
+            # builtins
+            (words(scheme_functions, prefix=r'(?<=\()'), Name.Function),
+
+            include('common'),
+
+            # variables
+            (valid_scheme_name, Name.Variable),
+        ],
+        # common to both xtlang and Scheme
+        'common': [
+            # comments
+            (r';.*$', Comment.Single),
+
+            # whitespaces - usually not relevant
+            (r'\s+', Whitespace),
+
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+
+            # binary/oct/hex literals
+            (r'(#b|#o|#x)[\d.]+', Number),
+
+            # strings
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+
+            # true/false constants
+            (r'(#t|#f)', Name.Constant),
+
+            # keywords
+            (words(common_keywords, prefix=r'(?<=\()'), Keyword),
+
+            # builtins
+            (words(common_functions, prefix=r'(?<=\()'), Name.Function),
+
+            # the famous parentheses!
+            (r'(\(|\))', Punctuation),
+        ],
+        'root': [
+            # go into xtlang mode
+            (words(xtlang_bind_keywords, prefix=r'(?<=\()', suffix=r'\b'),
+             Keyword, 'xtlang'),
+
+            include('scheme')
+        ],
+    }
+
+
+class FennelLexer(RegexLexer):
+    """A lexer for the Fennel programming language.
+
+    Fennel compiles to Lua, so all the Lua builtins are recognized as well
+    as the special forms that are particular to the Fennel compiler.
+    """
+    name = 'Fennel'
+    url = 'https://fennel-lang.org'
+    aliases = ['fennel', 'fnl']
+    filenames = ['*.fnl']
+    version_added = '2.3'
+
+    # this list is current as of Fennel version 0.10.0.
+    special_forms = (
+        '#', '%', '*', '+', '-', '->', '->>', '-?>', '-?>>', '.', '..',
+        '/', '//', ':', '<', '<=', '=', '>', '>=', '?.', '^', 'accumulate',
+        'and', 'band', 'bnot', 'bor', 'bxor', 'collect', 'comment', 'do', 'doc',
+        'doto', 'each', 'eval-compiler', 'for', 'hashfn', 'icollect', 'if',
+        'import-macros', 'include', 'length', 'let', 'lshift', 'lua',
+        'macrodebug', 'match', 'not', 'not=', 'or', 'partial', 'pick-args',
+        'pick-values', 'quote', 'require-macros', 'rshift', 'set',
+        'set-forcibly!', 'tset', 'values', 'when', 'while', 'with-open', '~='
+    )
+
+    declarations = (
+        'fn', 'global', 'lambda', 'local', 'macro', 'macros', 'var', 'λ'
+    )
+
+    builtins = (
+        '_G', '_VERSION', 'arg', 'assert', 'bit32', 'collectgarbage',
+        'coroutine', 'debug', 'dofile', 'error', 'getfenv',
+        'getmetatable', 'io', 'ipairs', 'load', 'loadfile', 'loadstring',
+        'math', 'next', 'os', 'package', 'pairs', 'pcall', 'print',
+        'rawequal', 'rawget', 'rawlen', 'rawset', 'require', 'select',
+        'setfenv', 'setmetatable', 'string', 'table', 'tonumber',
+        'tostring', 'type', 'unpack', 'xpcall'
+    )
+
+    # based on the scheme definition, but disallowing leading digits and
+    # commas, and @ is not allowed.
+    valid_name = r'[a-zA-Z_!$%&*+/:<=>?^~|-][\w!$%&*+/:<=>?^~|\.-]*'
+
+    tokens = {
+        'root': [
+            # the only comment form is a semicolon; goes to the end of the line
+            (r';.*$', Comment.Single),
+
+            (r',+', Text),
+            (r'\s+', Whitespace),
+            (r'-?\d+\.\d+', Number.Float),
+            (r'-?\d+', Number.Integer),
+
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+
+            (r'(true|false|nil)', Name.Constant),
+
+            # these are technically strings, but it's worth visually
+            # distinguishing them because their intent is different
+            # from regular strings.
+            (r':' + valid_name, String.Symbol),
+
+            # special forms are keywords
+            (words(special_forms, suffix=' '), Keyword),
+            # these are ... even more special!
+            (words(declarations, suffix=' '), Keyword.Declaration),
+            # lua standard library are builtins
+            (words(builtins, suffix=' '), Name.Builtin),
+            # special-case the vararg symbol
+            (r'\.\.\.', Name.Variable),
+            # regular identifiers
+            (valid_name, Name.Variable),
+
+            # all your normal paired delimiters for your programming enjoyment
+            (r'(\(|\))', Punctuation),
+            (r'(\[|\])', Punctuation),
+            (r'(\{|\})', Punctuation),
+
+            # the # symbol is shorthand for a lambda function
+            (r'#', Punctuation),
+        ]
+    }
+
+
+class JanetLexer(RegexLexer):
+    """A lexer for the Janet programming language.
+    """
+    name = 'Janet'
+    url =  'https://janet-lang.org/'
+    aliases = ['janet']
+    filenames = ['*.janet', '*.jdn']
+    mimetypes = ['text/x-janet', 'application/x-janet']
+    version_added = '2.18'
+
+    # XXX: gets too slow
+    #flags = re.MULTILINE | re.VERBOSE
+
+    special_forms = (
+        'break', 'def', 'do', 'fn', 'if', 'quote', 'quasiquote', 'splice',
+        'set', 'unquote', 'upscope', 'var', 'while'
+    )
+
+    builtin_macros = (
+        '%=', '*=', '++', '+=', '--', '-=', '->', '->>', '-?>',
+        '-?>>', '/=', 'and', 'as->', 'as-macro', 'as?->',
+        'assert', 'case', 'catseq', 'chr', 'comment', 'compif',
+        'comptime', 'compwhen', 'cond', 'coro', 'def-',
+        'default', 'defdyn', 'defer', 'defmacro', 'defmacro-',
+        'defn', 'defn-', 'delay', 'doc', 'each', 'eachk',
+        'eachp', 'edefer', 'ev/do-thread', 'ev/gather',
+        'ev/spawn', 'ev/spawn-thread', 'ev/with-deadline',
+        'ffi/defbind', 'fiber-fn', 'for', 'forever', 'forv',
+        'generate', 'if-let', 'if-not', 'if-with', 'import',
+        'juxt', 'label', 'let', 'loop', 'match', 'or', 'prompt',
+        'protect', 'repeat', 'seq', 'short-fn', 'tabseq',
+        'toggle', 'tracev', 'try', 'unless', 'use', 'var-',
+        'varfn', 'when', 'when-let', 'when-with', 'with',
+        'with-dyns', 'with-syms', 'with-vars',
+        # obsolete builtin macros
+        'eachy'
+    )
+
+    builtin_functions = (
+        '%', '*', '+', '-', '/', '<', '<=', '=', '>', '>=',
+        'abstract?', 'accumulate', 'accumulate2', 'all',
+        'all-bindings', 'all-dynamics', 'any?', 'apply',
+        'array', 'array/clear', 'array/concat', 'array/ensure',
+        'array/fill', 'array/insert', 'array/new',
+        'array/new-filled', 'array/peek', 'array/pop',
+        'array/push', 'array/remove', 'array/slice',
+        'array/trim', 'array/weak', 'array?', 'asm',
+        'bad-compile', 'bad-parse', 'band', 'blshift', 'bnot',
+        'boolean?', 'bor', 'brshift', 'brushift', 'buffer',
+        'buffer/bit', 'buffer/bit-clear', 'buffer/bit-set',
+        'buffer/bit-toggle', 'buffer/blit', 'buffer/clear',
+        'buffer/fill', 'buffer/format', 'buffer/from-bytes',
+        'buffer/new', 'buffer/new-filled', 'buffer/popn',
+        'buffer/push', 'buffer/push-at', 'buffer/push-byte',
+        'buffer/push-string', 'buffer/push-word',
+        'buffer/slice', 'buffer/trim', 'buffer?', 'bxor',
+        'bytes?', 'cancel', 'cfunction?', 'cli-main', 'cmp',
+        'comp', 'compare', 'compare<', 'compare<=', 'compare=',
+        'compare>', 'compare>=', 'compile', 'complement',
+        'count', 'curenv', 'debug', 'debug/arg-stack',
+        'debug/break', 'debug/fbreak', 'debug/lineage',
+        'debug/stack', 'debug/stacktrace', 'debug/step',
+        'debug/unbreak', 'debug/unfbreak', 'debugger',
+        'debugger-on-status', 'dec', 'deep-not=', 'deep=',
+        'defglobal', 'describe', 'dictionary?', 'disasm',
+        'distinct', 'div', 'doc*', 'doc-format', 'doc-of',
+        'dofile', 'drop', 'drop-until', 'drop-while', 'dyn',
+        'eflush', 'empty?', 'env-lookup', 'eprin', 'eprinf',
+        'eprint', 'eprintf', 'error', 'errorf',
+        'ev/acquire-lock', 'ev/acquire-rlock',
+        'ev/acquire-wlock', 'ev/all-tasks', 'ev/call',
+        'ev/cancel', 'ev/capacity', 'ev/chan', 'ev/chan-close',
+        'ev/chunk', 'ev/close', 'ev/count', 'ev/deadline',
+        'ev/full', 'ev/give', 'ev/give-supervisor', 'ev/go',
+        'ev/lock', 'ev/read', 'ev/release-lock',
+        'ev/release-rlock', 'ev/release-wlock', 'ev/rselect',
+        'ev/rwlock', 'ev/select', 'ev/sleep', 'ev/take',
+        'ev/thread', 'ev/thread-chan', 'ev/write', 'eval',
+        'eval-string', 'even?', 'every?', 'extreme', 'false?',
+        'ffi/align', 'ffi/call', 'ffi/calling-conventions',
+        'ffi/close', 'ffi/context', 'ffi/free', 'ffi/jitfn',
+        'ffi/lookup', 'ffi/malloc', 'ffi/native',
+        'ffi/pointer-buffer', 'ffi/pointer-cfunction',
+        'ffi/read', 'ffi/signature', 'ffi/size', 'ffi/struct',
+        'ffi/trampoline', 'ffi/write', 'fiber/can-resume?',
+        'fiber/current', 'fiber/getenv', 'fiber/last-value',
+        'fiber/maxstack', 'fiber/new', 'fiber/root',
+        'fiber/setenv', 'fiber/setmaxstack', 'fiber/status',
+        'fiber?', 'file/close', 'file/flush', 'file/lines',
+        'file/open', 'file/read', 'file/seek', 'file/tell',
+        'file/temp', 'file/write', 'filter', 'find',
+        'find-index', 'first', 'flatten', 'flatten-into',
+        'flush', 'flycheck', 'freeze', 'frequencies',
+        'from-pairs', 'function?', 'gccollect', 'gcinterval',
+        'gcsetinterval', 'gensym', 'get', 'get-in', 'getline',
+        'getproto', 'group-by', 'has-key?', 'has-value?',
+        'hash', 'idempotent?', 'identity', 'import*', 'in',
+        'inc', 'index-of', 'indexed?', 'int/s64',
+        'int/to-bytes', 'int/to-number', 'int/u64', 'int?',
+        'interleave', 'interpose', 'invert', 'juxt*', 'keep',
+        'keep-syntax', 'keep-syntax!', 'keys', 'keyword',
+        'keyword/slice', 'keyword?', 'kvs', 'last', 'length',
+        'lengthable?', 'load-image', 'macex', 'macex1',
+        'maclintf', 'make-env', 'make-image', 'map', 'mapcat',
+        'marshal', 'math/abs', 'math/acos', 'math/acosh',
+        'math/asin', 'math/asinh', 'math/atan', 'math/atan2',
+        'math/atanh', 'math/cbrt', 'math/ceil', 'math/cos',
+        'math/cosh', 'math/erf', 'math/erfc', 'math/exp',
+        'math/exp2', 'math/expm1', 'math/floor', 'math/gamma',
+        'math/gcd', 'math/hypot', 'math/lcm', 'math/log',
+        'math/log-gamma', 'math/log10', 'math/log1p',
+        'math/log2', 'math/next', 'math/pow', 'math/random',
+        'math/rng', 'math/rng-buffer', 'math/rng-int',
+        'math/rng-uniform', 'math/round', 'math/seedrandom',
+        'math/sin', 'math/sinh', 'math/sqrt', 'math/tan',
+        'math/tanh', 'math/trunc', 'max', 'max-of', 'mean',
+        'memcmp', 'merge', 'merge-into', 'merge-module', 'min',
+        'min-of', 'mod', 'module/add-paths',
+        'module/expand-path', 'module/find', 'module/value',
+        'nan?', 'nat?', 'native', 'neg?', 'net/accept',
+        'net/accept-loop', 'net/address', 'net/address-unpack',
+        'net/chunk', 'net/close', 'net/connect', 'net/flush',
+        'net/listen', 'net/localname', 'net/peername',
+        'net/read', 'net/recv-from', 'net/send-to',
+        'net/server', 'net/setsockopt', 'net/shutdown',
+        'net/write', 'next', 'nil?', 'not', 'not=', 'number?',
+        'odd?', 'one?', 'os/arch', 'os/cd', 'os/chmod',
+        'os/clock', 'os/compiler', 'os/cpu-count',
+        'os/cryptorand', 'os/cwd', 'os/date', 'os/dir',
+        'os/environ', 'os/execute', 'os/exit', 'os/getenv',
+        'os/isatty', 'os/link', 'os/lstat', 'os/mkdir',
+        'os/mktime', 'os/open', 'os/perm-int', 'os/perm-string',
+        'os/pipe', 'os/posix-exec', 'os/posix-fork',
+        'os/proc-close', 'os/proc-kill', 'os/proc-wait',
+        'os/readlink', 'os/realpath', 'os/rename', 'os/rm',
+        'os/rmdir', 'os/setenv', 'os/shell', 'os/sigaction',
+        'os/sleep', 'os/spawn', 'os/stat', 'os/strftime',
+        'os/symlink', 'os/time', 'os/touch', 'os/umask',
+        'os/which', 'pairs', 'parse', 'parse-all',
+        'parser/byte', 'parser/clone', 'parser/consume',
+        'parser/eof', 'parser/error', 'parser/flush',
+        'parser/has-more', 'parser/insert', 'parser/new',
+        'parser/produce', 'parser/state', 'parser/status',
+        'parser/where', 'partial', 'partition', 'partition-by',
+        'peg/compile', 'peg/find', 'peg/find-all', 'peg/match',
+        'peg/replace', 'peg/replace-all', 'pos?', 'postwalk',
+        'pp', 'prewalk', 'prin', 'prinf', 'print', 'printf',
+        'product', 'propagate', 'put', 'put-in', 'quit',
+        'range', 'reduce', 'reduce2', 'repl', 'require',
+        'resume', 'return', 'reverse', 'reverse!',
+        'run-context', 'sandbox', 'scan-number', 'setdyn',
+        'signal', 'slice', 'slurp', 'some', 'sort', 'sort-by',
+        'sorted', 'sorted-by', 'spit', 'string',
+        'string/ascii-lower', 'string/ascii-upper',
+        'string/bytes', 'string/check-set', 'string/find',
+        'string/find-all', 'string/format', 'string/from-bytes',
+        'string/has-prefix?', 'string/has-suffix?',
+        'string/join', 'string/repeat', 'string/replace',
+        'string/replace-all', 'string/reverse', 'string/slice',
+        'string/split', 'string/trim', 'string/triml',
+        'string/trimr', 'string?', 'struct', 'struct/getproto',
+        'struct/proto-flatten', 'struct/to-table',
+        'struct/with-proto', 'struct?', 'sum', 'symbol',
+        'symbol/slice', 'symbol?', 'table', 'table/clear',
+        'table/clone', 'table/getproto', 'table/new',
+        'table/proto-flatten', 'table/rawget', 'table/setproto',
+        'table/to-struct', 'table/weak', 'table/weak-keys',
+        'table/weak-values', 'table?', 'take', 'take-until',
+        'take-while', 'thaw', 'trace', 'true?', 'truthy?',
+        'tuple', 'tuple/brackets', 'tuple/setmap',
+        'tuple/slice', 'tuple/sourcemap', 'tuple/type',
+        'tuple?', 'type', 'unmarshal', 'untrace', 'update',
+        'update-in', 'values', 'varglobal', 'walk',
+        'warn-compile', 'xprin', 'xprinf', 'xprint', 'xprintf',
+        'yield', 'zero?', 'zipcoll',
+        # obsolete builtin functions
+        'tarray/buffer', 'tarray/copy-bytes', 'tarray/length',
+        'tarray/new', 'tarray/properties', 'tarray/slice',
+        'tarray/swap-bytes', 'thread/close', 'thread/current',
+        'thread/exit', 'thread/new', 'thread/receive',
+        'thread/send'
+    )
+
+    builtin_variables = (
+        'debugger-env', 'default-peg-grammar', 'janet/build',
+        'janet/config-bits', 'janet/version', 'load-image-dict',
+        'make-image-dict', 'math/-inf', 'math/e', 'math/inf',
+        'math/int-max', 'math/int-min', 'math/int32-max',
+        'math/int32-min', 'math/nan', 'math/pi', 'module/cache',
+        'module/loaders', 'module/loading', 'module/paths',
+        'root-env', 'stderr', 'stdin', 'stdout'
+    )
+
+    constants = (
+        'false', 'nil', 'true'
+    )
+
+    # XXX: this form not usable to pass to `suffix=`
+    #_token_end = r'''
+    #  (?=            # followed by one of:
+    #      \s           # whitespace
+    #    | \#           # comment
+    #    | [)\]]        # end delimiters
+    #    | $            # end of file
+    #  )
+    #'''
+
+    # ...so, express it like this
+    _token_end = r'(?=\s|#|[)\]]|$)'
+
+    _first_char = r'[a-zA-Z!$%&*+\-./<=>?@^_]'
+    _rest_char = rf'([0-9:]|{_first_char})'
+
+    valid_name = rf'{_first_char}({_rest_char})*'
+
+    _radix_unit = r'[0-9a-zA-Z][0-9a-zA-Z_]*'
+
+    # exponent marker, optional sign, one or more alphanumeric
+    _radix_exp = r'&[+-]?[0-9a-zA-Z]+'
+
+    # 2af3__bee_
+    _hex_unit = r'[0-9a-fA-F][0-9a-fA-F_]*'
+
+    # 12_000__
+    _dec_unit = r'[0-9][0-9_]*'
+
+    # E-23
+    # lower or uppercase e, optional sign, one or more digits
+    _dec_exp = r'[eE][+-]?[0-9]+'
+
+    tokens = {
+        'root': [
+            (r'#.*$', Comment.Single),
+
+            (r'\s+', Whitespace),
+
+            # radix number
+            (rf'''(?x)
+                  [+-]? [0-9]{{1,2}} r {_radix_unit} \. ({_radix_unit})?
+                  ({_radix_exp})?
+               ''',
+             Number),
+
+            (rf'''(?x)
+                  [+-]? [0-9]{{1,2}} r (\.)? {_radix_unit}
+                  ({_radix_exp})?
+               ''',
+             Number),
+
+            # hex number
+            (rf'(?x) [+-]? 0x {_hex_unit} \. ({_hex_unit})?',
+             Number.Hex),
+
+            (rf'(?x) [+-]? 0x (\.)? {_hex_unit}',
+             Number.Hex),
+
+            # decimal number
+            (rf'(?x) [+-]? {_dec_unit} \. ({_dec_unit})? ({_dec_exp})?',
+             Number.Float),
+
+            (rf'(?x) [+-]? (\.)? {_dec_unit} ({_dec_exp})?',
+             Number.Float),
+
+            # strings and buffers
+            (r'@?"', String, 'string'),
+
+            # long-strings and long-buffers
+            #
+            #   non-empty content enclosed by a pair of n-backticks
+            #   with optional leading @
+            (r'@?(`+)(.|\n)+?\1', String),
+
+            # things that hang out on front
+            #
+            #   ' ~ , ; |
+            (r"['~,;|]", Operator),
+
+            # collection delimiters
+            #
+            #   @( ( )
+            #   @[ [ ]
+            #   @{ { }
+            (r'@?[(\[{]|[)\]}]', Punctuation),
+
+            # constants
+            (words(constants, suffix=_token_end), Keyword.Constants),
+
+            # keywords
+            (rf'(:({_rest_char})+|:)', Name.Constant),
+
+            # symbols
+            (words(builtin_variables, suffix=_token_end),
+             Name.Variable.Global),
+
+            (words(special_forms, prefix=r'(?<=\()', suffix=_token_end),
+             Keyword.Reserved),
+
+            (words(builtin_macros, prefix=r'(?<=\()', suffix=_token_end),
+             Name.Builtin),
+
+            (words(builtin_functions, prefix=r'(?<=\()', suffix=_token_end),
+             Name.Function),
+
+            # other symbols
+            (valid_name, Name.Variable),
+        ],
+        'string': [
+            (r'\\(u[0-9a-fA-F]{4}|U[0-9a-fA-F]{6})', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+            (r'\\.', String.Escape),
+            (r'"', String, '#pop'),
+            (r'[^\\"]+', String),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/macaulay2.py b/.venv/Lib/site-packages/pygments/lexers/macaulay2.py
new file mode 100644 (file)
index 0000000..77b841d
--- /dev/null
@@ -0,0 +1,1814 @@
+"""
+    pygments.lexers.macaulay2
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Macaulay2.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Keyword, Name, String, Text
+
+__all__ = ['Macaulay2Lexer']
+
+# Auto-generated for Macaulay2-1.24.11. Do not modify this file manually.
+
+M2KEYWORDS = (
+    "SPACE",
+    "TEST",
+    "and",
+    "break",
+    "catch",
+    "continue",
+    "do",
+    "elapsedTime",
+    "elapsedTiming",
+    "else",
+    "for",
+    "from",
+    "global",
+    "if",
+    "in",
+    "list",
+    "local",
+    "new",
+    "not",
+    "of",
+    "or",
+    "return",
+    "shield",
+    "step",
+    "symbol",
+    "then",
+    "threadLocal",
+    "threadVariable",
+    "throw",
+    "time",
+    "timing",
+    "to",
+    "try",
+    "when",
+    "while",
+    "xor"
+    )
+
+M2DATATYPES = (
+    "ANCHOR",
+    "Adjacent",
+    "AffineVariety",
+    "Analyzer",
+    "AngleBarList",
+    "Array",
+    "AssociativeExpression",
+    "AtomicInt",
+    "BLOCKQUOTE",
+    "BODY",
+    "BOLD",
+    "BR",
+    "BUTTON",
+    "Bag",
+    "BasicList",
+    "BettiTally",
+    "BinaryOperation",
+    "Boolean",
+    "CC",
+    "CDATA",
+    "CODE",
+    "COMMENT",
+    "CacheFunction",
+    "CacheTable",
+    "ChainComplex",
+    "ChainComplexMap",
+    "CoherentSheaf",
+    "Command",
+    "CompiledFunction",
+    "CompiledFunctionBody",
+    "CompiledFunctionClosure",
+    "ComplexField",
+    "Constant",
+    "DD",
+    "DIV",
+    "DL",
+    "DT",
+    "Database",
+    "Descent",
+    "Describe",
+    "Dictionary",
+    "DirectSum",
+    "Divide",
+    "DocumentTag",
+    "EM",
+    "Eliminate",
+    "EngineRing",
+    "Equation",
+    "ExampleItem",
+    "Expression",
+    "File",
+    "FilePosition",
+    "FractionField",
+    "Function",
+    "FunctionApplication",
+    "FunctionBody",
+    "FunctionClosure",
+    "GaloisField",
+    "GeneralOrderedMonoid",
+    "GlobalDictionary",
+    "GradedModule",
+    "GradedModuleMap",
+    "GroebnerBasis",
+    "GroebnerBasisOptions",
+    "HEAD",
+    "HEADER1",
+    "HEADER2",
+    "HEADER3",
+    "HEADER4",
+    "HEADER5",
+    "HEADER6",
+    "HR",
+    "HREF",
+    "HTML",
+    "HashTable",
+    "HeaderType",
+    "Holder",
+    "Hybrid",
+    "Hypertext",
+    "HypertextContainer",
+    "HypertextParagraph",
+    "HypertextVoid",
+    "IMG",
+    "INDENT",
+    "INPUT",
+    "ITALIC",
+    "Ideal",
+    "ImmutableType",
+    "IndeterminateNumber",
+    "IndexedVariable",
+    "IndexedVariableTable",
+    "InexactField",
+    "InexactFieldFamily",
+    "InexactNumber",
+    "InfiniteNumber",
+    "IntermediateMarkUpType",
+    "Iterator",
+    "KBD",
+    "Keyword",
+    "LABEL",
+    "LATER",
+    "LI",
+    "LINK",
+    "LITERAL",
+    "List",
+    "LocalDictionary",
+    "LowerBound",
+    "MENU",
+    "META",
+    "Manipulator",
+    "MapExpression",
+    "MarkUpType",
+    "Matrix",
+    "MatrixExpression",
+    "MethodFunction",
+    "MethodFunctionBinary",
+    "MethodFunctionSingle",
+    "MethodFunctionWithOptions",
+    "Minus",
+    "Module",
+    "Monoid",
+    "MonoidElement",
+    "MonomialIdeal",
+    "MultigradedBettiTally",
+    "MutableHashTable",
+    "MutableList",
+    "MutableMatrix",
+    "Net",
+    "NetFile",
+    "Nothing",
+    "Number",
+    "NumberedVerticalList",
+    "OL",
+    "OneExpression",
+    "Option",
+    "OptionTable",
+    "OrderedMonoid",
+    "PARA",
+    "PRE",
+    "Package",
+    "Parenthesize",
+    "Parser",
+    "Partition",
+    "PolynomialRing",
+    "Power",
+    "Product",
+    "ProductOrder",
+    "Program",
+    "ProgramRun",
+    "ProjectiveHilbertPolynomial",
+    "ProjectiveVariety",
+    "Pseudocode",
+    "PseudocodeClosure",
+    "QQ",
+    "QuotientRing",
+    "RR",
+    "RRi",
+    "RealField",
+    "Resolution",
+    "Ring",
+    "RingElement",
+    "RingFamily",
+    "RingMap",
+    "RowExpression",
+    "SAMP",
+    "SCRIPT",
+    "SMALL",
+    "SPAN",
+    "STRONG",
+    "STYLE",
+    "SUB",
+    "SUBSECTION",
+    "SUP",
+    "ScriptedFunctor",
+    "SelfInitializingType",
+    "Sequence",
+    "Set",
+    "SheafExpression",
+    "SheafMap",
+    "SheafOfRings",
+    "SparseMonomialVectorExpression",
+    "SparseVectorExpression",
+    "String",
+    "Subscript",
+    "Sum",
+    "SumOfTwists",
+    "Superscript",
+    "Symbol",
+    "SymbolBody",
+    "TABLE",
+    "TD",
+    "TEX",
+    "TH",
+    "TITLE",
+    "TO",
+    "TO2",
+    "TOH",
+    "TR",
+    "TT",
+    "Table",
+    "Tally",
+    "Task",
+    "TensorProduct",
+    "TestInput",
+    "Thing",
+    "Time",
+    "Type",
+    "UL",
+    "URL",
+    "VAR",
+    "Variety",
+    "Vector",
+    "VectorExpression",
+    "VerticalList",
+    "VirtualTally",
+    "VisibleList",
+    "WrapperType",
+    "ZZ",
+    "ZeroExpression"
+    )
+
+M2FUNCTIONS = (
+    "BesselJ",
+    "BesselY",
+    "Beta",
+    "Digamma",
+    "EXAMPLE",
+    "End",
+    "Fano",
+    "GCstats",
+    "GF",
+    "Gamma",
+    "Grassmannian",
+    "Hom",
+    "LLL",
+    "LUdecomposition",
+    "M2CODE",
+    "NNParser",
+    "Proj",
+    "QQParser",
+    "QRDecomposition",
+    "SVD",
+    "SYNOPSIS",
+    "Schubert",
+    "Spec",
+    "ZZParser",
+    "about",
+    "abs",
+    "accumulate",
+    "acos",
+    "acosh",
+    "acot",
+    "acoth",
+    "addCancelTask",
+    "addDependencyTask",
+    "addEndFunction",
+    "addHook",
+    "addStartTask",
+    "adjoint",
+    "agm",
+    "alarm",
+    "all",
+    "ambient",
+    "analyticSpread",
+    "ancestor",
+    "ancestors",
+    "andP",
+    "ann",
+    "annihilator",
+    "antipode",
+    "any",
+    "append",
+    "applicationDirectory",
+    "apply",
+    "applyKeys",
+    "applyPairs",
+    "applyTable",
+    "applyValues",
+    "apropos",
+    "arXiv",
+    "ascii",
+    "asin",
+    "asinh",
+    "ass",
+    "assert",
+    "associatedGradedRing",
+    "associatedPrimes",
+    "atEndOfFile",
+    "atan",
+    "atan2",
+    "atanh",
+    "autoload",
+    "baseFilename",
+    "baseName",
+    "baseRing",
+    "basis",
+    "beginDocumentation",
+    "benchmark",
+    "betti",
+    "between",
+    "binomial",
+    "borel",
+    "cacheValue",
+    "cancelTask",
+    "canonicalBundle",
+    "capture",
+    "ceiling",
+    "centerString",
+    "chainComplex",
+    "changeBase",
+    "changeDirectory",
+    "char",
+    "charAnalyzer",
+    "characters",
+    "check",
+    "checkDegrees",
+    "chi",
+    "class",
+    "clean",
+    "clearEcho",
+    "code",
+    "codim",
+    "coefficient",
+    "coefficientRing",
+    "coefficients",
+    "cohomology",
+    "coimage",
+    "coker",
+    "cokernel",
+    "collectGarbage",
+    "columnAdd",
+    "columnMult",
+    "columnPermute",
+    "columnRankProfile",
+    "columnSwap",
+    "columnate",
+    "combine",
+    "commandInterpreter",
+    "commonRing",
+    "commonest",
+    "comodule",
+    "compareExchange",
+    "complement",
+    "complete",
+    "components",
+    "compose",
+    "compositions",
+    "compress",
+    "concatenate",
+    "conductor",
+    "cone",
+    "conjugate",
+    "connectionCount",
+    "constParser",
+    "content",
+    "contract",
+    "conwayPolynomial",
+    "copy",
+    "copyDirectory",
+    "copyFile",
+    "cos",
+    "cosh",
+    "cot",
+    "cotangentSheaf",
+    "coth",
+    "cover",
+    "coverMap",
+    "cpuTime",
+    "createTask",
+    "csc",
+    "csch",
+    "currentColumnNumber",
+    "currentDirectory",
+    "currentPosition",
+    "currentRowNumber",
+    "currentTime",
+    "deadParser",
+    "debug",
+    "debugError",
+    "decompose",
+    "deepSplice",
+    "default",
+    "degree",
+    "degreeGroup",
+    "degreeLength",
+    "degrees",
+    "degreesMonoid",
+    "degreesRing",
+    "delete",
+    "demark",
+    "denominator",
+    "depth",
+    "describe",
+    "det",
+    "determinant",
+    "diagonalMatrix",
+    "diameter",
+    "dictionary",
+    "diff",
+    "difference",
+    "dim",
+    "directSum",
+    "disassemble",
+    "discriminant",
+    "dismiss",
+    "distinguished",
+    "divideByVariable",
+    "doc",
+    "document",
+    "drop",
+    "dual",
+    "eagonNorthcott",
+    "echoOff",
+    "echoOn",
+    "eigenvalues",
+    "eigenvectors",
+    "eint",
+    "elements",
+    "eliminate",
+    "endPackage",
+    "entries",
+    "erase",
+    "erf",
+    "erfc",
+    "error",
+    "euler",
+    "eulers",
+    "even",
+    "examples",
+    "exchange",
+    "exec",
+    "exp",
+    "expectedReesIdeal",
+    "expm1",
+    "exponents",
+    "export",
+    "exportFrom",
+    "exportMutable",
+    "expression",
+    "extend",
+    "exteriorPower",
+    "factor",
+    "fileExecutable",
+    "fileExists",
+    "fileLength",
+    "fileMode",
+    "fileReadable",
+    "fileTime",
+    "fileWritable",
+    "fillMatrix",
+    "findFiles",
+    "findHeft",
+    "findProgram",
+    "findSynonyms",
+    "first",
+    "firstkey",
+    "fittingIdeal",
+    "flagLookup",
+    "flatten",
+    "flattenRing",
+    "flip",
+    "floor",
+    "fold",
+    "forceGB",
+    "fork",
+    "format",
+    "formation",
+    "frac",
+    "fraction",
+    "frames",
+    "fromDividedPowers",
+    "fromDual",
+    "functionBody",
+    "futureParser",
+    "gb",
+    "gbRemove",
+    "gbSnapshot",
+    "gcd",
+    "gcdCoefficients",
+    "gcdLLL",
+    "genera",
+    "generateAssertions",
+    "generator",
+    "generators",
+    "genericMatrix",
+    "genericSkewMatrix",
+    "genericSymmetricMatrix",
+    "gens",
+    "genus",
+    "get",
+    "getChangeMatrix",
+    "getGlobalSymbol",
+    "getIOThreadMode",
+    "getNetFile",
+    "getNonUnit",
+    "getPrimeWithRootOfUnity",
+    "getSymbol",
+    "getWWW",
+    "getc",
+    "getenv",
+    "globalAssign",
+    "globalAssignFunction",
+    "globalAssignment",
+    "globalReleaseFunction",
+    "gradedModule",
+    "gradedModuleMap",
+    "gramm",
+    "graphIdeal",
+    "graphRing",
+    "groebnerBasis",
+    "groupID",
+    "hash",
+    "hashTable",
+    "headlines",
+    "heft",
+    "height",
+    "hermite",
+    "hilbertFunction",
+    "hilbertPolynomial",
+    "hilbertSeries",
+    "hold",
+    "homogenize",
+    "homology",
+    "homomorphism",
+    "hooks",
+    "horizontalJoin",
+    "html",
+    "httpHeaders",
+    "hypertext",
+    "icFracP",
+    "icFractions",
+    "icMap",
+    "icPIdeal",
+    "ideal",
+    "idealizer",
+    "identity",
+    "image",
+    "imaginaryPart",
+    "importFrom",
+    "independentSets",
+    "index",
+    "indices",
+    "inducedMap",
+    "inducesWellDefinedMap",
+    "info",
+    "input",
+    "insert",
+    "installAssignmentMethod",
+    "installHilbertFunction",
+    "installMethod",
+    "installMinprimes",
+    "installPackage",
+    "installedPackages",
+    "instance",
+    "instances",
+    "integralClosure",
+    "integrate",
+    "intersect",
+    "intersectInP",
+    "intersection",
+    "interval",
+    "inverse",
+    "inverseErf",
+    "inversePermutation",
+    "inverseRegularizedBeta",
+    "inverseRegularizedGamma",
+    "inverseSystem",
+    "irreducibleCharacteristicSeries",
+    "irreducibleDecomposition",
+    "isANumber",
+    "isAffineRing",
+    "isBorel",
+    "isCanceled",
+    "isCommutative",
+    "isConstant",
+    "isDirectSum",
+    "isDirectory",
+    "isEmpty",
+    "isField",
+    "isFinite",
+    "isFinitePrimeField",
+    "isFreeModule",
+    "isGlobalSymbol",
+    "isHomogeneous",
+    "isIdeal",
+    "isInfinite",
+    "isInjective",
+    "isInputFile",
+    "isIsomorphic",
+    "isIsomorphism",
+    "isLLL",
+    "isLiftable",
+    "isLinearType",
+    "isListener",
+    "isMember",
+    "isModule",
+    "isMonomialIdeal",
+    "isMutable",
+    "isNormal",
+    "isOpen",
+    "isOutputFile",
+    "isPolynomialRing",
+    "isPrimary",
+    "isPrime",
+    "isPrimitive",
+    "isProjective",
+    "isPseudoprime",
+    "isQuotientModule",
+    "isQuotientOf",
+    "isQuotientRing",
+    "isReady",
+    "isReal",
+    "isReduction",
+    "isRegularFile",
+    "isRing",
+    "isSkewCommutative",
+    "isSmooth",
+    "isSorted",
+    "isSquareFree",
+    "isStandardGradedPolynomialRing",
+    "isSubmodule",
+    "isSubquotient",
+    "isSubset",
+    "isSupportedInZeroLocus",
+    "isSurjective",
+    "isTable",
+    "isUnit",
+    "isVeryAmple",
+    "isWellDefined",
+    "isWeylAlgebra",
+    "isc",
+    "iterator",
+    "jacobian",
+    "jacobianDual",
+    "join",
+    "ker",
+    "kernel",
+    "kernelLLL",
+    "kernelOfLocalization",
+    "keys",
+    "kill",
+    "koszul",
+    "last",
+    "lcm",
+    "leadCoefficient",
+    "leadComponent",
+    "leadMonomial",
+    "leadTerm",
+    "left",
+    "length",
+    "letterParser",
+    "lift",
+    "liftable",
+    "limitFiles",
+    "limitProcesses",
+    "lines",
+    "linkFile",
+    "listForm",
+    "listSymbols",
+    "lngamma",
+    "load",
+    "loadPackage",
+    "localDictionaries",
+    "localize",
+    "locate",
+    "log",
+    "log1p",
+    "lookup",
+    "lookupCount",
+    "makeDirectory",
+    "makeDocumentTag",
+    "makePackageIndex",
+    "makeS2",
+    "map",
+    "markedGB",
+    "match",
+    "mathML",
+    "matrix",
+    "max",
+    "maxPosition",
+    "member",
+    "memoize",
+    "memoizeClear",
+    "memoizeValues",
+    "merge",
+    "mergePairs",
+    "method",
+    "methodOptions",
+    "methods",
+    "midpoint",
+    "min",
+    "minPosition",
+    "minPres",
+    "mingens",
+    "mingle",
+    "minimalBetti",
+    "minimalPresentation",
+    "minimalPrimes",
+    "minimalReduction",
+    "minimize",
+    "minimizeFilename",
+    "minors",
+    "minprimes",
+    "minus",
+    "mkdir",
+    "mod",
+    "module",
+    "modulo",
+    "monoid",
+    "monomialCurveIdeal",
+    "monomialIdeal",
+    "monomialSubideal",
+    "monomials",
+    "moveFile",
+    "multidegree",
+    "multidoc",
+    "multigraded",
+    "multiplicity",
+    "mutable",
+    "mutableIdentity",
+    "mutableMatrix",
+    "nanosleep",
+    "needs",
+    "needsPackage",
+    "net",
+    "netList",
+    "newClass",
+    "newCoordinateSystem",
+    "newNetFile",
+    "newPackage",
+    "newRing",
+    "next",
+    "nextPrime",
+    "nextkey",
+    "nonspaceAnalyzer",
+    "norm",
+    "normalCone",
+    "notImplemented",
+    "nullParser",
+    "nullSpace",
+    "nullhomotopy",
+    "numColumns",
+    "numRows",
+    "number",
+    "numcols",
+    "numerator",
+    "numeric",
+    "numericInterval",
+    "numgens",
+    "numrows",
+    "odd",
+    "oeis",
+    "ofClass",
+    "on",
+    "openDatabase",
+    "openDatabaseOut",
+    "openFiles",
+    "openIn",
+    "openInOut",
+    "openListener",
+    "openOut",
+    "openOutAppend",
+    "optP",
+    "optionalSignParser",
+    "options",
+    "orP",
+    "override",
+    "pack",
+    "package",
+    "packageTemplate",
+    "pad",
+    "pager",
+    "pairs",
+    "parallelApply",
+    "parent",
+    "part",
+    "partition",
+    "partitions",
+    "parts",
+    "pdim",
+    "peek",
+    "permanents",
+    "permutations",
+    "pfaffians",
+    "pivots",
+    "plus",
+    "poincare",
+    "poincareN",
+    "polarize",
+    "poly",
+    "position",
+    "positions",
+    "power",
+    "powermod",
+    "precision",
+    "preimage",
+    "prepend",
+    "presentation",
+    "pretty",
+    "primaryComponent",
+    "primaryDecomposition",
+    "print",
+    "printString",
+    "printerr",
+    "processID",
+    "product",
+    "profile",
+    "projectiveHilbertPolynomial",
+    "promote",
+    "protect",
+    "prune",
+    "pseudoRemainder",
+    "pseudocode",
+    "pullback",
+    "pushForward",
+    "pushout",
+    "quotient",
+    "quotientRemainder",
+    "radical",
+    "radicalContainment",
+    "random",
+    "randomKRationalPoint",
+    "randomMutableMatrix",
+    "rank",
+    "rays",
+    "read",
+    "readDirectory",
+    "readPackage",
+    "readlink",
+    "realPart",
+    "realpath",
+    "recursionDepth",
+    "reduceHilbert",
+    "reducedRowEchelonForm",
+    "reductionNumber",
+    "reesAlgebra",
+    "reesAlgebraIdeal",
+    "reesIdeal",
+    "regSeqInIdeal",
+    "regex",
+    "regexQuote",
+    "registerFinalizer",
+    "regularity",
+    "regularizedBeta",
+    "regularizedGamma",
+    "relations",
+    "relativizeFilename",
+    "remainder",
+    "remove",
+    "removeDirectory",
+    "removeFile",
+    "removeLowestDimension",
+    "reorganize",
+    "replace",
+    "res",
+    "reshape",
+    "resolution",
+    "resultant",
+    "reverse",
+    "right",
+    "ring",
+    "ringFromFractions",
+    "roots",
+    "rotate",
+    "round",
+    "rowAdd",
+    "rowMult",
+    "rowPermute",
+    "rowRankProfile",
+    "rowSwap",
+    "rsort",
+    "run",
+    "runHooks",
+    "runLengthEncode",
+    "runProgram",
+    "same",
+    "saturate",
+    "scan",
+    "scanKeys",
+    "scanLines",
+    "scanPairs",
+    "scanValues",
+    "schedule",
+    "schreyerOrder",
+    "searchPath",
+    "sec",
+    "sech",
+    "seeParsing",
+    "select",
+    "selectInSubring",
+    "selectKeys",
+    "selectPairs",
+    "selectValues",
+    "selectVariables",
+    "separate",
+    "separateRegexp",
+    "sequence",
+    "serialNumber",
+    "set",
+    "setEcho",
+    "setGroupID",
+    "setIOExclusive",
+    "setIOSynchronized",
+    "setIOUnSynchronized",
+    "setRandomSeed",
+    "setup",
+    "setupEmacs",
+    "setupLift",
+    "setupPromote",
+    "sheaf",
+    "sheafHom",
+    "sheafMap",
+    "show",
+    "showHtml",
+    "showTex",
+    "simpleDocFrob",
+    "sin",
+    "singularLocus",
+    "sinh",
+    "size",
+    "size2",
+    "sleep",
+    "smithNormalForm",
+    "solve",
+    "someTerms",
+    "sort",
+    "sortColumns",
+    "source",
+    "span",
+    "specialFiber",
+    "specialFiberIdeal",
+    "splice",
+    "splitWWW",
+    "sqrt",
+    "stack",
+    "stacksProject",
+    "standardForm",
+    "standardPairs",
+    "stashValue",
+    "status",
+    "store",
+    "style",
+    "sub",
+    "sublists",
+    "submatrix",
+    "submatrixByDegrees",
+    "subquotient",
+    "subsets",
+    "substitute",
+    "substring",
+    "subtable",
+    "sum",
+    "super",
+    "support",
+    "switch",
+    "sylvesterMatrix",
+    "symbolBody",
+    "symlinkDirectory",
+    "symlinkFile",
+    "symmetricAlgebra",
+    "symmetricAlgebraIdeal",
+    "symmetricKernel",
+    "symmetricPower",
+    "synonym",
+    "syz",
+    "syzygyScheme",
+    "table",
+    "take",
+    "tally",
+    "tan",
+    "tangentCone",
+    "tangentSheaf",
+    "tanh",
+    "target",
+    "taskResult",
+    "temporaryFileName",
+    "tensor",
+    "tensorAssociativity",
+    "terminalParser",
+    "terms",
+    "testHunekeQuestion",
+    "tests",
+    "tex",
+    "texMath",
+    "times",
+    "toAbsolutePath",
+    "toCC",
+    "toDividedPowers",
+    "toDual",
+    "toExternalString",
+    "toField",
+    "toList",
+    "toLower",
+    "toRR",
+    "toRRi",
+    "toSequence",
+    "toString",
+    "toUpper",
+    "top",
+    "topCoefficients",
+    "topComponents",
+    "trace",
+    "transpose",
+    "trim",
+    "truncate",
+    "truncateOutput",
+    "tutorial",
+    "ultimate",
+    "unbag",
+    "uncurry",
+    "undocumented",
+    "uniform",
+    "uninstallAllPackages",
+    "uninstallPackage",
+    "union",
+    "unique",
+    "uniquePermutations",
+    "unsequence",
+    "unstack",
+    "urlEncode",
+    "use",
+    "userSymbols",
+    "utf8",
+    "utf8check",
+    "utf8substring",
+    "validate",
+    "value",
+    "values",
+    "variety",
+    "vars",
+    "vector",
+    "versalEmbedding",
+    "wait",
+    "wedgeProduct",
+    "weightRange",
+    "whichGm",
+    "width",
+    "wikipedia",
+    "wrap",
+    "youngest",
+    "zero",
+    "zeta"
+    )
+
+M2CONSTANTS = (
+    "A1BrouwerDegrees",
+    "AbstractSimplicialComplexes",
+    "AbstractToricVarieties",
+    "Acknowledgement",
+    "AdditionalPaths",
+    "AdjointIdeal",
+    "AdjunctionForSurfaces",
+    "AfterEval",
+    "AfterNoPrint",
+    "AfterPrint",
+    "AInfinity",
+    "AlgebraicSplines",
+    "Algorithm",
+    "Alignment",
+    "AllCodimensions",
+    "allowableThreads",
+    "AnalyzeSheafOnP1",
+    "applicationDirectorySuffix",
+    "argument",
+    "Ascending",
+    "AssociativeAlgebras",
+    "Authors",
+    "AuxiliaryFiles",
+    "backtrace",
+    "Bareiss",
+    "Base",
+    "BaseFunction",
+    "baseRings",
+    "BaseRow",
+    "BasisElementLimit",
+    "Bayer",
+    "BeforePrint",
+    "BeginningMacaulay2",
+    "Benchmark",
+    "BernsteinSato",
+    "Bertini",
+    "BettiCharacters",
+    "BGG",
+    "BIBasis",
+    "Binary",
+    "Binomial",
+    "BinomialEdgeIdeals",
+    "Binomials",
+    "BKZ",
+    "blockMatrixForm",
+    "Body",
+    "BoijSoederberg",
+    "Book3264Examples",
+    "BooleanGB",
+    "Boxes",
+    "Browse",
+    "Bruns",
+    "cache",
+    "CacheExampleOutput",
+    "CallLimit",
+    "CannedExample",
+    "CatalanConstant",
+    "Caveat",
+    "CellularResolutions",
+    "Center",
+    "Certification",
+    "ChainComplexExtras",
+    "ChainComplexOperations",
+    "ChangeMatrix",
+    "CharacteristicClasses",
+    "CheckDocumentation",
+    "Chordal",
+    "cite",
+    "Classic",
+    "clearAll",
+    "clearOutput",
+    "close",
+    "closeIn",
+    "closeOut",
+    "ClosestFit",
+    "Code",
+    "CodimensionLimit",
+    "CodingTheory",
+    "CoefficientRing",
+    "Cofactor",
+    "CohenEngine",
+    "CohenTopLevel",
+    "CohomCalg",
+    "CoincidentRootLoci",
+    "commandLine",
+    "compactMatrixForm",
+    "Complement",
+    "CompleteIntersection",
+    "CompleteIntersectionResolutions",
+    "Complexes",
+    "ConductorElement",
+    "Configuration",
+    "ConformalBlocks",
+    "Consequences",
+    "Constants",
+    "Contributors",
+    "ConvexInterface",
+    "ConwayPolynomials",
+    "copyright",
+    "Core",
+    "CorrespondenceScrolls",
+    "CotangentSchubert",
+    "Cremona",
+    "currentFileDirectory",
+    "currentFileName",
+    "currentLayout",
+    "currentPackage",
+    "Cyclotomic",
+    "Date",
+    "dd",
+    "DebuggingMode",
+    "debuggingMode",
+    "debugLevel",
+    "DecomposableSparseSystems",
+    "Decompose",
+    "Default",
+    "defaultPrecision",
+    "Degree",
+    "DegreeGroup",
+    "DegreeLift",
+    "DegreeLimit",
+    "DegreeMap",
+    "DegreeOrder",
+    "DegreeRank",
+    "Degrees",
+    "Dense",
+    "Density",
+    "Depth",
+    "Descending",
+    "Description",
+    "DeterminantalRepresentations",
+    "DGAlgebras",
+    "dictionaryPath",
+    "DiffAlg",
+    "Dispatch",
+    "DivideConquer",
+    "DividedPowers",
+    "Divisor",
+    "Dmodules",
+    "docExample",
+    "docTemplate",
+    "Down",
+    "Dynamic",
+    "EagonResolution",
+    "EdgeIdeals",
+    "edit",
+    "EigenSolver",
+    "EisenbudHunekeVasconcelos",
+    "Elimination",
+    "EliminationMatrices",
+    "EllipticCurves",
+    "EllipticIntegrals",
+    "Email",
+    "end",
+    "endl",
+    "Engine",
+    "engineDebugLevel",
+    "EngineTests",
+    "EnumerationCurves",
+    "environment",
+    "EquivariantGB",
+    "errorDepth",
+    "EulerConstant",
+    "Example",
+    "ExampleFiles",
+    "ExampleSystems",
+    "Exclude",
+    "exit",
+    "Ext",
+    "ExteriorIdeals",
+    "ExteriorModules",
+    "false",
+    "FastMinors",
+    "FastNonminimal",
+    "FGLM",
+    "fileDictionaries",
+    "fileExitHooks",
+    "FileName",
+    "FindOne",
+    "FiniteFittingIdeals",
+    "First",
+    "FirstPackage",
+    "FlatMonoid",
+    "Flexible",
+    "flush",
+    "FollowLinks",
+    "ForeignFunctions",
+    "FormalGroupLaws",
+    "Format",
+    "FourierMotzkin",
+    "FourTiTwo",
+    "fpLLL",
+    "FrobeniusThresholds",
+    "FunctionFieldDesingularization",
+    "GBDegrees",
+    "gbTrace",
+    "GenerateAssertions",
+    "Generic",
+    "GenericInitialIdeal",
+    "GeometricDecomposability",
+    "gfanInterface",
+    "Givens",
+    "GKMVarieties",
+    "GLex",
+    "Global",
+    "GlobalAssignHook",
+    "globalAssignmentHooks",
+    "GlobalHookStore",
+    "GlobalReleaseHook",
+    "GlobalSectionLimit",
+    "Gorenstein",
+    "GradedLieAlgebras",
+    "GraphicalModels",
+    "GraphicalModelsMLE",
+    "Graphics",
+    "Graphs",
+    "GRevLex",
+    "GroebnerStrata",
+    "GroebnerWalk",
+    "GroupLex",
+    "GroupRevLex",
+    "GTZ",
+    "Hadamard",
+    "handleInterrupts",
+    "HardDegreeLimit",
+    "Heading",
+    "Headline",
+    "Heft",
+    "Height",
+    "help",
+    "Hermite",
+    "Hermitian",
+    "HH",
+    "hh",
+    "HigherCIOperators",
+    "HighestWeights",
+    "Hilbert",
+    "HodgeIntegrals",
+    "HolonomicSystems",
+    "homeDirectory",
+    "HomePage",
+    "Homogeneous",
+    "Homogeneous2",
+    "HomotopyLieAlgebra",
+    "HorizontalSpace",
+    "HyperplaneArrangements",
+    "id",
+    "IgnoreExampleErrors",
+    "ii",
+    "incomparable",
+    "Increment",
+    "indeterminate",
+    "Index",
+    "indexComponents",
+    "infinity",
+    "InfoDirSection",
+    "infoHelp",
+    "Inhomogeneous",
+    "Inputs",
+    "InstallPrefix",
+    "IntegralClosure",
+    "interpreterDepth",
+    "Intersection",
+    "InvariantRing",
+    "InverseMethod",
+    "Inverses",
+    "InverseSystems",
+    "Invertible",
+    "InvolutiveBases",
+    "Isomorphism",
+    "Item",
+    "Iterate",
+    "Jacobian",
+    "Jets",
+    "Join",
+    "JSON",
+    "Jupyter",
+    "K3Carpets",
+    "K3Surfaces",
+    "Keep",
+    "KeepFiles",
+    "KeepZeroes",
+    "Key",
+    "Keywords",
+    "Kronecker",
+    "KustinMiller",
+    "lastMatch",
+    "LatticePolytopes",
+    "Layout",
+    "Left",
+    "LengthLimit",
+    "Lex",
+    "LexIdeals",
+    "Licenses",
+    "LieTypes",
+    "Limit",
+    "Linear",
+    "LinearAlgebra",
+    "LinearTruncations",
+    "lineNumber",
+    "listLocalSymbols",
+    "listUserSymbols",
+    "LLLBases",
+    "loadDepth",
+    "LoadDocumentation",
+    "loadedFiles",
+    "loadedPackages",
+    "Local",
+    "LocalRings",
+    "LongPolynomial",
+    "M0nbar",
+    "Macaulay2Doc",
+    "Maintainer",
+    "MakeDocumentation",
+    "MakeHTML",
+    "MakeInfo",
+    "MakeLinks",
+    "MakePDF",
+    "MapleInterface",
+    "Markov",
+    "MatchingFields",
+    "MatrixSchubert",
+    "Matroids",
+    "maxAllowableThreads",
+    "maxExponent",
+    "MaximalRank",
+    "MaxReductionCount",
+    "MCMApproximations",
+    "MergeTeX",
+    "minExponent",
+    "MinimalGenerators",
+    "MinimalMatrix",
+    "minimalPresentationMap",
+    "minimalPresentationMapInv",
+    "MinimalPrimes",
+    "Minimize",
+    "MinimumVersion",
+    "Miura",
+    "MixedMultiplicity",
+    "ModuleDeformations",
+    "MonodromySolver",
+    "Monomial",
+    "MonomialAlgebras",
+    "MonomialIntegerPrograms",
+    "MonomialOrbits",
+    "MonomialOrder",
+    "Monomials",
+    "MonomialSize",
+    "Msolve",
+    "MultigradedBGG",
+    "MultigradedImplicitization",
+    "MultiGradedRationalMap",
+    "MultiplicitySequence",
+    "MultiplierIdeals",
+    "MultiplierIdealsDim2",
+    "MultiprojectiveVarieties",
+    "NAGtypes",
+    "Name",
+    "Nauty",
+    "NautyGraphs",
+    "NCAlgebra",
+    "NCLex",
+    "NewFromMethod",
+    "newline",
+    "NewMethod",
+    "NewOfFromMethod",
+    "NewOfMethod",
+    "nil",
+    "Node",
+    "NoetherianOperators",
+    "NoetherNormalization",
+    "NonminimalComplexes",
+    "NoPrint",
+    "Normaliz",
+    "NormalToricVarieties",
+    "notify",
+    "NTL",
+    "null",
+    "nullaryMethods",
+    "NumericalAlgebraicGeometry",
+    "NumericalCertification",
+    "NumericalImplicitization",
+    "NumericalLinearAlgebra",
+    "NumericalSchubertCalculus",
+    "NumericalSemigroups",
+    "NumericSolutions",
+    "numTBBThreads",
+    "OIGroebnerBases",
+    "OldPolyhedra",
+    "OldToricVectorBundles",
+    "OnlineLookup",
+    "OO",
+    "oo",
+    "ooo",
+    "oooo",
+    "OpenMath",
+    "operatorAttributes",
+    "OptionalComponentsPresent",
+    "Options",
+    "Order",
+    "order",
+    "OutputDictionary",
+    "Outputs",
+    "PackageCitations",
+    "PackageDictionary",
+    "PackageExports",
+    "PackageImports",
+    "PackageTemplate",
+    "PairLimit",
+    "PairsRemaining",
+    "ParallelF4",
+    "ParallelizeByDegree",
+    "Parametrization",
+    "Parsing",
+    "path",
+    "PencilsOfQuadrics",
+    "Permanents",
+    "Permutations",
+    "PHCpack",
+    "PhylogeneticTrees",
+    "pi",
+    "PieriMaps",
+    "PlaneCurveLinearSeries",
+    "PlaneCurveSingularities",
+    "Points",
+    "Polyhedra",
+    "Polymake",
+    "PolyominoIdeals",
+    "Posets",
+    "Position",
+    "PositivityToricBundles",
+    "POSIX",
+    "Postfix",
+    "Pre",
+    "Precision",
+    "Prefix",
+    "prefixDirectory",
+    "prefixPath",
+    "PrimaryDecomposition",
+    "PrimaryTag",
+    "PrimitiveElement",
+    "Print",
+    "printingAccuracy",
+    "printingLeadLimit",
+    "printingPrecision",
+    "printingSeparator",
+    "printingTimeLimit",
+    "printingTrailLimit",
+    "printWidth",
+    "Probability",
+    "profileSummary",
+    "programPaths",
+    "Projective",
+    "Prune",
+    "PruneComplex",
+    "pruningMap",
+    "PseudomonomialPrimaryDecomposition",
+    "Pullback",
+    "pullbackMaps",
+    "PushForward",
+    "pushoutMaps",
+    "Python",
+    "QthPower",
+    "QuadraticIdealExamplesByRoos",
+    "Quasidegrees",
+    "QuaternaryQuartics",
+    "QuillenSuslin",
+    "quit",
+    "Quotient",
+    "Radical",
+    "RadicalCodim1",
+    "RaiseError",
+    "RandomCanonicalCurves",
+    "RandomComplexes",
+    "RandomCurves",
+    "RandomCurvesOverVerySmallFiniteFields",
+    "RandomGenus14Curves",
+    "RandomIdeals",
+    "RandomMonomialIdeals",
+    "RandomObjects",
+    "RandomPlaneCurves",
+    "RandomPoints",
+    "RandomSpaceCurves",
+    "Range",
+    "RationalMaps",
+    "RationalPoints",
+    "RationalPoints2",
+    "ReactionNetworks",
+    "RealFP",
+    "RealQP",
+    "RealQP1",
+    "RealRoots",
+    "RealRR",
+    "RealXD",
+    "recursionLimit",
+    "Reduce",
+    "ReesAlgebra",
+    "References",
+    "ReflexivePolytopesDB",
+    "Regularity",
+    "RelativeCanonicalResolution",
+    "Reload",
+    "RemakeAllDocumentation",
+    "RerunExamples",
+    "ResidualIntersections",
+    "ResLengthThree",
+    "ResolutionsOfStanleyReisnerRings",
+    "restart",
+    "Result",
+    "Resultants",
+    "returnCode",
+    "Reverse",
+    "RevLex",
+    "Right",
+    "RInterface",
+    "rootPath",
+    "rootURI",
+    "RunDirectory",
+    "RunExamples",
+    "RunExternalM2",
+    "SagbiGbDetection",
+    "Saturation",
+    "SaturationMap",
+    "Schubert2",
+    "SchurComplexes",
+    "SchurFunctors",
+    "SchurRings",
+    "SchurVeronese",
+    "SCMAlgebras",
+    "scriptCommandLine",
+    "SCSCP",
+    "SectionRing",
+    "SeeAlso",
+    "SegreClasses",
+    "SemidefiniteProgramming",
+    "Seminormalization",
+    "SeparateExec",
+    "Serialization",
+    "sheafExt",
+    "ShimoyamaYokoyama",
+    "showClassStructure",
+    "showStructure",
+    "showUserStructure",
+    "SimpleDoc",
+    "SimplicialComplexes",
+    "SimplicialDecomposability",
+    "SimplicialPosets",
+    "SimplifyFractions",
+    "SizeLimit",
+    "SkewCommutative",
+    "SlackIdeals",
+    "SLnEquivariantMatrices",
+    "SLPexpressions",
+    "Sort",
+    "SortStrategy",
+    "SourceCode",
+    "SourceRing",
+    "SpaceCurves",
+    "SparseResultants",
+    "SpechtModule",
+    "SpecialFanoFourfolds",
+    "SpectralSequences",
+    "SRdeformations",
+    "Standard",
+    "StartWithOneMinor",
+    "StatePolytope",
+    "StatGraphs",
+    "stderr",
+    "stdio",
+    "StopBeforeComputation",
+    "stopIfError",
+    "StopIteration",
+    "StopWithMinimalGenerators",
+    "Strategy",
+    "Strict",
+    "StronglyStableIdeals",
+    "Style",
+    "SubalgebraBases",
+    "Subnodes",
+    "SubringLimit",
+    "subscript",
+    "Sugarless",
+    "SumsOfSquares",
+    "SuperLinearAlgebra",
+    "superscript",
+    "SVDComplexes",
+    "SwitchingFields",
+    "SymbolicPowers",
+    "SymmetricPolynomials",
+    "Synopsis",
+    "Syzygies",
+    "SyzygyLimit",
+    "SyzygyMatrix",
+    "SyzygyRows",
+    "TangentCone",
+    "TateOnProducts",
+    "TensorComplexes",
+    "TerraciniLoci",
+    "Test",
+    "testExample",
+    "TestIdeals",
+    "TeXmacs",
+    "Text",
+    "ThinSincereQuivers",
+    "ThreadedGB",
+    "Threads",
+    "Threshold",
+    "Topcom",
+    "topLevelMode",
+    "Tor",
+    "TorAlgebra",
+    "Toric",
+    "ToricInvariants",
+    "ToricTopology",
+    "ToricVectorBundles",
+    "Torsion",
+    "TorsionFree",
+    "TotalPairs",
+    "Tree",
+    "TriangularSets",
+    "Triangulations",
+    "Tries",
+    "Trim",
+    "Triplets",
+    "Tropical",
+    "TropicalToric",
+    "true",
+    "Truncate",
+    "Truncations",
+    "TSpreadIdeals",
+    "TypicalValue",
+    "typicalValues",
+    "Undo",
+    "Unique",
+    "Units",
+    "Unmixed",
+    "Up",
+    "UpdateOnly",
+    "UpperTriangular",
+    "Usage",
+    "UseCachedExampleOutput",
+    "UseHilbertFunction",
+    "UserMode",
+    "UseSyzygies",
+    "Valuations",
+    "Variable",
+    "VariableBaseName",
+    "Variables",
+    "Varieties",
+    "Vasconcelos",
+    "VectorFields",
+    "VectorGraphics",
+    "Verbose",
+    "Verbosity",
+    "Verify",
+    "VersalDeformations",
+    "Version",
+    "version",
+    "VerticalSpace",
+    "viewHelp",
+    "VirtualResolutions",
+    "Visualize",
+    "VNumber",
+    "WebApp",
+    "Weights",
+    "WeylAlgebra",
+    "WeylAlgebras",
+    "WeylGroups",
+    "WhitneyStratifications",
+    "Wrap",
+    "XML"
+    )
+
+class Macaulay2Lexer(RegexLexer):
+    """Lexer for Macaulay2, a software system for research in algebraic geometry."""
+
+    name = 'Macaulay2'
+    url = 'https://macaulay2.com/'
+    aliases = ['macaulay2']
+    filenames = ['*.m2']
+    version_added = '2.12'
+
+    tokens = {
+        'root': [
+            (r'--.*$', Comment.Single),
+            (r'-\*', Comment.Multiline, 'block comment'),
+            (r'"', String, 'quote string'),
+            (r'///', String, 'slash string'),
+            (words(M2KEYWORDS, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(M2DATATYPES, prefix=r'\b', suffix=r'\b'), Name.Builtin),
+            (words(M2FUNCTIONS, prefix=r'\b', suffix=r'\b'), Name.Function),
+            (words(M2CONSTANTS, prefix=r'\b', suffix=r'\b'), Name.Constant),
+            (r'\s+', Text.Whitespace),
+            (r'.', Text)
+        ],
+        'block comment' : [
+            (r'[^*-]+', Comment.Multiline),
+            (r'\*-', Comment.Multiline, '#pop'),
+            (r'[*-]', Comment.Multiline)
+        ],
+        'quote string' : [
+            (r'[^\\"]+', String),
+            (r'"', String, '#pop'),
+            (r'\\"?', String),
+        ],
+        'slash string' : [
+            (r'[^/]+', String),
+            (r'(//)+(?!/)', String),
+            (r'/(//)+(?!/)', String, '#pop'),
+            (r'/', String)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/make.py b/.venv/Lib/site-packages/pygments/lexers/make.py
new file mode 100644 (file)
index 0000000..3940a00
--- /dev/null
@@ -0,0 +1,212 @@
+"""
+    pygments.lexers.make
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Makefiles and similar.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, bygroups, \
+    do_insertions, using
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Punctuation, Whitespace
+from pygments.lexers.shell import BashLexer
+
+__all__ = ['MakefileLexer', 'BaseMakefileLexer', 'CMakeLexer']
+
+
+class MakefileLexer(Lexer):
+    """
+    Lexer for BSD and GNU make extensions (lenient enough to handle both in
+    the same file even).
+
+    *Rewritten in Pygments 0.10.*
+    """
+
+    name = 'Makefile'
+    aliases = ['make', 'makefile', 'mf', 'bsdmake']
+    filenames = ['*.mak', '*.mk', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile']
+    mimetypes = ['text/x-makefile']
+    url = 'https://en.wikipedia.org/wiki/Make_(software)'
+    version_added = ''
+
+    r_special = re.compile(
+        r'^(?:'
+        # BSD Make
+        r'\.\s*(include|undef|error|warning|if|else|elif|endif|for|endfor)|'
+        # GNU Make
+        r'\s*(ifeq|ifneq|ifdef|ifndef|else|endif|-?include|define|endef|:|vpath)|'
+        # GNU Automake
+        r'\s*(if|else|endif))(?=\s)')
+    r_comment = re.compile(r'^\s*@?#')
+
+    def get_tokens_unprocessed(self, text):
+        ins = []
+        lines = text.splitlines(keepends=True)
+        done = ''
+        lex = BaseMakefileLexer(**self.options)
+        backslashflag = False
+        for line in lines:
+            if self.r_special.match(line) or backslashflag:
+                ins.append((len(done), [(0, Comment.Preproc, line)]))
+                backslashflag = line.strip().endswith('\\')
+            elif self.r_comment.match(line):
+                ins.append((len(done), [(0, Comment, line)]))
+            else:
+                done += line
+        yield from do_insertions(ins, lex.get_tokens_unprocessed(done))
+
+    def analyse_text(text):
+        # Many makefiles have $(BIG_CAPS) style variables
+        if re.search(r'\$\([A-Z_]+\)', text):
+            return 0.1
+
+
+class BaseMakefileLexer(RegexLexer):
+    """
+    Lexer for simple Makefiles (no preprocessing).
+    """
+
+    name = 'Base Makefile'
+    aliases = ['basemake']
+    filenames = []
+    mimetypes = []
+    url = 'https://en.wikipedia.org/wiki/Make_(software)'
+    version_added = '0.10'
+
+    tokens = {
+        'root': [
+            # recipes (need to allow spaces because of expandtabs)
+            (r'^(?:[\t ]+.*\n|\n)+', using(BashLexer)),
+            # special variables
+            (r'\$[<@$+%?|*]', Keyword),
+            (r'\s+', Whitespace),
+            (r'#.*?\n', Comment),
+            (r'((?:un)?export)(\s+)(?=[\w${}\t -]+\n)',
+             bygroups(Keyword, Whitespace), 'export'),
+            (r'(?:un)?export\s+', Keyword),
+            # assignment
+            (r'([\w${}().-]+)(\s*)([!?:+]?=)([ \t]*)((?:.*\\\n)+|.*\n)',
+             bygroups(
+                Name.Variable, Whitespace, Operator, Whitespace,
+                using(BashLexer))),
+            # strings
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            # targets
+            (r'([^\n:]+)(:+)([ \t]*)', bygroups(
+                Name.Function, Operator, Whitespace),
+             'block-header'),
+            # expansions
+            (r'\$\(', Keyword, 'expansion'),
+        ],
+        'expansion': [
+            (r'[^\w$().-]+', Text),
+            (r'[\w.-]+', Name.Variable),
+            (r'\$', Keyword),
+            (r'\(', Keyword, '#push'),
+            (r'\)', Keyword, '#pop'),
+        ],
+        'export': [
+            (r'[\w${}-]+', Name.Variable),
+            (r'\n', Text, '#pop'),
+            (r'\s+', Whitespace),
+        ],
+        'block-header': [
+            (r'[,|]', Punctuation),
+            (r'#.*?\n', Comment, '#pop'),
+            (r'\\\n', Text),  # line continuation
+            (r'\$\(', Keyword, 'expansion'),
+            (r'[a-zA-Z_]+', Name),
+            (r'\n', Whitespace, '#pop'),
+            (r'.', Text),
+        ],
+    }
+
+
+class CMakeLexer(RegexLexer):
+    """
+    Lexer for CMake files.
+    """
+    name = 'CMake'
+    url = 'https://cmake.org/documentation/'
+    aliases = ['cmake']
+    filenames = ['*.cmake', 'CMakeLists.txt']
+    mimetypes = ['text/x-cmake']
+    version_added = '1.2'
+
+    tokens = {
+        'root': [
+            # (r'(ADD_CUSTOM_COMMAND|ADD_CUSTOM_TARGET|ADD_DEFINITIONS|'
+            # r'ADD_DEPENDENCIES|ADD_EXECUTABLE|ADD_LIBRARY|ADD_SUBDIRECTORY|'
+            # r'ADD_TEST|AUX_SOURCE_DIRECTORY|BUILD_COMMAND|BUILD_NAME|'
+            # r'CMAKE_MINIMUM_REQUIRED|CONFIGURE_FILE|CREATE_TEST_SOURCELIST|'
+            # r'ELSE|ELSEIF|ENABLE_LANGUAGE|ENABLE_TESTING|ENDFOREACH|'
+            # r'ENDFUNCTION|ENDIF|ENDMACRO|ENDWHILE|EXEC_PROGRAM|'
+            # r'EXECUTE_PROCESS|EXPORT_LIBRARY_DEPENDENCIES|FILE|FIND_FILE|'
+            # r'FIND_LIBRARY|FIND_PACKAGE|FIND_PATH|FIND_PROGRAM|FLTK_WRAP_UI|'
+            # r'FOREACH|FUNCTION|GET_CMAKE_PROPERTY|GET_DIRECTORY_PROPERTY|'
+            # r'GET_FILENAME_COMPONENT|GET_SOURCE_FILE_PROPERTY|'
+            # r'GET_TARGET_PROPERTY|GET_TEST_PROPERTY|IF|INCLUDE|'
+            # r'INCLUDE_DIRECTORIES|INCLUDE_EXTERNAL_MSPROJECT|'
+            # r'INCLUDE_REGULAR_EXPRESSION|INSTALL|INSTALL_FILES|'
+            # r'INSTALL_PROGRAMS|INSTALL_TARGETS|LINK_DIRECTORIES|'
+            # r'LINK_LIBRARIES|LIST|LOAD_CACHE|LOAD_COMMAND|MACRO|'
+            # r'MAKE_DIRECTORY|MARK_AS_ADVANCED|MATH|MESSAGE|OPTION|'
+            # r'OUTPUT_REQUIRED_FILES|PROJECT|QT_WRAP_CPP|QT_WRAP_UI|REMOVE|'
+            # r'REMOVE_DEFINITIONS|SEPARATE_ARGUMENTS|SET|'
+            # r'SET_DIRECTORY_PROPERTIES|SET_SOURCE_FILES_PROPERTIES|'
+            # r'SET_TARGET_PROPERTIES|SET_TESTS_PROPERTIES|SITE_NAME|'
+            # r'SOURCE_GROUP|STRING|SUBDIR_DEPENDS|SUBDIRS|'
+            # r'TARGET_LINK_LIBRARIES|TRY_COMPILE|TRY_RUN|UNSET|'
+            # r'USE_MANGLED_MESA|UTILITY_SOURCE|VARIABLE_REQUIRES|'
+            # r'VTK_MAKE_INSTANTIATOR|VTK_WRAP_JAVA|VTK_WRAP_PYTHON|'
+            # r'VTK_WRAP_TCL|WHILE|WRITE_FILE|'
+            # r'COUNTARGS)\b', Name.Builtin, 'args'),
+            (r'\b(\w+)([ \t]*)(\()', bygroups(Name.Builtin, Whitespace,
+                                              Punctuation), 'args'),
+            include('keywords'),
+            include('ws')
+        ],
+        'args': [
+            (r'\(', Punctuation, '#push'),
+            (r'\)', Punctuation, '#pop'),
+            (r'(\$\{)(.+?)(\})', bygroups(Operator, Name.Variable, Operator)),
+            (r'(\$ENV\{)(.+?)(\})', bygroups(Operator, Name.Variable, Operator)),
+            (r'(\$<)(.+?)(>)', bygroups(Operator, Name.Variable, Operator)),
+            (r'(?s)".*?"', String.Double),
+            (r'\\\S+', String),
+            (r'\[(?P<level>=*)\[[\w\W]*?\](?P=level)\]', String.Multiline),
+            (r'[^)$"# \t\n]+', String),
+            (r'\n', Whitespace),  # explicitly legal
+            include('keywords'),
+            include('ws')
+        ],
+        'string': [
+
+        ],
+        'keywords': [
+            (r'\b(WIN32|UNIX|APPLE|CYGWIN|BORLAND|MINGW|MSVC|MSVC_IDE|MSVC60|'
+             r'MSVC70|MSVC71|MSVC80|MSVC90)\b', Keyword),
+        ],
+        'ws': [
+            (r'[ \t]+', Whitespace),
+            (r'#\[(?P<level>=*)\[[\w\W]*?\](?P=level)\]', Comment),
+            (r'#.*\n', Comment),
+        ]
+    }
+
+    def analyse_text(text):
+        exp = (
+            r'^[ \t]*CMAKE_MINIMUM_REQUIRED[ \t]*'
+            r'\([ \t]*VERSION[ \t]*\d+(\.\d+)*[ \t]*'
+            r'([ \t]FATAL_ERROR)?[ \t]*\)[ \t]*'
+            r'(#[^\n]*)?$'
+        )
+        if re.search(exp, text, flags=re.MULTILINE | re.IGNORECASE):
+            return 0.8
+        return 0.0
diff --git a/.venv/Lib/site-packages/pygments/lexers/maple.py b/.venv/Lib/site-packages/pygments/lexers/maple.py
new file mode 100644 (file)
index 0000000..c744e7e
--- /dev/null
@@ -0,0 +1,291 @@
+"""
+    pygments.lexers.maple
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Maple.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import words, bygroups, ExtendedRegexLexer
+from pygments.token import Comment, Name, String, Whitespace, Operator, Punctuation, Number, Keyword
+
+__all__ = ['MapleLexer']
+
+
+class MapleLexer(ExtendedRegexLexer):
+    """
+    Lexer for Maple.
+    """
+
+    name = 'Maple'
+    aliases = ['maple']
+    filenames = ['*.mpl', '*.mi', '*.mm']
+    mimetypes = ['text/x-maple']
+    url = 'https://www.maplesoft.com/products/Maple/'
+    version_added = '2.19'
+
+    keywords = ('and',
+                'assuming',
+                'break',
+                'by',
+                'catch',
+                'description',
+                'do',
+                'done',
+                'elif',
+                'else',
+                'end',
+                'error',
+                'export',
+                'fi',
+                'finally',
+                'for',
+                'from',
+                'global',
+                'if',
+                'implies',
+                'in',
+                'intersect',
+                'local',
+                'minus',
+                'mod',
+                'module',
+                'next',
+                'not',
+                'od',
+                'option',
+                'options',
+                'or',
+                'proc',
+                'quit',
+                'read',
+                'return',
+                'save',
+                'stop',
+                'subset',
+                'then',
+                'to',
+                'try',
+                'union',
+                'use',
+                'uses',
+                'while',
+                'xor')
+
+    builtins = ('abs',
+                'add',
+                'addressof',
+                'anames',
+                'and',
+                'andmap',
+                'andseq',
+                'appendto',
+                'Array',
+                'array',
+                'ArrayOptions',
+                'assemble',
+                'ASSERT',
+                'assign',
+                'assigned',
+                'attributes',
+                'cat',
+                'ceil',
+                'coeff',
+                'coeffs',
+                'conjugate',
+                'convert',
+                'CopySign',
+                'DEBUG',
+                'debugopts',
+                'Default0',
+                'DefaultOverflow',
+                'DefaultUnderflow',
+                'degree',
+                'denom',
+                'diff',
+                'disassemble',
+                'divide',
+                'done',
+                'entries',
+                'EqualEntries',
+                'eval',
+                'evalb',
+                'evalf',
+                'evalhf',
+                'evalindets',
+                'evaln',
+                'expand',
+                'exports',
+                'factorial',
+                'floor',
+                'frac',
+                'frem',
+                'FromInert',
+                'frontend',
+                'gc',
+                'genpoly',
+                'has',
+                'hastype',
+                'hfarray',
+                'icontent',
+                'igcd',
+                'ilcm',
+                'ilog10',
+                'Im',
+                'implies',
+                'indets',
+                'indices',
+                'intersect',
+                'iolib',
+                'iquo',
+                'irem',
+                'iroot',
+                'iroot',
+                'isqrt',
+                'kernelopts',
+                'lcoeff',
+                'ldegree',
+                'length',
+                'lexorder',
+                'lhs',
+                'lowerbound',
+                'lprint',
+                'macro',
+                'map',
+                'max',
+                'maxnorm',
+                'member',
+                'membertype',
+                'min',
+                'minus',
+                'mod',
+                'modp',
+                'modp1',
+                'modp2',
+                'mods',
+                'mul',
+                'NextAfter',
+                'nops',
+                'normal',
+                'not',
+                'numboccur',
+                'numelems',
+                'numer',
+                'NumericClass',
+                'NumericEvent',
+                'NumericEventHandler',
+                'NumericStatus',
+                'op',
+                'or',
+                'order',
+                'OrderedNE',
+                'ormap',
+                'orseq',
+                'parse',
+                'piecewise',
+                'pointto',
+                'print',
+                'quit',
+                'Re',
+                'readlib',
+                'Record',
+                'remove',
+                'rhs',
+                'round',
+                'rtable',
+                'rtable_elems',
+                'rtable_eval',
+                'rtable_indfns',
+                'rtable_num_elems',
+                'rtable_options',
+                'rtable_redim',
+                'rtable_scanblock',
+                'rtable_set_indfn',
+                'rtable_split_unit',
+                'savelib',
+                'Scale10',
+                'Scale2',
+                'SDMPolynom',
+                'searchtext',
+                'SearchText',
+                'select',
+                'selectremove',
+                'seq',
+                'series',
+                'setattribute',
+                'SFloatExponent',
+                'SFloatMantissa',
+                'sign',
+                'sort',
+                'ssystem',
+                'stop',
+                'String',
+                'subs',
+                'subset',
+                'subsindets',
+                'subsop',
+                'substring',
+                'system',
+                'table',
+                'taylor',
+                'tcoeff',
+                'time',
+                'timelimit',
+                'ToInert',
+                'traperror',
+                'trunc',
+                'type',
+                'typematch',
+                'unames',
+                'unassign',
+                'union',
+                'Unordered',
+                'upperbound',
+                'userinfo',
+                'writeto',
+                'xor',
+                'xormap',
+                'xorseq')
+
+    def delayed_callback(self, match, ctx):
+        yield match.start(1), Punctuation, match.group(1)  # quote
+
+        ctx.pos = match.start(2)
+        orig_end = ctx.end
+        ctx.end = match.end(2)
+
+        yield from self.get_tokens_unprocessed(context=ctx)
+        yield match.end(2), Punctuation, match.group(1)  # quote
+
+        ctx.pos = match.end()
+        ctx.end = orig_end
+
+    tokens = {
+        'root': [
+            (r'#.*\n', Comment.Single),
+            (r'\(\*', Comment.Multiline, 'comment'),
+            (r'"(\\.|.|\s)*?"', String),
+            (r"('+)((.|\n)*?)\1", delayed_callback),
+            (r'`(\\`|.)*?`', Name),
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(builtins, prefix=r'\b', suffix=r'\b'), Name.Builtin),
+            (r'[a-zA-Z_][a-zA-Z0-9_]*', Name),
+            (r'(:=|\*\*|@@|<=|>=|<>|->|::|\.\.|&\+|[\+\-\*\.\^\$/@&,:=<>%~])', Operator),
+            (r'[;^!@$\(\)\[\]{}|_\\#?]+', Punctuation),
+            (r'(\d+)(\.\.)', bygroups(Number.Integer, Punctuation)),
+            (r'(\d*\.\d+|\d+\.\d*)([eE][+-]?\d+)?', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'\s+', Whitespace),
+        ],
+        'comment': [
+            (r'.*\(\*', Comment.Multiline, '#push'),
+            (r'.*\*\)', Comment.Multiline, '#pop'),
+            (r'.*\n', Comment.Multiline),
+        ]
+    }
+
+    def analyse_text(text):
+        if ':=' in text:
+            return 0.1
\ No newline at end of file
diff --git a/.venv/Lib/site-packages/pygments/lexers/markup.py b/.venv/Lib/site-packages/pygments/lexers/markup.py
new file mode 100644 (file)
index 0000000..acc270b
--- /dev/null
@@ -0,0 +1,1654 @@
+"""
+    pygments.lexers.markup
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for non-HTML markup languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexers.html import XmlLexer
+from pygments.lexers.javascript import JavascriptLexer
+from pygments.lexers.css import CssLexer
+from pygments.lexers.lilypond import LilyPondLexer
+from pygments.lexers.data import JsonLexer
+
+from pygments.lexer import RegexLexer, DelegatingLexer, include, bygroups, \
+    using, this, do_insertions, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Other, Whitespace, Literal
+from pygments.util import get_bool_opt, ClassNotFound
+
+__all__ = ['BBCodeLexer', 'MoinWikiLexer', 'RstLexer', 'TexLexer', 'GroffLexer',
+           'MozPreprocHashLexer', 'MozPreprocPercentLexer',
+           'MozPreprocXulLexer', 'MozPreprocJavascriptLexer',
+           'MozPreprocCssLexer', 'MarkdownLexer', 'OrgLexer', 'TiddlyWiki5Lexer',
+           'WikitextLexer']
+
+
+class BBCodeLexer(RegexLexer):
+    """
+    A lexer that highlights BBCode(-like) syntax.
+    """
+
+    name = 'BBCode'
+    aliases = ['bbcode']
+    mimetypes = ['text/x-bbcode']
+    url = 'https://www.bbcode.org/'
+    version_added = '0.6'
+
+    tokens = {
+        'root': [
+            (r'[^[]+', Text),
+            # tag/end tag begin
+            (r'\[/?\w+', Keyword, 'tag'),
+            # stray bracket
+            (r'\[', Text),
+        ],
+        'tag': [
+            (r'\s+', Text),
+            # attribute with value
+            (r'(\w+)(=)("?[^\s"\]]+"?)',
+             bygroups(Name.Attribute, Operator, String)),
+            # tag argument (a la [color=green])
+            (r'(=)("?[^\s"\]]+"?)',
+             bygroups(Operator, String)),
+            # tag end
+            (r'\]', Keyword, '#pop'),
+        ],
+    }
+
+
+class MoinWikiLexer(RegexLexer):
+    """
+    For MoinMoin (and Trac) Wiki markup.
+    """
+
+    name = 'MoinMoin/Trac Wiki markup'
+    aliases = ['trac-wiki', 'moin']
+    filenames = []
+    mimetypes = ['text/x-trac-wiki']
+    url = 'https://moinmo.in'
+    version_added = '0.7'
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'^#.*$', Comment),
+            (r'(!)(\S+)', bygroups(Keyword, Text)),  # Ignore-next
+            # Titles
+            (r'^(=+)([^=]+)(=+)(\s*#.+)?$',
+             bygroups(Generic.Heading, using(this), Generic.Heading, String)),
+            # Literal code blocks, with optional shebang
+            (r'(\{\{\{)(\n#!.+)?', bygroups(Name.Builtin, Name.Namespace), 'codeblock'),
+            (r'(\'\'\'?|\|\||`|__|~~|\^|,,|::)', Comment),  # Formatting
+            # Lists
+            (r'^( +)([.*-])( )', bygroups(Text, Name.Builtin, Text)),
+            (r'^( +)([a-z]{1,5}\.)( )', bygroups(Text, Name.Builtin, Text)),
+            # Other Formatting
+            (r'\[\[\w+.*?\]\]', Keyword),  # Macro
+            (r'(\[[^\s\]]+)(\s+[^\]]+?)?(\])',
+             bygroups(Keyword, String, Keyword)),  # Link
+            (r'^----+$', Keyword),  # Horizontal rules
+            (r'[^\n\'\[{!_~^,|]+', Text),
+            (r'\n', Text),
+            (r'.', Text),
+        ],
+        'codeblock': [
+            (r'\}\}\}', Name.Builtin, '#pop'),
+            # these blocks are allowed to be nested in Trac, but not MoinMoin
+            (r'\{\{\{', Text, '#push'),
+            (r'[^{}]+', Comment.Preproc),  # slurp boring text
+            (r'.', Comment.Preproc),  # allow loose { or }
+        ],
+    }
+
+
+class RstLexer(RegexLexer):
+    """
+    For reStructuredText markup.
+
+    Additional options accepted:
+
+    `handlecodeblocks`
+        Highlight the contents of ``.. sourcecode:: language``,
+        ``.. code:: language`` and ``.. code-block:: language``
+        directives with a lexer for the given language (default:
+        ``True``).
+
+        .. versionadded:: 0.8
+    """
+    name = 'reStructuredText'
+    url = 'https://docutils.sourceforge.io/rst.html'
+    aliases = ['restructuredtext', 'rst', 'rest']
+    filenames = ['*.rst', '*.rest']
+    mimetypes = ["text/x-rst", "text/prs.fallenstein.rst"]
+    version_added = '0.7'
+    flags = re.MULTILINE
+
+    def _handle_sourcecode(self, match):
+        from pygments.lexers import get_lexer_by_name
+
+        # section header
+        yield match.start(1), Punctuation, match.group(1)
+        yield match.start(2), Text, match.group(2)
+        yield match.start(3), Operator.Word, match.group(3)
+        yield match.start(4), Punctuation, match.group(4)
+        yield match.start(5), Text, match.group(5)
+        yield match.start(6), Keyword, match.group(6)
+        yield match.start(7), Text, match.group(7)
+
+        # lookup lexer if wanted and existing
+        lexer = None
+        if self.handlecodeblocks:
+            try:
+                lexer = get_lexer_by_name(match.group(6).strip())
+            except ClassNotFound:
+                pass
+        indention = match.group(8)
+        indention_size = len(indention)
+        code = (indention + match.group(9) + match.group(10) + match.group(11))
+
+        # no lexer for this language. handle it like it was a code block
+        if lexer is None:
+            yield match.start(8), String, code
+            return
+
+        # highlight the lines with the lexer.
+        ins = []
+        codelines = code.splitlines(True)
+        code = ''
+        for line in codelines:
+            if len(line) > indention_size:
+                ins.append((len(code), [(0, Text, line[:indention_size])]))
+                code += line[indention_size:]
+            else:
+                code += line
+        yield from do_insertions(ins, lexer.get_tokens_unprocessed(code))
+
+    # from docutils.parsers.rst.states
+    closers = '\'")]}>\u2019\u201d\xbb!?'
+    unicode_delimiters = '\u2010\u2011\u2012\u2013\u2014\u00a0'
+    end_string_suffix = (rf'((?=$)|(?=[-/:.,; \n\x00{re.escape(unicode_delimiters)}{re.escape(closers)}]))')
+
+    tokens = {
+        'root': [
+            # Heading with overline
+            (r'^(=+|-+|`+|:+|\.+|\'+|"+|~+|\^+|_+|\*+|\++|#+)([ \t]*\n)'
+             r'(.+)(\n)(\1)(\n)',
+             bygroups(Generic.Heading, Text, Generic.Heading,
+                      Text, Generic.Heading, Text)),
+            # Plain heading
+            (r'^(\S.*)(\n)(={3,}|-{3,}|`{3,}|:{3,}|\.{3,}|\'{3,}|"{3,}|'
+             r'~{3,}|\^{3,}|_{3,}|\*{3,}|\+{3,}|#{3,})(\n)',
+             bygroups(Generic.Heading, Text, Generic.Heading, Text)),
+            # Bulleted lists
+            (r'^(\s*)([-*+])( .+\n(?:\1  .+\n)*)',
+             bygroups(Text, Number, using(this, state='inline'))),
+            # Numbered lists
+            (r'^(\s*)([0-9#ivxlcmIVXLCM]+\.)( .+\n(?:\1  .+\n)*)',
+             bygroups(Text, Number, using(this, state='inline'))),
+            (r'^(\s*)(\(?[0-9#ivxlcmIVXLCM]+\))( .+\n(?:\1  .+\n)*)',
+             bygroups(Text, Number, using(this, state='inline'))),
+            # Numbered, but keep words at BOL from becoming lists
+            (r'^(\s*)([A-Z]+\.)( .+\n(?:\1  .+\n)+)',
+             bygroups(Text, Number, using(this, state='inline'))),
+            (r'^(\s*)(\(?[A-Za-z]+\))( .+\n(?:\1  .+\n)+)',
+             bygroups(Text, Number, using(this, state='inline'))),
+            # Line blocks
+            (r'^(\s*)(\|)( .+\n(?:\|  .+\n)*)',
+             bygroups(Text, Operator, using(this, state='inline'))),
+            # Sourcecode directives
+            (r'^( *\.\.)(\s*)((?:source)?code(?:-block)?)(::)([ \t]*)([^\n]+)'
+             r'(\n[ \t]*\n)([ \t]+)(.*)(\n)((?:(?:\8.*)?\n)+)',
+             _handle_sourcecode),
+            # A directive
+            (r'^( *\.\.)(\s*)([\w:-]+?)(::)(?:([ \t]*)(.*))',
+             bygroups(Punctuation, Text, Operator.Word, Punctuation, Text,
+                      using(this, state='inline'))),
+            # A reference target
+            (r'^( *\.\.)(\s*)(_(?:[^:\\]|\\.)+:)(.*?)$',
+             bygroups(Punctuation, Text, Name.Tag, using(this, state='inline'))),
+            # A footnote/citation target
+            (r'^( *\.\.)(\s*)(\[.+\])(.*?)$',
+             bygroups(Punctuation, Text, Name.Tag, using(this, state='inline'))),
+            # A substitution def
+            (r'^( *\.\.)(\s*)(\|.+\|)(\s*)([\w:-]+?)(::)(?:([ \t]*)(.*))',
+             bygroups(Punctuation, Text, Name.Tag, Text, Operator.Word,
+                      Punctuation, Text, using(this, state='inline'))),
+            # Comments
+            (r'^ *\.\..*(\n( +.*\n|\n)+)?', Comment),
+            # Field list marker
+            (r'^( *)(:(?:\\\\|\\:|[^:\n])+:(?=\s))([ \t]*)',
+             bygroups(Text, Name.Class, Text)),
+            # Definition list
+            (r'^(\S.*(?<!::)\n)((?:(?: +.*)\n)+)',
+             bygroups(using(this, state='inline'), using(this, state='inline'))),
+            # Code blocks
+            (r'(::)(\n[ \t]*\n)([ \t]+)(.*)(\n)((?:(?:\3.*)?\n)+)',
+             bygroups(String.Escape, Text, String, String, Text, String)),
+            include('inline'),
+        ],
+        'inline': [
+            (r'\\.', Text),  # escape
+            (r'``', String, 'literal'),  # code
+            (r'(`.+?)(<.+?>)(`__?)',  # reference with inline target
+             bygroups(String, String.Interpol, String)),
+            (r'`.+?`__?', String),  # reference
+            (r'(`.+?`)(:[a-zA-Z0-9:-]+?:)?',
+             bygroups(Name.Variable, Name.Attribute)),  # role
+            (r'(:[a-zA-Z0-9:-]+?:)(`.+?`)',
+             bygroups(Name.Attribute, Name.Variable)),  # role (content first)
+            (r'\*\*.+?\*\*', Generic.Strong),  # Strong emphasis
+            (r'\*.+?\*', Generic.Emph),  # Emphasis
+            (r'\[.*?\]_', String),  # Footnote or citation
+            (r'<.+?>', Name.Tag),   # Hyperlink
+            (r'[^\\\n\[*`:]+', Text),
+            (r'.', Text),
+        ],
+        'literal': [
+            (r'[^`]+', String),
+            (r'``' + end_string_suffix, String, '#pop'),
+            (r'`', String),
+        ]
+    }
+
+    def __init__(self, **options):
+        self.handlecodeblocks = get_bool_opt(options, 'handlecodeblocks', True)
+        RegexLexer.__init__(self, **options)
+
+    def analyse_text(text):
+        if text[:2] == '..' and text[2:3] != '.':
+            return 0.3
+        p1 = text.find("\n")
+        p2 = text.find("\n", p1 + 1)
+        if (p2 > -1 and              # has two lines
+                p1 * 2 + 1 == p2 and     # they are the same length
+                text[p1+1] in '-=' and   # the next line both starts and ends with
+                text[p1+1] == text[p2-1]):  # ...a sufficiently high header
+            return 0.5
+
+
+class TexLexer(RegexLexer):
+    """
+    Lexer for the TeX and LaTeX typesetting languages.
+    """
+
+    name = 'TeX'
+    aliases = ['tex', 'latex']
+    filenames = ['*.tex', '*.aux', '*.toc']
+    mimetypes = ['text/x-tex', 'text/x-latex']
+    url = 'https://tug.org'
+    version_added = ''
+
+    tokens = {
+        'general': [
+            (r'%.*?\n', Comment),
+            (r'[{}]', Name.Builtin),
+            (r'[&_^]', Name.Builtin),
+        ],
+        'root': [
+            (r'\\\[', String.Backtick, 'displaymath'),
+            (r'\\\(', String, 'inlinemath'),
+            (r'\$\$', String.Backtick, 'displaymath'),
+            (r'\$', String, 'inlinemath'),
+            (r'\\([a-zA-Z@_:]+|\S?)', Keyword, 'command'),
+            (r'\\$', Keyword),
+            include('general'),
+            (r'[^\\$%&_^{}]+', Text),
+        ],
+        'math': [
+            (r'\\([a-zA-Z]+|\S?)', Name.Variable),
+            include('general'),
+            (r'[0-9]+', Number),
+            (r'[-=!+*/()\[\]]', Operator),
+            (r'[^=!+*/()\[\]\\$%&_^{}0-9-]+', Name.Builtin),
+        ],
+        'inlinemath': [
+            (r'\\\)', String, '#pop'),
+            (r'\$', String, '#pop'),
+            include('math'),
+        ],
+        'displaymath': [
+            (r'\\\]', String, '#pop'),
+            (r'\$\$', String, '#pop'),
+            (r'\$', Name.Builtin),
+            include('math'),
+        ],
+        'command': [
+            (r'\[.*?\]', Name.Attribute),
+            (r'\*', Keyword),
+            default('#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        for start in ("\\documentclass", "\\input", "\\documentstyle",
+                      "\\relax"):
+            if text[:len(start)] == start:
+                return True
+
+
+class GroffLexer(RegexLexer):
+    """
+    Lexer for the (g)roff typesetting language, supporting groff
+    extensions. Mainly useful for highlighting manpage sources.
+    """
+
+    name = 'Groff'
+    aliases = ['groff', 'nroff', 'man']
+    filenames = ['*.[1-9]', '*.man', '*.1p', '*.3pm']
+    mimetypes = ['application/x-troff', 'text/troff']
+    url = 'https://www.gnu.org/software/groff'
+    version_added = '0.6'
+
+    tokens = {
+        'root': [
+            (r'(\.)(\w+)', bygroups(Text, Keyword), 'request'),
+            (r'\.', Punctuation, 'request'),
+            # Regular characters, slurp till we find a backslash or newline
+            (r'[^\\\n]+', Text, 'textline'),
+            default('textline'),
+        ],
+        'textline': [
+            include('escapes'),
+            (r'[^\\\n]+', Text),
+            (r'\n', Text, '#pop'),
+        ],
+        'escapes': [
+            # groff has many ways to write escapes.
+            (r'\\"[^\n]*', Comment),
+            (r'\\[fn]\w', String.Escape),
+            (r'\\\(.{2}', String.Escape),
+            (r'\\.\[.*\]', String.Escape),
+            (r'\\.', String.Escape),
+            (r'\\\n', Text, 'request'),
+        ],
+        'request': [
+            (r'\n', Text, '#pop'),
+            include('escapes'),
+            (r'"[^\n"]+"', String.Double),
+            (r'\d+', Number),
+            (r'\S+', String),
+            (r'\s+', Text),
+        ],
+    }
+
+    def analyse_text(text):
+        if text[:1] != '.':
+            return False
+        if text[:3] == '.\\"':
+            return True
+        if text[:4] == '.TH ':
+            return True
+        if text[1:3].isalnum() and text[3].isspace():
+            return 0.9
+
+
+class MozPreprocHashLexer(RegexLexer):
+    """
+    Lexer for Mozilla Preprocessor files (with '#' as the marker).
+
+    Other data is left untouched.
+    """
+    name = 'mozhashpreproc'
+    aliases = [name]
+    filenames = []
+    mimetypes = []
+    url = 'https://firefox-source-docs.mozilla.org/build/buildsystem/preprocessor.html'
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            (r'^#', Comment.Preproc, ('expr', 'exprstart')),
+            (r'.+', Other),
+        ],
+        'exprstart': [
+            (r'(literal)(.*)', bygroups(Comment.Preproc, Text), '#pop:2'),
+            (words((
+                'define', 'undef', 'if', 'ifdef', 'ifndef', 'else', 'elif',
+                'elifdef', 'elifndef', 'endif', 'expand', 'filter', 'unfilter',
+                'include', 'includesubst', 'error')),
+             Comment.Preproc, '#pop'),
+        ],
+        'expr': [
+            (words(('!', '!=', '==', '&&', '||')), Operator),
+            (r'(defined)(\()', bygroups(Keyword, Punctuation)),
+            (r'\)', Punctuation),
+            (r'[0-9]+', Number.Decimal),
+            (r'__\w+?__', Name.Variable),
+            (r'@\w+?@', Name.Class),
+            (r'\w+', Name),
+            (r'\n', Text, '#pop'),
+            (r'\s+', Text),
+            (r'\S', Punctuation),
+        ],
+    }
+
+
+class MozPreprocPercentLexer(MozPreprocHashLexer):
+    """
+    Lexer for Mozilla Preprocessor files (with '%' as the marker).
+
+    Other data is left untouched.
+    """
+    name = 'mozpercentpreproc'
+    aliases = [name]
+    filenames = []
+    mimetypes = []
+    url = 'https://firefox-source-docs.mozilla.org/build/buildsystem/preprocessor.html'
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            (r'^%', Comment.Preproc, ('expr', 'exprstart')),
+            (r'.+', Other),
+        ],
+    }
+
+
+class MozPreprocXulLexer(DelegatingLexer):
+    """
+    Subclass of the `MozPreprocHashLexer` that highlights unlexed data with the
+    `XmlLexer`.
+    """
+    name = "XUL+mozpreproc"
+    aliases = ['xul+mozpreproc']
+    filenames = ['*.xul.in']
+    mimetypes = []
+    url = 'https://firefox-source-docs.mozilla.org/build/buildsystem/preprocessor.html'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, MozPreprocHashLexer, **options)
+
+
+class MozPreprocJavascriptLexer(DelegatingLexer):
+    """
+    Subclass of the `MozPreprocHashLexer` that highlights unlexed data with the
+    `JavascriptLexer`.
+    """
+    name = "Javascript+mozpreproc"
+    aliases = ['javascript+mozpreproc']
+    filenames = ['*.js.in']
+    mimetypes = []
+    url = 'https://firefox-source-docs.mozilla.org/build/buildsystem/preprocessor.html'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        super().__init__(JavascriptLexer, MozPreprocHashLexer, **options)
+
+
+class MozPreprocCssLexer(DelegatingLexer):
+    """
+    Subclass of the `MozPreprocHashLexer` that highlights unlexed data with the
+    `CssLexer`.
+    """
+    name = "CSS+mozpreproc"
+    aliases = ['css+mozpreproc']
+    filenames = ['*.css.in']
+    mimetypes = []
+    url = 'https://firefox-source-docs.mozilla.org/build/buildsystem/preprocessor.html'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        super().__init__(CssLexer, MozPreprocPercentLexer, **options)
+
+
+class MarkdownLexer(RegexLexer):
+    """
+    For Markdown markup.
+    """
+    name = 'Markdown'
+    url = 'https://daringfireball.net/projects/markdown/'
+    aliases = ['markdown', 'md']
+    filenames = ['*.md', '*.markdown']
+    mimetypes = ["text/x-markdown"]
+    version_added = '2.2'
+    flags = re.MULTILINE
+
+    def _handle_codeblock(self, match):
+        from pygments.lexers import get_lexer_by_name
+
+        yield match.start('initial'), String.Backtick, match.group('initial')
+        yield match.start('lang'), String.Backtick, match.group('lang')
+        if match.group('afterlang') is not None:
+            yield match.start('whitespace'), Whitespace, match.group('whitespace')
+            yield match.start('extra'), Text, match.group('extra')
+        yield match.start('newline'), Whitespace, match.group('newline')
+
+        # lookup lexer if wanted and existing
+        lexer = None
+        if self.handlecodeblocks:
+            try:
+                lexer = get_lexer_by_name(match.group('lang').strip())
+            except ClassNotFound:
+                pass
+        code = match.group('code')
+        # no lexer for this language. handle it like it was a code block
+        if lexer is None:
+            yield match.start('code'), String, code
+        else:
+            # FIXME: aren't the offsets wrong?
+            yield from do_insertions([], lexer.get_tokens_unprocessed(code))
+
+        yield match.start('terminator'), String.Backtick, match.group('terminator')
+
+    tokens = {
+        'root': [
+            # heading with '#' prefix (atx-style)
+            (r'(^#[^#].+)(\n)', bygroups(Generic.Heading, Text)),
+            # subheading with '#' prefix (atx-style)
+            (r'(^#{2,6}[^#].+)(\n)', bygroups(Generic.Subheading, Text)),
+            # heading with '=' underlines (Setext-style)
+            (r'^(.+)(\n)(=+)(\n)', bygroups(Generic.Heading, Text, Generic.Heading, Text)),
+            # subheading with '-' underlines (Setext-style)
+            (r'^(.+)(\n)(-+)(\n)', bygroups(Generic.Subheading, Text, Generic.Subheading, Text)),
+            # task list
+            (r'^(\s*)([*-] )(\[[ xX]\])( .+\n)',
+            bygroups(Whitespace, Keyword, Keyword, using(this, state='inline'))),
+            # bulleted list
+            (r'^(\s*)([*-])(\s)(.+\n)',
+            bygroups(Whitespace, Keyword, Whitespace, using(this, state='inline'))),
+            # numbered list
+            (r'^(\s*)([0-9]+\.)( .+\n)',
+            bygroups(Whitespace, Keyword, using(this, state='inline'))),
+            # quote
+            (r'^(\s*>\s)(.+\n)', bygroups(Keyword, Generic.Emph)),
+            # code block fenced by 3 backticks
+            (r'^(\s*```\n[\w\W]*?^\s*```$\n)', String.Backtick),
+            # code block with language
+            # Some tools include extra stuff after the language name, just
+            # highlight that as text. For example: https://docs.enola.dev/use/execmd
+            (r'''(?x)
+              ^(?P<initial>\s*```)
+              (?P<lang>[\w\-]+)
+              (?P<afterlang>
+                 (?P<whitespace>[^\S\n]+)
+                 (?P<extra>.*))?
+              (?P<newline>\n)
+              (?P<code>(.|\n)*?)
+              (?P<terminator>^\s*```$\n)
+              ''',
+             _handle_codeblock),
+
+            include('inline'),
+        ],
+        'inline': [
+            # escape
+            (r'\\.', Text),
+            # inline code
+            (r'([^`]?)(`[^`\n]+`)', bygroups(Text, String.Backtick)),
+            # warning: the following rules eat outer tags.
+            # eg. **foo _bar_ baz** => foo and baz are not recognized as bold
+            # bold fenced by '**'
+            (r'([^\*]?)(\*\*[^* \n][^*\n]*\*\*)', bygroups(Text, Generic.Strong)),
+            # bold fenced by '__'
+            (r'([^_]?)(__[^_ \n][^_\n]*__)', bygroups(Text, Generic.Strong)),
+            # italics fenced by '*'
+            (r'([^\*]?)(\*[^* \n][^*\n]*\*)', bygroups(Text, Generic.Emph)),
+            # italics fenced by '_'
+            (r'([^_]?)(_[^_ \n][^_\n]*_)', bygroups(Text, Generic.Emph)),
+            # strikethrough
+            (r'([^~]?)(~~[^~ \n][^~\n]*~~)', bygroups(Text, Generic.Deleted)),
+            # mentions and topics (twitter and github stuff)
+            (r'[@#][\w/:]+', Name.Entity),
+            # (image?) links eg: ![Image of Yaktocat](https://octodex.github.com/images/yaktocat.png)
+            (r'(!?\[)([^]]+)(\])(\()([^)]+)(\))',
+             bygroups(Text, Name.Tag, Text, Text, Name.Attribute, Text)),
+            # reference-style links, e.g.:
+            #   [an example][id]
+            #   [id]: http://example.com/
+            (r'(\[)([^]]+)(\])(\[)([^]]*)(\])',
+             bygroups(Text, Name.Tag, Text, Text, Name.Label, Text)),
+            (r'^(\s*\[)([^]]*)(\]:\s*)(.+)',
+             bygroups(Text, Name.Label, Text, Name.Attribute)),
+
+            # general text, must come last!
+            (r'[^\\\s]+', Text),
+            (r'.', Text),
+        ],
+    }
+
+    def __init__(self, **options):
+        self.handlecodeblocks = get_bool_opt(options, 'handlecodeblocks', True)
+        RegexLexer.__init__(self, **options)
+
+class OrgLexer(RegexLexer):
+    """
+    For Org Mode markup.
+    """
+    name = 'Org Mode'
+    url = 'https://orgmode.org'
+    aliases = ['org', 'orgmode', 'org-mode']
+    filenames = ['*.org']
+    mimetypes = ["text/org"]
+    version_added = '2.18'
+
+    def _inline(start, end):
+        return rf'(?<!\w){start}(.|\n(?!\n))+?{end}(?!\w)'
+
+    tokens = {
+        'root': [
+            (r'^# .*', Comment.Single),
+
+            # Headings
+            (r'^(\* )(COMMENT)( .*)',
+             bygroups(Generic.Heading, Comment.Preproc, Generic.Heading)),
+            (r'^(\*\*+ )(COMMENT)( .*)',
+             bygroups(Generic.Subheading, Comment.Preproc, Generic.Subheading)),
+            (r'^(\* )(DONE)( .*)',
+             bygroups(Generic.Heading, Generic.Deleted, Generic.Heading)),
+            (r'^(\*\*+ )(DONE)( .*)',
+             bygroups(Generic.Subheading, Generic.Deleted, Generic.Subheading)),
+            (r'^(\* )(TODO)( .*)',
+             bygroups(Generic.Heading, Generic.Error, Generic.Heading)),
+            (r'^(\*\*+ )(TODO)( .*)',
+             bygroups(Generic.Subheading, Generic.Error, Generic.Subheading)),
+
+            (r'^(\* .+?)( :[a-zA-Z0-9_@:]+:)?$', bygroups(Generic.Heading, Generic.Emph)),
+            (r'^(\*\*+ .+?)( :[a-zA-Z0-9_@:]+:)?$', bygroups(Generic.Subheading, Generic.Emph)),
+
+            # Unordered lists items, including TODO items and description items
+            (r'^(?:( *)([+-] )|( +)(\* ))(\[[ X-]\])?(.+ ::)?',
+             bygroups(Whitespace, Keyword, Whitespace, Keyword, Generic.Prompt, Name.Label)),
+
+            # Ordered list items
+            (r'^( *)([0-9]+[.)])( \[@[0-9]+\])?', bygroups(Whitespace, Keyword, Generic.Emph)),
+
+            # Dynamic blocks
+            (r'(?i)^( *#\+begin: *)((?:.|\n)*?)(^ *#\+end: *$)',
+             bygroups(Operator.Word, using(this), Operator.Word)),
+
+            # Comment blocks
+            (r'(?i)^( *#\+begin_comment *\n)((?:.|\n)*?)(^ *#\+end_comment *$)',
+             bygroups(Operator.Word, Comment.Multiline, Operator.Word)),
+
+            # Source code blocks
+            # TODO: language-dependent syntax highlighting (see Markdown lexer)
+            (r'(?i)^( *#\+begin_src .*)((?:.|\n)*?)(^ *#\+end_src *$)',
+             bygroups(Operator.Word, Text, Operator.Word)),
+
+            # Other blocks
+            (r'(?i)^( *#\+begin_\w+)( *\n)((?:.|\n)*?)(^ *#\+end_\w+)( *$)',
+             bygroups(Operator.Word, Whitespace, Text, Operator.Word, Whitespace)),
+
+            # Keywords
+            (r'^(#\+\w+:)(.*)$', bygroups(Name.Namespace, Text)),
+
+            # Properties and drawers
+            (r'(?i)^( *:\w+: *\n)((?:.|\n)*?)(^ *:end: *$)',
+             bygroups(Name.Decorator, Comment.Special, Name.Decorator)),
+
+            # Line break operator
+            (r'\\\\$', Operator),
+
+            # Deadline, Scheduled, CLOSED
+            (r'(?i)^( *(?:DEADLINE|SCHEDULED): )(<.+?> *)$',
+             bygroups(Generic.Error, Literal.Date)),
+            (r'(?i)^( *CLOSED: )(\[.+?\] *)$',
+             bygroups(Generic.Deleted, Literal.Date)),
+
+            # Bold
+            (_inline(r'\*', r'\*+'), Generic.Strong),
+            # Italic
+            (_inline(r'/', r'/'), Generic.Emph),
+            # Verbatim
+            (_inline(r'=', r'='), String), # TODO token
+            # Code
+            (_inline(r'~', r'~'), String),
+            # Strikethrough
+            (_inline(r'\+', r'\+'), Generic.Deleted),
+            # Underline
+            (_inline(r'_', r'_+'), Generic.EmphStrong),
+
+            # Dates
+            (r'<.+?>', Literal.Date),
+            # Macros
+            (r'\{\{\{.+?\}\}\}', Comment.Preproc),
+            # Footnotes
+            (r'(?<!\[)\[fn:.+?\]', Name.Tag),
+            # Links
+            (r'(?s)(\[\[)(.*?)(\]\[)(.*?)(\]\])',
+             bygroups(Punctuation, Name.Attribute, Punctuation, Name.Tag, Punctuation)),
+            (r'(?s)(\[\[)(.+?)(\]\])', bygroups(Punctuation, Name.Attribute, Punctuation)),
+            (r'(<<)(.+?)(>>)', bygroups(Punctuation, Name.Attribute, Punctuation)),
+
+            # Tables
+            (r'^( *)(\|[ -].*?[ -]\|)$', bygroups(Whitespace, String)),
+
+            # Any other text
+            (r'[^#*+\-0-9:\\/=~_<{\[|\n]+', Text),
+            (r'[#*+\-0-9:\\/=~_<{\[|\n]', Text),
+        ],
+    }
+
+class TiddlyWiki5Lexer(RegexLexer):
+    """
+    For TiddlyWiki5 markup.
+    """
+    name = 'tiddler'
+    url = 'https://tiddlywiki.com/#TiddlerFiles'
+    aliases = ['tid']
+    filenames = ['*.tid']
+    mimetypes = ["text/vnd.tiddlywiki"]
+    version_added = '2.7'
+    flags = re.MULTILINE
+
+    def _handle_codeblock(self, match):
+        """
+        match args: 1:backticks, 2:lang_name, 3:newline, 4:code, 5:backticks
+        """
+        from pygments.lexers import get_lexer_by_name
+
+        # section header
+        yield match.start(1), String, match.group(1)
+        yield match.start(2), String, match.group(2)
+        yield match.start(3), Text,   match.group(3)
+
+        # lookup lexer if wanted and existing
+        lexer = None
+        if self.handlecodeblocks:
+            try:
+                lexer = get_lexer_by_name(match.group(2).strip())
+            except ClassNotFound:
+                pass
+        code = match.group(4)
+
+        # no lexer for this language. handle it like it was a code block
+        if lexer is None:
+            yield match.start(4), String, code
+            return
+
+        yield from do_insertions([], lexer.get_tokens_unprocessed(code))
+
+        yield match.start(5), String, match.group(5)
+
+    def _handle_cssblock(self, match):
+        """
+        match args: 1:style tag 2:newline, 3:code, 4:closing style tag
+        """
+        from pygments.lexers import get_lexer_by_name
+
+        # section header
+        yield match.start(1), String, match.group(1)
+        yield match.start(2), String, match.group(2)
+
+        lexer = None
+        if self.handlecodeblocks:
+            try:
+                lexer = get_lexer_by_name('css')
+            except ClassNotFound:
+                pass
+        code = match.group(3)
+
+        # no lexer for this language. handle it like it was a code block
+        if lexer is None:
+            yield match.start(3), String, code
+            return
+
+        yield from do_insertions([], lexer.get_tokens_unprocessed(code))
+
+        yield match.start(4), String, match.group(4)
+
+    tokens = {
+        'root': [
+            # title in metadata section
+            (r'^(title)(:\s)(.+\n)', bygroups(Keyword, Text, Generic.Heading)),
+            # headings
+            (r'^(!)([^!].+\n)', bygroups(Generic.Heading, Text)),
+            (r'^(!{2,6})(.+\n)', bygroups(Generic.Subheading, Text)),
+            # bulleted or numbered lists or single-line block quotes
+            # (can be mixed)
+            (r'^(\s*)([*#>]+)(\s*)(.+\n)',
+             bygroups(Text, Keyword, Text, using(this, state='inline'))),
+            # multi-line block quotes
+            (r'^(<<<.*\n)([\w\W]*?)(^<<<.*$)', bygroups(String, Text, String)),
+            # table header
+            (r'^(\|.*?\|h)$', bygroups(Generic.Strong)),
+            # table footer or caption
+            (r'^(\|.*?\|[cf])$', bygroups(Generic.Emph)),
+            # table class
+            (r'^(\|.*?\|k)$', bygroups(Name.Tag)),
+            # definitions
+            (r'^(;.*)$', bygroups(Generic.Strong)),
+            # text block
+            (r'^(```\n)([\w\W]*?)(^```$)', bygroups(String, Text, String)),
+            # code block with language
+            (r'^(```)(\w+)(\n)([\w\W]*?)(^```$)', _handle_codeblock),
+            # CSS style block
+            (r'^(<style>)(\n)([\w\W]*?)(^</style>$)', _handle_cssblock),
+
+            include('keywords'),
+            include('inline'),
+        ],
+        'keywords': [
+            (words((
+                '\\define', '\\end', 'caption', 'created', 'modified', 'tags',
+                'title', 'type'), prefix=r'^', suffix=r'\b'),
+             Keyword),
+        ],
+        'inline': [
+            # escape
+            (r'\\.', Text),
+            # created or modified date
+            (r'\d{17}', Number.Integer),
+            # italics
+            (r'(\s)(//[^/]+//)((?=\W|\n))',
+             bygroups(Text, Generic.Emph, Text)),
+            # superscript
+            (r'(\s)(\^\^[^\^]+\^\^)', bygroups(Text, Generic.Emph)),
+            # subscript
+            (r'(\s)(,,[^,]+,,)', bygroups(Text, Generic.Emph)),
+            # underscore
+            (r'(\s)(__[^_]+__)', bygroups(Text, Generic.Strong)),
+            # bold
+            (r"(\s)(''[^']+'')((?=\W|\n))",
+             bygroups(Text, Generic.Strong, Text)),
+            # strikethrough
+            (r'(\s)(~~[^~]+~~)((?=\W|\n))',
+             bygroups(Text, Generic.Deleted, Text)),
+            # TiddlyWiki variables
+            (r'<<[^>]+>>', Name.Tag),
+            (r'\$\$[^$]+\$\$', Name.Tag),
+            (r'\$\([^)]+\)\$', Name.Tag),
+            # TiddlyWiki style or class
+            (r'^@@.*$', Name.Tag),
+            # HTML tags
+            (r'</?[^>]+>', Name.Tag),
+            # inline code
+            (r'`[^`]+`', String.Backtick),
+            # HTML escaped symbols
+            (r'&\S*?;', String.Regex),
+            # Wiki links
+            (r'(\[{2})([^]\|]+)(\]{2})', bygroups(Text, Name.Tag, Text)),
+            # External links
+            (r'(\[{2})([^]\|]+)(\|)([^]\|]+)(\]{2})',
+            bygroups(Text, Name.Tag, Text, Name.Attribute, Text)),
+            # Transclusion
+            (r'(\{{2})([^}]+)(\}{2})', bygroups(Text, Name.Tag, Text)),
+            # URLs
+            (r'(\b.?.?tps?://[^\s"]+)', bygroups(Name.Attribute)),
+
+            # general text, must come last!
+            (r'[\w]+', Text),
+            (r'.', Text)
+        ],
+    }
+
+    def __init__(self, **options):
+        self.handlecodeblocks = get_bool_opt(options, 'handlecodeblocks', True)
+        RegexLexer.__init__(self, **options)
+
+
+class WikitextLexer(RegexLexer):
+    """
+    For MediaWiki Wikitext.
+
+    Parsing Wikitext is tricky, and results vary between different MediaWiki
+    installations, so we only highlight common syntaxes (built-in or from
+    popular extensions), and also assume templates produce no unbalanced
+    syntaxes.
+    """
+    name = 'Wikitext'
+    url = 'https://www.mediawiki.org/wiki/Wikitext'
+    aliases = ['wikitext', 'mediawiki']
+    filenames = []
+    mimetypes = ['text/x-wiki']
+    version_added = '2.15'
+    flags = re.MULTILINE
+
+    def nowiki_tag_rules(tag_name):
+        return [
+            (rf'(?i)(</)({tag_name})(\s*)(>)', bygroups(Punctuation,
+             Name.Tag, Whitespace, Punctuation), '#pop'),
+            include('entity'),
+            include('text'),
+        ]
+
+    def plaintext_tag_rules(tag_name):
+        return [
+            (rf'(?si)(.*?)(</)({tag_name})(\s*)(>)', bygroups(Text,
+             Punctuation, Name.Tag, Whitespace, Punctuation), '#pop'),
+        ]
+
+    def delegate_tag_rules(tag_name, lexer, **lexer_kwargs):
+        return [
+            (rf'(?i)(</)({tag_name})(\s*)(>)', bygroups(Punctuation,
+             Name.Tag, Whitespace, Punctuation), '#pop'),
+            (rf'(?si).+?(?=</{tag_name}\s*>)', using(lexer, **lexer_kwargs)),
+        ]
+
+    def text_rules(token):
+        return [
+            (r'\w+', token),
+            (r'[^\S\n]+', token),
+            (r'(?s).', token),
+        ]
+
+    def handle_syntaxhighlight(self, match, ctx):
+        from pygments.lexers import get_lexer_by_name
+
+        attr_content = match.group()
+        start = 0
+        index = 0
+        while True:
+            index = attr_content.find('>', start)
+            # Exclude comment end (-->)
+            if attr_content[index-2:index] != '--':
+                break
+            start = index + 1
+
+        if index == -1:
+            # No tag end
+            yield from self.get_tokens_unprocessed(attr_content, stack=['root', 'attr'])
+            return
+        attr = attr_content[:index]
+        yield from self.get_tokens_unprocessed(attr, stack=['root', 'attr'])
+        yield match.start(3) + index, Punctuation, '>'
+
+        lexer = None
+        content = attr_content[index+1:]
+        lang_match = re.findall(r'\blang=("|\'|)(\w+)(\1)', attr)
+
+        if len(lang_match) >= 1:
+            # Pick the last match in case of multiple matches
+            lang = lang_match[-1][1]
+            try:
+                lexer = get_lexer_by_name(lang)
+            except ClassNotFound:
+                pass
+
+        if lexer is None:
+            yield match.start() + index + 1, Text, content
+        else:
+            yield from lexer.get_tokens_unprocessed(content)
+
+    def handle_score(self, match, ctx):
+        attr_content = match.group()
+        start = 0
+        index = 0
+        while True:
+            index = attr_content.find('>', start)
+            # Exclude comment end (-->)
+            if attr_content[index-2:index] != '--':
+                break
+            start = index + 1
+
+        if index == -1:
+            # No tag end
+            yield from self.get_tokens_unprocessed(attr_content, stack=['root', 'attr'])
+            return
+        attr = attr_content[:index]
+        content = attr_content[index+1:]
+        yield from self.get_tokens_unprocessed(attr, stack=['root', 'attr'])
+        yield match.start(3) + index, Punctuation, '>'
+
+        lang_match = re.findall(r'\blang=("|\'|)(\w+)(\1)', attr)
+        # Pick the last match in case of multiple matches
+        lang = lang_match[-1][1] if len(lang_match) >= 1 else 'lilypond'
+
+        if lang == 'lilypond':  # Case sensitive
+            yield from LilyPondLexer().get_tokens_unprocessed(content)
+        else:  # ABC
+            # FIXME: Use ABC lexer in the future
+            yield match.start() + index + 1, Text, content
+
+    # a-z removed to prevent linter from complaining, REMEMBER to use (?i)
+    title_char = r' %!"$&\'()*,\-./0-9:;=?@A-Z\\\^_`~+\u0080-\uFFFF'
+    nbsp_char = r'(?:\t|&nbsp;|&\#0*160;|&\#[Xx]0*[Aa]0;|[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000])'
+    link_address = r'(?:[0-9.]+|\[[0-9a-f:.]+\]|[^\x00-\x20"<>\[\]\x7F\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFFFD])'
+    link_char_class = r'[^\x00-\x20"<>\[\]\x7F\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFFFD]'
+    double_slashes_i = {
+        '__FORCETOC__', '__NOCONTENTCONVERT__', '__NOCC__', '__NOEDITSECTION__', '__NOGALLERY__',
+        '__NOTITLECONVERT__', '__NOTC__', '__NOTOC__', '__TOC__',
+    }
+    double_slashes = {
+        '__EXPECTUNUSEDCATEGORY__',  '__HIDDENCAT__', '__INDEX__',  '__NEWSECTIONLINK__',
+        '__NOINDEX__',  '__NONEWSECTIONLINK__',  '__STATICREDIRECT__', '__NOGLOBAL__',
+        '__DISAMBIG__', '__EXPECTED_UNCONNECTED_PAGE__',
+    }
+    protocols = {
+        'bitcoin:', 'ftp://', 'ftps://', 'geo:', 'git://', 'gopher://', 'http://', 'https://',
+        'irc://', 'ircs://', 'magnet:', 'mailto:', 'mms://', 'news:', 'nntp://', 'redis://',
+        'sftp://', 'sip:', 'sips:', 'sms:', 'ssh://', 'svn://', 'tel:', 'telnet://', 'urn:',
+        'worldwind://', 'xmpp:', '//',
+    }
+    non_relative_protocols = protocols - {'//'}
+    html_tags = {
+        'abbr', 'b', 'bdi', 'bdo', 'big', 'blockquote', 'br', 'caption', 'center', 'cite', 'code',
+        'data', 'dd', 'del', 'dfn', 'div', 'dl', 'dt', 'em', 'font', 'h1', 'h2', 'h3', 'h4', 'h5',
+        'h6', 'hr', 'i', 'ins', 'kbd', 'li', 'link', 'mark', 'meta', 'ol', 'p', 'q', 'rb', 'rp',
+        'rt', 'rtc', 'ruby', 's', 'samp', 'small', 'span', 'strike', 'strong', 'sub', 'sup',
+        'table', 'td', 'th', 'time', 'tr', 'tt', 'u', 'ul', 'var', 'wbr',
+    }
+    parser_tags = {
+        'graph', 'charinsert', 'rss', 'chem', 'categorytree', 'nowiki', 'inputbox', 'math',
+        'hiero', 'score', 'pre', 'ref', 'translate', 'imagemap', 'templatestyles', 'languages',
+        'noinclude', 'mapframe', 'section', 'poem', 'syntaxhighlight', 'includeonly', 'tvar',
+        'onlyinclude', 'templatedata', 'langconvert', 'timeline', 'dynamicpagelist', 'gallery',
+        'maplink', 'ce', 'references',
+    }
+    variant_langs = {
+        # ZhConverter.php
+        'zh', 'zh-hans', 'zh-hant', 'zh-cn', 'zh-hk', 'zh-mo', 'zh-my', 'zh-sg', 'zh-tw',
+        # WuuConverter.php
+        'wuu', 'wuu-hans', 'wuu-hant',
+        # UzConverter.php
+        'uz', 'uz-latn', 'uz-cyrl',
+        # TlyConverter.php
+        'tly', 'tly-cyrl',
+        # TgConverter.php
+        'tg', 'tg-latn',
+        # SrConverter.php
+        'sr', 'sr-ec', 'sr-el',
+        # ShiConverter.php
+        'shi', 'shi-tfng', 'shi-latn',
+        # ShConverter.php
+        'sh-latn', 'sh-cyrl',
+        # KuConverter.php
+        'ku', 'ku-arab', 'ku-latn',
+        # IuConverter.php
+        'iu', 'ike-cans', 'ike-latn',
+        # GanConverter.php
+        'gan', 'gan-hans', 'gan-hant',
+        # EnConverter.php
+        'en', 'en-x-piglatin',
+        # CrhConverter.php
+        'crh', 'crh-cyrl', 'crh-latn',
+        # BanConverter.php
+        'ban', 'ban-bali', 'ban-x-dharma', 'ban-x-palmleaf', 'ban-x-pku',
+    }
+    magic_vars_i = {
+        'ARTICLEPATH', 'INT', 'PAGEID', 'SCRIPTPATH', 'SERVER', 'SERVERNAME', 'STYLEPATH',
+    }
+    magic_vars = {
+        '!', '=', 'BASEPAGENAME', 'BASEPAGENAMEE', 'CASCADINGSOURCES', 'CONTENTLANGUAGE',
+        'CONTENTLANG', 'CURRENTDAY', 'CURRENTDAY2', 'CURRENTDAYNAME', 'CURRENTDOW', 'CURRENTHOUR',
+        'CURRENTMONTH', 'CURRENTMONTH2', 'CURRENTMONTH1', 'CURRENTMONTHABBREV', 'CURRENTMONTHNAME',
+        'CURRENTMONTHNAMEGEN', 'CURRENTTIME', 'CURRENTTIMESTAMP', 'CURRENTVERSION', 'CURRENTWEEK',
+        'CURRENTYEAR', 'DIRECTIONMARK', 'DIRMARK', 'FULLPAGENAME', 'FULLPAGENAMEE', 'LOCALDAY',
+        'LOCALDAY2', 'LOCALDAYNAME', 'LOCALDOW', 'LOCALHOUR', 'LOCALMONTH', 'LOCALMONTH2',
+        'LOCALMONTH1', 'LOCALMONTHABBREV', 'LOCALMONTHNAME', 'LOCALMONTHNAMEGEN', 'LOCALTIME',
+        'LOCALTIMESTAMP', 'LOCALWEEK', 'LOCALYEAR', 'NAMESPACE', 'NAMESPACEE', 'NAMESPACENUMBER',
+        'NUMBEROFACTIVEUSERS', 'NUMBEROFADMINS', 'NUMBEROFARTICLES', 'NUMBEROFEDITS',
+        'NUMBEROFFILES', 'NUMBEROFPAGES', 'NUMBEROFUSERS', 'PAGELANGUAGE', 'PAGENAME', 'PAGENAMEE',
+        'REVISIONDAY', 'REVISIONDAY2', 'REVISIONID', 'REVISIONMONTH', 'REVISIONMONTH1',
+        'REVISIONSIZE', 'REVISIONTIMESTAMP', 'REVISIONUSER', 'REVISIONYEAR', 'ROOTPAGENAME',
+        'ROOTPAGENAMEE', 'SITENAME', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME', 'SUBJECTPAGENAMEE',
+        'ARTICLEPAGENAMEE', 'SUBJECTSPACE', 'ARTICLESPACE', 'SUBJECTSPACEE', 'ARTICLESPACEE',
+        'SUBPAGENAME', 'SUBPAGENAMEE', 'TALKPAGENAME', 'TALKPAGENAMEE', 'TALKSPACE', 'TALKSPACEE',
+    }
+    parser_functions_i = {
+        'ANCHORENCODE', 'BIDI', 'CANONICALURL', 'CANONICALURLE', 'FILEPATH', 'FORMATNUM',
+        'FULLURL', 'FULLURLE', 'GENDER', 'GRAMMAR', 'INT', r'\#LANGUAGE', 'LC', 'LCFIRST', 'LOCALURL',
+        'LOCALURLE', 'NS', 'NSE', 'PADLEFT', 'PADRIGHT', 'PAGEID', 'PLURAL', 'UC', 'UCFIRST',
+        'URLENCODE',
+    }
+    parser_functions = {
+        'BASEPAGENAME', 'BASEPAGENAMEE', 'CASCADINGSOURCES', 'DEFAULTSORT', 'DEFAULTSORTKEY',
+        'DEFAULTCATEGORYSORT', 'FULLPAGENAME', 'FULLPAGENAMEE', 'NAMESPACE', 'NAMESPACEE',
+        'NAMESPACENUMBER', 'NUMBERINGROUP', 'NUMINGROUP', 'NUMBEROFACTIVEUSERS', 'NUMBEROFADMINS',
+        'NUMBEROFARTICLES', 'NUMBEROFEDITS', 'NUMBEROFFILES', 'NUMBEROFPAGES', 'NUMBEROFUSERS',
+        'PAGENAME', 'PAGENAMEE', 'PAGESINCATEGORY', 'PAGESINCAT', 'PAGESIZE', 'PROTECTIONEXPIRY',
+        'PROTECTIONLEVEL', 'REVISIONDAY', 'REVISIONDAY2', 'REVISIONID', 'REVISIONMONTH',
+        'REVISIONMONTH1', 'REVISIONTIMESTAMP', 'REVISIONUSER', 'REVISIONYEAR', 'ROOTPAGENAME',
+        'ROOTPAGENAMEE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME', 'SUBJECTPAGENAMEE',
+        'ARTICLEPAGENAMEE', 'SUBJECTSPACE', 'ARTICLESPACE', 'SUBJECTSPACEE', 'ARTICLESPACEE',
+        'SUBPAGENAME', 'SUBPAGENAMEE', 'TALKPAGENAME', 'TALKPAGENAMEE', 'TALKSPACE', 'TALKSPACEE',
+        'INT', 'DISPLAYTITLE', 'PAGESINNAMESPACE', 'PAGESINNS',
+    }
+
+    tokens = {
+        'root': [
+            # Redirects
+            (r"""(?xi)
+                (\A\s*?)(\#REDIRECT:?) # may contain a colon
+                (\s+)(\[\[) (?=[^\]\n]* \]\]$)
+            """,
+             bygroups(Whitespace, Keyword, Whitespace, Punctuation), 'redirect-inner'),
+            # Subheadings
+            (r'^(={2,6})(.+?)(\1)(\s*$\n)',
+             bygroups(Generic.Subheading, Generic.Subheading, Generic.Subheading, Whitespace)),
+            # Headings
+            (r'^(=.+?=)(\s*$\n)',
+             bygroups(Generic.Heading, Whitespace)),
+            # Double-slashed magic words
+            (words(double_slashes_i, prefix=r'(?i)'), Name.Function.Magic),
+            (words(double_slashes), Name.Function.Magic),
+            # Raw URLs
+            (r'(?i)\b(?:{}){}{}*'.format('|'.join(protocols),
+             link_address, link_char_class), Name.Label),
+            # Magic links
+            (rf'\b(?:RFC|PMID){nbsp_char}+[0-9]+\b',
+             Name.Function.Magic),
+            (r"""(?x)
+                \bISBN {nbsp_char}
+                (?: 97[89] {nbsp_dash}? )?
+                (?: [0-9] {nbsp_dash}? ){{9}} # escape format()
+                [0-9Xx]\b
+            """.format(nbsp_char=nbsp_char, nbsp_dash=f'(?:-|{nbsp_char})'), Name.Function.Magic),
+            include('list'),
+            include('inline'),
+            include('text'),
+        ],
+        'redirect-inner': [
+            (r'(\]\])(\s*?\n)', bygroups(Punctuation, Whitespace), '#pop'),
+            (r'(\#)([^#]*?)', bygroups(Punctuation, Name.Label)),
+            (rf'(?i)[{title_char}]+', Name.Tag),
+        ],
+        'list': [
+            # Description lists
+            (r'^;', Keyword, 'dt'),
+            # Ordered lists, unordered lists and indents
+            (r'^[#:*]+', Keyword),
+            # Horizontal rules
+            (r'^-{4,}', Keyword),
+        ],
+        'inline': [
+            # Signatures
+            (r'~{3,5}', Keyword),
+            # Entities
+            include('entity'),
+            # Bold & italic
+            (r"('')(''')(?!')", bygroups(Generic.Emph,
+             Generic.EmphStrong), 'inline-italic-bold'),
+            (r"'''(?!')", Generic.Strong, 'inline-bold'),
+            (r"''(?!')", Generic.Emph, 'inline-italic'),
+            # Comments & parameters & templates
+            include('replaceable'),
+            # Media links
+            (
+                r"""(?xi)
+                (\[\[)
+                    (File|Image) (:)
+                    ((?: [{}] | \{{{{2,3}}[^{{}}]*?\}}{{2,3}} | <!--[\s\S]*?--> )*)
+                    (?: (\#) ([{}]*?) )?
+                """.format(title_char, f'{title_char}#'),
+                bygroups(Punctuation, Name.Namespace,  Punctuation,
+                         using(this, state=['wikilink-name']), Punctuation, Name.Label),
+                'medialink-inner'
+            ),
+            # Wikilinks
+            (
+                r"""(?xi)
+                (\[\[)(?!{}) # Should not contain URLs
+                    (?: ([{}]*) (:))?
+                    ((?: [{}] | \{{{{2,3}}[^{{}}]*?\}}{{2,3}} | <!--[\s\S]*?--> )*?)
+                    (?: (\#) ([{}]*?) )?
+                (\]\])
+                """.format('|'.join(protocols), title_char.replace('/', ''),
+                       title_char, f'{title_char}#'),
+                bygroups(Punctuation, Name.Namespace,  Punctuation,
+                         using(this, state=['wikilink-name']), Punctuation, Name.Label, Punctuation)
+            ),
+            (
+                r"""(?xi)
+                (\[\[)(?!{})
+                    (?: ([{}]*) (:))?
+                    ((?: [{}] | \{{{{2,3}}[^{{}}]*?\}}{{2,3}} | <!--[\s\S]*?--> )*?)
+                    (?: (\#) ([{}]*?) )?
+                    (\|)
+                """.format('|'.join(protocols), title_char.replace('/', ''),
+                       title_char, f'{title_char}#'),
+                bygroups(Punctuation, Name.Namespace,  Punctuation,
+                         using(this, state=['wikilink-name']), Punctuation, Name.Label, Punctuation),
+                'wikilink-inner'
+            ),
+            # External links
+            (
+                r"""(?xi)
+                (\[)
+                    ((?:{}) {} {}*)
+                    (\s*)
+                """.format('|'.join(protocols), link_address, link_char_class),
+                bygroups(Punctuation, Name.Label, Whitespace),
+                'extlink-inner'
+            ),
+            # Tables
+            (r'^(:*)(\s*?)(\{\|)([^\n]*)$', bygroups(Keyword,
+             Whitespace, Punctuation, using(this, state=['root', 'attr'])), 'table'),
+            # HTML tags
+            (r'(?i)(<)({})\b'.format('|'.join(html_tags)),
+             bygroups(Punctuation, Name.Tag), 'tag-inner-ordinary'),
+            (r'(?i)(</)({})\b(\s*)(>)'.format('|'.join(html_tags)),
+             bygroups(Punctuation, Name.Tag, Whitespace, Punctuation)),
+            # <nowiki>
+            (r'(?i)(<)(nowiki)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-nowiki', 'tag-inner')),
+            # <pre>
+            (r'(?i)(<)(pre)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-pre', 'tag-inner')),
+            # <categorytree>
+            (r'(?i)(<)(categorytree)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-categorytree', 'tag-inner')),
+            # <hiero>
+            (r'(?i)(<)(hiero)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-hiero', 'tag-inner')),
+            # <math>
+            (r'(?i)(<)(math)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-math', 'tag-inner')),
+            # <chem>
+            (r'(?i)(<)(chem)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-chem', 'tag-inner')),
+            # <ce>
+            (r'(?i)(<)(ce)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-ce', 'tag-inner')),
+            # <charinsert>
+            (r'(?i)(<)(charinsert)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-charinsert', 'tag-inner')),
+            # <templatedata>
+            (r'(?i)(<)(templatedata)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-templatedata', 'tag-inner')),
+            # <gallery>
+            (r'(?i)(<)(gallery)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-gallery', 'tag-inner')),
+            # <graph>
+            (r'(?i)(<)(gallery)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-graph', 'tag-inner')),
+            # <dynamicpagelist>
+            (r'(?i)(<)(dynamicpagelist)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-dynamicpagelist', 'tag-inner')),
+            # <inputbox>
+            (r'(?i)(<)(inputbox)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-inputbox', 'tag-inner')),
+            # <rss>
+            (r'(?i)(<)(rss)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-rss', 'tag-inner')),
+            # <imagemap>
+            (r'(?i)(<)(imagemap)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-imagemap', 'tag-inner')),
+            # <syntaxhighlight>
+            (r'(?i)(</)(syntaxhighlight)\b(\s*)(>)',
+             bygroups(Punctuation, Name.Tag, Whitespace, Punctuation)),
+            (r'(?si)(<)(syntaxhighlight)\b([^>]*?(?<!/)>.*?)(?=</\2\s*>)',
+             bygroups(Punctuation, Name.Tag, handle_syntaxhighlight)),
+            # <syntaxhighlight>: Fallback case for self-closing tags
+            (r'(?i)(<)(syntaxhighlight)\b(\s*?)((?:[^>]|-->)*?)(/\s*?(?<!--)>)', bygroups(
+                Punctuation, Name.Tag, Whitespace, using(this, state=['root', 'attr']), Punctuation)),
+            # <source>
+            (r'(?i)(</)(source)\b(\s*)(>)',
+             bygroups(Punctuation, Name.Tag, Whitespace, Punctuation)),
+            (r'(?si)(<)(source)\b([^>]*?(?<!/)>.*?)(?=</\2\s*>)',
+             bygroups(Punctuation, Name.Tag, handle_syntaxhighlight)),
+            # <source>: Fallback case for self-closing tags
+            (r'(?i)(<)(source)\b(\s*?)((?:[^>]|-->)*?)(/\s*?(?<!--)>)', bygroups(
+                Punctuation, Name.Tag, Whitespace, using(this, state=['root', 'attr']), Punctuation)),
+            # <score>
+            (r'(?i)(</)(score)\b(\s*)(>)',
+             bygroups(Punctuation, Name.Tag, Whitespace, Punctuation)),
+            (r'(?si)(<)(score)\b([^>]*?(?<!/)>.*?)(?=</\2\s*>)',
+             bygroups(Punctuation, Name.Tag, handle_score)),
+            # <score>: Fallback case for self-closing tags
+            (r'(?i)(<)(score)\b(\s*?)((?:[^>]|-->)*?)(/\s*?(?<!--)>)', bygroups(
+                Punctuation, Name.Tag, Whitespace, using(this, state=['root', 'attr']), Punctuation)),
+            # Other parser tags
+            (r'(?i)(<)({})\b'.format('|'.join(parser_tags)),
+             bygroups(Punctuation, Name.Tag), 'tag-inner-ordinary'),
+            (r'(?i)(</)({})\b(\s*)(>)'.format('|'.join(parser_tags)),
+             bygroups(Punctuation, Name.Tag, Whitespace, Punctuation)),
+            # LanguageConverter markups
+            (
+                r"""(?xi)
+                (-\{{) # Use {{ to escape format()
+                    ([^|]) (\|)
+                    (?:
+                        (?: ([^;]*?) (=>))?
+                        (\s* (?:{variants}) \s*) (:)
+                    )?
+                """.format(variants='|'.join(variant_langs)),
+                bygroups(Punctuation, Keyword, Punctuation,
+                         using(this, state=['root', 'lc-raw']),
+                         Operator, Name.Label, Punctuation),
+                'lc-inner'
+            ),
+            # LanguageConverter markups: composite conversion grammar
+            (
+                r"""(?xi)
+                (-\{)
+                    ([a-z\s;-]*?) (\|)
+                """,
+                bygroups(Punctuation,
+                         using(this, state=['root', 'lc-flag']),
+                         Punctuation),
+                'lc-raw'
+            ),
+            # LanguageConverter markups: fallbacks
+            (
+                r"""(?xi)
+                (-\{{) (?!\{{) # Use {{ to escape format()
+                    (?: (\s* (?:{variants}) \s*) (:))?
+                """.format(variants='|'.join(variant_langs)),
+                bygroups(Punctuation, Name.Label, Punctuation),
+                'lc-inner'
+            ),
+        ],
+        'wikilink-name': [
+            include('replaceable'),
+            (r'[^{<]+', Name.Tag),
+            (r'(?s).', Name.Tag),
+        ],
+        'wikilink-inner': [
+            # Quit in case of another wikilink
+            (r'(?=\[\[)', Punctuation, '#pop'),
+            (r'\]\]', Punctuation, '#pop'),
+            include('inline'),
+            include('text'),
+        ],
+        'medialink-inner': [
+            (r'\]\]', Punctuation, '#pop'),
+            (r'(\|)([^\n=|]*)(=)',
+             bygroups(Punctuation, Name.Attribute, Operator)),
+            (r'\|', Punctuation),
+            include('inline'),
+            include('text'),
+        ],
+        'quote-common': [
+            # Quit in case of link/template endings
+            (r'(?=\]\]|\{\{|\}\})', Punctuation, '#pop'),
+            (r'\n', Text, '#pop'),
+        ],
+        'inline-italic': [
+            include('quote-common'),
+            (r"('')(''')(?!')", bygroups(Generic.Emph,
+             Generic.Strong), ('#pop', 'inline-bold')),
+            (r"'''(?!')", Generic.EmphStrong, ('#pop', 'inline-italic-bold')),
+            (r"''(?!')", Generic.Emph, '#pop'),
+            include('inline'),
+            include('text-italic'),
+        ],
+        'inline-bold': [
+            include('quote-common'),
+            (r"(''')('')(?!')", bygroups(
+                Generic.Strong, Generic.Emph), ('#pop', 'inline-italic')),
+            (r"'''(?!')", Generic.Strong, '#pop'),
+            (r"''(?!')", Generic.EmphStrong, ('#pop', 'inline-bold-italic')),
+            include('inline'),
+            include('text-bold'),
+        ],
+        'inline-bold-italic': [
+            include('quote-common'),
+            (r"('')(''')(?!')", bygroups(Generic.EmphStrong,
+             Generic.Strong), '#pop'),
+            (r"'''(?!')", Generic.EmphStrong, ('#pop', 'inline-italic')),
+            (r"''(?!')", Generic.EmphStrong, ('#pop', 'inline-bold')),
+            include('inline'),
+            include('text-bold-italic'),
+        ],
+        'inline-italic-bold': [
+            include('quote-common'),
+            (r"(''')('')(?!')", bygroups(
+                Generic.EmphStrong, Generic.Emph), '#pop'),
+            (r"'''(?!')", Generic.EmphStrong, ('#pop', 'inline-italic')),
+            (r"''(?!')", Generic.EmphStrong, ('#pop', 'inline-bold')),
+            include('inline'),
+            include('text-bold-italic'),
+        ],
+        'lc-flag': [
+            (r'\s+', Whitespace),
+            (r';', Punctuation),
+            *text_rules(Keyword),
+        ],
+        'lc-inner': [
+            (
+                r"""(?xi)
+                (;)
+                (?: ([^;]*?) (=>))?
+                (\s* (?:{variants}) \s*) (:)
+                """.format(variants='|'.join(variant_langs)),
+                bygroups(Punctuation, using(this, state=['root', 'lc-raw']),
+                         Operator, Name.Label, Punctuation)
+            ),
+            (r';?\s*?\}-', Punctuation, '#pop'),
+            include('inline'),
+            include('text'),
+        ],
+        'lc-raw': [
+            (r'\}-', Punctuation, '#pop'),
+            include('inline'),
+            include('text'),
+        ],
+        'replaceable': [
+            # Comments
+            (r'<!--[\s\S]*?(?:-->|\Z)', Comment.Multiline),
+            # Parameters
+            (
+                r"""(?x)
+                (\{{3})
+                    ([^|]*?)
+                    (?=\}{3}|\|)
+                """,
+                bygroups(Punctuation, Name.Variable),
+                'parameter-inner',
+            ),
+            # Magic variables
+            (r'(?i)(\{{\{{)(\s*)({})(\s*)(\}}\}})'.format('|'.join(magic_vars_i)),
+             bygroups(Punctuation, Whitespace, Name.Function, Whitespace, Punctuation)),
+            (r'(\{{\{{)(\s*)({})(\s*)(\}}\}})'.format('|'.join(magic_vars)),
+                bygroups(Punctuation, Whitespace, Name.Function, Whitespace, Punctuation)),
+            # Parser functions & templates
+            (r'\{\{', Punctuation, 'template-begin-space'),
+            # <tvar> legacy syntax
+            (r'(?i)(<)(tvar)\b(\|)([^>]*?)(>)', bygroups(Punctuation,
+             Name.Tag, Punctuation, String, Punctuation)),
+            (r'</>', Punctuation, '#pop'),
+            # <tvar>
+            (r'(?i)(<)(tvar)\b', bygroups(Punctuation, Name.Tag), 'tag-inner-ordinary'),
+            (r'(?i)(</)(tvar)\b(\s*)(>)',
+             bygroups(Punctuation, Name.Tag, Whitespace, Punctuation)),
+        ],
+        'parameter-inner': [
+            (r'\}{3}', Punctuation, '#pop'),
+            (r'\|', Punctuation),
+            include('inline'),
+            include('text'),
+        ],
+        'template-begin-space': [
+            # Templates allow line breaks at the beginning, and due to how MediaWiki handles
+            # comments, an extra state is required to handle things like {{\n<!---->\n name}}
+            (r'<!--[\s\S]*?(?:-->|\Z)', Comment.Multiline),
+            (r'\s+', Whitespace),
+            # Parser functions
+            (
+                r'(?i)(\#[{}]*?|{})(:)'.format(title_char,
+                                           '|'.join(parser_functions_i)),
+                bygroups(Name.Function, Punctuation), ('#pop', 'template-inner')
+            ),
+            (
+                r'({})(:)'.format('|'.join(parser_functions)),
+                bygroups(Name.Function, Punctuation), ('#pop', 'template-inner')
+            ),
+            # Templates
+            (
+                rf'(?i)([{title_char}]*?)(:)',
+                bygroups(Name.Namespace, Punctuation), ('#pop', 'template-name')
+            ),
+            default(('#pop', 'template-name'),),
+        ],
+        'template-name': [
+            (r'(\s*?)(\|)', bygroups(Text, Punctuation), ('#pop', 'template-inner')),
+            (r'\}\}', Punctuation, '#pop'),
+            (r'\n', Text, '#pop'),
+            include('replaceable'),
+            *text_rules(Name.Tag),
+        ],
+        'template-inner': [
+            (r'\}\}', Punctuation, '#pop'),
+            (r'\|', Punctuation),
+            (
+                r"""(?x)
+                    (?<=\|)
+                    ( (?: (?! \{\{ | \}\} )[^=\|<])*? ) # Exclude templates and tags
+                    (=)
+                """,
+                bygroups(Name.Label, Operator)
+            ),
+            include('inline'),
+            include('text'),
+        ],
+        'table': [
+            # Use [ \t\n\r\0\x0B] instead of \s to follow PHP trim() behavior
+            # Endings
+            (r'^([ \t\n\r\0\x0B]*?)(\|\})',
+             bygroups(Whitespace, Punctuation), '#pop'),
+            # Table rows
+            (r'^([ \t\n\r\0\x0B]*?)(\|-+)(.*)$', bygroups(Whitespace, Punctuation,
+             using(this, state=['root', 'attr']))),
+            # Captions
+            (
+                r"""(?x)
+                ^([ \t\n\r\0\x0B]*?)(\|\+)
+                # Exclude links, template and tags
+                (?: ( (?: (?! \[\[ | \{\{ )[^|\n<] )*? )(\|) )?
+                (.*?)$
+                """,
+                bygroups(Whitespace, Punctuation, using(this, state=[
+                         'root', 'attr']), Punctuation, Generic.Heading),
+            ),
+            # Table data
+            (
+                r"""(?x)
+                ( ^(?:[ \t\n\r\0\x0B]*?)\| | \|\| )
+                (?: ( (?: (?! \[\[ | \{\{ )[^|\n<] )*? )(\|)(?!\|) )?
+                """,
+                bygroups(Punctuation, using(this, state=[
+                         'root', 'attr']), Punctuation),
+            ),
+            # Table headers
+            (
+                r"""(?x)
+                ( ^(?:[ \t\n\r\0\x0B]*?)!  )
+                (?: ( (?: (?! \[\[ | \{\{ )[^|\n<] )*? )(\|)(?!\|) )?
+                """,
+                bygroups(Punctuation, using(this, state=[
+                         'root', 'attr']), Punctuation),
+                'table-header',
+            ),
+            include('list'),
+            include('inline'),
+            include('text'),
+        ],
+        'table-header': [
+            # Requires another state for || handling inside headers
+            (r'\n', Text, '#pop'),
+            (
+                r"""(?x)
+                (!!|\|\|)
+                (?:
+                    ( (?: (?! \[\[ | \{\{ )[^|\n<] )*? )
+                    (\|)(?!\|)
+                )?
+                """,
+                bygroups(Punctuation, using(this, state=[
+                         'root', 'attr']), Punctuation)
+            ),
+            *text_rules(Generic.Subheading),
+        ],
+        'entity': [
+            (r'&\S*?;', Name.Entity),
+        ],
+        'dt': [
+            (r'\n', Text, '#pop'),
+            include('inline'),
+            (r':', Keyword, '#pop'),
+            include('text'),
+        ],
+        'extlink-inner': [
+            (r'\]', Punctuation, '#pop'),
+            include('inline'),
+            include('text'),
+        ],
+        'nowiki-ish': [
+            include('entity'),
+            include('text'),
+        ],
+        'attr': [
+            include('replaceable'),
+            (r'\s+', Whitespace),
+            (r'(=)(\s*)(")', bygroups(Operator, Whitespace, String.Double), 'attr-val-2'),
+            (r"(=)(\s*)(')", bygroups(Operator, Whitespace, String.Single), 'attr-val-1'),
+            (r'(=)(\s*)', bygroups(Operator, Whitespace), 'attr-val-0'),
+            (r'[\w:-]+', Name.Attribute),
+
+        ],
+        'attr-val-0': [
+            (r'\s', Whitespace, '#pop'),
+            include('replaceable'),
+            *text_rules(String),
+        ],
+        'attr-val-1': [
+            (r"'", String.Single, '#pop'),
+            include('replaceable'),
+            *text_rules(String.Single),
+        ],
+        'attr-val-2': [
+            (r'"', String.Double, '#pop'),
+            include('replaceable'),
+            *text_rules(String.Double),
+        ],
+        'tag-inner-ordinary': [
+            (r'/?\s*>', Punctuation, '#pop'),
+            include('tag-attr'),
+        ],
+        'tag-inner': [
+            # Return to root state for self-closing tags
+            (r'/\s*>', Punctuation, '#pop:2'),
+            (r'\s*>', Punctuation, '#pop'),
+            include('tag-attr'),
+        ],
+        # There states below are just like their non-tag variants, the key difference is
+        # they forcibly quit when encountering tag closing markup
+        'tag-attr': [
+            include('replaceable'),
+            (r'\s+', Whitespace),
+            (r'(=)(\s*)(")', bygroups(Operator,
+             Whitespace, String.Double), 'tag-attr-val-2'),
+            (r"(=)(\s*)(')", bygroups(Operator,
+             Whitespace, String.Single), 'tag-attr-val-1'),
+            (r'(=)(\s*)', bygroups(Operator, Whitespace), 'tag-attr-val-0'),
+            (r'[\w:-]+', Name.Attribute),
+
+        ],
+        'tag-attr-val-0': [
+            (r'\s', Whitespace, '#pop'),
+            (r'/?>', Punctuation, '#pop:2'),
+            include('replaceable'),
+            *text_rules(String),
+        ],
+        'tag-attr-val-1': [
+            (r"'", String.Single, '#pop'),
+            (r'/?>', Punctuation, '#pop:2'),
+            include('replaceable'),
+            *text_rules(String.Single),
+        ],
+        'tag-attr-val-2': [
+            (r'"', String.Double, '#pop'),
+            (r'/?>', Punctuation, '#pop:2'),
+            include('replaceable'),
+            *text_rules(String.Double),
+        ],
+        'tag-nowiki': nowiki_tag_rules('nowiki'),
+        'tag-pre': nowiki_tag_rules('pre'),
+        'tag-categorytree': plaintext_tag_rules('categorytree'),
+        'tag-dynamicpagelist': plaintext_tag_rules('dynamicpagelist'),
+        'tag-hiero': plaintext_tag_rules('hiero'),
+        'tag-inputbox': plaintext_tag_rules('inputbox'),
+        'tag-imagemap': plaintext_tag_rules('imagemap'),
+        'tag-charinsert': plaintext_tag_rules('charinsert'),
+        'tag-timeline': plaintext_tag_rules('timeline'),
+        'tag-gallery': plaintext_tag_rules('gallery'),
+        'tag-graph': plaintext_tag_rules('graph'),
+        'tag-rss': plaintext_tag_rules('rss'),
+        'tag-math': delegate_tag_rules('math', TexLexer, state='math'),
+        'tag-chem': delegate_tag_rules('chem', TexLexer, state='math'),
+        'tag-ce': delegate_tag_rules('ce', TexLexer, state='math'),
+        'tag-templatedata': delegate_tag_rules('templatedata', JsonLexer),
+        'text-italic': text_rules(Generic.Emph),
+        'text-bold': text_rules(Generic.Strong),
+        'text-bold-italic': text_rules(Generic.EmphStrong),
+        'text': text_rules(Text),
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/math.py b/.venv/Lib/site-packages/pygments/lexers/math.py
new file mode 100644 (file)
index 0000000..b225ffc
--- /dev/null
@@ -0,0 +1,21 @@
+"""
+    pygments.lexers.math
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexers that were contained in this module.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# ruff: noqa: F401
+from pygments.lexers.python import NumPyLexer
+from pygments.lexers.matlab import MatlabLexer, MatlabSessionLexer, \
+    OctaveLexer, ScilabLexer
+from pygments.lexers.julia import JuliaLexer, JuliaConsoleLexer
+from pygments.lexers.r import RConsoleLexer, SLexer, RdLexer
+from pygments.lexers.modeling import BugsLexer, JagsLexer, StanLexer
+from pygments.lexers.idl import IDLLexer
+from pygments.lexers.algebra import MuPADLexer
+
+__all__ = []
diff --git a/.venv/Lib/site-packages/pygments/lexers/matlab.py b/.venv/Lib/site-packages/pygments/lexers/matlab.py
new file mode 100644 (file)
index 0000000..8eeffc9
--- /dev/null
@@ -0,0 +1,3307 @@
+"""
+    pygments.lexers.matlab
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Matlab and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, default, words, \
+    do_insertions, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+
+from pygments.lexers import _scilab_builtins
+
+__all__ = ['MatlabLexer', 'MatlabSessionLexer', 'OctaveLexer', 'ScilabLexer']
+
+
+class MatlabLexer(RegexLexer):
+    """
+    For Matlab source code.
+    """
+    name = 'Matlab'
+    aliases = ['matlab']
+    filenames = ['*.m']
+    mimetypes = ['text/matlab']
+    url = 'https://www.mathworks.com/products/matlab.html'
+    version_added = '0.10'
+
+    _operators = r'-|==|~=|<=|>=|<|>|&&|&|~|\|\|?|\.\*|\*|\+|\.\^|\^|\.\\|\./|/|\\'
+
+    tokens = {
+        'expressions': [
+            # operators:
+            (_operators, Operator),
+
+            # numbers (must come before punctuation to handle `.5`; cannot use
+            # `\b` due to e.g. `5. + .5`).  The negative lookahead on operators
+            # avoids including the dot in `1./x` (the dot is part of `./`).
+            (rf'(?<!\w)((\d+\.\d+)|(\d*\.\d+)|(\d+\.(?!{_operators})))'
+             r'([eEf][+-]?\d+)?(?!\w)', Number.Float),
+            (r'\b\d+[eEf][+-]?[0-9]+\b', Number.Float),
+            (r'\b\d+\b', Number.Integer),
+
+            # punctuation:
+            (r'\[|\]|\(|\)|\{|\}|:|@|\.|,', Punctuation),
+            (r'=|:|;', Punctuation),
+
+            # quote can be transpose, instead of string:
+            # (not great, but handles common cases...)
+            (r'(?<=[\w)\].])\'+', Operator),
+
+            (r'"(""|[^"])*"', String),
+
+            (r'(?<![\w)\].])\'', String, 'string'),
+            (r'[a-zA-Z_]\w*', Name),
+            (r'\s+', Whitespace),
+            (r'.', Text),
+        ],
+        'root': [
+            # line starting with '!' is sent as a system command.  not sure what
+            # label to use...
+            (r'^!.*', String.Other),
+            (r'%\{\s*\n', Comment.Multiline, 'blockcomment'),
+            (r'%.*$', Comment),
+            (r'(\s*^\s*)(function)\b', bygroups(Whitespace, Keyword), 'deffunc'),
+            (r'(\s*^\s*)(properties)(\s+)(\()',
+             bygroups(Whitespace, Keyword, Whitespace, Punctuation),
+             ('defprops', 'propattrs')),
+            (r'(\s*^\s*)(properties)\b',
+             bygroups(Whitespace, Keyword), 'defprops'),
+
+            # from 'iskeyword' on version 9.4 (R2018a):
+            # Check that there is no preceding dot, as keywords are valid field
+            # names.
+            (words(('break', 'case', 'catch', 'classdef', 'continue',
+                    'dynamicprops', 'else', 'elseif', 'end', 'for', 'function',
+                    'global', 'if', 'methods', 'otherwise', 'parfor',
+                    'persistent', 'return', 'spmd', 'switch',
+                    'try', 'while'),
+                   prefix=r'(?<!\.)(\s*)(', suffix=r')\b'),
+             bygroups(Whitespace, Keyword)),
+
+            (
+                words(
+                    [
+                        # See https://mathworks.com/help/matlab/referencelist.html
+                        # Below data from 2021-02-10T18:24:08Z
+                        # for Matlab release R2020b
+                        "BeginInvoke",
+                        "COM",
+                        "Combine",
+                        "CombinedDatastore",
+                        "EndInvoke",
+                        "Execute",
+                        "FactoryGroup",
+                        "FactorySetting",
+                        "Feval",
+                        "FunctionTestCase",
+                        "GetCharArray",
+                        "GetFullMatrix",
+                        "GetVariable",
+                        "GetWorkspaceData",
+                        "GraphPlot",
+                        "H5.close",
+                        "H5.garbage_collect",
+                        "H5.get_libversion",
+                        "H5.open",
+                        "H5.set_free_list_limits",
+                        "H5A.close",
+                        "H5A.create",
+                        "H5A.delete",
+                        "H5A.get_info",
+                        "H5A.get_name",
+                        "H5A.get_space",
+                        "H5A.get_type",
+                        "H5A.iterate",
+                        "H5A.open",
+                        "H5A.open_by_idx",
+                        "H5A.open_by_name",
+                        "H5A.read",
+                        "H5A.write",
+                        "H5D.close",
+                        "H5D.create",
+                        "H5D.get_access_plist",
+                        "H5D.get_create_plist",
+                        "H5D.get_offset",
+                        "H5D.get_space",
+                        "H5D.get_space_status",
+                        "H5D.get_storage_size",
+                        "H5D.get_type",
+                        "H5D.open",
+                        "H5D.read",
+                        "H5D.set_extent",
+                        "H5D.vlen_get_buf_size",
+                        "H5D.write",
+                        "H5DS.attach_scale",
+                        "H5DS.detach_scale",
+                        "H5DS.get_label",
+                        "H5DS.get_num_scales",
+                        "H5DS.get_scale_name",
+                        "H5DS.is_scale",
+                        "H5DS.iterate_scales",
+                        "H5DS.set_label",
+                        "H5DS.set_scale",
+                        "H5E.clear",
+                        "H5E.get_major",
+                        "H5E.get_minor",
+                        "H5E.walk",
+                        "H5F.close",
+                        "H5F.create",
+                        "H5F.flush",
+                        "H5F.get_access_plist",
+                        "H5F.get_create_plist",
+                        "H5F.get_filesize",
+                        "H5F.get_freespace",
+                        "H5F.get_info",
+                        "H5F.get_mdc_config",
+                        "H5F.get_mdc_hit_rate",
+                        "H5F.get_mdc_size",
+                        "H5F.get_name",
+                        "H5F.get_obj_count",
+                        "H5F.get_obj_ids",
+                        "H5F.is_hdf5",
+                        "H5F.mount",
+                        "H5F.open",
+                        "H5F.reopen",
+                        "H5F.set_mdc_config",
+                        "H5F.unmount",
+                        "H5G.close",
+                        "H5G.create",
+                        "H5G.get_info",
+                        "H5G.open",
+                        "H5I.dec_ref",
+                        "H5I.get_file_id",
+                        "H5I.get_name",
+                        "H5I.get_ref",
+                        "H5I.get_type",
+                        "H5I.inc_ref",
+                        "H5I.is_valid",
+                        "H5L.copy",
+                        "H5L.create_external",
+                        "H5L.create_hard",
+                        "H5L.create_soft",
+                        "H5L.delete",
+                        "H5L.exists",
+                        "H5L.get_info",
+                        "H5L.get_name_by_idx",
+                        "H5L.get_val",
+                        "H5L.iterate",
+                        "H5L.iterate_by_name",
+                        "H5L.move",
+                        "H5L.visit",
+                        "H5L.visit_by_name",
+                        "H5ML.compare_values",
+                        "H5ML.get_constant_names",
+                        "H5ML.get_constant_value",
+                        "H5ML.get_function_names",
+                        "H5ML.get_mem_datatype",
+                        "H5O.close",
+                        "H5O.copy",
+                        "H5O.get_comment",
+                        "H5O.get_comment_by_name",
+                        "H5O.get_info",
+                        "H5O.link",
+                        "H5O.open",
+                        "H5O.open_by_idx",
+                        "H5O.set_comment",
+                        "H5O.set_comment_by_name",
+                        "H5O.visit",
+                        "H5O.visit_by_name",
+                        "H5P.all_filters_avail",
+                        "H5P.close",
+                        "H5P.close_class",
+                        "H5P.copy",
+                        "H5P.create",
+                        "H5P.equal",
+                        "H5P.exist",
+                        "H5P.fill_value_defined",
+                        "H5P.get",
+                        "H5P.get_alignment",
+                        "H5P.get_alloc_time",
+                        "H5P.get_attr_creation_order",
+                        "H5P.get_attr_phase_change",
+                        "H5P.get_btree_ratios",
+                        "H5P.get_char_encoding",
+                        "H5P.get_chunk",
+                        "H5P.get_chunk_cache",
+                        "H5P.get_class",
+                        "H5P.get_class_name",
+                        "H5P.get_class_parent",
+                        "H5P.get_copy_object",
+                        "H5P.get_create_intermediate_group",
+                        "H5P.get_driver",
+                        "H5P.get_edc_check",
+                        "H5P.get_external",
+                        "H5P.get_external_count",
+                        "H5P.get_family_offset",
+                        "H5P.get_fapl_core",
+                        "H5P.get_fapl_family",
+                        "H5P.get_fapl_multi",
+                        "H5P.get_fclose_degree",
+                        "H5P.get_fill_time",
+                        "H5P.get_fill_value",
+                        "H5P.get_filter",
+                        "H5P.get_filter_by_id",
+                        "H5P.get_gc_references",
+                        "H5P.get_hyper_vector_size",
+                        "H5P.get_istore_k",
+                        "H5P.get_layout",
+                        "H5P.get_libver_bounds",
+                        "H5P.get_link_creation_order",
+                        "H5P.get_link_phase_change",
+                        "H5P.get_mdc_config",
+                        "H5P.get_meta_block_size",
+                        "H5P.get_multi_type",
+                        "H5P.get_nfilters",
+                        "H5P.get_nprops",
+                        "H5P.get_sieve_buf_size",
+                        "H5P.get_size",
+                        "H5P.get_sizes",
+                        "H5P.get_small_data_block_size",
+                        "H5P.get_sym_k",
+                        "H5P.get_userblock",
+                        "H5P.get_version",
+                        "H5P.isa_class",
+                        "H5P.iterate",
+                        "H5P.modify_filter",
+                        "H5P.remove_filter",
+                        "H5P.set",
+                        "H5P.set_alignment",
+                        "H5P.set_alloc_time",
+                        "H5P.set_attr_creation_order",
+                        "H5P.set_attr_phase_change",
+                        "H5P.set_btree_ratios",
+                        "H5P.set_char_encoding",
+                        "H5P.set_chunk",
+                        "H5P.set_chunk_cache",
+                        "H5P.set_copy_object",
+                        "H5P.set_create_intermediate_group",
+                        "H5P.set_deflate",
+                        "H5P.set_edc_check",
+                        "H5P.set_external",
+                        "H5P.set_family_offset",
+                        "H5P.set_fapl_core",
+                        "H5P.set_fapl_family",
+                        "H5P.set_fapl_log",
+                        "H5P.set_fapl_multi",
+                        "H5P.set_fapl_sec2",
+                        "H5P.set_fapl_split",
+                        "H5P.set_fapl_stdio",
+                        "H5P.set_fclose_degree",
+                        "H5P.set_fill_time",
+                        "H5P.set_fill_value",
+                        "H5P.set_filter",
+                        "H5P.set_fletcher32",
+                        "H5P.set_gc_references",
+                        "H5P.set_hyper_vector_size",
+                        "H5P.set_istore_k",
+                        "H5P.set_layout",
+                        "H5P.set_libver_bounds",
+                        "H5P.set_link_creation_order",
+                        "H5P.set_link_phase_change",
+                        "H5P.set_mdc_config",
+                        "H5P.set_meta_block_size",
+                        "H5P.set_multi_type",
+                        "H5P.set_nbit",
+                        "H5P.set_scaleoffset",
+                        "H5P.set_shuffle",
+                        "H5P.set_sieve_buf_size",
+                        "H5P.set_sizes",
+                        "H5P.set_small_data_block_size",
+                        "H5P.set_sym_k",
+                        "H5P.set_userblock",
+                        "H5R.create",
+                        "H5R.dereference",
+                        "H5R.get_name",
+                        "H5R.get_obj_type",
+                        "H5R.get_region",
+                        "H5S.close",
+                        "H5S.copy",
+                        "H5S.create",
+                        "H5S.create_simple",
+                        "H5S.extent_copy",
+                        "H5S.get_select_bounds",
+                        "H5S.get_select_elem_npoints",
+                        "H5S.get_select_elem_pointlist",
+                        "H5S.get_select_hyper_blocklist",
+                        "H5S.get_select_hyper_nblocks",
+                        "H5S.get_select_npoints",
+                        "H5S.get_select_type",
+                        "H5S.get_simple_extent_dims",
+                        "H5S.get_simple_extent_ndims",
+                        "H5S.get_simple_extent_npoints",
+                        "H5S.get_simple_extent_type",
+                        "H5S.is_simple",
+                        "H5S.offset_simple",
+                        "H5S.select_all",
+                        "H5S.select_elements",
+                        "H5S.select_hyperslab",
+                        "H5S.select_none",
+                        "H5S.select_valid",
+                        "H5S.set_extent_none",
+                        "H5S.set_extent_simple",
+                        "H5T.array_create",
+                        "H5T.close",
+                        "H5T.commit",
+                        "H5T.committed",
+                        "H5T.copy",
+                        "H5T.create",
+                        "H5T.detect_class",
+                        "H5T.enum_create",
+                        "H5T.enum_insert",
+                        "H5T.enum_nameof",
+                        "H5T.enum_valueof",
+                        "H5T.equal",
+                        "H5T.get_array_dims",
+                        "H5T.get_array_ndims",
+                        "H5T.get_class",
+                        "H5T.get_create_plist",
+                        "H5T.get_cset",
+                        "H5T.get_ebias",
+                        "H5T.get_fields",
+                        "H5T.get_inpad",
+                        "H5T.get_member_class",
+                        "H5T.get_member_index",
+                        "H5T.get_member_name",
+                        "H5T.get_member_offset",
+                        "H5T.get_member_type",
+                        "H5T.get_member_value",
+                        "H5T.get_native_type",
+                        "H5T.get_nmembers",
+                        "H5T.get_norm",
+                        "H5T.get_offset",
+                        "H5T.get_order",
+                        "H5T.get_pad",
+                        "H5T.get_precision",
+                        "H5T.get_sign",
+                        "H5T.get_size",
+                        "H5T.get_strpad",
+                        "H5T.get_super",
+                        "H5T.get_tag",
+                        "H5T.insert",
+                        "H5T.is_variable_str",
+                        "H5T.lock",
+                        "H5T.open",
+                        "H5T.pack",
+                        "H5T.set_cset",
+                        "H5T.set_ebias",
+                        "H5T.set_fields",
+                        "H5T.set_inpad",
+                        "H5T.set_norm",
+                        "H5T.set_offset",
+                        "H5T.set_order",
+                        "H5T.set_pad",
+                        "H5T.set_precision",
+                        "H5T.set_sign",
+                        "H5T.set_size",
+                        "H5T.set_strpad",
+                        "H5T.set_tag",
+                        "H5T.vlen_create",
+                        "H5Z.filter_avail",
+                        "H5Z.get_filter_info",
+                        "Inf",
+                        "KeyValueDatastore",
+                        "KeyValueStore",
+                        "MException",
+                        "MException.last",
+                        "MaximizeCommandWindow",
+                        "MemoizedFunction",
+                        "MinimizeCommandWindow",
+                        "NET",
+                        "NET.Assembly",
+                        "NET.GenericClass",
+                        "NET.NetException",
+                        "NET.addAssembly",
+                        "NET.convertArray",
+                        "NET.createArray",
+                        "NET.createGeneric",
+                        "NET.disableAutoRelease",
+                        "NET.enableAutoRelease",
+                        "NET.invokeGenericMethod",
+                        "NET.isNETSupported",
+                        "NET.setStaticProperty",
+                        "NaN",
+                        "NaT",
+                        "OperationResult",
+                        "PutCharArray",
+                        "PutFullMatrix",
+                        "PutWorkspaceData",
+                        "PythonEnvironment",
+                        "Quit",
+                        "RandStream",
+                        "ReleaseCompatibilityException",
+                        "ReleaseCompatibilityResults",
+                        "Remove",
+                        "RemoveAll",
+                        "Setting",
+                        "SettingsGroup",
+                        "TallDatastore",
+                        "Test",
+                        "TestResult",
+                        "Tiff",
+                        "TransformedDatastore",
+                        "ValueIterator",
+                        "VersionResults",
+                        "VideoReader",
+                        "VideoWriter",
+                        "abs",
+                        "accumarray",
+                        "acos",
+                        "acosd",
+                        "acosh",
+                        "acot",
+                        "acotd",
+                        "acoth",
+                        "acsc",
+                        "acscd",
+                        "acsch",
+                        "actxGetRunningServer",
+                        "actxserver",
+                        "add",
+                        "addCause",
+                        "addCorrection",
+                        "addFile",
+                        "addFolderIncludingChildFiles",
+                        "addGroup",
+                        "addLabel",
+                        "addPath",
+                        "addReference",
+                        "addSetting",
+                        "addShortcut",
+                        "addShutdownFile",
+                        "addStartupFile",
+                        "addStyle",
+                        "addToolbarExplorationButtons",
+                        "addboundary",
+                        "addcats",
+                        "addedge",
+                        "addevent",
+                        "addlistener",
+                        "addmulti",
+                        "addnode",
+                        "addpath",
+                        "addpoints",
+                        "addpref",
+                        "addprop",
+                        "addsample",
+                        "addsampletocollection",
+                        "addtodate",
+                        "addts",
+                        "addvars",
+                        "adjacency",
+                        "airy",
+                        "align",
+                        "alim",
+                        "all",
+                        "allchild",
+                        "alpha",
+                        "alphaShape",
+                        "alphaSpectrum",
+                        "alphaTriangulation",
+                        "alphamap",
+                        "alphanumericBoundary",
+                        "alphanumericsPattern",
+                        "amd",
+                        "analyzeCodeCompatibility",
+                        "ancestor",
+                        "angle",
+                        "animatedline",
+                        "annotation",
+                        "ans",
+                        "any",
+                        "appdesigner",
+                        "append",
+                        "area",
+                        "arguments",
+                        "array2table",
+                        "array2timetable",
+                        "arrayDatastore",
+                        "arrayfun",
+                        "asFewOfPattern",
+                        "asManyOfPattern",
+                        "ascii",
+                        "asec",
+                        "asecd",
+                        "asech",
+                        "asin",
+                        "asind",
+                        "asinh",
+                        "assert",
+                        "assignin",
+                        "atan",
+                        "atan2",
+                        "atan2d",
+                        "atand",
+                        "atanh",
+                        "audiodevinfo",
+                        "audiodevreset",
+                        "audioinfo",
+                        "audioplayer",
+                        "audioread",
+                        "audiorecorder",
+                        "audiowrite",
+                        "autumn",
+                        "axes",
+                        "axis",
+                        "axtoolbar",
+                        "axtoolbarbtn",
+                        "balance",
+                        "bandwidth",
+                        "bar",
+                        "bar3",
+                        "bar3h",
+                        "barh",
+                        "barycentricToCartesian",
+                        "base2dec",
+                        "batchStartupOptionUsed",
+                        "bctree",
+                        "beep",
+                        "bench",
+                        "besselh",
+                        "besseli",
+                        "besselj",
+                        "besselk",
+                        "bessely",
+                        "beta",
+                        "betainc",
+                        "betaincinv",
+                        "betaln",
+                        "between",
+                        "bfsearch",
+                        "bicg",
+                        "bicgstab",
+                        "bicgstabl",
+                        "biconncomp",
+                        "bin2dec",
+                        "binary",
+                        "binscatter",
+                        "bitand",
+                        "bitcmp",
+                        "bitget",
+                        "bitnot",
+                        "bitor",
+                        "bitset",
+                        "bitshift",
+                        "bitxor",
+                        "blanks",
+                        "ble",
+                        "blelist",
+                        "blkdiag",
+                        "bluetooth",
+                        "bluetoothlist",
+                        "bone",
+                        "boundary",
+                        "boundaryFacets",
+                        "boundaryshape",
+                        "boundingbox",
+                        "bounds",
+                        "box",
+                        "boxchart",
+                        "brighten",
+                        "brush",
+                        "bsxfun",
+                        "bubblechart",
+                        "bubblechart3",
+                        "bubblelegend",
+                        "bubblelim",
+                        "bubblesize",
+                        "builddocsearchdb",
+                        "builtin",
+                        "bvp4c",
+                        "bvp5c",
+                        "bvpget",
+                        "bvpinit",
+                        "bvpset",
+                        "bvpxtend",
+                        "caldays",
+                        "caldiff",
+                        "calendar",
+                        "calendarDuration",
+                        "calllib",
+                        "calmonths",
+                        "calquarters",
+                        "calweeks",
+                        "calyears",
+                        "camdolly",
+                        "cameratoolbar",
+                        "camlight",
+                        "camlookat",
+                        "camorbit",
+                        "campan",
+                        "campos",
+                        "camproj",
+                        "camroll",
+                        "camtarget",
+                        "camup",
+                        "camva",
+                        "camzoom",
+                        "canUseGPU",
+                        "canUseParallelPool",
+                        "cart2pol",
+                        "cart2sph",
+                        "cartesianToBarycentric",
+                        "caseInsensitivePattern",
+                        "caseSensitivePattern",
+                        "cast",
+                        "cat",
+                        "categorical",
+                        "categories",
+                        "caxis",
+                        "cd",
+                        "cdf2rdf",
+                        "cdfepoch",
+                        "cdfinfo",
+                        "cdflib",
+                        "cdfread",
+                        "ceil",
+                        "cell",
+                        "cell2mat",
+                        "cell2struct",
+                        "cell2table",
+                        "celldisp",
+                        "cellfun",
+                        "cellplot",
+                        "cellstr",
+                        "centrality",
+                        "centroid",
+                        "cgs",
+                        "char",
+                        "characterListPattern",
+                        "characteristic",
+                        "checkcode",
+                        "chol",
+                        "cholupdate",
+                        "choose",
+                        "chooseContextMenu",
+                        "circshift",
+                        "circumcenter",
+                        "cla",
+                        "clabel",
+                        "class",
+                        "classUnderlying",
+                        "clc",
+                        "clear",
+                        "clearAllMemoizedCaches",
+                        "clearPersonalValue",
+                        "clearTemporaryValue",
+                        "clearpoints",
+                        "clearvars",
+                        "clf",
+                        "clibArray",
+                        "clibConvertArray",
+                        "clibIsNull",
+                        "clibIsReadOnly",
+                        "clibRelease",
+                        "clibgen.buildInterface",
+                        "clibgen.generateLibraryDefinition",
+                        "clipboard",
+                        "clock",
+                        "clone",
+                        "close",
+                        "closeFile",
+                        "closereq",
+                        "cmap2gray",
+                        "cmpermute",
+                        "cmunique",
+                        "codeCompatibilityReport",
+                        "colamd",
+                        "collapse",
+                        "colon",
+                        "colorbar",
+                        "colorcube",
+                        "colormap",
+                        "colororder",
+                        "colperm",
+                        "com.mathworks.engine.MatlabEngine",
+                        "com.mathworks.matlab.types.CellStr",
+                        "com.mathworks.matlab.types.Complex",
+                        "com.mathworks.matlab.types.HandleObject",
+                        "com.mathworks.matlab.types.Struct",
+                        "combine",
+                        "comet",
+                        "comet3",
+                        "compan",
+                        "compass",
+                        "complex",
+                        "compose",
+                        "computer",
+                        "comserver",
+                        "cond",
+                        "condeig",
+                        "condensation",
+                        "condest",
+                        "coneplot",
+                        "configureCallback",
+                        "configureTerminator",
+                        "conj",
+                        "conncomp",
+                        "containers.Map",
+                        "contains",
+                        "containsrange",
+                        "contour",
+                        "contour3",
+                        "contourc",
+                        "contourf",
+                        "contourslice",
+                        "contrast",
+                        "conv",
+                        "conv2",
+                        "convertCharsToStrings",
+                        "convertContainedStringsToChars",
+                        "convertStringsToChars",
+                        "convertTo",
+                        "convertvars",
+                        "convexHull",
+                        "convhull",
+                        "convhulln",
+                        "convn",
+                        "cool",
+                        "copper",
+                        "copyHDU",
+                        "copyfile",
+                        "copygraphics",
+                        "copyobj",
+                        "corrcoef",
+                        "cos",
+                        "cosd",
+                        "cosh",
+                        "cospi",
+                        "cot",
+                        "cotd",
+                        "coth",
+                        "count",
+                        "countcats",
+                        "cov",
+                        "cplxpair",
+                        "cputime",
+                        "createCategory",
+                        "createFile",
+                        "createImg",
+                        "createLabel",
+                        "createTbl",
+                        "criticalAlpha",
+                        "cross",
+                        "csc",
+                        "cscd",
+                        "csch",
+                        "ctranspose",
+                        "cummax",
+                        "cummin",
+                        "cumprod",
+                        "cumsum",
+                        "cumtrapz",
+                        "curl",
+                        "currentProject",
+                        "cylinder",
+                        "daspect",
+                        "dataTipInteraction",
+                        "dataTipTextRow",
+                        "datacursormode",
+                        "datastore",
+                        "datatip",
+                        "date",
+                        "datenum",
+                        "dateshift",
+                        "datestr",
+                        "datetick",
+                        "datetime",
+                        "datevec",
+                        "day",
+                        "days",
+                        "dbclear",
+                        "dbcont",
+                        "dbdown",
+                        "dbmex",
+                        "dbquit",
+                        "dbstack",
+                        "dbstatus",
+                        "dbstep",
+                        "dbstop",
+                        "dbtype",
+                        "dbup",
+                        "dde23",
+                        "ddeget",
+                        "ddensd",
+                        "ddesd",
+                        "ddeset",
+                        "deblank",
+                        "dec2base",
+                        "dec2bin",
+                        "dec2hex",
+                        "decic",
+                        "decomposition",
+                        "deconv",
+                        "deg2rad",
+                        "degree",
+                        "del2",
+                        "delaunay",
+                        "delaunayTriangulation",
+                        "delaunayn",
+                        "delete",
+                        "deleteCol",
+                        "deleteFile",
+                        "deleteHDU",
+                        "deleteKey",
+                        "deleteRecord",
+                        "deleteRows",
+                        "delevent",
+                        "delimitedTextImportOptions",
+                        "delsample",
+                        "delsamplefromcollection",
+                        "demo",
+                        "descriptor",
+                        "det",
+                        "details",
+                        "detectImportOptions",
+                        "detrend",
+                        "deval",
+                        "dfsearch",
+                        "diag",
+                        "dialog",
+                        "diary",
+                        "diff",
+                        "diffuse",
+                        "digitBoundary",
+                        "digitsPattern",
+                        "digraph",
+                        "dir",
+                        "disableDefaultInteractivity",
+                        "discretize",
+                        "disp",
+                        "display",
+                        "dissect",
+                        "distances",
+                        "dither",
+                        "divergence",
+                        "dmperm",
+                        "doc",
+                        "docsearch",
+                        "dos",
+                        "dot",
+                        "double",
+                        "drag",
+                        "dragrect",
+                        "drawnow",
+                        "dsearchn",
+                        "duration",
+                        "dynamicprops",
+                        "echo",
+                        "echodemo",
+                        "echotcpip",
+                        "edgeAttachments",
+                        "edgecount",
+                        "edges",
+                        "edit",
+                        "eig",
+                        "eigs",
+                        "ellipj",
+                        "ellipke",
+                        "ellipsoid",
+                        "empty",
+                        "enableDefaultInteractivity",
+                        "enableLegacyExplorationModes",
+                        "enableNETfromNetworkDrive",
+                        "enableservice",
+                        "endsWith",
+                        "enumeration",
+                        "eomday",
+                        "eps",
+                        "eq",
+                        "equilibrate",
+                        "erase",
+                        "eraseBetween",
+                        "erf",
+                        "erfc",
+                        "erfcinv",
+                        "erfcx",
+                        "erfinv",
+                        "error",
+                        "errorbar",
+                        "errordlg",
+                        "etime",
+                        "etree",
+                        "etreeplot",
+                        "eval",
+                        "evalc",
+                        "evalin",
+                        "event.ClassInstanceEvent",
+                        "event.DynamicPropertyEvent",
+                        "event.EventData",
+                        "event.PropertyEvent",
+                        "event.hasListener",
+                        "event.listener",
+                        "event.proplistener",
+                        "eventlisteners",
+                        "events",
+                        "exceltime",
+                        "exist",
+                        "exit",
+                        "exp",
+                        "expand",
+                        "expint",
+                        "expm",
+                        "expm1",
+                        "export",
+                        "export2wsdlg",
+                        "exportapp",
+                        "exportgraphics",
+                        "exportsetupdlg",
+                        "extract",
+                        "extractAfter",
+                        "extractBefore",
+                        "extractBetween",
+                        "eye",
+                        "ezpolar",
+                        "faceNormal",
+                        "factor",
+                        "factorial",
+                        "false",
+                        "fclose",
+                        "fcontour",
+                        "feather",
+                        "featureEdges",
+                        "feof",
+                        "ferror",
+                        "feval",
+                        "fewerbins",
+                        "fft",
+                        "fft2",
+                        "fftn",
+                        "fftshift",
+                        "fftw",
+                        "fgetl",
+                        "fgets",
+                        "fieldnames",
+                        "figure",
+                        "figurepalette",
+                        "fileDatastore",
+                        "fileMode",
+                        "fileName",
+                        "fileattrib",
+                        "filemarker",
+                        "fileparts",
+                        "fileread",
+                        "filesep",
+                        "fill",
+                        "fill3",
+                        "fillmissing",
+                        "filloutliers",
+                        "filter",
+                        "filter2",
+                        "fimplicit",
+                        "fimplicit3",
+                        "find",
+                        "findCategory",
+                        "findEvent",
+                        "findFile",
+                        "findLabel",
+                        "findall",
+                        "findedge",
+                        "findfigs",
+                        "findgroups",
+                        "findnode",
+                        "findobj",
+                        "findprop",
+                        "finish",
+                        "fitsdisp",
+                        "fitsinfo",
+                        "fitsread",
+                        "fitswrite",
+                        "fix",
+                        "fixedWidthImportOptions",
+                        "flag",
+                        "flintmax",
+                        "flip",
+                        "flipedge",
+                        "fliplr",
+                        "flipud",
+                        "floor",
+                        "flow",
+                        "flush",
+                        "fmesh",
+                        "fminbnd",
+                        "fminsearch",
+                        "fopen",
+                        "format",
+                        "fplot",
+                        "fplot3",
+                        "fprintf",
+                        "frame2im",
+                        "fread",
+                        "freeBoundary",
+                        "freqspace",
+                        "frewind",
+                        "fscanf",
+                        "fseek",
+                        "fsurf",
+                        "ftell",
+                        "ftp",
+                        "full",
+                        "fullfile",
+                        "func2str",
+                        "function_handle",
+                        "functions",
+                        "functiontests",
+                        "funm",
+                        "fwrite",
+                        "fzero",
+                        "gallery",
+                        "gamma",
+                        "gammainc",
+                        "gammaincinv",
+                        "gammaln",
+                        "gather",
+                        "gca",
+                        "gcbf",
+                        "gcbo",
+                        "gcd",
+                        "gcf",
+                        "gcmr",
+                        "gco",
+                        "genpath",
+                        "geoaxes",
+                        "geobasemap",
+                        "geobubble",
+                        "geodensityplot",
+                        "geolimits",
+                        "geoplot",
+                        "geoscatter",
+                        "geotickformat",
+                        "get",
+                        "getAColParms",
+                        "getAxes",
+                        "getBColParms",
+                        "getColName",
+                        "getColType",
+                        "getColorbar",
+                        "getConstantValue",
+                        "getEqColType",
+                        "getFileFormats",
+                        "getHDUnum",
+                        "getHDUtype",
+                        "getHdrSpace",
+                        "getImgSize",
+                        "getImgType",
+                        "getLayout",
+                        "getLegend",
+                        "getMockHistory",
+                        "getNumCols",
+                        "getNumHDUs",
+                        "getNumInputs",
+                        "getNumInputsImpl",
+                        "getNumOutputs",
+                        "getNumOutputsImpl",
+                        "getNumRows",
+                        "getOpenFiles",
+                        "getProfiles",
+                        "getPropertyGroupsImpl",
+                        "getReport",
+                        "getTimeStr",
+                        "getVersion",
+                        "getabstime",
+                        "getappdata",
+                        "getaudiodata",
+                        "getdatasamples",
+                        "getdatasamplesize",
+                        "getenv",
+                        "getfield",
+                        "getframe",
+                        "getinterpmethod",
+                        "getnext",
+                        "getpinstatus",
+                        "getpixelposition",
+                        "getplayer",
+                        "getpoints",
+                        "getpref",
+                        "getqualitydesc",
+                        "getrangefromclass",
+                        "getsamples",
+                        "getsampleusingtime",
+                        "gettimeseriesnames",
+                        "gettsafteratevent",
+                        "gettsafterevent",
+                        "gettsatevent",
+                        "gettsbeforeatevent",
+                        "gettsbeforeevent",
+                        "gettsbetweenevents",
+                        "getvaropts",
+                        "ginput",
+                        "gmres",
+                        "gobjects",
+                        "gplot",
+                        "grabcode",
+                        "gradient",
+                        "graph",
+                        "gray",
+                        "grid",
+                        "griddata",
+                        "griddatan",
+                        "griddedInterpolant",
+                        "groot",
+                        "groupcounts",
+                        "groupfilter",
+                        "groupsummary",
+                        "grouptransform",
+                        "gsvd",
+                        "gtext",
+                        "guidata",
+                        "guide",
+                        "guihandles",
+                        "gunzip",
+                        "gzip",
+                        "h5create",
+                        "h5disp",
+                        "h5info",
+                        "h5read",
+                        "h5readatt",
+                        "h5write",
+                        "h5writeatt",
+                        "hadamard",
+                        "handle",
+                        "hankel",
+                        "hasFactoryValue",
+                        "hasFrame",
+                        "hasGroup",
+                        "hasPersonalValue",
+                        "hasSetting",
+                        "hasTemporaryValue",
+                        "hasdata",
+                        "hasnext",
+                        "hdfan",
+                        "hdfdf24",
+                        "hdfdfr8",
+                        "hdfh",
+                        "hdfhd",
+                        "hdfhe",
+                        "hdfhx",
+                        "hdfinfo",
+                        "hdfml",
+                        "hdfpt",
+                        "hdfread",
+                        "hdfv",
+                        "hdfvf",
+                        "hdfvh",
+                        "hdfvs",
+                        "head",
+                        "heatmap",
+                        "height",
+                        "help",
+                        "helpdlg",
+                        "hess",
+                        "hex2dec",
+                        "hex2num",
+                        "hgexport",
+                        "hggroup",
+                        "hgtransform",
+                        "hidden",
+                        "highlight",
+                        "hilb",
+                        "histcounts",
+                        "histcounts2",
+                        "histogram",
+                        "histogram2",
+                        "hms",
+                        "hold",
+                        "holes",
+                        "home",
+                        "horzcat",
+                        "hot",
+                        "hour",
+                        "hours",
+                        "hover",
+                        "hsv",
+                        "hsv2rgb",
+                        "hypot",
+                        "i",
+                        "ichol",
+                        "idealfilter",
+                        "idivide",
+                        "ifft",
+                        "ifft2",
+                        "ifftn",
+                        "ifftshift",
+                        "ilu",
+                        "im2double",
+                        "im2frame",
+                        "im2gray",
+                        "im2java",
+                        "imag",
+                        "image",
+                        "imageDatastore",
+                        "imagesc",
+                        "imapprox",
+                        "imfinfo",
+                        "imformats",
+                        "imgCompress",
+                        "import",
+                        "importdata",
+                        "imread",
+                        "imresize",
+                        "imshow",
+                        "imtile",
+                        "imwrite",
+                        "inShape",
+                        "incenter",
+                        "incidence",
+                        "ind2rgb",
+                        "ind2sub",
+                        "indegree",
+                        "inedges",
+                        "infoImpl",
+                        "inmem",
+                        "inner2outer",
+                        "innerjoin",
+                        "inpolygon",
+                        "input",
+                        "inputParser",
+                        "inputdlg",
+                        "inputname",
+                        "insertATbl",
+                        "insertAfter",
+                        "insertBTbl",
+                        "insertBefore",
+                        "insertCol",
+                        "insertImg",
+                        "insertRows",
+                        "int16",
+                        "int2str",
+                        "int32",
+                        "int64",
+                        "int8",
+                        "integral",
+                        "integral2",
+                        "integral3",
+                        "interp1",
+                        "interp2",
+                        "interp3",
+                        "interpft",
+                        "interpn",
+                        "interpstreamspeed",
+                        "intersect",
+                        "intmax",
+                        "intmin",
+                        "inv",
+                        "invhilb",
+                        "ipermute",
+                        "iqr",
+                        "isCompressedImg",
+                        "isConnected",
+                        "isDiscreteStateSpecificationMutableImpl",
+                        "isDone",
+                        "isDoneImpl",
+                        "isInactivePropertyImpl",
+                        "isInputComplexityMutableImpl",
+                        "isInputDataTypeMutableImpl",
+                        "isInputSizeMutableImpl",
+                        "isInterior",
+                        "isKey",
+                        "isLoaded",
+                        "isLocked",
+                        "isMATLABReleaseOlderThan",
+                        "isPartitionable",
+                        "isShuffleable",
+                        "isStringScalar",
+                        "isTunablePropertyDataTypeMutableImpl",
+                        "isUnderlyingType",
+                        "isa",
+                        "isaUnderlying",
+                        "isappdata",
+                        "isbanded",
+                        "isbetween",
+                        "iscalendarduration",
+                        "iscategorical",
+                        "iscategory",
+                        "iscell",
+                        "iscellstr",
+                        "ischange",
+                        "ischar",
+                        "iscolumn",
+                        "iscom",
+                        "isdag",
+                        "isdatetime",
+                        "isdiag",
+                        "isdst",
+                        "isduration",
+                        "isempty",
+                        "isenum",
+                        "isequal",
+                        "isequaln",
+                        "isevent",
+                        "isfield",
+                        "isfile",
+                        "isfinite",
+                        "isfloat",
+                        "isfolder",
+                        "isgraphics",
+                        "ishandle",
+                        "ishermitian",
+                        "ishold",
+                        "ishole",
+                        "isinf",
+                        "isinteger",
+                        "isinterface",
+                        "isinterior",
+                        "isisomorphic",
+                        "isjava",
+                        "iskeyword",
+                        "isletter",
+                        "islocalmax",
+                        "islocalmin",
+                        "islogical",
+                        "ismac",
+                        "ismatrix",
+                        "ismember",
+                        "ismembertol",
+                        "ismethod",
+                        "ismissing",
+                        "ismultigraph",
+                        "isnan",
+                        "isnat",
+                        "isnumeric",
+                        "isobject",
+                        "isocaps",
+                        "isocolors",
+                        "isomorphism",
+                        "isonormals",
+                        "isordinal",
+                        "isosurface",
+                        "isoutlier",
+                        "ispc",
+                        "isplaying",
+                        "ispref",
+                        "isprime",
+                        "isprop",
+                        "isprotected",
+                        "isreal",
+                        "isrecording",
+                        "isregular",
+                        "isrow",
+                        "isscalar",
+                        "issimplified",
+                        "issorted",
+                        "issortedrows",
+                        "isspace",
+                        "issparse",
+                        "isstring",
+                        "isstrprop",
+                        "isstruct",
+                        "isstudent",
+                        "issymmetric",
+                        "istable",
+                        "istall",
+                        "istimetable",
+                        "istril",
+                        "istriu",
+                        "isundefined",
+                        "isunix",
+                        "isvalid",
+                        "isvarname",
+                        "isvector",
+                        "isweekend",
+                        "j",
+                        "javaArray",
+                        "javaMethod",
+                        "javaMethodEDT",
+                        "javaObject",
+                        "javaObjectEDT",
+                        "javaaddpath",
+                        "javachk",
+                        "javaclasspath",
+                        "javarmpath",
+                        "jet",
+                        "join",
+                        "jsondecode",
+                        "jsonencode",
+                        "juliandate",
+                        "keyboard",
+                        "keys",
+                        "kron",
+                        "labeledge",
+                        "labelnode",
+                        "lag",
+                        "laplacian",
+                        "lastwarn",
+                        "layout",
+                        "lcm",
+                        "ldl",
+                        "leapseconds",
+                        "legend",
+                        "legendre",
+                        "length",
+                        "letterBoundary",
+                        "lettersPattern",
+                        "lib.pointer",
+                        "libfunctions",
+                        "libfunctionsview",
+                        "libisloaded",
+                        "libpointer",
+                        "libstruct",
+                        "license",
+                        "light",
+                        "lightangle",
+                        "lighting",
+                        "lin2mu",
+                        "line",
+                        "lineBoundary",
+                        "lines",
+                        "linkaxes",
+                        "linkdata",
+                        "linkprop",
+                        "linsolve",
+                        "linspace",
+                        "listModifiedFiles",
+                        "listRequiredFiles",
+                        "listdlg",
+                        "listener",
+                        "listfonts",
+                        "load",
+                        "loadObjectImpl",
+                        "loadlibrary",
+                        "loadobj",
+                        "localfunctions",
+                        "log",
+                        "log10",
+                        "log1p",
+                        "log2",
+                        "logical",
+                        "loglog",
+                        "logm",
+                        "logspace",
+                        "lookAheadBoundary",
+                        "lookBehindBoundary",
+                        "lookfor",
+                        "lower",
+                        "ls",
+                        "lscov",
+                        "lsqminnorm",
+                        "lsqnonneg",
+                        "lsqr",
+                        "lu",
+                        "magic",
+                        "makehgtform",
+                        "makima",
+                        "mapreduce",
+                        "mapreducer",
+                        "maskedPattern",
+                        "mat2cell",
+                        "mat2str",
+                        "matches",
+                        "matchpairs",
+                        "material",
+                        "matfile",
+                        "matlab.System",
+                        "matlab.addons.disableAddon",
+                        "matlab.addons.enableAddon",
+                        "matlab.addons.install",
+                        "matlab.addons.installedAddons",
+                        "matlab.addons.isAddonEnabled",
+                        "matlab.addons.toolbox.installToolbox",
+                        "matlab.addons.toolbox.installedToolboxes",
+                        "matlab.addons.toolbox.packageToolbox",
+                        "matlab.addons.toolbox.toolboxVersion",
+                        "matlab.addons.toolbox.uninstallToolbox",
+                        "matlab.addons.uninstall",
+                        "matlab.apputil.create",
+                        "matlab.apputil.getInstalledAppInfo",
+                        "matlab.apputil.install",
+                        "matlab.apputil.package",
+                        "matlab.apputil.run",
+                        "matlab.apputil.uninstall",
+                        "matlab.codetools.requiredFilesAndProducts",
+                        "matlab.engine.FutureResult",
+                        "matlab.engine.MatlabEngine",
+                        "matlab.engine.connect_matlab",
+                        "matlab.engine.engineName",
+                        "matlab.engine.find_matlab",
+                        "matlab.engine.isEngineShared",
+                        "matlab.engine.shareEngine",
+                        "matlab.engine.start_matlab",
+                        "matlab.exception.JavaException",
+                        "matlab.exception.PyException",
+                        "matlab.graphics.chartcontainer.ChartContainer",
+                        "matlab.graphics.chartcontainer.mixin.Colorbar",
+                        "matlab.graphics.chartcontainer.mixin.Legend",
+                        "matlab.io.Datastore",
+                        "matlab.io.datastore.BlockedFileSet",
+                        "matlab.io.datastore.DsFileReader",
+                        "matlab.io.datastore.DsFileSet",
+                        "matlab.io.datastore.FileSet",
+                        "matlab.io.datastore.FileWritable",
+                        "matlab.io.datastore.FoldersPropertyProvider",
+                        "matlab.io.datastore.HadoopLocationBased",
+                        "matlab.io.datastore.Partitionable",
+                        "matlab.io.datastore.Shuffleable",
+                        "matlab.io.hdf4.sd",
+                        "matlab.io.hdfeos.gd",
+                        "matlab.io.hdfeos.sw",
+                        "matlab.io.saveVariablesToScript",
+                        "matlab.lang.OnOffSwitchState",
+                        "matlab.lang.correction.AppendArgumentsCorrection",
+                        "matlab.lang.correction.ConvertToFunctionNotationCorrection",
+                        "matlab.lang.correction.ReplaceIdentifierCorrection",
+                        "matlab.lang.makeUniqueStrings",
+                        "matlab.lang.makeValidName",
+                        "matlab.mex.MexHost",
+                        "matlab.mixin.Copyable",
+                        "matlab.mixin.CustomDisplay",
+                        "matlab.mixin.Heterogeneous",
+                        "matlab.mixin.SetGet",
+                        "matlab.mixin.SetGetExactNames",
+                        "matlab.mixin.util.PropertyGroup",
+                        "matlab.mock.AnyArguments",
+                        "matlab.mock.InteractionHistory",
+                        "matlab.mock.InteractionHistory.forMock",
+                        "matlab.mock.MethodCallBehavior",
+                        "matlab.mock.PropertyBehavior",
+                        "matlab.mock.PropertyGetBehavior",
+                        "matlab.mock.PropertySetBehavior",
+                        "matlab.mock.TestCase",
+                        "matlab.mock.actions.AssignOutputs",
+                        "matlab.mock.actions.DoNothing",
+                        "matlab.mock.actions.Invoke",
+                        "matlab.mock.actions.ReturnStoredValue",
+                        "matlab.mock.actions.StoreValue",
+                        "matlab.mock.actions.ThrowException",
+                        "matlab.mock.constraints.Occurred",
+                        "matlab.mock.constraints.WasAccessed",
+                        "matlab.mock.constraints.WasCalled",
+                        "matlab.mock.constraints.WasSet",
+                        "matlab.net.ArrayFormat",
+                        "matlab.net.QueryParameter",
+                        "matlab.net.URI",
+                        "matlab.net.base64decode",
+                        "matlab.net.base64encode",
+                        "matlab.net.http.AuthInfo",
+                        "matlab.net.http.AuthenticationScheme",
+                        "matlab.net.http.Cookie",
+                        "matlab.net.http.CookieInfo",
+                        "matlab.net.http.Credentials",
+                        "matlab.net.http.Disposition",
+                        "matlab.net.http.HTTPException",
+                        "matlab.net.http.HTTPOptions",
+                        "matlab.net.http.HeaderField",
+                        "matlab.net.http.LogRecord",
+                        "matlab.net.http.MediaType",
+                        "matlab.net.http.Message",
+                        "matlab.net.http.MessageBody",
+                        "matlab.net.http.MessageType",
+                        "matlab.net.http.ProgressMonitor",
+                        "matlab.net.http.ProtocolVersion",
+                        "matlab.net.http.RequestLine",
+                        "matlab.net.http.RequestMessage",
+                        "matlab.net.http.RequestMethod",
+                        "matlab.net.http.ResponseMessage",
+                        "matlab.net.http.StartLine",
+                        "matlab.net.http.StatusClass",
+                        "matlab.net.http.StatusCode",
+                        "matlab.net.http.StatusLine",
+                        "matlab.net.http.field.AcceptField",
+                        "matlab.net.http.field.AuthenticateField",
+                        "matlab.net.http.field.AuthenticationInfoField",
+                        "matlab.net.http.field.AuthorizationField",
+                        "matlab.net.http.field.ContentDispositionField",
+                        "matlab.net.http.field.ContentLengthField",
+                        "matlab.net.http.field.ContentLocationField",
+                        "matlab.net.http.field.ContentTypeField",
+                        "matlab.net.http.field.CookieField",
+                        "matlab.net.http.field.DateField",
+                        "matlab.net.http.field.GenericField",
+                        "matlab.net.http.field.GenericParameterizedField",
+                        "matlab.net.http.field.HTTPDateField",
+                        "matlab.net.http.field.IntegerField",
+                        "matlab.net.http.field.LocationField",
+                        "matlab.net.http.field.MediaRangeField",
+                        "matlab.net.http.field.SetCookieField",
+                        "matlab.net.http.field.URIReferenceField",
+                        "matlab.net.http.io.BinaryConsumer",
+                        "matlab.net.http.io.ContentConsumer",
+                        "matlab.net.http.io.ContentProvider",
+                        "matlab.net.http.io.FileConsumer",
+                        "matlab.net.http.io.FileProvider",
+                        "matlab.net.http.io.FormProvider",
+                        "matlab.net.http.io.GenericConsumer",
+                        "matlab.net.http.io.GenericProvider",
+                        "matlab.net.http.io.ImageConsumer",
+                        "matlab.net.http.io.ImageProvider",
+                        "matlab.net.http.io.JSONConsumer",
+                        "matlab.net.http.io.JSONProvider",
+                        "matlab.net.http.io.MultipartConsumer",
+                        "matlab.net.http.io.MultipartFormProvider",
+                        "matlab.net.http.io.MultipartProvider",
+                        "matlab.net.http.io.StringConsumer",
+                        "matlab.net.http.io.StringProvider",
+                        "matlab.perftest.FixedTimeExperiment",
+                        "matlab.perftest.FrequentistTimeExperiment",
+                        "matlab.perftest.TestCase",
+                        "matlab.perftest.TimeExperiment",
+                        "matlab.perftest.TimeResult",
+                        "matlab.project.Project",
+                        "matlab.project.convertDefinitionFiles",
+                        "matlab.project.createProject",
+                        "matlab.project.deleteProject",
+                        "matlab.project.loadProject",
+                        "matlab.project.rootProject",
+                        "matlab.settings.FactoryGroup.createToolboxGroup",
+                        "matlab.settings.SettingsFileUpgrader",
+                        "matlab.settings.loadSettingsCompatibilityResults",
+                        "matlab.settings.mustBeIntegerScalar",
+                        "matlab.settings.mustBeLogicalScalar",
+                        "matlab.settings.mustBeNumericScalar",
+                        "matlab.settings.mustBeStringScalar",
+                        "matlab.settings.reloadFactoryFile",
+                        "matlab.system.mixin.FiniteSource",
+                        "matlab.tall.blockMovingWindow",
+                        "matlab.tall.movingWindow",
+                        "matlab.tall.reduce",
+                        "matlab.tall.transform",
+                        "matlab.test.behavior.Missing",
+                        "matlab.ui.componentcontainer.ComponentContainer",
+                        "matlab.uitest.TestCase",
+                        "matlab.uitest.TestCase.forInteractiveUse",
+                        "matlab.uitest.unlock",
+                        "matlab.unittest.Test",
+                        "matlab.unittest.TestCase",
+                        "matlab.unittest.TestResult",
+                        "matlab.unittest.TestRunner",
+                        "matlab.unittest.TestSuite",
+                        "matlab.unittest.constraints.BooleanConstraint",
+                        "matlab.unittest.constraints.Constraint",
+                        "matlab.unittest.constraints.Tolerance",
+                        "matlab.unittest.diagnostics.ConstraintDiagnostic",
+                        "matlab.unittest.diagnostics.Diagnostic",
+                        "matlab.unittest.fixtures.Fixture",
+                        "matlab.unittest.measurement.DefaultMeasurementResult",
+                        "matlab.unittest.measurement.MeasurementResult",
+                        "matlab.unittest.measurement.chart.ComparisonPlot",
+                        "matlab.unittest.plugins.OutputStream",
+                        "matlab.unittest.plugins.Parallelizable",
+                        "matlab.unittest.plugins.QualifyingPlugin",
+                        "matlab.unittest.plugins.TestRunnerPlugin",
+                        "matlab.wsdl.createWSDLClient",
+                        "matlab.wsdl.setWSDLToolPath",
+                        "matlabRelease",
+                        "matlabrc",
+                        "matlabroot",
+                        "max",
+                        "maxflow",
+                        "maxk",
+                        "mean",
+                        "median",
+                        "memmapfile",
+                        "memoize",
+                        "memory",
+                        "mergecats",
+                        "mergevars",
+                        "mesh",
+                        "meshc",
+                        "meshgrid",
+                        "meshz",
+                        "meta.ArrayDimension",
+                        "meta.DynamicProperty",
+                        "meta.EnumeratedValue",
+                        "meta.FixedDimension",
+                        "meta.MetaData",
+                        "meta.UnrestrictedDimension",
+                        "meta.Validation",
+                        "meta.abstractDetails",
+                        "meta.class",
+                        "meta.class.fromName",
+                        "meta.event",
+                        "meta.method",
+                        "meta.package",
+                        "meta.package.fromName",
+                        "meta.package.getAllPackages",
+                        "meta.property",
+                        "metaclass",
+                        "methods",
+                        "methodsview",
+                        "mex",
+                        "mexext",
+                        "mexhost",
+                        "mfilename",
+                        "mget",
+                        "milliseconds",
+                        "min",
+                        "mink",
+                        "minres",
+                        "minspantree",
+                        "minute",
+                        "minutes",
+                        "mislocked",
+                        "missing",
+                        "mkdir",
+                        "mkpp",
+                        "mldivide",
+                        "mlintrpt",
+                        "mlock",
+                        "mmfileinfo",
+                        "mod",
+                        "mode",
+                        "month",
+                        "more",
+                        "morebins",
+                        "movAbsHDU",
+                        "movNamHDU",
+                        "movRelHDU",
+                        "move",
+                        "movefile",
+                        "movegui",
+                        "movevars",
+                        "movie",
+                        "movmad",
+                        "movmax",
+                        "movmean",
+                        "movmedian",
+                        "movmin",
+                        "movprod",
+                        "movstd",
+                        "movsum",
+                        "movvar",
+                        "mpower",
+                        "mput",
+                        "mrdivide",
+                        "msgbox",
+                        "mtimes",
+                        "mu2lin",
+                        "multibandread",
+                        "multibandwrite",
+                        "munlock",
+                        "mustBeA",
+                        "mustBeFile",
+                        "mustBeFinite",
+                        "mustBeFloat",
+                        "mustBeFolder",
+                        "mustBeGreaterThan",
+                        "mustBeGreaterThanOrEqual",
+                        "mustBeInRange",
+                        "mustBeInteger",
+                        "mustBeLessThan",
+                        "mustBeLessThanOrEqual",
+                        "mustBeMember",
+                        "mustBeNegative",
+                        "mustBeNonNan",
+                        "mustBeNonempty",
+                        "mustBeNonmissing",
+                        "mustBeNonnegative",
+                        "mustBeNonpositive",
+                        "mustBeNonsparse",
+                        "mustBeNonzero",
+                        "mustBeNonzeroLengthText",
+                        "mustBeNumeric",
+                        "mustBeNumericOrLogical",
+                        "mustBePositive",
+                        "mustBeReal",
+                        "mustBeScalarOrEmpty",
+                        "mustBeText",
+                        "mustBeTextScalar",
+                        "mustBeUnderlyingType",
+                        "mustBeValidVariableName",
+                        "mustBeVector",
+                        "namedPattern",
+                        "namedargs2cell",
+                        "namelengthmax",
+                        "nargin",
+                        "narginchk",
+                        "nargout",
+                        "nargoutchk",
+                        "native2unicode",
+                        "nccreate",
+                        "ncdisp",
+                        "nchoosek",
+                        "ncinfo",
+                        "ncread",
+                        "ncreadatt",
+                        "ncwrite",
+                        "ncwriteatt",
+                        "ncwriteschema",
+                        "ndgrid",
+                        "ndims",
+                        "nearest",
+                        "nearestNeighbor",
+                        "nearestvertex",
+                        "neighbors",
+                        "netcdf.abort",
+                        "netcdf.close",
+                        "netcdf.copyAtt",
+                        "netcdf.create",
+                        "netcdf.defDim",
+                        "netcdf.defGrp",
+                        "netcdf.defVar",
+                        "netcdf.defVarChunking",
+                        "netcdf.defVarDeflate",
+                        "netcdf.defVarFill",
+                        "netcdf.defVarFletcher32",
+                        "netcdf.delAtt",
+                        "netcdf.endDef",
+                        "netcdf.getAtt",
+                        "netcdf.getChunkCache",
+                        "netcdf.getConstant",
+                        "netcdf.getConstantNames",
+                        "netcdf.getVar",
+                        "netcdf.inq",
+                        "netcdf.inqAtt",
+                        "netcdf.inqAttID",
+                        "netcdf.inqAttName",
+                        "netcdf.inqDim",
+                        "netcdf.inqDimID",
+                        "netcdf.inqDimIDs",
+                        "netcdf.inqFormat",
+                        "netcdf.inqGrpName",
+                        "netcdf.inqGrpNameFull",
+                        "netcdf.inqGrpParent",
+                        "netcdf.inqGrps",
+                        "netcdf.inqLibVers",
+                        "netcdf.inqNcid",
+                        "netcdf.inqUnlimDims",
+                        "netcdf.inqVar",
+                        "netcdf.inqVarChunking",
+                        "netcdf.inqVarDeflate",
+                        "netcdf.inqVarFill",
+                        "netcdf.inqVarFletcher32",
+                        "netcdf.inqVarID",
+                        "netcdf.inqVarIDs",
+                        "netcdf.open",
+                        "netcdf.putAtt",
+                        "netcdf.putVar",
+                        "netcdf.reDef",
+                        "netcdf.renameAtt",
+                        "netcdf.renameDim",
+                        "netcdf.renameVar",
+                        "netcdf.setChunkCache",
+                        "netcdf.setDefaultFormat",
+                        "netcdf.setFill",
+                        "netcdf.sync",
+                        "newline",
+                        "newplot",
+                        "nextpow2",
+                        "nexttile",
+                        "nnz",
+                        "nonzeros",
+                        "norm",
+                        "normalize",
+                        "normest",
+                        "notify",
+                        "now",
+                        "nsidedpoly",
+                        "nthroot",
+                        "nufft",
+                        "nufftn",
+                        "null",
+                        "num2cell",
+                        "num2hex",
+                        "num2ruler",
+                        "num2str",
+                        "numArgumentsFromSubscript",
+                        "numRegions",
+                        "numboundaries",
+                        "numedges",
+                        "numel",
+                        "numnodes",
+                        "numpartitions",
+                        "numsides",
+                        "nzmax",
+                        "ode113",
+                        "ode15i",
+                        "ode15s",
+                        "ode23",
+                        "ode23s",
+                        "ode23t",
+                        "ode23tb",
+                        "ode45",
+                        "odeget",
+                        "odeset",
+                        "odextend",
+                        "onCleanup",
+                        "ones",
+                        "open",
+                        "openDiskFile",
+                        "openFile",
+                        "openProject",
+                        "openfig",
+                        "opengl",
+                        "openvar",
+                        "optimget",
+                        "optimset",
+                        "optionalPattern",
+                        "ordeig",
+                        "orderfields",
+                        "ordqz",
+                        "ordschur",
+                        "orient",
+                        "orth",
+                        "outdegree",
+                        "outedges",
+                        "outerjoin",
+                        "overlaps",
+                        "overlapsrange",
+                        "pack",
+                        "pad",
+                        "padecoef",
+                        "pagectranspose",
+                        "pagemtimes",
+                        "pagetranspose",
+                        "pan",
+                        "panInteraction",
+                        "parallelplot",
+                        "pareto",
+                        "parquetDatastore",
+                        "parquetinfo",
+                        "parquetread",
+                        "parquetwrite",
+                        "partition",
+                        "parula",
+                        "pascal",
+                        "patch",
+                        "path",
+                        "pathsep",
+                        "pathtool",
+                        "pattern",
+                        "pause",
+                        "pbaspect",
+                        "pcg",
+                        "pchip",
+                        "pcode",
+                        "pcolor",
+                        "pdepe",
+                        "pdeval",
+                        "peaks",
+                        "perimeter",
+                        "perl",
+                        "perms",
+                        "permute",
+                        "pi",
+                        "pie",
+                        "pie3",
+                        "pink",
+                        "pinv",
+                        "planerot",
+                        "play",
+                        "playblocking",
+                        "plot",
+                        "plot3",
+                        "plotbrowser",
+                        "plotedit",
+                        "plotmatrix",
+                        "plottools",
+                        "plus",
+                        "pointLocation",
+                        "pol2cart",
+                        "polaraxes",
+                        "polarbubblechart",
+                        "polarhistogram",
+                        "polarplot",
+                        "polarscatter",
+                        "poly",
+                        "polyarea",
+                        "polybuffer",
+                        "polyder",
+                        "polyeig",
+                        "polyfit",
+                        "polyint",
+                        "polyshape",
+                        "polyval",
+                        "polyvalm",
+                        "posixtime",
+                        "possessivePattern",
+                        "pow2",
+                        "ppval",
+                        "predecessors",
+                        "prefdir",
+                        "preferences",
+                        "press",
+                        "preview",
+                        "primes",
+                        "print",
+                        "printdlg",
+                        "printopt",
+                        "printpreview",
+                        "prism",
+                        "processInputSpecificationChangeImpl",
+                        "processTunedPropertiesImpl",
+                        "prod",
+                        "profile",
+                        "propedit",
+                        "properties",
+                        "propertyeditor",
+                        "psi",
+                        "publish",
+                        "pwd",
+                        "pyargs",
+                        "pyenv",
+                        "qmr",
+                        "qr",
+                        "qrdelete",
+                        "qrinsert",
+                        "qrupdate",
+                        "quad2d",
+                        "quadgk",
+                        "quarter",
+                        "questdlg",
+                        "quit",
+                        "quiver",
+                        "quiver3",
+                        "qz",
+                        "rad2deg",
+                        "rand",
+                        "randi",
+                        "randn",
+                        "randperm",
+                        "rank",
+                        "rat",
+                        "rats",
+                        "rbbox",
+                        "rcond",
+                        "read",
+                        "readATblHdr",
+                        "readBTblHdr",
+                        "readCard",
+                        "readCol",
+                        "readFrame",
+                        "readImg",
+                        "readKey",
+                        "readKeyCmplx",
+                        "readKeyDbl",
+                        "readKeyLongLong",
+                        "readKeyLongStr",
+                        "readKeyUnit",
+                        "readRecord",
+                        "readall",
+                        "readcell",
+                        "readline",
+                        "readlines",
+                        "readmatrix",
+                        "readstruct",
+                        "readtable",
+                        "readtimetable",
+                        "readvars",
+                        "real",
+                        "reallog",
+                        "realmax",
+                        "realmin",
+                        "realpow",
+                        "realsqrt",
+                        "record",
+                        "recordblocking",
+                        "rectangle",
+                        "rectint",
+                        "recycle",
+                        "reducepatch",
+                        "reducevolume",
+                        "refresh",
+                        "refreshSourceControl",
+                        "refreshdata",
+                        "regexp",
+                        "regexpPattern",
+                        "regexpi",
+                        "regexprep",
+                        "regexptranslate",
+                        "regionZoomInteraction",
+                        "regions",
+                        "registerevent",
+                        "regmatlabserver",
+                        "rehash",
+                        "relationaloperators",
+                        "release",
+                        "releaseImpl",
+                        "reload",
+                        "rem",
+                        "remove",
+                        "removeCategory",
+                        "removeFile",
+                        "removeGroup",
+                        "removeLabel",
+                        "removePath",
+                        "removeReference",
+                        "removeSetting",
+                        "removeShortcut",
+                        "removeShutdownFile",
+                        "removeStartupFile",
+                        "removeStyle",
+                        "removeToolbarExplorationButtons",
+                        "removecats",
+                        "removets",
+                        "removevars",
+                        "rename",
+                        "renamecats",
+                        "renamevars",
+                        "rendererinfo",
+                        "reordercats",
+                        "reordernodes",
+                        "repelem",
+                        "replace",
+                        "replaceBetween",
+                        "repmat",
+                        "resample",
+                        "rescale",
+                        "reset",
+                        "resetImpl",
+                        "reshape",
+                        "residue",
+                        "restoredefaultpath",
+                        "resume",
+                        "rethrow",
+                        "retime",
+                        "reverse",
+                        "rgb2gray",
+                        "rgb2hsv",
+                        "rgb2ind",
+                        "rgbplot",
+                        "ribbon",
+                        "rlim",
+                        "rmappdata",
+                        "rmboundary",
+                        "rmdir",
+                        "rmedge",
+                        "rmfield",
+                        "rmholes",
+                        "rmmissing",
+                        "rmnode",
+                        "rmoutliers",
+                        "rmpath",
+                        "rmpref",
+                        "rmprop",
+                        "rmslivers",
+                        "rng",
+                        "roots",
+                        "rosser",
+                        "rot90",
+                        "rotate",
+                        "rotate3d",
+                        "rotateInteraction",
+                        "round",
+                        "rowfun",
+                        "rows2vars",
+                        "rref",
+                        "rsf2csf",
+                        "rtickangle",
+                        "rtickformat",
+                        "rticklabels",
+                        "rticks",
+                        "ruler2num",
+                        "rulerPanInteraction",
+                        "run",
+                        "runChecks",
+                        "runperf",
+                        "runtests",
+                        "save",
+                        "saveObjectImpl",
+                        "saveas",
+                        "savefig",
+                        "saveobj",
+                        "savepath",
+                        "scale",
+                        "scatter",
+                        "scatter3",
+                        "scatteredInterpolant",
+                        "scatterhistogram",
+                        "schur",
+                        "scroll",
+                        "sec",
+                        "secd",
+                        "sech",
+                        "second",
+                        "seconds",
+                        "semilogx",
+                        "semilogy",
+                        "sendmail",
+                        "serialport",
+                        "serialportlist",
+                        "set",
+                        "setBscale",
+                        "setCompressionType",
+                        "setDTR",
+                        "setHCompScale",
+                        "setHCompSmooth",
+                        "setProperties",
+                        "setRTS",
+                        "setTileDim",
+                        "setTscale",
+                        "setabstime",
+                        "setappdata",
+                        "setcats",
+                        "setdiff",
+                        "setenv",
+                        "setfield",
+                        "setinterpmethod",
+                        "setpixelposition",
+                        "setpref",
+                        "settimeseriesnames",
+                        "settings",
+                        "setuniformtime",
+                        "setup",
+                        "setupImpl",
+                        "setvaropts",
+                        "setvartype",
+                        "setxor",
+                        "sgtitle",
+                        "shading",
+                        "sheetnames",
+                        "shg",
+                        "shiftdim",
+                        "shortestpath",
+                        "shortestpathtree",
+                        "showplottool",
+                        "shrinkfaces",
+                        "shuffle",
+                        "sign",
+                        "simplify",
+                        "sin",
+                        "sind",
+                        "single",
+                        "sinh",
+                        "sinpi",
+                        "size",
+                        "slice",
+                        "smooth3",
+                        "smoothdata",
+                        "snapnow",
+                        "sort",
+                        "sortboundaries",
+                        "sortregions",
+                        "sortrows",
+                        "sortx",
+                        "sorty",
+                        "sound",
+                        "soundsc",
+                        "spalloc",
+                        "sparse",
+                        "spaugment",
+                        "spconvert",
+                        "spdiags",
+                        "specular",
+                        "speye",
+                        "spfun",
+                        "sph2cart",
+                        "sphere",
+                        "spinmap",
+                        "spline",
+                        "split",
+                        "splitapply",
+                        "splitlines",
+                        "splitvars",
+                        "spones",
+                        "spparms",
+                        "sprand",
+                        "sprandn",
+                        "sprandsym",
+                        "sprank",
+                        "spreadsheetDatastore",
+                        "spreadsheetImportOptions",
+                        "spring",
+                        "sprintf",
+                        "spy",
+                        "sqrt",
+                        "sqrtm",
+                        "squeeze",
+                        "ss2tf",
+                        "sscanf",
+                        "stack",
+                        "stackedplot",
+                        "stairs",
+                        "standardizeMissing",
+                        "start",
+                        "startat",
+                        "startsWith",
+                        "startup",
+                        "std",
+                        "stem",
+                        "stem3",
+                        "step",
+                        "stepImpl",
+                        "stlread",
+                        "stlwrite",
+                        "stop",
+                        "str2double",
+                        "str2func",
+                        "str2num",
+                        "strcat",
+                        "strcmp",
+                        "strcmpi",
+                        "stream2",
+                        "stream3",
+                        "streamline",
+                        "streamparticles",
+                        "streamribbon",
+                        "streamslice",
+                        "streamtube",
+                        "strfind",
+                        "string",
+                        "strings",
+                        "strip",
+                        "strjoin",
+                        "strjust",
+                        "strlength",
+                        "strncmp",
+                        "strncmpi",
+                        "strrep",
+                        "strsplit",
+                        "strtok",
+                        "strtrim",
+                        "struct",
+                        "struct2cell",
+                        "struct2table",
+                        "structfun",
+                        "sub2ind",
+                        "subgraph",
+                        "subplot",
+                        "subsasgn",
+                        "subscribe",
+                        "subsindex",
+                        "subspace",
+                        "subsref",
+                        "substruct",
+                        "subtitle",
+                        "subtract",
+                        "subvolume",
+                        "successors",
+                        "sum",
+                        "summary",
+                        "summer",
+                        "superclasses",
+                        "surf",
+                        "surf2patch",
+                        "surface",
+                        "surfaceArea",
+                        "surfc",
+                        "surfl",
+                        "surfnorm",
+                        "svd",
+                        "svds",
+                        "svdsketch",
+                        "swapbytes",
+                        "swarmchart",
+                        "swarmchart3",
+                        "sylvester",
+                        "symamd",
+                        "symbfact",
+                        "symmlq",
+                        "symrcm",
+                        "synchronize",
+                        "sysobjupdate",
+                        "system",
+                        "table",
+                        "table2array",
+                        "table2cell",
+                        "table2struct",
+                        "table2timetable",
+                        "tabularTextDatastore",
+                        "tail",
+                        "tall",
+                        "tallrng",
+                        "tan",
+                        "tand",
+                        "tanh",
+                        "tar",
+                        "tcpclient",
+                        "tempdir",
+                        "tempname",
+                        "testsuite",
+                        "tetramesh",
+                        "texlabel",
+                        "text",
+                        "textBoundary",
+                        "textscan",
+                        "textwrap",
+                        "tfqmr",
+                        "thetalim",
+                        "thetatickformat",
+                        "thetaticklabels",
+                        "thetaticks",
+                        "thingSpeakRead",
+                        "thingSpeakWrite",
+                        "throw",
+                        "throwAsCaller",
+                        "tic",
+                        "tiledlayout",
+                        "time",
+                        "timeit",
+                        "timeofday",
+                        "timer",
+                        "timerange",
+                        "timerfind",
+                        "timerfindall",
+                        "timeseries",
+                        "timetable",
+                        "timetable2table",
+                        "timezones",
+                        "title",
+                        "toc",
+                        "todatenum",
+                        "toeplitz",
+                        "toolboxdir",
+                        "topkrows",
+                        "toposort",
+                        "trace",
+                        "transclosure",
+                        "transform",
+                        "translate",
+                        "transpose",
+                        "transreduction",
+                        "trapz",
+                        "treelayout",
+                        "treeplot",
+                        "triangulation",
+                        "tril",
+                        "trimesh",
+                        "triplot",
+                        "trisurf",
+                        "triu",
+                        "true",
+                        "tscollection",
+                        "tsdata.event",
+                        "tsearchn",
+                        "turbo",
+                        "turningdist",
+                        "type",
+                        "typecast",
+                        "tzoffset",
+                        "uialert",
+                        "uiaxes",
+                        "uibutton",
+                        "uibuttongroup",
+                        "uicheckbox",
+                        "uiconfirm",
+                        "uicontextmenu",
+                        "uicontrol",
+                        "uidatepicker",
+                        "uidropdown",
+                        "uieditfield",
+                        "uifigure",
+                        "uigauge",
+                        "uigetdir",
+                        "uigetfile",
+                        "uigetpref",
+                        "uigridlayout",
+                        "uihtml",
+                        "uiimage",
+                        "uiknob",
+                        "uilabel",
+                        "uilamp",
+                        "uilistbox",
+                        "uimenu",
+                        "uint16",
+                        "uint32",
+                        "uint64",
+                        "uint8",
+                        "uiopen",
+                        "uipanel",
+                        "uiprogressdlg",
+                        "uipushtool",
+                        "uiputfile",
+                        "uiradiobutton",
+                        "uiresume",
+                        "uisave",
+                        "uisetcolor",
+                        "uisetfont",
+                        "uisetpref",
+                        "uislider",
+                        "uispinner",
+                        "uistack",
+                        "uistyle",
+                        "uiswitch",
+                        "uitab",
+                        "uitabgroup",
+                        "uitable",
+                        "uitextarea",
+                        "uitogglebutton",
+                        "uitoggletool",
+                        "uitoolbar",
+                        "uitree",
+                        "uitreenode",
+                        "uiwait",
+                        "uminus",
+                        "underlyingType",
+                        "underlyingValue",
+                        "unicode2native",
+                        "union",
+                        "unique",
+                        "uniquetol",
+                        "unix",
+                        "unloadlibrary",
+                        "unmesh",
+                        "unmkpp",
+                        "unregisterallevents",
+                        "unregisterevent",
+                        "unstack",
+                        "unsubscribe",
+                        "untar",
+                        "unwrap",
+                        "unzip",
+                        "update",
+                        "updateDependencies",
+                        "uplus",
+                        "upper",
+                        "usejava",
+                        "userpath",
+                        "validateFunctionSignaturesJSON",
+                        "validateInputsImpl",
+                        "validatePropertiesImpl",
+                        "validateattributes",
+                        "validatecolor",
+                        "validatestring",
+                        "values",
+                        "vander",
+                        "var",
+                        "varargin",
+                        "varargout",
+                        "varfun",
+                        "vartype",
+                        "vecnorm",
+                        "ver",
+                        "verLessThan",
+                        "version",
+                        "vertcat",
+                        "vertexAttachments",
+                        "vertexNormal",
+                        "view",
+                        "viewmtx",
+                        "visdiff",
+                        "volume",
+                        "volumebounds",
+                        "voronoi",
+                        "voronoiDiagram",
+                        "voronoin",
+                        "wait",
+                        "waitbar",
+                        "waitfor",
+                        "waitforbuttonpress",
+                        "warndlg",
+                        "warning",
+                        "waterfall",
+                        "web",
+                        "weboptions",
+                        "webread",
+                        "websave",
+                        "webwrite",
+                        "week",
+                        "weekday",
+                        "what",
+                        "which",
+                        "whitespaceBoundary",
+                        "whitespacePattern",
+                        "who",
+                        "whos",
+                        "width",
+                        "wildcardPattern",
+                        "wilkinson",
+                        "winopen",
+                        "winqueryreg",
+                        "winter",
+                        "withinrange",
+                        "withtol",
+                        "wordcloud",
+                        "write",
+                        "writeChecksum",
+                        "writeCol",
+                        "writeComment",
+                        "writeDate",
+                        "writeHistory",
+                        "writeImg",
+                        "writeKey",
+                        "writeKeyUnit",
+                        "writeVideo",
+                        "writeall",
+                        "writecell",
+                        "writeline",
+                        "writematrix",
+                        "writestruct",
+                        "writetable",
+                        "writetimetable",
+                        "xcorr",
+                        "xcov",
+                        "xlabel",
+                        "xlim",
+                        "xline",
+                        "xmlread",
+                        "xmlwrite",
+                        "xor",
+                        "xslt",
+                        "xtickangle",
+                        "xtickformat",
+                        "xticklabels",
+                        "xticks",
+                        "year",
+                        "years",
+                        "ylabel",
+                        "ylim",
+                        "yline",
+                        "ymd",
+                        "ytickangle",
+                        "ytickformat",
+                        "yticklabels",
+                        "yticks",
+                        "yyaxis",
+                        "yyyymmdd",
+                        "zeros",
+                        "zip",
+                        "zlabel",
+                        "zlim",
+                        "zoom",
+                        "zoomInteraction",
+                        "ztickangle",
+                        "ztickformat",
+                        "zticklabels",
+                        "zticks",
+                    ],
+                    prefix=r"(?<!\.)(",  # Exclude field names
+                    suffix=r")\b"
+                ),
+                Name.Builtin
+            ),
+
+            # line continuation with following comment:
+            (r'(\.\.\.)(.*)$', bygroups(Keyword, Comment)),
+
+            # command form:
+            # "How MATLAB Recognizes Command Syntax" specifies that an operator
+            # is recognized if it is either surrounded by spaces or by no
+            # spaces on both sides (this allows distinguishing `cd ./foo` from
+            # `cd ./ foo`.).  Here, the regex checks that the first word in the
+            # line is not followed by <spaces> and then
+            # (equal | open-parenthesis | <operator><space> | <space>).
+            (rf'(?:^|(?<=;))(\s*)(\w+)(\s+)(?!=|\(|{_operators}\s|\s)',
+             bygroups(Whitespace, Name, Whitespace), 'commandargs'),
+
+            include('expressions')
+        ],
+        'blockcomment': [
+            (r'^\s*%\}', Comment.Multiline, '#pop'),
+            (r'^.*\n', Comment.Multiline),
+            (r'.', Comment.Multiline),
+        ],
+        'deffunc': [
+            (r'(\s*)(?:(\S+)(\s*)(=)(\s*))?(.+)(\()(.*)(\))(\s*)',
+             bygroups(Whitespace, Text, Whitespace, Punctuation,
+                      Whitespace, Name.Function, Punctuation, Text,
+                      Punctuation, Whitespace), '#pop'),
+            # function with no args
+            (r'(\s*)([a-zA-Z_]\w*)',
+             bygroups(Whitespace, Name.Function), '#pop'),
+        ],
+        'propattrs': [
+            (r'(\w+)(\s*)(=)(\s*)(\d+)',
+             bygroups(Name.Builtin, Whitespace, Punctuation, Whitespace,
+                      Number)),
+            (r'(\w+)(\s*)(=)(\s*)([a-zA-Z]\w*)',
+             bygroups(Name.Builtin, Whitespace, Punctuation, Whitespace,
+                      Keyword)),
+            (r',', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+            (r'\s+', Whitespace),
+            (r'.', Text),
+        ],
+        'defprops': [
+            (r'%\{\s*\n', Comment.Multiline, 'blockcomment'),
+            (r'%.*$', Comment),
+            (r'(?<!\.)end\b', Keyword, '#pop'),
+            include('expressions'),
+        ],
+        'string': [
+            (r"[^']*'", String, '#pop'),
+        ],
+        'commandargs': [
+            # If an equal sign or other operator is encountered, this
+            # isn't a command. It might be a variable assignment or
+            # comparison operation with multiple spaces before the
+            # equal sign or operator
+            (r"=", Punctuation, '#pop'),
+            (_operators, Operator, '#pop'),
+            (r"[ \t]+", Whitespace),
+            ("'[^']*'", String),
+            (r"[^';\s]+", String),
+            (";", Punctuation, '#pop'),
+            default('#pop'),
+        ]
+    }
+
+    def analyse_text(text):
+        # function declaration.
+        first_non_comment = next((line for line in text.splitlines()
+                                  if not re.match(r'^\s*%', text)), '').strip()
+        if (first_non_comment.startswith('function')
+                and '{' not in first_non_comment):
+            return 1.
+        # comment
+        elif re.search(r'^\s*%', text, re.M):
+            return 0.2
+        # system cmd
+        elif re.search(r'^!\w+', text, re.M):
+            return 0.2
+
+
+line_re  = re.compile('.*?\n')
+
+
+class MatlabSessionLexer(Lexer):
+    """
+    For Matlab sessions.  Modeled after PythonConsoleLexer.
+    Contributed by Ken Schutte <kschutte@csail.mit.edu>.
+    """
+    name = 'Matlab session'
+    aliases = ['matlabsession']
+    url = 'https://www.mathworks.com/products/matlab.html'
+    version_added = '0.10'
+    _example = "matlabsession/matlabsession_sample.txt"
+
+    def get_tokens_unprocessed(self, text):
+        mlexer = MatlabLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        continuation = False
+
+        for match in line_re.finditer(text):
+            line = match.group()
+
+            if line.startswith('>> '):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:3])]))
+                curcode += line[3:]
+
+            elif line.startswith('>>'):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:2])]))
+                curcode += line[2:]
+
+            elif line.startswith('???'):
+
+                idx = len(curcode)
+
+                # without is showing error on same line as before...?
+                # line = "\n" + line
+                token = (0, Generic.Traceback, line)
+                insertions.append((idx, [token]))
+            elif continuation and insertions:
+                # line_start is the length of the most recent prompt symbol
+                line_start = len(insertions[-1][-1][-1])
+                # Set leading spaces with the length of the prompt to be a generic prompt
+                # This keeps code aligned when prompts are removed, say with some Javascript
+                if line.startswith(' '*line_start):
+                    insertions.append(
+                        (len(curcode), [(0, Generic.Prompt, line[:line_start])]))
+                    curcode += line[line_start:]
+                else:
+                    curcode += line
+            else:
+                if curcode:
+                    yield from do_insertions(
+                        insertions, mlexer.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+
+                yield match.start(), Generic.Output, line
+
+            # Does not allow continuation if a comment is included after the ellipses.
+            # Continues any line that ends with ..., even comments (lines that start with %)
+            if line.strip().endswith('...'):
+                continuation = True
+            else:
+                continuation = False
+
+        if curcode:  # or item:
+            yield from do_insertions(
+                insertions, mlexer.get_tokens_unprocessed(curcode))
+
+
+class OctaveLexer(RegexLexer):
+    """
+    For GNU Octave source code.
+    """
+    name = 'Octave'
+    url = 'https://www.gnu.org/software/octave/index'
+    aliases = ['octave']
+    filenames = ['*.m']
+    mimetypes = ['text/octave']
+    version_added = '1.5'
+
+    # These lists are generated automatically.
+    # Run the following in bash shell:
+    #
+    # First dump all of the Octave manual into a plain text file:
+    #
+    #   $ info octave --subnodes -o octave-manual
+    #
+    # Now grep through it:
+
+    # for i in \
+    #     "Built-in Function" "Command" "Function File" \
+    #     "Loadable Function" "Mapping Function";
+    # do
+    #     perl -e '@name = qw('"$i"');
+    #              print lc($name[0]),"_kw = [\n"';
+    #
+    #     perl -n -e 'print "\"$1\",\n" if /-- '"$i"': .* (\w*) \(/;' \
+    #         octave-manual | sort | uniq ;
+    #     echo "]" ;
+    #     echo;
+    # done
+
+    # taken from Octave Mercurial changeset 8cc154f45e37 (30-jan-2011)
+
+    builtin_kw = (
+        "addlistener", "addpath", "addproperty", "all",
+        "and", "any", "argnames", "argv", "assignin",
+        "atexit", "autoload",
+        "available_graphics_toolkits", "beep_on_error",
+        "bitand", "bitmax", "bitor", "bitshift", "bitxor",
+        "cat", "cell", "cellstr", "char", "class", "clc",
+        "columns", "command_line_path",
+        "completion_append_char", "completion_matches",
+        "complex", "confirm_recursive_rmdir", "cputime",
+        "crash_dumps_octave_core", "ctranspose", "cumprod",
+        "cumsum", "debug_on_error", "debug_on_interrupt",
+        "debug_on_warning", "default_save_options",
+        "dellistener", "diag", "diff", "disp",
+        "doc_cache_file", "do_string_escapes", "double",
+        "drawnow", "e", "echo_executing_commands", "eps",
+        "eq", "errno", "errno_list", "error", "eval",
+        "evalin", "exec", "exist", "exit", "eye", "false",
+        "fclear", "fclose", "fcntl", "fdisp", "feof",
+        "ferror", "feval", "fflush", "fgetl", "fgets",
+        "fieldnames", "file_in_loadpath", "file_in_path",
+        "filemarker", "filesep", "find_dir_in_path",
+        "fixed_point_format", "fnmatch", "fopen", "fork",
+        "formula", "fprintf", "fputs", "fread", "freport",
+        "frewind", "fscanf", "fseek", "fskipl", "ftell",
+        "functions", "fwrite", "ge", "genpath", "get",
+        "getegid", "getenv", "geteuid", "getgid",
+        "getpgrp", "getpid", "getppid", "getuid", "glob",
+        "gt", "gui_mode", "history_control",
+        "history_file", "history_size",
+        "history_timestamp_format_string", "home",
+        "horzcat", "hypot", "ifelse",
+        "ignore_function_time_stamp", "inferiorto",
+        "info_file", "info_program", "inline", "input",
+        "intmax", "intmin", "ipermute",
+        "is_absolute_filename", "isargout", "isbool",
+        "iscell", "iscellstr", "ischar", "iscomplex",
+        "isempty", "isfield", "isfloat", "isglobal",
+        "ishandle", "isieee", "isindex", "isinteger",
+        "islogical", "ismatrix", "ismethod", "isnull",
+        "isnumeric", "isobject", "isreal",
+        "is_rooted_relative_filename", "issorted",
+        "isstruct", "isvarname", "kbhit", "keyboard",
+        "kill", "lasterr", "lasterror", "lastwarn",
+        "ldivide", "le", "length", "link", "linspace",
+        "logical", "lstat", "lt", "make_absolute_filename",
+        "makeinfo_program", "max_recursion_depth", "merge",
+        "methods", "mfilename", "minus", "mislocked",
+        "mkdir", "mkfifo", "mkstemp", "mldivide", "mlock",
+        "mouse_wheel_zoom", "mpower", "mrdivide", "mtimes",
+        "munlock", "nargin", "nargout",
+        "native_float_format", "ndims", "ne", "nfields",
+        "nnz", "norm", "not", "numel", "nzmax",
+        "octave_config_info", "octave_core_file_limit",
+        "octave_core_file_name",
+        "octave_core_file_options", "ones", "or",
+        "output_max_field_width", "output_precision",
+        "page_output_immediately", "page_screen_output",
+        "path", "pathsep", "pause", "pclose", "permute",
+        "pi", "pipe", "plus", "popen", "power",
+        "print_empty_dimensions", "printf",
+        "print_struct_array_contents", "prod",
+        "program_invocation_name", "program_name",
+        "putenv", "puts", "pwd", "quit", "rats", "rdivide",
+        "readdir", "readlink", "read_readline_init_file",
+        "realmax", "realmin", "rehash", "rename",
+        "repelems", "re_read_readline_init_file", "reset",
+        "reshape", "resize", "restoredefaultpath",
+        "rethrow", "rmdir", "rmfield", "rmpath", "rows",
+        "save_header_format_string", "save_precision",
+        "saving_history", "scanf", "set", "setenv",
+        "shell_cmd", "sighup_dumps_octave_core",
+        "sigterm_dumps_octave_core", "silent_functions",
+        "single", "size", "size_equal", "sizemax",
+        "sizeof", "sleep", "source", "sparse_auto_mutate",
+        "split_long_rows", "sprintf", "squeeze", "sscanf",
+        "stat", "stderr", "stdin", "stdout", "strcmp",
+        "strcmpi", "string_fill_char", "strncmp",
+        "strncmpi", "struct", "struct_levels_to_print",
+        "strvcat", "subsasgn", "subsref", "sum", "sumsq",
+        "superiorto", "suppress_verbose_help_message",
+        "symlink", "system", "tic", "tilde_expand",
+        "times", "tmpfile", "tmpnam", "toc", "toupper",
+        "transpose", "true", "typeinfo", "umask", "uminus",
+        "uname", "undo_string_escapes", "unlink", "uplus",
+        "upper", "usage", "usleep", "vec", "vectorize",
+        "vertcat", "waitpid", "warning", "warranty",
+        "whos_line_format", "yes_or_no", "zeros",
+        "inf", "Inf", "nan", "NaN")
+
+    command_kw = ("close", "load", "who", "whos")
+
+    function_kw = (
+        "accumarray", "accumdim", "acosd", "acotd",
+        "acscd", "addtodate", "allchild", "ancestor",
+        "anova", "arch_fit", "arch_rnd", "arch_test",
+        "area", "arma_rnd", "arrayfun", "ascii", "asctime",
+        "asecd", "asind", "assert", "atand",
+        "autoreg_matrix", "autumn", "axes", "axis", "bar",
+        "barh", "bartlett", "bartlett_test", "beep",
+        "betacdf", "betainv", "betapdf", "betarnd",
+        "bicgstab", "bicubic", "binary", "binocdf",
+        "binoinv", "binopdf", "binornd", "bitcmp",
+        "bitget", "bitset", "blackman", "blanks",
+        "blkdiag", "bone", "box", "brighten", "calendar",
+        "cast", "cauchy_cdf", "cauchy_inv", "cauchy_pdf",
+        "cauchy_rnd", "caxis", "celldisp", "center", "cgs",
+        "chisquare_test_homogeneity",
+        "chisquare_test_independence", "circshift", "cla",
+        "clabel", "clf", "clock", "cloglog", "closereq",
+        "colon", "colorbar", "colormap", "colperm",
+        "comet", "common_size", "commutation_matrix",
+        "compan", "compare_versions", "compass",
+        "computer", "cond", "condest", "contour",
+        "contourc", "contourf", "contrast", "conv",
+        "convhull", "cool", "copper", "copyfile", "cor",
+        "corrcoef", "cor_test", "cosd", "cotd", "cov",
+        "cplxpair", "cross", "cscd", "cstrcat", "csvread",
+        "csvwrite", "ctime", "cumtrapz", "curl", "cut",
+        "cylinder", "date", "datenum", "datestr",
+        "datetick", "datevec", "dblquad", "deal",
+        "deblank", "deconv", "delaunay", "delaunayn",
+        "delete", "demo", "detrend", "diffpara", "diffuse",
+        "dir", "discrete_cdf", "discrete_inv",
+        "discrete_pdf", "discrete_rnd", "display",
+        "divergence", "dlmwrite", "dos", "dsearch",
+        "dsearchn", "duplication_matrix", "durbinlevinson",
+        "ellipsoid", "empirical_cdf", "empirical_inv",
+        "empirical_pdf", "empirical_rnd", "eomday",
+        "errorbar", "etime", "etreeplot", "example",
+        "expcdf", "expinv", "expm", "exppdf", "exprnd",
+        "ezcontour", "ezcontourf", "ezmesh", "ezmeshc",
+        "ezplot", "ezpolar", "ezsurf", "ezsurfc", "factor",
+        "factorial", "fail", "fcdf", "feather", "fftconv",
+        "fftfilt", "fftshift", "figure", "fileattrib",
+        "fileparts", "fill", "findall", "findobj",
+        "findstr", "finv", "flag", "flipdim", "fliplr",
+        "flipud", "fpdf", "fplot", "fractdiff", "freqz",
+        "freqz_plot", "frnd", "fsolve",
+        "f_test_regression", "ftp", "fullfile", "fzero",
+        "gamcdf", "gaminv", "gampdf", "gamrnd", "gca",
+        "gcbf", "gcbo", "gcf", "genvarname", "geocdf",
+        "geoinv", "geopdf", "geornd", "getfield", "ginput",
+        "glpk", "gls", "gplot", "gradient",
+        "graphics_toolkit", "gray", "grid", "griddata",
+        "griddatan", "gtext", "gunzip", "gzip", "hadamard",
+        "hamming", "hankel", "hanning", "hggroup",
+        "hidden", "hilb", "hist", "histc", "hold", "hot",
+        "hotelling_test", "housh", "hsv", "hurst",
+        "hygecdf", "hygeinv", "hygepdf", "hygernd",
+        "idivide", "ifftshift", "image", "imagesc",
+        "imfinfo", "imread", "imshow", "imwrite", "index",
+        "info", "inpolygon", "inputname", "interpft",
+        "interpn", "intersect", "invhilb", "iqr", "isa",
+        "isdefinite", "isdir", "is_duplicate_entry",
+        "isequal", "isequalwithequalnans", "isfigure",
+        "ishermitian", "ishghandle", "is_leap_year",
+        "isletter", "ismac", "ismember", "ispc", "isprime",
+        "isprop", "isscalar", "issquare", "isstrprop",
+        "issymmetric", "isunix", "is_valid_file_id",
+        "isvector", "jet", "kendall",
+        "kolmogorov_smirnov_cdf",
+        "kolmogorov_smirnov_test", "kruskal_wallis_test",
+        "krylov", "kurtosis", "laplace_cdf", "laplace_inv",
+        "laplace_pdf", "laplace_rnd", "legend", "legendre",
+        "license", "line", "linkprop", "list_primes",
+        "loadaudio", "loadobj", "logistic_cdf",
+        "logistic_inv", "logistic_pdf", "logistic_rnd",
+        "logit", "loglog", "loglogerr", "logm", "logncdf",
+        "logninv", "lognpdf", "lognrnd", "logspace",
+        "lookfor", "ls_command", "lsqnonneg", "magic",
+        "mahalanobis", "manova", "matlabroot",
+        "mcnemar_test", "mean", "meansq", "median", "menu",
+        "mesh", "meshc", "meshgrid", "meshz", "mexext",
+        "mget", "mkpp", "mode", "moment", "movefile",
+        "mpoles", "mput", "namelengthmax", "nargchk",
+        "nargoutchk", "nbincdf", "nbininv", "nbinpdf",
+        "nbinrnd", "nchoosek", "ndgrid", "newplot", "news",
+        "nonzeros", "normcdf", "normest", "norminv",
+        "normpdf", "normrnd", "now", "nthroot", "null",
+        "ocean", "ols", "onenormest", "optimget",
+        "optimset", "orderfields", "orient", "orth",
+        "pack", "pareto", "parseparams", "pascal", "patch",
+        "pathdef", "pcg", "pchip", "pcolor", "pcr",
+        "peaks", "periodogram", "perl", "perms", "pie",
+        "pink", "planerot", "playaudio", "plot",
+        "plotmatrix", "plotyy", "poisscdf", "poissinv",
+        "poisspdf", "poissrnd", "polar", "poly",
+        "polyaffine", "polyarea", "polyderiv", "polyfit",
+        "polygcd", "polyint", "polyout", "polyreduce",
+        "polyval", "polyvalm", "postpad", "powerset",
+        "ppder", "ppint", "ppjumps", "ppplot", "ppval",
+        "pqpnonneg", "prepad", "primes", "print",
+        "print_usage", "prism", "probit", "qp", "qqplot",
+        "quadcc", "quadgk", "quadl", "quadv", "quiver",
+        "qzhess", "rainbow", "randi", "range", "rank",
+        "ranks", "rat", "reallog", "realpow", "realsqrt",
+        "record", "rectangle_lw", "rectangle_sw",
+        "rectint", "refresh", "refreshdata",
+        "regexptranslate", "repmat", "residue", "ribbon",
+        "rindex", "roots", "rose", "rosser", "rotdim",
+        "rref", "run", "run_count", "rundemos", "run_test",
+        "runtests", "saveas", "saveaudio", "saveobj",
+        "savepath", "scatter", "secd", "semilogx",
+        "semilogxerr", "semilogy", "semilogyerr",
+        "setaudio", "setdiff", "setfield", "setxor",
+        "shading", "shift", "shiftdim", "sign_test",
+        "sinc", "sind", "sinetone", "sinewave", "skewness",
+        "slice", "sombrero", "sortrows", "spaugment",
+        "spconvert", "spdiags", "spearman", "spectral_adf",
+        "spectral_xdf", "specular", "speed", "spencer",
+        "speye", "spfun", "sphere", "spinmap", "spline",
+        "spones", "sprand", "sprandn", "sprandsym",
+        "spring", "spstats", "spy", "sqp", "stairs",
+        "statistics", "std", "stdnormal_cdf",
+        "stdnormal_inv", "stdnormal_pdf", "stdnormal_rnd",
+        "stem", "stft", "strcat", "strchr", "strjust",
+        "strmatch", "strread", "strsplit", "strtok",
+        "strtrim", "strtrunc", "structfun", "studentize",
+        "subplot", "subsindex", "subspace", "substr",
+        "substruct", "summer", "surf", "surface", "surfc",
+        "surfl", "surfnorm", "svds", "swapbytes",
+        "sylvester_matrix", "symvar", "synthesis", "table",
+        "tand", "tar", "tcdf", "tempdir", "tempname",
+        "test", "text", "textread", "textscan", "tinv",
+        "title", "toeplitz", "tpdf", "trace", "trapz",
+        "treelayout", "treeplot", "triangle_lw",
+        "triangle_sw", "tril", "trimesh", "triplequad",
+        "triplot", "trisurf", "triu", "trnd", "tsearchn",
+        "t_test", "t_test_regression", "type", "unidcdf",
+        "unidinv", "unidpdf", "unidrnd", "unifcdf",
+        "unifinv", "unifpdf", "unifrnd", "union", "unique",
+        "unix", "unmkpp", "unpack", "untabify", "untar",
+        "unwrap", "unzip", "u_test", "validatestring",
+        "vander", "var", "var_test", "vech", "ver",
+        "version", "view", "voronoi", "voronoin",
+        "waitforbuttonpress", "wavread", "wavwrite",
+        "wblcdf", "wblinv", "wblpdf", "wblrnd", "weekday",
+        "welch_test", "what", "white", "whitebg",
+        "wienrnd", "wilcoxon_test", "wilkinson", "winter",
+        "xlabel", "xlim", "ylabel", "yulewalker", "zip",
+        "zlabel", "z_test")
+
+    loadable_kw = (
+        "airy", "amd", "balance", "besselh", "besseli",
+        "besselj", "besselk", "bessely", "bitpack",
+        "bsxfun", "builtin", "ccolamd", "cellfun",
+        "cellslices", "chol", "choldelete", "cholinsert",
+        "cholinv", "cholshift", "cholupdate", "colamd",
+        "colloc", "convhulln", "convn", "csymamd",
+        "cummax", "cummin", "daspk", "daspk_options",
+        "dasrt", "dasrt_options", "dassl", "dassl_options",
+        "dbclear", "dbdown", "dbstack", "dbstatus",
+        "dbstop", "dbtype", "dbup", "dbwhere", "det",
+        "dlmread", "dmperm", "dot", "eig", "eigs",
+        "endgrent", "endpwent", "etree", "fft", "fftn",
+        "fftw", "filter", "find", "full", "gcd",
+        "getgrent", "getgrgid", "getgrnam", "getpwent",
+        "getpwnam", "getpwuid", "getrusage", "givens",
+        "gmtime", "gnuplot_binary", "hess", "ifft",
+        "ifftn", "inv", "isdebugmode", "issparse", "kron",
+        "localtime", "lookup", "lsode", "lsode_options",
+        "lu", "luinc", "luupdate", "matrix_type", "max",
+        "min", "mktime", "pinv", "qr", "qrdelete",
+        "qrinsert", "qrshift", "qrupdate", "quad",
+        "quad_options", "qz", "rand", "rande", "randg",
+        "randn", "randp", "randperm", "rcond", "regexp",
+        "regexpi", "regexprep", "schur", "setgrent",
+        "setpwent", "sort", "spalloc", "sparse", "spparms",
+        "sprank", "sqrtm", "strfind", "strftime",
+        "strptime", "strrep", "svd", "svd_driver", "syl",
+        "symamd", "symbfact", "symrcm", "time", "tsearch",
+        "typecast", "urlread", "urlwrite")
+
+    mapping_kw = (
+        "abs", "acos", "acosh", "acot", "acoth", "acsc",
+        "acsch", "angle", "arg", "asec", "asech", "asin",
+        "asinh", "atan", "atanh", "beta", "betainc",
+        "betaln", "bincoeff", "cbrt", "ceil", "conj", "cos",
+        "cosh", "cot", "coth", "csc", "csch", "erf", "erfc",
+        "erfcx", "erfinv", "exp", "finite", "fix", "floor",
+        "fmod", "gamma", "gammainc", "gammaln", "imag",
+        "isalnum", "isalpha", "isascii", "iscntrl",
+        "isdigit", "isfinite", "isgraph", "isinf",
+        "islower", "isna", "isnan", "isprint", "ispunct",
+        "isspace", "isupper", "isxdigit", "lcm", "lgamma",
+        "log", "lower", "mod", "real", "rem", "round",
+        "roundb", "sec", "sech", "sign", "sin", "sinh",
+        "sqrt", "tan", "tanh", "toascii", "tolower", "xor")
+
+    builtin_consts = (
+        "EDITOR", "EXEC_PATH", "I", "IMAGE_PATH", "NA",
+        "OCTAVE_HOME", "OCTAVE_VERSION", "PAGER",
+        "PAGER_FLAGS", "SEEK_CUR", "SEEK_END", "SEEK_SET",
+        "SIG", "S_ISBLK", "S_ISCHR", "S_ISDIR", "S_ISFIFO",
+        "S_ISLNK", "S_ISREG", "S_ISSOCK", "WCONTINUE",
+        "WCOREDUMP", "WEXITSTATUS", "WIFCONTINUED",
+        "WIFEXITED", "WIFSIGNALED", "WIFSTOPPED", "WNOHANG",
+        "WSTOPSIG", "WTERMSIG", "WUNTRACED")
+
+    tokens = {
+        'root': [
+            (r'%\{\s*\n', Comment.Multiline, 'percentblockcomment'),
+            (r'#\{\s*\n', Comment.Multiline, 'hashblockcomment'),
+            (r'[%#].*$', Comment),
+            (r'^\s*function\b', Keyword, 'deffunc'),
+
+            # from 'iskeyword' on hg changeset 8cc154f45e37
+            (words((
+                '__FILE__', '__LINE__', 'break', 'case', 'catch', 'classdef',
+                'continue', 'do', 'else', 'elseif', 'end', 'end_try_catch',
+                'end_unwind_protect', 'endclassdef', 'endevents', 'endfor',
+                'endfunction', 'endif', 'endmethods', 'endproperties', 'endswitch',
+                'endwhile', 'events', 'for', 'function', 'get', 'global', 'if',
+                'methods', 'otherwise', 'persistent', 'properties', 'return',
+                'set', 'static', 'switch', 'try', 'until', 'unwind_protect',
+                'unwind_protect_cleanup', 'while'), suffix=r'\b'),
+             Keyword),
+
+            (words(builtin_kw + command_kw + function_kw + loadable_kw + mapping_kw,
+                   suffix=r'\b'),  Name.Builtin),
+
+            (words(builtin_consts, suffix=r'\b'), Name.Constant),
+
+            # operators in Octave but not Matlab:
+            (r'-=|!=|!|/=|--', Operator),
+            # operators:
+            (r'-|==|~=|<|>|<=|>=|&&|&|~|\|\|?', Operator),
+            # operators in Octave but not Matlab requiring escape for re:
+            (r'\*=|\+=|\^=|\/=|\\=|\*\*|\+\+|\.\*\*', Operator),
+            # operators requiring escape for re:
+            (r'\.\*|\*|\+|\.\^|\^|\.\\|\.\/|\/|\\', Operator),
+
+
+            # punctuation:
+            (r'[\[\](){}:@.,]', Punctuation),
+            (r'=|:|;', Punctuation),
+
+            (r'"[^"]*"', String),
+
+            (r'(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eEf][+-]?[0-9]+', Number.Float),
+            (r'\d+', Number.Integer),
+
+            # quote can be transpose, instead of string:
+            # (not great, but handles common cases...)
+            (r'(?<=[\w)\].])\'+', Operator),
+            (r'(?<![\w)\].])\'', String, 'string'),
+
+            (r'[a-zA-Z_]\w*', Name),
+            (r'\s+', Text),
+            (r'.', Text),
+        ],
+        'percentblockcomment': [
+            (r'^\s*%\}', Comment.Multiline, '#pop'),
+            (r'^.*\n', Comment.Multiline),
+            (r'.', Comment.Multiline),
+        ],
+        'hashblockcomment': [
+            (r'^\s*#\}', Comment.Multiline, '#pop'),
+            (r'^.*\n', Comment.Multiline),
+            (r'.', Comment.Multiline),
+        ],
+        'string': [
+            (r"[^']*'", String, '#pop'),
+        ],
+        'deffunc': [
+            (r'(\s*)(?:(\S+)(\s*)(=)(\s*))?(.+)(\()(.*)(\))(\s*)',
+             bygroups(Whitespace, Text, Whitespace, Punctuation,
+                      Whitespace, Name.Function, Punctuation, Text,
+                      Punctuation, Whitespace), '#pop'),
+            # function with no args
+            (r'(\s*)([a-zA-Z_]\w*)',
+             bygroups(Whitespace, Name.Function), '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        """Octave is quite hard to spot, and it looks like Matlab as well."""
+        return 0
+
+
+class ScilabLexer(RegexLexer):
+    """
+    For Scilab source code.
+    """
+    name = 'Scilab'
+    url = 'https://www.scilab.org/'
+    aliases = ['scilab']
+    filenames = ['*.sci', '*.sce', '*.tst']
+    mimetypes = ['text/scilab']
+    version_added = '1.5'
+
+    tokens = {
+        'root': [
+            (r'//.*?$', Comment.Single),
+            (r'^\s*function\b', Keyword, 'deffunc'),
+
+            (words((
+                '__FILE__', '__LINE__', 'break', 'case', 'catch', 'classdef', 'continue', 'do', 'else',
+                'elseif', 'end', 'end_try_catch', 'end_unwind_protect', 'endclassdef',
+                'endevents', 'endfor', 'endfunction', 'endif', 'endmethods', 'endproperties',
+                'endswitch', 'endwhile', 'events', 'for', 'function', 'get', 'global', 'if', 'methods',
+                'otherwise', 'persistent', 'properties', 'return', 'set', 'static', 'switch', 'try',
+                'until', 'unwind_protect', 'unwind_protect_cleanup', 'while'), suffix=r'\b'),
+             Keyword),
+
+            (words(_scilab_builtins.functions_kw +
+                   _scilab_builtins.commands_kw +
+                   _scilab_builtins.macros_kw, suffix=r'\b'), Name.Builtin),
+
+            (words(_scilab_builtins.variables_kw, suffix=r'\b'), Name.Constant),
+
+            # operators:
+            (r'-|==|~=|<|>|<=|>=|&&|&|~|\|\|?', Operator),
+            # operators requiring escape for re:
+            (r'\.\*|\*|\+|\.\^|\^|\.\\|\.\/|\/|\\', Operator),
+
+            # punctuation:
+            (r'[\[\](){}@.,=:;]+', Punctuation),
+
+            (r'"[^"]*"', String),
+
+            # quote can be transpose, instead of string:
+            # (not great, but handles common cases...)
+            (r'(?<=[\w)\].])\'+', Operator),
+            (r'(?<![\w)\].])\'', String, 'string'),
+
+            (r'(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eEf][+-]?[0-9]+', Number.Float),
+            (r'\d+', Number.Integer),
+
+            (r'[a-zA-Z_]\w*', Name),
+            (r'\s+', Whitespace),
+            (r'.', Text),
+        ],
+        'string': [
+            (r"[^']*'", String, '#pop'),
+            (r'.', String, '#pop'),
+        ],
+        'deffunc': [
+            (r'(\s*)(?:(\S+)(\s*)(=)(\s*))?(.+)(\()(.*)(\))(\s*)',
+             bygroups(Whitespace, Text, Whitespace, Punctuation,
+                      Whitespace, Name.Function, Punctuation, Text,
+                      Punctuation, Whitespace), '#pop'),
+            # function with no args
+            (r'(\s*)([a-zA-Z_]\w*)', bygroups(Text, Name.Function), '#pop'),
+        ],
+    }
+
+    # the following is needed to distinguish Scilab and GAP .tst files
+    def analyse_text(text):
+        score = 0.0
+
+        # Scilab comments (don't appear in e.g. GAP code)
+        if re.search(r"^\s*//", text):
+            score += 0.1
+        if re.search(r"^\s*/\*", text):
+            score += 0.1
+
+        return min(score, 1.0)
diff --git a/.venv/Lib/site-packages/pygments/lexers/maxima.py b/.venv/Lib/site-packages/pygments/lexers/maxima.py
new file mode 100644 (file)
index 0000000..a983088
--- /dev/null
@@ -0,0 +1,84 @@
+"""
+    pygments.lexers.maxima
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the computer algebra system Maxima.
+
+    Derived from pygments/lexers/algebra.py.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['MaximaLexer']
+
+class MaximaLexer(RegexLexer):
+    """
+    A Maxima lexer.
+    Derived from pygments.lexers.MuPADLexer.
+    """
+    name = 'Maxima'
+    url = 'http://maxima.sourceforge.net'
+    aliases = ['maxima', 'macsyma']
+    filenames = ['*.mac', '*.max']
+    version_added = '2.11'
+
+    keywords = ('if', 'then', 'else', 'elseif',
+                'do', 'while', 'repeat', 'until',
+                'for', 'from', 'to', 'downto', 'step', 'thru')
+
+    constants = ('%pi', '%e', '%phi', '%gamma', '%i',
+                 'und', 'ind', 'infinity', 'inf', 'minf',
+                 'true', 'false', 'unknown', 'done')
+
+    operators = (r'.', r':', r'=', r'#',
+                 r'+', r'-', r'*', r'/', r'^',
+                 r'@', r'>', r'<', r'|', r'!', r"'")
+
+    operator_words = ('and', 'or', 'not')
+
+    tokens = {
+        'root': [
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'"(?:[^"\\]|\\.)*"', String),
+            (r'\(|\)|\[|\]|\{|\}', Punctuation),
+            (r'[,;$]', Punctuation),
+            (words (constants), Name.Constant),
+            (words (keywords), Keyword),
+            (words (operators), Operator),
+            (words (operator_words), Operator.Word),
+            (r'''(?x)
+              ((?:[a-zA-Z_#][\w#]*|`[^`]*`)
+              (?:::[a-zA-Z_#][\w#]*|`[^`]*`)*)(\s*)([(])''',
+             bygroups(Name.Function, Text.Whitespace, Punctuation)),
+            (r'''(?x)
+              (?:[a-zA-Z_#%][\w#%]*|`[^`]*`)
+              (?:::[a-zA-Z_#%][\w#%]*|`[^`]*`)*''', Name.Variable),
+            (r'[-+]?(\d*\.\d+([bdefls][-+]?\d+)?|\d+(\.\d*)?[bdefls][-+]?\d+)', Number.Float),
+            (r'[-+]?\d+', Number.Integer),
+            (r'\s+', Text.Whitespace),
+            (r'.', Text)
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ]
+    }
+
+    def analyse_text (text):
+        strength = 0.0
+        # Input expression terminator.
+        if re.search (r'\$\s*$', text, re.MULTILINE):
+            strength += 0.05
+        # Function definition operator.
+        if ':=' in text:
+            strength += 0.02
+        return strength
diff --git a/.venv/Lib/site-packages/pygments/lexers/meson.py b/.venv/Lib/site-packages/pygments/lexers/meson.py
new file mode 100644 (file)
index 0000000..6f2c6da
--- /dev/null
@@ -0,0 +1,139 @@
+"""
+    pygments.lexers.meson
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexer for the Meson build system
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include
+from pygments.token import Comment, Name, Number, Punctuation, Operator, \
+    Keyword, String, Whitespace
+
+__all__ = ['MesonLexer']
+
+
+class MesonLexer(RegexLexer):
+    """Meson language lexer.
+
+    The grammar definition use to transcribe the syntax was retrieved from
+    https://mesonbuild.com/Syntax.html#grammar for version 0.58.
+    Some of those definitions are improperly transcribed, so the Meson++
+    implementation was also checked: https://github.com/dcbaker/meson-plus-plus.
+    """
+
+    # TODO String interpolation @VARNAME@ inner matches
+    # TODO keyword_arg: value inner matches
+
+    name = 'Meson'
+    url = 'https://mesonbuild.com/'
+    aliases = ['meson', 'meson.build']
+    filenames = ['meson.build', 'meson_options.txt']
+    mimetypes = ['text/x-meson']
+    version_added = '2.10'
+
+    tokens = {
+        'root': [
+            (r'#.*?$', Comment),
+            (r"'''.*'''", String.Single),
+            (r'[1-9][0-9]*', Number.Integer),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[a-fA-F0-9]+', Number.Hex),
+            include('string'),
+            include('keywords'),
+            include('expr'),
+            (r'[a-zA-Z_][a-zA-Z_0-9]*', Name),
+            (r'\s+', Whitespace),
+        ],
+        'string': [
+            (r"[']{3}([']{0,2}([^\\']|\\(.|\n)))*[']{3}", String),
+            (r"'.*?(?<!\\)(\\\\)*?'", String),
+        ],
+        'keywords': [
+            (words((
+                'if',
+                'elif',
+                'else',
+                'endif',
+                'foreach',
+                'endforeach',
+                'break',
+                'continue',
+            ),
+                   suffix=r'\b'), Keyword),
+        ],
+        'expr': [
+            (r'(in|and|or|not)\b', Operator.Word),
+            (r'(\*=|/=|%=|\+]=|-=|==|!=|\+|-|=)', Operator),
+            (r'[\[\]{}:().,?]', Punctuation),
+            (words(('true', 'false'), suffix=r'\b'), Keyword.Constant),
+            include('builtins'),
+            (words((
+                'meson',
+                'build_machine',
+                'host_machine',
+                'target_machine',
+            ),
+                   suffix=r'\b'), Name.Variable.Magic),
+        ],
+        'builtins': [
+            # This list was extracted from the v0.58 reference manual
+            (words((
+                'add_global_arguments',
+                'add_global_link_arguments',
+                'add_languages',
+                'add_project_arguments',
+                'add_project_link_arguments',
+                'add_test_setup',
+                'assert',
+                'benchmark',
+                'both_libraries',
+                'build_target',
+                'configuration_data',
+                'configure_file',
+                'custom_target',
+                'declare_dependency',
+                'dependency',
+                'disabler',
+                'environment',
+                'error',
+                'executable',
+                'files',
+                'find_library',
+                'find_program',
+                'generator',
+                'get_option',
+                'get_variable',
+                'include_directories',
+                'install_data',
+                'install_headers',
+                'install_man',
+                'install_subdir',
+                'is_disabler',
+                'is_variable',
+                'jar',
+                'join_paths',
+                'library',
+                'message',
+                'project',
+                'range',
+                'run_command',
+                'set_variable',
+                'shared_library',
+                'shared_module',
+                'static_library',
+                'subdir',
+                'subdir_done',
+                'subproject',
+                'summary',
+                'test',
+                'vcs_tag',
+                'warning',
+            ),
+                   prefix=r'(?<!\.)',
+                   suffix=r'\b'), Name.Builtin),
+            (r'(?<!\.)import\b', Name.Namespace),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/mime.py b/.venv/Lib/site-packages/pygments/lexers/mime.py
new file mode 100644 (file)
index 0000000..45f27f4
--- /dev/null
@@ -0,0 +1,210 @@
+"""
+    pygments.lexers.mime
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Multipurpose Internet Mail Extensions (MIME) data.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include
+from pygments.lexers import get_lexer_for_mimetype
+from pygments.token import Text, Name, String, Operator, Comment, Other
+from pygments.util import get_int_opt, ClassNotFound
+
+__all__ = ["MIMELexer"]
+
+
+class MIMELexer(RegexLexer):
+    """
+    Lexer for Multipurpose Internet Mail Extensions (MIME) data. This lexer is
+    designed to process nested multipart data.
+
+    It assumes that the given data contains both header and body (and is
+    split at an empty line). If no valid header is found, then the entire data
+    will be treated as body.
+
+    Additional options accepted:
+
+    `MIME-max-level`
+        Max recursion level for nested MIME structure. Any negative number
+        would treated as unlimited. (default: -1)
+
+    `Content-Type`
+        Treat the data as a specific content type. Useful when header is
+        missing, or this lexer would try to parse from header. (default:
+        `text/plain`)
+
+    `Multipart-Boundary`
+        Set the default multipart boundary delimiter. This option is only used
+        when `Content-Type` is `multipart` and header is missing. This lexer
+        would try to parse from header by default. (default: None)
+
+    `Content-Transfer-Encoding`
+        Treat the data as a specific encoding. Or this lexer would try to parse
+        from header by default. (default: None)
+    """
+
+    name = "MIME"
+    aliases = ["mime"]
+    mimetypes = ["multipart/mixed",
+                 "multipart/related",
+                 "multipart/alternative"]
+    url = 'https://en.wikipedia.org/wiki/MIME'
+    version_added = '2.5'
+
+    def __init__(self, **options):
+        super().__init__(**options)
+        self.boundary = options.get("Multipart-Boundary")
+        self.content_transfer_encoding = options.get("Content_Transfer_Encoding")
+        self.content_type = options.get("Content_Type", "text/plain")
+        self.max_nested_level = get_int_opt(options, "MIME-max-level", -1)
+
+    def get_header_tokens(self, match):
+        field = match.group(1)
+
+        if field.lower() in self.attention_headers:
+            yield match.start(1), Name.Tag, field + ":"
+            yield match.start(2), Text.Whitespace, match.group(2)
+
+            pos = match.end(2)
+            body = match.group(3)
+            for i, t, v in self.get_tokens_unprocessed(body, ("root", field.lower())):
+                yield pos + i, t, v
+
+        else:
+            yield match.start(), Comment, match.group()
+
+    def get_body_tokens(self, match):
+        pos_body_start = match.start()
+        entire_body = match.group()
+
+        # skip first newline
+        if entire_body[0] == '\n':
+            yield pos_body_start, Text.Whitespace, '\n'
+            pos_body_start = pos_body_start + 1
+            entire_body = entire_body[1:]
+
+        # if it is not a multipart
+        if not self.content_type.startswith("multipart") or not self.boundary:
+            for i, t, v in self.get_bodypart_tokens(entire_body):
+                yield pos_body_start + i, t, v
+            return
+
+        # find boundary
+        bdry_pattern = rf"^--{re.escape(self.boundary)}(--)?\n"
+        bdry_matcher = re.compile(bdry_pattern, re.MULTILINE)
+
+        # some data has prefix text before first boundary
+        m = bdry_matcher.search(entire_body)
+        if m:
+            pos_part_start = pos_body_start + m.end()
+            pos_iter_start = lpos_end = m.end()
+            yield pos_body_start, Text, entire_body[:m.start()]
+            yield pos_body_start + lpos_end, String.Delimiter, m.group()
+        else:
+            pos_part_start = pos_body_start
+            pos_iter_start = 0
+
+        # process tokens of each body part
+        for m in bdry_matcher.finditer(entire_body, pos_iter_start):
+            # bodypart
+            lpos_start = pos_part_start - pos_body_start
+            lpos_end = m.start()
+            part = entire_body[lpos_start:lpos_end]
+            for i, t, v in self.get_bodypart_tokens(part):
+                yield pos_part_start + i, t, v
+
+            # boundary
+            yield pos_body_start + lpos_end, String.Delimiter, m.group()
+            pos_part_start = pos_body_start + m.end()
+
+        # some data has suffix text after last boundary
+        lpos_start = pos_part_start - pos_body_start
+        if lpos_start != len(entire_body):
+            yield pos_part_start, Text, entire_body[lpos_start:]
+
+    def get_bodypart_tokens(self, text):
+        # return if:
+        #  * no content
+        #  * no content type specific
+        #  * content encoding is not readable
+        #  * max recurrsion exceed
+        if not text.strip() or not self.content_type:
+            return [(0, Other, text)]
+
+        cte = self.content_transfer_encoding
+        if cte and cte not in {"8bit", "7bit", "quoted-printable"}:
+            return [(0, Other, text)]
+
+        if self.max_nested_level == 0:
+            return [(0, Other, text)]
+
+        # get lexer
+        try:
+            lexer = get_lexer_for_mimetype(self.content_type)
+        except ClassNotFound:
+            return [(0, Other, text)]
+
+        if isinstance(lexer, type(self)):
+            lexer.max_nested_level = self.max_nested_level - 1
+
+        return lexer.get_tokens_unprocessed(text)
+
+    def store_content_type(self, match):
+        self.content_type = match.group(1)
+
+        prefix_len = match.start(1) - match.start(0)
+        yield match.start(0), Text.Whitespace, match.group(0)[:prefix_len]
+        yield match.start(1), Name.Label, match.group(2)
+        yield match.end(2), String.Delimiter, '/'
+        yield match.start(3), Name.Label, match.group(3)
+
+    def get_content_type_subtokens(self, match):
+        yield match.start(1), Text, match.group(1)
+        yield match.start(2), Text.Whitespace, match.group(2)
+        yield match.start(3), Name.Attribute, match.group(3)
+        yield match.start(4), Operator, match.group(4)
+        yield match.start(5), String, match.group(5)
+
+        if match.group(3).lower() == "boundary":
+            boundary = match.group(5).strip()
+            if boundary[0] == '"' and boundary[-1] == '"':
+                boundary = boundary[1:-1]
+            self.boundary = boundary
+
+    def store_content_transfer_encoding(self, match):
+        self.content_transfer_encoding = match.group(0).lower()
+        yield match.start(0), Name.Constant, match.group(0)
+
+    attention_headers = {"content-type", "content-transfer-encoding"}
+
+    tokens = {
+        "root": [
+            (r"^([\w-]+):( *)([\s\S]*?\n)(?![ \t])", get_header_tokens),
+            (r"^$[\s\S]+", get_body_tokens),
+        ],
+        "header": [
+            # folding
+            (r"\n[ \t]", Text.Whitespace),
+            (r"\n(?![ \t])", Text.Whitespace, "#pop"),
+        ],
+        "content-type": [
+            include("header"),
+            (
+                r"^\s*((multipart|application|audio|font|image|model|text|video"
+                r"|message)/([\w-]+))",
+                store_content_type,
+            ),
+            (r'(;)((?:[ \t]|\n[ \t])*)([\w:-]+)(=)([\s\S]*?)(?=;|\n(?![ \t]))',
+             get_content_type_subtokens),
+            (r';[ \t]*\n(?![ \t])', Text, '#pop'),
+        ],
+        "content-transfer-encoding": [
+            include("header"),
+            (r"([\w-]+)", store_content_transfer_encoding),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/minecraft.py b/.venv/Lib/site-packages/pygments/lexers/minecraft.py
new file mode 100644 (file)
index 0000000..fe5e9f8
--- /dev/null
@@ -0,0 +1,391 @@
+"""
+    pygments.lexers.minecraft
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Minecraft related languages.
+
+    SNBT. A data communication format used in Minecraft.
+    wiki: https://minecraft.wiki/w/NBT_format
+
+    MCFunction. The Function file for Minecraft Data packs and Add-ons.
+    official: https://learn.microsoft.com/en-us/minecraft/creator/documents/functionsintroduction
+    wiki: https://minecraft.wiki/w/Function
+
+    MCSchema. A kind of data Schema for Minecraft Add-on Development.
+    official: https://learn.microsoft.com/en-us/minecraft/creator/reference/content/schemasreference/
+    community example: https://www.mcbe-dev.net/addons/data-driven/manifest.html
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, default, include, bygroups
+from pygments.token import Comment, Keyword, Literal, Name, Number, Operator, \
+    Punctuation, String, Text, Whitespace
+
+__all__ = ['SNBTLexer', 'MCFunctionLexer', 'MCSchemaLexer']
+
+
+class SNBTLexer(RegexLexer):
+    """Lexer for stringified NBT, a data format used in Minecraft
+    """
+
+    name = "SNBT"
+    url = "https://minecraft.wiki/w/NBT_format"
+    aliases = ["snbt"]
+    filenames = ["*.snbt"]
+    mimetypes = ["text/snbt"]
+    version_added = '2.12'
+
+    tokens = {
+        "root": [
+            # We only look for the open bracket here since square bracket
+            #  is only valid in NBT pathing (which is a mcfunction idea).
+            (r"\{", Punctuation, "compound"),
+            (r"[^\{]+", Text),
+        ],
+
+        "whitespace": [
+            (r"\s+", Whitespace),
+        ],
+
+        "operators": [
+            (r"[,:;]", Punctuation),
+        ],
+
+        "literals": [
+            (r"(true|false)", Keyword.Constant),
+            (r"-?\d+[eE]-?\d+", Number.Float),
+            (r"-?\d*\.\d+[fFdD]?", Number.Float),
+            (r"-?\d+[bBsSlLfFdD]?", Number.Integer),
+
+            # Separate states for both types of strings so they don't entangle
+            (r'"', String.Double, "literals.string_double"),
+            (r"'", String.Single, "literals.string_single"),
+        ],
+        "literals.string_double": [
+            (r"\\.", String.Escape),
+            (r'[^\\"\n]+', String.Double),
+            (r'"', String.Double, "#pop"),
+        ],
+        "literals.string_single": [
+            (r"\\.", String.Escape),
+            (r"[^\\'\n]+", String.Single),
+            (r"'", String.Single, "#pop"),
+        ],
+
+        "compound": [
+            # this handles the unquoted snbt keys
+            #  note: stringified keys still work
+            (r"[A-Z_a-z]+", Name.Attribute),
+            include("operators"),
+            include("whitespace"),
+            include("literals"),
+            (r"\{", Punctuation, "#push"),
+            (r"\[", Punctuation, "list"),
+            (r"\}", Punctuation, "#pop"),
+        ],
+
+        "list": [
+            (r"[A-Z_a-z]+", Name.Attribute),
+            include("literals"),
+            include("operators"),
+            include("whitespace"),
+            (r"\[", Punctuation, "#push"),
+            (r"\{", Punctuation, "compound"),
+            (r"\]", Punctuation, "#pop"),
+        ],
+    }
+
+
+class MCFunctionLexer(RegexLexer):
+    """Lexer for the mcfunction scripting language used in Minecraft
+    Modelled somewhat after the `GitHub mcfunction grammar <https://github.com/Arcensoth/language-mcfunction>`_.
+    """
+
+    name = "MCFunction"
+    url = "https://minecraft.wiki/w/Commands"
+    aliases = ["mcfunction", "mcf"]
+    filenames = ["*.mcfunction"]
+    mimetypes = ["text/mcfunction"]
+    version_added = '2.12'
+
+    # Used to denotate the start of a block comment, borrowed from Github's mcfunction
+    _block_comment_prefix = "[>!]"
+
+    tokens = {
+        "root": [
+            include("names"),
+            include("comments"),
+            include("literals"),
+            include("whitespace"),
+            include("property"),
+            include("operators"),
+            include("selectors"),
+        ],
+
+        "names": [
+            # The start of a command (either beginning of line OR after the run keyword)
+            #  We don't encode a list of keywords since mods, plugins, or even pre-processors
+            #  may add new commands, so we have a 'close-enough' regex which catches them.
+            (r"^(\s*)([a-z_]+)", bygroups(Whitespace, Name.Builtin)),
+            (r"(?<=run)\s+[a-z_]+", Name.Builtin),
+
+            # UUID
+            (r"\b[0-9a-fA-F]+(?:-[0-9a-fA-F]+){4}\b", Name.Variable),
+            include("resource-name"),
+            # normal command names and scoreboards
+            #  there's no way to know the differences unfortuntely
+            (r"[A-Za-z_][\w.#%$]+", Keyword.Constant),
+            (r"[#%$][\w.#%$]+", Name.Variable.Magic),
+        ],
+
+        "resource-name": [
+            # resource names have to be lowercase
+            (r"#?[a-z_][a-z_.-]*:[a-z0-9_./-]+", Name.Function),
+            # similar to above except optional `:``
+            #  a `/` must be present "somewhere"
+            (r"#?[a-z0-9_\.\-]+\/[a-z0-9_\.\-\/]+", Name.Function),
+        ],
+
+        "whitespace": [
+            (r"\s+", Whitespace),
+        ],
+
+        "comments": [
+            (rf"^\s*(#{_block_comment_prefix})", Comment.Multiline,
+             ("comments.block", "comments.block.emphasized")),
+            (r"#.*$", Comment.Single),
+        ],
+        "comments.block": [
+            (rf"^\s*#{_block_comment_prefix}", Comment.Multiline,
+             "comments.block.emphasized"),
+            (r"^\s*#", Comment.Multiline, "comments.block.normal"),
+            default("#pop"),
+        ],
+        "comments.block.normal": [
+            include("comments.block.special"),
+            (r"\S+", Comment.Multiline),
+            (r"\n", Text, "#pop"),
+            include("whitespace"),
+        ],
+        "comments.block.emphasized": [
+            include("comments.block.special"),
+            (r"\S+", String.Doc),
+            (r"\n", Text, "#pop"),
+            include("whitespace"),
+        ],
+        "comments.block.special": [
+            # Params
+            (r"@\S+", Name.Decorator),
+
+            include("resource-name"),
+
+            # Scoreboard player names
+            (r"[#%$][\w.#%$]+", Name.Variable.Magic),
+        ],
+
+        "operators": [
+            (r"[\-~%^?!+*<>\\/|&=.]", Operator),
+        ],
+
+        "literals": [
+            (r"\.\.", Literal),
+            (r"(true|false)", Keyword.Pseudo),
+
+            # these are like unquoted strings and appear in many places
+            (r"[A-Za-z_]+", Name.Variable.Class),
+
+            (r"[0-7]b", Number.Byte),
+            (r"[+-]?\d*\.?\d+([eE]?[+-]?\d+)?[df]?\b", Number.Float),
+            (r"[+-]?\d+\b", Number.Integer),
+            (r'"', String.Double, "literals.string-double"),
+            (r"'", String.Single, "literals.string-single"),
+        ],
+        "literals.string-double": [
+            (r"\\.", String.Escape),
+            (r'[^\\"\n]+', String.Double),
+            (r'"', String.Double, "#pop"),
+        ],
+        "literals.string-single": [
+            (r"\\.", String.Escape),
+            (r"[^\\'\n]+", String.Single),
+            (r"'", String.Single, "#pop"),
+        ],
+
+        "selectors": [
+            (r"@[a-z]", Name.Variable),
+        ],
+
+
+        ## Generic Property Container
+        # There are several, differing instances where the language accepts
+        #  specific contained keys or contained key, value pairings.
+        #
+        # Property Maps:
+        # - Starts with either `[` or `{`
+        # - Key separated by `:` or `=`
+        # - Deliminated by `,`
+        #
+        # Property Lists:
+        # - Starts with `[`
+        # - Deliminated by `,`
+        #
+        # For simplicity, these patterns match a generic, nestable structure
+        #  which follow a key, value pattern. For normal lists, there's only keys.
+        # This allow some "illegal" structures, but we'll accept those for
+        #  sake of simplicity
+        #
+        # Examples:
+        # - `[facing=up, powered=true]` (blockstate)
+        # - `[name="hello world", nbt={key: 1b}]` (selector + nbt)
+        # - `[{"text": "value"}, "literal"]` (json)
+        ##
+        "property": [
+            # This state gets included in root and also several substates
+            # We do this to shortcut the starting of new properties
+            #  within other properties. Lists can have sublists and compounds
+            #  and values can start a new property (see the `difficult_1.txt`
+            #  snippet).
+            (r"\{", Punctuation, ("property.curly", "property.key")),
+            (r"\[", Punctuation, ("property.square", "property.key")),
+        ],
+        "property.curly": [
+            include("whitespace"),
+            include("property"),
+            (r"\}", Punctuation, "#pop"),
+        ],
+        "property.square": [
+            include("whitespace"),
+            include("property"),
+            (r"\]", Punctuation, "#pop"),
+
+            # lists can have sequences of items
+            (r",", Punctuation),
+        ],
+        "property.key": [
+            include("whitespace"),
+
+            # resource names (for advancements)
+            #  can omit `:` to default `minecraft:`
+            # must check if there is a future equals sign if `:` is in the name
+            (r"#?[a-z_][a-z_\.\-]*\:[a-z0-9_\.\-/]+(?=\s*\=)", Name.Attribute, "property.delimiter"),
+            (r"#?[a-z_][a-z0-9_\.\-/]+", Name.Attribute, "property.delimiter"),
+
+            # unquoted NBT key
+            (r"[A-Za-z_\-\+]+", Name.Attribute, "property.delimiter"),
+
+            # quoted JSON or NBT key
+            (r'"', Name.Attribute, "property.delimiter", "literals.string-double"),
+            (r"'", Name.Attribute, "property.delimiter", "literals.string-single"),
+
+            # index for a list
+            (r"-?\d+", Number.Integer, "property.delimiter"),
+
+            default("#pop"),
+        ],
+        "property.key.string-double": [
+            (r"\\.", String.Escape),
+            (r'[^\\"\n]+', Name.Attribute),
+            (r'"', Name.Attribute, "#pop"),
+        ],
+        "property.key.string-single": [
+            (r"\\.", String.Escape),
+            (r"[^\\'\n]+", Name.Attribute),
+            (r"'", Name.Attribute, "#pop"),
+        ],
+        "property.delimiter": [
+            include("whitespace"),
+
+            (r"[:=]!?", Punctuation, "property.value"),
+            (r",", Punctuation),
+
+            default("#pop"),
+        ],
+        "property.value": [
+            include("whitespace"),
+
+            # unquoted resource names are valid literals here
+            (r"#?[a-z_][a-z_\.\-]*\:[a-z0-9_\.\-/]+", Name.Tag),
+            (r"#?[a-z_][a-z0-9_\.\-/]+", Name.Tag),
+
+            include("literals"),
+            include("property"),
+
+            default("#pop"),
+        ],
+    }
+
+
+class MCSchemaLexer(RegexLexer):
+    """Lexer for Minecraft Add-ons data Schemas, an interface structure standard used in Minecraft
+    """
+
+    name = 'MCSchema'
+    url = 'https://learn.microsoft.com/en-us/minecraft/creator/reference/content/schemasreference/'
+    aliases = ['mcschema']
+    filenames = ['*.mcschema']
+    mimetypes = ['text/mcschema']
+    version_added = '2.14'
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Whitespace),
+            (r'//.*?$', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gimuysd]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Whitespace, '#pop')
+        ],
+        'singlestring': [
+            (r'\\.', String.Escape),
+            (r"'", String.Single, '#pop'),
+            (r"[^\\']+", String.Single),
+        ],
+        'doublestring': [
+            (r'\\.', String.Escape),
+            (r'"', String.Double, '#pop'),
+            (r'[^\\"]+', String.Double),
+        ],
+        'root': [
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+
+            # keywords for optional word and field types
+            (r'(?<=: )opt', Operator.Word),
+            (r'(?<=\s)[\w-]*(?=(\s+"|\n))', Keyword.Declaration),
+
+            # numeric literals
+            (r'0[bB][01]+', Number.Bin),
+            (r'0[oO]?[0-7]+', Number.Oct),
+            (r'0[xX][0-9a-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'(\.\d+|\d+\.\d*|\d+)([eE][-+]?\d+)?', Number.Float),
+
+            # possible punctuations
+            (r'\.\.\.|=>', Punctuation),
+            (r'\+\+|--|~|\?\?=?|\?|:|\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|(?:\*\*|\|\||&&|[-<>+*%&|^/]))=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+
+            # strings
+            (r"'", String.Single, 'singlestring'),
+            (r'"', String.Double, 'doublestring'),
+
+            # title line
+            (r'[\w-]*?(?=:\{?\n)', String.Symbol),
+            # title line with a version code, formatted
+            # `major.minor.patch-prerelease+buildmeta`
+            (r'([\w-]*?)(:)(\d+)(?:(\.)(\d+)(?:(\.)(\d+)(?:(\-)((?:[^\W_]|-)*(?:\.(?:[^\W_]|-)*)*))?(?:(\+)((?:[^\W_]|-)+(?:\.(?:[^\W_]|-)+)*))?)?)?(?=:\{?\n)', bygroups(String.Symbol, Operator, Number.Integer, Operator, Number.Integer, Operator, Number.Integer, Operator, String, Operator, String)),
+
+            (r'.*\n', Text),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/mips.py b/.venv/Lib/site-packages/pygments/lexers/mips.py
new file mode 100644 (file)
index 0000000..531f1b8
--- /dev/null
@@ -0,0 +1,130 @@
+"""
+    pygments.lexers.mips
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for MIPS assembly.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Whitespace, Comment, String, Keyword, Name, Text
+
+__all__ = ["MIPSLexer"]
+
+
+class MIPSLexer(RegexLexer):
+    """
+    A MIPS Assembly Lexer.
+
+    Based on the Emacs major mode by hlissner:
+    https://github.com/hlissner/emacs-mips-mode
+    """
+
+    name = 'MIPS'
+    aliases = ['mips']
+    version_added = ''
+    # TODO: add '*.s' and '*.asm', which will require designing an analyse_text
+    # method for this lexer and refactoring those from Gas and Nasm in order to
+    # have relatively reliable detection
+    filenames = ['*.mips', '*.MIPS']
+    url = 'https://mips.com'
+
+    keywords = [
+        # Arithmetic insturctions
+        "add", "sub", "subu", "addi", "subi", "addu", "addiu",
+        # Multiplication/division
+        "mul", "mult", "multu", "mulu", "madd", "maddu", "msub", "msubu", "div", "divu",
+        # Bitwise operations
+        "and", "or", "nor", "xor", "andi", "ori", "xori", "clo", "clz",
+        # Shifts
+        "sll", "srl", "sllv", "srlv", "sra", "srav",
+        # Comparisons
+        "slt", "sltu", "slti", "sltiu",
+        # Move data
+        "mfhi", "mthi", "mflo", "mtlo", "movn", "movz", "movf", "movt",
+        # Jump
+        "j", "jal", "jalr", "jr",
+        # branch
+        "bc1f", "bc1t", "beq", "bgez", "bgezal", "bgtz", "blez", "bltzal", "bltz", "bne",
+        # Load
+        "lui", "lb", "lbu", "lh", "lhu", "lw", "lwcl", "lwl", "lwr",
+        # Store
+        "sb", "sh", "sw", "swl", "swr", # coproc: swc1 sdc1
+        # Concurrent load/store
+        "ll", "sc",
+        # Trap handling
+        "teq", "teqi", "tne", "tneqi", "tge", "tgeu", "tgei", "tgeiu", "tlt", "tltu", "tlti",
+        "tltiu",
+        # Exception / Interrupt
+        "eret", "break", "bop", "syscall",
+        # --- Floats -----------------------------------------------------
+        # Arithmetic
+        "add.s", "add.d", "sub.s", "sub.d", "mul.s", "mul.d", "div.s", "div.d", "neg.d",
+        "neg.s",
+        # Comparison
+        "c.e.d", "c.e.s", "c.le.d", "c.le.s", "c.lt.s", "c.lt.d", # "c.gt.s", "c.gt.d",
+        "madd.s", "madd.d", "msub.s", "msub.d",
+        # Move Floats
+        "mov.d", "move.s", "movf.d", "movf.s", "movt.d", "movt.s", "movn.d", "movn.s",
+        "movnzd", "movz.s", "movz.d",
+        # Conversion
+        "cvt.d.s", "cvt.d.w", "cvt.s.d", "cvt.s.w", "cvt.w.d", "cvt.w.s", "trunc.w.d",
+        "trunc.w.s",
+        # Math
+        "abs.s", "abs.d", "sqrt.s", "sqrt.d", "ceil.w.d", "ceil.w.s", "floor.w.d",
+        "floor.w.s", "round.w.d", "round.w.s",
+    ]
+
+    pseudoinstructions = [
+        # Arithmetic & logical
+        "rem", "remu", "mulo", "mulou", "abs", "neg", "negu", "not", "rol", "ror",
+        # branches
+        "b", "beqz", "bge", "bgeu", "bgt", "bgtu", "ble", "bleu", "blt", "bltu", "bnez",
+        # loads
+        "la", "li", "ld", "ulh", "ulhu", "ulw",
+        # Store
+        "sd", "ush", "usw",
+        # move
+        "move", # coproc: "mfc1.d",
+        # comparisons
+        "sgt", "sgtu", "sge", "sgeu", "sle", "sleu", "sne", "seq",
+        # --- Floats -----------------------------------------------------
+        # load-store
+        "l.d", "l.s", "s.d", "s.s",
+    ]
+
+    directives = [
+        ".align", ".ascii", ".asciiz", ".byte", ".data", ".double", ".extern", ".float",
+        ".globl", ".half", ".kdata", ".ktext", ".space", ".text", ".word",
+    ]
+
+    deprecated = [
+        "beql", "bnel", "bgtzl", "bgezl", "bltzl", "blezl", "bltzall", "bgezall",
+    ]
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'#.*', Comment),
+            (r'"', String, 'string'),
+            (r'-?[0-9]+?', Keyword.Constant),
+            (r'\w*:', Name.Function),
+            (words(deprecated, suffix=r'\b'), Keyword.Pseudo), # need warning face
+            (words(pseudoinstructions, suffix=r'\b'), Name.Variable),
+            (words(keywords, suffix=r'\b'), Keyword),
+            (r'[slm][ftwd]c[0-9]([.]d)?', Keyword),
+            (r'\$(f?[0-2][0-9]|f?3[01]|[ft]?[0-9]|[vk][01]|a[0-3]|s[0-7]|[gsf]p|ra|at|zero)',
+             Keyword.Type),
+            (words(directives, suffix=r'\b'), Name.Entity), # Preprocessor?
+            (r':|,|;|\{|\}|=>|@|\$|=', Name.Builtin),
+            (r'\w+', Text),
+            (r'.', Text),
+        ],
+        'string': [
+            (r'\\.', String.Escape),
+            (r'"', String, '#pop'),
+            (r'[^\\"]+', String),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/ml.py b/.venv/Lib/site-packages/pygments/lexers/ml.py
new file mode 100644 (file)
index 0000000..48a08da
--- /dev/null
@@ -0,0 +1,958 @@
+"""
+    pygments.lexers.ml
+    ~~~~~~~~~~~~~~~~~~
+
+    Lexers for ML family languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['SMLLexer', 'OcamlLexer', 'OpaLexer', 'ReasonLexer', 'FStarLexer']
+
+
+class SMLLexer(RegexLexer):
+    """
+    For the Standard ML language.
+    """
+
+    name = 'Standard ML'
+    aliases = ['sml']
+    filenames = ['*.sml', '*.sig', '*.fun']
+    mimetypes = ['text/x-standardml', 'application/x-standardml']
+    url = 'https://en.wikipedia.org/wiki/Standard_ML'
+    version_added = '1.5'
+
+    alphanumid_reserved = {
+        # Core
+        'abstype', 'and', 'andalso', 'as', 'case', 'datatype', 'do', 'else',
+        'end', 'exception', 'fn', 'fun', 'handle', 'if', 'in', 'infix',
+        'infixr', 'let', 'local', 'nonfix', 'of', 'op', 'open', 'orelse',
+        'raise', 'rec', 'then', 'type', 'val', 'with', 'withtype', 'while',
+        # Modules
+        'eqtype', 'functor', 'include', 'sharing', 'sig', 'signature',
+        'struct', 'structure', 'where',
+    }
+
+    symbolicid_reserved = {
+        # Core
+        ':', r'\|', '=', '=>', '->', '#',
+        # Modules
+        ':>',
+    }
+
+    nonid_reserved = {'(', ')', '[', ']', '{', '}', ',', ';', '...', '_'}
+
+    alphanumid_re = r"[a-zA-Z][\w']*"
+    symbolicid_re = r"[!%&$#+\-/:<=>?@\\~`^|*]+"
+
+    # A character constant is a sequence of the form #s, where s is a string
+    # constant denoting a string of size one character. This setup just parses
+    # the entire string as either a String.Double or a String.Char (depending
+    # on the argument), even if the String.Char is an erroneous
+    # multiple-character string.
+    def stringy(whatkind):
+        return [
+            (r'[^"\\]', whatkind),
+            (r'\\[\\"abtnvfr]', String.Escape),
+            # Control-character notation is used for codes < 32,
+            # where \^@ == \000
+            (r'\\\^[\x40-\x5e]', String.Escape),
+            # Docs say 'decimal digits'
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\\s+\\', String.Interpol),
+            (r'"', whatkind, '#pop'),
+        ]
+
+    # Callbacks for distinguishing tokens and reserved words
+    def long_id_callback(self, match):
+        if match.group(1) in self.alphanumid_reserved:
+            token = Error
+        else:
+            token = Name.Namespace
+        yield match.start(1), token, match.group(1)
+        yield match.start(2), Punctuation, match.group(2)
+
+    def end_id_callback(self, match):
+        if match.group(1) in self.alphanumid_reserved:
+            token = Error
+        elif match.group(1) in self.symbolicid_reserved:
+            token = Error
+        else:
+            token = Name
+        yield match.start(1), token, match.group(1)
+
+    def id_callback(self, match):
+        str = match.group(1)
+        if str in self.alphanumid_reserved:
+            token = Keyword.Reserved
+        elif str in self.symbolicid_reserved:
+            token = Punctuation
+        else:
+            token = Name
+        yield match.start(1), token, str
+
+    tokens = {
+        # Whitespace and comments are (almost) everywhere
+        'whitespace': [
+            (r'\s+', Text),
+            (r'\(\*', Comment.Multiline, 'comment'),
+        ],
+
+        'delimiters': [
+            # This lexer treats these delimiters specially:
+            # Delimiters define scopes, and the scope is how the meaning of
+            # the `|' is resolved - is it a case/handle expression, or function
+            # definition by cases? (This is not how the Definition works, but
+            # it's how MLton behaves, see http://mlton.org/SMLNJDeviations)
+            (r'\(|\[|\{', Punctuation, 'main'),
+            (r'\)|\]|\}', Punctuation, '#pop'),
+            (r'\b(let|if|local)\b(?!\')', Keyword.Reserved, ('main', 'main')),
+            (r'\b(struct|sig|while)\b(?!\')', Keyword.Reserved, 'main'),
+            (r'\b(do|else|end|in|then)\b(?!\')', Keyword.Reserved, '#pop'),
+        ],
+
+        'core': [
+            # Punctuation that doesn't overlap symbolic identifiers
+            (r'({})'.format('|'.join(re.escape(z) for z in nonid_reserved)),
+             Punctuation),
+
+            # Special constants: strings, floats, numbers in decimal and hex
+            (r'#"', String.Char, 'char'),
+            (r'"', String.Double, 'string'),
+            (r'~?0x[0-9a-fA-F]+', Number.Hex),
+            (r'0wx[0-9a-fA-F]+', Number.Hex),
+            (r'0w\d+', Number.Integer),
+            (r'~?\d+\.\d+[eE]~?\d+', Number.Float),
+            (r'~?\d+\.\d+', Number.Float),
+            (r'~?\d+[eE]~?\d+', Number.Float),
+            (r'~?\d+', Number.Integer),
+
+            # Labels
+            (r'#\s*[1-9][0-9]*', Name.Label),
+            (rf'#\s*({alphanumid_re})', Name.Label),
+            (rf'#\s+({symbolicid_re})', Name.Label),
+            # Some reserved words trigger a special, local lexer state change
+            (r'\b(datatype|abstype)\b(?!\')', Keyword.Reserved, 'dname'),
+            (r'\b(exception)\b(?!\')', Keyword.Reserved, 'ename'),
+            (r'\b(functor|include|open|signature|structure)\b(?!\')',
+             Keyword.Reserved, 'sname'),
+            (r'\b(type|eqtype)\b(?!\')', Keyword.Reserved, 'tname'),
+
+            # Regular identifiers, long and otherwise
+            (r'\'[\w\']*', Name.Decorator),
+            (rf'({alphanumid_re})(\.)', long_id_callback, "dotted"),
+            (rf'({alphanumid_re})', id_callback),
+            (rf'({symbolicid_re})', id_callback),
+        ],
+        'dotted': [
+            (rf'({alphanumid_re})(\.)', long_id_callback),
+            (rf'({alphanumid_re})', end_id_callback, "#pop"),
+            (rf'({symbolicid_re})', end_id_callback, "#pop"),
+            (r'\s+', Error),
+            (r'\S+', Error),
+        ],
+
+
+        # Main parser (prevents errors in files that have scoping errors)
+        'root': [
+            default('main')
+        ],
+
+        # In this scope, I expect '|' to not be followed by a function name,
+        # and I expect 'and' to be followed by a binding site
+        'main': [
+            include('whitespace'),
+
+            # Special behavior of val/and/fun
+            (r'\b(val|and)\b(?!\')', Keyword.Reserved, 'vname'),
+            (r'\b(fun)\b(?!\')', Keyword.Reserved,
+             ('#pop', 'main-fun', 'fname')),
+
+            include('delimiters'),
+            include('core'),
+            (r'\S+', Error),
+        ],
+
+        # In this scope, I expect '|' and 'and' to be followed by a function
+        'main-fun': [
+            include('whitespace'),
+
+            (r'\s', Text),
+            (r'\(\*', Comment.Multiline, 'comment'),
+
+            # Special behavior of val/and/fun
+            (r'\b(fun|and)\b(?!\')', Keyword.Reserved, 'fname'),
+            (r'\b(val)\b(?!\')', Keyword.Reserved,
+             ('#pop', 'main', 'vname')),
+
+            # Special behavior of '|' and '|'-manipulating keywords
+            (r'\|', Punctuation, 'fname'),
+            (r'\b(case|handle)\b(?!\')', Keyword.Reserved,
+             ('#pop', 'main')),
+
+            include('delimiters'),
+            include('core'),
+            (r'\S+', Error),
+        ],
+
+        # Character and string parsers
+        'char': stringy(String.Char),
+        'string': stringy(String.Double),
+
+        'breakout': [
+            (r'(?=\b({})\b(?!\'))'.format('|'.join(alphanumid_reserved)), Text, '#pop'),
+        ],
+
+        # Dealing with what comes after module system keywords
+        'sname': [
+            include('whitespace'),
+            include('breakout'),
+
+            (rf'({alphanumid_re})', Name.Namespace),
+            default('#pop'),
+        ],
+
+        # Dealing with what comes after the 'fun' (or 'and' or '|') keyword
+        'fname': [
+            include('whitespace'),
+            (r'\'[\w\']*', Name.Decorator),
+            (r'\(', Punctuation, 'tyvarseq'),
+
+            (rf'({alphanumid_re})', Name.Function, '#pop'),
+            (rf'({symbolicid_re})', Name.Function, '#pop'),
+
+            # Ignore interesting function declarations like "fun (x + y) = ..."
+            default('#pop'),
+        ],
+
+        # Dealing with what comes after the 'val' (or 'and') keyword
+        'vname': [
+            include('whitespace'),
+            (r'\'[\w\']*', Name.Decorator),
+            (r'\(', Punctuation, 'tyvarseq'),
+
+            (rf'({alphanumid_re})(\s*)(=(?!{symbolicid_re}))',
+             bygroups(Name.Variable, Text, Punctuation), '#pop'),
+            (rf'({symbolicid_re})(\s*)(=(?!{symbolicid_re}))',
+             bygroups(Name.Variable, Text, Punctuation), '#pop'),
+            (rf'({alphanumid_re})', Name.Variable, '#pop'),
+            (rf'({symbolicid_re})', Name.Variable, '#pop'),
+
+            # Ignore interesting patterns like 'val (x, y)'
+            default('#pop'),
+        ],
+
+        # Dealing with what comes after the 'type' (or 'and') keyword
+        'tname': [
+            include('whitespace'),
+            include('breakout'),
+
+            (r'\'[\w\']*', Name.Decorator),
+            (r'\(', Punctuation, 'tyvarseq'),
+            (rf'=(?!{symbolicid_re})', Punctuation, ('#pop', 'typbind')),
+
+            (rf'({alphanumid_re})', Keyword.Type),
+            (rf'({symbolicid_re})', Keyword.Type),
+            (r'\S+', Error, '#pop'),
+        ],
+
+        # A type binding includes most identifiers
+        'typbind': [
+            include('whitespace'),
+
+            (r'\b(and)\b(?!\')', Keyword.Reserved, ('#pop', 'tname')),
+
+            include('breakout'),
+            include('core'),
+            (r'\S+', Error, '#pop'),
+        ],
+
+        # Dealing with what comes after the 'datatype' (or 'and') keyword
+        'dname': [
+            include('whitespace'),
+            include('breakout'),
+
+            (r'\'[\w\']*', Name.Decorator),
+            (r'\(', Punctuation, 'tyvarseq'),
+            (r'(=)(\s*)(datatype)',
+             bygroups(Punctuation, Text, Keyword.Reserved), '#pop'),
+            (rf'=(?!{symbolicid_re})', Punctuation,
+             ('#pop', 'datbind', 'datcon')),
+
+            (rf'({alphanumid_re})', Keyword.Type),
+            (rf'({symbolicid_re})', Keyword.Type),
+            (r'\S+', Error, '#pop'),
+        ],
+
+        # common case - A | B | C of int
+        'datbind': [
+            include('whitespace'),
+
+            (r'\b(and)\b(?!\')', Keyword.Reserved, ('#pop', 'dname')),
+            (r'\b(withtype)\b(?!\')', Keyword.Reserved, ('#pop', 'tname')),
+            (r'\b(of)\b(?!\')', Keyword.Reserved),
+
+            (rf'(\|)(\s*)({alphanumid_re})',
+             bygroups(Punctuation, Text, Name.Class)),
+            (rf'(\|)(\s+)({symbolicid_re})',
+             bygroups(Punctuation, Text, Name.Class)),
+
+            include('breakout'),
+            include('core'),
+            (r'\S+', Error),
+        ],
+
+        # Dealing with what comes after an exception
+        'ename': [
+            include('whitespace'),
+
+            (rf'(and\b)(\s+)({alphanumid_re})',
+             bygroups(Keyword.Reserved, Text, Name.Class)),
+            (rf'(and\b)(\s*)({symbolicid_re})',
+             bygroups(Keyword.Reserved, Text, Name.Class)),
+            (r'\b(of)\b(?!\')', Keyword.Reserved),
+            (rf'({alphanumid_re})|({symbolicid_re})', Name.Class),
+
+            default('#pop'),
+        ],
+
+        'datcon': [
+            include('whitespace'),
+            (rf'({alphanumid_re})', Name.Class, '#pop'),
+            (rf'({symbolicid_re})', Name.Class, '#pop'),
+            (r'\S+', Error, '#pop'),
+        ],
+
+        # Series of type variables
+        'tyvarseq': [
+            (r'\s', Text),
+            (r'\(\*', Comment.Multiline, 'comment'),
+
+            (r'\'[\w\']*', Name.Decorator),
+            (alphanumid_re, Name),
+            (r',', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+            (symbolicid_re, Name),
+        ],
+
+        'comment': [
+            (r'[^(*)]', Comment.Multiline),
+            (r'\(\*', Comment.Multiline, '#push'),
+            (r'\*\)', Comment.Multiline, '#pop'),
+            (r'[(*)]', Comment.Multiline),
+        ],
+    }
+
+
+class OcamlLexer(RegexLexer):
+    """
+    For the OCaml language.
+    """
+
+    name = 'OCaml'
+    url = 'https://ocaml.org/'
+    aliases = ['ocaml']
+    filenames = ['*.ml', '*.mli', '*.mll', '*.mly']
+    mimetypes = ['text/x-ocaml']
+    version_added = '0.7'
+
+    keywords = (
+        'and', 'as', 'assert', 'begin', 'class', 'constraint', 'do', 'done',
+        'downto', 'else', 'end', 'exception', 'external', 'false',
+        'for', 'fun', 'function', 'functor', 'if', 'in', 'include',
+        'inherit', 'initializer', 'lazy', 'let', 'match', 'method',
+        'module', 'mutable', 'new', 'object', 'of', 'open', 'private',
+        'raise', 'rec', 'sig', 'struct', 'then', 'to', 'true', 'try',
+        'type', 'val', 'virtual', 'when', 'while', 'with',
+    )
+    keyopts = (
+        '!=', '#', '&', '&&', r'\(', r'\)', r'\*', r'\+', ',', '-',
+        r'-\.', '->', r'\.', r'\.\.', ':', '::', ':=', ':>', ';', ';;', '<',
+        '<-', '=', '>', '>]', r'>\}', r'\?', r'\?\?', r'\[', r'\[<', r'\[>',
+        r'\[\|', ']', '_', '`', r'\{', r'\{<', r'\|', r'\|]', r'\}', '~'
+    )
+
+    operators = r'[!$%&*+\./:<=>?@^|~-]'
+    word_operators = ('asr', 'land', 'lor', 'lsl', 'lxor', 'mod', 'or')
+    prefix_syms = r'[!?~]'
+    infix_syms = r'[=<>@^|&+\*/$%-]'
+    primitives = ('unit', 'int', 'float', 'bool', 'string', 'char', 'list', 'array')
+
+    tokens = {
+        'escape-sequence': [
+            (r'\\[\\"\'ntbr]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        ],
+        'root': [
+            (r'\s+', Text),
+            (r'false|true|\(\)|\[\]', Name.Builtin.Pseudo),
+            (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Namespace, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name.Class),
+            (r'\(\*(?![)])', Comment, 'comment'),
+            (r'\b({})\b'.format('|'.join(keywords)), Keyword),
+            (r'({})'.format('|'.join(keyopts[::-1])), Operator),
+            (rf'({infix_syms}|{prefix_syms})?{operators}', Operator),
+            (r'\b({})\b'.format('|'.join(word_operators)), Operator.Word),
+            (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type),
+
+            (r"[^\W\d][\w']*", Name),
+
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'0[oO][0-7][0-7_]*', Number.Oct),
+            (r'0[bB][01][01_]*', Number.Bin),
+            (r'\d[\d_]*', Number.Integer),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'", Keyword),  # a stray quote is another syntax element
+
+            (r'"', String.Double, 'string'),
+
+            (r'[~?][a-z][\w\']*:', Name.Variable),
+        ],
+        'comment': [
+            (r'[^(*)]+', Comment),
+            (r'\(\*', Comment, '#push'),
+            (r'\*\)', Comment, '#pop'),
+            (r'[(*)]', Comment),
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            include('escape-sequence'),
+            (r'\\\n', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
+            (r'[A-Z][\w\']*', Name.Class, '#pop'),
+            (r'[a-z_][\w\']*', Name, '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class OpaLexer(RegexLexer):
+    """
+    Lexer for the Opa language.
+    """
+
+    name = 'Opa'
+    aliases = ['opa']
+    filenames = ['*.opa']
+    mimetypes = ['text/x-opa']
+    url = 'http://opalang.org'
+    version_added = '1.5'
+
+    # most of these aren't strictly keywords
+    # but if you color only real keywords, you might just
+    # as well not color anything
+    keywords = (
+        'and', 'as', 'begin', 'case', 'client', 'css', 'database', 'db', 'do',
+        'else', 'end', 'external', 'forall', 'function', 'if', 'import',
+        'match', 'module', 'or', 'package', 'parser', 'rec', 'server', 'then',
+        'type', 'val', 'with', 'xml_parser',
+    )
+
+    # matches both stuff and `stuff`
+    ident_re = r'(([a-zA-Z_]\w*)|(`[^`]*`))'
+
+    op_re = r'[.=\-<>,@~%/+?*&^!]'
+    punc_re = r'[()\[\],;|]'  # '{' and '}' are treated elsewhere
+                              # because they are also used for inserts
+
+    tokens = {
+        # copied from the caml lexer, should be adapted
+        'escape-sequence': [
+            (r'\\[\\"\'ntr}]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        ],
+
+        # factorizing these rules, because they are inserted many times
+        'comments': [
+            (r'/\*', Comment, 'nested-comment'),
+            (r'//.*?$', Comment),
+        ],
+        'comments-and-spaces': [
+            include('comments'),
+            (r'\s+', Text),
+        ],
+
+        'root': [
+            include('comments-and-spaces'),
+            # keywords
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword),
+            # directives
+            # we could parse the actual set of directives instead of anything
+            # starting with @, but this is troublesome
+            # because it needs to be adjusted all the time
+            # and assuming we parse only sources that compile, it is useless
+            (r'@' + ident_re + r'\b', Name.Builtin.Pseudo),
+
+            # number literals
+            (r'-?.[\d]+([eE][+\-]?\d+)', Number.Float),
+            (r'-?\d+.\d*([eE][+\-]?\d+)', Number.Float),
+            (r'-?\d+[eE][+\-]?\d+', Number.Float),
+            (r'0[xX][\da-fA-F]+', Number.Hex),
+            (r'0[oO][0-7]+', Number.Oct),
+            (r'0[bB][01]+', Number.Bin),
+            (r'\d+', Number.Integer),
+            # color literals
+            (r'#[\da-fA-F]{3,6}', Number.Integer),
+
+            # string literals
+            (r'"', String.Double, 'string'),
+            # char literal, should be checked because this is the regexp from
+            # the caml lexer
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2})|.)'",
+             String.Char),
+
+            # this is meant to deal with embedded exprs in strings
+            # every time we find a '}' we pop a state so that if we were
+            # inside a string, we are back in the string state
+            # as a consequence, we must also push a state every time we find a
+            # '{' or else we will have errors when parsing {} for instance
+            (r'\{', Operator, '#push'),
+            (r'\}', Operator, '#pop'),
+
+            # html literals
+            # this is a much more strict that the actual parser,
+            # since a<b would not be parsed as html
+            # but then again, the parser is way too lax, and we can't hope
+            # to have something as tolerant
+            (r'<(?=[a-zA-Z>])', String.Single, 'html-open-tag'),
+
+            # db path
+            # matching the '[_]' in '/a[_]' because it is a part
+            # of the syntax of the db path definition
+            # unfortunately, i don't know how to match the ']' in
+            # /a[1], so this is somewhat inconsistent
+            (r'[@?!]?(/\w+)+(\[_\])?', Name.Variable),
+            # putting the same color on <- as on db path, since
+            # it can be used only to mean Db.write
+            (r'<-(?!'+op_re+r')', Name.Variable),
+
+            # 'modules'
+            # although modules are not distinguished by their names as in caml
+            # the standard library seems to follow the convention that modules
+            # only area capitalized
+            (r'\b([A-Z]\w*)(?=\.)', Name.Namespace),
+
+            # operators
+            # = has a special role because this is the only
+            # way to syntactic distinguish binding constructions
+            # unfortunately, this colors the equal in {x=2} too
+            (r'=(?!'+op_re+r')', Keyword),
+            (rf'({op_re})+', Operator),
+            (rf'({punc_re})+', Operator),
+
+            # coercions
+            (r':', Operator, 'type'),
+            # type variables
+            # we need this rule because we don't parse specially type
+            # definitions so in "type t('a) = ...", "'a" is parsed by 'root'
+            ("'"+ident_re, Keyword.Type),
+
+            # id literal, #something, or #{expr}
+            (r'#'+ident_re, String.Single),
+            (r'#(?=\{)', String.Single),
+
+            # identifiers
+            # this avoids to color '2' in 'a2' as an integer
+            (ident_re, Text),
+
+            # default, not sure if that is needed or not
+            # (r'.', Text),
+        ],
+
+        # it is quite painful to have to parse types to know where they end
+        # this is the general rule for a type
+        # a type is either:
+        # * -> ty
+        # * type-with-slash
+        # * type-with-slash -> ty
+        # * type-with-slash (, type-with-slash)+ -> ty
+        #
+        # the code is pretty funky in here, but this code would roughly
+        # translate in caml to:
+        # let rec type stream =
+        # match stream with
+        # | [< "->";  stream >] -> type stream
+        # | [< "";  stream >] ->
+        #   type_with_slash stream
+        #   type_lhs_1 stream;
+        # and type_1 stream = ...
+        'type': [
+            include('comments-and-spaces'),
+            (r'->', Keyword.Type),
+            default(('#pop', 'type-lhs-1', 'type-with-slash')),
+        ],
+
+        # parses all the atomic or closed constructions in the syntax of type
+        # expressions: record types, tuple types, type constructors, basic type
+        # and type variables
+        'type-1': [
+            include('comments-and-spaces'),
+            (r'\(', Keyword.Type, ('#pop', 'type-tuple')),
+            (r'~?\{', Keyword.Type, ('#pop', 'type-record')),
+            (ident_re+r'\(', Keyword.Type, ('#pop', 'type-tuple')),
+            (ident_re, Keyword.Type, '#pop'),
+            ("'"+ident_re, Keyword.Type),
+            # this case is not in the syntax but sometimes
+            # we think we are parsing types when in fact we are parsing
+            # some css, so we just pop the states until we get back into
+            # the root state
+            default('#pop'),
+        ],
+
+        # type-with-slash is either:
+        # * type-1
+        # * type-1 (/ type-1)+
+        'type-with-slash': [
+            include('comments-and-spaces'),
+            default(('#pop', 'slash-type-1', 'type-1')),
+        ],
+        'slash-type-1': [
+            include('comments-and-spaces'),
+            ('/', Keyword.Type, ('#pop', 'type-1')),
+            # same remark as above
+            default('#pop'),
+        ],
+
+        # we go in this state after having parsed a type-with-slash
+        # while trying to parse a type
+        # and at this point we must determine if we are parsing an arrow
+        # type (in which case we must continue parsing) or not (in which
+        # case we stop)
+        'type-lhs-1': [
+            include('comments-and-spaces'),
+            (r'->', Keyword.Type, ('#pop', 'type')),
+            (r'(?=,)', Keyword.Type, ('#pop', 'type-arrow')),
+            default('#pop'),
+        ],
+        'type-arrow': [
+            include('comments-and-spaces'),
+            # the look ahead here allows to parse f(x : int, y : float -> truc)
+            # correctly
+            (r',(?=[^:]*?->)', Keyword.Type, 'type-with-slash'),
+            (r'->', Keyword.Type, ('#pop', 'type')),
+            # same remark as above
+            default('#pop'),
+        ],
+
+        # no need to do precise parsing for tuples and records
+        # because they are closed constructions, so we can simply
+        # find the closing delimiter
+        # note that this function would be not work if the source
+        # contained identifiers like `{)` (although it could be patched
+        # to support it)
+        'type-tuple': [
+            include('comments-and-spaces'),
+            (r'[^()/*]+', Keyword.Type),
+            (r'[/*]', Keyword.Type),
+            (r'\(', Keyword.Type, '#push'),
+            (r'\)', Keyword.Type, '#pop'),
+        ],
+        'type-record': [
+            include('comments-and-spaces'),
+            (r'[^{}/*]+', Keyword.Type),
+            (r'[/*]', Keyword.Type),
+            (r'\{', Keyword.Type, '#push'),
+            (r'\}', Keyword.Type, '#pop'),
+        ],
+
+        # 'type-tuple': [
+        #     include('comments-and-spaces'),
+        #     (r'\)', Keyword.Type, '#pop'),
+        #     default(('#pop', 'type-tuple-1', 'type-1')),
+        # ],
+        # 'type-tuple-1': [
+        #     include('comments-and-spaces'),
+        #     (r',?\s*\)', Keyword.Type, '#pop'), # ,) is a valid end of tuple, in (1,)
+        #     (r',', Keyword.Type, 'type-1'),
+        # ],
+        # 'type-record':[
+        #     include('comments-and-spaces'),
+        #     (r'\}', Keyword.Type, '#pop'),
+        #     (r'~?(?:\w+|`[^`]*`)', Keyword.Type, 'type-record-field-expr'),
+        # ],
+        # 'type-record-field-expr': [
+        #
+        # ],
+
+        'nested-comment': [
+            (r'[^/*]+', Comment),
+            (r'/\*', Comment, '#push'),
+            (r'\*/', Comment, '#pop'),
+            (r'[/*]', Comment),
+        ],
+
+        # the copy pasting between string and single-string
+        # is kinda sad. Is there a way to avoid that??
+        'string': [
+            (r'[^\\"{]+', String.Double),
+            (r'"', String.Double, '#pop'),
+            (r'\{', Operator, 'root'),
+            include('escape-sequence'),
+        ],
+        'single-string': [
+            (r'[^\\\'{]+', String.Double),
+            (r'\'', String.Double, '#pop'),
+            (r'\{', Operator, 'root'),
+            include('escape-sequence'),
+        ],
+
+        # all the html stuff
+        # can't really reuse some existing html parser
+        # because we must be able to parse embedded expressions
+
+        # we are in this state after someone parsed the '<' that
+        # started the html literal
+        'html-open-tag': [
+            (r'[\w\-:]+', String.Single, ('#pop', 'html-attr')),
+            (r'>', String.Single, ('#pop', 'html-content')),
+        ],
+
+        # we are in this state after someone parsed the '</' that
+        # started the end of the closing tag
+        'html-end-tag': [
+            # this is a star, because </> is allowed
+            (r'[\w\-:]*>', String.Single, '#pop'),
+        ],
+
+        # we are in this state after having parsed '<ident(:ident)?'
+        # we thus parse a possibly empty list of attributes
+        'html-attr': [
+            (r'\s+', Text),
+            (r'[\w\-:]+=', String.Single, 'html-attr-value'),
+            (r'/>', String.Single, '#pop'),
+            (r'>', String.Single, ('#pop', 'html-content')),
+        ],
+
+        'html-attr-value': [
+            (r"'", String.Single, ('#pop', 'single-string')),
+            (r'"', String.Single, ('#pop', 'string')),
+            (r'#'+ident_re, String.Single, '#pop'),
+            (r'#(?=\{)', String.Single, ('#pop', 'root')),
+            (r'[^"\'{`=<>]+', String.Single, '#pop'),
+            (r'\{', Operator, ('#pop', 'root')),  # this is a tail call!
+        ],
+
+        # we should probably deal with '\' escapes here
+        'html-content': [
+            (r'<!--', Comment, 'html-comment'),
+            (r'</', String.Single, ('#pop', 'html-end-tag')),
+            (r'<', String.Single, 'html-open-tag'),
+            (r'\{', Operator, 'root'),
+            (r'[^<{]+', String.Single),
+        ],
+
+        'html-comment': [
+            (r'-->', Comment, '#pop'),
+            (r'[^\-]+|-', Comment),
+        ],
+    }
+
+
+class ReasonLexer(RegexLexer):
+    """
+    For the ReasonML language.
+    """
+
+    name = 'ReasonML'
+    url = 'https://reasonml.github.io/'
+    aliases = ['reasonml', 'reason']
+    filenames = ['*.re', '*.rei']
+    mimetypes = ['text/x-reasonml']
+    version_added = '2.6'
+
+    keywords = (
+        'as', 'assert', 'begin', 'class', 'constraint', 'do', 'done', 'downto',
+        'else', 'end', 'exception', 'external', 'false', 'for', 'fun', 'esfun',
+        'function', 'functor', 'if', 'in', 'include', 'inherit', 'initializer', 'lazy',
+        'let', 'switch', 'module', 'pub', 'mutable', 'new', 'nonrec', 'object', 'of',
+        'open', 'pri', 'rec', 'sig', 'struct', 'then', 'to', 'true', 'try',
+        'type', 'val', 'virtual', 'when', 'while', 'with',
+    )
+    keyopts = (
+        '!=', '#', '&', '&&', r'\(', r'\)', r'\*', r'\+', ',', '-',
+        r'-\.', '=>', r'\.', r'\.\.', r'\.\.\.', ':', '::', ':=', ':>', ';', ';;', '<',
+        '<-', '=', '>', '>]', r'>\}', r'\?', r'\?\?', r'\[', r'\[<', r'\[>',
+        r'\[\|', ']', '_', '`', r'\{', r'\{<', r'\|', r'\|\|', r'\|]', r'\}', '~'
+    )
+
+    operators = r'[!$%&*+\./:<=>?@^|~-]'
+    word_operators = ('and', 'asr', 'land', 'lor', 'lsl', 'lsr', 'lxor', 'mod', 'or')
+    prefix_syms = r'[!?~]'
+    infix_syms = r'[=<>@^|&+\*/$%-]'
+    primitives = ('unit', 'int', 'float', 'bool', 'string', 'char', 'list', 'array')
+
+    tokens = {
+        'escape-sequence': [
+            (r'\\[\\"\'ntbr]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        ],
+        'root': [
+            (r'\s+', Text),
+            (r'false|true|\(\)|\[\]', Name.Builtin.Pseudo),
+            (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Namespace, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name.Class),
+            (r'//.*?\n', Comment.Single),
+            (r'\/\*(?!/)', Comment.Multiline, 'comment'),
+            (r'\b({})\b'.format('|'.join(keywords)), Keyword),
+            (r'({})'.format('|'.join(keyopts[::-1])), Operator.Word),
+            (rf'({infix_syms}|{prefix_syms})?{operators}', Operator),
+            (r'\b({})\b'.format('|'.join(word_operators)), Operator.Word),
+            (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type),
+
+            (r"[^\W\d][\w']*", Name),
+
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'0[oO][0-7][0-7_]*', Number.Oct),
+            (r'0[bB][01][01_]*', Number.Bin),
+            (r'\d[\d_]*', Number.Integer),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'", Keyword),
+
+            (r'"', String.Double, 'string'),
+
+            (r'[~?][a-z][\w\']*:', Name.Variable),
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'\/\*', Comment.Multiline, '#push'),
+            (r'\*\/', Comment.Multiline, '#pop'),
+            (r'\*', Comment.Multiline),
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            include('escape-sequence'),
+            (r'\\\n', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
+            (r'[A-Z][\w\']*', Name.Class, '#pop'),
+            (r'[a-z_][\w\']*', Name, '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class FStarLexer(RegexLexer):
+    """
+    For the F* language.
+    """
+
+    name = 'FStar'
+    url = 'https://www.fstar-lang.org/'
+    aliases = ['fstar']
+    filenames = ['*.fst', '*.fsti']
+    mimetypes = ['text/x-fstar']
+    version_added = '2.7'
+
+    keywords = (
+        'abstract', 'attributes', 'noeq', 'unopteq', 'and'
+        'begin', 'by', 'default', 'effect', 'else', 'end', 'ensures',
+        'exception', 'exists', 'false', 'forall', 'fun', 'function', 'if',
+        'in', 'include', 'inline', 'inline_for_extraction', 'irreducible',
+        'logic', 'match', 'module', 'mutable', 'new', 'new_effect', 'noextract',
+        'of', 'open', 'opaque', 'private', 'range_of', 'reifiable',
+        'reify', 'reflectable', 'requires', 'set_range_of', 'sub_effect',
+        'synth', 'then', 'total', 'true', 'try', 'type', 'unfold', 'unfoldable',
+        'val', 'when', 'with', 'not'
+    )
+    decl_keywords = ('let', 'rec')
+    assume_keywords = ('assume', 'admit', 'assert', 'calc')
+    keyopts = (
+        r'~', r'-', r'/\\', r'\\/', r'<:', r'<@', r'\(\|', r'\|\)', r'#', r'u#',
+        r'&', r'\(', r'\)', r'\(\)', r',', r'~>', r'->', r'<-', r'<--', r'<==>',
+        r'==>', r'\.', r'\?', r'\?\.', r'\.\[', r'\.\(', r'\.\(\|', r'\.\[\|',
+        r'\{:pattern', r':', r'::', r':=', r';', r';;', r'=', r'%\[', r'!\{',
+        r'\[', r'\[@', r'\[\|', r'\|>', r'\]', r'\|\]', r'\{', r'\|', r'\}', r'\$'
+    )
+
+    operators = r'[!$%&*+\./:<=>?@^|~-]'
+    prefix_syms = r'[!?~]'
+    infix_syms = r'[=<>@^|&+\*/$%-]'
+    primitives = ('unit', 'int', 'float', 'bool', 'string', 'char', 'list', 'array')
+
+    tokens = {
+        'escape-sequence': [
+            (r'\\[\\"\'ntbr]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        ],
+        'root': [
+            (r'\s+', Text),
+            (r'false|true|False|True|\(\)|\[\]', Name.Builtin.Pseudo),
+            (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Namespace, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name.Class),
+            (r'\(\*(?![)])', Comment, 'comment'),
+            (r'\/\/.+$', Comment),
+            (r'\b({})\b'.format('|'.join(keywords)), Keyword),
+            (r'\b({})\b'.format('|'.join(assume_keywords)), Name.Exception),
+            (r'\b({})\b'.format('|'.join(decl_keywords)), Keyword.Declaration),
+            (r'({})'.format('|'.join(keyopts[::-1])), Operator),
+            (rf'({infix_syms}|{prefix_syms})?{operators}', Operator),
+            (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type),
+
+            (r"[^\W\d][\w']*", Name),
+
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'0[oO][0-7][0-7_]*', Number.Oct),
+            (r'0[bB][01][01_]*', Number.Bin),
+            (r'\d[\d_]*', Number.Integer),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'", Keyword),  # a stray quote is another syntax element
+            (r"\`([\w\'.]+)\`", Operator.Word),  # for infix applications
+            (r"\`", Keyword),  # for quoting
+            (r'"', String.Double, 'string'),
+
+            (r'[~?][a-z][\w\']*:', Name.Variable),
+        ],
+        'comment': [
+            (r'[^(*)]+', Comment),
+            (r'\(\*', Comment, '#push'),
+            (r'\*\)', Comment, '#pop'),
+            (r'[(*)]', Comment),
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            include('escape-sequence'),
+            (r'\\\n', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
+            (r'[A-Z][\w\']*', Name.Class, '#pop'),
+            (r'[a-z_][\w\']*', Name, '#pop'),
+            default('#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/modeling.py b/.venv/Lib/site-packages/pygments/lexers/modeling.py
new file mode 100644 (file)
index 0000000..d681e7f
--- /dev/null
@@ -0,0 +1,366 @@
+"""
+    pygments.lexers.modeling
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for modeling languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+from pygments.lexers.html import HtmlLexer
+from pygments.lexers import _stan_builtins
+
+__all__ = ['ModelicaLexer', 'BugsLexer', 'JagsLexer', 'StanLexer']
+
+
+class ModelicaLexer(RegexLexer):
+    """
+    For Modelica source code.
+    """
+    name = 'Modelica'
+    url = 'http://www.modelica.org/'
+    aliases = ['modelica']
+    filenames = ['*.mo']
+    mimetypes = ['text/x-modelica']
+    version_added = '1.1'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    _name = r"(?:'(?:[^\\']|\\.)+'|[a-zA-Z_]\w*)"
+
+    tokens = {
+        'whitespace': [
+            (r'[\s\ufeff]+', Text),
+            (r'//[^\n]*\n?', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'root': [
+            include('whitespace'),
+            (r'"', String.Double, 'string'),
+            (r'[()\[\]{},;]+', Punctuation),
+            (r'\.?[*^/+-]|\.|<>|[<>:=]=?', Operator),
+            (r'\d+(\.?\d*[eE][-+]?\d+|\.\d*)', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'(abs|acos|actualStream|array|asin|assert|AssertionLevel|atan|'
+             r'atan2|backSample|Boolean|cardinality|cat|ceil|change|Clock|'
+             r'Connections|cos|cosh|cross|delay|diagonal|div|edge|exp|'
+             r'ExternalObject|fill|floor|getInstanceName|hold|homotopy|'
+             r'identity|inStream|integer|Integer|interval|inverse|isPresent|'
+             r'linspace|log|log10|matrix|max|min|mod|ndims|noClock|noEvent|'
+             r'ones|outerProduct|pre|previous|product|Real|reinit|rem|rooted|'
+             r'sample|scalar|semiLinear|shiftSample|sign|sin|sinh|size|skew|'
+             r'smooth|spatialDistribution|sqrt|StateSelect|String|subSample|'
+             r'sum|superSample|symmetric|tan|tanh|terminal|terminate|time|'
+             r'transpose|vector|zeros)\b', Name.Builtin),
+            (r'(algorithm|annotation|break|connect|constant|constrainedby|der|'
+             r'discrete|each|else|elseif|elsewhen|encapsulated|enumeration|'
+             r'equation|exit|expandable|extends|external|firstTick|final|flow|for|if|'
+             r'import|impure|in|initial|inner|input|interval|loop|nondiscrete|outer|'
+             r'output|parameter|partial|protected|public|pure|redeclare|'
+             r'replaceable|return|stream|then|when|while)\b',
+             Keyword.Reserved),
+            (r'(and|not|or)\b', Operator.Word),
+            (r'(block|class|connector|end|function|model|operator|package|'
+             r'record|type)\b', Keyword.Reserved, 'class'),
+            (r'(false|true)\b', Keyword.Constant),
+            (r'within\b', Keyword.Reserved, 'package-prefix'),
+            (_name, Name)
+        ],
+        'class': [
+            include('whitespace'),
+            (r'(function|record)\b', Keyword.Reserved),
+            (r'(if|for|when|while)\b', Keyword.Reserved, '#pop'),
+            (_name, Name.Class, '#pop'),
+            default('#pop')
+        ],
+        'package-prefix': [
+            include('whitespace'),
+            (_name, Name.Namespace, '#pop'),
+            default('#pop')
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'\\[\'"?\\abfnrtv]', String.Escape),
+            (r'(?i)<\s*html\s*>([^\\"]|\\.)+?(<\s*/\s*html\s*>|(?="))',
+             using(HtmlLexer)),
+            (r'<|\\?[^"\\<]+', String.Double)
+        ]
+    }
+
+
+class BugsLexer(RegexLexer):
+    """
+    Pygments Lexer for OpenBugs and WinBugs
+    models.
+    """
+
+    name = 'BUGS'
+    aliases = ['bugs', 'winbugs', 'openbugs']
+    filenames = ['*.bug']
+    url = 'https://www.mrc-bsu.cam.ac.uk/software/bugs/openbugs'
+    version_added = '1.6'
+
+    _FUNCTIONS = (
+        # Scalar functions
+        'abs', 'arccos', 'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctanh',
+        'cloglog', 'cos', 'cosh', 'cumulative', 'cut', 'density', 'deviance',
+        'equals', 'expr', 'gammap', 'ilogit', 'icloglog', 'integral', 'log',
+        'logfact', 'loggam', 'logit', 'max', 'min', 'phi', 'post.p.value',
+        'pow', 'prior.p.value', 'probit', 'replicate.post', 'replicate.prior',
+        'round', 'sin', 'sinh', 'solution', 'sqrt', 'step', 'tan', 'tanh',
+        'trunc',
+        # Vector functions
+        'inprod', 'interp.lin', 'inverse', 'logdet', 'mean', 'eigen.vals',
+        'ode', 'prod', 'p.valueM', 'rank', 'ranked', 'replicate.postM',
+        'sd', 'sort', 'sum',
+        # Special
+        'D', 'I', 'F', 'T', 'C')
+    """ OpenBUGS built-in functions
+
+    From http://www.openbugs.info/Manuals/ModelSpecification.html#ContentsAII
+
+    This also includes
+
+    - T, C, I : Truncation and censoring.
+      ``T`` and ``C`` are in OpenBUGS. ``I`` in WinBUGS.
+    - D : ODE
+    - F : Functional http://www.openbugs.info/Examples/Functionals.html
+
+    """
+
+    _DISTRIBUTIONS = ('dbern', 'dbin', 'dcat', 'dnegbin', 'dpois',
+                      'dhyper', 'dbeta', 'dchisqr', 'ddexp', 'dexp',
+                      'dflat', 'dgamma', 'dgev', 'df', 'dggamma', 'dgpar',
+                      'dloglik', 'dlnorm', 'dlogis', 'dnorm', 'dpar',
+                      'dt', 'dunif', 'dweib', 'dmulti', 'ddirch', 'dmnorm',
+                      'dmt', 'dwish')
+    """ OpenBUGS built-in distributions
+
+    Functions from
+    http://www.openbugs.info/Manuals/ModelSpecification.html#ContentsAI
+    """
+
+    tokens = {
+        'whitespace': [
+            (r"\s+", Text),
+        ],
+        'comments': [
+            # Comments
+            (r'#.*$', Comment.Single),
+        ],
+        'root': [
+            # Comments
+            include('comments'),
+            include('whitespace'),
+            # Block start
+            (r'(model)(\s+)(\{)',
+             bygroups(Keyword.Namespace, Text, Punctuation)),
+            # Reserved Words
+            (r'(for|in)(?![\w.])', Keyword.Reserved),
+            # Built-in Functions
+            (r'({})(?=\s*\()'.format(r'|'.join(_FUNCTIONS + _DISTRIBUTIONS)),
+             Name.Builtin),
+            # Regular variable names
+            (r'[A-Za-z][\w.]*', Name),
+            # Number Literals
+            (r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', Number),
+            # Punctuation
+            (r'\[|\]|\(|\)|:|,|;', Punctuation),
+            # Assignment operators
+            # SLexer makes these tokens Operators.
+            (r'<-|~', Operator),
+            # Infix and prefix operators
+            (r'\+|-|\*|/', Operator),
+            # Block
+            (r'[{}]', Punctuation),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r"^\s*model\s*{", text, re.M):
+            return 0.7
+        else:
+            return 0.0
+
+
+class JagsLexer(RegexLexer):
+    """
+    Pygments Lexer for JAGS.
+    """
+
+    name = 'JAGS'
+    aliases = ['jags']
+    filenames = ['*.jag', '*.bug']
+    url = 'https://mcmc-jags.sourceforge.io'
+    version_added = '1.6'
+
+    # JAGS
+    _FUNCTIONS = (
+        'abs', 'arccos', 'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctanh',
+        'cos', 'cosh', 'cloglog',
+        'equals', 'exp', 'icloglog', 'ifelse', 'ilogit', 'log', 'logfact',
+        'loggam', 'logit', 'phi', 'pow', 'probit', 'round', 'sin', 'sinh',
+        'sqrt', 'step', 'tan', 'tanh', 'trunc', 'inprod', 'interp.lin',
+        'logdet', 'max', 'mean', 'min', 'prod', 'sum', 'sd', 'inverse',
+        'rank', 'sort', 't', 'acos', 'acosh', 'asin', 'asinh', 'atan',
+        # Truncation/Censoring (should I include)
+        'T', 'I')
+    # Distributions with density, probability and quartile functions
+    _DISTRIBUTIONS = tuple(f'[dpq]{x}' for x in
+                           ('bern', 'beta', 'dchiqsqr', 'ddexp', 'dexp',
+                            'df', 'gamma', 'gen.gamma', 'logis', 'lnorm',
+                            'negbin', 'nchisqr', 'norm', 'par', 'pois', 'weib'))
+    # Other distributions without density and probability
+    _OTHER_DISTRIBUTIONS = (
+        'dt', 'dunif', 'dbetabin', 'dbern', 'dbin', 'dcat', 'dhyper',
+        'ddirch', 'dmnorm', 'dwish', 'dmt', 'dmulti', 'dbinom', 'dchisq',
+        'dnbinom', 'dweibull', 'ddirich')
+
+    tokens = {
+        'whitespace': [
+            (r"\s+", Text),
+        ],
+        'names': [
+            # Regular variable names
+            (r'[a-zA-Z][\w.]*\b', Name),
+        ],
+        'comments': [
+            # do not use stateful comments
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+            # Comments
+            (r'#.*$', Comment.Single),
+        ],
+        'root': [
+            # Comments
+            include('comments'),
+            include('whitespace'),
+            # Block start
+            (r'(model|data)(\s+)(\{)',
+             bygroups(Keyword.Namespace, Text, Punctuation)),
+            (r'var(?![\w.])', Keyword.Declaration),
+            # Reserved Words
+            (r'(for|in)(?![\w.])', Keyword.Reserved),
+            # Builtins
+            # Need to use lookahead because . is a valid char
+            (r'({})(?=\s*\()'.format(r'|'.join(_FUNCTIONS
+                                          + _DISTRIBUTIONS
+                                          + _OTHER_DISTRIBUTIONS)),
+             Name.Builtin),
+            # Names
+            include('names'),
+            # Number Literals
+            (r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', Number),
+            (r'\[|\]|\(|\)|:|,|;', Punctuation),
+            # Assignment operators
+            (r'<-|~', Operator),
+            # # JAGS includes many more than OpenBUGS
+            (r'\+|-|\*|\/|\|\|[&]{2}|[<>=]=?|\^|%.*?%', Operator),
+            (r'[{}]', Punctuation),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\s*model\s*\{', text, re.M):
+            if re.search(r'^\s*data\s*\{', text, re.M):
+                return 0.9
+            elif re.search(r'^\s*var', text, re.M):
+                return 0.9
+            else:
+                return 0.3
+        else:
+            return 0
+
+
+class StanLexer(RegexLexer):
+    """Pygments Lexer for Stan models.
+
+    The Stan modeling language is specified in the *Stan Modeling Language
+    User's Guide and Reference Manual, v2.17.0*,
+    `pdf <https://github.com/stan-dev/stan/releases/download/v2.17.0/stan-reference-2.17.0.pdf>`__.
+    """
+
+    name = 'Stan'
+    aliases = ['stan']
+    filenames = ['*.stan']
+    url = 'https://mc-stan.org'
+    version_added = '1.6'
+
+    tokens = {
+        'whitespace': [
+            (r"\s+", Text),
+        ],
+        'comments': [
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+            # Comments
+            (r'(//|#).*$', Comment.Single),
+        ],
+        'root': [
+            (r'"[^"]*"', String),
+            # Comments
+            include('comments'),
+            # block start
+            include('whitespace'),
+            # Block start
+            (r'({})(\s*)(\{{)'.format(r'|'.join(('functions', 'data', r'transformed\s+?data',
+                        'parameters', r'transformed\s+parameters',
+                        'model', r'generated\s+quantities'))),
+             bygroups(Keyword.Namespace, Text, Punctuation)),
+            # target keyword
+            (r'target\s*\+=', Keyword),
+            # Reserved Words
+            (r'({})\b'.format(r'|'.join(_stan_builtins.KEYWORDS)), Keyword),
+            # Truncation
+            (r'T(?=\s*\[)', Keyword),
+            # Data types
+            (r'({})\b'.format(r'|'.join(_stan_builtins.TYPES)), Keyword.Type),
+             # < should be punctuation, but elsewhere I can't tell if it is in
+             # a range constraint
+            (r'(<)(\s*)(upper|lower|offset|multiplier)(\s*)(=)',
+             bygroups(Operator, Whitespace, Keyword, Whitespace, Punctuation)),
+            (r'(,)(\s*)(upper)(\s*)(=)',
+             bygroups(Punctuation, Whitespace, Keyword, Whitespace, Punctuation)),
+            # Punctuation
+            (r"[;,\[\]()]", Punctuation),
+            # Builtin
+            (r'({})(?=\s*\()'.format('|'.join(_stan_builtins.FUNCTIONS)), Name.Builtin),
+            (r'(~)(\s*)({})(?=\s*\()'.format('|'.join(_stan_builtins.DISTRIBUTIONS)),
+                bygroups(Operator, Whitespace, Name.Builtin)),
+            # Special names ending in __, like lp__
+            (r'[A-Za-z]\w*__\b', Name.Builtin.Pseudo),
+            (r'({})\b'.format(r'|'.join(_stan_builtins.RESERVED)), Keyword.Reserved),
+            # user-defined functions
+            (r'[A-Za-z]\w*(?=\s*\()]', Name.Function),
+            # Imaginary Literals
+            (r'[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?i', Number.Float),
+            (r'\.[0-9]+([eE][+-]?[0-9]+)?i', Number.Float),
+            (r'[0-9]+i', Number.Float),
+            # Real Literals
+            (r'[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\.[0-9]+([eE][+-]?[0-9]+)?', Number.Float),
+            # Integer Literals
+            (r'[0-9]+', Number.Integer),
+            # Regular variable names
+            (r'[A-Za-z]\w*\b', Name),
+            # Assignment operators
+            (r'<-|(?:\+|-|\.?/|\.?\*|=)?=|~', Operator),
+            # Infix, prefix and postfix operators (and = )
+            (r"\+|-|\.?\*|\.?/|\\|'|\.?\^|!=?|<=?|>=?|\|\||&&|%|\?|:|%/%|!", Operator),
+            # Block delimiters
+            (r'[{}]', Punctuation),
+            # Distribution |
+            (r'\|', Punctuation)
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\s*parameters\s*\{', text, re.M):
+            return 1.0
+        else:
+            return 0.0
diff --git a/.venv/Lib/site-packages/pygments/lexers/modula2.py b/.venv/Lib/site-packages/pygments/lexers/modula2.py
new file mode 100644 (file)
index 0000000..713f472
--- /dev/null
@@ -0,0 +1,1579 @@
+"""
+    pygments.lexers.modula2
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Multi-Dialect Lexer for Modula-2.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include
+from pygments.util import get_bool_opt, get_list_opt
+from pygments.token import Text, Comment, Operator, Keyword, Name, \
+    String, Number, Punctuation, Error
+
+__all__ = ['Modula2Lexer']
+
+
+# Multi-Dialect Modula-2 Lexer
+class Modula2Lexer(RegexLexer):
+    """
+    For Modula-2 source code.
+
+    The Modula-2 lexer supports several dialects.  By default, it operates in
+    fallback mode, recognising the *combined* literals, punctuation symbols
+    and operators of all supported dialects, and the *combined* reserved words
+    and builtins of PIM Modula-2, ISO Modula-2 and Modula-2 R10, while not
+    differentiating between library defined identifiers.
+
+    To select a specific dialect, a dialect option may be passed
+    or a dialect tag may be embedded into a source file.
+
+    Dialect Options:
+
+    `m2pim`
+        Select PIM Modula-2 dialect.
+    `m2iso`
+        Select ISO Modula-2 dialect.
+    `m2r10`
+        Select Modula-2 R10 dialect.
+    `objm2`
+        Select Objective Modula-2 dialect.
+
+    The PIM and ISO dialect options may be qualified with a language extension.
+
+    Language Extensions:
+
+    `+aglet`
+        Select Aglet Modula-2 extensions, available with m2iso.
+    `+gm2`
+        Select GNU Modula-2 extensions, available with m2pim.
+    `+p1`
+        Select p1 Modula-2 extensions, available with m2iso.
+    `+xds`
+        Select XDS Modula-2 extensions, available with m2iso.
+
+
+    Passing a Dialect Option via Unix Commandline Interface
+
+    Dialect options may be passed to the lexer using the `dialect` key.
+    Only one such option should be passed. If multiple dialect options are
+    passed, the first valid option is used, any subsequent options are ignored.
+
+    Examples:
+
+    `$ pygmentize -O full,dialect=m2iso -f html -o /path/to/output /path/to/input`
+        Use ISO dialect to render input to HTML output
+    `$ pygmentize -O full,dialect=m2iso+p1 -f rtf -o /path/to/output /path/to/input`
+        Use ISO dialect with p1 extensions to render input to RTF output
+
+
+    Embedding a Dialect Option within a source file
+
+    A dialect option may be embedded in a source file in form of a dialect
+    tag, a specially formatted comment that specifies a dialect option.
+
+    Dialect Tag EBNF::
+
+       dialectTag :
+           OpeningCommentDelim Prefix dialectOption ClosingCommentDelim ;
+
+       dialectOption :
+           'm2pim' | 'm2iso' | 'm2r10' | 'objm2' |
+           'm2iso+aglet' | 'm2pim+gm2' | 'm2iso+p1' | 'm2iso+xds' ;
+
+       Prefix : '!' ;
+
+       OpeningCommentDelim : '(*' ;
+
+       ClosingCommentDelim : '*)' ;
+
+    No whitespace is permitted between the tokens of a dialect tag.
+
+    In the event that a source file contains multiple dialect tags, the first
+    tag that contains a valid dialect option will be used and any subsequent
+    dialect tags will be ignored.  Ideally, a dialect tag should be placed
+    at the beginning of a source file.
+
+    An embedded dialect tag overrides a dialect option set via command line.
+
+    Examples:
+
+    ``(*!m2r10*) DEFINITION MODULE Foobar; ...``
+        Use Modula2 R10 dialect to render this source file.
+    ``(*!m2pim+gm2*) DEFINITION MODULE Bazbam; ...``
+        Use PIM dialect with GNU extensions to render this source file.
+
+
+    Algol Publication Mode:
+
+    In Algol publication mode, source text is rendered for publication of
+    algorithms in scientific papers and academic texts, following the format
+    of the Revised Algol-60 Language Report.  It is activated by passing
+    one of two corresponding styles as an option:
+
+    `algol`
+        render reserved words lowercase underline boldface
+        and builtins lowercase boldface italic
+    `algol_nu`
+        render reserved words lowercase boldface (no underlining)
+        and builtins lowercase boldface italic
+
+    The lexer automatically performs the required lowercase conversion when
+    this mode is activated.
+
+    Example:
+
+    ``$ pygmentize -O full,style=algol -f latex -o /path/to/output /path/to/input``
+        Render input file in Algol publication mode to LaTeX output.
+
+
+    Rendering Mode of First Class ADT Identifiers:
+
+    The rendering of standard library first class ADT identifiers is controlled
+    by option flag "treat_stdlib_adts_as_builtins".
+
+    When this option is turned on, standard library ADT identifiers are rendered
+    as builtins.  When it is turned off, they are rendered as ordinary library
+    identifiers.
+
+    `treat_stdlib_adts_as_builtins` (default: On)
+
+    The option is useful for dialects that support ADTs as first class objects
+    and provide ADTs in the standard library that would otherwise be built-in.
+
+    At present, only Modula-2 R10 supports library ADTs as first class objects
+    and therefore, no ADT identifiers are defined for any other dialects.
+
+    Example:
+
+    ``$ pygmentize -O full,dialect=m2r10,treat_stdlib_adts_as_builtins=Off ...``
+        Render standard library ADTs as ordinary library types.
+
+    .. versionchanged:: 2.1
+       Added multi-dialect support.
+    """
+    name = 'Modula-2'
+    url = 'http://www.modula2.org/'
+    aliases = ['modula2', 'm2']
+    filenames = ['*.def', '*.mod']
+    mimetypes = ['text/x-modula2']
+    version_added = '1.3'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'whitespace': [
+            (r'\n+', Text),  # blank lines
+            (r'\s+', Text),  # whitespace
+        ],
+        'dialecttags': [
+            # PIM Dialect Tag
+            (r'\(\*!m2pim\*\)', Comment.Special),
+            # ISO Dialect Tag
+            (r'\(\*!m2iso\*\)', Comment.Special),
+            # M2R10 Dialect Tag
+            (r'\(\*!m2r10\*\)', Comment.Special),
+            # ObjM2 Dialect Tag
+            (r'\(\*!objm2\*\)', Comment.Special),
+            # Aglet Extensions Dialect Tag
+            (r'\(\*!m2iso\+aglet\*\)', Comment.Special),
+            # GNU Extensions Dialect Tag
+            (r'\(\*!m2pim\+gm2\*\)', Comment.Special),
+            # p1 Extensions Dialect Tag
+            (r'\(\*!m2iso\+p1\*\)', Comment.Special),
+            # XDS Extensions Dialect Tag
+            (r'\(\*!m2iso\+xds\*\)', Comment.Special),
+        ],
+        'identifiers': [
+            (r'([a-zA-Z_$][\w$]*)', Name),
+        ],
+        'prefixed_number_literals': [
+            #
+            # Base-2, whole number
+            (r'0b[01]+(\'[01]+)*', Number.Bin),
+            #
+            # Base-16, whole number
+            (r'0[ux][0-9A-F]+(\'[0-9A-F]+)*', Number.Hex),
+        ],
+        'plain_number_literals': [
+            #
+            # Base-10, real number with exponent
+            (r'[0-9]+(\'[0-9]+)*'  # integral part
+             r'\.[0-9]+(\'[0-9]+)*'  # fractional part
+             r'[eE][+-]?[0-9]+(\'[0-9]+)*',  # exponent
+             Number.Float),
+            #
+            # Base-10, real number without exponent
+            (r'[0-9]+(\'[0-9]+)*'  # integral part
+             r'\.[0-9]+(\'[0-9]+)*',  # fractional part
+             Number.Float),
+            #
+            # Base-10, whole number
+            (r'[0-9]+(\'[0-9]+)*', Number.Integer),
+        ],
+        'suffixed_number_literals': [
+            #
+            # Base-8, whole number
+            (r'[0-7]+B', Number.Oct),
+            #
+            # Base-8, character code
+            (r'[0-7]+C', Number.Oct),
+            #
+            # Base-16, number
+            (r'[0-9A-F]+H', Number.Hex),
+        ],
+        'string_literals': [
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ],
+        'digraph_operators': [
+            # Dot Product Operator
+            (r'\*\.', Operator),
+            # Array Concatenation Operator
+            (r'\+>', Operator),  # M2R10 + ObjM2
+            # Inequality Operator
+            (r'<>', Operator),  # ISO + PIM
+            # Less-Or-Equal, Subset
+            (r'<=', Operator),
+            # Greater-Or-Equal, Superset
+            (r'>=', Operator),
+            # Identity Operator
+            (r'==', Operator),  # M2R10 + ObjM2
+            # Type Conversion Operator
+            (r'::', Operator),  # M2R10 + ObjM2
+            # Assignment Symbol
+            (r':=', Operator),
+            # Postfix Increment Mutator
+            (r'\+\+', Operator),  # M2R10 + ObjM2
+            # Postfix Decrement Mutator
+            (r'--', Operator),  # M2R10 + ObjM2
+        ],
+        'unigraph_operators': [
+            # Arithmetic Operators
+            (r'[+-]', Operator),
+            (r'[*/]', Operator),
+            # ISO 80000-2 compliant Set Difference Operator
+            (r'\\', Operator),  # M2R10 + ObjM2
+            # Relational Operators
+            (r'[=#<>]', Operator),
+            # Dereferencing Operator
+            (r'\^', Operator),
+            # Dereferencing Operator Synonym
+            (r'@', Operator),  # ISO
+            # Logical AND Operator Synonym
+            (r'&', Operator),  # PIM + ISO
+            # Logical NOT Operator Synonym
+            (r'~', Operator),  # PIM + ISO
+            # Smalltalk Message Prefix
+            (r'`', Operator),  # ObjM2
+        ],
+        'digraph_punctuation': [
+            # Range Constructor
+            (r'\.\.', Punctuation),
+            # Opening Chevron Bracket
+            (r'<<', Punctuation),  # M2R10 + ISO
+            # Closing Chevron Bracket
+            (r'>>', Punctuation),  # M2R10 + ISO
+            # Blueprint Punctuation
+            (r'->', Punctuation),  # M2R10 + ISO
+            # Distinguish |# and # in M2 R10
+            (r'\|#', Punctuation),
+            # Distinguish ## and # in M2 R10
+            (r'##', Punctuation),
+            # Distinguish |* and * in M2 R10
+            (r'\|\*', Punctuation),
+        ],
+        'unigraph_punctuation': [
+            # Common Punctuation
+            (r'[()\[\]{},.:;|]', Punctuation),
+            # Case Label Separator Synonym
+            (r'!', Punctuation),  # ISO
+            # Blueprint Punctuation
+            (r'\?', Punctuation),  # M2R10 + ObjM2
+        ],
+        'comments': [
+            # Single Line Comment
+            (r'^//.*?\n', Comment.Single),  # M2R10 + ObjM2
+            # Block Comment
+            (r'\(\*([^$].*?)\*\)', Comment.Multiline),
+            # Template Block Comment
+            (r'/\*(.*?)\*/', Comment.Multiline),  # M2R10 + ObjM2
+        ],
+        'pragmas': [
+            # ISO Style Pragmas
+            (r'<\*.*?\*>', Comment.Preproc),  # ISO, M2R10 + ObjM2
+            # Pascal Style Pragmas
+            (r'\(\*\$.*?\*\)', Comment.Preproc),  # PIM
+        ],
+        'root': [
+            include('whitespace'),
+            include('dialecttags'),
+            include('pragmas'),
+            include('comments'),
+            include('identifiers'),
+            include('suffixed_number_literals'),  # PIM + ISO
+            include('prefixed_number_literals'),  # M2R10 + ObjM2
+            include('plain_number_literals'),
+            include('string_literals'),
+            include('digraph_punctuation'),
+            include('digraph_operators'),
+            include('unigraph_punctuation'),
+            include('unigraph_operators'),
+        ]
+    }
+
+#  C o m m o n   D a t a s e t s
+
+    # Common Reserved Words Dataset
+    common_reserved_words = (
+        # 37 common reserved words
+        'AND', 'ARRAY', 'BEGIN', 'BY', 'CASE', 'CONST', 'DEFINITION', 'DIV',
+        'DO', 'ELSE', 'ELSIF', 'END', 'EXIT', 'FOR', 'FROM', 'IF',
+        'IMPLEMENTATION', 'IMPORT', 'IN', 'LOOP', 'MOD', 'MODULE', 'NOT',
+        'OF', 'OR', 'POINTER', 'PROCEDURE', 'RECORD', 'REPEAT', 'RETURN',
+        'SET', 'THEN', 'TO', 'TYPE', 'UNTIL', 'VAR', 'WHILE',
+    )
+
+    # Common Builtins Dataset
+    common_builtins = (
+        # 16 common builtins
+        'ABS', 'BOOLEAN', 'CARDINAL', 'CHAR', 'CHR', 'FALSE', 'INTEGER',
+        'LONGINT', 'LONGREAL', 'MAX', 'MIN', 'NIL', 'ODD', 'ORD', 'REAL',
+        'TRUE',
+    )
+
+    # Common Pseudo-Module Builtins Dataset
+    common_pseudo_builtins = (
+        # 4 common pseudo builtins
+        'ADDRESS', 'BYTE', 'WORD', 'ADR'
+    )
+
+#  P I M   M o d u l a - 2   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for PIM Modula-2
+    pim_lexemes_to_reject = (
+        '!', '`', '@', '$', '%', '?', '\\', '==', '++', '--', '::', '*.',
+        '+>', '->', '<<', '>>', '|#', '##',
+    )
+
+    # PIM Modula-2 Additional Reserved Words Dataset
+    pim_additional_reserved_words = (
+        # 3 additional reserved words
+        'EXPORT', 'QUALIFIED', 'WITH',
+    )
+
+    # PIM Modula-2 Additional Builtins Dataset
+    pim_additional_builtins = (
+        # 16 additional builtins
+        'BITSET', 'CAP', 'DEC', 'DISPOSE', 'EXCL', 'FLOAT', 'HALT', 'HIGH',
+        'INC', 'INCL', 'NEW', 'NIL', 'PROC', 'SIZE', 'TRUNC', 'VAL',
+    )
+
+    # PIM Modula-2 Additional Pseudo-Module Builtins Dataset
+    pim_additional_pseudo_builtins = (
+        # 5 additional pseudo builtins
+        'SYSTEM', 'PROCESS', 'TSIZE', 'NEWPROCESS', 'TRANSFER',
+    )
+
+#  I S O   M o d u l a - 2   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for ISO Modula-2
+    iso_lexemes_to_reject = (
+        '`', '$', '%', '?', '\\', '==', '++', '--', '::', '*.', '+>', '->',
+        '<<', '>>', '|#', '##',
+    )
+
+    # ISO Modula-2 Additional Reserved Words Dataset
+    iso_additional_reserved_words = (
+        # 9 additional reserved words (ISO 10514-1)
+        'EXCEPT', 'EXPORT', 'FINALLY', 'FORWARD', 'PACKEDSET', 'QUALIFIED',
+        'REM', 'RETRY', 'WITH',
+        # 10 additional reserved words (ISO 10514-2 & ISO 10514-3)
+        'ABSTRACT', 'AS', 'CLASS', 'GUARD', 'INHERIT', 'OVERRIDE', 'READONLY',
+        'REVEAL', 'TRACED', 'UNSAFEGUARDED',
+    )
+
+    # ISO Modula-2 Additional Builtins Dataset
+    iso_additional_builtins = (
+        # 26 additional builtins (ISO 10514-1)
+        'BITSET', 'CAP', 'CMPLX', 'COMPLEX', 'DEC', 'DISPOSE', 'EXCL', 'FLOAT',
+        'HALT', 'HIGH', 'IM', 'INC', 'INCL', 'INT', 'INTERRUPTIBLE',  'LENGTH',
+        'LFLOAT', 'LONGCOMPLEX', 'NEW', 'PROC', 'PROTECTION', 'RE', 'SIZE',
+        'TRUNC', 'UNINTERRUBTIBLE', 'VAL',
+        # 5 additional builtins (ISO 10514-2 & ISO 10514-3)
+        'CREATE', 'DESTROY', 'EMPTY', 'ISMEMBER', 'SELF',
+    )
+
+    # ISO Modula-2 Additional Pseudo-Module Builtins Dataset
+    iso_additional_pseudo_builtins = (
+        # 14 additional builtins (SYSTEM)
+        'SYSTEM', 'BITSPERLOC', 'LOCSPERBYTE', 'LOCSPERWORD', 'LOC',
+        'ADDADR', 'SUBADR', 'DIFADR', 'MAKEADR', 'ADR',
+        'ROTATE', 'SHIFT', 'CAST', 'TSIZE',
+        # 13 additional builtins (COROUTINES)
+        'COROUTINES', 'ATTACH', 'COROUTINE', 'CURRENT', 'DETACH', 'HANDLER',
+        'INTERRUPTSOURCE', 'IOTRANSFER', 'IsATTACHED', 'LISTEN',
+        'NEWCOROUTINE', 'PROT', 'TRANSFER',
+        # 9 additional builtins (EXCEPTIONS)
+        'EXCEPTIONS', 'AllocateSource', 'CurrentNumber', 'ExceptionNumber',
+        'ExceptionSource', 'GetMessage', 'IsCurrentSource',
+        'IsExceptionalExecution', 'RAISE',
+        # 3 additional builtins (TERMINATION)
+        'TERMINATION', 'IsTerminating', 'HasHalted',
+        # 4 additional builtins (M2EXCEPTION)
+        'M2EXCEPTION', 'M2Exceptions', 'M2Exception', 'IsM2Exception',
+        'indexException', 'rangeException', 'caseSelectException',
+        'invalidLocation', 'functionException', 'wholeValueException',
+        'wholeDivException', 'realValueException', 'realDivException',
+        'complexValueException', 'complexDivException', 'protException',
+        'sysException', 'coException', 'exException',
+    )
+
+#  M o d u l a - 2   R 1 0   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for Modula-2 R10
+    m2r10_lexemes_to_reject = (
+        '!', '`', '@', '$', '%', '&', '<>',
+    )
+
+    # Modula-2 R10 reserved words in addition to the common set
+    m2r10_additional_reserved_words = (
+        # 12 additional reserved words
+        'ALIAS', 'ARGLIST', 'BLUEPRINT', 'COPY', 'GENLIB', 'INDETERMINATE',
+        'NEW', 'NONE', 'OPAQUE', 'REFERENTIAL', 'RELEASE', 'RETAIN',
+        # 2 additional reserved words with symbolic assembly option
+        'ASM', 'REG',
+    )
+
+    # Modula-2 R10 builtins in addition to the common set
+    m2r10_additional_builtins = (
+        # 26 additional builtins
+        'CARDINAL', 'COUNT', 'EMPTY', 'EXISTS', 'INSERT', 'LENGTH', 'LONGCARD',
+        'OCTET', 'PTR', 'PRED', 'READ', 'READNEW', 'REMOVE', 'RETRIEVE', 'SORT',
+        'STORE', 'SUBSET', 'SUCC', 'TLIMIT', 'TMAX', 'TMIN', 'TRUE', 'TSIZE',
+        'UNICHAR', 'WRITE', 'WRITEF',
+    )
+
+    # Modula-2 R10 Additional Pseudo-Module Builtins Dataset
+    m2r10_additional_pseudo_builtins = (
+        # 13 additional builtins (TPROPERTIES)
+        'TPROPERTIES', 'PROPERTY', 'LITERAL', 'TPROPERTY', 'TLITERAL',
+        'TBUILTIN', 'TDYN', 'TREFC', 'TNIL', 'TBASE', 'TPRECISION',
+        'TMAXEXP', 'TMINEXP',
+        # 4 additional builtins (CONVERSION)
+        'CONVERSION', 'TSXFSIZE', 'SXF', 'VAL',
+        # 35 additional builtins (UNSAFE)
+        'UNSAFE', 'CAST', 'INTRINSIC', 'AVAIL', 'ADD', 'SUB', 'ADDC', 'SUBC',
+        'FETCHADD', 'FETCHSUB', 'SHL', 'SHR', 'ASHR', 'ROTL', 'ROTR', 'ROTLC',
+        'ROTRC', 'BWNOT', 'BWAND', 'BWOR', 'BWXOR', 'BWNAND', 'BWNOR',
+        'SETBIT', 'TESTBIT', 'LSBIT', 'MSBIT', 'CSBITS', 'BAIL', 'HALT',
+        'TODO', 'FFI', 'ADDR', 'VARGLIST', 'VARGC',
+        # 11 additional builtins (ATOMIC)
+        'ATOMIC', 'INTRINSIC', 'AVAIL', 'SWAP', 'CAS', 'INC', 'DEC', 'BWAND',
+        'BWNAND', 'BWOR', 'BWXOR',
+        # 7 additional builtins (COMPILER)
+        'COMPILER', 'DEBUG', 'MODNAME', 'PROCNAME', 'LINENUM', 'DEFAULT',
+        'HASH',
+        # 5 additional builtins (ASSEMBLER)
+        'ASSEMBLER', 'REGISTER', 'SETREG', 'GETREG', 'CODE',
+    )
+
+#  O b j e c t i v e   M o d u l a - 2   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for Objective Modula-2
+    objm2_lexemes_to_reject = (
+        '!', '$', '%', '&', '<>',
+    )
+
+    # Objective Modula-2 Extensions
+    # reserved words in addition to Modula-2 R10
+    objm2_additional_reserved_words = (
+        # 16 additional reserved words
+        'BYCOPY', 'BYREF', 'CLASS', 'CONTINUE', 'CRITICAL', 'INOUT', 'METHOD',
+        'ON', 'OPTIONAL', 'OUT', 'PRIVATE', 'PROTECTED', 'PROTOCOL', 'PUBLIC',
+        'SUPER', 'TRY',
+    )
+
+    # Objective Modula-2 Extensions
+    # builtins in addition to Modula-2 R10
+    objm2_additional_builtins = (
+        # 3 additional builtins
+        'OBJECT', 'NO', 'YES',
+    )
+
+    # Objective Modula-2 Extensions
+    # pseudo-module builtins in addition to Modula-2 R10
+    objm2_additional_pseudo_builtins = (
+        # None
+    )
+
+#  A g l e t   M o d u l a - 2   D a t a s e t s
+
+    # Aglet Extensions
+    # reserved words in addition to ISO Modula-2
+    aglet_additional_reserved_words = (
+        # None
+    )
+
+    # Aglet Extensions
+    # builtins in addition to ISO Modula-2
+    aglet_additional_builtins = (
+        # 9 additional builtins
+        'BITSET8', 'BITSET16', 'BITSET32', 'CARDINAL8', 'CARDINAL16',
+        'CARDINAL32', 'INTEGER8', 'INTEGER16', 'INTEGER32',
+    )
+
+    # Aglet Modula-2 Extensions
+    # pseudo-module builtins in addition to ISO Modula-2
+    aglet_additional_pseudo_builtins = (
+        # None
+    )
+
+#  G N U   M o d u l a - 2   D a t a s e t s
+
+    # GNU Extensions
+    # reserved words in addition to PIM Modula-2
+    gm2_additional_reserved_words = (
+        # 10 additional reserved words
+        'ASM', '__ATTRIBUTE__', '__BUILTIN__', '__COLUMN__', '__DATE__',
+        '__FILE__', '__FUNCTION__', '__LINE__', '__MODULE__', 'VOLATILE',
+    )
+
+    # GNU Extensions
+    # builtins in addition to PIM Modula-2
+    gm2_additional_builtins = (
+        # 21 additional builtins
+        'BITSET8', 'BITSET16', 'BITSET32', 'CARDINAL8', 'CARDINAL16',
+        'CARDINAL32', 'CARDINAL64', 'COMPLEX32', 'COMPLEX64', 'COMPLEX96',
+        'COMPLEX128', 'INTEGER8', 'INTEGER16', 'INTEGER32', 'INTEGER64',
+        'REAL8', 'REAL16', 'REAL32', 'REAL96', 'REAL128', 'THROW',
+    )
+
+    # GNU Extensions
+    # pseudo-module builtins in addition to PIM Modula-2
+    gm2_additional_pseudo_builtins = (
+        # None
+    )
+
+#  p 1   M o d u l a - 2   D a t a s e t s
+
+    # p1 Extensions
+    # reserved words in addition to ISO Modula-2
+    p1_additional_reserved_words = (
+        # None
+    )
+
+    # p1 Extensions
+    # builtins in addition to ISO Modula-2
+    p1_additional_builtins = (
+        # None
+    )
+
+    # p1 Modula-2 Extensions
+    # pseudo-module builtins in addition to ISO Modula-2
+    p1_additional_pseudo_builtins = (
+        # 1 additional builtin
+        'BCD',
+    )
+
+#  X D S   M o d u l a - 2   D a t a s e t s
+
+    # XDS Extensions
+    # reserved words in addition to ISO Modula-2
+    xds_additional_reserved_words = (
+        # 1 additional reserved word
+        'SEQ',
+    )
+
+    # XDS Extensions
+    # builtins in addition to ISO Modula-2
+    xds_additional_builtins = (
+        # 9 additional builtins
+        'ASH', 'ASSERT', 'DIFFADR_TYPE', 'ENTIER', 'INDEX', 'LEN',
+        'LONGCARD', 'SHORTCARD', 'SHORTINT',
+    )
+
+    # XDS Modula-2 Extensions
+    # pseudo-module builtins in addition to ISO Modula-2
+    xds_additional_pseudo_builtins = (
+        # 22 additional builtins (SYSTEM)
+        'PROCESS', 'NEWPROCESS', 'BOOL8', 'BOOL16', 'BOOL32', 'CARD8',
+        'CARD16', 'CARD32', 'INT8', 'INT16', 'INT32', 'REF', 'MOVE',
+        'FILL', 'GET', 'PUT', 'CC', 'int', 'unsigned', 'size_t', 'void'
+        # 3 additional builtins (COMPILER)
+        'COMPILER', 'OPTION', 'EQUATION'
+    )
+
+#  P I M   S t a n d a r d   L i b r a r y   D a t a s e t s
+
+    # PIM Modula-2 Standard Library Modules Dataset
+    pim_stdlib_module_identifiers = (
+        'Terminal', 'FileSystem', 'InOut', 'RealInOut', 'MathLib0', 'Storage',
+    )
+
+    # PIM Modula-2 Standard Library Types Dataset
+    pim_stdlib_type_identifiers = (
+        'Flag', 'FlagSet', 'Response', 'Command', 'Lock', 'Permission',
+        'MediumType', 'File', 'FileProc', 'DirectoryProc', 'FileCommand',
+        'DirectoryCommand',
+    )
+
+    # PIM Modula-2 Standard Library Procedures Dataset
+    pim_stdlib_proc_identifiers = (
+        'Read', 'BusyRead', 'ReadAgain', 'Write', 'WriteString', 'WriteLn',
+        'Create', 'Lookup', 'Close', 'Delete', 'Rename', 'SetRead', 'SetWrite',
+        'SetModify', 'SetOpen', 'Doio', 'SetPos', 'GetPos', 'Length', 'Reset',
+        'Again', 'ReadWord', 'WriteWord', 'ReadChar', 'WriteChar',
+        'CreateMedium', 'DeleteMedium', 'AssignName', 'DeassignName',
+        'ReadMedium', 'LookupMedium', 'OpenInput', 'OpenOutput', 'CloseInput',
+        'CloseOutput', 'ReadString', 'ReadInt', 'ReadCard', 'ReadWrd',
+        'WriteInt', 'WriteCard', 'WriteOct', 'WriteHex', 'WriteWrd',
+        'ReadReal', 'WriteReal', 'WriteFixPt', 'WriteRealOct', 'sqrt', 'exp',
+        'ln', 'sin', 'cos', 'arctan', 'entier', 'ALLOCATE', 'DEALLOCATE',
+    )
+
+    # PIM Modula-2 Standard Library Variables Dataset
+    pim_stdlib_var_identifiers = (
+        'Done', 'termCH', 'in', 'out'
+    )
+
+    # PIM Modula-2 Standard Library Constants Dataset
+    pim_stdlib_const_identifiers = (
+        'EOL',
+    )
+
+#  I S O   S t a n d a r d   L i b r a r y   D a t a s e t s
+
+    # ISO Modula-2 Standard Library Modules Dataset
+    iso_stdlib_module_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Types Dataset
+    iso_stdlib_type_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Procedures Dataset
+    iso_stdlib_proc_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Variables Dataset
+    iso_stdlib_var_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Constants Dataset
+    iso_stdlib_const_identifiers = (
+        # TO DO
+    )
+
+#  M 2   R 1 0   S t a n d a r d   L i b r a r y   D a t a s e t s
+
+    # Modula-2 R10 Standard Library ADTs Dataset
+    m2r10_stdlib_adt_identifiers = (
+        'BCD', 'LONGBCD', 'BITSET', 'SHORTBITSET', 'LONGBITSET',
+        'LONGLONGBITSET', 'COMPLEX', 'LONGCOMPLEX', 'SHORTCARD', 'LONGLONGCARD',
+        'SHORTINT', 'LONGLONGINT', 'POSINT', 'SHORTPOSINT', 'LONGPOSINT',
+        'LONGLONGPOSINT', 'BITSET8', 'BITSET16', 'BITSET32', 'BITSET64',
+        'BITSET128', 'BS8', 'BS16', 'BS32', 'BS64', 'BS128', 'CARDINAL8',
+        'CARDINAL16', 'CARDINAL32', 'CARDINAL64', 'CARDINAL128', 'CARD8',
+        'CARD16', 'CARD32', 'CARD64', 'CARD128', 'INTEGER8', 'INTEGER16',
+        'INTEGER32', 'INTEGER64', 'INTEGER128', 'INT8', 'INT16', 'INT32',
+        'INT64', 'INT128', 'STRING', 'UNISTRING',
+    )
+
+    # Modula-2 R10 Standard Library Blueprints Dataset
+    m2r10_stdlib_blueprint_identifiers = (
+        'ProtoRoot', 'ProtoComputational', 'ProtoNumeric', 'ProtoScalar',
+        'ProtoNonScalar', 'ProtoCardinal', 'ProtoInteger', 'ProtoReal',
+        'ProtoComplex', 'ProtoVector', 'ProtoTuple', 'ProtoCompArray',
+        'ProtoCollection', 'ProtoStaticArray', 'ProtoStaticSet',
+        'ProtoStaticString', 'ProtoArray', 'ProtoString', 'ProtoSet',
+        'ProtoMultiSet', 'ProtoDictionary', 'ProtoMultiDict', 'ProtoExtension',
+        'ProtoIO', 'ProtoCardMath', 'ProtoIntMath', 'ProtoRealMath',
+    )
+
+    # Modula-2 R10 Standard Library Modules Dataset
+    m2r10_stdlib_module_identifiers = (
+        'ASCII', 'BooleanIO', 'CharIO', 'UnicharIO', 'OctetIO',
+        'CardinalIO', 'LongCardIO', 'IntegerIO', 'LongIntIO', 'RealIO',
+        'LongRealIO', 'BCDIO', 'LongBCDIO', 'CardMath', 'LongCardMath',
+        'IntMath', 'LongIntMath', 'RealMath', 'LongRealMath', 'BCDMath',
+        'LongBCDMath', 'FileIO', 'FileSystem', 'Storage', 'IOSupport',
+    )
+
+    # Modula-2 R10 Standard Library Types Dataset
+    m2r10_stdlib_type_identifiers = (
+        'File', 'Status',
+        # TO BE COMPLETED
+    )
+
+    # Modula-2 R10 Standard Library Procedures Dataset
+    m2r10_stdlib_proc_identifiers = (
+        'ALLOCATE', 'DEALLOCATE', 'SIZE',
+        # TO BE COMPLETED
+    )
+
+    # Modula-2 R10 Standard Library Variables Dataset
+    m2r10_stdlib_var_identifiers = (
+        'stdIn', 'stdOut', 'stdErr',
+    )
+
+    # Modula-2 R10 Standard Library Constants Dataset
+    m2r10_stdlib_const_identifiers = (
+        'pi', 'tau',
+    )
+
+#  D i a l e c t s
+
+    # Dialect modes
+    dialects = (
+        'unknown',
+        'm2pim', 'm2iso', 'm2r10', 'objm2',
+        'm2iso+aglet', 'm2pim+gm2', 'm2iso+p1', 'm2iso+xds',
+    )
+
+#   D a t a b a s e s
+
+    # Lexemes to Mark as Errors Database
+    lexemes_to_reject_db = {
+        # Lexemes to reject for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Lexemes to reject for PIM Modula-2
+        'm2pim': (
+            pim_lexemes_to_reject,
+        ),
+        # Lexemes to reject for ISO Modula-2
+        'm2iso': (
+            iso_lexemes_to_reject,
+        ),
+        # Lexemes to reject for Modula-2 R10
+        'm2r10': (
+            m2r10_lexemes_to_reject,
+        ),
+        # Lexemes to reject for Objective Modula-2
+        'objm2': (
+            objm2_lexemes_to_reject,
+        ),
+        # Lexemes to reject for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_lexemes_to_reject,
+        ),
+        # Lexemes to reject for GNU Modula-2
+        'm2pim+gm2': (
+            pim_lexemes_to_reject,
+        ),
+        # Lexemes to reject for p1 Modula-2
+        'm2iso+p1': (
+            iso_lexemes_to_reject,
+        ),
+        # Lexemes to reject for XDS Modula-2
+        'm2iso+xds': (
+            iso_lexemes_to_reject,
+        ),
+    }
+
+    # Reserved Words Database
+    reserved_words_db = {
+        # Reserved words for unknown dialect
+        'unknown': (
+            common_reserved_words,
+            pim_additional_reserved_words,
+            iso_additional_reserved_words,
+            m2r10_additional_reserved_words,
+        ),
+
+        # Reserved words for PIM Modula-2
+        'm2pim': (
+            common_reserved_words,
+            pim_additional_reserved_words,
+        ),
+
+        # Reserved words for Modula-2 R10
+        'm2iso': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+        ),
+
+        # Reserved words for ISO Modula-2
+        'm2r10': (
+            common_reserved_words,
+            m2r10_additional_reserved_words,
+        ),
+
+        # Reserved words for Objective Modula-2
+        'objm2': (
+            common_reserved_words,
+            m2r10_additional_reserved_words,
+            objm2_additional_reserved_words,
+        ),
+
+        # Reserved words for Aglet Modula-2 Extensions
+        'm2iso+aglet': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+            aglet_additional_reserved_words,
+        ),
+
+        # Reserved words for GNU Modula-2 Extensions
+        'm2pim+gm2': (
+            common_reserved_words,
+            pim_additional_reserved_words,
+            gm2_additional_reserved_words,
+        ),
+
+        # Reserved words for p1 Modula-2 Extensions
+        'm2iso+p1': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+            p1_additional_reserved_words,
+        ),
+
+        # Reserved words for XDS Modula-2 Extensions
+        'm2iso+xds': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+            xds_additional_reserved_words,
+        ),
+    }
+
+    # Builtins Database
+    builtins_db = {
+        # Builtins for unknown dialect
+        'unknown': (
+            common_builtins,
+            pim_additional_builtins,
+            iso_additional_builtins,
+            m2r10_additional_builtins,
+        ),
+
+        # Builtins for PIM Modula-2
+        'm2pim': (
+            common_builtins,
+            pim_additional_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2iso': (
+            common_builtins,
+            iso_additional_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2r10': (
+            common_builtins,
+            m2r10_additional_builtins,
+        ),
+
+        # Builtins for Objective Modula-2
+        'objm2': (
+            common_builtins,
+            m2r10_additional_builtins,
+            objm2_additional_builtins,
+        ),
+
+        # Builtins for Aglet Modula-2 Extensions
+        'm2iso+aglet': (
+            common_builtins,
+            iso_additional_builtins,
+            aglet_additional_builtins,
+        ),
+
+        # Builtins for GNU Modula-2 Extensions
+        'm2pim+gm2': (
+            common_builtins,
+            pim_additional_builtins,
+            gm2_additional_builtins,
+        ),
+
+        # Builtins for p1 Modula-2 Extensions
+        'm2iso+p1': (
+            common_builtins,
+            iso_additional_builtins,
+            p1_additional_builtins,
+        ),
+
+        # Builtins for XDS Modula-2 Extensions
+        'm2iso+xds': (
+            common_builtins,
+            iso_additional_builtins,
+            xds_additional_builtins,
+        ),
+    }
+
+    # Pseudo-Module Builtins Database
+    pseudo_builtins_db = {
+        # Builtins for unknown dialect
+        'unknown': (
+            common_pseudo_builtins,
+            pim_additional_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            m2r10_additional_pseudo_builtins,
+        ),
+
+        # Builtins for PIM Modula-2
+        'm2pim': (
+            common_pseudo_builtins,
+            pim_additional_pseudo_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2iso': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2r10': (
+            common_pseudo_builtins,
+            m2r10_additional_pseudo_builtins,
+        ),
+
+        # Builtins for Objective Modula-2
+        'objm2': (
+            common_pseudo_builtins,
+            m2r10_additional_pseudo_builtins,
+            objm2_additional_pseudo_builtins,
+        ),
+
+        # Builtins for Aglet Modula-2 Extensions
+        'm2iso+aglet': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            aglet_additional_pseudo_builtins,
+        ),
+
+        # Builtins for GNU Modula-2 Extensions
+        'm2pim+gm2': (
+            common_pseudo_builtins,
+            pim_additional_pseudo_builtins,
+            gm2_additional_pseudo_builtins,
+        ),
+
+        # Builtins for p1 Modula-2 Extensions
+        'm2iso+p1': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            p1_additional_pseudo_builtins,
+        ),
+
+        # Builtins for XDS Modula-2 Extensions
+        'm2iso+xds': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            xds_additional_pseudo_builtins,
+        ),
+    }
+
+    # Standard Library ADTs Database
+    stdlib_adts_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library ADTs for PIM Modula-2
+        'm2pim': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for ISO Modula-2
+        'm2iso': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_adt_identifiers,
+        ),
+
+        # Standard Library ADTs for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_adt_identifiers,
+        ),
+
+        # Standard Library ADTs for Aglet Modula-2
+        'm2iso+aglet': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for GNU Modula-2
+        'm2pim+gm2': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for p1 Modula-2
+        'm2iso+p1': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for XDS Modula-2
+        'm2iso+xds': (
+            # No first class library types
+        ),
+    }
+
+    # Standard Library Modules Database
+    stdlib_modules_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Modules for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_blueprint_identifiers,
+            m2r10_stdlib_module_identifiers,
+            m2r10_stdlib_adt_identifiers,
+        ),
+
+        # Standard Library Modules for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_blueprint_identifiers,
+            m2r10_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_module_identifiers,
+        ),
+    }
+
+    # Standard Library Types Database
+    stdlib_types_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Types for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_type_identifiers,
+        ),
+    }
+
+    # Standard Library Procedures Database
+    stdlib_procedures_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Procedures for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_proc_identifiers,
+        ),
+    }
+
+    # Standard Library Variables Database
+    stdlib_variables_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Variables for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_var_identifiers,
+        ),
+    }
+
+    # Standard Library Constants Database
+    stdlib_constants_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Constants for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_const_identifiers,
+        ),
+    }
+
+#   M e t h o d s
+
+    # initialise a lexer instance
+    def __init__(self, **options):
+        #
+        # check dialect options
+        #
+        dialects = get_list_opt(options, 'dialect', [])
+        #
+        for dialect_option in dialects:
+            if dialect_option in self.dialects[1:-1]:
+                # valid dialect option found
+                self.set_dialect(dialect_option)
+                break
+        #
+        # Fallback Mode (DEFAULT)
+        else:
+            # no valid dialect option
+            self.set_dialect('unknown')
+        #
+        self.dialect_set_by_tag = False
+        #
+        # check style options
+        #
+        styles = get_list_opt(options, 'style', [])
+        #
+        # use lowercase mode for Algol style
+        if 'algol' in styles or 'algol_nu' in styles:
+            self.algol_publication_mode = True
+        else:
+            self.algol_publication_mode = False
+        #
+        # Check option flags
+        #
+        self.treat_stdlib_adts_as_builtins = get_bool_opt(
+            options, 'treat_stdlib_adts_as_builtins', True)
+        #
+        # call superclass initialiser
+        RegexLexer.__init__(self, **options)
+
+    # Set lexer to a specified dialect
+    def set_dialect(self, dialect_id):
+        #
+        # if __debug__:
+        #    print 'entered set_dialect with arg: ', dialect_id
+        #
+        # check dialect name against known dialects
+        if dialect_id not in self.dialects:
+            dialect = 'unknown'  # default
+        else:
+            dialect = dialect_id
+        #
+        # compose lexemes to reject set
+        lexemes_to_reject_set = set()
+        # add each list of reject lexemes for this dialect
+        for list in self.lexemes_to_reject_db[dialect]:
+            lexemes_to_reject_set.update(set(list))
+        #
+        # compose reserved words set
+        reswords_set = set()
+        # add each list of reserved words for this dialect
+        for list in self.reserved_words_db[dialect]:
+            reswords_set.update(set(list))
+        #
+        # compose builtins set
+        builtins_set = set()
+        # add each list of builtins for this dialect excluding reserved words
+        for list in self.builtins_db[dialect]:
+            builtins_set.update(set(list).difference(reswords_set))
+        #
+        # compose pseudo-builtins set
+        pseudo_builtins_set = set()
+        # add each list of builtins for this dialect excluding reserved words
+        for list in self.pseudo_builtins_db[dialect]:
+            pseudo_builtins_set.update(set(list).difference(reswords_set))
+        #
+        # compose ADTs set
+        adts_set = set()
+        # add each list of ADTs for this dialect excluding reserved words
+        for list in self.stdlib_adts_db[dialect]:
+            adts_set.update(set(list).difference(reswords_set))
+        #
+        # compose modules set
+        modules_set = set()
+        # add each list of builtins for this dialect excluding builtins
+        for list in self.stdlib_modules_db[dialect]:
+            modules_set.update(set(list).difference(builtins_set))
+        #
+        # compose types set
+        types_set = set()
+        # add each list of types for this dialect excluding builtins
+        for list in self.stdlib_types_db[dialect]:
+            types_set.update(set(list).difference(builtins_set))
+        #
+        # compose procedures set
+        procedures_set = set()
+        # add each list of procedures for this dialect excluding builtins
+        for list in self.stdlib_procedures_db[dialect]:
+            procedures_set.update(set(list).difference(builtins_set))
+        #
+        # compose variables set
+        variables_set = set()
+        # add each list of variables for this dialect excluding builtins
+        for list in self.stdlib_variables_db[dialect]:
+            variables_set.update(set(list).difference(builtins_set))
+        #
+        # compose constants set
+        constants_set = set()
+        # add each list of constants for this dialect excluding builtins
+        for list in self.stdlib_constants_db[dialect]:
+            constants_set.update(set(list).difference(builtins_set))
+        #
+        # update lexer state
+        self.dialect = dialect
+        self.lexemes_to_reject = lexemes_to_reject_set
+        self.reserved_words = reswords_set
+        self.builtins = builtins_set
+        self.pseudo_builtins = pseudo_builtins_set
+        self.adts = adts_set
+        self.modules = modules_set
+        self.types = types_set
+        self.procedures = procedures_set
+        self.variables = variables_set
+        self.constants = constants_set
+        #
+        # if __debug__:
+        #    print 'exiting set_dialect'
+        #    print ' self.dialect: ', self.dialect
+        #    print ' self.lexemes_to_reject: ', self.lexemes_to_reject
+        #    print ' self.reserved_words: ', self.reserved_words
+        #    print ' self.builtins: ', self.builtins
+        #    print ' self.pseudo_builtins: ', self.pseudo_builtins
+        #    print ' self.adts: ', self.adts
+        #    print ' self.modules: ', self.modules
+        #    print ' self.types: ', self.types
+        #    print ' self.procedures: ', self.procedures
+        #    print ' self.variables: ', self.variables
+        #    print ' self.types: ', self.types
+        #    print ' self.constants: ', self.constants
+
+    # Extracts a dialect name from a dialect tag comment string  and checks
+    # the extracted name against known dialects.  If a match is found,  the
+    # matching name is returned, otherwise dialect id 'unknown' is returned
+    def get_dialect_from_dialect_tag(self, dialect_tag):
+        #
+        # if __debug__:
+        #    print 'entered get_dialect_from_dialect_tag with arg: ', dialect_tag
+        #
+        # constants
+        left_tag_delim = '(*!'
+        right_tag_delim = '*)'
+        left_tag_delim_len = len(left_tag_delim)
+        right_tag_delim_len = len(right_tag_delim)
+        indicator_start = left_tag_delim_len
+        indicator_end = -(right_tag_delim_len)
+        #
+        # check comment string for dialect indicator
+        if len(dialect_tag) > (left_tag_delim_len + right_tag_delim_len) \
+           and dialect_tag.startswith(left_tag_delim) \
+           and dialect_tag.endswith(right_tag_delim):
+            #
+            # if __debug__:
+            #    print 'dialect tag found'
+            #
+            # extract dialect indicator
+            indicator = dialect_tag[indicator_start:indicator_end]
+            #
+            # if __debug__:
+            #    print 'extracted: ', indicator
+            #
+            # check against known dialects
+            for index in range(1, len(self.dialects)):
+                #
+                # if __debug__:
+                #    print 'dialects[', index, ']: ', self.dialects[index]
+                #
+                if indicator == self.dialects[index]:
+                    #
+                    # if __debug__:
+                    #    print 'matching dialect found'
+                    #
+                    # indicator matches known dialect
+                    return indicator
+            else:
+                # indicator does not match any dialect
+                return 'unknown'  # default
+        else:
+            # invalid indicator string
+            return 'unknown'  # default
+
+    # intercept the token stream, modify token attributes and return them
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text):
+            #
+            # check for dialect tag if dialect has not been set by tag
+            if not self.dialect_set_by_tag and token == Comment.Special:
+                indicated_dialect = self.get_dialect_from_dialect_tag(value)
+                if indicated_dialect != 'unknown':
+                    # token is a dialect indicator
+                    # reset reserved words and builtins
+                    self.set_dialect(indicated_dialect)
+                    self.dialect_set_by_tag = True
+            #
+            # check for reserved words, predefined and stdlib identifiers
+            if token is Name:
+                if value in self.reserved_words:
+                    token = Keyword.Reserved
+                    if self.algol_publication_mode:
+                        value = value.lower()
+                #
+                elif value in self.builtins:
+                    token = Name.Builtin
+                    if self.algol_publication_mode:
+                        value = value.lower()
+                #
+                elif value in self.pseudo_builtins:
+                    token = Name.Builtin.Pseudo
+                    if self.algol_publication_mode:
+                        value = value.lower()
+                #
+                elif value in self.adts:
+                    if not self.treat_stdlib_adts_as_builtins:
+                        token = Name.Namespace
+                    else:
+                        token = Name.Builtin.Pseudo
+                        if self.algol_publication_mode:
+                            value = value.lower()
+                #
+                elif value in self.modules:
+                    token = Name.Namespace
+                #
+                elif value in self.types:
+                    token = Name.Class
+                #
+                elif value in self.procedures:
+                    token = Name.Function
+                #
+                elif value in self.variables:
+                    token = Name.Variable
+                #
+                elif value in self.constants:
+                    token = Name.Constant
+            #
+            elif token in Number:
+                #
+                # mark prefix number literals as error for PIM and ISO dialects
+                if self.dialect not in ('unknown', 'm2r10', 'objm2'):
+                    if "'" in value or value[0:2] in ('0b', '0x', '0u'):
+                        token = Error
+                #
+                elif self.dialect in ('m2r10', 'objm2'):
+                    # mark base-8 number literals as errors for M2 R10 and ObjM2
+                    if token is Number.Oct:
+                        token = Error
+                    # mark suffix base-16 literals as errors for M2 R10 and ObjM2
+                    elif token is Number.Hex and 'H' in value:
+                        token = Error
+                    # mark real numbers with E as errors for M2 R10 and ObjM2
+                    elif token is Number.Float and 'E' in value:
+                        token = Error
+            #
+            elif token in Comment:
+                #
+                # mark single line comment as error for PIM and ISO dialects
+                if token is Comment.Single:
+                    if self.dialect not in ('unknown', 'm2r10', 'objm2'):
+                        token = Error
+                #
+                if token is Comment.Preproc:
+                    # mark ISO pragma as error for PIM dialects
+                    if value.startswith('<*') and \
+                       self.dialect.startswith('m2pim'):
+                        token = Error
+                    # mark PIM pragma as comment for other dialects
+                    elif value.startswith('(*$') and \
+                            self.dialect != 'unknown' and \
+                            not self.dialect.startswith('m2pim'):
+                        token = Comment.Multiline
+            #
+            else:  # token is neither Name nor Comment
+                #
+                # mark lexemes matching the dialect's error token set as errors
+                if value in self.lexemes_to_reject:
+                    token = Error
+                #
+                # substitute lexemes when in Algol mode
+                if self.algol_publication_mode:
+                    if value == '#':
+                        value = '≠'
+                    elif value == '<=':
+                        value = '≤'
+                    elif value == '>=':
+                        value = '≥'
+                    elif value == '==':
+                        value = '≡'
+                    elif value == '*.':
+                        value = '•'
+
+            # return result
+            yield index, token, value
+
+    def analyse_text(text):
+        """It's Pascal-like, but does not use FUNCTION -- uses PROCEDURE
+        instead."""
+
+        # Check if this looks like Pascal, if not, bail out early
+        if not ('(*' in text and '*)' in text and ':=' in text):
+            return
+
+        result = 0
+        # Procedure is in Modula2
+        if re.search(r'\bPROCEDURE\b', text):
+            result += 0.6
+
+        # FUNCTION is only valid in Pascal, but not in Modula2
+        if re.search(r'\bFUNCTION\b', text):
+            result = 0.0
+
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/mojo.py b/.venv/Lib/site-packages/pygments/lexers/mojo.py
new file mode 100644 (file)
index 0000000..4df18c4
--- /dev/null
@@ -0,0 +1,707 @@
+"""
+    pygments.lexers.mojo
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Mojo and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import keyword
+
+from pygments import unistring as uni
+from pygments.lexer import (
+    RegexLexer,
+    bygroups,
+    combined,
+    default,
+    include,
+    this,
+    using,
+    words,
+)
+from pygments.token import (
+    Comment,
+    # Error,
+    Keyword,
+    Name,
+    Number,
+    Operator,
+    Punctuation,
+    String,
+    Text,
+    Whitespace,
+)
+from pygments.util import shebang_matches
+
+__all__ = ["MojoLexer"]
+
+
+class MojoLexer(RegexLexer):
+    """
+    For Mojo source code (version 24.2.1).
+    """
+
+    name = "Mojo"
+    url = "https://docs.modular.com/mojo/"
+    aliases = ["mojo", "🔥"]
+    filenames = [
+        "*.mojo",
+        "*.🔥",
+    ]
+    mimetypes = [
+        "text/x-mojo",
+        "application/x-mojo",
+    ]
+    version_added = "2.18"
+
+    uni_name = f"[{uni.xid_start}][{uni.xid_continue}]*"
+
+    def innerstring_rules(ttype):
+        return [
+            # the old style '%s' % (...) string formatting (still valid in Py3)
+            (
+                r"%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?"
+                "[hlL]?[E-GXc-giorsaux%]",
+                String.Interpol,
+            ),
+            # the new style '{}'.format(...) string formatting
+            (
+                r"\{"
+                r"((\w+)((\.\w+)|(\[[^\]]+\]))*)?"  # field name
+                r"(\![sra])?"  # conversion
+                r"(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?"
+                r"\}",
+                String.Interpol,
+            ),
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"%{\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # unhandled string formatting sign
+            (r"%|(\{{1,2})", ttype),
+            # newlines are an error (use "nl" state)
+        ]
+
+    def fstring_rules(ttype):
+        return [
+            # Assuming that a '}' is the closing brace after format specifier.
+            # Sadly, this means that we won't detect syntax error. But it's
+            # more important to parse correct syntax correctly, than to
+            # highlight invalid syntax.
+            (r"\}", String.Interpol),
+            (r"\{", String.Interpol, "expr-inside-fstring"),
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"{}\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # newlines are an error (use "nl" state)
+        ]
+
+    tokens = {
+        "root": [
+            (r"\s+", Whitespace),
+            (
+                r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")',
+                bygroups(Whitespace, String.Affix, String.Doc),
+            ),
+            (
+                r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')",
+                bygroups(Whitespace, String.Affix, String.Doc),
+            ),
+            (r"\A#!.+$", Comment.Hashbang),
+            (r"#.*$", Comment.Single),
+            (r"\\\n", Whitespace),
+            (r"\\", Whitespace),
+            include("keywords"),
+            include("soft-keywords"),
+            # In the original PR, all the below here used ((?:\s|\\\s)+) to
+            # designate whitespace, but I can't find any example of this being
+            # needed in the example file, so we're replacing it with `\s+`.
+            (
+                r"(alias)(\s+)",
+                bygroups(Keyword, Whitespace),
+                "varname",  # TODO varname the right fit?
+            ),
+            (r"(var)(\s+)", bygroups(Keyword, Whitespace), "varname"),
+            (r"(def)(\s+)", bygroups(Keyword, Whitespace), "funcname"),
+            (r"(fn)(\s+)", bygroups(Keyword, Whitespace), "funcname"),
+            (
+                r"(class)(\s+)",
+                bygroups(Keyword, Whitespace),
+                "classname",
+            ),  # not implemented yet
+            (r"(struct)(\s+)", bygroups(Keyword, Whitespace), "structname"),
+            (r"(trait)(\s+)", bygroups(Keyword, Whitespace), "structname"),
+            (r"(from)(\s+)", bygroups(Keyword.Namespace, Whitespace), "fromimport"),
+            (r"(import)(\s+)", bygroups(Keyword.Namespace, Whitespace), "import"),
+            include("expr"),
+        ],
+        "expr": [
+            # raw f-strings
+            (
+                '(?i)(rf|fr)(""")',
+                bygroups(String.Affix, String.Double),
+                combined("rfstringescape", "tdqf"),
+            ),
+            (
+                "(?i)(rf|fr)(''')",
+                bygroups(String.Affix, String.Single),
+                combined("rfstringescape", "tsqf"),
+            ),
+            (
+                '(?i)(rf|fr)(")',
+                bygroups(String.Affix, String.Double),
+                combined("rfstringescape", "dqf"),
+            ),
+            (
+                "(?i)(rf|fr)(')",
+                bygroups(String.Affix, String.Single),
+                combined("rfstringescape", "sqf"),
+            ),
+            # non-raw f-strings
+            (
+                '([fF])(""")',
+                bygroups(String.Affix, String.Double),
+                combined("fstringescape", "tdqf"),
+            ),
+            (
+                "([fF])(''')",
+                bygroups(String.Affix, String.Single),
+                combined("fstringescape", "tsqf"),
+            ),
+            (
+                '([fF])(")',
+                bygroups(String.Affix, String.Double),
+                combined("fstringescape", "dqf"),
+            ),
+            (
+                "([fF])(')",
+                bygroups(String.Affix, String.Single),
+                combined("fstringescape", "sqf"),
+            ),
+            # raw bytes and strings
+            ('(?i)(rb|br|r)(""")', bygroups(String.Affix, String.Double), "tdqs"),
+            ("(?i)(rb|br|r)(''')", bygroups(String.Affix, String.Single), "tsqs"),
+            ('(?i)(rb|br|r)(")', bygroups(String.Affix, String.Double), "dqs"),
+            ("(?i)(rb|br|r)(')", bygroups(String.Affix, String.Single), "sqs"),
+            # non-raw strings
+            (
+                '([uU]?)(""")',
+                bygroups(String.Affix, String.Double),
+                combined("stringescape", "tdqs"),
+            ),
+            (
+                "([uU]?)(''')",
+                bygroups(String.Affix, String.Single),
+                combined("stringescape", "tsqs"),
+            ),
+            (
+                '([uU]?)(")',
+                bygroups(String.Affix, String.Double),
+                combined("stringescape", "dqs"),
+            ),
+            (
+                "([uU]?)(')",
+                bygroups(String.Affix, String.Single),
+                combined("stringescape", "sqs"),
+            ),
+            # non-raw bytes
+            (
+                '([bB])(""")',
+                bygroups(String.Affix, String.Double),
+                combined("bytesescape", "tdqs"),
+            ),
+            (
+                "([bB])(''')",
+                bygroups(String.Affix, String.Single),
+                combined("bytesescape", "tsqs"),
+            ),
+            (
+                '([bB])(")',
+                bygroups(String.Affix, String.Double),
+                combined("bytesescape", "dqs"),
+            ),
+            (
+                "([bB])(')",
+                bygroups(String.Affix, String.Single),
+                combined("bytesescape", "sqs"),
+            ),
+            (r"[^\S\n]+", Text),
+            include("numbers"),
+            (r"!=|==|<<|>>|:=|[-~+/*%=<>&^|.]", Operator),
+            (r"([]{}:\(\),;[])+", Punctuation),
+            (r"(in|is|and|or|not)\b", Operator.Word),
+            include("expr-keywords"),
+            include("builtins"),
+            include("magicfuncs"),
+            include("magicvars"),
+            include("name"),
+        ],
+        "expr-inside-fstring": [
+            (r"[{([]", Punctuation, "expr-inside-fstring-inner"),
+            # without format specifier
+            (
+                r"(=\s*)?"  # debug (https://bugs.python.org/issue36817)
+                r"(\![sraf])?"  # conversion
+                r"\}",
+                String.Interpol,
+                "#pop",
+            ),
+            # with format specifier
+            # we'll catch the remaining '}' in the outer scope
+            (
+                r"(=\s*)?"  # debug (https://bugs.python.org/issue36817)
+                r"(\![sraf])?"  # conversion
+                r":",
+                String.Interpol,
+                "#pop",
+            ),
+            (r"\s+", Whitespace),  # allow new lines
+            include("expr"),
+        ],
+        "expr-inside-fstring-inner": [
+            (r"[{([]", Punctuation, "expr-inside-fstring-inner"),
+            (r"[])}]", Punctuation, "#pop"),
+            (r"\s+", Whitespace),  # allow new lines
+            include("expr"),
+        ],
+        "expr-keywords": [
+            # Based on https://docs.python.org/3/reference/expressions.html
+            (
+                words(
+                    (
+                        "async for",  # TODO https://docs.modular.com/mojo/roadmap#no-async-for-or-async-with
+                        "async with",  # TODO https://docs.modular.com/mojo/roadmap#no-async-for-or-async-with
+                        "await",
+                        "else",
+                        "for",
+                        "if",
+                        "lambda",
+                        "yield",
+                        "yield from",
+                    ),
+                    suffix=r"\b",
+                ),
+                Keyword,
+            ),
+            (words(("True", "False", "None"), suffix=r"\b"), Keyword.Constant),
+        ],
+        "keywords": [
+            (
+                words(
+                    (
+                        "assert",
+                        "async",
+                        "await",
+                        "borrowed",
+                        "break",
+                        "continue",
+                        "del",
+                        "elif",
+                        "else",
+                        "except",
+                        "finally",
+                        "for",
+                        "global",
+                        "if",
+                        "lambda",
+                        "pass",
+                        "raise",
+                        "nonlocal",
+                        "return",
+                        "try",
+                        "while",
+                        "yield",
+                        "yield from",
+                        "as",
+                        "with",
+                    ),
+                    suffix=r"\b",
+                ),
+                Keyword,
+            ),
+            (words(("True", "False", "None"), suffix=r"\b"), Keyword.Constant),
+        ],
+        "soft-keywords": [
+            # `match`, `case` and `_` soft keywords
+            (
+                r"(^[ \t]*)"  # at beginning of line + possible indentation
+                r"(match|case)\b"  # a possible keyword
+                r"(?![ \t]*(?:"  # not followed by...
+                r"[:,;=^&|@~)\]}]|(?:" +  # characters and keywords that mean this isn't
+                # pattern matching (but None/True/False is ok)
+                r"|".join(k for k in keyword.kwlist if k[0].islower())
+                + r")\b))",
+                bygroups(Whitespace, Keyword),
+                "soft-keywords-inner",
+            ),
+        ],
+        "soft-keywords-inner": [
+            # optional `_` keyword
+            (r"(\s+)([^\n_]*)(_\b)", bygroups(Whitespace, using(this), Keyword)),
+            default("#pop"),
+        ],
+        "builtins": [
+            (
+                words(
+                    (
+                        "__import__",
+                        "abs",
+                        "aiter",
+                        "all",
+                        "any",
+                        "bin",
+                        "bool",
+                        "bytearray",
+                        "breakpoint",
+                        "bytes",
+                        "callable",
+                        "chr",
+                        "classmethod",
+                        "compile",
+                        "complex",
+                        "delattr",
+                        "dict",
+                        "dir",
+                        "divmod",
+                        "enumerate",
+                        "eval",
+                        "filter",
+                        "float",
+                        "format",
+                        "frozenset",
+                        "getattr",
+                        "globals",
+                        "hasattr",
+                        "hash",
+                        "hex",
+                        "id",
+                        "input",
+                        "int",
+                        "isinstance",
+                        "issubclass",
+                        "iter",
+                        "len",
+                        "list",
+                        "locals",
+                        "map",
+                        "max",
+                        "memoryview",
+                        "min",
+                        "next",
+                        "object",
+                        "oct",
+                        "open",
+                        "ord",
+                        "pow",
+                        "print",
+                        "property",
+                        "range",
+                        "repr",
+                        "reversed",
+                        "round",
+                        "set",
+                        "setattr",
+                        "slice",
+                        "sorted",
+                        "staticmethod",
+                        "str",
+                        "sum",
+                        "super",
+                        "tuple",
+                        "type",
+                        "vars",
+                        "zip",
+                        # Mojo builtin types: https://docs.modular.com/mojo/stdlib/builtin/
+                        "AnyType",
+                        "Coroutine",
+                        "DType",
+                        "Error",
+                        "Int",
+                        "List",
+                        "ListLiteral",
+                        "Scalar",
+                        "Int8",
+                        "UInt8",
+                        "Int16",
+                        "UInt16",
+                        "Int32",
+                        "UInt32",
+                        "Int64",
+                        "UInt64",
+                        "BFloat16",
+                        "Float16",
+                        "Float32",
+                        "Float64",
+                        "SIMD",
+                        "String",
+                        "Tensor",
+                        "Tuple",
+                        "Movable",
+                        "Copyable",
+                        "CollectionElement",
+                    ),
+                    prefix=r"(?<!\.)",
+                    suffix=r"\b",
+                ),
+                Name.Builtin,
+            ),
+            (r"(?<!\.)(self|Ellipsis|NotImplemented|cls)\b", Name.Builtin.Pseudo),
+            (
+                words(
+                    ("Error",),
+                    prefix=r"(?<!\.)",
+                    suffix=r"\b",
+                ),
+                Name.Exception,
+            ),
+        ],
+        "magicfuncs": [
+            (
+                words(
+                    (
+                        "__abs__",
+                        "__add__",
+                        "__aenter__",
+                        "__aexit__",
+                        "__aiter__",
+                        "__and__",
+                        "__anext__",
+                        "__await__",
+                        "__bool__",
+                        "__bytes__",
+                        "__call__",
+                        "__complex__",
+                        "__contains__",
+                        "__del__",
+                        "__delattr__",
+                        "__delete__",
+                        "__delitem__",
+                        "__dir__",
+                        "__divmod__",
+                        "__enter__",
+                        "__eq__",
+                        "__exit__",
+                        "__float__",
+                        "__floordiv__",
+                        "__format__",
+                        "__ge__",
+                        "__get__",
+                        "__getattr__",
+                        "__getattribute__",
+                        "__getitem__",
+                        "__gt__",
+                        "__hash__",
+                        "__iadd__",
+                        "__iand__",
+                        "__ifloordiv__",
+                        "__ilshift__",
+                        "__imatmul__",
+                        "__imod__",
+                        "__imul__",
+                        "__index__",
+                        "__init__",
+                        "__instancecheck__",
+                        "__int__",
+                        "__invert__",
+                        "__ior__",
+                        "__ipow__",
+                        "__irshift__",
+                        "__isub__",
+                        "__iter__",
+                        "__itruediv__",
+                        "__ixor__",
+                        "__le__",
+                        "__len__",
+                        "__length_hint__",
+                        "__lshift__",
+                        "__lt__",
+                        "__matmul__",
+                        "__missing__",
+                        "__mod__",
+                        "__mul__",
+                        "__ne__",
+                        "__neg__",
+                        "__new__",
+                        "__next__",
+                        "__or__",
+                        "__pos__",
+                        "__pow__",
+                        "__prepare__",
+                        "__radd__",
+                        "__rand__",
+                        "__rdivmod__",
+                        "__repr__",
+                        "__reversed__",
+                        "__rfloordiv__",
+                        "__rlshift__",
+                        "__rmatmul__",
+                        "__rmod__",
+                        "__rmul__",
+                        "__ror__",
+                        "__round__",
+                        "__rpow__",
+                        "__rrshift__",
+                        "__rshift__",
+                        "__rsub__",
+                        "__rtruediv__",
+                        "__rxor__",
+                        "__set__",
+                        "__setattr__",
+                        "__setitem__",
+                        "__str__",
+                        "__sub__",
+                        "__subclasscheck__",
+                        "__truediv__",
+                        "__xor__",
+                    ),
+                    suffix=r"\b",
+                ),
+                Name.Function.Magic,
+            ),
+        ],
+        "magicvars": [
+            (
+                words(
+                    (
+                        "__annotations__",
+                        "__bases__",
+                        "__class__",
+                        "__closure__",
+                        "__code__",
+                        "__defaults__",
+                        "__dict__",
+                        "__doc__",
+                        "__file__",
+                        "__func__",
+                        "__globals__",
+                        "__kwdefaults__",
+                        "__module__",
+                        "__mro__",
+                        "__name__",
+                        "__objclass__",
+                        "__qualname__",
+                        "__self__",
+                        "__slots__",
+                        "__weakref__",
+                    ),
+                    suffix=r"\b",
+                ),
+                Name.Variable.Magic,
+            ),
+        ],
+        "numbers": [
+            (
+                r"(\d(?:_?\d)*\.(?:\d(?:_?\d)*)?|(?:\d(?:_?\d)*)?\.\d(?:_?\d)*)"
+                r"([eE][+-]?\d(?:_?\d)*)?",
+                Number.Float,
+            ),
+            (r"\d(?:_?\d)*[eE][+-]?\d(?:_?\d)*j?", Number.Float),
+            (r"0[oO](?:_?[0-7])+", Number.Oct),
+            (r"0[bB](?:_?[01])+", Number.Bin),
+            (r"0[xX](?:_?[a-fA-F0-9])+", Number.Hex),
+            (r"\d(?:_?\d)*", Number.Integer),
+        ],
+        "name": [
+            (r"@" + uni_name, Name.Decorator),
+            (r"@", Operator),  # new matrix multiplication operator
+            (uni_name, Name),
+        ],
+        "varname": [
+            (uni_name, Name.Variable, "#pop"),
+        ],
+        "funcname": [
+            include("magicfuncs"),
+            (uni_name, Name.Function, "#pop"),
+            default("#pop"),
+        ],
+        "classname": [
+            (uni_name, Name.Class, "#pop"),
+        ],
+        "structname": [
+            (uni_name, Name.Struct, "#pop"),
+        ],
+        "import": [
+            (r"(\s+)(as)(\s+)", bygroups(Whitespace, Keyword, Whitespace)),
+            (r"\.", Name.Namespace),
+            (uni_name, Name.Namespace),
+            (r"(\s*)(,)(\s*)", bygroups(Whitespace, Operator, Whitespace)),
+            default("#pop"),  # all else: go back
+        ],
+        "fromimport": [
+            (r"(\s+)(import)\b", bygroups(Whitespace, Keyword.Namespace), "#pop"),
+            (r"\.", Name.Namespace),
+            # if None occurs here, it's "raise x from None", since None can
+            # never be a module name
+            (r"None\b", Keyword.Constant, "#pop"),
+            (uni_name, Name.Namespace),
+            default("#pop"),
+        ],
+        "rfstringescape": [
+            (r"\{\{", String.Escape),
+            (r"\}\}", String.Escape),
+        ],
+        "fstringescape": [
+            include("rfstringescape"),
+            include("stringescape"),
+        ],
+        "bytesescape": [
+            (r'\\([\\abfnrtv"\']|\n|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        "stringescape": [
+            (r"\\(N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8})", String.Escape),
+            include("bytesescape"),
+        ],
+        "fstrings-single": fstring_rules(String.Single),
+        "fstrings-double": fstring_rules(String.Double),
+        "strings-single": innerstring_rules(String.Single),
+        "strings-double": innerstring_rules(String.Double),
+        "dqf": [
+            (r'"', String.Double, "#pop"),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include("fstrings-double"),
+        ],
+        "sqf": [
+            (r"'", String.Single, "#pop"),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include("fstrings-single"),
+        ],
+        "dqs": [
+            (r'"', String.Double, "#pop"),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include("strings-double"),
+        ],
+        "sqs": [
+            (r"'", String.Single, "#pop"),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include("strings-single"),
+        ],
+        "tdqf": [
+            (r'"""', String.Double, "#pop"),
+            include("fstrings-double"),
+            (r"\n", String.Double),
+        ],
+        "tsqf": [
+            (r"'''", String.Single, "#pop"),
+            include("fstrings-single"),
+            (r"\n", String.Single),
+        ],
+        "tdqs": [
+            (r'"""', String.Double, "#pop"),
+            include("strings-double"),
+            (r"\n", String.Double),
+        ],
+        "tsqs": [
+            (r"'''", String.Single, "#pop"),
+            include("strings-single"),
+            (r"\n", String.Single),
+        ],
+    }
+
+    def analyse_text(text):
+        # TODO supported?
+        if shebang_matches(text, r"mojo?"):
+            return 1.0
+        if "import " in text[:1000]:
+            return 0.9
+        return 0
diff --git a/.venv/Lib/site-packages/pygments/lexers/monte.py b/.venv/Lib/site-packages/pygments/lexers/monte.py
new file mode 100644 (file)
index 0000000..c01d2dc
--- /dev/null
@@ -0,0 +1,203 @@
+"""
+    pygments.lexers.monte
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Monte programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.token import Comment, Error, Keyword, Name, Number, Operator, \
+    Punctuation, String, Whitespace
+from pygments.lexer import RegexLexer, include, words
+
+__all__ = ['MonteLexer']
+
+
+# `var` handled separately
+# `interface` handled separately
+_declarations = ['bind', 'def', 'fn', 'object']
+_methods = ['method', 'to']
+_keywords = [
+    'as', 'break', 'catch', 'continue', 'else', 'escape', 'exit', 'exports',
+    'extends', 'finally', 'for', 'guards', 'if', 'implements', 'import',
+    'in', 'match', 'meta', 'pass', 'return', 'switch', 'try', 'via', 'when',
+    'while',
+]
+_operators = [
+    # Unary
+    '~', '!',
+    # Binary
+    '+', '-', '*', '/', '%', '**', '&', '|', '^', '<<', '>>',
+    # Binary augmented
+    '+=', '-=', '*=', '/=', '%=', '**=', '&=', '|=', '^=', '<<=', '>>=',
+    # Comparison
+    '==', '!=', '<', '<=', '>', '>=', '<=>',
+    # Patterns and assignment
+    ':=', '?', '=~', '!~', '=>',
+    # Calls and sends
+    '.', '<-', '->',
+]
+_escape_pattern = (
+    r'(?:\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|'
+    r'\\["\'\\bftnr])')
+# _char = _escape_chars + [('.', String.Char)]
+_identifier = r'[_a-zA-Z]\w*'
+
+_constants = [
+    # Void constants
+    'null',
+    # Bool constants
+    'false', 'true',
+    # Double constants
+    'Infinity', 'NaN',
+    # Special objects
+    'M', 'Ref', 'throw', 'traceln',
+]
+
+_guards = [
+    'Any', 'Binding', 'Bool', 'Bytes', 'Char', 'DeepFrozen', 'Double',
+    'Empty', 'Int', 'List', 'Map', 'Near', 'NullOk', 'Same', 'Selfless',
+    'Set', 'Str', 'SubrangeGuard', 'Transparent', 'Void',
+]
+
+_safeScope = [
+    '_accumulateList', '_accumulateMap', '_auditedBy', '_bind',
+    '_booleanFlow', '_comparer', '_equalizer', '_iterForever', '_loop',
+    '_makeBytes', '_makeDouble', '_makeFinalSlot', '_makeInt', '_makeList',
+    '_makeMap', '_makeMessageDesc', '_makeOrderedSpace', '_makeParamDesc',
+    '_makeProtocolDesc', '_makeSourceSpan', '_makeString', '_makeVarSlot',
+    '_makeVerbFacet', '_mapExtract', '_matchSame', '_quasiMatcher',
+    '_slotToBinding', '_splitList', '_suchThat', '_switchFailed',
+    '_validateFor', 'b__quasiParser', 'eval', 'import', 'm__quasiParser',
+    'makeBrandPair', 'makeLazySlot', 'safeScope', 'simple__quasiParser',
+]
+
+
+class MonteLexer(RegexLexer):
+    """
+    Lexer for the Monte programming language.
+    """
+    name = 'Monte'
+    url = 'https://monte.readthedocs.io/'
+    aliases = ['monte']
+    filenames = ['*.mt']
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'#[^\n]*\n', Comment),
+
+            # Docstrings
+            # Apologies for the non-greedy matcher here.
+            (r'/\*\*.*?\*/', String.Doc),
+
+            # `var` declarations
+            (r'\bvar\b', Keyword.Declaration, 'var'),
+
+            # `interface` declarations
+            (r'\binterface\b', Keyword.Declaration, 'interface'),
+
+            # method declarations
+            (words(_methods, prefix='\\b', suffix='\\b'),
+             Keyword, 'method'),
+
+            # All other declarations
+            (words(_declarations, prefix='\\b', suffix='\\b'),
+             Keyword.Declaration),
+
+            # Keywords
+            (words(_keywords, prefix='\\b', suffix='\\b'), Keyword),
+
+            # Literals
+            ('[+-]?0x[_0-9a-fA-F]+', Number.Hex),
+            (r'[+-]?[_0-9]+\.[_0-9]*([eE][+-]?[_0-9]+)?', Number.Float),
+            ('[+-]?[_0-9]+', Number.Integer),
+            ("'", String.Double, 'char'),
+            ('"', String.Double, 'string'),
+
+            # Quasiliterals
+            ('`', String.Backtick, 'ql'),
+
+            # Operators
+            (words(_operators), Operator),
+
+            # Verb operators
+            (_identifier + '=', Operator.Word),
+
+            # Safe scope constants
+            (words(_constants, prefix='\\b', suffix='\\b'),
+             Keyword.Pseudo),
+
+            # Safe scope guards
+            (words(_guards, prefix='\\b', suffix='\\b'), Keyword.Type),
+
+            # All other safe scope names
+            (words(_safeScope, prefix='\\b', suffix='\\b'),
+             Name.Builtin),
+
+            # Identifiers
+            (_identifier, Name),
+
+            # Punctuation
+            (r'\(|\)|\{|\}|\[|\]|:|,', Punctuation),
+
+            # Whitespace
+            (' +', Whitespace),
+
+            # Definite lexer errors
+            ('=', Error),
+        ],
+        'char': [
+            # It is definitely an error to have a char of width == 0.
+            ("'", Error, 'root'),
+            (_escape_pattern, String.Escape, 'charEnd'),
+            ('.', String.Char, 'charEnd'),
+        ],
+        'charEnd': [
+            ("'", String.Char, '#pop:2'),
+            # It is definitely an error to have a char of width > 1.
+            ('.', Error),
+        ],
+        # The state of things coming into an interface.
+        'interface': [
+            (' +', Whitespace),
+            (_identifier, Name.Class, '#pop'),
+            include('root'),
+        ],
+        # The state of things coming into a method.
+        'method': [
+            (' +', Whitespace),
+            (_identifier, Name.Function, '#pop'),
+            include('root'),
+        ],
+        'string': [
+            ('"', String.Double, 'root'),
+            (_escape_pattern, String.Escape),
+            (r'\n', String.Double),
+            ('.', String.Double),
+        ],
+        'ql': [
+            ('`', String.Backtick, 'root'),
+            (r'\$' + _escape_pattern, String.Escape),
+            (r'\$\$', String.Escape),
+            (r'@@', String.Escape),
+            (r'\$\{', String.Interpol, 'qlNest'),
+            (r'@\{', String.Interpol, 'qlNest'),
+            (r'\$' + _identifier, Name),
+            ('@' + _identifier, Name),
+            ('.', String.Backtick),
+        ],
+        'qlNest': [
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        # The state of things immediately following `var`.
+        'var': [
+            (' +', Whitespace),
+            (_identifier, Name.Variable, '#pop'),
+            include('root'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/mosel.py b/.venv/Lib/site-packages/pygments/lexers/mosel.py
new file mode 100644 (file)
index 0000000..426c9a1
--- /dev/null
@@ -0,0 +1,447 @@
+"""
+    pygments.lexers.mosel
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the mosel language.
+    http://www.fico.com/en/products/fico-xpress-optimization
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['MoselLexer']
+
+FUNCTIONS = (
+    # core functions
+    '_',
+    'abs',
+    'arctan',
+    'asproc',
+    'assert',
+    'bitflip',
+    'bitneg',
+    'bitset',
+    'bitshift',
+    'bittest',
+    'bitval',
+    'ceil',
+    'cos',
+    'create',
+    'currentdate',
+    'currenttime',
+    'cutelt',
+    'cutfirst',
+    'cuthead',
+    'cutlast',
+    'cuttail',
+    'datablock',
+    'delcell',
+    'exists',
+    'exit',
+    'exp',
+    'exportprob',
+    'fclose',
+    'fflush',
+    'finalize',
+    'findfirst',
+    'findlast',
+    'floor',
+    'fopen',
+    'fselect',
+    'fskipline',
+    'fwrite',
+    'fwrite_',
+    'fwriteln',
+    'fwriteln_',
+    'getact',
+    'getcoeff',
+    'getcoeffs',
+    'getdual',
+    'getelt',
+    'getfid',
+    'getfirst',
+    'getfname',
+    'gethead',
+    'getlast',
+    'getobjval',
+    'getparam',
+    'getrcost',
+    'getreadcnt',
+    'getreverse',
+    'getsize',
+    'getslack',
+    'getsol',
+    'gettail',
+    'gettype',
+    'getvars',
+    'isdynamic',
+    'iseof',
+    'isfinite',
+    'ishidden',
+    'isinf',
+    'isnan',
+    'isodd',
+    'ln',
+    'localsetparam',
+    'log',
+    'makesos1',
+    'makesos2',
+    'maxlist',
+    'memoryuse',
+    'minlist',
+    'newmuid',
+    'publish',
+    'random',
+    'read',
+    'readln',
+    'reset',
+    'restoreparam',
+    'reverse',
+    'round',
+    'setcoeff',
+    'sethidden',
+    'setioerr',
+    'setmatherr',
+    'setname',
+    'setparam',
+    'setrandseed',
+    'setrange',
+    'settype',
+    'sin',
+    'splithead',
+    'splittail',
+    'sqrt',
+    'strfmt',
+    'substr',
+    'timestamp',
+    'unpublish',
+    'versionnum',
+    'versionstr',
+    'write',
+    'write_',
+    'writeln',
+    'writeln_',
+
+    # mosel exam mmxprs | sed -n -e "s/ [pf][a-z]* \([a-zA-Z0-9_]*\).*/'\1',/p" | sort -u
+    'addcut',
+    'addcuts',
+    'addmipsol',
+    'basisstability',
+    'calcsolinfo',
+    'clearmipdir',
+    'clearmodcut',
+    'command',
+    'copysoltoinit',
+    'crossoverlpsol',
+    'defdelayedrows',
+    'defsecurevecs',
+    'delcuts',
+    'dropcuts',
+    'estimatemarginals',
+    'fixglobal',
+    'flushmsgq',
+    'getbstat',
+    'getcnlist',
+    'getcplist',
+    'getdualray',
+    'getiis',
+    'getiissense',
+    'getiistype',
+    'getinfcause',
+    'getinfeas',
+    'getlb',
+    'getlct',
+    'getleft',
+    'getloadedlinctrs',
+    'getloadedmpvars',
+    'getname',
+    'getprimalray',
+    'getprobstat',
+    'getrange',
+    'getright',
+    'getsensrng',
+    'getsize',
+    'getsol',
+    'gettype',
+    'getub',
+    'getvars',
+    'gety',
+    'hasfeature',
+    'implies',
+    'indicator',
+    'initglobal',
+    'ishidden',
+    'isiisvalid',
+    'isintegral',
+    'loadbasis',
+    'loadcuts',
+    'loadlpsol',
+    'loadmipsol',
+    'loadprob',
+    'maximise',
+    'maximize',
+    'minimise',
+    'minimize',
+    'postsolve',
+    'readbasis',
+    'readdirs',
+    'readsol',
+    'refinemipsol',
+    'rejectintsol',
+    'repairinfeas',
+    'repairinfeas_deprec',
+    'resetbasis',
+    'resetiis',
+    'resetsol',
+    'savebasis',
+    'savemipsol',
+    'savesol',
+    'savestate',
+    'selectsol',
+    'setarchconsistency',
+    'setbstat',
+    'setcallback',
+    'setcbcutoff',
+    'setgndata',
+    'sethidden',
+    'setlb',
+    'setmipdir',
+    'setmodcut',
+    'setsol',
+    'setub',
+    'setucbdata',
+    'stopoptimise',
+    'stopoptimize',
+    'storecut',
+    'storecuts',
+    'unloadprob',
+    'uselastbarsol',
+    'writebasis',
+    'writedirs',
+    'writeprob',
+    'writesol',
+    'xor',
+    'xprs_addctr',
+    'xprs_addindic',
+
+    # mosel exam mmsystem | sed -n -e "s/ [pf][a-z]* \([a-zA-Z0-9_]*\).*/'\1',/p" | sort -u
+    'addmonths',
+    'copytext',
+    'cuttext',
+    'deltext',
+    'endswith',
+    'erase',
+    'expandpath',
+    'fcopy',
+    'fdelete',
+    'findfiles',
+    'findtext',
+    'fmove',
+    'formattext',
+    'getasnumber',
+    'getchar',
+    'getcwd',
+    'getdate',
+    'getday',
+    'getdaynum',
+    'getdays',
+    'getdirsep',
+    'getdsoparam',
+    'getendparse',
+    'getenv',
+    'getfsize',
+    'getfstat',
+    'getftime',
+    'gethour',
+    'getminute',
+    'getmonth',
+    'getmsec',
+    'getoserrmsg',
+    'getoserror',
+    'getpathsep',
+    'getqtype',
+    'getsecond',
+    'getsepchar',
+    'getsize',
+    'getstart',
+    'getsucc',
+    'getsysinfo',
+    'getsysstat',
+    'gettime',
+    'gettmpdir',
+    'gettrim',
+    'getweekday',
+    'getyear',
+    'inserttext',
+    'isvalid',
+    'jointext',
+    'makedir',
+    'makepath',
+    'newtar',
+    'newzip',
+    'nextfield',
+    'openpipe',
+    'parseextn',
+    'parseint',
+    'parsereal',
+    'parsetext',
+    'pastetext',
+    'pathmatch',
+    'pathsplit',
+    'qsort',
+    'quote',
+    'readtextline',
+    'regmatch',
+    'regreplace',
+    'removedir',
+    'removefiles',
+    'setchar',
+    'setdate',
+    'setday',
+    'setdsoparam',
+    'setendparse',
+    'setenv',
+    'sethour',
+    'setminute',
+    'setmonth',
+    'setmsec',
+    'setoserror',
+    'setqtype',
+    'setsecond',
+    'setsepchar',
+    'setstart',
+    'setsucc',
+    'settime',
+    'settrim',
+    'setyear',
+    'sleep',
+    'splittext',
+    'startswith',
+    'system',
+    'tarlist',
+    'textfmt',
+    'tolower',
+    'toupper',
+    'trim',
+    'untar',
+    'unzip',
+    'ziplist',
+
+    # mosel exam mmjobs | sed -n -e "s/ [pf][a-z]* \([a-zA-Z0-9_]*\).*/'\1',/p" | sort -u
+    'canceltimer',
+    'clearaliases',
+    'compile',
+    'connect',
+    'detach',
+    'disconnect',
+    'dropnextevent',
+    'findxsrvs',
+    'getaliases',
+    'getannidents',
+    'getannotations',
+    'getbanner',
+    'getclass',
+    'getdsoprop',
+    'getdsopropnum',
+    'getexitcode',
+    'getfromgid',
+    'getfromid',
+    'getfromuid',
+    'getgid',
+    'gethostalias',
+    'getid',
+    'getmodprop',
+    'getmodpropnum',
+    'getnextevent',
+    'getnode',
+    'getrmtid',
+    'getstatus',
+    'getsysinfo',
+    'gettimer',
+    'getuid',
+    'getvalue',
+    'isqueueempty',
+    'load',
+    'nullevent',
+    'peeknextevent',
+    'resetmodpar',
+    'run',
+    'send',
+    'setcontrol',
+    'setdefstream',
+    'setgid',
+    'sethostalias',
+    'setmodpar',
+    'settimer',
+    'setuid',
+    'setworkdir',
+    'stop',
+    'unload',
+    'wait',
+    'waitexpired',
+    'waitfor',
+    'waitforend',
+)
+
+
+class MoselLexer(RegexLexer):
+    """
+    For the Mosel optimization language.
+    """
+    name = 'Mosel'
+    aliases = ['mosel']
+    filenames = ['*.mos']
+    url = 'https://www.fico.com/fico-xpress-optimization/docs/latest/mosel/mosel_lang/dhtml/moselreflang.html'
+    version_added = '2.6'
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Text.Whitespace),
+            (r'!.*?\n', Comment.Single),
+            (r'\(!(.|\n)*?!\)', Comment.Multiline),
+            (words((
+                'and', 'as', 'break', 'case', 'count', 'declarations', 'do',
+                'dynamic', 'elif', 'else', 'end-', 'end', 'evaluation', 'false',
+                'forall', 'forward', 'from', 'function', 'hashmap', 'if',
+                'imports', 'include', 'initialisations', 'initializations', 'inter',
+                'max', 'min', 'model', 'namespace', 'next', 'not', 'nsgroup',
+                'nssearch', 'of', 'options', 'or', 'package', 'parameters',
+                'procedure', 'public', 'prod', 'record', 'repeat', 'requirements',
+                'return', 'sum', 'then', 'to', 'true', 'union', 'until', 'uses',
+                'version', 'while', 'with'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Builtin),
+            (words((
+                'range', 'array', 'set', 'list', 'mpvar', 'mpproblem', 'linctr',
+                'nlctr', 'integer', 'string', 'real', 'boolean', 'text', 'time',
+                'date', 'datetime', 'returned', 'Model', 'Mosel', 'counter',
+                'xmldoc', 'is_sos1', 'is_sos2', 'is_integer', 'is_binary',
+                'is_continuous', 'is_free', 'is_semcont', 'is_semint',
+                'is_partint'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Type),
+            (r'(\+|\-|\*|/|=|<=|>=|\||\^|<|>|<>|\.\.|\.|:=|::|:|in|mod|div)',
+             Operator),
+            (r'[()\[\]{},;]+', Punctuation),
+            (words(FUNCTIONS,  prefix=r'\b', suffix=r'\b'), Name.Function),
+            (r'(\d+\.(?!\.)\d*|\.(?!.)\d+)([eE][+-]?\d+)?', Number.Float),
+            (r'\d+([eE][+-]?\d+)?', Number.Integer),
+            (r'[+-]?Infinity', Number.Integer),
+            (r'0[xX][0-9a-fA-F]+', Number),
+            (r'"', String.Double, 'double_quote'),
+            (r'\'', String.Single, 'single_quote'),
+            (r'(\w+|(\.(?!\.)))', Text),
+        ],
+        'single_quote': [
+            (r'\'', String.Single, '#pop'),
+            (r'[^\']+', String.Single),
+        ],
+        'double_quote': [
+            (r'(\\"|\\[0-7]{1,3}\D|\\[abfnrtv]|\\\\)', String.Escape),
+            (r'\"', String.Double, '#pop'),
+            (r'[^"\\]+', String.Double),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/ncl.py b/.venv/Lib/site-packages/pygments/lexers/ncl.py
new file mode 100644 (file)
index 0000000..d2f4760
--- /dev/null
@@ -0,0 +1,894 @@
+"""
+    pygments.lexers.ncl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for NCAR Command Language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['NCLLexer']
+
+
+class NCLLexer(RegexLexer):
+    """
+    Lexer for NCL code.
+    """
+    name = 'NCL'
+    aliases = ['ncl']
+    filenames = ['*.ncl']
+    mimetypes = ['text/ncl']
+    url = 'https://www.ncl.ucar.edu'
+    version_added = '2.2'
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r';.*\n', Comment),
+            include('strings'),
+            include('core'),
+            (r'[a-zA-Z_]\w*', Name),
+            include('nums'),
+            (r'[\s]+', Text),
+        ],
+        'core': [
+            # Statements
+            (words((
+                'begin', 'break', 'continue', 'create', 'defaultapp', 'do',
+                'else', 'end', 'external', 'exit', 'True', 'False', 'file', 'function',
+                'getvalues', 'graphic', 'group', 'if', 'list', 'load', 'local',
+                'new', '_Missing', 'Missing', 'noparent', 'procedure',
+                'quit', 'QUIT', 'Quit', 'record', 'return', 'setvalues', 'stop',
+                'then', 'while'), prefix=r'\b', suffix=r'\s*\b'),
+             Keyword),
+
+            # Data Types
+            (words((
+                'ubyte', 'uint', 'uint64', 'ulong', 'string', 'byte',
+                'character', 'double', 'float', 'integer', 'int64', 'logical',
+                'long', 'short', 'ushort', 'enumeric', 'numeric', 'snumeric'),
+                prefix=r'\b', suffix=r'\s*\b'),
+             Keyword.Type),
+
+            # Operators
+            (r'[\%^*+\-/<>]', Operator),
+
+            # punctuation:
+            (r'[\[\]():@$!&|.,\\{}]', Punctuation),
+            (r'[=:]', Punctuation),
+
+            # Intrinsics
+            (words((
+                'abs', 'acos', 'addfile', 'addfiles', 'all', 'angmom_atm', 'any',
+                'area_conserve_remap', 'area_hi2lores', 'area_poly_sphere',
+                'asciiread', 'asciiwrite', 'asin', 'atan', 'atan2', 'attsetvalues',
+                'avg', 'betainc', 'bin_avg', 'bin_sum', 'bw_bandpass_filter',
+                'cancor', 'cbinread', 'cbinwrite', 'cd_calendar', 'cd_inv_calendar',
+                'cdfbin_p', 'cdfbin_pr', 'cdfbin_s', 'cdfbin_xn', 'cdfchi_p',
+                'cdfchi_x', 'cdfgam_p', 'cdfgam_x', 'cdfnor_p', 'cdfnor_x',
+                'cdft_p', 'cdft_t', 'ceil', 'center_finite_diff',
+                'center_finite_diff_n', 'cfftb', 'cfftf', 'cfftf_frq_reorder',
+                'charactertodouble', 'charactertofloat', 'charactertointeger',
+                'charactertolong', 'charactertoshort', 'charactertostring',
+                'chartodouble', 'chartofloat', 'chartoint', 'chartointeger',
+                'chartolong', 'chartoshort', 'chartostring', 'chiinv', 'clear',
+                'color_index_to_rgba', 'conform', 'conform_dims', 'cos', 'cosh',
+                'count_unique_values', 'covcorm', 'covcorm_xy', 'craybinnumrec',
+                'craybinrecread', 'create_graphic', 'csa1', 'csa1d', 'csa1s',
+                'csa1x', 'csa1xd', 'csa1xs', 'csa2', 'csa2d', 'csa2l', 'csa2ld',
+                'csa2ls', 'csa2lx', 'csa2lxd', 'csa2lxs', 'csa2s', 'csa2x',
+                'csa2xd', 'csa2xs', 'csa3', 'csa3d', 'csa3l', 'csa3ld', 'csa3ls',
+                'csa3lx', 'csa3lxd', 'csa3lxs', 'csa3s', 'csa3x', 'csa3xd',
+                'csa3xs', 'csc2s', 'csgetp', 'css2c', 'cssetp', 'cssgrid', 'csstri',
+                'csvoro', 'cumsum', 'cz2ccm', 'datatondc', 'day_of_week',
+                'day_of_year', 'days_in_month', 'default_fillvalue', 'delete',
+                'depth_to_pres', 'destroy', 'determinant', 'dewtemp_trh',
+                'dgeevx_lapack', 'dim_acumrun_n', 'dim_avg', 'dim_avg_n',
+                'dim_avg_wgt', 'dim_avg_wgt_n', 'dim_cumsum', 'dim_cumsum_n',
+                'dim_gamfit_n', 'dim_gbits', 'dim_max', 'dim_max_n', 'dim_median',
+                'dim_median_n', 'dim_min', 'dim_min_n', 'dim_num', 'dim_num_n',
+                'dim_numrun_n', 'dim_pqsort', 'dim_pqsort_n', 'dim_product',
+                'dim_product_n', 'dim_rmsd', 'dim_rmsd_n', 'dim_rmvmean',
+                'dim_rmvmean_n', 'dim_rmvmed', 'dim_rmvmed_n', 'dim_spi_n',
+                'dim_standardize', 'dim_standardize_n', 'dim_stat4', 'dim_stat4_n',
+                'dim_stddev', 'dim_stddev_n', 'dim_sum', 'dim_sum_n', 'dim_sum_wgt',
+                'dim_sum_wgt_n', 'dim_variance', 'dim_variance_n', 'dimsizes',
+                'doubletobyte', 'doubletochar', 'doubletocharacter',
+                'doubletofloat', 'doubletoint', 'doubletointeger', 'doubletolong',
+                'doubletoshort', 'dpres_hybrid_ccm', 'dpres_plevel', 'draw',
+                'draw_color_palette', 'dsgetp', 'dsgrid2', 'dsgrid2d', 'dsgrid2s',
+                'dsgrid3', 'dsgrid3d', 'dsgrid3s', 'dspnt2', 'dspnt2d', 'dspnt2s',
+                'dspnt3', 'dspnt3d', 'dspnt3s', 'dssetp', 'dtrend', 'dtrend_msg',
+                'dtrend_msg_n', 'dtrend_n', 'dtrend_quadratic',
+                'dtrend_quadratic_msg_n', 'dv2uvf', 'dv2uvg', 'dz_height',
+                'echo_off', 'echo_on', 'eof2data', 'eof_varimax', 'eofcor',
+                'eofcor_pcmsg', 'eofcor_ts', 'eofcov', 'eofcov_pcmsg', 'eofcov_ts',
+                'eofunc', 'eofunc_ts', 'eofunc_varimax', 'equiv_sample_size', 'erf',
+                'erfc', 'esacr', 'esacv', 'esccr', 'esccv', 'escorc', 'escorc_n',
+                'escovc', 'exit', 'exp', 'exp_tapersh', 'exp_tapersh_wgts',
+                'exp_tapershC', 'ezfftb', 'ezfftb_n', 'ezfftf', 'ezfftf_n',
+                'f2fosh', 'f2foshv', 'f2fsh', 'f2fshv', 'f2gsh', 'f2gshv', 'fabs',
+                'fbindirread', 'fbindirwrite', 'fbinnumrec', 'fbinread',
+                'fbinrecread', 'fbinrecwrite', 'fbinwrite', 'fft2db', 'fft2df',
+                'fftshift', 'fileattdef', 'filechunkdimdef', 'filedimdef',
+                'fileexists', 'filegrpdef', 'filevarattdef', 'filevarchunkdef',
+                'filevarcompressleveldef', 'filevardef', 'filevardimsizes',
+                'filwgts_lancos', 'filwgts_lanczos', 'filwgts_normal',
+                'floattobyte', 'floattochar', 'floattocharacter', 'floattoint',
+                'floattointeger', 'floattolong', 'floattoshort', 'floor',
+                'fluxEddy', 'fo2fsh', 'fo2fshv', 'fourier_info', 'frame', 'fspan',
+                'ftcurv', 'ftcurvd', 'ftcurvi', 'ftcurvp', 'ftcurvpi', 'ftcurvps',
+                'ftcurvs', 'ftest', 'ftgetp', 'ftkurv', 'ftkurvd', 'ftkurvp',
+                'ftkurvpd', 'ftsetp', 'ftsurf', 'g2fsh', 'g2fshv', 'g2gsh',
+                'g2gshv', 'gamma', 'gammainc', 'gaus', 'gaus_lobat',
+                'gaus_lobat_wgt', 'gc_aangle', 'gc_clkwise', 'gc_dangle',
+                'gc_inout', 'gc_latlon', 'gc_onarc', 'gc_pnt2gc', 'gc_qarea',
+                'gc_tarea', 'generate_2d_array', 'get_color_index',
+                'get_color_rgba', 'get_cpu_time', 'get_isolines', 'get_ncl_version',
+                'get_script_name', 'get_script_prefix_name', 'get_sphere_radius',
+                'get_unique_values', 'getbitsone', 'getenv', 'getfiledimsizes',
+                'getfilegrpnames', 'getfilepath', 'getfilevaratts',
+                'getfilevarchunkdimsizes', 'getfilevardims', 'getfilevardimsizes',
+                'getfilevarnames', 'getfilevartypes', 'getvaratts', 'getvardims',
+                'gradsf', 'gradsg', 'greg2jul', 'grid2triple', 'hlsrgb', 'hsvrgb',
+                'hydro', 'hyi2hyo', 'idsfft', 'igradsf', 'igradsg', 'ilapsf',
+                'ilapsg', 'ilapvf', 'ilapvg', 'ind', 'ind_resolve', 'int2p',
+                'int2p_n', 'integertobyte', 'integertochar', 'integertocharacter',
+                'integertoshort', 'inttobyte', 'inttochar', 'inttoshort',
+                'inverse_matrix', 'isatt', 'isbigendian', 'isbyte', 'ischar',
+                'iscoord', 'isdefined', 'isdim', 'isdimnamed', 'isdouble',
+                'isenumeric', 'isfile', 'isfilepresent', 'isfilevar',
+                'isfilevaratt', 'isfilevarcoord', 'isfilevardim', 'isfloat',
+                'isfunc', 'isgraphic', 'isint', 'isint64', 'isinteger',
+                'isleapyear', 'islogical', 'islong', 'ismissing', 'isnan_ieee',
+                'isnumeric', 'ispan', 'isproc', 'isshort', 'issnumeric', 'isstring',
+                'isubyte', 'isuint', 'isuint64', 'isulong', 'isunlimited',
+                'isunsigned', 'isushort', 'isvar', 'jul2greg', 'kmeans_as136',
+                'kolsm2_n', 'kron_product', 'lapsf', 'lapsg', 'lapvf', 'lapvg',
+                'latlon2utm', 'lclvl', 'lderuvf', 'lderuvg', 'linint1', 'linint1_n',
+                'linint2', 'linint2_points', 'linmsg', 'linmsg_n', 'linrood_latwgt',
+                'linrood_wgt', 'list_files', 'list_filevars', 'list_hlus',
+                'list_procfuncs', 'list_vars', 'ListAppend', 'ListCount',
+                'ListGetType', 'ListIndex', 'ListIndexFromName', 'ListPop',
+                'ListPush', 'ListSetType', 'loadscript', 'local_max', 'local_min',
+                'log', 'log10', 'longtobyte', 'longtochar', 'longtocharacter',
+                'longtoint', 'longtointeger', 'longtoshort', 'lspoly', 'lspoly_n',
+                'mask', 'max', 'maxind', 'min', 'minind', 'mixed_layer_depth',
+                'mixhum_ptd', 'mixhum_ptrh', 'mjo_cross_coh2pha',
+                'mjo_cross_segment', 'moc_globe_atl', 'monthday', 'natgrid',
+                'natgridd', 'natgrids', 'ncargpath', 'ncargversion', 'ndctodata',
+                'ndtooned', 'new', 'NewList', 'ngezlogo', 'nggcog', 'nggetp',
+                'nglogo', 'ngsetp', 'NhlAddAnnotation', 'NhlAddData',
+                'NhlAddOverlay', 'NhlAddPrimitive', 'NhlAppGetDefaultParentId',
+                'NhlChangeWorkstation', 'NhlClassName', 'NhlClearWorkstation',
+                'NhlDataPolygon', 'NhlDataPolyline', 'NhlDataPolymarker',
+                'NhlDataToNDC', 'NhlDestroy', 'NhlDraw', 'NhlFrame', 'NhlFreeColor',
+                'NhlGetBB', 'NhlGetClassResources', 'NhlGetErrorObjectId',
+                'NhlGetNamedColorIndex', 'NhlGetParentId',
+                'NhlGetParentWorkstation', 'NhlGetWorkspaceObjectId',
+                'NhlIsAllocatedColor', 'NhlIsApp', 'NhlIsDataComm', 'NhlIsDataItem',
+                'NhlIsDataSpec', 'NhlIsTransform', 'NhlIsView', 'NhlIsWorkstation',
+                'NhlName', 'NhlNDCPolygon', 'NhlNDCPolyline', 'NhlNDCPolymarker',
+                'NhlNDCToData', 'NhlNewColor', 'NhlNewDashPattern', 'NhlNewMarker',
+                'NhlPalGetDefined', 'NhlRemoveAnnotation', 'NhlRemoveData',
+                'NhlRemoveOverlay', 'NhlRemovePrimitive', 'NhlSetColor',
+                'NhlSetDashPattern', 'NhlSetMarker', 'NhlUpdateData',
+                'NhlUpdateWorkstation', 'nice_mnmxintvl', 'nngetaspectd',
+                'nngetaspects', 'nngetp', 'nngetsloped', 'nngetslopes', 'nngetwts',
+                'nngetwtsd', 'nnpnt', 'nnpntd', 'nnpntend', 'nnpntendd',
+                'nnpntinit', 'nnpntinitd', 'nnpntinits', 'nnpnts', 'nnsetp', 'num',
+                'obj_anal_ic', 'omega_ccm', 'onedtond', 'overlay', 'paleo_outline',
+                'pdfxy_bin', 'poisson_grid_fill', 'pop_remap', 'potmp_insitu_ocn',
+                'prcwater_dp', 'pres2hybrid', 'pres_hybrid_ccm', 'pres_sigma',
+                'print', 'print_table', 'printFileVarSummary', 'printVarSummary',
+                'product', 'pslec', 'pslhor', 'pslhyp', 'qsort', 'rand',
+                'random_chi', 'random_gamma', 'random_normal', 'random_setallseed',
+                'random_uniform', 'rcm2points', 'rcm2rgrid', 'rdsstoi',
+                'read_colormap_file', 'reg_multlin', 'regcoef', 'regCoef_n',
+                'regline', 'relhum', 'replace_ieeenan', 'reshape', 'reshape_ind',
+                'rgba_to_color_index', 'rgbhls', 'rgbhsv', 'rgbyiq', 'rgrid2rcm',
+                'rhomb_trunc', 'rip_cape_2d', 'rip_cape_3d', 'round', 'rtest',
+                'runave', 'runave_n', 'set_default_fillvalue', 'set_sphere_radius',
+                'setfileoption', 'sfvp2uvf', 'sfvp2uvg', 'shaec', 'shagc',
+                'shgetnp', 'shgetp', 'shgrid', 'shorttobyte', 'shorttochar',
+                'shorttocharacter', 'show_ascii', 'shsec', 'shsetp', 'shsgc',
+                'shsgc_R42', 'sigma2hybrid', 'simpeq', 'simpne', 'sin',
+                'sindex_yrmo', 'sinh', 'sizeof', 'sleep', 'smth9', 'snindex_yrmo',
+                'solve_linsys', 'span_color_indexes', 'span_color_rgba',
+                'sparse_matrix_mult', 'spcorr', 'spcorr_n', 'specx_anal',
+                'specxy_anal', 'spei', 'sprintf', 'sprinti', 'sqrt', 'sqsort',
+                'srand', 'stat2', 'stat4', 'stat_medrng', 'stat_trim',
+                'status_exit', 'stdatmus_p2tdz', 'stdatmus_z2tdp', 'stddev',
+                'str_capital', 'str_concat', 'str_fields_count', 'str_get_cols',
+                'str_get_dq', 'str_get_field', 'str_get_nl', 'str_get_sq',
+                'str_get_tab', 'str_index_of_substr', 'str_insert', 'str_is_blank',
+                'str_join', 'str_left_strip', 'str_lower', 'str_match',
+                'str_match_ic', 'str_match_ic_regex', 'str_match_ind',
+                'str_match_ind_ic', 'str_match_ind_ic_regex', 'str_match_ind_regex',
+                'str_match_regex', 'str_right_strip', 'str_split',
+                'str_split_by_length', 'str_split_csv', 'str_squeeze', 'str_strip',
+                'str_sub_str', 'str_switch', 'str_upper', 'stringtochar',
+                'stringtocharacter', 'stringtodouble', 'stringtofloat',
+                'stringtoint', 'stringtointeger', 'stringtolong', 'stringtoshort',
+                'strlen', 'student_t', 'sum', 'svd_lapack', 'svdcov', 'svdcov_sv',
+                'svdstd', 'svdstd_sv', 'system', 'systemfunc', 'tan', 'tanh',
+                'taper', 'taper_n', 'tdclrs', 'tdctri', 'tdcudp', 'tdcurv',
+                'tddtri', 'tdez2d', 'tdez3d', 'tdgetp', 'tdgrds', 'tdgrid',
+                'tdgtrs', 'tdinit', 'tditri', 'tdlbla', 'tdlblp', 'tdlbls',
+                'tdline', 'tdlndp', 'tdlnpa', 'tdlpdp', 'tdmtri', 'tdotri',
+                'tdpara', 'tdplch', 'tdprpa', 'tdprpi', 'tdprpt', 'tdsetp',
+                'tdsort', 'tdstri', 'tdstrs', 'tdttri', 'thornthwaite', 'tobyte',
+                'tochar', 'todouble', 'tofloat', 'toint', 'toint64', 'tointeger',
+                'tolong', 'toshort', 'tosigned', 'tostring', 'tostring_with_format',
+                'totype', 'toubyte', 'touint', 'touint64', 'toulong', 'tounsigned',
+                'toushort', 'trend_manken', 'tri_trunc', 'triple2grid',
+                'triple2grid2d', 'trop_wmo', 'ttest', 'typeof', 'undef',
+                'unique_string', 'update', 'ushorttoint', 'ut_calendar',
+                'ut_inv_calendar', 'utm2latlon', 'uv2dv_cfd', 'uv2dvf', 'uv2dvg',
+                'uv2sfvpf', 'uv2sfvpg', 'uv2vr_cfd', 'uv2vrdvf', 'uv2vrdvg',
+                'uv2vrf', 'uv2vrg', 'v5d_close', 'v5d_create', 'v5d_setLowLev',
+                'v5d_setUnits', 'v5d_write', 'v5d_write_var', 'variance', 'vhaec',
+                'vhagc', 'vhsec', 'vhsgc', 'vibeta', 'vinth2p', 'vinth2p_ecmwf',
+                'vinth2p_ecmwf_nodes', 'vinth2p_nodes', 'vintp2p_ecmwf', 'vr2uvf',
+                'vr2uvg', 'vrdv2uvf', 'vrdv2uvg', 'wavelet', 'wavelet_default',
+                'weibull', 'wgt_area_smooth', 'wgt_areaave', 'wgt_areaave2',
+                'wgt_arearmse', 'wgt_arearmse2', 'wgt_areasum2', 'wgt_runave',
+                'wgt_runave_n', 'wgt_vert_avg_beta', 'wgt_volave', 'wgt_volave_ccm',
+                'wgt_volrmse', 'wgt_volrmse_ccm', 'where', 'wk_smooth121', 'wmbarb',
+                'wmbarbmap', 'wmdrft', 'wmgetp', 'wmlabs', 'wmsetp', 'wmstnm',
+                'wmvect', 'wmvectmap', 'wmvlbl', 'wrf_avo', 'wrf_cape_2d',
+                'wrf_cape_3d', 'wrf_dbz', 'wrf_eth', 'wrf_helicity', 'wrf_ij_to_ll',
+                'wrf_interp_1d', 'wrf_interp_2d_xy', 'wrf_interp_3d_z',
+                'wrf_latlon_to_ij', 'wrf_ll_to_ij', 'wrf_omega', 'wrf_pvo',
+                'wrf_rh', 'wrf_slp', 'wrf_smooth_2d', 'wrf_td', 'wrf_tk',
+                'wrf_updraft_helicity', 'wrf_uvmet', 'wrf_virtual_temp',
+                'wrf_wetbulb', 'wrf_wps_close_int', 'wrf_wps_open_int',
+                'wrf_wps_rddata_int', 'wrf_wps_rdhead_int', 'wrf_wps_read_int',
+                'wrf_wps_write_int', 'write_matrix', 'write_table', 'yiqrgb',
+                'z2geouv', 'zonal_mpsi', 'addfiles_GetVar', 'advect_variable',
+                'area_conserve_remap_Wrap', 'area_hi2lores_Wrap',
+                'array_append_record', 'assignFillValue', 'byte2flt',
+                'byte2flt_hdf', 'calcDayAnomTLL', 'calcMonAnomLLLT',
+                'calcMonAnomLLT', 'calcMonAnomTLL', 'calcMonAnomTLLL',
+                'calculate_monthly_values', 'cd_convert', 'changeCase',
+                'changeCaseChar', 'clmDayTLL', 'clmDayTLLL', 'clmMon2clmDay',
+                'clmMonLLLT', 'clmMonLLT', 'clmMonTLL', 'clmMonTLLL', 'closest_val',
+                'copy_VarAtts', 'copy_VarCoords', 'copy_VarCoords_1',
+                'copy_VarCoords_2', 'copy_VarMeta', 'copyatt', 'crossp3',
+                'cshstringtolist', 'cssgrid_Wrap', 'dble2flt', 'decimalPlaces',
+                'delete_VarAtts', 'dim_avg_n_Wrap', 'dim_avg_wgt_n_Wrap',
+                'dim_avg_wgt_Wrap', 'dim_avg_Wrap', 'dim_cumsum_n_Wrap',
+                'dim_cumsum_Wrap', 'dim_max_n_Wrap', 'dim_min_n_Wrap',
+                'dim_rmsd_n_Wrap', 'dim_rmsd_Wrap', 'dim_rmvmean_n_Wrap',
+                'dim_rmvmean_Wrap', 'dim_rmvmed_n_Wrap', 'dim_rmvmed_Wrap',
+                'dim_standardize_n_Wrap', 'dim_standardize_Wrap',
+                'dim_stddev_n_Wrap', 'dim_stddev_Wrap', 'dim_sum_n_Wrap',
+                'dim_sum_wgt_n_Wrap', 'dim_sum_wgt_Wrap', 'dim_sum_Wrap',
+                'dim_variance_n_Wrap', 'dim_variance_Wrap', 'dpres_plevel_Wrap',
+                'dtrend_leftdim', 'dv2uvF_Wrap', 'dv2uvG_Wrap', 'eof_north',
+                'eofcor_Wrap', 'eofcov_Wrap', 'eofunc_north', 'eofunc_ts_Wrap',
+                'eofunc_varimax_reorder', 'eofunc_varimax_Wrap', 'eofunc_Wrap',
+                'epsZero', 'f2fosh_Wrap', 'f2foshv_Wrap', 'f2fsh_Wrap',
+                'f2fshv_Wrap', 'f2gsh_Wrap', 'f2gshv_Wrap', 'fbindirSwap',
+                'fbinseqSwap1', 'fbinseqSwap2', 'flt2dble', 'flt2string',
+                'fo2fsh_Wrap', 'fo2fshv_Wrap', 'g2fsh_Wrap', 'g2fshv_Wrap',
+                'g2gsh_Wrap', 'g2gshv_Wrap', 'generate_resample_indices',
+                'generate_sample_indices', 'generate_unique_indices',
+                'genNormalDist', 'get1Dindex', 'get1Dindex_Collapse',
+                'get1Dindex_Exclude', 'get_file_suffix', 'GetFillColor',
+                'GetFillColorIndex', 'getFillValue', 'getind_latlon2d',
+                'getVarDimNames', 'getVarFillValue', 'grib_stime2itime',
+                'hyi2hyo_Wrap', 'ilapsF_Wrap', 'ilapsG_Wrap', 'ind_nearest_coord',
+                'indStrSubset', 'int2dble', 'int2flt', 'int2p_n_Wrap', 'int2p_Wrap',
+                'isMonotonic', 'isStrSubset', 'latGau', 'latGauWgt', 'latGlobeF',
+                'latGlobeFo', 'latRegWgt', 'linint1_n_Wrap', 'linint1_Wrap',
+                'linint2_points_Wrap', 'linint2_Wrap', 'local_max_1d',
+                'local_min_1d', 'lonFlip', 'lonGlobeF', 'lonGlobeFo', 'lonPivot',
+                'merge_levels_sfc', 'mod', 'month_to_annual',
+                'month_to_annual_weighted', 'month_to_season', 'month_to_season12',
+                'month_to_seasonN', 'monthly_total_to_daily_mean', 'nameDim',
+                'natgrid_Wrap', 'NewCosWeight', 'niceLatLon2D', 'NormCosWgtGlobe',
+                'numAsciiCol', 'numAsciiRow', 'numeric2int',
+                'obj_anal_ic_deprecated', 'obj_anal_ic_Wrap', 'omega_ccm_driver',
+                'omega_to_w', 'oneDtostring', 'pack_values', 'pattern_cor', 'pdfx',
+                'pdfxy', 'pdfxy_conform', 'pot_temp', 'pot_vort_hybrid',
+                'pot_vort_isobaric', 'pres2hybrid_Wrap', 'print_clock',
+                'printMinMax', 'quadroots', 'rcm2points_Wrap', 'rcm2rgrid_Wrap',
+                'readAsciiHead', 'readAsciiTable', 'reg_multlin_stats',
+                'region_ind', 'regline_stats', 'relhum_ttd', 'replaceSingleChar',
+                'RGBtoCmap', 'rgrid2rcm_Wrap', 'rho_mwjf', 'rm_single_dims',
+                'rmAnnCycle1D', 'rmInsufData', 'rmMonAnnCycLLLT', 'rmMonAnnCycLLT',
+                'rmMonAnnCycTLL', 'runave_n_Wrap', 'runave_Wrap', 'short2flt',
+                'short2flt_hdf', 'shsgc_R42_Wrap', 'sign_f90', 'sign_matlab',
+                'smth9_Wrap', 'smthClmDayTLL', 'smthClmDayTLLL', 'SqrtCosWeight',
+                'stat_dispersion', 'static_stability', 'stdMonLLLT', 'stdMonLLT',
+                'stdMonTLL', 'stdMonTLLL', 'symMinMaxPlt', 'table_attach_columns',
+                'table_attach_rows', 'time_to_newtime', 'transpose',
+                'triple2grid_Wrap', 'ut_convert', 'uv2dvF_Wrap', 'uv2dvG_Wrap',
+                'uv2vrF_Wrap', 'uv2vrG_Wrap', 'vr2uvF_Wrap', 'vr2uvG_Wrap',
+                'w_to_omega', 'wallClockElapseTime', 'wave_number_spc',
+                'wgt_areaave_Wrap', 'wgt_runave_leftdim', 'wgt_runave_n_Wrap',
+                'wgt_runave_Wrap', 'wgt_vertical_n', 'wind_component',
+                'wind_direction', 'yyyyddd_to_yyyymmdd', 'yyyymm_time',
+                'yyyymm_to_yyyyfrac', 'yyyymmdd_time', 'yyyymmdd_to_yyyyddd',
+                'yyyymmdd_to_yyyyfrac', 'yyyymmddhh_time', 'yyyymmddhh_to_yyyyfrac',
+                'zonal_mpsi_Wrap', 'zonalAve', 'calendar_decode2', 'cd_string',
+                'kf_filter', 'run_cor', 'time_axis_labels', 'ut_string',
+                'wrf_contour', 'wrf_map', 'wrf_map_overlay', 'wrf_map_overlays',
+                'wrf_map_resources', 'wrf_map_zoom', 'wrf_overlay', 'wrf_overlays',
+                'wrf_user_getvar', 'wrf_user_ij_to_ll', 'wrf_user_intrp2d',
+                'wrf_user_intrp3d', 'wrf_user_latlon_to_ij', 'wrf_user_list_times',
+                'wrf_user_ll_to_ij', 'wrf_user_unstagger', 'wrf_user_vert_interp',
+                'wrf_vector', 'gsn_add_annotation', 'gsn_add_polygon',
+                'gsn_add_polyline', 'gsn_add_polymarker',
+                'gsn_add_shapefile_polygons', 'gsn_add_shapefile_polylines',
+                'gsn_add_shapefile_polymarkers', 'gsn_add_text', 'gsn_attach_plots',
+                'gsn_blank_plot', 'gsn_contour', 'gsn_contour_map',
+                'gsn_contour_shade', 'gsn_coordinates', 'gsn_create_labelbar',
+                'gsn_create_legend', 'gsn_create_text',
+                'gsn_csm_attach_zonal_means', 'gsn_csm_blank_plot',
+                'gsn_csm_contour', 'gsn_csm_contour_map', 'gsn_csm_contour_map_ce',
+                'gsn_csm_contour_map_overlay', 'gsn_csm_contour_map_polar',
+                'gsn_csm_hov', 'gsn_csm_lat_time', 'gsn_csm_map', 'gsn_csm_map_ce',
+                'gsn_csm_map_polar', 'gsn_csm_pres_hgt',
+                'gsn_csm_pres_hgt_streamline', 'gsn_csm_pres_hgt_vector',
+                'gsn_csm_streamline', 'gsn_csm_streamline_contour_map',
+                'gsn_csm_streamline_contour_map_ce',
+                'gsn_csm_streamline_contour_map_polar', 'gsn_csm_streamline_map',
+                'gsn_csm_streamline_map_ce', 'gsn_csm_streamline_map_polar',
+                'gsn_csm_streamline_scalar', 'gsn_csm_streamline_scalar_map',
+                'gsn_csm_streamline_scalar_map_ce',
+                'gsn_csm_streamline_scalar_map_polar', 'gsn_csm_time_lat',
+                'gsn_csm_vector', 'gsn_csm_vector_map', 'gsn_csm_vector_map_ce',
+                'gsn_csm_vector_map_polar', 'gsn_csm_vector_scalar',
+                'gsn_csm_vector_scalar_map', 'gsn_csm_vector_scalar_map_ce',
+                'gsn_csm_vector_scalar_map_polar', 'gsn_csm_x2y', 'gsn_csm_x2y2',
+                'gsn_csm_xy', 'gsn_csm_xy2', 'gsn_csm_xy3', 'gsn_csm_y',
+                'gsn_define_colormap', 'gsn_draw_colormap', 'gsn_draw_named_colors',
+                'gsn_histogram', 'gsn_labelbar_ndc', 'gsn_legend_ndc', 'gsn_map',
+                'gsn_merge_colormaps', 'gsn_open_wks', 'gsn_panel', 'gsn_polygon',
+                'gsn_polygon_ndc', 'gsn_polyline', 'gsn_polyline_ndc',
+                'gsn_polymarker', 'gsn_polymarker_ndc', 'gsn_retrieve_colormap',
+                'gsn_reverse_colormap', 'gsn_streamline', 'gsn_streamline_map',
+                'gsn_streamline_scalar', 'gsn_streamline_scalar_map', 'gsn_table',
+                'gsn_text', 'gsn_text_ndc', 'gsn_vector', 'gsn_vector_map',
+                'gsn_vector_scalar', 'gsn_vector_scalar_map', 'gsn_xy', 'gsn_y',
+                'hsv2rgb', 'maximize_output', 'namedcolor2rgb', 'namedcolor2rgba',
+                'reset_device_coordinates', 'span_named_colors'), prefix=r'\b'),
+             Name.Builtin),
+
+            # Resources
+            (words((
+                'amDataXF', 'amDataYF', 'amJust', 'amOn', 'amOrthogonalPosF',
+                'amParallelPosF', 'amResizeNotify', 'amSide', 'amTrackData',
+                'amViewId', 'amZone', 'appDefaultParent', 'appFileSuffix',
+                'appResources', 'appSysDir', 'appUsrDir', 'caCopyArrays',
+                'caXArray', 'caXCast', 'caXMaxV', 'caXMinV', 'caXMissingV',
+                'caYArray', 'caYCast', 'caYMaxV', 'caYMinV', 'caYMissingV',
+                'cnCellFillEdgeColor', 'cnCellFillMissingValEdgeColor',
+                'cnConpackParams', 'cnConstFEnableFill', 'cnConstFLabelAngleF',
+                'cnConstFLabelBackgroundColor', 'cnConstFLabelConstantSpacingF',
+                'cnConstFLabelFont', 'cnConstFLabelFontAspectF',
+                'cnConstFLabelFontColor', 'cnConstFLabelFontHeightF',
+                'cnConstFLabelFontQuality', 'cnConstFLabelFontThicknessF',
+                'cnConstFLabelFormat', 'cnConstFLabelFuncCode', 'cnConstFLabelJust',
+                'cnConstFLabelOn', 'cnConstFLabelOrthogonalPosF',
+                'cnConstFLabelParallelPosF', 'cnConstFLabelPerimColor',
+                'cnConstFLabelPerimOn', 'cnConstFLabelPerimSpaceF',
+                'cnConstFLabelPerimThicknessF', 'cnConstFLabelSide',
+                'cnConstFLabelString', 'cnConstFLabelTextDirection',
+                'cnConstFLabelZone', 'cnConstFUseInfoLabelRes',
+                'cnExplicitLabelBarLabelsOn', 'cnExplicitLegendLabelsOn',
+                'cnExplicitLineLabelsOn', 'cnFillBackgroundColor', 'cnFillColor',
+                'cnFillColors', 'cnFillDotSizeF', 'cnFillDrawOrder', 'cnFillMode',
+                'cnFillOn', 'cnFillOpacityF', 'cnFillPalette', 'cnFillPattern',
+                'cnFillPatterns', 'cnFillScaleF', 'cnFillScales', 'cnFixFillBleed',
+                'cnGridBoundFillColor', 'cnGridBoundFillPattern',
+                'cnGridBoundFillScaleF', 'cnGridBoundPerimColor',
+                'cnGridBoundPerimDashPattern', 'cnGridBoundPerimOn',
+                'cnGridBoundPerimThicknessF', 'cnHighLabelAngleF',
+                'cnHighLabelBackgroundColor', 'cnHighLabelConstantSpacingF',
+                'cnHighLabelCount', 'cnHighLabelFont', 'cnHighLabelFontAspectF',
+                'cnHighLabelFontColor', 'cnHighLabelFontHeightF',
+                'cnHighLabelFontQuality', 'cnHighLabelFontThicknessF',
+                'cnHighLabelFormat', 'cnHighLabelFuncCode', 'cnHighLabelPerimColor',
+                'cnHighLabelPerimOn', 'cnHighLabelPerimSpaceF',
+                'cnHighLabelPerimThicknessF', 'cnHighLabelString', 'cnHighLabelsOn',
+                'cnHighLowLabelOverlapMode', 'cnHighUseLineLabelRes',
+                'cnInfoLabelAngleF', 'cnInfoLabelBackgroundColor',
+                'cnInfoLabelConstantSpacingF', 'cnInfoLabelFont',
+                'cnInfoLabelFontAspectF', 'cnInfoLabelFontColor',
+                'cnInfoLabelFontHeightF', 'cnInfoLabelFontQuality',
+                'cnInfoLabelFontThicknessF', 'cnInfoLabelFormat',
+                'cnInfoLabelFuncCode', 'cnInfoLabelJust', 'cnInfoLabelOn',
+                'cnInfoLabelOrthogonalPosF', 'cnInfoLabelParallelPosF',
+                'cnInfoLabelPerimColor', 'cnInfoLabelPerimOn',
+                'cnInfoLabelPerimSpaceF', 'cnInfoLabelPerimThicknessF',
+                'cnInfoLabelSide', 'cnInfoLabelString', 'cnInfoLabelTextDirection',
+                'cnInfoLabelZone', 'cnLabelBarEndLabelsOn', 'cnLabelBarEndStyle',
+                'cnLabelDrawOrder', 'cnLabelMasking', 'cnLabelScaleFactorF',
+                'cnLabelScaleValueF', 'cnLabelScalingMode', 'cnLegendLevelFlags',
+                'cnLevelCount', 'cnLevelFlag', 'cnLevelFlags', 'cnLevelSelectionMode',
+                'cnLevelSpacingF', 'cnLevels', 'cnLineColor', 'cnLineColors',
+                'cnLineDashPattern', 'cnLineDashPatterns', 'cnLineDashSegLenF',
+                'cnLineDrawOrder', 'cnLineLabelAngleF', 'cnLineLabelBackgroundColor',
+                'cnLineLabelConstantSpacingF', 'cnLineLabelCount',
+                'cnLineLabelDensityF', 'cnLineLabelFont', 'cnLineLabelFontAspectF',
+                'cnLineLabelFontColor', 'cnLineLabelFontColors',
+                'cnLineLabelFontHeightF', 'cnLineLabelFontQuality',
+                'cnLineLabelFontThicknessF', 'cnLineLabelFormat',
+                'cnLineLabelFuncCode', 'cnLineLabelInterval', 'cnLineLabelPerimColor',
+                'cnLineLabelPerimOn', 'cnLineLabelPerimSpaceF',
+                'cnLineLabelPerimThicknessF', 'cnLineLabelPlacementMode',
+                'cnLineLabelStrings', 'cnLineLabelsOn', 'cnLinePalette',
+                'cnLineThicknessF', 'cnLineThicknesses', 'cnLinesOn',
+                'cnLowLabelAngleF', 'cnLowLabelBackgroundColor',
+                'cnLowLabelConstantSpacingF', 'cnLowLabelCount', 'cnLowLabelFont',
+                'cnLowLabelFontAspectF', 'cnLowLabelFontColor',
+                'cnLowLabelFontHeightF', 'cnLowLabelFontQuality',
+                'cnLowLabelFontThicknessF', 'cnLowLabelFormat', 'cnLowLabelFuncCode',
+                'cnLowLabelPerimColor', 'cnLowLabelPerimOn', 'cnLowLabelPerimSpaceF',
+                'cnLowLabelPerimThicknessF', 'cnLowLabelString', 'cnLowLabelsOn',
+                'cnLowUseHighLabelRes', 'cnMaxDataValueFormat', 'cnMaxLevelCount',
+                'cnMaxLevelValF', 'cnMaxPointDistanceF', 'cnMinLevelValF',
+                'cnMissingValFillColor', 'cnMissingValFillPattern',
+                'cnMissingValFillScaleF', 'cnMissingValPerimColor',
+                'cnMissingValPerimDashPattern', 'cnMissingValPerimGridBoundOn',
+                'cnMissingValPerimOn', 'cnMissingValPerimThicknessF',
+                'cnMonoFillColor', 'cnMonoFillPattern', 'cnMonoFillScale',
+                'cnMonoLevelFlag', 'cnMonoLineColor', 'cnMonoLineDashPattern',
+                'cnMonoLineLabelFontColor', 'cnMonoLineThickness', 'cnNoDataLabelOn',
+                'cnNoDataLabelString', 'cnOutOfRangeFillColor',
+                'cnOutOfRangeFillPattern', 'cnOutOfRangeFillScaleF',
+                'cnOutOfRangePerimColor', 'cnOutOfRangePerimDashPattern',
+                'cnOutOfRangePerimOn', 'cnOutOfRangePerimThicknessF',
+                'cnRasterCellSizeF', 'cnRasterMinCellSizeF', 'cnRasterModeOn',
+                'cnRasterSampleFactorF', 'cnRasterSmoothingOn', 'cnScalarFieldData',
+                'cnSmoothingDistanceF', 'cnSmoothingOn', 'cnSmoothingTensionF',
+                'cnSpanFillPalette', 'cnSpanLinePalette', 'ctCopyTables',
+                'ctXElementSize', 'ctXMaxV', 'ctXMinV', 'ctXMissingV', 'ctXTable',
+                'ctXTableLengths', 'ctXTableType', 'ctYElementSize', 'ctYMaxV',
+                'ctYMinV', 'ctYMissingV', 'ctYTable', 'ctYTableLengths',
+                'ctYTableType', 'dcDelayCompute', 'errBuffer',
+                'errFileName', 'errFilePtr', 'errLevel', 'errPrint', 'errUnitNumber',
+                'gsClipOn', 'gsColors', 'gsEdgeColor', 'gsEdgeDashPattern',
+                'gsEdgeDashSegLenF', 'gsEdgeThicknessF', 'gsEdgesOn',
+                'gsFillBackgroundColor', 'gsFillColor', 'gsFillDotSizeF',
+                'gsFillIndex', 'gsFillLineThicknessF', 'gsFillOpacityF',
+                'gsFillScaleF', 'gsFont', 'gsFontAspectF', 'gsFontColor',
+                'gsFontHeightF', 'gsFontOpacityF', 'gsFontQuality',
+                'gsFontThicknessF', 'gsLineColor', 'gsLineDashPattern',
+                'gsLineDashSegLenF', 'gsLineLabelConstantSpacingF', 'gsLineLabelFont',
+                'gsLineLabelFontAspectF', 'gsLineLabelFontColor',
+                'gsLineLabelFontHeightF', 'gsLineLabelFontQuality',
+                'gsLineLabelFontThicknessF', 'gsLineLabelFuncCode',
+                'gsLineLabelString', 'gsLineOpacityF', 'gsLineThicknessF',
+                'gsMarkerColor', 'gsMarkerIndex', 'gsMarkerOpacityF', 'gsMarkerSizeF',
+                'gsMarkerThicknessF', 'gsSegments', 'gsTextAngleF',
+                'gsTextConstantSpacingF', 'gsTextDirection', 'gsTextFuncCode',
+                'gsTextJustification', 'gsnAboveYRefLineBarColors',
+                'gsnAboveYRefLineBarFillScales', 'gsnAboveYRefLineBarPatterns',
+                'gsnAboveYRefLineColor', 'gsnAddCyclic', 'gsnAttachBorderOn',
+                'gsnAttachPlotsXAxis', 'gsnBelowYRefLineBarColors',
+                'gsnBelowYRefLineBarFillScales', 'gsnBelowYRefLineBarPatterns',
+                'gsnBelowYRefLineColor', 'gsnBoxMargin', 'gsnCenterString',
+                'gsnCenterStringFontColor', 'gsnCenterStringFontHeightF',
+                'gsnCenterStringFuncCode', 'gsnCenterStringOrthogonalPosF',
+                'gsnCenterStringParallelPosF', 'gsnContourLineThicknessesScale',
+                'gsnContourNegLineDashPattern', 'gsnContourPosLineDashPattern',
+                'gsnContourZeroLineThicknessF', 'gsnDebugWriteFileName', 'gsnDraw',
+                'gsnFrame', 'gsnHistogramBarWidthPercent', 'gsnHistogramBinIntervals',
+                'gsnHistogramBinMissing', 'gsnHistogramBinWidth',
+                'gsnHistogramClassIntervals', 'gsnHistogramCompare',
+                'gsnHistogramComputePercentages',
+                'gsnHistogramComputePercentagesNoMissing',
+                'gsnHistogramDiscreteBinValues', 'gsnHistogramDiscreteClassValues',
+                'gsnHistogramHorizontal', 'gsnHistogramMinMaxBinsOn',
+                'gsnHistogramNumberOfBins', 'gsnHistogramPercentSign',
+                'gsnHistogramSelectNiceIntervals', 'gsnLeftString',
+                'gsnLeftStringFontColor', 'gsnLeftStringFontHeightF',
+                'gsnLeftStringFuncCode', 'gsnLeftStringOrthogonalPosF',
+                'gsnLeftStringParallelPosF', 'gsnMajorLatSpacing',
+                'gsnMajorLonSpacing', 'gsnMaskLambertConformal',
+                'gsnMaskLambertConformalOutlineOn', 'gsnMaximize',
+                'gsnMinorLatSpacing', 'gsnMinorLonSpacing', 'gsnPanelBottom',
+                'gsnPanelCenter', 'gsnPanelDebug', 'gsnPanelFigureStrings',
+                'gsnPanelFigureStringsBackgroundFillColor',
+                'gsnPanelFigureStringsFontHeightF', 'gsnPanelFigureStringsJust',
+                'gsnPanelFigureStringsPerimOn', 'gsnPanelLabelBar', 'gsnPanelLeft',
+                'gsnPanelMainFont', 'gsnPanelMainFontColor',
+                'gsnPanelMainFontHeightF', 'gsnPanelMainString', 'gsnPanelRight',
+                'gsnPanelRowSpec', 'gsnPanelScalePlotIndex', 'gsnPanelTop',
+                'gsnPanelXF', 'gsnPanelXWhiteSpacePercent', 'gsnPanelYF',
+                'gsnPanelYWhiteSpacePercent', 'gsnPaperHeight', 'gsnPaperMargin',
+                'gsnPaperOrientation', 'gsnPaperWidth', 'gsnPolar',
+                'gsnPolarLabelDistance', 'gsnPolarLabelFont',
+                'gsnPolarLabelFontHeightF', 'gsnPolarLabelSpacing', 'gsnPolarTime',
+                'gsnPolarUT', 'gsnRightString', 'gsnRightStringFontColor',
+                'gsnRightStringFontHeightF', 'gsnRightStringFuncCode',
+                'gsnRightStringOrthogonalPosF', 'gsnRightStringParallelPosF',
+                'gsnScalarContour', 'gsnScale', 'gsnShape', 'gsnSpreadColorEnd',
+                'gsnSpreadColorStart', 'gsnSpreadColors', 'gsnStringFont',
+                'gsnStringFontColor', 'gsnStringFontHeightF', 'gsnStringFuncCode',
+                'gsnTickMarksOn', 'gsnXAxisIrregular2Linear', 'gsnXAxisIrregular2Log',
+                'gsnXRefLine', 'gsnXRefLineColor', 'gsnXRefLineDashPattern',
+                'gsnXRefLineThicknessF', 'gsnXYAboveFillColors', 'gsnXYBarChart',
+                'gsnXYBarChartBarWidth', 'gsnXYBarChartColors',
+                'gsnXYBarChartColors2', 'gsnXYBarChartFillDotSizeF',
+                'gsnXYBarChartFillLineThicknessF', 'gsnXYBarChartFillOpacityF',
+                'gsnXYBarChartFillScaleF', 'gsnXYBarChartOutlineOnly',
+                'gsnXYBarChartOutlineThicknessF', 'gsnXYBarChartPatterns',
+                'gsnXYBarChartPatterns2', 'gsnXYBelowFillColors', 'gsnXYFillColors',
+                'gsnXYFillOpacities', 'gsnXYLeftFillColors', 'gsnXYRightFillColors',
+                'gsnYAxisIrregular2Linear', 'gsnYAxisIrregular2Log', 'gsnYRefLine',
+                'gsnYRefLineColor', 'gsnYRefLineColors', 'gsnYRefLineDashPattern',
+                'gsnYRefLineDashPatterns', 'gsnYRefLineThicknessF',
+                'gsnYRefLineThicknesses', 'gsnZonalMean', 'gsnZonalMeanXMaxF',
+                'gsnZonalMeanXMinF', 'gsnZonalMeanYRefLine', 'lbAutoManage',
+                'lbBottomMarginF', 'lbBoxCount', 'lbBoxEndCapStyle', 'lbBoxFractions',
+                'lbBoxLineColor', 'lbBoxLineDashPattern', 'lbBoxLineDashSegLenF',
+                'lbBoxLineThicknessF', 'lbBoxLinesOn', 'lbBoxMajorExtentF',
+                'lbBoxMinorExtentF', 'lbBoxSeparatorLinesOn', 'lbBoxSizing',
+                'lbFillBackground', 'lbFillColor', 'lbFillColors', 'lbFillDotSizeF',
+                'lbFillLineThicknessF', 'lbFillPattern', 'lbFillPatterns',
+                'lbFillScaleF', 'lbFillScales', 'lbJustification', 'lbLabelAlignment',
+                'lbLabelAngleF', 'lbLabelAutoStride', 'lbLabelBarOn',
+                'lbLabelConstantSpacingF', 'lbLabelDirection', 'lbLabelFont',
+                'lbLabelFontAspectF', 'lbLabelFontColor', 'lbLabelFontHeightF',
+                'lbLabelFontQuality', 'lbLabelFontThicknessF', 'lbLabelFuncCode',
+                'lbLabelJust', 'lbLabelOffsetF', 'lbLabelPosition', 'lbLabelStride',
+                'lbLabelStrings', 'lbLabelsOn', 'lbLeftMarginF', 'lbMaxLabelLenF',
+                'lbMinLabelSpacingF', 'lbMonoFillColor', 'lbMonoFillPattern',
+                'lbMonoFillScale', 'lbOrientation', 'lbPerimColor',
+                'lbPerimDashPattern', 'lbPerimDashSegLenF', 'lbPerimFill',
+                'lbPerimFillColor', 'lbPerimOn', 'lbPerimThicknessF',
+                'lbRasterFillOn', 'lbRightMarginF', 'lbTitleAngleF',
+                'lbTitleConstantSpacingF', 'lbTitleDirection', 'lbTitleExtentF',
+                'lbTitleFont', 'lbTitleFontAspectF', 'lbTitleFontColor',
+                'lbTitleFontHeightF', 'lbTitleFontQuality', 'lbTitleFontThicknessF',
+                'lbTitleFuncCode', 'lbTitleJust', 'lbTitleOffsetF', 'lbTitleOn',
+                'lbTitlePosition', 'lbTitleString', 'lbTopMarginF', 'lgAutoManage',
+                'lgBottomMarginF', 'lgBoxBackground', 'lgBoxLineColor',
+                'lgBoxLineDashPattern', 'lgBoxLineDashSegLenF', 'lgBoxLineThicknessF',
+                'lgBoxLinesOn', 'lgBoxMajorExtentF', 'lgBoxMinorExtentF',
+                'lgDashIndex', 'lgDashIndexes', 'lgItemCount', 'lgItemOrder',
+                'lgItemPlacement', 'lgItemPositions', 'lgItemType', 'lgItemTypes',
+                'lgJustification', 'lgLabelAlignment', 'lgLabelAngleF',
+                'lgLabelAutoStride', 'lgLabelConstantSpacingF', 'lgLabelDirection',
+                'lgLabelFont', 'lgLabelFontAspectF', 'lgLabelFontColor',
+                'lgLabelFontHeightF', 'lgLabelFontQuality', 'lgLabelFontThicknessF',
+                'lgLabelFuncCode', 'lgLabelJust', 'lgLabelOffsetF', 'lgLabelPosition',
+                'lgLabelStride', 'lgLabelStrings', 'lgLabelsOn', 'lgLeftMarginF',
+                'lgLegendOn', 'lgLineColor', 'lgLineColors', 'lgLineDashSegLenF',
+                'lgLineDashSegLens', 'lgLineLabelConstantSpacingF', 'lgLineLabelFont',
+                'lgLineLabelFontAspectF', 'lgLineLabelFontColor',
+                'lgLineLabelFontColors', 'lgLineLabelFontHeightF',
+                'lgLineLabelFontHeights', 'lgLineLabelFontQuality',
+                'lgLineLabelFontThicknessF', 'lgLineLabelFuncCode',
+                'lgLineLabelStrings', 'lgLineLabelsOn', 'lgLineThicknessF',
+                'lgLineThicknesses', 'lgMarkerColor', 'lgMarkerColors',
+                'lgMarkerIndex', 'lgMarkerIndexes', 'lgMarkerSizeF', 'lgMarkerSizes',
+                'lgMarkerThicknessF', 'lgMarkerThicknesses', 'lgMonoDashIndex',
+                'lgMonoItemType', 'lgMonoLineColor', 'lgMonoLineDashSegLen',
+                'lgMonoLineLabelFontColor', 'lgMonoLineLabelFontHeight',
+                'lgMonoLineThickness', 'lgMonoMarkerColor', 'lgMonoMarkerIndex',
+                'lgMonoMarkerSize', 'lgMonoMarkerThickness', 'lgOrientation',
+                'lgPerimColor', 'lgPerimDashPattern', 'lgPerimDashSegLenF',
+                'lgPerimFill', 'lgPerimFillColor', 'lgPerimOn', 'lgPerimThicknessF',
+                'lgRightMarginF', 'lgTitleAngleF', 'lgTitleConstantSpacingF',
+                'lgTitleDirection', 'lgTitleExtentF', 'lgTitleFont',
+                'lgTitleFontAspectF', 'lgTitleFontColor', 'lgTitleFontHeightF',
+                'lgTitleFontQuality', 'lgTitleFontThicknessF', 'lgTitleFuncCode',
+                'lgTitleJust', 'lgTitleOffsetF', 'lgTitleOn', 'lgTitlePosition',
+                'lgTitleString', 'lgTopMarginF', 'mpAreaGroupCount',
+                'mpAreaMaskingOn', 'mpAreaNames', 'mpAreaTypes', 'mpBottomAngleF',
+                'mpBottomMapPosF', 'mpBottomNDCF', 'mpBottomNPCF',
+                'mpBottomPointLatF', 'mpBottomPointLonF', 'mpBottomWindowF',
+                'mpCenterLatF', 'mpCenterLonF', 'mpCenterRotF', 'mpCountyLineColor',
+                'mpCountyLineDashPattern', 'mpCountyLineDashSegLenF',
+                'mpCountyLineThicknessF', 'mpDataBaseVersion', 'mpDataResolution',
+                'mpDataSetName', 'mpDefaultFillColor', 'mpDefaultFillPattern',
+                'mpDefaultFillScaleF', 'mpDynamicAreaGroups', 'mpEllipticalBoundary',
+                'mpFillAreaSpecifiers', 'mpFillBoundarySets', 'mpFillColor',
+                'mpFillColors', 'mpFillColors-default', 'mpFillDotSizeF',
+                'mpFillDrawOrder', 'mpFillOn', 'mpFillPatternBackground',
+                'mpFillPattern', 'mpFillPatterns', 'mpFillPatterns-default',
+                'mpFillScaleF', 'mpFillScales', 'mpFillScales-default',
+                'mpFixedAreaGroups', 'mpGeophysicalLineColor',
+                'mpGeophysicalLineDashPattern', 'mpGeophysicalLineDashSegLenF',
+                'mpGeophysicalLineThicknessF', 'mpGreatCircleLinesOn',
+                'mpGridAndLimbDrawOrder', 'mpGridAndLimbOn', 'mpGridLatSpacingF',
+                'mpGridLineColor', 'mpGridLineDashPattern', 'mpGridLineDashSegLenF',
+                'mpGridLineThicknessF', 'mpGridLonSpacingF', 'mpGridMaskMode',
+                'mpGridMaxLatF', 'mpGridPolarLonSpacingF', 'mpGridSpacingF',
+                'mpInlandWaterFillColor', 'mpInlandWaterFillPattern',
+                'mpInlandWaterFillScaleF', 'mpLabelDrawOrder', 'mpLabelFontColor',
+                'mpLabelFontHeightF', 'mpLabelsOn', 'mpLambertMeridianF',
+                'mpLambertParallel1F', 'mpLambertParallel2F', 'mpLandFillColor',
+                'mpLandFillPattern', 'mpLandFillScaleF', 'mpLeftAngleF',
+                'mpLeftCornerLatF', 'mpLeftCornerLonF', 'mpLeftMapPosF',
+                'mpLeftNDCF', 'mpLeftNPCF', 'mpLeftPointLatF',
+                'mpLeftPointLonF', 'mpLeftWindowF', 'mpLimbLineColor',
+                'mpLimbLineDashPattern', 'mpLimbLineDashSegLenF',
+                'mpLimbLineThicknessF', 'mpLimitMode', 'mpMaskAreaSpecifiers',
+                'mpMaskOutlineSpecifiers', 'mpMaxLatF', 'mpMaxLonF',
+                'mpMinLatF', 'mpMinLonF', 'mpMonoFillColor', 'mpMonoFillPattern',
+                'mpMonoFillScale', 'mpNationalLineColor', 'mpNationalLineDashPattern',
+                'mpNationalLineThicknessF', 'mpOceanFillColor', 'mpOceanFillPattern',
+                'mpOceanFillScaleF', 'mpOutlineBoundarySets', 'mpOutlineDrawOrder',
+                'mpOutlineMaskingOn', 'mpOutlineOn', 'mpOutlineSpecifiers',
+                'mpPerimDrawOrder', 'mpPerimLineColor', 'mpPerimLineDashPattern',
+                'mpPerimLineDashSegLenF', 'mpPerimLineThicknessF', 'mpPerimOn',
+                'mpPolyMode', 'mpProjection', 'mpProvincialLineColor',
+                'mpProvincialLineDashPattern', 'mpProvincialLineDashSegLenF',
+                'mpProvincialLineThicknessF', 'mpRelativeCenterLat',
+                'mpRelativeCenterLon', 'mpRightAngleF', 'mpRightCornerLatF',
+                'mpRightCornerLonF', 'mpRightMapPosF', 'mpRightNDCF',
+                'mpRightNPCF', 'mpRightPointLatF', 'mpRightPointLonF',
+                'mpRightWindowF', 'mpSatelliteAngle1F', 'mpSatelliteAngle2F',
+                'mpSatelliteDistF', 'mpShapeMode', 'mpSpecifiedFillColors',
+                'mpSpecifiedFillDirectIndexing', 'mpSpecifiedFillPatterns',
+                'mpSpecifiedFillPriority', 'mpSpecifiedFillScales',
+                'mpTopAngleF', 'mpTopMapPosF', 'mpTopNDCF', 'mpTopNPCF',
+                'mpTopPointLatF', 'mpTopPointLonF', 'mpTopWindowF',
+                'mpUSStateLineColor', 'mpUSStateLineDashPattern',
+                'mpUSStateLineDashSegLenF', 'mpUSStateLineThicknessF',
+                'pmAnnoManagers', 'pmAnnoViews', 'pmLabelBarDisplayMode',
+                'pmLabelBarHeightF', 'pmLabelBarKeepAspect', 'pmLabelBarOrthogonalPosF',
+                'pmLabelBarParallelPosF', 'pmLabelBarSide', 'pmLabelBarWidthF',
+                'pmLabelBarZone', 'pmLegendDisplayMode', 'pmLegendHeightF',
+                'pmLegendKeepAspect', 'pmLegendOrthogonalPosF',
+                'pmLegendParallelPosF', 'pmLegendSide', 'pmLegendWidthF',
+                'pmLegendZone', 'pmOverlaySequenceIds', 'pmTickMarkDisplayMode',
+                'pmTickMarkZone', 'pmTitleDisplayMode', 'pmTitleZone',
+                'prGraphicStyle', 'prPolyType', 'prXArray', 'prYArray',
+                'sfCopyData', 'sfDataArray', 'sfDataMaxV', 'sfDataMinV',
+                'sfElementNodes', 'sfExchangeDimensions', 'sfFirstNodeIndex',
+                'sfMissingValueV', 'sfXArray', 'sfXCActualEndF', 'sfXCActualStartF',
+                'sfXCEndIndex', 'sfXCEndSubsetV', 'sfXCEndV', 'sfXCStartIndex',
+                'sfXCStartSubsetV', 'sfXCStartV', 'sfXCStride', 'sfXCellBounds',
+                'sfYArray', 'sfYCActualEndF', 'sfYCActualStartF', 'sfYCEndIndex',
+                'sfYCEndSubsetV', 'sfYCEndV', 'sfYCStartIndex', 'sfYCStartSubsetV',
+                'sfYCStartV', 'sfYCStride', 'sfYCellBounds', 'stArrowLengthF',
+                'stArrowStride', 'stCrossoverCheckCount',
+                'stExplicitLabelBarLabelsOn', 'stLabelBarEndLabelsOn',
+                'stLabelFormat', 'stLengthCheckCount', 'stLevelColors',
+                'stLevelCount', 'stLevelPalette', 'stLevelSelectionMode',
+                'stLevelSpacingF', 'stLevels', 'stLineColor', 'stLineOpacityF',
+                'stLineStartStride', 'stLineThicknessF', 'stMapDirection',
+                'stMaxLevelCount', 'stMaxLevelValF', 'stMinArrowSpacingF',
+                'stMinDistanceF', 'stMinLevelValF', 'stMinLineSpacingF',
+                'stMinStepFactorF', 'stMonoLineColor', 'stNoDataLabelOn',
+                'stNoDataLabelString', 'stScalarFieldData', 'stScalarMissingValColor',
+                'stSpanLevelPalette', 'stStepSizeF', 'stStreamlineDrawOrder',
+                'stUseScalarArray', 'stVectorFieldData', 'stZeroFLabelAngleF',
+                'stZeroFLabelBackgroundColor', 'stZeroFLabelConstantSpacingF',
+                'stZeroFLabelFont', 'stZeroFLabelFontAspectF',
+                'stZeroFLabelFontColor', 'stZeroFLabelFontHeightF',
+                'stZeroFLabelFontQuality', 'stZeroFLabelFontThicknessF',
+                'stZeroFLabelFuncCode', 'stZeroFLabelJust', 'stZeroFLabelOn',
+                'stZeroFLabelOrthogonalPosF', 'stZeroFLabelParallelPosF',
+                'stZeroFLabelPerimColor', 'stZeroFLabelPerimOn',
+                'stZeroFLabelPerimSpaceF', 'stZeroFLabelPerimThicknessF',
+                'stZeroFLabelSide', 'stZeroFLabelString', 'stZeroFLabelTextDirection',
+                'stZeroFLabelZone', 'tfDoNDCOverlay', 'tfPlotManagerOn',
+                'tfPolyDrawList', 'tfPolyDrawOrder', 'tiDeltaF', 'tiMainAngleF',
+                'tiMainConstantSpacingF', 'tiMainDirection', 'tiMainFont',
+                'tiMainFontAspectF', 'tiMainFontColor', 'tiMainFontHeightF',
+                'tiMainFontQuality', 'tiMainFontThicknessF', 'tiMainFuncCode',
+                'tiMainJust', 'tiMainOffsetXF', 'tiMainOffsetYF', 'tiMainOn',
+                'tiMainPosition', 'tiMainSide', 'tiMainString', 'tiUseMainAttributes',
+                'tiXAxisAngleF', 'tiXAxisConstantSpacingF', 'tiXAxisDirection',
+                'tiXAxisFont', 'tiXAxisFontAspectF', 'tiXAxisFontColor',
+                'tiXAxisFontHeightF', 'tiXAxisFontQuality', 'tiXAxisFontThicknessF',
+                'tiXAxisFuncCode', 'tiXAxisJust', 'tiXAxisOffsetXF',
+                'tiXAxisOffsetYF', 'tiXAxisOn', 'tiXAxisPosition', 'tiXAxisSide',
+                'tiXAxisString', 'tiYAxisAngleF', 'tiYAxisConstantSpacingF',
+                'tiYAxisDirection', 'tiYAxisFont', 'tiYAxisFontAspectF',
+                'tiYAxisFontColor', 'tiYAxisFontHeightF', 'tiYAxisFontQuality',
+                'tiYAxisFontThicknessF', 'tiYAxisFuncCode', 'tiYAxisJust',
+                'tiYAxisOffsetXF', 'tiYAxisOffsetYF', 'tiYAxisOn', 'tiYAxisPosition',
+                'tiYAxisSide', 'tiYAxisString', 'tmBorderLineColor',
+                'tmBorderThicknessF', 'tmEqualizeXYSizes', 'tmLabelAutoStride',
+                'tmSciNoteCutoff', 'tmXBAutoPrecision', 'tmXBBorderOn',
+                'tmXBDataLeftF', 'tmXBDataRightF', 'tmXBFormat', 'tmXBIrrTensionF',
+                'tmXBIrregularPoints', 'tmXBLabelAngleF', 'tmXBLabelConstantSpacingF',
+                'tmXBLabelDeltaF', 'tmXBLabelDirection', 'tmXBLabelFont',
+                'tmXBLabelFontAspectF', 'tmXBLabelFontColor', 'tmXBLabelFontHeightF',
+                'tmXBLabelFontQuality', 'tmXBLabelFontThicknessF',
+                'tmXBLabelFuncCode', 'tmXBLabelJust', 'tmXBLabelStride', 'tmXBLabels',
+                'tmXBLabelsOn', 'tmXBMajorLengthF', 'tmXBMajorLineColor',
+                'tmXBMajorOutwardLengthF', 'tmXBMajorThicknessF', 'tmXBMaxLabelLenF',
+                'tmXBMaxTicks', 'tmXBMinLabelSpacingF', 'tmXBMinorLengthF',
+                'tmXBMinorLineColor', 'tmXBMinorOn', 'tmXBMinorOutwardLengthF',
+                'tmXBMinorPerMajor', 'tmXBMinorThicknessF', 'tmXBMinorValues',
+                'tmXBMode', 'tmXBOn', 'tmXBPrecision', 'tmXBStyle', 'tmXBTickEndF',
+                'tmXBTickSpacingF', 'tmXBTickStartF', 'tmXBValues', 'tmXMajorGrid',
+                'tmXMajorGridLineColor', 'tmXMajorGridLineDashPattern',
+                'tmXMajorGridThicknessF', 'tmXMinorGrid', 'tmXMinorGridLineColor',
+                'tmXMinorGridLineDashPattern', 'tmXMinorGridThicknessF',
+                'tmXTAutoPrecision', 'tmXTBorderOn', 'tmXTDataLeftF',
+                'tmXTDataRightF', 'tmXTFormat', 'tmXTIrrTensionF',
+                'tmXTIrregularPoints', 'tmXTLabelAngleF', 'tmXTLabelConstantSpacingF',
+                'tmXTLabelDeltaF', 'tmXTLabelDirection', 'tmXTLabelFont',
+                'tmXTLabelFontAspectF', 'tmXTLabelFontColor', 'tmXTLabelFontHeightF',
+                'tmXTLabelFontQuality', 'tmXTLabelFontThicknessF',
+                'tmXTLabelFuncCode', 'tmXTLabelJust', 'tmXTLabelStride', 'tmXTLabels',
+                'tmXTLabelsOn', 'tmXTMajorLengthF', 'tmXTMajorLineColor',
+                'tmXTMajorOutwardLengthF', 'tmXTMajorThicknessF', 'tmXTMaxLabelLenF',
+                'tmXTMaxTicks', 'tmXTMinLabelSpacingF', 'tmXTMinorLengthF',
+                'tmXTMinorLineColor', 'tmXTMinorOn', 'tmXTMinorOutwardLengthF',
+                'tmXTMinorPerMajor', 'tmXTMinorThicknessF', 'tmXTMinorValues',
+                'tmXTMode', 'tmXTOn', 'tmXTPrecision', 'tmXTStyle', 'tmXTTickEndF',
+                'tmXTTickSpacingF', 'tmXTTickStartF', 'tmXTValues', 'tmXUseBottom',
+                'tmYLAutoPrecision', 'tmYLBorderOn', 'tmYLDataBottomF',
+                'tmYLDataTopF', 'tmYLFormat', 'tmYLIrrTensionF',
+                'tmYLIrregularPoints', 'tmYLLabelAngleF', 'tmYLLabelConstantSpacingF',
+                'tmYLLabelDeltaF', 'tmYLLabelDirection', 'tmYLLabelFont',
+                'tmYLLabelFontAspectF', 'tmYLLabelFontColor', 'tmYLLabelFontHeightF',
+                'tmYLLabelFontQuality', 'tmYLLabelFontThicknessF',
+                'tmYLLabelFuncCode', 'tmYLLabelJust', 'tmYLLabelStride', 'tmYLLabels',
+                'tmYLLabelsOn', 'tmYLMajorLengthF', 'tmYLMajorLineColor',
+                'tmYLMajorOutwardLengthF', 'tmYLMajorThicknessF', 'tmYLMaxLabelLenF',
+                'tmYLMaxTicks', 'tmYLMinLabelSpacingF', 'tmYLMinorLengthF',
+                'tmYLMinorLineColor', 'tmYLMinorOn', 'tmYLMinorOutwardLengthF',
+                'tmYLMinorPerMajor', 'tmYLMinorThicknessF', 'tmYLMinorValues',
+                'tmYLMode', 'tmYLOn', 'tmYLPrecision', 'tmYLStyle', 'tmYLTickEndF',
+                'tmYLTickSpacingF', 'tmYLTickStartF', 'tmYLValues', 'tmYMajorGrid',
+                'tmYMajorGridLineColor', 'tmYMajorGridLineDashPattern',
+                'tmYMajorGridThicknessF', 'tmYMinorGrid', 'tmYMinorGridLineColor',
+                'tmYMinorGridLineDashPattern', 'tmYMinorGridThicknessF',
+                'tmYRAutoPrecision', 'tmYRBorderOn', 'tmYRDataBottomF',
+                'tmYRDataTopF', 'tmYRFormat', 'tmYRIrrTensionF',
+                'tmYRIrregularPoints', 'tmYRLabelAngleF', 'tmYRLabelConstantSpacingF',
+                'tmYRLabelDeltaF', 'tmYRLabelDirection', 'tmYRLabelFont',
+                'tmYRLabelFontAspectF', 'tmYRLabelFontColor', 'tmYRLabelFontHeightF',
+                'tmYRLabelFontQuality', 'tmYRLabelFontThicknessF',
+                'tmYRLabelFuncCode', 'tmYRLabelJust', 'tmYRLabelStride', 'tmYRLabels',
+                'tmYRLabelsOn', 'tmYRMajorLengthF', 'tmYRMajorLineColor',
+                'tmYRMajorOutwardLengthF', 'tmYRMajorThicknessF', 'tmYRMaxLabelLenF',
+                'tmYRMaxTicks', 'tmYRMinLabelSpacingF', 'tmYRMinorLengthF',
+                'tmYRMinorLineColor', 'tmYRMinorOn', 'tmYRMinorOutwardLengthF',
+                'tmYRMinorPerMajor', 'tmYRMinorThicknessF', 'tmYRMinorValues',
+                'tmYRMode', 'tmYROn', 'tmYRPrecision', 'tmYRStyle', 'tmYRTickEndF',
+                'tmYRTickSpacingF', 'tmYRTickStartF', 'tmYRValues', 'tmYUseLeft',
+                'trGridType', 'trLineInterpolationOn',
+                'trXAxisType', 'trXCoordPoints', 'trXInterPoints', 'trXLog',
+                'trXMaxF', 'trXMinF', 'trXReverse', 'trXSamples', 'trXTensionF',
+                'trYAxisType', 'trYCoordPoints', 'trYInterPoints', 'trYLog',
+                'trYMaxF', 'trYMinF', 'trYReverse', 'trYSamples', 'trYTensionF',
+                'txAngleF', 'txBackgroundFillColor', 'txConstantSpacingF', 'txDirection',
+                'txFont', 'HLU-Fonts', 'txFontAspectF', 'txFontColor',
+                'txFontHeightF', 'txFontOpacityF', 'txFontQuality',
+                'txFontThicknessF', 'txFuncCode', 'txJust', 'txPerimColor',
+                'txPerimDashLengthF', 'txPerimDashPattern', 'txPerimOn',
+                'txPerimSpaceF', 'txPerimThicknessF', 'txPosXF', 'txPosYF',
+                'txString', 'vcExplicitLabelBarLabelsOn', 'vcFillArrowEdgeColor',
+                'vcFillArrowEdgeThicknessF', 'vcFillArrowFillColor',
+                'vcFillArrowHeadInteriorXF', 'vcFillArrowHeadMinFracXF',
+                'vcFillArrowHeadMinFracYF', 'vcFillArrowHeadXF', 'vcFillArrowHeadYF',
+                'vcFillArrowMinFracWidthF', 'vcFillArrowWidthF', 'vcFillArrowsOn',
+                'vcFillOverEdge', 'vcGlyphOpacityF', 'vcGlyphStyle',
+                'vcLabelBarEndLabelsOn', 'vcLabelFontColor', 'vcLabelFontHeightF',
+                'vcLabelsOn', 'vcLabelsUseVectorColor', 'vcLevelColors',
+                'vcLevelCount', 'vcLevelPalette', 'vcLevelSelectionMode',
+                'vcLevelSpacingF', 'vcLevels', 'vcLineArrowColor',
+                'vcLineArrowHeadMaxSizeF', 'vcLineArrowHeadMinSizeF',
+                'vcLineArrowThicknessF', 'vcMagnitudeFormat',
+                'vcMagnitudeScaleFactorF', 'vcMagnitudeScaleValueF',
+                'vcMagnitudeScalingMode', 'vcMapDirection', 'vcMaxLevelCount',
+                'vcMaxLevelValF', 'vcMaxMagnitudeF', 'vcMinAnnoAngleF',
+                'vcMinAnnoArrowAngleF', 'vcMinAnnoArrowEdgeColor',
+                'vcMinAnnoArrowFillColor', 'vcMinAnnoArrowLineColor',
+                'vcMinAnnoArrowMinOffsetF', 'vcMinAnnoArrowSpaceF',
+                'vcMinAnnoArrowUseVecColor', 'vcMinAnnoBackgroundColor',
+                'vcMinAnnoConstantSpacingF', 'vcMinAnnoExplicitMagnitudeF',
+                'vcMinAnnoFont', 'vcMinAnnoFontAspectF', 'vcMinAnnoFontColor',
+                'vcMinAnnoFontHeightF', 'vcMinAnnoFontQuality',
+                'vcMinAnnoFontThicknessF', 'vcMinAnnoFuncCode', 'vcMinAnnoJust',
+                'vcMinAnnoOn', 'vcMinAnnoOrientation', 'vcMinAnnoOrthogonalPosF',
+                'vcMinAnnoParallelPosF', 'vcMinAnnoPerimColor', 'vcMinAnnoPerimOn',
+                'vcMinAnnoPerimSpaceF', 'vcMinAnnoPerimThicknessF', 'vcMinAnnoSide',
+                'vcMinAnnoString1', 'vcMinAnnoString1On', 'vcMinAnnoString2',
+                'vcMinAnnoString2On', 'vcMinAnnoTextDirection', 'vcMinAnnoZone',
+                'vcMinDistanceF', 'vcMinFracLengthF', 'vcMinLevelValF',
+                'vcMinMagnitudeF', 'vcMonoFillArrowEdgeColor',
+                'vcMonoFillArrowFillColor', 'vcMonoLineArrowColor',
+                'vcMonoWindBarbColor', 'vcNoDataLabelOn', 'vcNoDataLabelString',
+                'vcPositionMode', 'vcRefAnnoAngleF', 'vcRefAnnoArrowAngleF',
+                'vcRefAnnoArrowEdgeColor', 'vcRefAnnoArrowFillColor',
+                'vcRefAnnoArrowLineColor', 'vcRefAnnoArrowMinOffsetF',
+                'vcRefAnnoArrowSpaceF', 'vcRefAnnoArrowUseVecColor',
+                'vcRefAnnoBackgroundColor', 'vcRefAnnoConstantSpacingF',
+                'vcRefAnnoExplicitMagnitudeF', 'vcRefAnnoFont',
+                'vcRefAnnoFontAspectF', 'vcRefAnnoFontColor', 'vcRefAnnoFontHeightF',
+                'vcRefAnnoFontQuality', 'vcRefAnnoFontThicknessF',
+                'vcRefAnnoFuncCode', 'vcRefAnnoJust', 'vcRefAnnoOn',
+                'vcRefAnnoOrientation', 'vcRefAnnoOrthogonalPosF',
+                'vcRefAnnoParallelPosF', 'vcRefAnnoPerimColor', 'vcRefAnnoPerimOn',
+                'vcRefAnnoPerimSpaceF', 'vcRefAnnoPerimThicknessF', 'vcRefAnnoSide',
+                'vcRefAnnoString1', 'vcRefAnnoString1On', 'vcRefAnnoString2',
+                'vcRefAnnoString2On', 'vcRefAnnoTextDirection', 'vcRefAnnoZone',
+                'vcRefLengthF', 'vcRefMagnitudeF', 'vcScalarFieldData',
+                'vcScalarMissingValColor', 'vcScalarValueFormat',
+                'vcScalarValueScaleFactorF', 'vcScalarValueScaleValueF',
+                'vcScalarValueScalingMode', 'vcSpanLevelPalette', 'vcUseRefAnnoRes',
+                'vcUseScalarArray', 'vcVectorDrawOrder', 'vcVectorFieldData',
+                'vcWindBarbCalmCircleSizeF', 'vcWindBarbColor',
+                'vcWindBarbLineThicknessF', 'vcWindBarbScaleFactorF',
+                'vcWindBarbTickAngleF', 'vcWindBarbTickLengthF',
+                'vcWindBarbTickSpacingF', 'vcZeroFLabelAngleF',
+                'vcZeroFLabelBackgroundColor', 'vcZeroFLabelConstantSpacingF',
+                'vcZeroFLabelFont', 'vcZeroFLabelFontAspectF',
+                'vcZeroFLabelFontColor', 'vcZeroFLabelFontHeightF',
+                'vcZeroFLabelFontQuality', 'vcZeroFLabelFontThicknessF',
+                'vcZeroFLabelFuncCode', 'vcZeroFLabelJust', 'vcZeroFLabelOn',
+                'vcZeroFLabelOrthogonalPosF', 'vcZeroFLabelParallelPosF',
+                'vcZeroFLabelPerimColor', 'vcZeroFLabelPerimOn',
+                'vcZeroFLabelPerimSpaceF', 'vcZeroFLabelPerimThicknessF',
+                'vcZeroFLabelSide', 'vcZeroFLabelString', 'vcZeroFLabelTextDirection',
+                'vcZeroFLabelZone', 'vfCopyData', 'vfDataArray',
+                'vfExchangeDimensions', 'vfExchangeUVData', 'vfMagMaxV', 'vfMagMinV',
+                'vfMissingUValueV', 'vfMissingVValueV', 'vfPolarData',
+                'vfSingleMissingValue', 'vfUDataArray', 'vfUMaxV', 'vfUMinV',
+                'vfVDataArray', 'vfVMaxV', 'vfVMinV', 'vfXArray', 'vfXCActualEndF',
+                'vfXCActualStartF', 'vfXCEndIndex', 'vfXCEndSubsetV', 'vfXCEndV',
+                'vfXCStartIndex', 'vfXCStartSubsetV', 'vfXCStartV', 'vfXCStride',
+                'vfYArray', 'vfYCActualEndF', 'vfYCActualStartF', 'vfYCEndIndex',
+                'vfYCEndSubsetV', 'vfYCEndV', 'vfYCStartIndex', 'vfYCStartSubsetV',
+                'vfYCStartV', 'vfYCStride', 'vpAnnoManagerId', 'vpClipOn',
+                'vpHeightF', 'vpKeepAspect', 'vpOn', 'vpUseSegments', 'vpWidthF',
+                'vpXF', 'vpYF', 'wkAntiAlias', 'wkBackgroundColor', 'wkBackgroundOpacityF',
+                'wkColorMapLen', 'wkColorMap', 'wkColorModel', 'wkDashTableLength',
+                'wkDefGraphicStyleId', 'wkDeviceLowerX', 'wkDeviceLowerY',
+                'wkDeviceUpperX', 'wkDeviceUpperY', 'wkFileName', 'wkFillTableLength',
+                'wkForegroundColor', 'wkFormat', 'wkFullBackground', 'wkGksWorkId',
+                'wkHeight', 'wkMarkerTableLength', 'wkMetaName', 'wkOrientation',
+                'wkPDFFileName', 'wkPDFFormat', 'wkPDFResolution', 'wkPSFileName',
+                'wkPSFormat', 'wkPSResolution', 'wkPaperHeightF', 'wkPaperSize',
+                'wkPaperWidthF', 'wkPause', 'wkTopLevelViews', 'wkViews',
+                'wkVisualType', 'wkWidth', 'wkWindowId', 'wkXColorMode', 'wsCurrentSize',
+                'wsMaximumSize', 'wsThresholdSize', 'xyComputeXMax',
+                'xyComputeXMin', 'xyComputeYMax', 'xyComputeYMin', 'xyCoordData',
+                'xyCoordDataSpec', 'xyCurveDrawOrder', 'xyDashPattern',
+                'xyDashPatterns', 'xyExplicitLabels', 'xyExplicitLegendLabels',
+                'xyLabelMode', 'xyLineColor', 'xyLineColors', 'xyLineDashSegLenF',
+                'xyLineLabelConstantSpacingF', 'xyLineLabelFont',
+                'xyLineLabelFontAspectF', 'xyLineLabelFontColor',
+                'xyLineLabelFontColors', 'xyLineLabelFontHeightF',
+                'xyLineLabelFontQuality', 'xyLineLabelFontThicknessF',
+                'xyLineLabelFuncCode', 'xyLineThicknessF', 'xyLineThicknesses',
+                'xyMarkLineMode', 'xyMarkLineModes', 'xyMarker', 'xyMarkerColor',
+                'xyMarkerColors', 'xyMarkerSizeF', 'xyMarkerSizes',
+                'xyMarkerThicknessF', 'xyMarkerThicknesses', 'xyMarkers',
+                'xyMonoDashPattern', 'xyMonoLineColor', 'xyMonoLineLabelFontColor',
+                'xyMonoLineThickness', 'xyMonoMarkLineMode', 'xyMonoMarker',
+                'xyMonoMarkerColor', 'xyMonoMarkerSize', 'xyMonoMarkerThickness',
+                'xyXIrrTensionF', 'xyXIrregularPoints', 'xyXStyle', 'xyYIrrTensionF',
+                'xyYIrregularPoints', 'xyYStyle'), prefix=r'\b'),
+             Name.Builtin),
+
+            # Booleans
+            (r'\.(True|False)\.', Name.Builtin),
+            # Comparing Operators
+            (r'\.(eq|ne|lt|le|gt|ge|not|and|or|xor)\.', Operator.Word),
+        ],
+
+        'strings': [
+            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
+        ],
+
+        'nums': [
+            (r'\d+(?![.e])(_[a-z]\w+)?', Number.Integer),
+            (r'[+-]?\d*\.\d+(e[-+]?\d+)?(_[a-z]\w+)?', Number.Float),
+            (r'[+-]?\d+\.\d*(e[-+]?\d+)?(_[a-z]\w+)?', Number.Float),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/nimrod.py b/.venv/Lib/site-packages/pygments/lexers/nimrod.py
new file mode 100644 (file)
index 0000000..365a8dc
--- /dev/null
@@ -0,0 +1,199 @@
+"""
+    pygments.lexers.nimrod
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Nim language (formerly known as Nimrod).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, default, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['NimrodLexer']
+
+
+class NimrodLexer(RegexLexer):
+    """
+    For Nim source code.
+    """
+
+    name = 'Nimrod'
+    url = 'http://nim-lang.org/'
+    aliases = ['nimrod', 'nim']
+    filenames = ['*.nim', '*.nimrod']
+    mimetypes = ['text/x-nim']
+    version_added = '1.5'
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    def underscorize(words):
+        newWords = []
+        new = []
+        for word in words:
+            for ch in word:
+                new.append(ch)
+                new.append("_?")
+            newWords.append(''.join(new))
+            new = []
+        return "|".join(newWords)
+
+    keywords = [
+        'addr', 'and', 'as', 'asm', 'bind', 'block', 'break', 'case',
+        'cast', 'concept', 'const', 'continue', 'converter', 'defer', 'discard',
+        'distinct', 'div', 'do', 'elif', 'else', 'end', 'enum', 'except',
+        'export', 'finally', 'for', 'if', 'in', 'yield', 'interface',
+        'is', 'isnot', 'iterator', 'let', 'mixin', 'mod',
+        'not', 'notin', 'object', 'of', 'or', 'out', 'ptr', 'raise',
+        'ref', 'return', 'shl', 'shr', 'static', 'try',
+        'tuple', 'type', 'using', 'when', 'while', 'xor'
+    ]
+
+    keywordsPseudo = [
+        'nil', 'true', 'false'
+    ]
+
+    opWords = [
+        'and', 'or', 'not', 'xor', 'shl', 'shr', 'div', 'mod', 'in',
+        'notin', 'is', 'isnot'
+    ]
+
+    types = [
+        'int', 'int8', 'int16', 'int32', 'int64', 'float', 'float32', 'float64',
+        'bool', 'char', 'range', 'array', 'seq', 'set', 'string'
+    ]
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'##\[', String.Doc, 'doccomment'),
+            (r'##.*$', String.Doc),
+            (r'#\[', Comment.Multiline, 'comment'),
+            (r'#.*$', Comment),
+
+            # Pragmas
+            (r'\{\.', String.Other, 'pragma'),
+
+            # Operators
+            (r'[*=><+\-/@$~&%!?|\\\[\]]', Operator),
+            (r'\.\.|\.|,|\[\.|\.\]|\{\.|\.\}|\(\.|\.\)|\{|\}|\(|\)|:|\^|`|;',
+             Punctuation),
+
+            # Case statement branch
+            (r'(\n\s*)(of)(\s)', bygroups(Text.Whitespace, Keyword,
+                                          Text.Whitespace), 'casebranch'),
+
+            # Strings
+            (r'(?:[\w]+)"', String, 'rdqs'),
+            (r'"""', String.Double, 'tdqs'),
+            ('"', String, 'dqs'),
+
+            # Char
+            ("'", String.Char, 'chars'),
+
+            # Keywords
+            (rf'({underscorize(opWords)})\b', Operator.Word),
+            (r'(proc|func|method|macro|template)(\s)(?![(\[\]])',
+             bygroups(Keyword, Text.Whitespace), 'funcname'),
+            (rf'({underscorize(keywords)})\b', Keyword),
+            (r'({})\b'.format(underscorize(['from', 'import', 'include', 'export'])),
+             Keyword.Namespace),
+            (r'(v_?a_?r)\b', Keyword.Declaration),
+            (rf'({underscorize(types)})\b', Name.Builtin),
+            (rf'({underscorize(keywordsPseudo)})\b', Keyword.Pseudo),
+
+            # Identifiers
+            (r'\b((?![_\d])\w)(((?!_)\w)|(_(?!_)\w))*', Name),
+
+            # Numbers
+            (r'[0-9][0-9_]*(?=([e.]|\'f(32|64)))',
+             Number.Float, ('float-suffix', 'float-number')),
+            (r'0x[a-f0-9][a-f0-9_]*', Number.Hex, 'int-suffix'),
+            (r'0b[01][01_]*', Number.Bin, 'int-suffix'),
+            (r'0o[0-7][0-7_]*', Number.Oct, 'int-suffix'),
+            (r'[0-9][0-9_]*', Number.Integer, 'int-suffix'),
+
+            # Whitespace
+            (r'\s+', Text.Whitespace),
+            (r'.+$', Error),
+        ],
+        'chars': [
+            (r'\\([\\abcefnrtvl"\']|x[a-f0-9]{2}|[0-9]{1,3})', String.Escape),
+            (r"'", String.Char, '#pop'),
+            (r".", String.Char)
+        ],
+        'strings': [
+            (r'(?<!\$)\$(\d+|#|\w+)+', String.Interpol),
+            (r'[^\\\'"$\n]+', String),
+            # quotes, dollars and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+            # unhandled string formatting sign
+            (r'\$', String)
+            # newlines are an error (use "nl" state)
+        ],
+        'doccomment': [
+            (r'[^\]#]+', String.Doc),
+            (r'##\[', String.Doc, '#push'),
+            (r'\]##', String.Doc, '#pop'),
+            (r'[\]#]', String.Doc),
+        ],
+        'comment': [
+            (r'[^\]#]+', Comment.Multiline),
+            (r'#\[', Comment.Multiline, '#push'),
+            (r'\]#', Comment.Multiline, '#pop'),
+            (r'[\]#]', Comment.Multiline),
+        ],
+        'dqs': [
+            (r'\\([\\abcefnrtvl"\']|\n|x[a-f0-9]{2}|[0-9]{1,3})',
+             String.Escape),
+            (r'"', String, '#pop'),
+            include('strings')
+        ],
+        'rdqs': [
+            (r'"(?!")', String, '#pop'),
+            (r'""', String.Escape),
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String.Double, '#pop'),
+            include('strings'),
+            (r'\n', String.Double)
+        ],
+        'funcname': [
+            (r'((?![\d_])\w)(((?!_)\w)|(_(?!_)\w))*', Name.Function, '#pop'),
+            (r'`.+`', Name.Function, '#pop')
+        ],
+        'nl': [
+            (r'\n', String)
+        ],
+        'float-number': [
+            (r'\.(?!\.)[0-9_]*[f]*', Number.Float),
+            (r'e[+-]?[0-9][0-9_]*', Number.Float),
+            default('#pop')
+        ],
+        'float-suffix': [
+            (r'\'f(32|64)', Number.Float),
+            default('#pop')
+        ],
+        'int-suffix': [
+            (r'\'i(32|64)', Number.Integer.Long),
+            (r'\'i(8|16)', Number.Integer),
+            default('#pop')
+        ],
+        'casebranch': [
+            (r',', Punctuation),
+            (r'[\n ]+', Text.Whitespace),
+            (r':', Operator, '#pop'),
+            (r'\w+|[^:]', Name.Label),
+        ],
+        'pragma': [
+            (r'[:,]', Text),
+            (r'[\n ]+', Text.Whitespace),
+            (r'\.\}', String.Other, '#pop'),
+            (r'\w+|\W+|[^.}]', String.Other),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/nit.py b/.venv/Lib/site-packages/pygments/lexers/nit.py
new file mode 100644 (file)
index 0000000..2d2122c
--- /dev/null
@@ -0,0 +1,63 @@
+"""
+    pygments.lexers.nit
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Nit language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['NitLexer']
+
+
+class NitLexer(RegexLexer):
+    """
+    For nit source.
+    """
+
+    name = 'Nit'
+    url = 'http://nitlanguage.org'
+    aliases = ['nit']
+    filenames = ['*.nit']
+    version_added = '2.0'
+    tokens = {
+        'root': [
+            (r'#.*?$', Comment.Single),
+            (words((
+                'package', 'module', 'import', 'class', 'abstract', 'interface',
+                'universal', 'enum', 'end', 'fun', 'type', 'init', 'redef',
+                'isa', 'do', 'readable', 'writable', 'var', 'intern', 'extern',
+                'public', 'protected', 'private', 'intrude', 'if', 'then',
+                'else', 'while', 'loop', 'for', 'in', 'and', 'or', 'not',
+                'implies', 'return', 'continue', 'break', 'abort', 'assert',
+                'new', 'is', 'once', 'super', 'self', 'true', 'false', 'nullable',
+                'null', 'as', 'isset', 'label', '__debug__'), suffix=r'(?=[\r\n\t( ])'),
+             Keyword),
+            (r'[A-Z]\w*', Name.Class),
+            (r'"""(([^\'\\]|\\.)|\\r|\\n)*((\{\{?)?(""?\{\{?)*""""*)', String),  # Simple long string
+            (r'\'\'\'(((\\.|[^\'\\])|\\r|\\n)|\'((\\.|[^\'\\])|\\r|\\n)|'
+             r'\'\'((\\.|[^\'\\])|\\r|\\n))*\'\'\'', String),  # Simple long string alt
+            (r'"""(([^\'\\]|\\.)|\\r|\\n)*((""?)?(\{\{?""?)*\{\{\{\{*)', String),  # Start long string
+            (r'\}\}\}(((\\.|[^\'\\])|\\r|\\n))*(""?)?(\{\{?""?)*\{\{\{\{*', String),  # Mid long string
+            (r'\}\}\}(((\\.|[^\'\\])|\\r|\\n))*(\{\{?)?(""?\{\{?)*""""*', String),  # End long string
+            (r'"(\\.|([^"}{\\]))*"', String),  # Simple String
+            (r'"(\\.|([^"}{\\]))*\{', String),  # Start string
+            (r'\}(\\.|([^"}{\\]))*\{', String),  # Mid String
+            (r'\}(\\.|([^"}{\\]))*"', String),  # End String
+            (r'(\'[^\'\\]\')|(\'\\.\')', String.Char),
+            (r'[0-9]+', Number.Integer),
+            (r'[0-9]*.[0-9]+', Number.Float),
+            (r'0(x|X)[0-9A-Fa-f]+', Number.Hex),
+            (r'[a-z]\w*', Name),
+            (r'_\w+', Name.Variable.Instance),
+            (r'==|!=|<==>|>=|>>|>|<=|<<|<|\+|-|=|/|\*|%|\+=|-=|!|@', Operator),
+            (r'\(|\)|\[|\]|,|\.\.\.|\.\.|\.|::|:', Punctuation),
+            (r'`\{[^`]*`\}', Text),  # Extern blocks won't be Lexed by Nit
+            (r'[\r\n\t ]+', Text),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/nix.py b/.venv/Lib/site-packages/pygments/lexers/nix.py
new file mode 100644 (file)
index 0000000..3fa88c6
--- /dev/null
@@ -0,0 +1,144 @@
+"""
+    pygments.lexers.nix
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the NixOS Nix language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal
+
+__all__ = ['NixLexer']
+
+
+class NixLexer(RegexLexer):
+    """
+    For the Nix language.
+    """
+
+    name = 'Nix'
+    url = 'http://nixos.org/nix/'
+    aliases = ['nixos', 'nix']
+    filenames = ['*.nix']
+    mimetypes = ['text/x-nix']
+    version_added = '2.0'
+
+    keywords = ['rec', 'with', 'let', 'in', 'inherit', 'assert', 'if',
+                'else', 'then', '...']
+    builtins = ['import', 'abort', 'baseNameOf', 'dirOf', 'isNull', 'builtins',
+                'map', 'removeAttrs', 'throw', 'toString', 'derivation']
+    operators = ['++', '+', '?', '.', '!', '//', '==', '/',
+                 '!=', '&&', '||', '->', '=', '<', '>', '*', '-']
+
+    punctuations = ["(", ")", "[", "]", ";", "{", "}", ":", ",", "@"]
+
+    tokens = {
+        'root': [
+            # comments starting with #
+            (r'#.*$', Comment.Single),
+
+            # multiline comments
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            # whitespace
+            (r'\s+', Text),
+
+            # keywords
+            ('({})'.format('|'.join(re.escape(entry) + '\\b' for entry in keywords)), Keyword),
+
+            # highlight the builtins
+            ('({})'.format('|'.join(re.escape(entry) + '\\b' for entry in builtins)),
+             Name.Builtin),
+
+            (r'\b(true|false|null)\b', Name.Constant),
+
+            # floats
+            (r'-?(\d+\.\d*|\.\d+)([eE][-+]?\d+)?', Number.Float),
+
+            # integers
+            (r'-?[0-9]+', Number.Integer),
+
+            # paths
+            (r'[\w.+-]*(\/[\w.+-]+)+', Literal),
+            (r'~(\/[\w.+-]+)+', Literal),
+            (r'\<[\w.+-]+(\/[\w.+-]+)*\>', Literal),
+
+            # operators
+            ('({})'.format('|'.join(re.escape(entry) for entry in operators)),
+             Operator),
+
+            # word operators
+            (r'\b(or|and)\b', Operator.Word),
+
+            (r'\{', Punctuation, 'block'),
+
+            # punctuations
+            ('({})'.format('|'.join(re.escape(entry) for entry in punctuations)), Punctuation),
+
+            # strings
+            (r'"', String.Double, 'doublequote'),
+            (r"''", String.Multiline, 'multiline'),
+
+            # urls
+            (r'[a-zA-Z][a-zA-Z0-9\+\-\.]*\:[\w%/?:@&=+$,\\.!~*\'-]+', Literal),
+
+            # names of variables
+            (r'[\w-]+(?=\s*=)', String.Symbol),
+            (r'[a-zA-Z_][\w\'-]*', Text),
+
+            (r"\$\{", String.Interpol, 'antiquote'),
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'multiline': [
+            (r"''(\$|'|\\n|\\r|\\t|\\)", String.Escape),
+            (r"''", String.Multiline, '#pop'),
+            (r'\$\{', String.Interpol, 'antiquote'),
+            (r"[^'\$]+", String.Multiline),
+            (r"\$[^\{']", String.Multiline),
+            (r"'[^']", String.Multiline),
+            (r"\$(?=')", String.Multiline),
+        ],
+        'doublequote': [
+            (r'\\(\\|"|\$|n)', String.Escape),
+            (r'"', String.Double, '#pop'),
+            (r'\$\{', String.Interpol, 'antiquote'),
+            (r'[^"\\\$]+', String.Double),
+            (r'\$[^\{"]', String.Double),
+            (r'\$(?=")', String.Double),
+            (r'\\', String.Double),
+        ],
+        'antiquote': [
+            (r"\}", String.Interpol, '#pop'),
+            # TODO: we should probably escape also here ''${ \${
+            (r"\$\{", String.Interpol, '#push'),
+            include('root'),
+        ],
+        'block': [
+            (r"\}", Punctuation, '#pop'),
+            include('root'),
+        ],
+    }
+
+    def analyse_text(text):
+        rv = 0.0
+        # TODO: let/in
+        if re.search(r'import.+?<[^>]+>', text):
+            rv += 0.4
+        if re.search(r'mkDerivation\s+(\(|\{|rec)', text):
+            rv += 0.4
+        if re.search(r'=\s+mkIf\s+', text):
+            rv += 0.4
+        if re.search(r'\{[a-zA-Z,\s]+\}:', text):
+            rv += 0.1
+        return rv
diff --git a/.venv/Lib/site-packages/pygments/lexers/numbair.py b/.venv/Lib/site-packages/pygments/lexers/numbair.py
new file mode 100644 (file)
index 0000000..435863e
--- /dev/null
@@ -0,0 +1,63 @@
+"""
+    pygments.lexers.numbair
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for other Numba Intermediate Representation.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, words
+from pygments.token import Whitespace, Name, String,  Punctuation, Keyword, \
+    Operator, Number
+
+__all__ = ["NumbaIRLexer"]
+
+class NumbaIRLexer(RegexLexer):
+    """
+    Lexer for Numba IR
+    """
+    name = 'Numba_IR'
+    url = "https://numba.readthedocs.io/en/stable/developer/architecture.html#stage-2-generate-the-numba-ir"
+    aliases = ['numba_ir', 'numbair']
+    filenames = ['*.numba_ir']
+    mimetypes = ['text/x-numba_ir', 'text/x-numbair']
+    version_added = '2.19'
+
+    identifier = r'\$[a-zA-Z0-9._]+'
+    fun_or_var = r'([a-zA-Z_]+[a-zA-Z0-9]*)'
+
+    tokens = {
+        'root' : [
+            (r'(label)(\ [0-9]+)(:)$',
+                bygroups(Keyword, Name.Label, Punctuation)),
+
+            (r'=', Operator),
+            include('whitespace'),
+            include('keyword'),
+
+            (identifier, Name.Variable),
+            (fun_or_var + r'(\()',
+                bygroups(Name.Function, Punctuation)),
+            (fun_or_var + r'(\=)',
+                bygroups(Name.Attribute, Punctuation)),
+            (fun_or_var, Name.Constant),
+            (r'[0-9]+', Number),
+
+            # <built-in function some>
+            (r'<[^>\n]*>', String),
+
+            (r'[=<>{}\[\]()*.,!\':]|x\b', Punctuation)
+        ],
+
+        'keyword':[
+            (words((
+                'del', 'jump', 'call', 'branch',
+            ), suffix=' '), Keyword),
+        ],
+
+        'whitespace': [
+            (r'(\n|\s)+', Whitespace),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/oberon.py b/.venv/Lib/site-packages/pygments/lexers/oberon.py
new file mode 100644 (file)
index 0000000..61f3c2d
--- /dev/null
@@ -0,0 +1,120 @@
+"""
+    pygments.lexers.oberon
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Oberon family languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['ComponentPascalLexer']
+
+
+class ComponentPascalLexer(RegexLexer):
+    """
+    For Component Pascal source code.
+    """
+    name = 'Component Pascal'
+    aliases = ['componentpascal', 'cp']
+    filenames = ['*.cp', '*.cps']
+    mimetypes = ['text/x-component-pascal']
+    url = 'https://blackboxframework.org'
+    version_added = '2.1'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            include('punctuation'),
+            include('numliterals'),
+            include('strings'),
+            include('operators'),
+            include('builtins'),
+            include('identifiers'),
+        ],
+        'whitespace': [
+            (r'\n+', Text),  # blank lines
+            (r'\s+', Text),  # whitespace
+        ],
+        'comments': [
+            (r'\(\*([^$].*?)\*\)', Comment.Multiline),
+            # TODO: nested comments (* (* ... *) ... (* ... *) *) not supported!
+        ],
+        'punctuation': [
+            (r'[()\[\]{},.:;|]', Punctuation),
+        ],
+        'numliterals': [
+            (r'[0-9A-F]+X\b', Number.Hex),                 # char code
+            (r'[0-9A-F]+[HL]\b', Number.Hex),              # hexadecimal number
+            (r'[0-9]+\.[0-9]+E[+-][0-9]+', Number.Float),  # real number
+            (r'[0-9]+\.[0-9]+', Number.Float),             # real number
+            (r'[0-9]+', Number.Integer),                   # decimal whole number
+        ],
+        'strings': [
+            (r"'[^\n']*'", String),  # single quoted string
+            (r'"[^\n"]*"', String),  # double quoted string
+        ],
+        'operators': [
+            # Arithmetic Operators
+            (r'[+-]', Operator),
+            (r'[*/]', Operator),
+            # Relational Operators
+            (r'[=#<>]', Operator),
+            # Dereferencing Operator
+            (r'\^', Operator),
+            # Logical AND Operator
+            (r'&', Operator),
+            # Logical NOT Operator
+            (r'~', Operator),
+            # Assignment Symbol
+            (r':=', Operator),
+            # Range Constructor
+            (r'\.\.', Operator),
+            (r'\$', Operator),
+        ],
+        'identifiers': [
+            (r'([a-zA-Z_$][\w$]*)', Name),
+        ],
+        'builtins': [
+            (words((
+                'ANYPTR', 'ANYREC', 'BOOLEAN', 'BYTE', 'CHAR', 'INTEGER', 'LONGINT',
+                'REAL', 'SET', 'SHORTCHAR', 'SHORTINT', 'SHORTREAL'
+                ), suffix=r'\b'), Keyword.Type),
+            (words((
+                'ABS', 'ABSTRACT', 'ARRAY', 'ASH', 'ASSERT', 'BEGIN', 'BITS', 'BY',
+                'CAP', 'CASE', 'CHR', 'CLOSE', 'CONST', 'DEC', 'DIV', 'DO', 'ELSE',
+                'ELSIF', 'EMPTY', 'END', 'ENTIER', 'EXCL', 'EXIT', 'EXTENSIBLE', 'FOR',
+                'HALT', 'IF', 'IMPORT', 'IN', 'INC', 'INCL', 'IS', 'LEN', 'LIMITED',
+                'LONG', 'LOOP', 'MAX', 'MIN', 'MOD', 'MODULE', 'NEW', 'ODD', 'OF',
+                'OR', 'ORD', 'OUT', 'POINTER', 'PROCEDURE', 'RECORD', 'REPEAT', 'RETURN',
+                'SHORT', 'SHORTCHAR', 'SHORTINT', 'SIZE', 'THEN', 'TYPE', 'TO', 'UNTIL',
+                'VAR', 'WHILE', 'WITH'
+                ), suffix=r'\b'), Keyword.Reserved),
+            (r'(TRUE|FALSE|NIL|INF)\b', Keyword.Constant),
+        ]
+    }
+
+    def analyse_text(text):
+        """The only other lexer using .cp is the C++ one, so we check if for
+        a few common Pascal keywords here. Those are unfortunately quite
+        common across various business languages as well."""
+        result = 0
+        if 'BEGIN' in text:
+            result += 0.01
+        if 'END' in text:
+            result += 0.01
+        if 'PROCEDURE' in text:
+            result += 0.01
+        if 'END' in text:
+            result += 0.01
+
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/objective.py b/.venv/Lib/site-packages/pygments/lexers/objective.py
new file mode 100644 (file)
index 0000000..899c2c4
--- /dev/null
@@ -0,0 +1,513 @@
+"""
+    pygments.lexers.objective
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Objective-C family languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this, words, \
+    inherit, default
+from pygments.token import Text, Keyword, Name, String, Operator, \
+    Number, Punctuation, Literal, Comment, Whitespace
+
+from pygments.lexers.c_cpp import CLexer, CppLexer
+
+__all__ = ['ObjectiveCLexer', 'ObjectiveCppLexer', 'LogosLexer', 'SwiftLexer']
+
+
+def objective(baselexer):
+    """
+    Generate a subclass of baselexer that accepts the Objective-C syntax
+    extensions.
+    """
+
+    # Have to be careful not to accidentally match JavaDoc/Doxygen syntax here,
+    # since that's quite common in ordinary C/C++ files.  It's OK to match
+    # JavaDoc/Doxygen keywords that only apply to Objective-C, mind.
+    #
+    # The upshot of this is that we CANNOT match @class or @interface
+    _oc_keywords = re.compile(r'@(?:end|implementation|protocol)')
+
+    # Matches [ <ws>? identifier <ws> ( identifier <ws>? ] |  identifier? : )
+    # (note the identifier is *optional* when there is a ':'!)
+    _oc_message = re.compile(r'\[\s*[a-zA-Z_]\w*\s+'
+                             r'(?:[a-zA-Z_]\w*\s*\]|'
+                             r'(?:[a-zA-Z_]\w*)?:)')
+
+    class GeneratedObjectiveCVariant(baselexer):
+        """
+        Implements Objective-C syntax on top of an existing C family lexer.
+        """
+
+        tokens = {
+            'statements': [
+                (r'@"', String, 'string'),
+                (r'@(YES|NO)', Number),
+                (r"@'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+                (r'@(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+                (r'@(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+                (r'@0x[0-9a-fA-F]+[Ll]?', Number.Hex),
+                (r'@0[0-7]+[Ll]?', Number.Oct),
+                (r'@\d+[Ll]?', Number.Integer),
+                (r'@\(', Literal, 'literal_number'),
+                (r'@\[', Literal, 'literal_array'),
+                (r'@\{', Literal, 'literal_dictionary'),
+                (words((
+                    '@selector', '@private', '@protected', '@public', '@encode',
+                    '@synchronized', '@try', '@throw', '@catch', '@finally',
+                    '@end', '@property', '@synthesize', '__bridge', '__bridge_transfer',
+                    '__autoreleasing', '__block', '__weak', '__strong', 'weak', 'strong',
+                    'copy', 'retain', 'assign', 'unsafe_unretained', 'atomic', 'nonatomic',
+                    'readonly', 'readwrite', 'setter', 'getter', 'typeof', 'in',
+                    'out', 'inout', 'release', 'class', '@dynamic', '@optional',
+                    '@required', '@autoreleasepool', '@import'), suffix=r'\b'),
+                 Keyword),
+                (words(('id', 'instancetype', 'Class', 'IMP', 'SEL', 'BOOL',
+                        'IBOutlet', 'IBAction', 'unichar'), suffix=r'\b'),
+                 Keyword.Type),
+                (r'@(true|false|YES|NO)\n', Name.Builtin),
+                (r'(YES|NO|nil|self|super)\b', Name.Builtin),
+                # Carbon types
+                (r'(Boolean|UInt8|SInt8|UInt16|SInt16|UInt32|SInt32)\b', Keyword.Type),
+                # Carbon built-ins
+                (r'(TRUE|FALSE)\b', Name.Builtin),
+                (r'(@interface|@implementation)(\s+)', bygroups(Keyword, Text),
+                 ('#pop', 'oc_classname')),
+                (r'(@class|@protocol)(\s+)', bygroups(Keyword, Text),
+                 ('#pop', 'oc_forward_classname')),
+                # @ can also prefix other expressions like @{...} or @(...)
+                (r'@', Punctuation),
+                inherit,
+            ],
+            'oc_classname': [
+                # interface definition that inherits
+                (r'([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?(\s*)(\{)',
+                 bygroups(Name.Class, Text, Name.Class, Text, Punctuation),
+                 ('#pop', 'oc_ivars')),
+                (r'([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?',
+                 bygroups(Name.Class, Text, Name.Class), '#pop'),
+                # interface definition for a category
+                (r'([a-zA-Z$_][\w$]*)(\s*)(\([a-zA-Z$_][\w$]*\))(\s*)(\{)',
+                 bygroups(Name.Class, Text, Name.Label, Text, Punctuation),
+                 ('#pop', 'oc_ivars')),
+                (r'([a-zA-Z$_][\w$]*)(\s*)(\([a-zA-Z$_][\w$]*\))',
+                 bygroups(Name.Class, Text, Name.Label), '#pop'),
+                # simple interface / implementation
+                (r'([a-zA-Z$_][\w$]*)(\s*)(\{)',
+                 bygroups(Name.Class, Text, Punctuation), ('#pop', 'oc_ivars')),
+                (r'([a-zA-Z$_][\w$]*)', Name.Class, '#pop')
+            ],
+            'oc_forward_classname': [
+                (r'([a-zA-Z$_][\w$]*)(\s*,\s*)',
+                 bygroups(Name.Class, Text), 'oc_forward_classname'),
+                (r'([a-zA-Z$_][\w$]*)(\s*;?)',
+                 bygroups(Name.Class, Text), '#pop')
+            ],
+            'oc_ivars': [
+                include('whitespace'),
+                include('statements'),
+                (';', Punctuation),
+                (r'\{', Punctuation, '#push'),
+                (r'\}', Punctuation, '#pop'),
+            ],
+            'root': [
+                # methods
+                (r'^([-+])(\s*)'                         # method marker
+                 r'(\(.*?\))?(\s*)'                      # return type
+                 r'([a-zA-Z$_][\w$]*:?)',        # begin of method name
+                 bygroups(Punctuation, Text, using(this),
+                          Text, Name.Function),
+                 'method'),
+                inherit,
+            ],
+            'method': [
+                include('whitespace'),
+                # TODO unsure if ellipses are allowed elsewhere, see
+                # discussion in Issue 789
+                (r',', Punctuation),
+                (r'\.\.\.', Punctuation),
+                (r'(\(.*?\))(\s*)([a-zA-Z$_][\w$]*)',
+                 bygroups(using(this), Text, Name.Variable)),
+                (r'[a-zA-Z$_][\w$]*:', Name.Function),
+                (';', Punctuation, '#pop'),
+                (r'\{', Punctuation, 'function'),
+                default('#pop'),
+            ],
+            'literal_number': [
+                (r'\(', Punctuation, 'literal_number_inner'),
+                (r'\)', Literal, '#pop'),
+                include('statement'),
+            ],
+            'literal_number_inner': [
+                (r'\(', Punctuation, '#push'),
+                (r'\)', Punctuation, '#pop'),
+                include('statement'),
+            ],
+            'literal_array': [
+                (r'\[', Punctuation, 'literal_array_inner'),
+                (r'\]', Literal, '#pop'),
+                include('statement'),
+            ],
+            'literal_array_inner': [
+                (r'\[', Punctuation, '#push'),
+                (r'\]', Punctuation, '#pop'),
+                include('statement'),
+            ],
+            'literal_dictionary': [
+                (r'\}', Literal, '#pop'),
+                include('statement'),
+            ],
+        }
+
+        def analyse_text(text):
+            if _oc_keywords.search(text):
+                return 1.0
+            elif '@"' in text:  # strings
+                return 0.8
+            elif re.search('@[0-9]+', text):
+                return 0.7
+            elif _oc_message.search(text):
+                return 0.8
+            return 0
+
+        def get_tokens_unprocessed(self, text, stack=('root',)):
+            from pygments.lexers._cocoa_builtins import COCOA_INTERFACES, \
+                COCOA_PROTOCOLS, COCOA_PRIMITIVES
+
+            for index, token, value in \
+                    baselexer.get_tokens_unprocessed(self, text, stack):
+                if token is Name or token is Name.Class:
+                    if value in COCOA_INTERFACES or value in COCOA_PROTOCOLS \
+                       or value in COCOA_PRIMITIVES:
+                        token = Name.Builtin.Pseudo
+
+                yield index, token, value
+
+    return GeneratedObjectiveCVariant
+
+
+class ObjectiveCLexer(objective(CLexer)):
+    """
+    For Objective-C source code with preprocessor directives.
+    """
+
+    name = 'Objective-C'
+    url = 'https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html'
+    aliases = ['objective-c', 'objectivec', 'obj-c', 'objc']
+    filenames = ['*.m', '*.h']
+    mimetypes = ['text/x-objective-c']
+    version_added = ''
+    priority = 0.05    # Lower than C
+
+
+class ObjectiveCppLexer(objective(CppLexer)):
+    """
+    For Objective-C++ source code with preprocessor directives.
+    """
+
+    name = 'Objective-C++'
+    aliases = ['objective-c++', 'objectivec++', 'obj-c++', 'objc++']
+    filenames = ['*.mm', '*.hh']
+    mimetypes = ['text/x-objective-c++']
+    version_added = ''
+    priority = 0.05    # Lower than C++
+
+
+class LogosLexer(ObjectiveCppLexer):
+    """
+    For Logos + Objective-C source code with preprocessor directives.
+    """
+
+    name = 'Logos'
+    aliases = ['logos']
+    filenames = ['*.x', '*.xi', '*.xm', '*.xmi']
+    mimetypes = ['text/x-logos']
+    version_added = '1.6'
+    priority = 0.25
+
+    tokens = {
+        'statements': [
+            (r'(%orig|%log)\b', Keyword),
+            (r'(%c)\b(\()(\s*)([a-zA-Z$_][\w$]*)(\s*)(\))',
+             bygroups(Keyword, Punctuation, Text, Name.Class, Text, Punctuation)),
+            (r'(%init)\b(\()',
+             bygroups(Keyword, Punctuation), 'logos_init_directive'),
+            (r'(%init)(?=\s*;)', bygroups(Keyword)),
+            (r'(%hook|%group)(\s+)([a-zA-Z$_][\w$]+)',
+             bygroups(Keyword, Text, Name.Class), '#pop'),
+            (r'(%subclass)(\s+)', bygroups(Keyword, Text),
+             ('#pop', 'logos_classname')),
+            inherit,
+        ],
+        'logos_init_directive': [
+            (r'\s+', Text),
+            (',', Punctuation, ('logos_init_directive', '#pop')),
+            (r'([a-zA-Z$_][\w$]*)(\s*)(=)(\s*)([^);]*)',
+             bygroups(Name.Class, Text, Punctuation, Text, Text)),
+            (r'([a-zA-Z$_][\w$]*)', Name.Class),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'logos_classname': [
+            (r'([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?',
+             bygroups(Name.Class, Text, Name.Class), '#pop'),
+            (r'([a-zA-Z$_][\w$]*)', Name.Class, '#pop')
+        ],
+        'root': [
+            (r'(%subclass)(\s+)', bygroups(Keyword, Text),
+             'logos_classname'),
+            (r'(%hook|%group)(\s+)([a-zA-Z$_][\w$]+)',
+             bygroups(Keyword, Text, Name.Class)),
+            (r'(%config)(\s*\(\s*)(\w+)(\s*=)(.*?)(\)\s*)',
+             bygroups(Keyword, Text, Name.Variable, Text, String, Text)),
+            (r'(%ctor)(\s*)(\{)', bygroups(Keyword, Text, Punctuation),
+             'function'),
+            (r'(%new)(\s*)(\()(.*?)(\))',
+             bygroups(Keyword, Text, Keyword, String, Keyword)),
+            (r'(\s*)(%end)(\s*)', bygroups(Text, Keyword, Text)),
+            inherit,
+        ],
+    }
+
+    _logos_keywords = re.compile(r'%(?:hook|ctor|init|c\()')
+
+    def analyse_text(text):
+        if LogosLexer._logos_keywords.search(text):
+            return 1.0
+        return 0
+
+
+class SwiftLexer(RegexLexer):
+    """
+    For Swift source.
+    """
+    name = 'Swift'
+    url = 'https://www.swift.org/'
+    filenames = ['*.swift']
+    aliases = ['swift']
+    mimetypes = ['text/x-swift']
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            # Whitespace and Comments
+            (r'\n', Text),
+            (r'\s+', Whitespace),
+            (r'//', Comment.Single, 'comment-single'),
+            (r'/\*', Comment.Multiline, 'comment-multi'),
+            (r'#(if|elseif|else|endif|available)\b', Comment.Preproc, 'preproc'),
+
+            # Keywords
+            include('keywords'),
+
+            # Global Types
+            (words((
+                'Array', 'AutoreleasingUnsafeMutablePointer', 'BidirectionalReverseView',
+                'Bit', 'Bool', 'CFunctionPointer', 'COpaquePointer', 'CVaListPointer',
+                'Character', 'ClosedInterval', 'CollectionOfOne', 'ContiguousArray',
+                'Dictionary', 'DictionaryGenerator', 'DictionaryIndex', 'Double',
+                'EmptyCollection', 'EmptyGenerator', 'EnumerateGenerator',
+                'EnumerateSequence', 'FilterCollectionView',
+                'FilterCollectionViewIndex', 'FilterGenerator', 'FilterSequenceView',
+                'Float', 'Float80', 'FloatingPointClassification', 'GeneratorOf',
+                'GeneratorOfOne', 'GeneratorSequence', 'HalfOpenInterval', 'HeapBuffer',
+                'HeapBufferStorage', 'ImplicitlyUnwrappedOptional', 'IndexingGenerator',
+                'Int', 'Int16', 'Int32', 'Int64', 'Int8', 'LazyBidirectionalCollection',
+                'LazyForwardCollection', 'LazyRandomAccessCollection',
+                'LazySequence', 'MapCollectionView', 'MapSequenceGenerator',
+                'MapSequenceView', 'MirrorDisposition', 'ObjectIdentifier', 'OnHeap',
+                'Optional', 'PermutationGenerator', 'QuickLookObject',
+                'RandomAccessReverseView', 'Range', 'RangeGenerator', 'RawByte', 'Repeat',
+                'ReverseBidirectionalIndex', 'ReverseRandomAccessIndex', 'SequenceOf',
+                'SinkOf', 'Slice', 'StaticString', 'StrideThrough', 'StrideThroughGenerator',
+                'StrideTo', 'StrideToGenerator', 'String', 'UInt', 'UInt16', 'UInt32',
+                'UInt64', 'UInt8', 'UTF16', 'UTF32', 'UTF8', 'UnicodeDecodingResult',
+                'UnicodeScalar', 'Unmanaged', 'UnsafeBufferPointer',
+                'UnsafeBufferPointerGenerator', 'UnsafeMutableBufferPointer',
+                'UnsafeMutablePointer', 'UnsafePointer', 'Zip2', 'ZipGenerator2',
+                # Protocols
+                'AbsoluteValuable', 'AnyObject', 'ArrayLiteralConvertible',
+                'BidirectionalIndexType', 'BitwiseOperationsType',
+                'BooleanLiteralConvertible', 'BooleanType', 'CVarArgType',
+                'CollectionType', 'Comparable', 'DebugPrintable',
+                'DictionaryLiteralConvertible', 'Equatable',
+                'ExtendedGraphemeClusterLiteralConvertible',
+                'ExtensibleCollectionType', 'FloatLiteralConvertible',
+                'FloatingPointType', 'ForwardIndexType', 'GeneratorType', 'Hashable',
+                'IntegerArithmeticType', 'IntegerLiteralConvertible', 'IntegerType',
+                'IntervalType', 'MirrorType', 'MutableCollectionType', 'MutableSliceable',
+                'NilLiteralConvertible', 'OutputStreamType', 'Printable',
+                'RandomAccessIndexType', 'RangeReplaceableCollectionType',
+                'RawOptionSetType', 'RawRepresentable', 'Reflectable', 'SequenceType',
+                'SignedIntegerType', 'SignedNumberType', 'SinkType', 'Sliceable',
+                'Streamable', 'Strideable', 'StringInterpolationConvertible',
+                'StringLiteralConvertible', 'UnicodeCodecType',
+                'UnicodeScalarLiteralConvertible', 'UnsignedIntegerType',
+                '_ArrayBufferType', '_BidirectionalIndexType', '_CocoaStringType',
+                '_CollectionType', '_Comparable', '_ExtensibleCollectionType',
+                '_ForwardIndexType', '_Incrementable', '_IntegerArithmeticType',
+                '_IntegerType', '_ObjectiveCBridgeable', '_RandomAccessIndexType',
+                '_RawOptionSetType', '_SequenceType', '_Sequence_Type',
+                '_SignedIntegerType', '_SignedNumberType', '_Sliceable', '_Strideable',
+                '_SwiftNSArrayRequiredOverridesType', '_SwiftNSArrayType',
+                '_SwiftNSCopyingType', '_SwiftNSDictionaryRequiredOverridesType',
+                '_SwiftNSDictionaryType', '_SwiftNSEnumeratorType',
+                '_SwiftNSFastEnumerationType', '_SwiftNSStringRequiredOverridesType',
+                '_SwiftNSStringType', '_UnsignedIntegerType',
+                # Variables
+                'C_ARGC', 'C_ARGV', 'Process',
+                # Typealiases
+                'Any', 'AnyClass', 'BooleanLiteralType', 'CBool', 'CChar', 'CChar16',
+                'CChar32', 'CDouble', 'CFloat', 'CInt', 'CLong', 'CLongLong', 'CShort',
+                'CSignedChar', 'CUnsignedInt', 'CUnsignedLong', 'CUnsignedShort',
+                'CWideChar', 'ExtendedGraphemeClusterType', 'Float32', 'Float64',
+                'FloatLiteralType', 'IntMax', 'IntegerLiteralType', 'StringLiteralType',
+                'UIntMax', 'UWord', 'UnicodeScalarType', 'Void', 'Word',
+                # Foundation/Cocoa
+                'NSErrorPointer', 'NSObjectProtocol', 'Selector'), suffix=r'\b'),
+             Name.Builtin),
+            # Functions
+            (words((
+                'abs', 'advance', 'alignof', 'alignofValue', 'assert', 'assertionFailure',
+                'contains', 'count', 'countElements', 'debugPrint', 'debugPrintln',
+                'distance', 'dropFirst', 'dropLast', 'dump', 'enumerate', 'equal',
+                'extend', 'fatalError', 'filter', 'find', 'first', 'getVaList', 'indices',
+                'insert', 'isEmpty', 'join', 'last', 'lazy', 'lexicographicalCompare',
+                'map', 'max', 'maxElement', 'min', 'minElement', 'numericCast', 'overlaps',
+                'partition', 'precondition', 'preconditionFailure', 'prefix', 'print',
+                'println', 'reduce', 'reflect', 'removeAll', 'removeAtIndex', 'removeLast',
+                'removeRange', 'reverse', 'sizeof', 'sizeofValue', 'sort', 'sorted',
+                'splice', 'split', 'startsWith', 'stride', 'strideof', 'strideofValue',
+                'suffix', 'swap', 'toDebugString', 'toString', 'transcode',
+                'underestimateCount', 'unsafeAddressOf', 'unsafeBitCast', 'unsafeDowncast',
+                'withExtendedLifetime', 'withUnsafeMutablePointer',
+                'withUnsafeMutablePointers', 'withUnsafePointer', 'withUnsafePointers',
+                'withVaList'), suffix=r'\b'),
+             Name.Builtin.Pseudo),
+
+            # Implicit Block Variables
+            (r'\$\d+', Name.Variable),
+
+            # Binary Literal
+            (r'0b[01_]+', Number.Bin),
+            # Octal Literal
+            (r'0o[0-7_]+', Number.Oct),
+            # Hexadecimal Literal
+            (r'0x[0-9a-fA-F_]+', Number.Hex),
+            # Decimal Literal
+            (r'[0-9][0-9_]*(\.[0-9_]+[eE][+\-]?[0-9_]+|'
+             r'\.[0-9_]*|[eE][+\-]?[0-9_]+)', Number.Float),
+            (r'[0-9][0-9_]*', Number.Integer),
+            # String Literal
+            (r'"""', String, 'string-multi'),
+            (r'"', String, 'string'),
+
+            # Operators and Punctuation
+            (r'[(){}\[\].,:;=@#`?]|->|[<&?](?=\w)|(?<=\w)[>!?]', Punctuation),
+            (r'[/=\-+!*%<>&|^?~]+', Operator),
+
+            # Identifier
+            (r'[a-zA-Z_]\w*', Name)
+        ],
+        'keywords': [
+            (words((
+                'as', 'async', 'await', 'break', 'case', 'catch', 'continue', 'default', 'defer',
+                'do', 'else', 'fallthrough', 'for', 'guard', 'if', 'in', 'is',
+                'repeat', 'return', '#selector', 'switch', 'throw', 'try',
+                'where', 'while'), suffix=r'\b'),
+             Keyword),
+            (r'@availability\([^)]+\)', Keyword.Reserved),
+            (words((
+                'associativity', 'convenience', 'dynamic', 'didSet', 'final',
+                'get', 'indirect', 'infix', 'inout', 'lazy', 'left', 'mutating',
+                'none', 'nonmutating', 'optional', 'override', 'postfix',
+                'precedence', 'prefix', 'Protocol', 'required', 'rethrows',
+                'right', 'set', 'throws', 'Type', 'unowned', 'weak', 'willSet',
+                '@availability', '@autoclosure', '@noreturn',
+                '@NSApplicationMain', '@NSCopying', '@NSManaged', '@objc',
+                '@UIApplicationMain', '@IBAction', '@IBDesignable',
+                '@IBInspectable', '@IBOutlet'), suffix=r'\b'),
+             Keyword.Reserved),
+            (r'(as|dynamicType|false|is|nil|self|Self|super|true|__COLUMN__'
+             r'|__FILE__|__FUNCTION__|__LINE__|_'
+             r'|#(?:file|line|column|function))\b', Keyword.Constant),
+            (r'import\b', Keyword.Declaration, 'module'),
+            (r'(class|enum|extension|struct|protocol)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Class)),
+            (r'(func)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Function)),
+            (r'(var|let)(\s+)([a-zA-Z_]\w*)', bygroups(Keyword.Declaration,
+             Whitespace, Name.Variable)),
+            (words((
+                'actor', 'associatedtype', 'class', 'deinit', 'enum', 'extension', 'func', 'import',
+                'init', 'internal', 'let', 'operator', 'private', 'protocol', 'public',
+                'static', 'struct', 'subscript', 'typealias', 'var'), suffix=r'\b'),
+             Keyword.Declaration)
+        ],
+        'comment': [
+            (r':param: [a-zA-Z_]\w*|:returns?:|(FIXME|MARK|TODO):',
+             Comment.Special)
+        ],
+
+        # Nested
+        'comment-single': [
+            (r'\n', Whitespace, '#pop'),
+            include('comment'),
+            (r'[^\n]+', Comment.Single)
+        ],
+        'comment-multi': [
+            include('comment'),
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]+', Comment.Multiline)
+        ],
+        'module': [
+            (r'\n', Whitespace, '#pop'),
+            (r'[a-zA-Z_]\w*', Name.Class),
+            include('root')
+        ],
+        'preproc': [
+            (r'\n', Whitespace, '#pop'),
+            include('keywords'),
+            (r'[A-Za-z]\w*', Comment.Preproc),
+            include('root')
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            include("string-common"),
+        ],
+        'string-multi': [
+            (r'"""', String, '#pop'),
+            include("string-common"),
+        ],
+        'string-common': [
+            (r'\\\(', String.Interpol, 'string-intp'),
+            (r"""\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}"""
+             r"""|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}""", String.Escape),
+            (r'[^\\"]+', String),
+            (r'\\', String)
+        ],
+        'string-intp': [
+            (r'\(', String.Interpol, '#push'),
+            (r'\)', String.Interpol, '#pop'),
+            include('root')
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text):
+        from pygments.lexers._cocoa_builtins import COCOA_INTERFACES, \
+            COCOA_PROTOCOLS, COCOA_PRIMITIVES
+
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name or token is Name.Class:
+                if value in COCOA_INTERFACES or value in COCOA_PROTOCOLS \
+                   or value in COCOA_PRIMITIVES:
+                    token = Name.Builtin.Pseudo
+
+            yield index, token, value
diff --git a/.venv/Lib/site-packages/pygments/lexers/ooc.py b/.venv/Lib/site-packages/pygments/lexers/ooc.py
new file mode 100644 (file)
index 0000000..8a99080
--- /dev/null
@@ -0,0 +1,84 @@
+"""
+    pygments.lexers.ooc
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Ooc language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['OocLexer']
+
+
+class OocLexer(RegexLexer):
+    """
+    For Ooc source code
+    """
+    name = 'Ooc'
+    url = 'https://ooc-lang.github.io/'
+    aliases = ['ooc']
+    filenames = ['*.ooc']
+    mimetypes = ['text/x-ooc']
+    version_added = '1.2'
+
+    tokens = {
+        'root': [
+            (words((
+                'class', 'interface', 'implement', 'abstract', 'extends', 'from',
+                'this', 'super', 'new', 'const', 'final', 'static', 'import',
+                'use', 'extern', 'inline', 'proto', 'break', 'continue',
+                'fallthrough', 'operator', 'if', 'else', 'for', 'while', 'do',
+                'switch', 'case', 'as', 'in', 'version', 'return', 'true',
+                'false', 'null'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (r'include\b', Keyword, 'include'),
+            (r'(cover)([ \t]+)(from)([ \t]+)(\w+[*@]?)',
+             bygroups(Keyword, Text, Keyword, Text, Name.Class)),
+            (r'(func)((?:[ \t]|\\\n)+)(~[a-z_]\w*)',
+             bygroups(Keyword, Text, Name.Function)),
+            (r'\bfunc\b', Keyword),
+            # Note: %= not listed on https://ooc-lang.github.io/docs/lang/operators/
+            (r'//.*', Comment),
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+            (r'(==?|\+=?|-[=>]?|\*=?|/=?|:=|!=?|%=?|\?|>{1,3}=?|<{1,3}=?|\.\.|'
+             r'&&?|\|\|?|\^=?)', Operator),
+            (r'(\.)([ \t]*)([a-z]\w*)', bygroups(Operator, Text,
+                                                 Name.Function)),
+            (r'[A-Z][A-Z0-9_]+', Name.Constant),
+            (r'[A-Z]\w*([@*]|\[[ \t]*\])?', Name.Class),
+
+            (r'([a-z]\w*(?:~[a-z]\w*)?)((?:[ \t]|\\\n)*)(?=\()',
+             bygroups(Name.Function, Text)),
+            (r'[a-z]\w*', Name.Variable),
+
+            # : introduces types
+            (r'[:(){}\[\];,]', Punctuation),
+
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'0c[0-9]+', Number.Oct),
+            (r'0b[01]+', Number.Bin),
+            (r'[0-9_]\.[0-9_]*(?!\.)', Number.Float),
+            (r'[0-9_]+', Number.Decimal),
+
+            (r'"(?:\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\"])*"',
+             String.Double),
+            (r"'(?:\\.|\\[0-9]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'",
+             String.Char),
+            (r'@', Punctuation),  # pointer dereference
+            (r'\.', Punctuation),  # imports or chain operator
+
+            (r'\\[ \t\n]', Text),
+            (r'[ \t]+', Text),
+        ],
+        'include': [
+            (r'[\w/]+', Name),
+            (r',', Punctuation),
+            (r'[ \t]', Text),
+            (r'[;\n]', Text, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/openscad.py b/.venv/Lib/site-packages/pygments/lexers/openscad.py
new file mode 100644 (file)
index 0000000..b06de22
--- /dev/null
@@ -0,0 +1,96 @@
+"""
+    pygments.lexers.openscad
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the OpenSCAD languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words, include
+from pygments.token import Text, Comment, Punctuation, Operator, Keyword, Name, Number, Whitespace, Literal, String
+
+__all__ = ['OpenScadLexer']
+
+
+class OpenScadLexer(RegexLexer):
+    """For openSCAD code.
+    """
+    name = "OpenSCAD"
+    url = "https://openscad.org/"
+    aliases = ["openscad"]
+    filenames = ["*.scad"]
+    mimetypes = ["application/x-openscad"]
+    version_added = '2.16'
+
+    tokens = {
+        "root": [
+            (r"[^\S\n]+", Whitespace),
+            (r'//', Comment.Single, 'comment-single'),
+            (r'/\*', Comment.Multiline, 'comment-multi'),
+            (r"[{}\[\]\(\),;:]", Punctuation),
+            (r"[*!#%\-+=?/]", Operator),
+            (r"<=|<|==|!=|>=|>|&&|\|\|", Operator),
+            (r"\$(f[asn]|t|vp[rtd]|children)", Operator),
+            (r"(undef|PI)\b", Keyword.Constant),
+            (
+                r"(use|include)((?:\s|\\\\s)+)",
+                bygroups(Keyword.Namespace, Text),
+                "includes",
+            ),
+            (r"(module)(\s*)([^\s\(]+)",
+             bygroups(Keyword.Namespace, Whitespace, Name.Namespace)),
+            (r"(function)(\s*)([^\s\(]+)",
+             bygroups(Keyword.Declaration, Whitespace, Name.Function)),
+            (words(("true", "false"), prefix=r"\b", suffix=r"\b"), Literal),
+            (words((
+                "function", "module", "include", "use", "for",
+                "intersection_for", "if", "else", "return"
+                ), prefix=r"\b", suffix=r"\b"), Keyword
+            ),
+            (words((
+                "circle", "square", "polygon", "text", "sphere", "cube",
+                "cylinder", "polyhedron", "translate", "rotate", "scale",
+                "resize", "mirror", "multmatrix", "color", "offset", "hull",
+                "minkowski", "union", "difference", "intersection", "abs",
+                "sign", "sin", "cos", "tan", "acos", "asin", "atan", "atan2",
+                "floor", "round", "ceil", "ln", "log", "pow", "sqrt", "exp",
+                "rands", "min", "max", "concat", "lookup", "str", "chr",
+                "search", "version", "version_num", "norm", "cross",
+                "parent_module", "echo", "import", "import_dxf",
+                "dxf_linear_extrude", "linear_extrude", "rotate_extrude",
+                "surface", "projection", "render", "dxf_cross",
+                "dxf_dim", "let", "assign", "len"
+                ), prefix=r"\b", suffix=r"\b"),
+                Name.Builtin
+            ),
+            (r"\bchildren\b", Name.Builtin.Pseudo),
+            (r'""".*?"""', String.Double),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"-?\d+(\.\d+)?(e[+-]?\d+)?", Number),
+            (r"\w+", Name),
+        ],
+        "includes": [
+            (
+                r"(<)([^>]*)(>)",
+                bygroups(Punctuation, Comment.PreprocFile, Punctuation),
+            ),
+        ],
+        'comment': [
+            (r':param: [a-zA-Z_]\w*|:returns?:|(FIXME|MARK|TODO):',
+             Comment.Special)
+        ],
+        'comment-single': [
+            (r'\n', Text, '#pop'),
+            include('comment'),
+            (r'[^\n]+', Comment.Single)
+        ],
+        'comment-multi': [
+            include('comment'),
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/other.py b/.venv/Lib/site-packages/pygments/lexers/other.py
new file mode 100644 (file)
index 0000000..2b7dfb4
--- /dev/null
@@ -0,0 +1,41 @@
+"""
+    pygments.lexers.other
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexer classes previously contained in this module.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# ruff: noqa: F401
+from pygments.lexers.sql import SqlLexer, MySqlLexer, SqliteConsoleLexer
+from pygments.lexers.shell import BashLexer, BashSessionLexer, BatchLexer, \
+    TcshLexer
+from pygments.lexers.robotframework import RobotFrameworkLexer
+from pygments.lexers.testing import GherkinLexer
+from pygments.lexers.esoteric import BrainfuckLexer, BefungeLexer, RedcodeLexer
+from pygments.lexers.prolog import LogtalkLexer
+from pygments.lexers.snobol import SnobolLexer
+from pygments.lexers.rebol import RebolLexer
+from pygments.lexers.configs import KconfigLexer, Cfengine3Lexer
+from pygments.lexers.modeling import ModelicaLexer
+from pygments.lexers.scripting import AppleScriptLexer, MOOCodeLexer, \
+    HybrisLexer
+from pygments.lexers.graphics import PostScriptLexer, GnuplotLexer, \
+    AsymptoteLexer, PovrayLexer
+from pygments.lexers.business import ABAPLexer, OpenEdgeLexer, \
+    GoodDataCLLexer, MaqlLexer
+from pygments.lexers.automation import AutoItLexer, AutohotkeyLexer
+from pygments.lexers.dsls import ProtoBufLexer, BroLexer, PuppetLexer, \
+    MscgenLexer, VGLLexer
+from pygments.lexers.basic import CbmBasicV2Lexer
+from pygments.lexers.pawn import SourcePawnLexer, PawnLexer
+from pygments.lexers.ecl import ECLLexer
+from pygments.lexers.urbi import UrbiscriptLexer
+from pygments.lexers.smalltalk import SmalltalkLexer, NewspeakLexer
+from pygments.lexers.installers import NSISLexer, RPMSpecLexer
+from pygments.lexers.textedit import AwkLexer
+from pygments.lexers.smv import NuSMVLexer
+
+__all__ = []
diff --git a/.venv/Lib/site-packages/pygments/lexers/parasail.py b/.venv/Lib/site-packages/pygments/lexers/parasail.py
new file mode 100644 (file)
index 0000000..150d6a9
--- /dev/null
@@ -0,0 +1,78 @@
+"""
+    pygments.lexers.parasail
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for ParaSail.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal
+
+__all__ = ['ParaSailLexer']
+
+
+class ParaSailLexer(RegexLexer):
+    """
+    For ParaSail source code.
+    """
+
+    name = 'ParaSail'
+    url = 'http://www.parasail-lang.org'
+    aliases = ['parasail']
+    filenames = ['*.psi', '*.psl']
+    mimetypes = ['text/x-parasail']
+    version_added = '2.1'
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'\b(and|or|xor)=', Operator.Word),
+            (r'\b(and(\s+then)?|or(\s+else)?|xor|rem|mod|'
+             r'(is|not)\s+null)\b',
+             Operator.Word),
+            # Keywords
+            (r'\b(abs|abstract|all|block|class|concurrent|const|continue|'
+             r'each|end|exit|extends|exports|forward|func|global|implements|'
+             r'import|in|interface|is|lambda|locked|new|not|null|of|op|'
+             r'optional|private|queued|ref|return|reverse|separate|some|'
+             r'type|until|var|with|'
+             # Control flow
+             r'if|then|else|elsif|case|for|while|loop)\b',
+             Keyword.Reserved),
+            (r'(abstract\s+)?(interface|class|op|func|type)',
+             Keyword.Declaration),
+            # Literals
+            (r'"[^"]*"', String),
+            (r'\\[\'ntrf"0]', String.Escape),
+            (r'#[a-zA-Z]\w*', Literal),       # Enumeration
+            include('numbers'),
+            (r"'[^']'", String.Char),
+            (r'[a-zA-Z]\w*', Name),
+            # Operators and Punctuation
+            (r'(<==|==>|<=>|\*\*=|<\|=|<<=|>>=|==|!=|=\?|<=|>=|'
+             r'\*\*|<<|>>|=>|:=|\+=|-=|\*=|\|=|\||/=|\+|-|\*|/|'
+             r'\.\.|<\.\.|\.\.<|<\.\.<)',
+             Operator),
+            (r'(<|>|\[|\]|\(|\)|\||:|;|,|.|\{|\}|->)',
+             Punctuation),
+            (r'\n+', Text),
+        ],
+        'numbers': [
+            (r'\d[0-9_]*#[0-9a-fA-F][0-9a-fA-F_]*#', Number.Hex),  # any base
+            (r'0[xX][0-9a-fA-F][0-9a-fA-F_]*', Number.Hex),        # C-like hex
+            (r'0[bB][01][01_]*', Number.Bin),                      # C-like bin
+            (r'\d[0-9_]*\.\d[0-9_]*[eE][+-]\d[0-9_]*',             # float exp
+             Number.Float),
+            (r'\d[0-9_]*\.\d[0-9_]*', Number.Float),               # float
+            (r'\d[0-9_]*', Number.Integer),                        # integer
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/parsers.py b/.venv/Lib/site-packages/pygments/lexers/parsers.py
new file mode 100644 (file)
index 0000000..7a4ed9d
--- /dev/null
@@ -0,0 +1,798 @@
+"""
+    pygments.lexers.parsers
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for parser generators.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, DelegatingLexer, \
+    include, bygroups, using
+from pygments.token import Punctuation, Other, Text, Comment, Operator, \
+    Keyword, Name, String, Number, Whitespace
+from pygments.lexers.jvm import JavaLexer
+from pygments.lexers.c_cpp import CLexer, CppLexer
+from pygments.lexers.objective import ObjectiveCLexer
+from pygments.lexers.d import DLexer
+from pygments.lexers.dotnet import CSharpLexer
+from pygments.lexers.ruby import RubyLexer
+from pygments.lexers.python import PythonLexer
+from pygments.lexers.perl import PerlLexer
+
+__all__ = ['RagelLexer', 'RagelEmbeddedLexer', 'RagelCLexer', 'RagelDLexer',
+           'RagelCppLexer', 'RagelObjectiveCLexer', 'RagelRubyLexer',
+           'RagelJavaLexer', 'AntlrLexer', 'AntlrPythonLexer',
+           'AntlrPerlLexer', 'AntlrRubyLexer', 'AntlrCppLexer',
+           'AntlrCSharpLexer', 'AntlrObjectiveCLexer',
+           'AntlrJavaLexer', 'AntlrActionScriptLexer',
+           'TreetopLexer', 'EbnfLexer']
+
+
+class RagelLexer(RegexLexer):
+    """A pure `Ragel <www.colm.net/open-source/ragel>`_ lexer.  Use this
+    for fragments of Ragel.  For ``.rl`` files, use
+    :class:`RagelEmbeddedLexer` instead (or one of the
+    language-specific subclasses).
+
+    """
+
+    name = 'Ragel'
+    url = 'http://www.colm.net/open-source/ragel/'
+    aliases = ['ragel']
+    filenames = []
+    version_added = '1.1'
+
+    tokens = {
+        'whitespace': [
+            (r'\s+', Whitespace)
+        ],
+        'comments': [
+            (r'\#.*$', Comment),
+        ],
+        'keywords': [
+            (r'(access|action|alphtype)\b', Keyword),
+            (r'(getkey|write|machine|include)\b', Keyword),
+            (r'(any|ascii|extend|alpha|digit|alnum|lower|upper)\b', Keyword),
+            (r'(xdigit|cntrl|graph|print|punct|space|zlen|empty)\b', Keyword)
+        ],
+        'numbers': [
+            (r'0x[0-9A-Fa-f]+', Number.Hex),
+            (r'[+-]?[0-9]+', Number.Integer),
+        ],
+        'literals': [
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'\[(\\\\|\\[^\\]|[^\\\]])*\]', String),          # square bracket literals
+            (r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/', String.Regex),  # regular expressions
+        ],
+        'identifiers': [
+            (r'[a-zA-Z_]\w*', Name.Variable),
+        ],
+        'operators': [
+            (r',', Operator),                           # Join
+            (r'\||&|--?', Operator),                    # Union, Intersection and Subtraction
+            (r'\.|<:|:>>?', Operator),                  # Concatention
+            (r':', Operator),                           # Label
+            (r'->', Operator),                          # Epsilon Transition
+            (r'(>|\$|%|<|@|<>)(/|eof\b)', Operator),    # EOF Actions
+            (r'(>|\$|%|<|@|<>)(!|err\b)', Operator),    # Global Error Actions
+            (r'(>|\$|%|<|@|<>)(\^|lerr\b)', Operator),  # Local Error Actions
+            (r'(>|\$|%|<|@|<>)(~|to\b)', Operator),     # To-State Actions
+            (r'(>|\$|%|<|@|<>)(\*|from\b)', Operator),  # From-State Actions
+            (r'>|@|\$|%', Operator),                    # Transition Actions and Priorities
+            (r'\*|\?|\+|\{[0-9]*,[0-9]*\}', Operator),  # Repetition
+            (r'!|\^', Operator),                        # Negation
+            (r'\(|\)', Operator),                       # Grouping
+        ],
+        'root': [
+            include('literals'),
+            include('whitespace'),
+            include('comments'),
+            include('keywords'),
+            include('numbers'),
+            include('identifiers'),
+            include('operators'),
+            (r'\{', Punctuation, 'host'),
+            (r'=', Operator),
+            (r';', Punctuation),
+        ],
+        'host': [
+            (r'(' + r'|'.join((  # keep host code in largest possible chunks
+                r'[^{}\'"/#]+',  # exclude unsafe characters
+                r'[^\\]\\[{}]',  # allow escaped { or }
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\[^\\]|[^"\\])*"',
+                r"'(\\\\|\\[^\\]|[^'\\])*'",
+                r'//.*$\n?',            # single line comment
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+                r'\#.*$\n?',            # ruby comment
+
+                # regular expression: There's no reason for it to start
+                # with a * and this stops confusion with comments.
+                r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/',
+
+                # / is safe now that we've handled regex and javadoc comments
+                r'/',
+            )) + r')+', Other),
+
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+    }
+
+
+class RagelEmbeddedLexer(RegexLexer):
+    """
+    A lexer for Ragel embedded in a host language file.
+
+    This will only highlight Ragel statements. If you want host language
+    highlighting then call the language-specific Ragel lexer.
+    """
+
+    name = 'Embedded Ragel'
+    aliases = ['ragel-em']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    tokens = {
+        'root': [
+            (r'(' + r'|'.join((   # keep host code in largest possible chunks
+                r'[^%\'"/#]+',    # exclude unsafe characters
+                r'%(?=[^%]|$)',   # a single % sign is okay, just not 2 of them
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\[^\\]|[^"\\])*"',
+                r"'(\\\\|\\[^\\]|[^'\\])*'",
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+                r'//.*$\n?',  # single line comment
+                r'\#.*$\n?',  # ruby/ragel comment
+                r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/',  # regular expression
+
+                # / is safe now that we've handled regex and javadoc comments
+                r'/',
+            )) + r')+', Other),
+
+            # Single Line FSM.
+            # Please don't put a quoted newline in a single line FSM.
+            # That's just mean. It will break this.
+            (r'(%%)(?![{%])(.*)($|;)(\n?)', bygroups(Punctuation,
+                                                     using(RagelLexer),
+                                                     Punctuation, Text)),
+
+            # Multi Line FSM.
+            (r'(%%%%|%%)\{', Punctuation, 'multi-line-fsm'),
+        ],
+        'multi-line-fsm': [
+            (r'(' + r'|'.join((  # keep ragel code in largest possible chunks.
+                r'(' + r'|'.join((
+                    r'[^}\'"\[/#]',   # exclude unsafe characters
+                    r'\}(?=[^%]|$)',   # } is okay as long as it's not followed by %
+                    r'\}%(?=[^%]|$)',  # ...well, one %'s okay, just not two...
+                    r'[^\\]\\[{}]',   # ...and } is okay if it's escaped
+
+                    # allow / if it's preceded with one of these symbols
+                    # (ragel EOF actions)
+                    r'(>|\$|%|<|@|<>)/',
+
+                    # specifically allow regex followed immediately by *
+                    # so it doesn't get mistaken for a comment
+                    r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/\*',
+
+                    # allow / as long as it's not followed by another / or by a *
+                    r'/(?=[^/*]|$)',
+
+                    # We want to match as many of these as we can in one block.
+                    # Not sure if we need the + sign here,
+                    # does it help performance?
+                )) + r')+',
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\[^\\]|[^"\\])*"',
+                r"'(\\\\|\\[^\\]|[^'\\])*'",
+                r"\[(\\\\|\\[^\\]|[^\]\\])*\]",  # square bracket literal
+                r'/\*(.|\n)*?\*/',          # multi-line javadoc-style comment
+                r'//.*$\n?',                # single line comment
+                r'\#.*$\n?',                # ruby/ragel comment
+            )) + r')+', using(RagelLexer)),
+
+            (r'\}%%', Punctuation, '#pop'),
+        ]
+    }
+
+    def analyse_text(text):
+        return '@LANG: indep' in text
+
+
+class RagelRubyLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in a Ruby host file.
+    """
+
+    name = 'Ragel in Ruby Host'
+    aliases = ['ragel-ruby', 'ragel-rb']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(RubyLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: ruby' in text
+
+
+class RagelCLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in a C host file.
+    """
+
+    name = 'Ragel in C Host'
+    aliases = ['ragel-c']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(CLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: c' in text
+
+
+class RagelDLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in a D host file.
+    """
+
+    name = 'Ragel in D Host'
+    aliases = ['ragel-d']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(DLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: d' in text
+
+
+class RagelCppLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in a C++ host file.
+    """
+
+    name = 'Ragel in CPP Host'
+    aliases = ['ragel-cpp']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(CppLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: c++' in text
+
+
+class RagelObjectiveCLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in an Objective C host file.
+    """
+
+    name = 'Ragel in Objective C Host'
+    aliases = ['ragel-objc']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(ObjectiveCLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: objc' in text
+
+
+class RagelJavaLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in a Java host file.
+    """
+
+    name = 'Ragel in Java Host'
+    aliases = ['ragel-java']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(JavaLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: java' in text
+
+
+class AntlrLexer(RegexLexer):
+    """
+    Generic ANTLR Lexer.
+    Should not be called directly, instead
+    use DelegatingLexer for your target language.
+    """
+
+    name = 'ANTLR'
+    aliases = ['antlr']
+    filenames = []
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    _id = r'[A-Za-z]\w*'
+    _TOKEN_REF = r'[A-Z]\w*'
+    _RULE_REF = r'[a-z]\w*'
+    _STRING_LITERAL = r'\'(?:\\\\|\\\'|[^\']*)\''
+    _INT = r'[0-9]+'
+
+    tokens = {
+        'whitespace': [
+            (r'\s+', Whitespace),
+        ],
+        'comments': [
+            (r'//.*$', Comment),
+            (r'/\*(.|\n)*?\*/', Comment),
+        ],
+        'root': [
+            include('whitespace'),
+            include('comments'),
+
+            (r'(lexer|parser|tree)?(\s*)(grammar\b)(\s*)(' + _id + ')(;)',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Class,
+                      Punctuation)),
+            # optionsSpec
+            (r'options\b', Keyword, 'options'),
+            # tokensSpec
+            (r'tokens\b', Keyword, 'tokens'),
+            # attrScope
+            (r'(scope)(\s*)(' + _id + r')(\s*)(\{)',
+             bygroups(Keyword, Whitespace, Name.Variable, Whitespace,
+                      Punctuation), 'action'),
+            # exception
+            (r'(catch|finally)\b', Keyword, 'exception'),
+            # action
+            (r'(@' + _id + r')(\s*)(::)?(\s*)(' + _id + r')(\s*)(\{)',
+             bygroups(Name.Label, Whitespace, Punctuation, Whitespace,
+                      Name.Label, Whitespace, Punctuation), 'action'),
+            # rule
+            (r'((?:protected|private|public|fragment)\b)?(\s*)(' + _id + ')(!)?',
+             bygroups(Keyword, Whitespace, Name.Label, Punctuation),
+             ('rule-alts', 'rule-prelims')),
+        ],
+        'exception': [
+            (r'\n', Whitespace, '#pop'),
+            (r'\s', Whitespace),
+            include('comments'),
+
+            (r'\[', Punctuation, 'nested-arg-action'),
+            (r'\{', Punctuation, 'action'),
+        ],
+        'rule-prelims': [
+            include('whitespace'),
+            include('comments'),
+
+            (r'returns\b', Keyword),
+            (r'\[', Punctuation, 'nested-arg-action'),
+            (r'\{', Punctuation, 'action'),
+            # throwsSpec
+            (r'(throws)(\s+)(' + _id + ')',
+             bygroups(Keyword, Whitespace, Name.Label)),
+            (r'(,)(\s*)(' + _id + ')',
+             bygroups(Punctuation, Whitespace, Name.Label)),  # Additional throws
+            # optionsSpec
+            (r'options\b', Keyword, 'options'),
+            # ruleScopeSpec - scope followed by target language code or name of action
+            # TODO finish implementing other possibilities for scope
+            # L173 ANTLRv3.g from ANTLR book
+            (r'(scope)(\s+)(\{)', bygroups(Keyword, Whitespace, Punctuation),
+             'action'),
+            (r'(scope)(\s+)(' + _id + r')(\s*)(;)',
+             bygroups(Keyword, Whitespace, Name.Label, Whitespace, Punctuation)),
+            # ruleAction
+            (r'(@' + _id + r')(\s*)(\{)',
+             bygroups(Name.Label, Whitespace, Punctuation), 'action'),
+            # finished prelims, go to rule alts!
+            (r':', Punctuation, '#pop')
+        ],
+        'rule-alts': [
+            include('whitespace'),
+            include('comments'),
+
+            # These might need to go in a separate 'block' state triggered by (
+            (r'options\b', Keyword, 'options'),
+            (r':', Punctuation),
+
+            # literals
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'<<([^>]|>[^>])>>', String),
+            # identifiers
+            # Tokens start with capital letter.
+            (r'\$?[A-Z_]\w*', Name.Constant),
+            # Rules start with small letter.
+            (r'\$?[a-z_]\w*', Name.Variable),
+            # operators
+            (r'(\+|\||->|=>|=|\(|\)|\.\.|\.|\?|\*|\^|!|\#|~)', Operator),
+            (r',', Punctuation),
+            (r'\[', Punctuation, 'nested-arg-action'),
+            (r'\{', Punctuation, 'action'),
+            (r';', Punctuation, '#pop')
+        ],
+        'tokens': [
+            include('whitespace'),
+            include('comments'),
+            (r'\{', Punctuation),
+            (r'(' + _TOKEN_REF + r')(\s*)(=)?(\s*)(' + _STRING_LITERAL
+             + r')?(\s*)(;)',
+             bygroups(Name.Label, Whitespace, Punctuation, Whitespace,
+                      String, Whitespace, Punctuation)),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'options': [
+            include('whitespace'),
+            include('comments'),
+            (r'\{', Punctuation),
+            (r'(' + _id + r')(\s*)(=)(\s*)(' +
+             '|'.join((_id, _STRING_LITERAL, _INT, r'\*')) + r')(\s*)(;)',
+             bygroups(Name.Variable, Whitespace, Punctuation, Whitespace,
+                      Text, Whitespace, Punctuation)),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'action': [
+            (r'(' + r'|'.join((    # keep host code in largest possible chunks
+                r'[^${}\'"/\\]+',  # exclude unsafe characters
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\[^\\]|[^"\\])*"',
+                r"'(\\\\|\\[^\\]|[^'\\])*'",
+                r'//.*$\n?',            # single line comment
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+
+                # regular expression: There's no reason for it to start
+                # with a * and this stops confusion with comments.
+                r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/',
+
+                # backslashes are okay, as long as we are not backslashing a %
+                r'\\(?!%)',
+
+                # Now that we've handled regex and javadoc comments
+                # it's safe to let / through.
+                r'/',
+            )) + r')+', Other),
+            (r'(\\)(%)', bygroups(Punctuation, Other)),
+            (r'(\$[a-zA-Z]+)(\.?)(text|value)?',
+             bygroups(Name.Variable, Punctuation, Name.Property)),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'nested-arg-action': [
+            (r'(' + r'|'.join((    # keep host code in largest possible chunks.
+                r'[^$\[\]\'"/]+',  # exclude unsafe characters
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\[^\\]|[^"\\])*"',
+                r"'(\\\\|\\[^\\]|[^'\\])*'",
+                r'//.*$\n?',            # single line comment
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+
+                # regular expression: There's no reason for it to start
+                # with a * and this stops confusion with comments.
+                r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/',
+
+                # Now that we've handled regex and javadoc comments
+                # it's safe to let / through.
+                r'/',
+            )) + r')+', Other),
+
+
+            (r'\[', Punctuation, '#push'),
+            (r'\]', Punctuation, '#pop'),
+            (r'(\$[a-zA-Z]+)(\.?)(text|value)?',
+             bygroups(Name.Variable, Punctuation, Name.Property)),
+            (r'(\\\\|\\\]|\\\[|[^\[\]])+', Other),
+        ]
+    }
+
+    def analyse_text(text):
+        return re.search(r'^\s*grammar\s+[a-zA-Z0-9]+\s*;', text, re.M)
+
+
+# http://www.antlr.org/wiki/display/ANTLR3/Code+Generation+Targets
+
+class AntlrCppLexer(DelegatingLexer):
+    """
+    ANTLR with C++ Target
+    """
+
+    name = 'ANTLR With CPP Target'
+    aliases = ['antlr-cpp']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(CppLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*C\s*;', text, re.M)
+
+
+class AntlrObjectiveCLexer(DelegatingLexer):
+    """
+    ANTLR with Objective-C Target
+    """
+
+    name = 'ANTLR With ObjectiveC Target'
+    aliases = ['antlr-objc']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(ObjectiveCLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*ObjC\s*;', text)
+
+
+class AntlrCSharpLexer(DelegatingLexer):
+    """
+    ANTLR with C# Target
+    """
+
+    name = 'ANTLR With C# Target'
+    aliases = ['antlr-csharp', 'antlr-c#']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(CSharpLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*CSharp2\s*;', text, re.M)
+
+
+class AntlrPythonLexer(DelegatingLexer):
+    """
+    ANTLR with Python Target
+    """
+
+    name = 'ANTLR With Python Target'
+    aliases = ['antlr-python']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(PythonLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*Python\s*;', text, re.M)
+
+
+class AntlrJavaLexer(DelegatingLexer):
+    """
+    ANTLR with Java Target
+    """
+
+    name = 'ANTLR With Java Target'
+    aliases = ['antlr-java']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(JavaLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        # Antlr language is Java by default
+        return AntlrLexer.analyse_text(text) and 0.9
+
+
+class AntlrRubyLexer(DelegatingLexer):
+    """
+    ANTLR with Ruby Target
+    """
+
+    name = 'ANTLR With Ruby Target'
+    aliases = ['antlr-ruby', 'antlr-rb']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(RubyLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*Ruby\s*;', text, re.M)
+
+
+class AntlrPerlLexer(DelegatingLexer):
+    """
+    ANTLR with Perl Target
+    """
+
+    name = 'ANTLR With Perl Target'
+    aliases = ['antlr-perl']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(PerlLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*Perl5\s*;', text, re.M)
+
+
+class AntlrActionScriptLexer(DelegatingLexer):
+    """
+    ANTLR with ActionScript Target
+    """
+
+    name = 'ANTLR With ActionScript Target'
+    aliases = ['antlr-actionscript', 'antlr-as']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        from pygments.lexers.actionscript import ActionScriptLexer
+        super().__init__(ActionScriptLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*ActionScript\s*;', text, re.M)
+
+
+class TreetopBaseLexer(RegexLexer):
+    """
+    A base lexer for `Treetop <http://treetop.rubyforge.org/>`_ grammars.
+    Not for direct use; use :class:`TreetopLexer` instead.
+
+    .. versionadded:: 1.6
+    """
+
+    tokens = {
+        'root': [
+            include('space'),
+            (r'require[ \t]+[^\n\r]+[\n\r]', Other),
+            (r'module\b', Keyword.Namespace, 'module'),
+            (r'grammar\b', Keyword, 'grammar'),
+        ],
+        'module': [
+            include('space'),
+            include('end'),
+            (r'module\b', Keyword, '#push'),
+            (r'grammar\b', Keyword, 'grammar'),
+            (r'[A-Z]\w*(?:::[A-Z]\w*)*', Name.Namespace),
+        ],
+        'grammar': [
+            include('space'),
+            include('end'),
+            (r'rule\b', Keyword, 'rule'),
+            (r'include\b', Keyword, 'include'),
+            (r'[A-Z]\w*', Name),
+        ],
+        'include': [
+            include('space'),
+            (r'[A-Z]\w*(?:::[A-Z]\w*)*', Name.Class, '#pop'),
+        ],
+        'rule': [
+            include('space'),
+            include('end'),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'([A-Za-z_]\w*)(:)', bygroups(Name.Label, Punctuation)),
+            (r'[A-Za-z_]\w*', Name),
+            (r'[()]', Punctuation),
+            (r'[?+*/&!~]', Operator),
+            (r'\[(?:\\.|\[:\^?[a-z]+:\]|[^\\\]])+\]', String.Regex),
+            (r'([0-9]*)(\.\.)([0-9]*)',
+             bygroups(Number.Integer, Operator, Number.Integer)),
+            (r'(<)([^>]+)(>)', bygroups(Punctuation, Name.Class, Punctuation)),
+            (r'\{', Punctuation, 'inline_module'),
+            (r'\.', String.Regex),
+        ],
+        'inline_module': [
+            (r'\{', Other, 'ruby'),
+            (r'\}', Punctuation, '#pop'),
+            (r'[^{}]+', Other),
+        ],
+        'ruby': [
+            (r'\{', Other, '#push'),
+            (r'\}', Other, '#pop'),
+            (r'[^{}]+', Other),
+        ],
+        'space': [
+            (r'[ \t\n\r]+', Whitespace),
+            (r'#[^\n]*', Comment.Single),
+        ],
+        'end': [
+            (r'end\b', Keyword, '#pop'),
+        ],
+    }
+
+
+class TreetopLexer(DelegatingLexer):
+    """
+    A lexer for Treetop grammars.
+    """
+
+    name = 'Treetop'
+    aliases = ['treetop']
+    filenames = ['*.treetop', '*.tt']
+    url = 'https://cjheath.github.io/treetop'
+    version_added = '1.6'
+
+    def __init__(self, **options):
+        super().__init__(RubyLexer, TreetopBaseLexer, **options)
+
+
+class EbnfLexer(RegexLexer):
+    """
+    Lexer for `ISO/IEC 14977 EBNF
+    <https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form>`_
+    grammars.
+    """
+
+    name = 'EBNF'
+    aliases = ['ebnf']
+    filenames = ['*.ebnf']
+    mimetypes = ['text/x-ebnf']
+    url = 'https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form'
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comment_start'),
+            include('identifier'),
+            (r'=', Operator, 'production'),
+        ],
+        'production': [
+            include('whitespace'),
+            include('comment_start'),
+            include('identifier'),
+            (r'"[^"]*"', String.Double),
+            (r"'[^']*'", String.Single),
+            (r'(\?[^?]*\?)', Name.Entity),
+            (r'[\[\]{}(),|]', Punctuation),
+            (r'-', Operator),
+            (r';', Punctuation, '#pop'),
+            (r'\.', Punctuation, '#pop'),
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+        ],
+        'comment_start': [
+            (r'\(\*', Comment.Multiline, 'comment'),
+        ],
+        'comment': [
+            (r'[^*)]', Comment.Multiline),
+            include('comment_start'),
+            (r'\*\)', Comment.Multiline, '#pop'),
+            (r'[*)]', Comment.Multiline),
+        ],
+        'identifier': [
+            (r'([a-zA-Z][\w \-]*)', Keyword),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/pascal.py b/.venv/Lib/site-packages/pygments/lexers/pascal.py
new file mode 100644 (file)
index 0000000..5f40dcc
--- /dev/null
@@ -0,0 +1,644 @@
+"""
+    pygments.lexers.pascal
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Pascal family languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer
+from pygments.util import get_bool_opt, get_list_opt
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Whitespace
+from pygments.scanner import Scanner
+
+# compatibility import
+from pygments.lexers.modula2 import Modula2Lexer # noqa: F401
+
+__all__ = ['DelphiLexer', 'PortugolLexer']
+
+
+class PortugolLexer(Lexer):
+    """For Portugol, a Pascal dialect with keywords in Portuguese."""
+    name = 'Portugol'
+    aliases = ['portugol']
+    filenames = ['*.alg', '*.portugol']
+    mimetypes = []
+    url = "https://www.apoioinformatica.inf.br/produtos/visualg/linguagem"
+    version_added = ''
+
+    def __init__(self, **options):
+        Lexer.__init__(self, **options)
+        self.lexer = DelphiLexer(**options, portugol=True)
+
+    def get_tokens_unprocessed(self, text):
+        return self.lexer.get_tokens_unprocessed(text)
+
+
+class DelphiLexer(Lexer):
+    """
+    For Delphi (Borland Object Pascal),
+    Turbo Pascal and Free Pascal source code.
+
+    Additional options accepted:
+
+    `turbopascal`
+        Highlight Turbo Pascal specific keywords (default: ``True``).
+    `delphi`
+        Highlight Borland Delphi specific keywords (default: ``True``).
+    `freepascal`
+        Highlight Free Pascal specific keywords (default: ``True``).
+    `units`
+        A list of units that should be considered builtin, supported are
+        ``System``, ``SysUtils``, ``Classes`` and ``Math``.
+        Default is to consider all of them builtin.
+    """
+    name = 'Delphi'
+    aliases = ['delphi', 'pas', 'pascal', 'objectpascal']
+    filenames = ['*.pas', '*.dpr']
+    mimetypes = ['text/x-pascal']
+    url = 'https://www.embarcadero.com/products/delphi'
+    version_added = ''
+
+    TURBO_PASCAL_KEYWORDS = (
+        'absolute', 'and', 'array', 'asm', 'begin', 'break', 'case',
+        'const', 'constructor', 'continue', 'destructor', 'div', 'do',
+        'downto', 'else', 'end', 'file', 'for', 'function', 'goto',
+        'if', 'implementation', 'in', 'inherited', 'inline', 'interface',
+        'label', 'mod', 'nil', 'not', 'object', 'of', 'on', 'operator',
+        'or', 'packed', 'procedure', 'program', 'record', 'reintroduce',
+        'repeat', 'self', 'set', 'shl', 'shr', 'string', 'then', 'to',
+        'type', 'unit', 'until', 'uses', 'var', 'while', 'with', 'xor'
+    )
+
+    DELPHI_KEYWORDS = (
+        'as', 'class', 'except', 'exports', 'finalization', 'finally',
+        'initialization', 'is', 'library', 'on', 'property', 'raise',
+        'threadvar', 'try'
+    )
+
+    FREE_PASCAL_KEYWORDS = (
+        'dispose', 'exit', 'false', 'new', 'true'
+    )
+
+    BLOCK_KEYWORDS = {
+        'begin', 'class', 'const', 'constructor', 'destructor', 'end',
+        'finalization', 'function', 'implementation', 'initialization',
+        'label', 'library', 'operator', 'procedure', 'program', 'property',
+        'record', 'threadvar', 'type', 'unit', 'uses', 'var'
+    }
+
+    FUNCTION_MODIFIERS = {
+        'alias', 'cdecl', 'export', 'inline', 'interrupt', 'nostackframe',
+        'pascal', 'register', 'safecall', 'softfloat', 'stdcall',
+        'varargs', 'name', 'dynamic', 'near', 'virtual', 'external',
+        'override', 'assembler'
+    }
+
+    # XXX: those aren't global. but currently we know no way for defining
+    #      them just for the type context.
+    DIRECTIVES = {
+        'absolute', 'abstract', 'assembler', 'cppdecl', 'default', 'far',
+        'far16', 'forward', 'index', 'oldfpccall', 'private', 'protected',
+        'published', 'public'
+    }
+
+    BUILTIN_TYPES = {
+        'ansichar', 'ansistring', 'bool', 'boolean', 'byte', 'bytebool',
+        'cardinal', 'char', 'comp', 'currency', 'double', 'dword',
+        'extended', 'int64', 'integer', 'iunknown', 'longbool', 'longint',
+        'longword', 'pansichar', 'pansistring', 'pbool', 'pboolean',
+        'pbyte', 'pbytearray', 'pcardinal', 'pchar', 'pcomp', 'pcurrency',
+        'pdate', 'pdatetime', 'pdouble', 'pdword', 'pextended', 'phandle',
+        'pint64', 'pinteger', 'plongint', 'plongword', 'pointer',
+        'ppointer', 'pshortint', 'pshortstring', 'psingle', 'psmallint',
+        'pstring', 'pvariant', 'pwidechar', 'pwidestring', 'pword',
+        'pwordarray', 'pwordbool', 'real', 'real48', 'shortint',
+        'shortstring', 'single', 'smallint', 'string', 'tclass', 'tdate',
+        'tdatetime', 'textfile', 'thandle', 'tobject', 'ttime', 'variant',
+        'widechar', 'widestring', 'word', 'wordbool'
+    }
+
+    BUILTIN_UNITS = {
+        'System': (
+            'abs', 'acquireexceptionobject', 'addr', 'ansitoutf8',
+            'append', 'arctan', 'assert', 'assigned', 'assignfile',
+            'beginthread', 'blockread', 'blockwrite', 'break', 'chdir',
+            'chr', 'close', 'closefile', 'comptocurrency', 'comptodouble',
+            'concat', 'continue', 'copy', 'cos', 'dec', 'delete',
+            'dispose', 'doubletocomp', 'endthread', 'enummodules',
+            'enumresourcemodules', 'eof', 'eoln', 'erase', 'exceptaddr',
+            'exceptobject', 'exclude', 'exit', 'exp', 'filepos', 'filesize',
+            'fillchar', 'finalize', 'findclasshinstance', 'findhinstance',
+            'findresourcehinstance', 'flush', 'frac', 'freemem',
+            'get8087cw', 'getdir', 'getlasterror', 'getmem',
+            'getmemorymanager', 'getmodulefilename', 'getvariantmanager',
+            'halt', 'hi', 'high', 'inc', 'include', 'initialize', 'insert',
+            'int', 'ioresult', 'ismemorymanagerset', 'isvariantmanagerset',
+            'length', 'ln', 'lo', 'low', 'mkdir', 'move', 'new', 'odd',
+            'olestrtostring', 'olestrtostrvar', 'ord', 'paramcount',
+            'paramstr', 'pi', 'pos', 'pred', 'ptr', 'pucs4chars', 'random',
+            'randomize', 'read', 'readln', 'reallocmem',
+            'releaseexceptionobject', 'rename', 'reset', 'rewrite', 'rmdir',
+            'round', 'runerror', 'seek', 'seekeof', 'seekeoln',
+            'set8087cw', 'setlength', 'setlinebreakstyle',
+            'setmemorymanager', 'setstring', 'settextbuf',
+            'setvariantmanager', 'sin', 'sizeof', 'slice', 'sqr', 'sqrt',
+            'str', 'stringofchar', 'stringtoolestr', 'stringtowidechar',
+            'succ', 'swap', 'trunc', 'truncate', 'typeinfo',
+            'ucs4stringtowidestring', 'unicodetoutf8', 'uniquestring',
+            'upcase', 'utf8decode', 'utf8encode', 'utf8toansi',
+            'utf8tounicode', 'val', 'vararrayredim', 'varclear',
+            'widecharlentostring', 'widecharlentostrvar',
+            'widechartostring', 'widechartostrvar',
+            'widestringtoucs4string', 'write', 'writeln'
+        ),
+        'SysUtils': (
+            'abort', 'addexitproc', 'addterminateproc', 'adjustlinebreaks',
+            'allocmem', 'ansicomparefilename', 'ansicomparestr',
+            'ansicomparetext', 'ansidequotedstr', 'ansiextractquotedstr',
+            'ansilastchar', 'ansilowercase', 'ansilowercasefilename',
+            'ansipos', 'ansiquotedstr', 'ansisamestr', 'ansisametext',
+            'ansistrcomp', 'ansistricomp', 'ansistrlastchar', 'ansistrlcomp',
+            'ansistrlicomp', 'ansistrlower', 'ansistrpos', 'ansistrrscan',
+            'ansistrscan', 'ansistrupper', 'ansiuppercase',
+            'ansiuppercasefilename', 'appendstr', 'assignstr', 'beep',
+            'booltostr', 'bytetocharindex', 'bytetocharlen', 'bytetype',
+            'callterminateprocs', 'changefileext', 'charlength',
+            'chartobyteindex', 'chartobytelen', 'comparemem', 'comparestr',
+            'comparetext', 'createdir', 'createguid', 'currentyear',
+            'currtostr', 'currtostrf', 'date', 'datetimetofiledate',
+            'datetimetostr', 'datetimetostring', 'datetimetosystemtime',
+            'datetimetotimestamp', 'datetostr', 'dayofweek', 'decodedate',
+            'decodedatefully', 'decodetime', 'deletefile', 'directoryexists',
+            'diskfree', 'disksize', 'disposestr', 'encodedate', 'encodetime',
+            'exceptionerrormessage', 'excludetrailingbackslash',
+            'excludetrailingpathdelimiter', 'expandfilename',
+            'expandfilenamecase', 'expanduncfilename', 'extractfiledir',
+            'extractfiledrive', 'extractfileext', 'extractfilename',
+            'extractfilepath', 'extractrelativepath', 'extractshortpathname',
+            'fileage', 'fileclose', 'filecreate', 'filedatetodatetime',
+            'fileexists', 'filegetattr', 'filegetdate', 'fileisreadonly',
+            'fileopen', 'fileread', 'filesearch', 'fileseek', 'filesetattr',
+            'filesetdate', 'filesetreadonly', 'filewrite', 'finalizepackage',
+            'findclose', 'findcmdlineswitch', 'findfirst', 'findnext',
+            'floattocurr', 'floattodatetime', 'floattodecimal', 'floattostr',
+            'floattostrf', 'floattotext', 'floattotextfmt', 'fmtloadstr',
+            'fmtstr', 'forcedirectories', 'format', 'formatbuf', 'formatcurr',
+            'formatdatetime', 'formatfloat', 'freeandnil', 'getcurrentdir',
+            'getenvironmentvariable', 'getfileversion', 'getformatsettings',
+            'getlocaleformatsettings', 'getmodulename', 'getpackagedescription',
+            'getpackageinfo', 'gettime', 'guidtostring', 'incamonth',
+            'includetrailingbackslash', 'includetrailingpathdelimiter',
+            'incmonth', 'initializepackage', 'interlockeddecrement',
+            'interlockedexchange', 'interlockedexchangeadd',
+            'interlockedincrement', 'inttohex', 'inttostr', 'isdelimiter',
+            'isequalguid', 'isleapyear', 'ispathdelimiter', 'isvalidident',
+            'languages', 'lastdelimiter', 'loadpackage', 'loadstr',
+            'lowercase', 'msecstotimestamp', 'newstr', 'nextcharindex', 'now',
+            'outofmemoryerror', 'quotedstr', 'raiselastoserror',
+            'raiselastwin32error', 'removedir', 'renamefile', 'replacedate',
+            'replacetime', 'safeloadlibrary', 'samefilename', 'sametext',
+            'setcurrentdir', 'showexception', 'sleep', 'stralloc', 'strbufsize',
+            'strbytetype', 'strcat', 'strcharlength', 'strcomp', 'strcopy',
+            'strdispose', 'strecopy', 'strend', 'strfmt', 'stricomp',
+            'stringreplace', 'stringtoguid', 'strlcat', 'strlcomp', 'strlcopy',
+            'strlen', 'strlfmt', 'strlicomp', 'strlower', 'strmove', 'strnew',
+            'strnextchar', 'strpas', 'strpcopy', 'strplcopy', 'strpos',
+            'strrscan', 'strscan', 'strtobool', 'strtobooldef', 'strtocurr',
+            'strtocurrdef', 'strtodate', 'strtodatedef', 'strtodatetime',
+            'strtodatetimedef', 'strtofloat', 'strtofloatdef', 'strtoint',
+            'strtoint64', 'strtoint64def', 'strtointdef', 'strtotime',
+            'strtotimedef', 'strupper', 'supports', 'syserrormessage',
+            'systemtimetodatetime', 'texttofloat', 'time', 'timestamptodatetime',
+            'timestamptomsecs', 'timetostr', 'trim', 'trimleft', 'trimright',
+            'tryencodedate', 'tryencodetime', 'tryfloattocurr', 'tryfloattodatetime',
+            'trystrtobool', 'trystrtocurr', 'trystrtodate', 'trystrtodatetime',
+            'trystrtofloat', 'trystrtoint', 'trystrtoint64', 'trystrtotime',
+            'unloadpackage', 'uppercase', 'widecomparestr', 'widecomparetext',
+            'widefmtstr', 'wideformat', 'wideformatbuf', 'widelowercase',
+            'widesamestr', 'widesametext', 'wideuppercase', 'win32check',
+            'wraptext'
+        ),
+        'Classes': (
+            'activateclassgroup', 'allocatehwnd', 'bintohex', 'checksynchronize',
+            'collectionsequal', 'countgenerations', 'deallocatehwnd', 'equalrect',
+            'extractstrings', 'findclass', 'findglobalcomponent', 'getclass',
+            'groupdescendantswith', 'hextobin', 'identtoint',
+            'initinheritedcomponent', 'inttoident', 'invalidpoint',
+            'isuniqueglobalcomponentname', 'linestart', 'objectbinarytotext',
+            'objectresourcetotext', 'objecttexttobinary', 'objecttexttoresource',
+            'pointsequal', 'readcomponentres', 'readcomponentresex',
+            'readcomponentresfile', 'rect', 'registerclass', 'registerclassalias',
+            'registerclasses', 'registercomponents', 'registerintegerconsts',
+            'registernoicon', 'registernonactivex', 'smallpoint', 'startclassgroup',
+            'teststreamformat', 'unregisterclass', 'unregisterclasses',
+            'unregisterintegerconsts', 'unregistermoduleclasses',
+            'writecomponentresfile'
+        ),
+        'Math': (
+            'arccos', 'arccosh', 'arccot', 'arccoth', 'arccsc', 'arccsch', 'arcsec',
+            'arcsech', 'arcsin', 'arcsinh', 'arctan2', 'arctanh', 'ceil',
+            'comparevalue', 'cosecant', 'cosh', 'cot', 'cotan', 'coth', 'csc',
+            'csch', 'cycletodeg', 'cycletograd', 'cycletorad', 'degtocycle',
+            'degtograd', 'degtorad', 'divmod', 'doubledecliningbalance',
+            'ensurerange', 'floor', 'frexp', 'futurevalue', 'getexceptionmask',
+            'getprecisionmode', 'getroundmode', 'gradtocycle', 'gradtodeg',
+            'gradtorad', 'hypot', 'inrange', 'interestpayment', 'interestrate',
+            'internalrateofreturn', 'intpower', 'isinfinite', 'isnan', 'iszero',
+            'ldexp', 'lnxp1', 'log10', 'log2', 'logn', 'max', 'maxintvalue',
+            'maxvalue', 'mean', 'meanandstddev', 'min', 'minintvalue', 'minvalue',
+            'momentskewkurtosis', 'netpresentvalue', 'norm', 'numberofperiods',
+            'payment', 'periodpayment', 'poly', 'popnstddev', 'popnvariance',
+            'power', 'presentvalue', 'radtocycle', 'radtodeg', 'radtograd',
+            'randg', 'randomrange', 'roundto', 'samevalue', 'sec', 'secant',
+            'sech', 'setexceptionmask', 'setprecisionmode', 'setroundmode',
+            'sign', 'simpleroundto', 'sincos', 'sinh', 'slndepreciation', 'stddev',
+            'sum', 'sumint', 'sumofsquares', 'sumsandsquares', 'syddepreciation',
+            'tan', 'tanh', 'totalvariance', 'variance'
+        )
+    }
+
+    ASM_REGISTERS = {
+        'ah', 'al', 'ax', 'bh', 'bl', 'bp', 'bx', 'ch', 'cl', 'cr0',
+        'cr1', 'cr2', 'cr3', 'cr4', 'cs', 'cx', 'dh', 'di', 'dl', 'dr0',
+        'dr1', 'dr2', 'dr3', 'dr4', 'dr5', 'dr6', 'dr7', 'ds', 'dx',
+        'eax', 'ebp', 'ebx', 'ecx', 'edi', 'edx', 'es', 'esi', 'esp',
+        'fs', 'gs', 'mm0', 'mm1', 'mm2', 'mm3', 'mm4', 'mm5', 'mm6',
+        'mm7', 'si', 'sp', 'ss', 'st0', 'st1', 'st2', 'st3', 'st4', 'st5',
+        'st6', 'st7', 'xmm0', 'xmm1', 'xmm2', 'xmm3', 'xmm4', 'xmm5',
+        'xmm6', 'xmm7'
+    }
+
+    ASM_INSTRUCTIONS = {
+        'aaa', 'aad', 'aam', 'aas', 'adc', 'add', 'and', 'arpl', 'bound',
+        'bsf', 'bsr', 'bswap', 'bt', 'btc', 'btr', 'bts', 'call', 'cbw',
+        'cdq', 'clc', 'cld', 'cli', 'clts', 'cmc', 'cmova', 'cmovae',
+        'cmovb', 'cmovbe', 'cmovc', 'cmovcxz', 'cmove', 'cmovg',
+        'cmovge', 'cmovl', 'cmovle', 'cmovna', 'cmovnae', 'cmovnb',
+        'cmovnbe', 'cmovnc', 'cmovne', 'cmovng', 'cmovnge', 'cmovnl',
+        'cmovnle', 'cmovno', 'cmovnp', 'cmovns', 'cmovnz', 'cmovo',
+        'cmovp', 'cmovpe', 'cmovpo', 'cmovs', 'cmovz', 'cmp', 'cmpsb',
+        'cmpsd', 'cmpsw', 'cmpxchg', 'cmpxchg486', 'cmpxchg8b', 'cpuid',
+        'cwd', 'cwde', 'daa', 'das', 'dec', 'div', 'emms', 'enter', 'hlt',
+        'ibts', 'icebp', 'idiv', 'imul', 'in', 'inc', 'insb', 'insd',
+        'insw', 'int', 'int01', 'int03', 'int1', 'int3', 'into', 'invd',
+        'invlpg', 'iret', 'iretd', 'iretw', 'ja', 'jae', 'jb', 'jbe',
+        'jc', 'jcxz', 'jcxz', 'je', 'jecxz', 'jg', 'jge', 'jl', 'jle',
+        'jmp', 'jna', 'jnae', 'jnb', 'jnbe', 'jnc', 'jne', 'jng', 'jnge',
+        'jnl', 'jnle', 'jno', 'jnp', 'jns', 'jnz', 'jo', 'jp', 'jpe',
+        'jpo', 'js', 'jz', 'lahf', 'lar', 'lcall', 'lds', 'lea', 'leave',
+        'les', 'lfs', 'lgdt', 'lgs', 'lidt', 'ljmp', 'lldt', 'lmsw',
+        'loadall', 'loadall286', 'lock', 'lodsb', 'lodsd', 'lodsw',
+        'loop', 'loope', 'loopne', 'loopnz', 'loopz', 'lsl', 'lss', 'ltr',
+        'mov', 'movd', 'movq', 'movsb', 'movsd', 'movsw', 'movsx',
+        'movzx', 'mul', 'neg', 'nop', 'not', 'or', 'out', 'outsb', 'outsd',
+        'outsw', 'pop', 'popa', 'popad', 'popaw', 'popf', 'popfd', 'popfw',
+        'push', 'pusha', 'pushad', 'pushaw', 'pushf', 'pushfd', 'pushfw',
+        'rcl', 'rcr', 'rdmsr', 'rdpmc', 'rdshr', 'rdtsc', 'rep', 'repe',
+        'repne', 'repnz', 'repz', 'ret', 'retf', 'retn', 'rol', 'ror',
+        'rsdc', 'rsldt', 'rsm', 'sahf', 'sal', 'salc', 'sar', 'sbb',
+        'scasb', 'scasd', 'scasw', 'seta', 'setae', 'setb', 'setbe',
+        'setc', 'setcxz', 'sete', 'setg', 'setge', 'setl', 'setle',
+        'setna', 'setnae', 'setnb', 'setnbe', 'setnc', 'setne', 'setng',
+        'setnge', 'setnl', 'setnle', 'setno', 'setnp', 'setns', 'setnz',
+        'seto', 'setp', 'setpe', 'setpo', 'sets', 'setz', 'sgdt', 'shl',
+        'shld', 'shr', 'shrd', 'sidt', 'sldt', 'smi', 'smint', 'smintold',
+        'smsw', 'stc', 'std', 'sti', 'stosb', 'stosd', 'stosw', 'str',
+        'sub', 'svdc', 'svldt', 'svts', 'syscall', 'sysenter', 'sysexit',
+        'sysret', 'test', 'ud1', 'ud2', 'umov', 'verr', 'verw', 'wait',
+        'wbinvd', 'wrmsr', 'wrshr', 'xadd', 'xbts', 'xchg', 'xlat',
+        'xlatb', 'xor'
+    }
+
+    PORTUGOL_KEYWORDS = (
+        'aleatorio',
+        'algoritmo',
+        'arquivo',
+        'ate',
+        'caso',
+        'cronometro',
+        'debug',
+        'e',
+        'eco',
+        'enquanto',
+        'entao',
+        'escolha',
+        'escreva',
+        'escreval',
+        'faca',
+        'falso',
+        'fimalgoritmo',
+        'fimenquanto',
+        'fimescolha',
+        'fimfuncao',
+        'fimpara',
+        'fimprocedimento',
+        'fimrepita',
+        'fimse',
+        'funcao',
+        'inicio',
+        'int',
+        'interrompa',
+        'leia',
+        'limpatela',
+        'mod',
+        'nao',
+        'ou',
+        'outrocaso',
+        'para',
+        'passo',
+        'pausa',
+        'procedimento',
+        'repita',
+        'retorne',
+        'se',
+        'senao',
+        'timer',
+        'var',
+        'vetor',
+        'verdadeiro',
+        'xou',
+        'div',
+        'mod',
+        'abs',
+        'arccos',
+        'arcsen',
+        'arctan',
+        'cos',
+        'cotan',
+        'Exp',
+        'grauprad',
+        'int',
+        'log',
+        'logn',
+        'pi',
+        'quad',
+        'radpgrau',
+        'raizq',
+        'rand',
+        'randi',
+        'sen',
+        'Tan',
+        'asc',
+        'carac',
+        'caracpnum',
+        'compr',
+        'copia',
+        'maiusc',
+        'minusc',
+        'numpcarac',
+        'pos',
+    )
+
+    PORTUGOL_BUILTIN_TYPES = {
+        'inteiro', 'real', 'caractere', 'logico'
+    }
+
+    def __init__(self, **options):
+        Lexer.__init__(self, **options)
+        self.keywords = set()
+        self.builtins = set()
+        if get_bool_opt(options, 'portugol', False):
+            self.keywords.update(self.PORTUGOL_KEYWORDS)
+            self.builtins.update(self.PORTUGOL_BUILTIN_TYPES)
+            self.is_portugol = True
+        else:
+            self.is_portugol = False
+
+            if get_bool_opt(options, 'turbopascal', True):
+                self.keywords.update(self.TURBO_PASCAL_KEYWORDS)
+            if get_bool_opt(options, 'delphi', True):
+                self.keywords.update(self.DELPHI_KEYWORDS)
+            if get_bool_opt(options, 'freepascal', True):
+                self.keywords.update(self.FREE_PASCAL_KEYWORDS)
+            for unit in get_list_opt(options, 'units', list(self.BUILTIN_UNITS)):
+                self.builtins.update(self.BUILTIN_UNITS[unit])
+
+    def get_tokens_unprocessed(self, text):
+        scanner = Scanner(text, re.DOTALL | re.MULTILINE | re.IGNORECASE)
+        stack = ['initial']
+        in_function_block = False
+        in_property_block = False
+        was_dot = False
+        next_token_is_function = False
+        next_token_is_property = False
+        collect_labels = False
+        block_labels = set()
+        brace_balance = [0, 0]
+
+        while not scanner.eos:
+            token = Error
+
+            if stack[-1] == 'initial':
+                if scanner.scan(r'\s+'):
+                    token = Whitespace
+                elif not self.is_portugol and scanner.scan(r'\{.*?\}|\(\*.*?\*\)'):
+                    if scanner.match.startswith('$'):
+                        token = Comment.Preproc
+                    else:
+                        token = Comment.Multiline
+                elif scanner.scan(r'//.*?$'):
+                    token = Comment.Single
+                elif self.is_portugol and scanner.scan(r'(<\-)|(>=)|(<=)|%|<|>|-|\+|\*|\=|(<>)|\/|\.|:|,'):
+                    token = Operator
+                elif not self.is_portugol and scanner.scan(r'[-+*\/=<>:;,.@\^]'):
+                    token = Operator
+                    # stop label highlighting on next ";"
+                    if collect_labels and scanner.match == ';':
+                        collect_labels = False
+                elif scanner.scan(r'[\(\)\[\]]+'):
+                    token = Punctuation
+                    # abort function naming ``foo = Function(...)``
+                    next_token_is_function = False
+                    # if we are in a function block we count the open
+                    # braces because ootherwise it's impossible to
+                    # determine the end of the modifier context
+                    if in_function_block or in_property_block:
+                        if scanner.match == '(':
+                            brace_balance[0] += 1
+                        elif scanner.match == ')':
+                            brace_balance[0] -= 1
+                        elif scanner.match == '[':
+                            brace_balance[1] += 1
+                        elif scanner.match == ']':
+                            brace_balance[1] -= 1
+                elif scanner.scan(r'[A-Za-z_][A-Za-z_0-9]*'):
+                    lowercase_name = scanner.match.lower()
+                    if lowercase_name == 'result':
+                        token = Name.Builtin.Pseudo
+                    elif lowercase_name in self.keywords:
+                        token = Keyword
+                        # if we are in a special block and a
+                        # block ending keyword occurs (and the parenthesis
+                        # is balanced) we end the current block context
+                        if self.is_portugol:
+                            if lowercase_name in ('funcao', 'procedimento'):
+                                in_function_block = True
+                                next_token_is_function = True
+                        else:
+                            if (in_function_block or in_property_block) and \
+                                    lowercase_name in self.BLOCK_KEYWORDS and \
+                                    brace_balance[0] <= 0 and \
+                                    brace_balance[1] <= 0:
+                                in_function_block = False
+                                in_property_block = False
+                                brace_balance = [0, 0]
+                                block_labels = set()
+                            if lowercase_name in ('label', 'goto'):
+                                collect_labels = True
+                            elif lowercase_name == 'asm':
+                                stack.append('asm')
+                            elif lowercase_name == 'property':
+                                in_property_block = True
+                                next_token_is_property = True
+                            elif lowercase_name in ('procedure', 'operator',
+                                                    'function', 'constructor',
+                                                    'destructor'):
+                                in_function_block = True
+                                next_token_is_function = True
+                    # we are in a function block and the current name
+                    # is in the set of registered modifiers. highlight
+                    # it as pseudo keyword
+                    elif not self.is_portugol and in_function_block and \
+                            lowercase_name in self.FUNCTION_MODIFIERS:
+                        token = Keyword.Pseudo
+                    # if we are in a property highlight some more
+                    # modifiers
+                    elif not self.is_portugol and in_property_block and \
+                            lowercase_name in ('read', 'write'):
+                        token = Keyword.Pseudo
+                        next_token_is_function = True
+                    # if the last iteration set next_token_is_function
+                    # to true we now want this name highlighted as
+                    # function. so do that and reset the state
+                    elif next_token_is_function:
+                        # Look if the next token is a dot. If yes it's
+                        # not a function, but a class name and the
+                        # part after the dot a function name
+                        if not self.is_portugol and scanner.test(r'\s*\.\s*'):
+                            token = Name.Class
+                        # it's not a dot, our job is done
+                        else:
+                            token = Name.Function
+                            next_token_is_function = False
+
+                            if self.is_portugol:
+                                block_labels.add(scanner.match.lower())
+
+                    # same for properties
+                    elif not self.is_portugol and next_token_is_property:
+                        token = Name.Property
+                        next_token_is_property = False
+                    # Highlight this token as label and add it
+                    # to the list of known labels
+                    elif not self.is_portugol and collect_labels:
+                        token = Name.Label
+                        block_labels.add(scanner.match.lower())
+                    # name is in list of known labels
+                    elif lowercase_name in block_labels:
+                        token = Name.Label
+                    elif self.is_portugol and lowercase_name in self.PORTUGOL_BUILTIN_TYPES:
+                        token = Keyword.Type
+                    elif not self.is_portugol and lowercase_name in self.BUILTIN_TYPES:
+                        token = Keyword.Type
+                    elif not self.is_portugol and lowercase_name in self.DIRECTIVES:
+                        token = Keyword.Pseudo
+                    # builtins are just builtins if the token
+                    # before isn't a dot
+                    elif not self.is_portugol and not was_dot and lowercase_name in self.builtins:
+                        token = Name.Builtin
+                    else:
+                        token = Name
+                elif self.is_portugol and scanner.scan(r"\""):
+                    token = String
+                    stack.append('string')
+                elif not self.is_portugol and scanner.scan(r"'"):
+                    token = String
+                    stack.append('string')
+                elif not self.is_portugol and scanner.scan(r'\#(\d+|\$[0-9A-Fa-f]+)'):
+                    token = String.Char
+                elif not self.is_portugol and scanner.scan(r'\$[0-9A-Fa-f]+'):
+                    token = Number.Hex
+                elif scanner.scan(r'\d+(?![eE]|\.[^.])'):
+                    token = Number.Integer
+                elif scanner.scan(r'\d+(\.\d+([eE][+-]?\d+)?|[eE][+-]?\d+)'):
+                    token = Number.Float
+                else:
+                    # if the stack depth is deeper than once, pop
+                    if len(stack) > 1:
+                        stack.pop()
+                    scanner.get_char()
+
+            elif stack[-1] == 'string':
+                if self.is_portugol:
+                    if scanner.scan(r"''"):
+                        token = String.Escape
+                    elif scanner.scan(r"\""):
+                        token = String
+                        stack.pop()
+                    elif scanner.scan(r"[^\"]*"):
+                        token = String
+                    else:
+                        scanner.get_char()
+                        stack.pop()
+                else:
+                    if scanner.scan(r"''"):
+                        token = String.Escape
+                    elif scanner.scan(r"'"):
+                        token = String
+                        stack.pop()
+                    elif scanner.scan(r"[^']*"):
+                        token = String
+                    else:
+                        scanner.get_char()
+                        stack.pop()
+            elif not self.is_portugol and stack[-1] == 'asm':
+                if scanner.scan(r'\s+'):
+                    token = Whitespace
+                elif scanner.scan(r'end'):
+                    token = Keyword
+                    stack.pop()
+                elif scanner.scan(r'\{.*?\}|\(\*.*?\*\)'):
+                    if scanner.match.startswith('$'):
+                        token = Comment.Preproc
+                    else:
+                        token = Comment.Multiline
+                elif scanner.scan(r'//.*?$'):
+                    token = Comment.Single
+                elif scanner.scan(r"'"):
+                    token = String
+                    stack.append('string')
+                elif scanner.scan(r'@@[A-Za-z_][A-Za-z_0-9]*'):
+                    token = Name.Label
+                elif scanner.scan(r'[A-Za-z_][A-Za-z_0-9]*'):
+                    lowercase_name = scanner.match.lower()
+                    if lowercase_name in self.ASM_INSTRUCTIONS:
+                        token = Keyword
+                    elif lowercase_name in self.ASM_REGISTERS:
+                        token = Name.Builtin
+                    else:
+                        token = Name
+                elif scanner.scan(r'[-+*\/=<>:;,.@\^]+'):
+                    token = Operator
+                elif scanner.scan(r'[\(\)\[\]]+'):
+                    token = Punctuation
+                elif scanner.scan(r'\$[0-9A-Fa-f]+'):
+                    token = Number.Hex
+                elif scanner.scan(r'\d+(?![eE]|\.[^.])'):
+                    token = Number.Integer
+                elif scanner.scan(r'\d+(\.\d+([eE][+-]?\d+)?|[eE][+-]?\d+)'):
+                    token = Number.Float
+                else:
+                    scanner.get_char()
+                    stack.pop()
+
+            # save the dot!!!11
+            if not self.is_portugol and scanner.match.strip():
+                was_dot = scanner.match == '.'
+
+            yield scanner.start_pos, token, scanner.match or ''
diff --git a/.venv/Lib/site-packages/pygments/lexers/pawn.py b/.venv/Lib/site-packages/pygments/lexers/pawn.py
new file mode 100644 (file)
index 0000000..99d9c96
--- /dev/null
@@ -0,0 +1,202 @@
+"""
+    pygments.lexers.pawn
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Pawn languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+from pygments.util import get_bool_opt
+
+__all__ = ['SourcePawnLexer', 'PawnLexer']
+
+
+class SourcePawnLexer(RegexLexer):
+    """
+    For SourcePawn source code with preprocessor directives.
+    """
+    name = 'SourcePawn'
+    aliases = ['sp']
+    filenames = ['*.sp']
+    mimetypes = ['text/x-sourcepawn']
+    url = 'https://github.com/alliedmodders/sourcepawn'
+    version_added = '1.6'
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/\*.*?\*/)+'
+    #: only one /* */ style comment
+    _ws1 = r'\s*(?:/[*].*?[*]/\s*)*'
+
+    tokens = {
+        'root': [
+            # preprocessor directives: without whitespace
+            (r'^#if\s+0', Comment.Preproc, 'if0'),
+            ('^#', Comment.Preproc, 'macro'),
+            # or with whitespace
+            ('^' + _ws1 + r'#if\s+0', Comment.Preproc, 'if0'),
+            ('^' + _ws1 + '#', Comment.Preproc, 'macro'),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment.Multiline),
+            (r'[{}]', Punctuation),
+            (r'L?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'0[0-7]+[LlUu]*', Number.Oct),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.;]', Punctuation),
+            (r'(case|const|continue|native|'
+             r'default|else|enum|for|if|new|operator|'
+             r'public|return|sizeof|static|decl|struct|switch)\b', Keyword),
+            (r'(bool|Float)\b', Keyword.Type),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),       # line continuation
+            (r'\\', String),         # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/\*(.|\n)*?\*/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'),
+            (r'.*?\n', Comment),
+        ]
+    }
+
+    SM_TYPES = {'Action', 'bool', 'Float', 'Plugin', 'String', 'any',
+                'AdminFlag', 'OverrideType', 'OverrideRule', 'ImmunityType',
+                'GroupId', 'AdminId', 'AdmAccessMode', 'AdminCachePart',
+                'CookieAccess', 'CookieMenu', 'CookieMenuAction', 'NetFlow',
+                'ConVarBounds', 'QueryCookie', 'ReplySource',
+                'ConVarQueryResult', 'ConVarQueryFinished', 'Function',
+                'Action', 'Identity', 'PluginStatus', 'PluginInfo', 'DBResult',
+                'DBBindType', 'DBPriority', 'PropType', 'PropFieldType',
+                'MoveType', 'RenderMode', 'RenderFx', 'EventHookMode',
+                'EventHook', 'FileType', 'FileTimeMode', 'PathType',
+                'ParamType', 'ExecType', 'DialogType', 'Handle', 'KvDataTypes',
+                'NominateResult', 'MapChange', 'MenuStyle', 'MenuAction',
+                'MenuSource', 'RegexError', 'SDKCallType', 'SDKLibrary',
+                'SDKFuncConfSource', 'SDKType', 'SDKPassMethod', 'RayType',
+                'TraceEntityFilter', 'ListenOverride', 'SortOrder', 'SortType',
+                'SortFunc2D', 'APLRes', 'FeatureType', 'FeatureStatus',
+                'SMCResult', 'SMCError', 'TFClassType', 'TFTeam', 'TFCond',
+                'TFResourceType', 'Timer', 'TopMenuAction', 'TopMenuObjectType',
+                'TopMenuPosition', 'TopMenuObject', 'UserMsg'}
+
+    def __init__(self, **options):
+        self.smhighlighting = get_bool_opt(options,
+                                           'sourcemod', True)
+
+        self._functions = set()
+        if self.smhighlighting:
+            from pygments.lexers._sourcemod_builtins import FUNCTIONS
+            self._functions.update(FUNCTIONS)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name:
+                if self.smhighlighting:
+                    if value in self.SM_TYPES:
+                        token = Keyword.Type
+                    elif value in self._functions:
+                        token = Name.Builtin
+            yield index, token, value
+
+
+class PawnLexer(RegexLexer):
+    """
+    For Pawn source code.
+    """
+
+    name = 'Pawn'
+    aliases = ['pawn']
+    filenames = ['*.p', '*.pwn', '*.inc']
+    mimetypes = ['text/x-pawn']
+    url = 'https://www.compuphase.com/pawn/pawn.htm'
+    version_added = '2.0'
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/[*][\w\W]*?[*]/)+'
+    #: only one /* */ style comment
+    _ws1 = r'\s*(?:/[*].*?[*]/\s*)*'
+
+    tokens = {
+        'root': [
+            # preprocessor directives: without whitespace
+            (r'^#if\s+0', Comment.Preproc, 'if0'),
+            ('^#', Comment.Preproc, 'macro'),
+            # or with whitespace
+            ('^' + _ws1 + r'#if\s+0', Comment.Preproc, 'if0'),
+            ('^' + _ws1 + '#', Comment.Preproc, 'macro'),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?\*[\w\W]*?\*(\\\n)?/', Comment.Multiline),
+            (r'[{}]', Punctuation),
+            (r'L?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'0[0-7]+[LlUu]*', Number.Oct),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.;]', Punctuation),
+            (r'(switch|case|default|const|new|static|char|continue|break|'
+             r'if|else|for|while|do|operator|enum|'
+             r'public|return|sizeof|tagof|state|goto)\b', Keyword),
+            (r'(bool|Float)\b', Keyword.Type),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),       # line continuation
+            (r'\\', String),         # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/\*(.|\n)*?\*/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'),
+            (r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'),
+            (r'.*?\n', Comment),
+        ]
+    }
+
+    def analyse_text(text):
+        """This is basically C. There is a keyword which doesn't exist in C
+        though and is nearly unique to this language."""
+        if 'tagof' in text:
+            return 0.01
diff --git a/.venv/Lib/site-packages/pygments/lexers/pddl.py b/.venv/Lib/site-packages/pygments/lexers/pddl.py
new file mode 100644 (file)
index 0000000..77aa753
--- /dev/null
@@ -0,0 +1,82 @@
+"""
+    pygments.lexers.pddl
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Planning Domain Definition Language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+from pygments.lexer import RegexLexer, words, include
+from pygments.token import Punctuation, Keyword, Whitespace, Name, Comment, \
+    Operator, Number
+
+
+__all__ = ['PddlLexer']
+
+
+class PddlLexer(RegexLexer):
+    """
+    A PDDL lexer.
+
+    It should support up to PDDL 3.1.
+    """
+
+    name = 'PDDL'
+    aliases = ['pddl']
+    filenames = ['*.pddl']
+    # there doesn't really seem to be a PDDL homepage.
+    url = 'https://en.wikipedia.org/wiki/Planning_Domain_Definition_Language'
+    version_added = '2.19'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r';.*$', Comment.Singleline),
+            include('keywords'),
+            include('builtins'),
+            (r'[()]', Punctuation),
+            (r'[=/*+><-]', Operator),
+            (r'[a-zA-Z][a-zA-Z0-9_-]*', Name),
+            (r'\?[a-zA-Z][a-zA-Z0-9_-]*', Name.Variable),
+            (r'[0-9]+\.[0-9]+', Number.Float),
+            (r'[0-9]+', Number.Integer),
+        ],
+        'keywords': [
+            (words((
+                ':requirements', ':types', ':constants',
+                ':predicates', ':functions', ':action', ':agent',
+                ':parameters', ':precondition', ':effect',
+                ':durative-action', ':duration', ':condition',
+                ':derived', ':domain', ':objects', ':init',
+                ':goal', ':metric', ':length', ':serial', ':parallel',
+                # the following are requirements
+                ':strips', ':typing', ':negative-preconditions',
+                ':disjunctive-preconditions', ':equality',
+                ':existential-preconditions', ':universal-preconditions',
+                ':conditional-effects', ':fluents', ':numeric-fluents',
+                ':object-fluents', ':adl', ':durative-actions',
+                ':continuous-effects', ':derived-predicates',
+                ':time-intial-literals', ':preferences',
+                ':constraints', ':action-costs', ':multi-agent',
+                ':unfactored-privacy', ':factored-privacy',
+                ':non-deterministic'
+                ), suffix=r'\b'), Keyword)
+        ],
+        'builtins': [
+            (words((
+                'define', 'domain', 'object', 'either', 'and',
+                'forall', 'preference', 'imply', 'or', 'exists',
+                'not', 'when', 'assign', 'scale-up', 'scale-down',
+                'increase', 'decrease', 'at', 'over', 'start',
+                'end', 'all', 'problem', 'always', 'sometime',
+                'within', 'at-most-once', 'sometime-after',
+                'sometime-before', 'always-within', 'hold-during',
+                'hold-after', 'minimize', 'maximize',
+                'total-time', 'is-violated'), suffix=r'\b'),
+                Name.Builtin)
+        ]
+    }
+
diff --git a/.venv/Lib/site-packages/pygments/lexers/perl.py b/.venv/Lib/site-packages/pygments/lexers/perl.py
new file mode 100644 (file)
index 0000000..33f91f5
--- /dev/null
@@ -0,0 +1,733 @@
+"""
+    pygments.lexers.perl
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Perl, Raku and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, bygroups, \
+    using, this, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+from pygments.util import shebang_matches
+
+__all__ = ['PerlLexer', 'Perl6Lexer']
+
+
+class PerlLexer(RegexLexer):
+    """
+    For Perl source code.
+    """
+
+    name = 'Perl'
+    url = 'https://www.perl.org'
+    aliases = ['perl', 'pl']
+    filenames = ['*.pl', '*.pm', '*.t', '*.perl']
+    mimetypes = ['text/x-perl', 'application/x-perl']
+    version_added = ''
+
+    flags = re.DOTALL | re.MULTILINE
+    # TODO: give this to a perl guy who knows how to parse perl...
+    tokens = {
+        'balanced-regex': [
+            (r'/(\\\\|\\[^\\]|[^\\/])*/[egimosx]*', String.Regex, '#pop'),
+            (r'!(\\\\|\\[^\\]|[^\\!])*![egimosx]*', String.Regex, '#pop'),
+            (r'\\(\\\\|[^\\])*\\[egimosx]*', String.Regex, '#pop'),
+            (r'\{(\\\\|\\[^\\]|[^\\}])*\}[egimosx]*', String.Regex, '#pop'),
+            (r'<(\\\\|\\[^\\]|[^\\>])*>[egimosx]*', String.Regex, '#pop'),
+            (r'\[(\\\\|\\[^\\]|[^\\\]])*\][egimosx]*', String.Regex, '#pop'),
+            (r'\((\\\\|\\[^\\]|[^\\)])*\)[egimosx]*', String.Regex, '#pop'),
+            (r'@(\\\\|\\[^\\]|[^\\@])*@[egimosx]*', String.Regex, '#pop'),
+            (r'%(\\\\|\\[^\\]|[^\\%])*%[egimosx]*', String.Regex, '#pop'),
+            (r'\$(\\\\|\\[^\\]|[^\\$])*\$[egimosx]*', String.Regex, '#pop'),
+        ],
+        'root': [
+            (r'\A\#!.+?$', Comment.Hashbang),
+            (r'\#.*?$', Comment.Single),
+            (r'^=[a-zA-Z0-9]+\s+.*?\n=cut', Comment.Multiline),
+            (words((
+                'case', 'continue', 'do', 'else', 'elsif', 'for', 'foreach',
+                'if', 'last', 'my', 'next', 'our', 'redo', 'reset', 'then',
+                'unless', 'until', 'while', 'print', 'new', 'BEGIN',
+                'CHECK', 'INIT', 'END', 'return'), suffix=r'\b'),
+             Keyword),
+            (r'(format)(\s+)(\w+)(\s*)(=)(\s*\n)',
+             bygroups(Keyword, Whitespace, Name, Whitespace, Punctuation, Whitespace), 'format'),
+            (r'(eq|lt|gt|le|ge|ne|not|and|or|cmp)\b', Operator.Word),
+            # common delimiters
+            (r's/(\\\\|\\[^\\]|[^\\/])*/(\\\\|\\[^\\]|[^\\/])*/[egimosx]*',
+                String.Regex),
+            (r's!(\\\\|\\!|[^!])*!(\\\\|\\!|[^!])*![egimosx]*', String.Regex),
+            (r's\\(\\\\|[^\\])*\\(\\\\|[^\\])*\\[egimosx]*', String.Regex),
+            (r's@(\\\\|\\[^\\]|[^\\@])*@(\\\\|\\[^\\]|[^\\@])*@[egimosx]*',
+                String.Regex),
+            (r's%(\\\\|\\[^\\]|[^\\%])*%(\\\\|\\[^\\]|[^\\%])*%[egimosx]*',
+                String.Regex),
+            # balanced delimiters
+            (r's\{(\\\\|\\[^\\]|[^\\}])*\}\s*', String.Regex, 'balanced-regex'),
+            (r's<(\\\\|\\[^\\]|[^\\>])*>\s*', String.Regex, 'balanced-regex'),
+            (r's\[(\\\\|\\[^\\]|[^\\\]])*\]\s*', String.Regex,
+                'balanced-regex'),
+            (r's\((\\\\|\\[^\\]|[^\\)])*\)\s*', String.Regex,
+                'balanced-regex'),
+
+            (r'm?/(\\\\|\\[^\\]|[^\\/\n])*/[gcimosx]*', String.Regex),
+            (r'm(?=[/!\\{<\[(@%$])', String.Regex, 'balanced-regex'),
+            (r'((?<==~)|(?<=\())\s*/(\\\\|\\[^\\]|[^\\/])*/[gcimosx]*',
+                String.Regex),
+            (r'\s+', Whitespace),
+            (words((
+                'abs', 'accept', 'alarm', 'atan2', 'bind', 'binmode', 'bless', 'caller', 'chdir',
+                'chmod', 'chomp', 'chop', 'chown', 'chr', 'chroot', 'close', 'closedir', 'connect',
+                'continue', 'cos', 'crypt', 'dbmclose', 'dbmopen', 'defined', 'delete', 'die',
+                'dump', 'each', 'endgrent', 'endhostent', 'endnetent', 'endprotoent',
+                'endpwent', 'endservent', 'eof', 'eval', 'exec', 'exists', 'exit', 'exp', 'fcntl',
+                'fileno', 'flock', 'fork', 'format', 'formline', 'getc', 'getgrent', 'getgrgid',
+                'getgrnam', 'gethostbyaddr', 'gethostbyname', 'gethostent', 'getlogin',
+                'getnetbyaddr', 'getnetbyname', 'getnetent', 'getpeername', 'getpgrp',
+                'getppid', 'getpriority', 'getprotobyname', 'getprotobynumber',
+                'getprotoent', 'getpwent', 'getpwnam', 'getpwuid', 'getservbyname',
+                'getservbyport', 'getservent', 'getsockname', 'getsockopt', 'glob', 'gmtime',
+                'goto', 'grep', 'hex', 'import', 'index', 'int', 'ioctl', 'join', 'keys', 'kill', 'last',
+                'lc', 'lcfirst', 'length', 'link', 'listen', 'local', 'localtime', 'log', 'lstat',
+                'map', 'mkdir', 'msgctl', 'msgget', 'msgrcv', 'msgsnd', 'my', 'next', 'oct', 'open',
+                'opendir', 'ord', 'our', 'pack', 'pipe', 'pop', 'pos', 'printf',
+                'prototype', 'push', 'quotemeta', 'rand', 'read', 'readdir',
+                'readline', 'readlink', 'readpipe', 'recv', 'redo', 'ref', 'rename',
+                'reverse', 'rewinddir', 'rindex', 'rmdir', 'scalar', 'seek', 'seekdir',
+                'select', 'semctl', 'semget', 'semop', 'send', 'setgrent', 'sethostent', 'setnetent',
+                'setpgrp', 'setpriority', 'setprotoent', 'setpwent', 'setservent',
+                'setsockopt', 'shift', 'shmctl', 'shmget', 'shmread', 'shmwrite', 'shutdown',
+                'sin', 'sleep', 'socket', 'socketpair', 'sort', 'splice', 'split', 'sprintf', 'sqrt',
+                'srand', 'stat', 'study', 'substr', 'symlink', 'syscall', 'sysopen', 'sysread',
+                'sysseek', 'system', 'syswrite', 'tell', 'telldir', 'tie', 'tied', 'time', 'times', 'tr',
+                'truncate', 'uc', 'ucfirst', 'umask', 'undef', 'unlink', 'unpack', 'unshift', 'untie',
+                'utime', 'values', 'vec', 'wait', 'waitpid', 'wantarray', 'warn', 'write'), suffix=r'\b'),
+             Name.Builtin),
+            (r'((__(DATA|DIE|WARN)__)|(STD(IN|OUT|ERR)))\b', Name.Builtin.Pseudo),
+            (r'(<<)([\'"]?)([a-zA-Z_]\w*)(\2;?\n.*?\n)(\3)(\n)',
+             bygroups(String, String, String.Delimiter, String, String.Delimiter, Whitespace)),
+            (r'__END__', Comment.Preproc, 'end-part'),
+            (r'\$\^[ADEFHILMOPSTWX]', Name.Variable.Global),
+            (r"\$[\\\"\[\]'&`+*.,;=%~?@$!<>(^|/-](?!\w)", Name.Variable.Global),
+            (r'[$@%#]+', Name.Variable, 'varname'),
+            (r'0_?[0-7]+(_[0-7]+)*', Number.Oct),
+            (r'0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*', Number.Hex),
+            (r'0b[01]+(_[01]+)*', Number.Bin),
+            (r'(?i)(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?',
+             Number.Float),
+            (r'(?i)\d+(_\d*)*e[+-]?\d+(_\d*)*', Number.Float),
+            (r'\d+(_\d+)*', Number.Integer),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r'`(\\\\|\\[^\\]|[^`\\])*`', String.Backtick),
+            (r'<([^\s>]+)>', String.Regex),
+            (r'(q|qq|qw|qr|qx)\{', String.Other, 'cb-string'),
+            (r'(q|qq|qw|qr|qx)\(', String.Other, 'rb-string'),
+            (r'(q|qq|qw|qr|qx)\[', String.Other, 'sb-string'),
+            (r'(q|qq|qw|qr|qx)\<', String.Other, 'lt-string'),
+            (r'(q|qq|qw|qr|qx)([\W_])(.|\n)*?\2', String.Other),
+            (r'(package)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Whitespace, Name.Namespace)),
+            (r'(use|require|no)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Whitespace, Name.Namespace)),
+            (r'(sub)(\s+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (words((
+                'no', 'package', 'require', 'use'), suffix=r'\b'),
+             Keyword),
+            (r'(\[\]|\*\*|::|<<|>>|>=|<=>|<=|={3}|!=|=~|'
+             r'!~|&&?|\|\||\.{1,3})', Operator),
+            (r'[-+/*%=<>&^|!\\~]=?', Operator),
+            (r'[()\[\]:;,<>/?{}]', Punctuation),  # yes, there's no shortage
+                                                  # of punctuation in Perl!
+            (r'(?=\w)', Name, 'name'),
+        ],
+        'format': [
+            (r'\.\n', String.Interpol, '#pop'),
+            (r'[^\n]*\n', String.Interpol),
+        ],
+        'varname': [
+            (r'\s+', Whitespace),
+            (r'\{', Punctuation, '#pop'),    # hash syntax?
+            (r'\)|,', Punctuation, '#pop'),  # argument specifier
+            (r'\w+::', Name.Namespace),
+            (r'[\w:]+', Name.Variable, '#pop'),
+        ],
+        'name': [
+            (r'[a-zA-Z_]\w*(::[a-zA-Z_]\w*)*(::)?(?=\s*->)', Name.Namespace, '#pop'),
+            (r'[a-zA-Z_]\w*(::[a-zA-Z_]\w*)*::', Name.Namespace, '#pop'),
+            (r'[\w:]+', Name, '#pop'),
+            (r'[A-Z_]+(?=\W)', Name.Constant, '#pop'),
+            (r'(?=\W)', Text, '#pop'),
+        ],
+        'funcname': [
+            (r'[a-zA-Z_]\w*[!?]?', Name.Function),
+            (r'\s+', Whitespace),
+            # argument declaration
+            (r'(\([$@%]*\))(\s*)', bygroups(Punctuation, Whitespace)),
+            (r';', Punctuation, '#pop'),
+            (r'.*?\{', Punctuation, '#pop'),
+        ],
+        'cb-string': [
+            (r'\\[{}\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\{', String.Other, 'cb-string'),
+            (r'\}', String.Other, '#pop'),
+            (r'[^{}\\]+', String.Other)
+        ],
+        'rb-string': [
+            (r'\\[()\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\(', String.Other, 'rb-string'),
+            (r'\)', String.Other, '#pop'),
+            (r'[^()]+', String.Other)
+        ],
+        'sb-string': [
+            (r'\\[\[\]\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\[', String.Other, 'sb-string'),
+            (r'\]', String.Other, '#pop'),
+            (r'[^\[\]]+', String.Other)
+        ],
+        'lt-string': [
+            (r'\\[<>\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\<', String.Other, 'lt-string'),
+            (r'\>', String.Other, '#pop'),
+            (r'[^<>]+', String.Other)
+        ],
+        'end-part': [
+            (r'.+', Comment.Preproc, '#pop')
+        ]
+    }
+
+    def analyse_text(text):
+        if shebang_matches(text, r'perl'):
+            return True
+
+        result = 0
+
+        if re.search(r'(?:my|our)\s+[$@%(]', text):
+            result += 0.9
+
+        if ':=' in text:
+            # := is not valid Perl, but it appears in unicon, so we should
+            # become less confident if we think we found Perl with :=
+            result /= 2
+
+        return result
+
+
+class Perl6Lexer(ExtendedRegexLexer):
+    """
+    For Raku (a.k.a. Perl 6) source code.
+    """
+
+    name = 'Perl6'
+    url = 'https://www.raku.org'
+    aliases = ['perl6', 'pl6', 'raku']
+    filenames = ['*.pl', '*.pm', '*.nqp', '*.p6', '*.6pl', '*.p6l', '*.pl6',
+                 '*.6pm', '*.p6m', '*.pm6', '*.t', '*.raku', '*.rakumod',
+                 '*.rakutest', '*.rakudoc']
+    mimetypes = ['text/x-perl6', 'application/x-perl6']
+    version_added = '2.0'
+    flags = re.MULTILINE | re.DOTALL
+
+    PERL6_IDENTIFIER_RANGE = r"['\w:-]"
+
+    PERL6_KEYWORDS = (
+        #Phasers
+        'BEGIN','CATCH','CHECK','CLOSE','CONTROL','DOC','END','ENTER','FIRST',
+        'INIT','KEEP','LAST','LEAVE','NEXT','POST','PRE','QUIT','UNDO',
+        #Keywords
+        'anon','augment','but','class','constant','default','does','else',
+        'elsif','enum','for','gather','given','grammar','has','if','import',
+        'is','let','loop','made','make','method','module','multi','my','need',
+        'orwith','our','proceed','proto','repeat','require','return',
+        'return-rw','returns','role','rule','state','sub','submethod','subset',
+        'succeed','supersede','token','try','unit','unless','until','use',
+        'when','while','with','without',
+        #Traits
+        'export','native','repr','required','rw','symbol',
+    )
+
+    PERL6_BUILTINS = (
+        'ACCEPTS','abs','abs2rel','absolute','accept','accessed','acos',
+        'acosec','acosech','acosh','acotan','acotanh','acquire','act','action',
+        'actions','add','add_attribute','add_enum_value','add_fallback',
+        'add_method','add_parent','add_private_method','add_role','add_trustee',
+        'adverb','after','all','allocate','allof','allowed','alternative-names',
+        'annotations','antipair','antipairs','any','anyof','app_lifetime',
+        'append','arch','archname','args','arity','Array','asec','asech','asin',
+        'asinh','ASSIGN-KEY','ASSIGN-POS','assuming','ast','at','atan','atan2',
+        'atanh','AT-KEY','atomic-assign','atomic-dec-fetch','atomic-fetch',
+        'atomic-fetch-add','atomic-fetch-dec','atomic-fetch-inc',
+        'atomic-fetch-sub','atomic-inc-fetch','AT-POS','attributes','auth',
+        'await','backtrace','Bag','BagHash','bail-out','base','basename',
+        'base-repeating','batch','BIND-KEY','BIND-POS','bind-stderr',
+        'bind-stdin','bind-stdout','bind-udp','bits','bless','block','Bool',
+        'bool-only','bounds','break','Bridge','broken','BUILD','build-date',
+        'bytes','cache','callframe','calling-package','CALL-ME','callsame',
+        'callwith','can','cancel','candidates','cando','can-ok','canonpath',
+        'caps','caption','Capture','cas','catdir','categorize','categorize-list',
+        'catfile','catpath','cause','ceiling','cglobal','changed','Channel',
+        'chars','chdir','child','child-name','child-typename','chmod','chomp',
+        'chop','chr','chrs','chunks','cis','classify','classify-list','cleanup',
+        'clone','close','closed','close-stdin','cmp-ok','code','codes','collate',
+        'column','comb','combinations','command','comment','compiler','Complex',
+        'compose','compose_type','composer','condition','config',
+        'configure_destroy','configure_type_checking','conj','connect',
+        'constraints','construct','contains','contents','copy','cos','cosec',
+        'cosech','cosh','cotan','cotanh','count','count-only','cpu-cores',
+        'cpu-usage','CREATE','create_type','cross','cue','curdir','curupdir','d',
+        'Date','DateTime','day','daycount','day-of-month','day-of-week',
+        'day-of-year','days-in-month','declaration','decode','decoder','deepmap',
+        'default','defined','DEFINITE','delayed','DELETE-KEY','DELETE-POS',
+        'denominator','desc','DESTROY','destroyers','devnull','diag',
+        'did-you-mean','die','dies-ok','dir','dirname','dir-sep','DISTROnames',
+        'do','does','does-ok','done','done-testing','duckmap','dynamic','e',
+        'eager','earlier','elems','emit','enclosing','encode','encoder',
+        'encoding','end','ends-with','enum_from_value','enum_value_list',
+        'enum_values','enums','eof','EVAL','eval-dies-ok','EVALFILE',
+        'eval-lives-ok','exception','excludes-max','excludes-min','EXISTS-KEY',
+        'EXISTS-POS','exit','exitcode','exp','expected','explicitly-manage',
+        'expmod','extension','f','fail','fails-like','fc','feature','file',
+        'filename','find_method','find_method_qualified','finish','first','flat',
+        'flatmap','flip','floor','flunk','flush','fmt','format','formatter',
+        'freeze','from','from-list','from-loop','from-posix','full',
+        'full-barrier','get','get_value','getc','gist','got','grab','grabpairs',
+        'grep','handle','handled','handles','hardware','has_accessor','Hash',
+        'head','headers','hh-mm-ss','hidden','hides','hour','how','hyper','id',
+        'illegal','im','in','indent','index','indices','indir','infinite',
+        'infix','infix:<+>','infix:<->','install_method_cache','Instant',
+        'instead','Int','int-bounds','interval','in-timezone','invalid-str',
+        'invert','invocant','IO','IO::Notification.watch-path','is_trusted',
+        'is_type','isa','is-absolute','isa-ok','is-approx','is-deeply',
+        'is-hidden','is-initial-thread','is-int','is-lazy','is-leap-year',
+        'isNaN','isnt','is-prime','is-relative','is-routine','is-setting',
+        'is-win','item','iterator','join','keep','kept','KERNELnames','key',
+        'keyof','keys','kill','kv','kxxv','l','lang','last','lastcall','later',
+        'lazy','lc','leading','level','like','line','lines','link','List',
+        'listen','live','lives-ok','local','lock','log','log10','lookup','lsb',
+        'made','MAIN','make','Map','match','max','maxpairs','merge','message',
+        'method','method_table','methods','migrate','min','minmax','minpairs',
+        'minute','misplaced','Mix','MixHash','mkdir','mode','modified','month',
+        'move','mro','msb','multi','multiness','my','name','named','named_names',
+        'narrow','nativecast','native-descriptor','nativesizeof','new','new_type',
+        'new-from-daycount','new-from-pairs','next','nextcallee','next-handle',
+        'nextsame','nextwith','NFC','NFD','NFKC','NFKD','nl-in','nl-out',
+        'nodemap','nok','none','norm','not','note','now','nude','Num',
+        'numerator','Numeric','of','offset','offset-in-hours','offset-in-minutes',
+        'ok','old','on-close','one','on-switch','open','opened','operation',
+        'optional','ord','ords','orig','os-error','osname','out-buffer','pack',
+        'package','package-kind','package-name','packages','pair','pairs',
+        'pairup','parameter','params','parent','parent-name','parents','parse',
+        'parse-base','parsefile','parse-names','parts','pass','path','path-sep',
+        'payload','peer-host','peer-port','periods','perl','permutations','phaser',
+        'pick','pickpairs','pid','placeholder','plan','plus','polar','poll',
+        'polymod','pop','pos','positional','posix','postfix','postmatch',
+        'precomp-ext','precomp-target','pred','prefix','prematch','prepend',
+        'print','printf','print-nl','print-to','private','private_method_table',
+        'proc','produce','Promise','prompt','protect','pull-one','push',
+        'push-all','push-at-least','push-exactly','push-until-lazy','put',
+        'qualifier-type','quit','r','race','radix','rand','range','Rat','raw',
+        're','read','readchars','readonly','ready','Real','reallocate','reals',
+        'reason','rebless','receive','recv','redispatcher','redo','reduce',
+        'rel2abs','relative','release','rename','repeated','replacement',
+        'report','reserved','resolve','restore','result','resume','rethrow',
+        'reverse','right','rindex','rmdir','role','roles_to_compose','rolish',
+        'roll','rootdir','roots','rotate','rotor','round','roundrobin',
+        'routine-type','run','rwx','s','samecase','samemark','samewith','say',
+        'schedule-on','scheduler','scope','sec','sech','second','seek','self',
+        'send','Set','set_hidden','set_name','set_package','set_rw','set_value',
+        'SetHash','set-instruments','setup_finalization','shape','share','shell',
+        'shift','sibling','sigil','sign','signal','signals','signature','sin',
+        'sinh','sink','sink-all','skip','skip-at-least','skip-at-least-pull-one',
+        'skip-one','skip-rest','sleep','sleep-timer','sleep-until','Slip','slurp',
+        'slurp-rest','slurpy','snap','snapper','so','socket-host','socket-port',
+        'sort','source','source-package','spawn','SPEC','splice','split',
+        'splitdir','splitpath','sprintf','spurt','sqrt','squish','srand','stable',
+        'start','started','starts-with','status','stderr','stdout','Str',
+        'sub_signature','subbuf','subbuf-rw','subname','subparse','subst',
+        'subst-mutate','substr','substr-eq','substr-rw','subtest','succ','sum',
+        'Supply','symlink','t','tail','take','take-rw','tan','tanh','tap',
+        'target','target-name','tc','tclc','tell','then','throttle','throw',
+        'throws-like','timezone','tmpdir','to','today','todo','toggle','to-posix',
+        'total','trailing','trans','tree','trim','trim-leading','trim-trailing',
+        'truncate','truncated-to','trusts','try_acquire','trying','twigil','type',
+        'type_captures','typename','uc','udp','uncaught_handler','unimatch',
+        'uniname','uninames','uniparse','uniprop','uniprops','unique','unival',
+        'univals','unlike','unlink','unlock','unpack','unpolar','unshift',
+        'unwrap','updir','USAGE','use-ok','utc','val','value','values','VAR',
+        'variable','verbose-config','version','VMnames','volume','vow','w','wait',
+        'warn','watch','watch-path','week','weekday-of-month','week-number',
+        'week-year','WHAT','when','WHERE','WHEREFORE','WHICH','WHO',
+        'whole-second','WHY','wordcase','words','workaround','wrap','write',
+        'write-to','x','yada','year','yield','yyyy-mm-dd','z','zip','zip-latest',
+
+    )
+
+    PERL6_BUILTIN_CLASSES = (
+        #Booleans
+        'False','True',
+        #Classes
+        'Any','Array','Associative','AST','atomicint','Attribute','Backtrace',
+        'Backtrace::Frame','Bag','Baggy','BagHash','Blob','Block','Bool','Buf',
+        'Callable','CallFrame','Cancellation','Capture','CArray','Channel','Code',
+        'compiler','Complex','ComplexStr','Cool','CurrentThreadScheduler',
+        'Cursor','Date','Dateish','DateTime','Distro','Duration','Encoding',
+        'Exception','Failure','FatRat','Grammar','Hash','HyperWhatever','Instant',
+        'Int','int16','int32','int64','int8','IntStr','IO','IO::ArgFiles',
+        'IO::CatHandle','IO::Handle','IO::Notification','IO::Path',
+        'IO::Path::Cygwin','IO::Path::QNX','IO::Path::Unix','IO::Path::Win32',
+        'IO::Pipe','IO::Socket','IO::Socket::Async','IO::Socket::INET','IO::Spec',
+        'IO::Spec::Cygwin','IO::Spec::QNX','IO::Spec::Unix','IO::Spec::Win32',
+        'IO::Special','Iterable','Iterator','Junction','Kernel','Label','List',
+        'Lock','Lock::Async','long','longlong','Macro','Map','Match',
+        'Metamodel::AttributeContainer','Metamodel::C3MRO','Metamodel::ClassHOW',
+        'Metamodel::EnumHOW','Metamodel::Finalization','Metamodel::MethodContainer',
+        'Metamodel::MROBasedMethodDispatch','Metamodel::MultipleInheritance',
+        'Metamodel::Naming','Metamodel::Primitives','Metamodel::PrivateMethodContainer',
+        'Metamodel::RoleContainer','Metamodel::Trusting','Method','Mix','MixHash',
+        'Mixy','Mu','NFC','NFD','NFKC','NFKD','Nil','Num','num32','num64',
+        'Numeric','NumStr','ObjAt','Order','Pair','Parameter','Perl','Pod::Block',
+        'Pod::Block::Code','Pod::Block::Comment','Pod::Block::Declarator',
+        'Pod::Block::Named','Pod::Block::Para','Pod::Block::Table','Pod::Heading',
+        'Pod::Item','Pointer','Positional','PositionalBindFailover','Proc',
+        'Proc::Async','Promise','Proxy','PseudoStash','QuantHash','Range','Rat',
+        'Rational','RatStr','Real','Regex','Routine','Scalar','Scheduler',
+        'Semaphore','Seq','Set','SetHash','Setty','Signature','size_t','Slip',
+        'Stash','Str','StrDistance','Stringy','Sub','Submethod','Supplier',
+        'Supplier::Preserving','Supply','Systemic','Tap','Telemetry',
+        'Telemetry::Instrument::Thread','Telemetry::Instrument::Usage',
+        'Telemetry::Period','Telemetry::Sampler','Thread','ThreadPoolScheduler',
+        'UInt','uint16','uint32','uint64','uint8','Uni','utf8','Variable',
+        'Version','VM','Whatever','WhateverCode','WrapHandle'
+    )
+
+    PERL6_OPERATORS = (
+        'X', 'Z', 'after', 'also', 'and', 'andthen', 'before', 'cmp', 'div',
+        'eq', 'eqv', 'extra', 'ff', 'fff', 'ge', 'gt', 'le', 'leg', 'lt', 'm',
+        'mm', 'mod', 'ne', 'or', 'orelse', 'rx', 's', 'tr', 'x', 'xor', 'xx',
+        '++', '--', '**', '!', '+', '-', '~', '?', '|', '||', '+^', '~^', '?^',
+        '^', '*', '/', '%', '%%', '+&', '+<', '+>', '~&', '~<', '~>', '?&',
+        'gcd', 'lcm', '+', '-', '+|', '+^', '~|', '~^', '?|', '?^',
+        '~', '&', '^', 'but', 'does', '<=>', '..', '..^', '^..', '^..^',
+        '!=', '==', '<', '<=', '>', '>=', '~~', '===', '!eqv',
+        '&&', '||', '^^', '//', 'min', 'max', '??', '!!', 'ff', 'fff', 'so',
+        'not', '<==', '==>', '<<==', '==>>','unicmp',
+    )
+
+    # Perl 6 has a *lot* of possible bracketing characters
+    # this list was lifted from STD.pm6 (https://github.com/perl6/std)
+    PERL6_BRACKETS = {
+        '\u0028': '\u0029', '\u003c': '\u003e', '\u005b': '\u005d',
+        '\u007b': '\u007d', '\u00ab': '\u00bb', '\u0f3a': '\u0f3b',
+        '\u0f3c': '\u0f3d', '\u169b': '\u169c', '\u2018': '\u2019',
+        '\u201a': '\u2019', '\u201b': '\u2019', '\u201c': '\u201d',
+        '\u201e': '\u201d', '\u201f': '\u201d', '\u2039': '\u203a',
+        '\u2045': '\u2046', '\u207d': '\u207e', '\u208d': '\u208e',
+        '\u2208': '\u220b', '\u2209': '\u220c', '\u220a': '\u220d',
+        '\u2215': '\u29f5', '\u223c': '\u223d', '\u2243': '\u22cd',
+        '\u2252': '\u2253', '\u2254': '\u2255', '\u2264': '\u2265',
+        '\u2266': '\u2267', '\u2268': '\u2269', '\u226a': '\u226b',
+        '\u226e': '\u226f', '\u2270': '\u2271', '\u2272': '\u2273',
+        '\u2274': '\u2275', '\u2276': '\u2277', '\u2278': '\u2279',
+        '\u227a': '\u227b', '\u227c': '\u227d', '\u227e': '\u227f',
+        '\u2280': '\u2281', '\u2282': '\u2283', '\u2284': '\u2285',
+        '\u2286': '\u2287', '\u2288': '\u2289', '\u228a': '\u228b',
+        '\u228f': '\u2290', '\u2291': '\u2292', '\u2298': '\u29b8',
+        '\u22a2': '\u22a3', '\u22a6': '\u2ade', '\u22a8': '\u2ae4',
+        '\u22a9': '\u2ae3', '\u22ab': '\u2ae5', '\u22b0': '\u22b1',
+        '\u22b2': '\u22b3', '\u22b4': '\u22b5', '\u22b6': '\u22b7',
+        '\u22c9': '\u22ca', '\u22cb': '\u22cc', '\u22d0': '\u22d1',
+        '\u22d6': '\u22d7', '\u22d8': '\u22d9', '\u22da': '\u22db',
+        '\u22dc': '\u22dd', '\u22de': '\u22df', '\u22e0': '\u22e1',
+        '\u22e2': '\u22e3', '\u22e4': '\u22e5', '\u22e6': '\u22e7',
+        '\u22e8': '\u22e9', '\u22ea': '\u22eb', '\u22ec': '\u22ed',
+        '\u22f0': '\u22f1', '\u22f2': '\u22fa', '\u22f3': '\u22fb',
+        '\u22f4': '\u22fc', '\u22f6': '\u22fd', '\u22f7': '\u22fe',
+        '\u2308': '\u2309', '\u230a': '\u230b', '\u2329': '\u232a',
+        '\u23b4': '\u23b5', '\u2768': '\u2769', '\u276a': '\u276b',
+        '\u276c': '\u276d', '\u276e': '\u276f', '\u2770': '\u2771',
+        '\u2772': '\u2773', '\u2774': '\u2775', '\u27c3': '\u27c4',
+        '\u27c5': '\u27c6', '\u27d5': '\u27d6', '\u27dd': '\u27de',
+        '\u27e2': '\u27e3', '\u27e4': '\u27e5', '\u27e6': '\u27e7',
+        '\u27e8': '\u27e9', '\u27ea': '\u27eb', '\u2983': '\u2984',
+        '\u2985': '\u2986', '\u2987': '\u2988', '\u2989': '\u298a',
+        '\u298b': '\u298c', '\u298d': '\u298e', '\u298f': '\u2990',
+        '\u2991': '\u2992', '\u2993': '\u2994', '\u2995': '\u2996',
+        '\u2997': '\u2998', '\u29c0': '\u29c1', '\u29c4': '\u29c5',
+        '\u29cf': '\u29d0', '\u29d1': '\u29d2', '\u29d4': '\u29d5',
+        '\u29d8': '\u29d9', '\u29da': '\u29db', '\u29f8': '\u29f9',
+        '\u29fc': '\u29fd', '\u2a2b': '\u2a2c', '\u2a2d': '\u2a2e',
+        '\u2a34': '\u2a35', '\u2a3c': '\u2a3d', '\u2a64': '\u2a65',
+        '\u2a79': '\u2a7a', '\u2a7d': '\u2a7e', '\u2a7f': '\u2a80',
+        '\u2a81': '\u2a82', '\u2a83': '\u2a84', '\u2a8b': '\u2a8c',
+        '\u2a91': '\u2a92', '\u2a93': '\u2a94', '\u2a95': '\u2a96',
+        '\u2a97': '\u2a98', '\u2a99': '\u2a9a', '\u2a9b': '\u2a9c',
+        '\u2aa1': '\u2aa2', '\u2aa6': '\u2aa7', '\u2aa8': '\u2aa9',
+        '\u2aaa': '\u2aab', '\u2aac': '\u2aad', '\u2aaf': '\u2ab0',
+        '\u2ab3': '\u2ab4', '\u2abb': '\u2abc', '\u2abd': '\u2abe',
+        '\u2abf': '\u2ac0', '\u2ac1': '\u2ac2', '\u2ac3': '\u2ac4',
+        '\u2ac5': '\u2ac6', '\u2acd': '\u2ace', '\u2acf': '\u2ad0',
+        '\u2ad1': '\u2ad2', '\u2ad3': '\u2ad4', '\u2ad5': '\u2ad6',
+        '\u2aec': '\u2aed', '\u2af7': '\u2af8', '\u2af9': '\u2afa',
+        '\u2e02': '\u2e03', '\u2e04': '\u2e05', '\u2e09': '\u2e0a',
+        '\u2e0c': '\u2e0d', '\u2e1c': '\u2e1d', '\u2e20': '\u2e21',
+        '\u3008': '\u3009', '\u300a': '\u300b', '\u300c': '\u300d',
+        '\u300e': '\u300f', '\u3010': '\u3011', '\u3014': '\u3015',
+        '\u3016': '\u3017', '\u3018': '\u3019', '\u301a': '\u301b',
+        '\u301d': '\u301e', '\ufd3e': '\ufd3f', '\ufe17': '\ufe18',
+        '\ufe35': '\ufe36', '\ufe37': '\ufe38', '\ufe39': '\ufe3a',
+        '\ufe3b': '\ufe3c', '\ufe3d': '\ufe3e', '\ufe3f': '\ufe40',
+        '\ufe41': '\ufe42', '\ufe43': '\ufe44', '\ufe47': '\ufe48',
+        '\ufe59': '\ufe5a', '\ufe5b': '\ufe5c', '\ufe5d': '\ufe5e',
+        '\uff08': '\uff09', '\uff1c': '\uff1e', '\uff3b': '\uff3d',
+        '\uff5b': '\uff5d', '\uff5f': '\uff60', '\uff62': '\uff63',
+    }
+
+    def _build_word_match(words, boundary_regex_fragment=None, prefix='', suffix=''):
+        if boundary_regex_fragment is None:
+            return r'\b(' + prefix + r'|'.join(re.escape(x) for x in words) + \
+                suffix + r')\b'
+        else:
+            return r'(?<!' + boundary_regex_fragment + r')' + prefix + r'(' + \
+                r'|'.join(re.escape(x) for x in words) + r')' + suffix + r'(?!' + \
+                boundary_regex_fragment + r')'
+
+    def brackets_callback(token_class):
+        def callback(lexer, match, context):
+            groups = match.groupdict()
+            opening_chars = groups['delimiter']
+            n_chars = len(opening_chars)
+            adverbs = groups.get('adverbs')
+
+            closer = Perl6Lexer.PERL6_BRACKETS.get(opening_chars[0])
+            text = context.text
+
+            if closer is None:  # it's not a mirrored character, which means we
+                                # just need to look for the next occurrence
+
+                end_pos = text.find(opening_chars, match.start('delimiter') + n_chars)
+            else:   # we need to look for the corresponding closing character,
+                    # keep nesting in mind
+                closing_chars = closer * n_chars
+                nesting_level = 1
+
+                search_pos = match.start('delimiter')
+
+                while nesting_level > 0:
+                    next_open_pos = text.find(opening_chars, search_pos + n_chars)
+                    next_close_pos = text.find(closing_chars, search_pos + n_chars)
+
+                    if next_close_pos == -1:
+                        next_close_pos = len(text)
+                        nesting_level = 0
+                    elif next_open_pos != -1 and next_open_pos < next_close_pos:
+                        nesting_level += 1
+                        search_pos = next_open_pos
+                    else:  # next_close_pos < next_open_pos
+                        nesting_level -= 1
+                        search_pos = next_close_pos
+
+                end_pos = next_close_pos
+
+            if end_pos < 0:     # if we didn't find a closer, just highlight the
+                                # rest of the text in this class
+                end_pos = len(text)
+
+            if adverbs is not None and re.search(r':to\b', adverbs):
+                heredoc_terminator = text[match.start('delimiter') + n_chars:end_pos]
+                end_heredoc = re.search(r'^\s*' + re.escape(heredoc_terminator) +
+                                        r'\s*$', text[end_pos:], re.MULTILINE)
+
+                if end_heredoc:
+                    end_pos += end_heredoc.end()
+                else:
+                    end_pos = len(text)
+
+            yield match.start(), token_class, text[match.start():end_pos + n_chars]
+            context.pos = end_pos + n_chars
+
+        return callback
+
+    def opening_brace_callback(lexer, match, context):
+        stack = context.stack
+
+        yield match.start(), Text, context.text[match.start():match.end()]
+        context.pos = match.end()
+
+        # if we encounter an opening brace and we're one level
+        # below a token state, it means we need to increment
+        # the nesting level for braces so we know later when
+        # we should return to the token rules.
+        if len(stack) > 2 and stack[-2] == 'token':
+            context.perl6_token_nesting_level += 1
+
+    def closing_brace_callback(lexer, match, context):
+        stack = context.stack
+
+        yield match.start(), Text, context.text[match.start():match.end()]
+        context.pos = match.end()
+
+        # if we encounter a free closing brace and we're one level
+        # below a token state, it means we need to check the nesting
+        # level to see if we need to return to the token state.
+        if len(stack) > 2 and stack[-2] == 'token':
+            context.perl6_token_nesting_level -= 1
+            if context.perl6_token_nesting_level == 0:
+                stack.pop()
+
+    def embedded_perl6_callback(lexer, match, context):
+        context.perl6_token_nesting_level = 1
+        yield match.start(), Text, context.text[match.start():match.end()]
+        context.pos = match.end()
+        context.stack.append('root')
+
+    # If you're modifying these rules, be careful if you need to process '{' or '}'
+    # characters. We have special logic for processing these characters (due to the fact
+    # that you can nest Perl 6 code in regex blocks), so if you need to process one of
+    # them, make sure you also process the corresponding one!
+    tokens = {
+        'common': [
+            (r'#[`|=](?P<delimiter>(?P<first_char>[' + ''.join(PERL6_BRACKETS) + r'])(?P=first_char)*)',
+             brackets_callback(Comment.Multiline)),
+            (r'#[^\n]*$', Comment.Single),
+            (r'^(\s*)=begin\s+(\w+)\b.*?^\1=end\s+\2', Comment.Multiline),
+            (r'^(\s*)=for.*?\n\s*?\n', Comment.Multiline),
+            (r'^=.*?\n\s*?\n', Comment.Multiline),
+            (r'(regex|token|rule)(\s*' + PERL6_IDENTIFIER_RANGE + '+:sym)',
+             bygroups(Keyword, Name), 'token-sym-brackets'),
+            (r'(regex|token|rule)(?!' + PERL6_IDENTIFIER_RANGE + r')(\s*' + PERL6_IDENTIFIER_RANGE + '+)?',
+             bygroups(Keyword, Name), 'pre-token'),
+            # deal with a special case in the Perl 6 grammar (role q { ... })
+            (r'(role)(\s+)(q)(\s*)', bygroups(Keyword, Whitespace, Name, Whitespace)),
+            (_build_word_match(PERL6_KEYWORDS, PERL6_IDENTIFIER_RANGE), Keyword),
+            (_build_word_match(PERL6_BUILTIN_CLASSES, PERL6_IDENTIFIER_RANGE, suffix='(?::[UD])?'),
+             Name.Builtin),
+            (_build_word_match(PERL6_BUILTINS, PERL6_IDENTIFIER_RANGE), Name.Builtin),
+            # copied from PerlLexer
+            (r'[$@%&][.^:?=!~]?' + PERL6_IDENTIFIER_RANGE + '+(?:<<.*?>>|<.*?>|«.*?»)*',
+             Name.Variable),
+            (r'\$[!/](?:<<.*?>>|<.*?>|«.*?»)*', Name.Variable.Global),
+            (r'::\?\w+', Name.Variable.Global),
+            (r'[$@%&]\*' + PERL6_IDENTIFIER_RANGE + '+(?:<<.*?>>|<.*?>|«.*?»)*',
+             Name.Variable.Global),
+            (r'\$(?:<.*?>)+', Name.Variable),
+            (r'(?:q|qq|Q)[a-zA-Z]?\s*(?P<adverbs>:[\w\s:]+)?\s*(?P<delimiter>(?P<first_char>[^0-9a-zA-Z:\s])'
+             r'(?P=first_char)*)', brackets_callback(String)),
+            # copied from PerlLexer
+            (r'0_?[0-7]+(_[0-7]+)*', Number.Oct),
+            (r'0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*', Number.Hex),
+            (r'0b[01]+(_[01]+)*', Number.Bin),
+            (r'(?i)(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?',
+             Number.Float),
+            (r'(?i)\d+(_\d*)*e[+-]?\d+(_\d*)*', Number.Float),
+            (r'\d+(_\d+)*', Number.Integer),
+            (r'(?<=~~)\s*/(?:\\\\|\\/|.)*?/', String.Regex),
+            (r'(?<=[=(,])\s*/(?:\\\\|\\/|.)*?/', String.Regex),
+            (r'm\w+(?=\()', Name),
+            (r'(?:m|ms|rx)\s*(?P<adverbs>:[\w\s:]+)?\s*(?P<delimiter>(?P<first_char>[^\w:\s])'
+             r'(?P=first_char)*)', brackets_callback(String.Regex)),
+            (r'(?:s|ss|tr)\s*(?::[\w\s:]+)?\s*/(?:\\\\|\\/|.)*?/(?:\\\\|\\/|.)*?/',
+             String.Regex),
+            (r'<[^\s=].*?\S>', String),
+            (_build_word_match(PERL6_OPERATORS), Operator),
+            (r'\w' + PERL6_IDENTIFIER_RANGE + '*', Name),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+        ],
+        'root': [
+            include('common'),
+            (r'\{', opening_brace_callback),
+            (r'\}', closing_brace_callback),
+            (r'.+?', Text),
+        ],
+        'pre-token': [
+            include('common'),
+            (r'\{', Text, ('#pop', 'token')),
+            (r'.+?', Text),
+        ],
+        'token-sym-brackets': [
+            (r'(?P<delimiter>(?P<first_char>[' + ''.join(PERL6_BRACKETS) + '])(?P=first_char)*)',
+             brackets_callback(Name), ('#pop', 'pre-token')),
+            default(('#pop', 'pre-token')),
+        ],
+        'token': [
+            (r'\}', Text, '#pop'),
+            (r'(?<=:)(?:my|our|state|constant|temp|let).*?;', using(this)),
+            # make sure that quotes in character classes aren't treated as strings
+            (r'<(?:[-!?+.]\s*)?\[.*?\]>', String.Regex),
+            # make sure that '#' characters in quotes aren't treated as comments
+            (r"(?<!\\)'(\\\\|\\[^\\]|[^'\\])*'", String.Regex),
+            (r'(?<!\\)"(\\\\|\\[^\\]|[^"\\])*"', String.Regex),
+            (r'#.*?$', Comment.Single),
+            (r'\{', embedded_perl6_callback),
+            ('.+?', String.Regex),
+        ],
+    }
+
+    def analyse_text(text):
+        def strip_pod(lines):
+            in_pod = False
+            stripped_lines = []
+
+            for line in lines:
+                if re.match(r'^=(?:end|cut)', line):
+                    in_pod = False
+                elif re.match(r'^=\w+', line):
+                    in_pod = True
+                elif not in_pod:
+                    stripped_lines.append(line)
+
+            return stripped_lines
+
+        # XXX handle block comments
+        lines = text.splitlines()
+        lines = strip_pod(lines)
+        text = '\n'.join(lines)
+
+        if shebang_matches(text, r'perl6|rakudo|niecza|pugs'):
+            return True
+
+        saw_perl_decl = False
+        rating = False
+
+        # check for my/our/has declarations
+        if re.search(r"(?:my|our|has)\s+(?:" + Perl6Lexer.PERL6_IDENTIFIER_RANGE +
+                     r"+\s+)?[$@%&(]", text):
+            rating = 0.8
+            saw_perl_decl = True
+
+        for line in lines:
+            line = re.sub('#.*', '', line)
+            if re.match(r'^\s*$', line):
+                continue
+
+            # match v6; use v6; use v6.0; use v6.0.0;
+            if re.match(r'^\s*(?:use\s+)?v6(?:\.\d(?:\.\d)?)?;', line):
+                return True
+            # match class, module, role, enum, grammar declarations
+            class_decl = re.match(r'^\s*(?:(?P<scope>my|our)\s+)?(?:module|class|role|enum|grammar)', line)
+            if class_decl:
+                if saw_perl_decl or class_decl.group('scope') is not None:
+                    return True
+                rating = 0.05
+                continue
+            break
+
+        if ':=' in text:
+            # Same logic as above for PerlLexer
+            rating /= 2
+
+        return rating
+
+    def __init__(self, **options):
+        super().__init__(**options)
+        self.encoding = options.get('encoding', 'utf-8')
diff --git a/.venv/Lib/site-packages/pygments/lexers/phix.py b/.venv/Lib/site-packages/pygments/lexers/phix.py
new file mode 100644 (file)
index 0000000..f0b0377
--- /dev/null
@@ -0,0 +1,363 @@
+"""
+    pygments.lexers.phix
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Phix.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Whitespace
+
+__all__ = ['PhixLexer']
+
+
+class PhixLexer(RegexLexer):
+    """
+    Pygments Lexer for Phix files (.exw).
+    See http://phix.x10.mx
+    """
+
+    name = 'Phix'
+    url = 'http://phix.x10.mx'
+    aliases = ['phix']
+    filenames = ['*.exw']
+    mimetypes = ['text/x-phix']
+    version_added = '2.14'
+
+    flags = re.MULTILINE    # nb: **NOT** re.DOTALL! (totally spanners comment handling)
+
+    preproc = (
+        'ifdef', 'elsifdef', 'elsedef'
+    )
+    # Note these lists are auto-generated by pwa/p2js.exw, when pwa\src\p2js_keywords.e (etc)
+    #     change, though of course subsequent copy/commit/pull requests are all manual steps.
+    types = (
+        'string', 'nullable_string', 'atom_string', 'atom', 'bool', 'boolean',
+        'cdCanvan', 'cdCanvas', 'complex', 'CURLcode', 'dictionary', 'int',
+        'integer', 'Ihandle', 'Ihandles', 'Ihandln', 'mpfr', 'mpq', 'mpz',
+        'mpz_or_string', 'number', 'rid_string', 'seq', 'sequence', 'timedate',
+        'object'
+    )
+    keywords = (
+        'abstract', 'class', 'continue', 'export', 'extends', 'nullable',
+        'private', 'public', 'static', 'struct', 'trace',
+        'and', 'break', 'by', 'case', 'catch', 'const', 'constant', 'debug',
+        'default', 'do', 'else', 'elsif', 'end', 'enum', 'exit', 'fallthru',
+        'fallthrough', 'for', 'forward', 'function', 'global', 'if', 'in',
+        'include', 'js', 'javascript', 'javascript_semantics', 'let', 'not',
+        'or', 'procedure', 'profile', 'profile_time', 'return', 'safe_mode',
+        'switch', 'then', 'to', 'try', 'type', 'type_check', 'until', 'warning',
+        'while', 'with', 'without', 'xor'
+    )
+    routines = (
+        'abort', 'abs', 'adjust_timedate', 'and_bits', 'and_bitsu', 'apply',
+        'append', 'arccos', 'arcsin', 'arctan', 'assert', 'atan2',
+        'atom_to_float32', 'atom_to_float64', 'bankers_rounding', 'beep',
+        'begins', 'binary_search', 'bits_to_int', 'bk_color', 'bytes_to_int',
+        'call_func', 'call_proc', 'cdCanvasActivate', 'cdCanvasArc',
+        'cdCanvasBegin', 'cdCanvasBox', 'cdCanvasChord', 'cdCanvasCircle',
+        'cdCanvasClear', 'cdCanvasEnd', 'cdCanvasFlush', 'cdCanvasFont',
+        'cdCanvasGetImageRGB', 'cdCanvasGetSize', 'cdCanvasGetTextAlignment',
+        'cdCanvasGetTextSize', 'cdCanvasLine', 'cdCanvasMark',
+        'cdCanvasMarkSize', 'cdCanvasMultiLineVectorText', 'cdCanvasPixel',
+        'cdCanvasRect', 'cdCanvasRoundedBox', 'cdCanvasRoundedRect',
+        'cdCanvasSector', 'cdCanvasSetAttribute', 'cdCanvasSetBackground',
+        'cdCanvasSetFillMode', 'cdCanvasSetForeground',
+        'cdCanvasSetInteriorStyle', 'cdCanvasSetLineStyle',
+        'cdCanvasSetLineWidth', 'cdCanvasSetTextAlignment', 'cdCanvasText',
+        'cdCanvasSetTextOrientation', 'cdCanvasGetTextOrientation',
+        'cdCanvasVectorText', 'cdCanvasVectorTextDirection',
+        'cdCanvasVectorTextSize', 'cdCanvasVertex', 'cdCreateCanvas',
+        'cdDecodeAlpha', 'cdDecodeColor', 'cdDecodeColorAlpha', 'cdEncodeAlpha',
+        'cdEncodeColor', 'cdEncodeColorAlpha', 'cdKillCanvas', 'cdVersion',
+        'cdVersionDate', 'ceil', 'change_timezone', 'choose', 'clear_screen',
+        'columnize', 'command_line', 'compare', 'complex_abs', 'complex_add',
+        'complex_arg', 'complex_conjugate', 'complex_cos', 'complex_cosh',
+        'complex_div', 'complex_exp', 'complex_imag', 'complex_inv',
+        'complex_log', 'complex_mul', 'complex_neg', 'complex_new',
+        'complex_norm', 'complex_power', 'complex_rho', 'complex_real',
+        'complex_round', 'complex_sin', 'complex_sinh', 'complex_sprint',
+        'complex_sqrt', 'complex_sub', 'complex_theta', 'concat', 'cos',
+        'crash', 'custom_sort', 'date', 'day_of_week', 'day_of_year',
+        'days_in_month', 'decode_base64', 'decode_flags', 'deep_copy', 'deld',
+        'deserialize', 'destroy_dict', 'destroy_queue', 'destroy_stack',
+        'dict_name', 'dict_size', 'elapsed', 'elapsed_short', 'encode_base64',
+        'equal', 'even', 'exp', 'extract', 'factorial', 'factors',
+        'file_size_k', 'find', 'find_all', 'find_any', 'find_replace', 'filter',
+        'flatten', 'float32_to_atom', 'float64_to_atom', 'floor',
+        'format_timedate', 'free_console', 'from_polar', 'gcd', 'get_file_base',
+        'get_file_extension', 'get_file_name', 'get_file_name_and_path',
+        'get_file_path', 'get_file_path_and_name', 'get_maxprime', 'get_prime',
+        'get_primes', 'get_primes_le', 'get_proper_dir', 'get_proper_path',
+        'get_rand', 'get_routine_info', 'get_test_abort', 'get_test_logfile',
+        'get_test_pause', 'get_test_verbosity', 'get_tzid', 'getd', 'getdd',
+        'getd_all_keys', 'getd_by_index', 'getd_index', 'getd_partial_key',
+        'glAttachShader', 'glBindBuffer', 'glBindTexture', 'glBufferData',
+        'glCanvasSpecialText', 'glClear', 'glClearColor', 'glColor',
+        'glCompileShader', 'glCreateBuffer', 'glCreateProgram',
+        'glCreateShader', 'glCreateTexture', 'glDeleteProgram',
+        'glDeleteShader', 'glDrawArrays', 'glEnable',
+        'glEnableVertexAttribArray', 'glFloat32Array', 'glInt32Array',
+        'glFlush', 'glGetAttribLocation', 'glGetError', 'glGetProgramInfoLog',
+        'glGetProgramParameter', 'glGetShaderInfoLog', 'glGetShaderParameter',
+        'glGetUniformLocation', 'glLinkProgram', 'glLoadIdentity',
+        'glMatrixMode', 'glOrtho', 'glRotatef', 'glShadeModel',
+        'glShaderSource', 'glSimpleA7texcoords', 'glTexImage2Dc',
+        'glTexParameteri', 'glTranslate', 'glUniform1f', 'glUniform1i',
+        'glUniformMatrix4fv', 'glUseProgram', 'glVertex',
+        'glVertexAttribPointer', 'glViewport', 'head', 'hsv_to_rgb', 'iff',
+        'iif', 'include_file', 'incl0de_file', 'insert', 'instance',
+        'int_to_bits', 'int_to_bytes', 'is_dict', 'is_integer', 's_leap_year',
+        'is_prime', 'is_prime2', 'islower', 'isupper', 'Icallback',
+        'iup_isdouble', 'iup_isprint', 'iup_XkeyBase', 'IupAppend', 'IupAlarm',
+        'IupBackgroundBox', 'IupButton', 'IupCalendar', 'IupCanvas',
+        'IupClipboard', 'IupClose', 'IupCloseOnEscape', 'IupControlsOpen',
+        'IupDatePick', 'IupDestroy', 'IupDialog', 'IupDrawArc', 'IupDrawBegin',
+        'IupDrawEnd', 'IupDrawGetSize', 'IupDrawGetTextSize', 'IupDrawLine',
+        'IupDrawRectangle', 'IupDrawText', 'IupExpander', 'IupFill',
+        'IupFlatLabel', 'IupFlatList', 'IupFlatTree', 'IupFlush', 'IupFrame',
+        'IupGetAttribute', 'IupGetAttributeId', 'IupGetAttributePtr',
+        'IupGetBrother', 'IupGetChild', 'IupGetChildCount', 'IupGetClassName',
+        'IupGetDialog', 'IupGetDialogChild', 'IupGetDouble', 'IupGetFocus',
+        'IupGetGlobal', 'IupGetGlobalInt', 'IupGetGlobalIntInt', 'IupGetInt',
+        'IupGetInt2', 'IupGetIntId', 'IupGetIntInt', 'IupGetParent',
+        'IupGLCanvas', 'IupGLCanvasOpen', 'IupGLMakeCurrent', 'IupGraph',
+        'IupHbox', 'IupHide', 'IupImage', 'IupImageRGBA', 'IupItem',
+        'iupKeyCodeToName', 'IupLabel', 'IupLink', 'IupList', 'IupMap',
+        'IupMenu', 'IupMenuItem', 'IupMessage', 'IupMessageDlg', 'IupMultiBox',
+        'IupMultiLine', 'IupNextField', 'IupNormaliser', 'IupOpen',
+        'IupPlayInput', 'IupPopup', 'IupPreviousField', 'IupProgressBar',
+        'IupRadio', 'IupRecordInput', 'IupRedraw', 'IupRefresh',
+        'IupRefreshChildren', 'IupSeparator', 'IupSetAttribute',
+        'IupSetAttributes', 'IupSetAttributeHandle', 'IupSetAttributeId',
+        'IupSetAttributePtr', 'IupSetCallback', 'IupSetCallbacks',
+        'IupSetDouble', 'IupSetFocus', 'IupSetGlobal', 'IupSetGlobalInt',
+        'IupSetGlobalFunction', 'IupSetHandle', 'IupSetInt',
+        'IupSetStrAttribute', 'IupSetStrGlobal', 'IupShow', 'IupShowXY',
+        'IupSplit', 'IupStoreAttribute', 'IupSubmenu', 'IupTable',
+        'IupTableClearSelected', 'IupTableClick_cb', 'IupTableGetSelected',
+        'IupTableResize_cb', 'IupTableSetData', 'IupTabs', 'IupText',
+        'IupTimer', 'IupToggle', 'IupTreeAddNodes', 'IupTreeView', 'IupUpdate',
+        'IupValuator', 'IupVbox', 'join', 'join_by', 'join_path', 'k_perm',
+        'largest', 'lcm', 'length', 'log', 'log10', 'log2', 'lower',
+        'm4_crossProduct', 'm4_inverse', 'm4_lookAt', 'm4_multiply',
+        'm4_normalize', 'm4_perspective', 'm4_subtractVectors', 'm4_xRotate',
+        'm4_yRotate', 'machine_bits', 'machine_word', 'match', 'match_all',
+        'match_replace', 'max', 'maxsq', 'min', 'minsq', 'mod', 'mpfr_add',
+        'mpfr_ceil', 'mpfr_cmp', 'mpfr_cmp_si', 'mpfr_const_pi', 'mpfr_div',
+        'mpfr_div_si', 'mpfr_div_z', 'mpfr_floor', 'mpfr_free', 'mpfr_get_d',
+        'mpfr_get_default_precision', 'mpfr_get_default_rounding_mode',
+        'mpfr_get_fixed', 'mpfr_get_precision', 'mpfr_get_si', 'mpfr_init',
+        'mpfr_inits', 'mpfr_init_set', 'mpfr_init_set_q', 'mpfr_init_set_z',
+        'mpfr_mul', 'mpfr_mul_si', 'mpfr_pow_si', 'mpfr_set', 'mpfr_set_d',
+        'mpfr_set_default_precision', 'mpfr_set_default_rounding_mode',
+        'mpfr_set_precision', 'mpfr_set_q', 'mpfr_set_si', 'mpfr_set_str',
+        'mpfr_set_z', 'mpfr_si_div', 'mpfr_si_sub', 'mpfr_sqrt', 'mpfr_sub',
+        'mpfr_sub_si', 'mpq_abs', 'mpq_add', 'mpq_add_si', 'mpq_canonicalize',
+        'mpq_cmp', 'mpq_cmp_si', 'mpq_div', 'mpq_div_2exp', 'mpq_free',
+        'mpq_get_den', 'mpq_get_num', 'mpq_get_str', 'mpq_init', 'mpq_init_set',
+        'mpq_init_set_si', 'mpq_init_set_str', 'mpq_init_set_z', 'mpq_inits',
+        'mpq_inv', 'mpq_mul', 'mpq_neg', 'mpq_set', 'mpq_set_si', 'mpq_set_str',
+        'mpq_set_z', 'mpq_sub', 'mpz_abs', 'mpz_add', 'mpz_addmul',
+        'mpz_addmul_ui', 'mpz_addmul_si', 'mpz_add_si', 'mpz_add_ui', 'mpz_and',
+        'mpz_bin_uiui', 'mpz_cdiv_q', 'mpz_cmp', 'mpz_cmp_si', 'mpz_divexact',
+        'mpz_divexact_ui', 'mpz_divisible_p', 'mpz_divisible_ui_p', 'mpz_even',
+        'mpz_fac_ui', 'mpz_factorstring', 'mpz_fdiv_q', 'mpz_fdiv_q_2exp',
+        'mpz_fdiv_q_ui', 'mpz_fdiv_qr', 'mpz_fdiv_r', 'mpz_fdiv_ui',
+        'mpz_fib_ui', 'mpz_fib2_ui', 'mpz_fits_atom', 'mpz_fits_integer',
+        'mpz_free', 'mpz_gcd', 'mpz_gcd_ui', 'mpz_get_atom', 'mpz_get_integer',
+        'mpz_get_short_str', 'mpz_get_str', 'mpz_init', 'mpz_init_set',
+        'mpz_inits', 'mpz_invert', 'mpz_lcm', 'mpz_lcm_ui', 'mpz_max',
+        'mpz_min', 'mpz_mod', 'mpz_mod_ui', 'mpz_mul', 'mpz_mul_2exp',
+        'mpz_mul_d', 'mpz_mul_si', 'mpz_neg', 'mpz_nthroot', 'mpz_odd',
+        'mpz_pollard_rho', 'mpz_pow_ui', 'mpz_powm', 'mpz_powm_ui', 'mpz_prime',
+        'mpz_prime_factors', 'mpz_prime_mr', 'mpz_rand', 'mpz_rand_ui',
+        'mpz_re_compose', 'mpz_remove', 'mpz_scan0', 'mpz_scan1', 'mpz_set',
+        'mpz_set_d', 'mpz_set_si', 'mpz_set_str', 'mpz_set_v', 'mpz_sign',
+        'mpz_sizeinbase', 'mpz_sqrt', 'mpz_sub', 'mpz_sub_si', 'mpz_sub_ui',
+        'mpz_si_sub', 'mpz_tdiv_q_2exp', 'mpz_tdiv_r_2exp', 'mpz_tstbit',
+        'mpz_ui_pow_ui', 'mpz_xor', 'named_dict', 'new_dict', 'new_queue',
+        'new_stack', 'not_bits', 'not_bitsu', 'odd', 'or_all', 'or_allu',
+        'or_bits', 'or_bitsu', 'ord', 'ordinal', 'ordinant',
+        'override_timezone', 'pad', 'pad_head', 'pad_tail', 'parse_date_string',
+        'papply', 'peep', 'peepn', 'peep_dict', 'permute', 'permutes',
+        'platform', 'pop', 'popn', 'pop_dict', 'power', 'pp', 'ppEx', 'ppExf',
+        'ppf', 'ppOpt', 'pq_add', 'pq_destroy', 'pq_empty', 'pq_new', 'pq_peek',
+        'pq_pop', 'pq_pop_data', 'pq_size', 'prepend', 'prime_factors',
+        'printf', 'product', 'proper', 'push', 'pushn', 'putd', 'puts',
+        'queue_empty', 'queue_size', 'rand', 'rand_range', 'reinstate',
+        'remainder', 'remove', 'remove_all', 'repeat', 'repeatch', 'replace',
+        'requires', 'reverse', 'rfind', 'rgb', 'rmatch', 'rmdr', 'rnd', 'round',
+        'routine_id', 'scanf', 'serialize', 'series', 'set_rand',
+        'set_test_abort', 'set_test_logfile', 'set_test_module',
+        'set_test_pause', 'set_test_verbosity', 'set_timedate_formats',
+        'set_timezone', 'setd', 'setd_default', 'shorten', 'sha256',
+        'shift_bits', 'shuffle', 'sign', 'sin', 'smallest', 'sort',
+        'sort_columns', 'speak', 'splice', 'split', 'split_any', 'split_by',
+        'sprint', 'sprintf', 'sq_abs', 'sq_add', 'sq_and', 'sq_and_bits',
+        'sq_arccos', 'sq_arcsin', 'sq_arctan', 'sq_atom', 'sq_ceil', 'sq_cmp',
+        'sq_cos', 'sq_div', 'sq_even', 'sq_eq', 'sq_floor', 'sq_floor_div',
+        'sq_ge', 'sq_gt', 'sq_int', 'sq_le', 'sq_log', 'sq_log10', 'sq_log2',
+        'sq_lt', 'sq_max', 'sq_min', 'sq_mod', 'sq_mul', 'sq_ne', 'sq_not',
+        'sq_not_bits', 'sq_odd', 'sq_or', 'sq_or_bits', 'sq_power', 'sq_rand',
+        'sq_remainder', 'sq_rmdr', 'sq_rnd', 'sq_round', 'sq_seq', 'sq_sign',
+        'sq_sin', 'sq_sqrt', 'sq_str', 'sq_sub', 'sq_tan', 'sq_trunc',
+        'sq_uminus', 'sq_xor', 'sq_xor_bits', 'sqrt', 'square_free',
+        'stack_empty', 'stack_size', 'substitute', 'substitute_all', 'sum',
+        'tail', 'tan', 'test_equal', 'test_fail', 'test_false',
+        'test_not_equal', 'test_pass', 'test_summary', 'test_true',
+        'text_color', 'throw', 'time', 'timedate_diff', 'timedelta',
+        'to_integer', 'to_number', 'to_rgb', 'to_string', 'traverse_dict',
+        'traverse_dict_partial_key', 'trim', 'trim_head', 'trim_tail', 'trunc',
+        'tagset', 'tagstart', 'typeof', 'unique', 'unix_dict', 'upper',
+        'utf8_to_utf32', 'utf32_to_utf8', 'version', 'vlookup', 'vslice',
+        'wglGetProcAddress', 'wildcard_file', 'wildcard_match', 'with_rho',
+        'with_theta', 'xml_new_doc', 'xml_new_element', 'xml_set_attribute',
+        'xml_sprint', 'xor_bits', 'xor_bitsu',
+        'accept', 'allocate', 'allocate_string', 'allow_break', 'ARM',
+        'atom_to_float80', 'c_func', 'c_proc', 'call_back', 'chdir',
+        'check_break', 'clearDib', 'close', 'closesocket', 'console',
+        'copy_file', 'create', 'create_directory', 'create_thread',
+        'curl_easy_cleanup', 'curl_easy_get_file', 'curl_easy_init',
+        'curl_easy_perform', 'curl_easy_perform_ex', 'curl_easy_setopt',
+        'curl_easy_strerror', 'curl_global_cleanup', 'curl_global_init',
+        'curl_slist_append', 'curl_slist_free_all', 'current_dir', 'cursor',
+        'define_c_func', 'define_c_proc', 'delete', 'delete_cs', 'delete_file',
+        'dir', 'DLL', 'drawDib', 'drawShadedPolygonToDib', 'ELF32', 'ELF64',
+        'enter_cs', 'eval', 'exit_thread', 'free', 'file_exists', 'final',
+        'float80_to_atom', 'format', 'get_bytes', 'get_file_date',
+        'get_file_size', 'get_file_type', 'get_interpreter', 'get_key',
+        'get_socket_error', 'get_text', 'get_thread_exitcode', 'get_thread_id',
+        'getc', 'getenv', 'gets', 'getsockaddr', 'glBegin', 'glCallList',
+        'glFrustum', 'glGenLists', 'glGetString', 'glLight', 'glMaterial',
+        'glNewList', 'glNormal', 'glPopMatrix', 'glPushMatrix', 'glRotate',
+        'glEnd', 'glEndList', 'glTexImage2D', 'goto', 'GUI', 'icons', 'ilASM',
+        'include_files', 'include_paths', 'init_cs', 'ip_to_string',
+        'IupConfig', 'IupConfigDialogClosed', 'IupConfigDialogShow',
+        'IupConfigGetVariableInt', 'IupConfigLoad', 'IupConfigSave',
+        'IupConfigSetVariableInt', 'IupExitLoop', 'IupFileDlg', 'IupFileList',
+        'IupGLSwapBuffers', 'IupHelp', 'IupLoopStep', 'IupMainLoop',
+        'IupNormalizer', 'IupPlot', 'IupPlotAdd', 'IupPlotBegin', 'IupPlotEnd',
+        'IupPlotInsert', 'IupSaveImage', 'IupTreeGetUserId', 'IupUser',
+        'IupVersion', 'IupVersionDate', 'IupVersionNumber', 'IupVersionShow',
+        'killDib', 'leave_cs', 'listen', 'manifest', 'mem_copy', 'mem_set',
+        'mpfr_gamma', 'mpfr_printf', 'mpfr_sprintf', 'mpz_export', 'mpz_import',
+        'namespace', 'new', 'newDib', 'open', 'open_dll', 'PE32', 'PE64',
+        'peek', 'peek_string', 'peek1s', 'peek1u', 'peek2s', 'peek2u', 'peek4s',
+        'peek4u', 'peek8s', 'peek8u', 'peekNS', 'peekns', 'peeknu', 'poke',
+        'poke2', 'poke4', 'poke8', 'pokeN', 'poke_string', 'poke_wstring',
+        'position', 'progress', 'prompt_number', 'prompt_string', 'read_file',
+        'read_lines', 'recv', 'resume_thread', 'seek', 'select', 'send',
+        'setHandler', 'shutdown', 'sleep', 'SO', 'sockaddr_in', 'socket',
+        'split_path', 'suspend_thread', 'system', 'system_exec', 'system_open',
+        'system_wait', 'task_clock_start', 'task_clock_stop', 'task_create',
+        'task_delay', 'task_list', 'task_schedule', 'task_self', 'task_status',
+        'task_suspend', 'task_yield', 'thread_safe_string', 'try_cs',
+        'utf8_to_utf16', 'utf16_to_utf8', 'utf16_to_utf32', 'utf32_to_utf16',
+        'video_config', 'WSACleanup', 'wait_thread', 'walk_dir', 'where',
+        'write_lines', 'wait_key'
+    )
+    constants = (
+        'ANY_QUEUE', 'ASCENDING', 'BLACK', 'BLOCK_CURSOR', 'BLUE',
+        'BRIGHT_CYAN', 'BRIGHT_BLUE', 'BRIGHT_GREEN', 'BRIGHT_MAGENTA',
+        'BRIGHT_RED', 'BRIGHT_WHITE', 'BROWN', 'C_DWORD', 'C_INT', 'C_POINTER',
+        'C_USHORT', 'C_WORD', 'CD_AMBER', 'CD_BLACK', 'CD_BLUE', 'CD_BOLD',
+        'CD_BOLD_ITALIC', 'CD_BOX', 'CD_CENTER', 'CD_CIRCLE', 'CD_CLOSED_LINES',
+        'CD_CONTINUOUS', 'CD_CUSTOM', 'CD_CYAN', 'CD_DARK_BLUE', 'CD_DARK_CYAN',
+        'CD_DARK_GRAY', 'CD_DARK_GREY', 'CD_DARK_GREEN', 'CD_DARK_MAGENTA',
+        'CD_DARK_RED', 'CD_DARK_YELLOW', 'CD_DASH_DOT', 'CD_DASH_DOT_DOT',
+        'CD_DASHED', 'CD_DBUFFER', 'CD_DEG2RAD', 'CD_DIAMOND', 'CD_DOTTED',
+        'CD_EAST', 'CD_EVENODD', 'CD_FILL', 'CD_GL', 'CD_GRAY', 'CD_GREY',
+        'CD_GREEN', 'CD_HATCH', 'CD_HOLLOW', 'CD_HOLLOW_BOX',
+        'CD_HOLLOW_CIRCLE', 'CD_HOLLOW_DIAMOND', 'CD_INDIGO', 'CD_ITALIC',
+        'CD_IUP', 'CD_IUPDBUFFER', 'CD_LIGHT_BLUE', 'CD_LIGHT_GRAY',
+        'CD_LIGHT_GREY', 'CD_LIGHT_GREEN', 'CD_LIGHT_PARCHMENT', 'CD_MAGENTA',
+        'CD_NAVY', 'CD_NORTH', 'CD_NORTH_EAST', 'CD_NORTH_WEST', 'CD_OLIVE',
+        'CD_OPEN_LINES', 'CD_ORANGE', 'CD_PARCHMENT', 'CD_PATTERN',
+        'CD_PRINTER', 'CD_PURPLE', 'CD_PLAIN', 'CD_PLUS', 'CD_QUERY',
+        'CD_RAD2DEG', 'CD_RED', 'CD_SILVER', 'CD_SOLID', 'CD_SOUTH_EAST',
+        'CD_SOUTH_WEST', 'CD_STAR', 'CD_STIPPLE', 'CD_STRIKEOUT',
+        'CD_UNDERLINE', 'CD_WEST', 'CD_WHITE', 'CD_WINDING', 'CD_VIOLET',
+        'CD_X', 'CD_YELLOW', 'CURLE_OK', 'CURLOPT_MAIL_FROM',
+        'CURLOPT_MAIL_RCPT', 'CURLOPT_PASSWORD', 'CURLOPT_READDATA',
+        'CURLOPT_READFUNCTION', 'CURLOPT_SSL_VERIFYPEER',
+        'CURLOPT_SSL_VERIFYHOST', 'CURLOPT_UPLOAD', 'CURLOPT_URL',
+        'CURLOPT_USE_SSL', 'CURLOPT_USERNAME', 'CURLOPT_VERBOSE',
+        'CURLOPT_WRITEFUNCTION', 'CURLUSESSL_ALL', 'CYAN', 'D_NAME',
+        'D_ATTRIBUTES', 'D_SIZE', 'D_YEAR', 'D_MONTH', 'D_DAY', 'D_HOUR',
+        'D_MINUTE', 'D_SECOND', 'D_CREATION', 'D_LASTACCESS', 'D_MODIFICATION',
+        'DT_YEAR', 'DT_MONTH', 'DT_DAY', 'DT_HOUR', 'DT_MINUTE', 'DT_SECOND',
+        'DT_DOW', 'DT_MSEC', 'DT_DOY', 'DT_GMT', 'EULER', 'E_CODE', 'E_ADDR',
+        'E_LINE', 'E_RTN', 'E_NAME', 'E_FILE', 'E_PATH', 'E_USER', 'false',
+        'False', 'FALSE', 'FIFO_QUEUE', 'FILETYPE_DIRECTORY', 'FILETYPE_FILE',
+        'GET_EOF', 'GET_FAIL', 'GET_IGNORE', 'GET_SUCCESS',
+        'GL_AMBIENT_AND_DIFFUSE', 'GL_ARRAY_BUFFER', 'GL_CLAMP',
+        'GL_CLAMP_TO_BORDER', 'GL_CLAMP_TO_EDGE', 'GL_COLOR_BUFFER_BIT',
+        'GL_COMPILE', 'GL_COMPILE_STATUS', 'GL_CULL_FACE',
+        'GL_DEPTH_BUFFER_BIT', 'GL_DEPTH_TEST', 'GL_EXTENSIONS', 'GL_FLAT',
+        'GL_FLOAT', 'GL_FRAGMENT_SHADER', 'GL_FRONT', 'GL_LIGHT0',
+        'GL_LIGHTING', 'GL_LINEAR', 'GL_LINK_STATUS', 'GL_MODELVIEW',
+        'GL_NEAREST', 'GL_NO_ERROR', 'GL_NORMALIZE', 'GL_POSITION',
+        'GL_PROJECTION', 'GL_QUAD_STRIP', 'GL_QUADS', 'GL_RENDERER',
+        'GL_REPEAT', 'GL_RGB', 'GL_RGBA', 'GL_SMOOTH', 'GL_STATIC_DRAW',
+        'GL_TEXTURE_2D', 'GL_TEXTURE_MAG_FILTER', 'GL_TEXTURE_MIN_FILTER',
+        'GL_TEXTURE_WRAP_S', 'GL_TEXTURE_WRAP_T', 'GL_TRIANGLES',
+        'GL_UNSIGNED_BYTE', 'GL_VENDOR', 'GL_VERSION', 'GL_VERTEX_SHADER',
+        'GRAY', 'GREEN', 'GT_LF_STRIPPED', 'GT_WHOLE_FILE', 'INVLN10',
+        'IUP_CLOSE', 'IUP_CONTINUE', 'IUP_DEFAULT', 'IUP_BLACK', 'IUP_BLUE',
+        'IUP_BUTTON1', 'IUP_BUTTON3', 'IUP_CENTER', 'IUP_CYAN', 'IUP_DARK_BLUE',
+        'IUP_DARK_CYAN', 'IUP_DARK_GRAY', 'IUP_DARK_GREY', 'IUP_DARK_GREEN',
+        'IUP_DARK_MAGENTA', 'IUP_DARK_RED', 'IUP_GRAY', 'IUP_GREY', 'IUP_GREEN',
+        'IUP_IGNORE', 'IUP_INDIGO', 'IUP_MAGENTA', 'IUP_MASK_INT',
+        'IUP_MASK_UINT', 'IUP_MOUSEPOS', 'IUP_NAVY', 'IUP_OLIVE', 'IUP_RECTEXT',
+        'IUP_RED', 'IUP_LIGHT_BLUE', 'IUP_LIGHT_GRAY', 'IUP_LIGHT_GREY',
+        'IUP_LIGHT_GREEN', 'IUP_ORANGE', 'IUP_PARCHMENT', 'IUP_PURPLE',
+        'IUP_SILVER', 'IUP_TEAL', 'IUP_VIOLET', 'IUP_WHITE', 'IUP_YELLOW',
+        'K_BS', 'K_cA', 'K_cC', 'K_cD', 'K_cF5', 'K_cK', 'K_cM', 'K_cN', 'K_cO',
+        'K_cP', 'K_cR', 'K_cS', 'K_cT', 'K_cW', 'K_CR', 'K_DEL', 'K_DOWN',
+        'K_END', 'K_ESC', 'K_F1', 'K_F2', 'K_F3', 'K_F4', 'K_F5', 'K_F6',
+        'K_F7', 'K_F8', 'K_F9', 'K_F10', 'K_F11', 'K_F12', 'K_HOME', 'K_INS',
+        'K_LEFT', 'K_MIDDLE', 'K_PGDN', 'K_PGUP', 'K_RIGHT', 'K_SP', 'K_TAB',
+        'K_UP', 'K_h', 'K_i', 'K_j', 'K_p', 'K_r', 'K_s', 'JS', 'LIFO_QUEUE',
+        'LINUX', 'MAX_HEAP', 'MAGENTA', 'MIN_HEAP', 'Nan', 'NO_CURSOR', 'null',
+        'NULL', 'PI', 'pp_Ascii', 'pp_Brkt', 'pp_Date', 'pp_File', 'pp_FltFmt',
+        'pp_Indent', 'pp_IntCh', 'pp_IntFmt', 'pp_Maxlen', 'pp_Nest',
+        'pp_Pause', 'pp_Q22', 'pp_StrFmt', 'RED', 'SEEK_OK', 'SLASH',
+        'TEST_ABORT', 'TEST_CRASH', 'TEST_PAUSE', 'TEST_PAUSE_FAIL',
+        'TEST_QUIET', 'TEST_SHOW_ALL', 'TEST_SHOW_FAILED', 'TEST_SUMMARY',
+        'true', 'True', 'TRUE', 'VC_SCRNLINES', 'WHITE', 'WINDOWS', 'YELLOW'
+    )
+
+    tokens = {
+        'root': [
+            (r"\s+", Whitespace),
+            (r'/\*|--/\*|#\[', Comment.Multiline, 'comment'),
+            (r'(?://|--|#!).*$', Comment.Single),
+#Alt:
+#           (r'//.*$|--.*$|#!.*$', Comment.Single),
+            (r'"([^"\\]|\\.)*"', String.Other),
+            (r'\'[^\']*\'', String.Other),
+            (r'`[^`]*`', String.Other),
+
+            (words(types, prefix=r'\b', suffix=r'\b'), Name.Function),
+            (words(routines, prefix=r'\b', suffix=r'\b'), Name.Function),
+            (words(preproc, prefix=r'\b', suffix=r'\b'), Keyword.Declaration),
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword.Declaration),
+            (words(constants, prefix=r'\b', suffix=r'\b'), Name.Constant),
+            # Aside: Phix only supports/uses the ascii/non-unicode tilde
+            (r'!=|==|<<|>>|:=|[-~+/*%=<>&^|\.(){},?:\[\]$\\;#]', Operator),
+            (r'[\w-]+', Text)
+        ],
+        'comment': [
+            (r'[^*/#]+', Comment.Multiline),
+            (r'/\*|#\[', Comment.Multiline, '#push'),
+            (r'\*/|#\]', Comment.Multiline, '#pop'),
+            (r'[*/#]', Comment.Multiline)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/php.py b/.venv/Lib/site-packages/pygments/lexers/php.py
new file mode 100644 (file)
index 0000000..82d4aeb
--- /dev/null
@@ -0,0 +1,334 @@
+"""
+    pygments.lexers.php
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for PHP and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, bygroups, default, \
+    using, this, words, do_insertions, line_re
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Other, Generic
+from pygments.util import get_bool_opt, get_list_opt, shebang_matches
+
+__all__ = ['ZephirLexer', 'PsyshConsoleLexer', 'PhpLexer']
+
+
+class ZephirLexer(RegexLexer):
+    """
+    For Zephir language source code.
+
+    Zephir is a compiled high level language aimed
+    to the creation of C-extensions for PHP.
+    """
+
+    name = 'Zephir'
+    url = 'http://zephir-lang.com/'
+    aliases = ['zephir']
+    filenames = ['*.zep']
+    version_added = '2.0'
+
+    zephir_keywords = ['fetch', 'echo', 'isset', 'empty']
+    zephir_type = ['bit', 'bits', 'string']
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'/', Operator, '#pop'),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|->|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(for|in|while|do|break|return|continue|switch|case|default|if|else|loop|'
+             r'require|inline|throw|try|catch|finally|new|delete|typeof|instanceof|void|'
+             r'namespace|use|extends|this|fetch|isset|unset|echo|fetch|likely|unlikely|'
+             r'empty)\b', Keyword, 'slashstartsregex'),
+            (r'(var|let|with|function)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(abstract|boolean|bool|char|class|const|double|enum|export|extends|final|'
+             r'native|goto|implements|import|int|string|interface|long|ulong|char|uchar|'
+             r'float|unsigned|private|protected|public|short|static|self|throws|reverse|'
+             r'transient|volatile|readonly)\b', Keyword.Reserved),
+            (r'(true|false|null|undefined)\b', Keyword.Constant),
+            (r'(Array|Boolean|Date|_REQUEST|_COOKIE|_SESSION|'
+             r'_GET|_POST|_SERVER|this|stdClass|range|count|iterator|'
+             r'window)\b', Name.Builtin),
+            (r'[$a-zA-Z_][\w\\]*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ]
+    }
+
+
+class PsyshConsoleLexer(Lexer):
+    """
+    For PsySH console output, such as:
+
+    .. sourcecode:: psysh
+
+        >>> $greeting = function($name): string {
+        ...     return "Hello, {$name}";
+        ... };
+        => Closure($name): string {#2371 …3}
+        >>> $greeting('World')
+        => "Hello, World"
+    """
+    name = 'PsySH console session for PHP'
+    url = 'https://psysh.org/'
+    aliases = ['psysh']
+    version_added = '2.7'
+
+    def __init__(self, **options):
+        options['startinline'] = True
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        phplexer = PhpLexer(**self.options)
+        curcode = ''
+        insertions = []
+        for match in line_re.finditer(text):
+            line = match.group()
+            if line.startswith('>>> ') or line.startswith('... '):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:4])]))
+                curcode += line[4:]
+            elif line.rstrip() == '...':
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, '...')]))
+                curcode += line[3:]
+            else:
+                if curcode:
+                    yield from do_insertions(
+                        insertions, phplexer.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+                yield match.start(), Generic.Output, line
+        if curcode:
+            yield from do_insertions(insertions,
+                                     phplexer.get_tokens_unprocessed(curcode))
+
+
+class PhpLexer(RegexLexer):
+    """
+    For PHP source code.
+    For PHP embedded in HTML, use the `HtmlPhpLexer`.
+
+    Additional options accepted:
+
+    `startinline`
+        If given and ``True`` the lexer starts highlighting with
+        php code (i.e.: no starting ``<?php`` required).  The default
+        is ``False``.
+    `funcnamehighlighting`
+        If given and ``True``, highlight builtin function names
+        (default: ``True``).
+    `disabledmodules`
+        If given, must be a list of module names whose function names
+        should not be highlighted. By default all modules are highlighted
+        except the special ``'unknown'`` module that includes functions
+        that are known to php but are undocumented.
+
+        To get a list of allowed modules have a look into the
+        `_php_builtins` module:
+
+        .. sourcecode:: pycon
+
+            >>> from pygments.lexers._php_builtins import MODULES
+            >>> MODULES.keys()
+            ['PHP Options/Info', 'Zip', 'dba', ...]
+
+        In fact the names of those modules match the module names from
+        the php documentation.
+    """
+
+    name = 'PHP'
+    url = 'https://www.php.net/'
+    aliases = ['php', 'php3', 'php4', 'php5']
+    filenames = ['*.php', '*.php[345]', '*.inc']
+    mimetypes = ['text/x-php']
+    version_added = ''
+
+    # Note that a backslash is included, PHP uses a backslash as a namespace
+    # separator.
+    _ident_inner = r'(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*'
+    # But not inside strings.
+    _ident_nons = r'(?:[_a-z]|[^\x00-\x7f])(?:\w|[^\x00-\x7f])*'
+
+    flags = re.IGNORECASE | re.DOTALL | re.MULTILINE
+    tokens = {
+        'root': [
+            (r'<\?(php)?', Comment.Preproc, 'php'),
+            (r'[^<]+', Other),
+            (r'<', Other)
+        ],
+        'php': [
+            (r'\?>', Comment.Preproc, '#pop'),
+            (r'(<<<)([\'"]?)(' + _ident_nons + r')(\2\n.*?\n\s*)(\3)(;?)(\n)',
+             bygroups(String, String, String.Delimiter, String, String.Delimiter,
+                      Punctuation, Text)),
+            (r'\s+', Text),
+            (r'#\[', Punctuation, 'attribute'),
+            (r'#.*?\n', Comment.Single),
+            (r'//.*?\n', Comment.Single),
+            # put the empty comment here, it is otherwise seen as
+            # the start of a docstring
+            (r'/\*\*/', Comment.Multiline),
+            (r'/\*\*.*?\*/', String.Doc),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'(->|::)(\s*)(' + _ident_nons + ')',
+             bygroups(Operator, Text, Name.Attribute)),
+            (r'[~!%^&*+=|:.<>/@-]+', Operator),
+            (r'\?', Operator),  # don't add to the charclass above!
+            (r'[\[\]{}();,]+', Punctuation),
+            (r'(new)(\s+)(class)\b', bygroups(Keyword, Text, Keyword)),
+            (r'(class)(\s+)', bygroups(Keyword, Text), 'classname'),
+            (r'(function)(\s*)(?=\()', bygroups(Keyword, Text)),
+            (r'(function)(\s+)(&?)(\s*)',
+             bygroups(Keyword, Text, Operator, Text), 'functionname'),
+            (r'(const)(\s+)(' + _ident_inner + ')',
+             bygroups(Keyword, Text, Name.Constant)),
+            (r'(and|E_PARSE|old_function|E_ERROR|or|as|E_WARNING|parent|'
+             r'eval|PHP_OS|break|exit|case|extends|PHP_VERSION|cfunction|'
+             r'FALSE|print|for|require|continue|foreach|require_once|'
+             r'declare|return|default|static|do|switch|die|stdClass|'
+             r'echo|else|TRUE|elseif|var|empty|if|xor|enddeclare|include|'
+             r'virtual|endfor|include_once|while|endforeach|global|'
+             r'endif|list|endswitch|new|endwhile|not|'
+             r'array|E_ALL|NULL|final|php_user_filter|interface|'
+             r'implements|public|private|protected|abstract|clone|try|'
+             r'catch|throw|this|use|namespace|trait|yield|'
+             r'finally|match)\b', Keyword),
+            (r'(true|false|null)\b', Keyword.Constant),
+            include('magicconstants'),
+            (r'\$\{', Name.Variable, 'variablevariable'),
+            (r'\$+' + _ident_inner, Name.Variable),
+            (_ident_inner, Name.Other),
+            (r'(\d+\.\d*|\d*\.\d+)(e[+-]?[0-9]+)?', Number.Float),
+            (r'\d+e[+-]?[0-9]+', Number.Float),
+            (r'0[0-7]+', Number.Oct),
+            (r'0x[a-f0-9]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'0b[01]+', Number.Bin),
+            (r"'([^'\\]*(?:\\.[^'\\]*)*)'", String.Single),
+            (r'`([^`\\]*(?:\\.[^`\\]*)*)`', String.Backtick),
+            (r'"', String.Double, 'string'),
+        ],
+        'variablevariable': [
+            (r'\}', Name.Variable, '#pop'),
+            include('php')
+        ],
+        'magicfuncs': [
+            # source: http://php.net/manual/en/language.oop5.magic.php
+            (words((
+                '__construct', '__destruct', '__call', '__callStatic', '__get', '__set',
+                '__isset', '__unset', '__sleep', '__wakeup', '__toString', '__invoke',
+                '__set_state', '__clone', '__debugInfo',), suffix=r'\b'),
+             Name.Function.Magic),
+        ],
+        'magicconstants': [
+            # source: http://php.net/manual/en/language.constants.predefined.php
+            (words((
+                '__LINE__', '__FILE__', '__DIR__', '__FUNCTION__', '__CLASS__',
+                '__TRAIT__', '__METHOD__', '__NAMESPACE__',),
+                suffix=r'\b'),
+             Name.Constant),
+        ],
+        'classname': [
+            (_ident_inner, Name.Class, '#pop')
+        ],
+        'functionname': [
+            include('magicfuncs'),
+            (_ident_inner, Name.Function, '#pop'),
+            default('#pop')
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'[^{$"\\]+', String.Double),
+            (r'\\([nrt"$\\]|[0-7]{1,3}|x[0-9a-f]{1,2})', String.Escape),
+            (r'\$' + _ident_nons + r'(\[\S+?\]|->' + _ident_nons + ')?',
+             String.Interpol),
+            (r'(\{\$\{)(.*?)(\}\})',
+             bygroups(String.Interpol, using(this, _startinline=True),
+                      String.Interpol)),
+            (r'(\{)(\$.*?)(\})',
+             bygroups(String.Interpol, using(this, _startinline=True),
+                      String.Interpol)),
+            (r'(\$\{)(\S+)(\})',
+             bygroups(String.Interpol, Name.Variable, String.Interpol)),
+            (r'[${\\]', String.Double)
+        ],
+        'attribute': [
+            (r'\]', Punctuation, '#pop'),
+            (r'\(', Punctuation, 'attributeparams'),
+            (_ident_inner, Name.Decorator),
+            include('php')
+        ],
+        'attributeparams': [
+            (r'\)', Punctuation, '#pop'),
+            include('php')
+        ],
+    }
+
+    def __init__(self, **options):
+        self.funcnamehighlighting = get_bool_opt(
+            options, 'funcnamehighlighting', True)
+        self.disabledmodules = get_list_opt(
+            options, 'disabledmodules', ['unknown'])
+        self.startinline = get_bool_opt(options, 'startinline', False)
+
+        # private option argument for the lexer itself
+        if '_startinline' in options:
+            self.startinline = options.pop('_startinline')
+
+        # collect activated functions in a set
+        self._functions = set()
+        if self.funcnamehighlighting:
+            from pygments.lexers._php_builtins import MODULES
+            for key, value in MODULES.items():
+                if key not in self.disabledmodules:
+                    self._functions.update(value)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        if self.startinline:
+            stack.append('php')
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name.Other:
+                if value in self._functions:
+                    yield index, Name.Builtin, value
+                    continue
+            yield index, token, value
+
+    def analyse_text(text):
+        if shebang_matches(text, r'php'):
+            return True
+        rv = 0.0
+        if re.search(r'<\?(?!xml)', text):
+            rv += 0.3
+        return rv
diff --git a/.venv/Lib/site-packages/pygments/lexers/pointless.py b/.venv/Lib/site-packages/pygments/lexers/pointless.py
new file mode 100644 (file)
index 0000000..adedb75
--- /dev/null
@@ -0,0 +1,70 @@
+"""
+    pygments.lexers.pointless
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Pointless.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Error, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text
+
+__all__ = ['PointlessLexer']
+
+
+class PointlessLexer(RegexLexer):
+    """
+    For Pointless source code.
+    """
+
+    name = 'Pointless'
+    url = 'https://ptls.dev'
+    aliases = ['pointless']
+    filenames = ['*.ptls']
+    version_added = '2.7'
+
+    ops = words([
+        "+", "-", "*", "/", "**", "%", "+=", "-=", "*=",
+        "/=", "**=", "%=", "|>", "=", "==", "!=", "<", ">",
+        "<=", ">=", "=>", "$", "++",
+    ])
+
+    keywords = words([
+        "if", "then", "else", "where", "with", "cond",
+        "case", "and", "or", "not", "in", "as", "for",
+        "requires", "throw", "try", "catch", "when",
+        "yield", "upval",
+    ], suffix=r'\b')
+
+    tokens = {
+        'root': [
+            (r'[ \n\r]+', Text),
+            (r'--.*$', Comment.Single),
+            (r'"""', String, 'multiString'),
+            (r'"', String, 'string'),
+            (r'[\[\](){}:;,.]', Punctuation),
+            (ops, Operator),
+            (keywords, Keyword),
+            (r'\d+|\d*\.\d+', Number),
+            (r'(true|false)\b', Name.Builtin),
+            (r'[A-Z][a-zA-Z0-9]*\b', String.Symbol),
+            (r'output\b', Name.Variable.Magic),
+            (r'(export|import)\b', Keyword.Namespace),
+            (r'[a-z][a-zA-Z0-9]*\b', Name.Variable)
+        ],
+        'multiString': [
+            (r'\\.', String.Escape),
+            (r'"""', String, '#pop'),
+            (r'"', String),
+            (r'[^\\"]+', String),
+        ],
+        'string': [
+            (r'\\.', String.Escape),
+            (r'"', String, '#pop'),
+            (r'\n', Error),
+            (r'[^\\"]+', String),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/pony.py b/.venv/Lib/site-packages/pygments/lexers/pony.py
new file mode 100644 (file)
index 0000000..055423a
--- /dev/null
@@ -0,0 +1,93 @@
+"""
+    pygments.lexers.pony
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Pony and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['PonyLexer']
+
+
+class PonyLexer(RegexLexer):
+    """
+    For Pony source code.
+    """
+
+    name = 'Pony'
+    aliases = ['pony']
+    filenames = ['*.pony']
+    url = 'https://www.ponylang.io'
+    version_added = '2.4'
+
+    _caps = r'(iso|trn|ref|val|box|tag)'
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'//.*\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'nested_comment'),
+            (r'"""(?:.|\n)*?"""', String.Doc),
+            (r'"', String, 'string'),
+            (r'\'.*\'', String.Char),
+            (r'=>|[]{}:().~;,|&!^?[]', Punctuation),
+            (words((
+                'addressof', 'and', 'as', 'consume', 'digestof', 'is', 'isnt',
+                'not', 'or'),
+                suffix=r'\b'),
+             Operator.Word),
+            (r'!=|==|<<|>>|[-+/*%=<>]', Operator),
+            (words((
+                'box', 'break', 'compile_error', 'compile_intrinsic',
+                'continue', 'do', 'else', 'elseif', 'embed', 'end', 'error',
+                'for', 'if', 'ifdef', 'in', 'iso', 'lambda', 'let', 'match',
+                'object', 'recover', 'ref', 'repeat', 'return', 'tag', 'then',
+                'this', 'trn', 'try', 'until', 'use', 'var', 'val', 'where',
+                'while', 'with', '#any', '#read', '#send', '#share'),
+                suffix=r'\b'),
+             Keyword),
+            (r'(actor|class|struct|primitive|interface|trait|type)((?:\s)+)',
+             bygroups(Keyword, Text), 'typename'),
+            (r'(new|fun|be)((?:\s)+)', bygroups(Keyword, Text), 'methodname'),
+            (words((
+                'I8', 'U8', 'I16', 'U16', 'I32', 'U32', 'I64', 'U64', 'I128',
+                'U128', 'ILong', 'ULong', 'ISize', 'USize', 'F32', 'F64',
+                'Bool', 'Pointer', 'None', 'Any', 'Array', 'String',
+                'Iterator'),
+                suffix=r'\b'),
+             Name.Builtin.Type),
+            (r'_?[A-Z]\w*', Name.Type),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'(true|false)\b', Name.Builtin),
+            (r'_\d*', Name),
+            (r'_?[a-z][\w\']*', Name)
+        ],
+        'typename': [
+            (_caps + r'?((?:\s)*)(_?[A-Z]\w*)',
+             bygroups(Keyword, Text, Name.Class), '#pop')
+        ],
+        'methodname': [
+            (_caps + r'?((?:\s)*)(_?[a-z]\w*)',
+             bygroups(Keyword, Text, Name.Function), '#pop')
+        ],
+        'nested_comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\"', String),
+            (r'[^\\"]+', String)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/praat.py b/.venv/Lib/site-packages/pygments/lexers/praat.py
new file mode 100644 (file)
index 0000000..054f5b6
--- /dev/null
@@ -0,0 +1,303 @@
+"""
+    pygments.lexers.praat
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Praat
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, bygroups, include
+from pygments.token import Name, Text, Comment, Keyword, String, Punctuation, \
+    Number, Operator, Whitespace
+
+__all__ = ['PraatLexer']
+
+
+class PraatLexer(RegexLexer):
+    """
+    For Praat scripts.
+    """
+
+    name = 'Praat'
+    url = 'http://www.praat.org'
+    aliases = ['praat']
+    filenames = ['*.praat', '*.proc', '*.psc']
+    version_added = '2.1'
+
+    keywords = (
+        'if', 'then', 'else', 'elsif', 'elif', 'endif', 'fi', 'for', 'from', 'to',
+        'endfor', 'endproc', 'while', 'endwhile', 'repeat', 'until', 'select', 'plus',
+        'minus', 'demo', 'assert', 'stopwatch', 'nocheck', 'nowarn', 'noprogress',
+        'editor', 'endeditor', 'clearinfo',
+    )
+
+    functions_string = (
+        'backslashTrigraphsToUnicode', 'chooseDirectory', 'chooseReadFile',
+        'chooseWriteFile', 'date', 'demoKey', 'do', 'environment', 'extractLine',
+        'extractWord', 'fixed', 'info', 'left', 'mid', 'percent', 'readFile', 'replace',
+        'replace_regex', 'right', 'selected', 'string', 'unicodeToBackslashTrigraphs',
+    )
+
+    functions_numeric = (
+        'abs', 'appendFile', 'appendFileLine', 'appendInfo', 'appendInfoLine', 'arccos',
+        'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctan2', 'arctanh', 'barkToHertz',
+        'beginPause', 'beginSendPraat', 'besselI', 'besselK', 'beta', 'beta2',
+        'binomialP', 'binomialQ', 'boolean', 'ceiling', 'chiSquareP', 'chiSquareQ',
+        'choice', 'comment', 'cos', 'cosh', 'createDirectory', 'deleteFile',
+        'demoClicked', 'demoClickedIn', 'demoCommandKeyPressed',
+        'demoExtraControlKeyPressed', 'demoInput', 'demoKeyPressed',
+        'demoOptionKeyPressed', 'demoShiftKeyPressed', 'demoShow', 'demoWaitForInput',
+        'demoWindowTitle', 'demoX', 'demoY', 'differenceLimensToPhon', 'do', 'editor',
+        'endPause', 'endSendPraat', 'endsWith', 'erb', 'erbToHertz', 'erf', 'erfc',
+        'exitScript', 'exp', 'extractNumber', 'fileReadable', 'fisherP', 'fisherQ',
+        'floor', 'gaussP', 'gaussQ', 'hertzToBark', 'hertzToErb', 'hertzToMel',
+        'hertzToSemitones', 'imax', 'imin', 'incompleteBeta', 'incompleteGammaP', 'index',
+        'index_regex', 'integer', 'invBinomialP', 'invBinomialQ', 'invChiSquareQ', 'invFisherQ',
+        'invGaussQ', 'invSigmoid', 'invStudentQ', 'length', 'ln', 'lnBeta', 'lnGamma',
+        'log10', 'log2', 'max', 'melToHertz', 'min', 'minusObject', 'natural', 'number',
+        'numberOfColumns', 'numberOfRows', 'numberOfSelected', 'objectsAreIdentical',
+        'option', 'optionMenu', 'pauseScript', 'phonToDifferenceLimens', 'plusObject',
+        'positive', 'randomBinomial', 'randomGauss', 'randomInteger', 'randomPoisson',
+        'randomUniform', 'real', 'readFile', 'removeObject', 'rindex', 'rindex_regex',
+        'round', 'runScript', 'runSystem', 'runSystem_nocheck', 'selectObject',
+        'selected', 'semitonesToHertz', 'sentence', 'sentencetext', 'sigmoid', 'sin', 'sinc',
+        'sincpi', 'sinh', 'soundPressureToPhon', 'sqrt', 'startsWith', 'studentP',
+        'studentQ', 'tan', 'tanh', 'text', 'variableExists', 'word', 'writeFile', 'writeFileLine',
+        'writeInfo', 'writeInfoLine',
+    )
+
+    functions_array = (
+        'linear', 'randomGauss', 'randomInteger', 'randomUniform', 'zero',
+    )
+
+    objects = (
+        'Activation', 'AffineTransform', 'AmplitudeTier', 'Art', 'Artword',
+        'Autosegment', 'BarkFilter', 'BarkSpectrogram', 'CCA', 'Categories',
+        'Cepstrogram', 'Cepstrum', 'Cepstrumc', 'ChebyshevSeries', 'ClassificationTable',
+        'Cochleagram', 'Collection', 'ComplexSpectrogram', 'Configuration', 'Confusion',
+        'ContingencyTable', 'Corpus', 'Correlation', 'Covariance',
+        'CrossCorrelationTable', 'CrossCorrelationTables', 'DTW', 'DataModeler',
+        'Diagonalizer', 'Discriminant', 'Dissimilarity', 'Distance', 'Distributions',
+        'DurationTier', 'EEG', 'ERP', 'ERPTier', 'EditCostsTable', 'EditDistanceTable',
+        'Eigen', 'Excitation', 'Excitations', 'ExperimentMFC', 'FFNet', 'FeatureWeights',
+        'FileInMemory', 'FilesInMemory', 'Formant', 'FormantFilter', 'FormantGrid',
+        'FormantModeler', 'FormantPoint', 'FormantTier', 'GaussianMixture', 'HMM',
+        'HMM_Observation', 'HMM_ObservationSequence', 'HMM_State', 'HMM_StateSequence',
+        'Harmonicity', 'ISpline', 'Index', 'Intensity', 'IntensityTier', 'IntervalTier',
+        'KNN', 'KlattGrid', 'KlattTable', 'LFCC', 'LPC', 'Label', 'LegendreSeries',
+        'LinearRegression', 'LogisticRegression', 'LongSound', 'Ltas', 'MFCC', 'MSpline',
+        'ManPages', 'Manipulation', 'Matrix', 'MelFilter', 'MelSpectrogram',
+        'MixingMatrix', 'Movie', 'Network', 'Object', 'OTGrammar', 'OTHistory', 'OTMulti',
+        'PCA', 'PairDistribution', 'ParamCurve', 'Pattern', 'Permutation', 'Photo',
+        'Pitch', 'PitchModeler', 'PitchTier', 'PointProcess', 'Polygon', 'Polynomial',
+        'PowerCepstrogram', 'PowerCepstrum', 'Procrustes', 'RealPoint', 'RealTier',
+        'ResultsMFC', 'Roots', 'SPINET', 'SSCP', 'SVD', 'Salience', 'ScalarProduct',
+        'Similarity', 'SimpleString', 'SortedSetOfString', 'Sound', 'Speaker',
+        'Spectrogram', 'Spectrum', 'SpectrumTier', 'SpeechSynthesizer', 'SpellingChecker',
+        'Strings', 'StringsIndex', 'Table', 'TableOfReal', 'TextGrid', 'TextInterval',
+        'TextPoint', 'TextTier', 'Tier', 'Transition', 'VocalTract', 'VocalTractTier',
+        'Weight', 'WordList',
+    )
+
+    variables_numeric = (
+        'macintosh', 'windows', 'unix', 'praatVersion', 'pi', 'e', 'undefined',
+    )
+
+    variables_string = (
+        'praatVersion', 'tab', 'shellDirectory', 'homeDirectory',
+        'preferencesDirectory', 'newline', 'temporaryDirectory',
+        'defaultDirectory',
+    )
+
+    object_attributes = (
+        'ncol', 'nrow', 'xmin', 'ymin', 'xmax', 'ymax', 'nx', 'ny', 'dx', 'dy',
+    )
+
+    tokens = {
+        'root': [
+            (r'(\s+)(#.*?$)',  bygroups(Whitespace, Comment.Single)),
+            (r'^#.*?$',        Comment.Single),
+            (r';[^\n]*',       Comment.Single),
+            (r'\s+',           Whitespace),
+
+            (r'\bprocedure\b', Keyword,       'procedure_definition'),
+            (r'\bcall\b',      Keyword,       'procedure_call'),
+            (r'@',             Name.Function, 'procedure_call'),
+
+            include('function_call'),
+
+            (words(keywords, suffix=r'\b'), Keyword),
+
+            (r'(\bform\b)(\s+)([^\n]+)',
+             bygroups(Keyword, Whitespace, String), 'old_form'),
+
+            (r'(print(?:line|tab)?|echo|exit|asserterror|pause|send(?:praat|socket)|'
+             r'include|execute|system(?:_nocheck)?)(\s+)',
+             bygroups(Keyword, Whitespace), 'string_unquoted'),
+
+            (r'(goto|label)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Label)),
+
+            include('variable_name'),
+            include('number'),
+
+            (r'"', String, 'string'),
+
+            (words((objects), suffix=r'(?=\s+\S+\n)'), Name.Class, 'string_unquoted'),
+
+            (r'\b[A-Z]', Keyword, 'command'),
+            (r'(\.{3}|[)(,])', Punctuation),
+        ],
+        'command': [
+            (r'( ?[\w()-]+ ?)', Keyword),
+
+            include('string_interpolated'),
+
+            (r'\.{3}', Keyword, ('#pop', 'old_arguments')),
+            (r':', Keyword, ('#pop', 'comma_list')),
+            (r'\s', Whitespace, '#pop'),
+        ],
+        'procedure_call': [
+            (r'\s+', Whitespace),
+            (r'([\w.]+)(?:(:)|(?:(\s*)(\()))',
+             bygroups(Name.Function, Punctuation,
+                      Text.Whitespace, Punctuation), '#pop'),
+            (r'([\w.]+)', Name.Function, ('#pop', 'old_arguments')),
+        ],
+        'procedure_definition': [
+            (r'\s', Whitespace),
+            (r'([\w.]+)(\s*?[(:])',
+             bygroups(Name.Function, Whitespace), '#pop'),
+            (r'([\w.]+)([^\n]*)',
+             bygroups(Name.Function, Text), '#pop'),
+        ],
+        'function_call': [
+            (words(functions_string, suffix=r'\$(?=\s*[:(])'), Name.Function, 'function'),
+            (words(functions_array, suffix=r'#(?=\s*[:(])'),   Name.Function, 'function'),
+            (words(functions_numeric, suffix=r'(?=\s*[:(])'),  Name.Function, 'function'),
+        ],
+        'function': [
+            (r'\s+',   Whitespace),
+            (r':',     Punctuation, ('#pop', 'comma_list')),
+            (r'\s*\(', Punctuation, ('#pop', 'comma_list')),
+        ],
+        'comma_list': [
+            (r'(\s*\n\s*)(\.{3})', bygroups(Whitespace, Punctuation)),
+
+            (r'(\s*)(?:([)\]])|(\n))', bygroups(
+                Whitespace, Punctuation, Whitespace), '#pop'),
+
+            (r'\s+', Whitespace),
+            (r'"',   String, 'string'),
+            (r'\b(if|then|else|fi|endif)\b', Keyword),
+
+            include('function_call'),
+            include('variable_name'),
+            include('operator'),
+            include('number'),
+
+            (r'[()]', Text),
+            (r',', Punctuation),
+        ],
+        'old_arguments': [
+            (r'\n', Whitespace, '#pop'),
+
+            include('variable_name'),
+            include('operator'),
+            include('number'),
+
+            (r'"', String, 'string'),
+            (r'[^\n]', Text),
+        ],
+        'number': [
+            (r'\n', Whitespace, '#pop'),
+            (r'\b\d+(\.\d*)?([eE][-+]?\d+)?%?', Number),
+        ],
+        'object_reference': [
+            include('string_interpolated'),
+            (r'([a-z][a-zA-Z0-9_]*|\d+)', Name.Builtin),
+
+            (words(object_attributes, prefix=r'\.'), Name.Builtin, '#pop'),
+
+            (r'\$', Name.Builtin),
+            (r'\[', Text, '#pop'),
+        ],
+        'variable_name': [
+            include('operator'),
+            include('number'),
+
+            (words(variables_string,  suffix=r'\$'), Name.Variable.Global),
+            (words(variables_numeric,
+             suffix=r'(?=[^a-zA-Z0-9_."\'$#\[:(]|\s|^|$)'),
+             Name.Variable.Global),
+
+            (words(objects, prefix=r'\b', suffix=r"(_)"),
+             bygroups(Name.Builtin, Name.Builtin),
+             'object_reference'),
+
+            (r'\.?_?[a-z][\w.]*(\$|#)?', Text),
+            (r'[\[\]]', Punctuation, 'comma_list'),
+
+            include('string_interpolated'),
+        ],
+        'operator': [
+            (r'([+\/*<>=!-]=?|[&*|][&*|]?|\^|<>)',       Operator),
+            (r'(?<![\w.])(and|or|not|div|mod)(?![\w.])', Operator.Word),
+        ],
+        'string_interpolated': [
+            (r'\'[_a-z][^\[\]\'":]*(\[([\d,]+|"[\w,]+")\])?(:[0-9]+)?\'',
+             String.Interpol),
+        ],
+        'string_unquoted': [
+            (r'(\n\s*)(\.{3})', bygroups(Whitespace, Punctuation)),
+
+            (r'\n',       Whitespace,            '#pop'),
+            (r'\s',       Whitespace),
+
+            include('string_interpolated'),
+
+            (r"'",        String),
+            (r"[^'\n]+",  String),
+        ],
+        'string': [
+            (r'(\n\s*)(\.{3})', bygroups(Whitespace, Punctuation)),
+
+            (r'"',          String,          '#pop'),
+
+            include('string_interpolated'),
+
+            (r"'",          String),
+            (r'[^\'"\n]+',  String),
+        ],
+        'old_form': [
+            (r'(\s+)(#.*?$)',  bygroups(Whitespace, Comment.Single)),
+            (r'\s+', Whitespace),
+
+            (r'(optionmenu|choice)([ \t]+)(\S+)(:)([ \t]+)',
+             bygroups(Keyword, Whitespace, Text, Punctuation, Whitespace), 'number'),
+
+            (r'(option|button)([ \t]+)',
+             bygroups(Keyword, Whitespace), 'string_unquoted'),
+
+            (r'(sentence|text)([ \t]+)(\S+)',
+             bygroups(Keyword, Whitespace, String), 'string_unquoted'),
+
+            (r'(word)([ \t]+)(\S+)([ \t]*)(\S+)?(?:([ \t]+)(.*))?',
+             bygroups(Keyword, Whitespace, Text, Whitespace, Text, Whitespace, Text)),
+
+            (r'(boolean)(\s+\S+\s*)(0|1|"?(?:yes|no)"?)',
+             bygroups(Keyword, Whitespace, Name.Variable)),
+
+            # Ideally processing of the number would happen in the 'number'
+            # but that doesn't seem to work
+            (r'(real|natural|positive|integer)([ \t]+\S+[ \t]*)([+-]?)(\d+(?:\.\d*)?'
+             r'(?:[eE][-+]?\d+)?%?)',
+             bygroups(Keyword, Whitespace, Operator, Number)),
+
+            (r'(comment)(\s+)',
+             bygroups(Keyword, Whitespace), 'string_unquoted'),
+
+            (r'\bendform\b', Keyword, '#pop'),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/procfile.py b/.venv/Lib/site-packages/pygments/lexers/procfile.py
new file mode 100644 (file)
index 0000000..3261980
--- /dev/null
@@ -0,0 +1,41 @@
+"""
+    pygments.lexers.procfile
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Procfile file format.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Name, Number, String, Text, Punctuation
+
+__all__ = ["ProcfileLexer"]
+
+
+class ProcfileLexer(RegexLexer):
+    """
+    Lexer for Procfile file format.
+
+    The format is used to run processes on Heroku or is used by Foreman or
+    Honcho tools.
+    """
+    name = 'Procfile'
+    url = 'https://devcenter.heroku.com/articles/procfile#procfile-format'
+    aliases = ['procfile']
+    filenames = ['Procfile']
+    version_added = '2.10'
+
+    tokens = {
+        'root': [
+            (r'^([a-z]+)(:)', bygroups(Name.Label, Punctuation)),
+            (r'\s+', Text.Whitespace),
+            (r'"[^"]*"', String),
+            (r"'[^']*'", String),
+            (r'[0-9]+', Number.Integer),
+            (r'\$[a-zA-Z_][\w]*', Name.Variable),
+            (r'(\w+)(=)(\w+)', bygroups(Name.Variable, Punctuation, String)),
+            (r'([\w\-\./]+)', Text),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/prolog.py b/.venv/Lib/site-packages/pygments/lexers/prolog.py
new file mode 100644 (file)
index 0000000..7bf951c
--- /dev/null
@@ -0,0 +1,318 @@
+"""
+    pygments.lexers.prolog
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Prolog and Prolog-like languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['PrologLexer', 'LogtalkLexer']
+
+
+class PrologLexer(RegexLexer):
+    """
+    Lexer for Prolog files.
+    """
+    name = 'Prolog'
+    aliases = ['prolog']
+    filenames = ['*.ecl', '*.prolog', '*.pro', '*.pl']
+    mimetypes = ['text/x-prolog']
+    url = 'https://en.wikipedia.org/wiki/Prolog'
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'/\*', Comment.Multiline, 'nested-comment'),
+            (r'%.*', Comment.Single),
+            # character literal
+            (r'0\'.', String.Char),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            # literal with prepended base
+            (r'\d\d?\'[a-zA-Z0-9]+', Number.Integer),
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'[\[\](){}|.,;!]', Punctuation),
+            (r':-|-->', Punctuation),
+            (r'"(?:\\x[0-9a-fA-F]+\\|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|'
+             r'\\[0-7]+\\|\\["\\abcefnrstv]|[^\\"])*"', String.Double),
+            (r"'(?:''|[^'])*'", String.Atom),  # quoted atom
+            # Needs to not be followed by an atom.
+            # (r'=(?=\s|[a-zA-Z\[])', Operator),
+            (r'is\b', Operator),
+            (r'(<|>|=<|>=|==|=:=|=|/|//|\*|\+|-)(?=\s|[a-zA-Z0-9\[])',
+             Operator),
+            (r'(mod|div|not)\b', Operator),
+            (r'_', Keyword),  # The don't-care variable
+            (r'([a-z]+)(:)', bygroups(Name.Namespace, Punctuation)),
+            (r'([a-z\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]'
+             r'[\w$\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]*)'
+             r'(\s*)(:-|-->)',
+             bygroups(Name.Function, Text, Operator)),  # function defn
+            (r'([a-z\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]'
+             r'[\w$\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]*)'
+             r'(\s*)(\()',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'[a-z\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]'
+             r'[\w$\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]*',
+             String.Atom),  # atom, characters
+            # This one includes !
+            (r'[#&*+\-./:<=>?@\\^~\u00a1-\u00bf\u2010-\u303f]+',
+             String.Atom),  # atom, graphics
+            (r'[A-Z_]\w*', Name.Variable),
+            (r'\s+|[\u2000-\u200f\ufff0-\ufffe\uffef]', Text),
+        ],
+        'nested-comment': [
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'[^*/]+', Comment.Multiline),
+            (r'[*/]', Comment.Multiline),
+        ],
+    }
+
+    def analyse_text(text):
+        """Competes with IDL and Visual Prolog on *.pro"""
+        if ':-' in text:
+            # Visual Prolog also uses :-
+            return 0.5
+        else:
+            return 0
+
+
+class LogtalkLexer(RegexLexer):
+    """
+    For Logtalk source code.
+    """
+
+    name = 'Logtalk'
+    url = 'http://logtalk.org/'
+    aliases = ['logtalk']
+    filenames = ['*.lgt', '*.logtalk']
+    mimetypes = ['text/x-logtalk']
+    version_added = '0.10'
+
+    tokens = {
+        'root': [
+            # Directives
+            (r'^\s*:-\s', Punctuation, 'directive'),
+            # Comments
+            (r'%.*?\n', Comment),
+            (r'/\*(.|\n)*?\*/', Comment),
+            # Whitespace
+            (r'\n', Text),
+            (r'\s+', Text),
+            # Numbers
+            (r"0'[\\]?.", Number),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+\.?\d*((e|E)(\+|-)?\d+)?', Number),
+            # Variables
+            (r'([A-Z_][a-zA-Z0-9_]*)', Name.Variable),
+            # Event handlers
+            (r'(after|before)(?=[(])', Keyword),
+            # Message forwarding handler
+            (r'forward(?=[(])', Keyword),
+            # Execution-context methods
+            (r'(context|parameter|this|se(lf|nder))(?=[(])', Keyword),
+            # Reflection
+            (r'(current_predicate|predicate_property)(?=[(])', Keyword),
+            # DCGs and term expansion
+            (r'(expand_(goal|term)|(goal|term)_expansion|phrase)(?=[(])', Keyword),
+            # Entity
+            (r'(abolish|c(reate|urrent))_(object|protocol|category)(?=[(])', Keyword),
+            (r'(object|protocol|category)_property(?=[(])', Keyword),
+            # Entity relations
+            (r'co(mplements_object|nforms_to_protocol)(?=[(])', Keyword),
+            (r'extends_(object|protocol|category)(?=[(])', Keyword),
+            (r'imp(lements_protocol|orts_category)(?=[(])', Keyword),
+            (r'(instantiat|specializ)es_class(?=[(])', Keyword),
+            # Events
+            (r'(current_event|(abolish|define)_events)(?=[(])', Keyword),
+            # Flags
+            (r'(create|current|set)_logtalk_flag(?=[(])', Keyword),
+            # Compiling, loading, and library paths
+            (r'logtalk_(compile|l(ibrary_path|oad|oad_context)|make(_target_action)?)(?=[(])', Keyword),
+            (r'\blogtalk_make\b', Keyword),
+            # Database
+            (r'(clause|retract(all)?)(?=[(])', Keyword),
+            (r'a(bolish|ssert(a|z))(?=[(])', Keyword),
+            # Control constructs
+            (r'(ca(ll|tch)|throw)(?=[(])', Keyword),
+            (r'(fa(il|lse)|true|(instantiation|system)_error)\b', Keyword),
+            (r'(uninstantiation|type|domain|existence|permission|representation|evaluation|resource|syntax)_error(?=[(])', Keyword),
+            # All solutions
+            (r'((bag|set)of|f(ind|or)all)(?=[(])', Keyword),
+            # Multi-threading predicates
+            (r'threaded(_(ca(ll|ncel)|once|ignore|exit|peek|wait|notify))?(?=[(])', Keyword),
+            # Engine predicates
+            (r'threaded_engine(_(create|destroy|self|next|next_reified|yield|post|fetch))?(?=[(])', Keyword),
+            # Term unification
+            (r'(subsumes_term|unify_with_occurs_check)(?=[(])', Keyword),
+            # Term creation and decomposition
+            (r'(functor|arg|copy_term|numbervars|term_variables)(?=[(])', Keyword),
+            # Evaluable functors
+            (r'(div|rem|m(ax|in|od)|abs|sign)(?=[(])', Keyword),
+            (r'float(_(integer|fractional)_part)?(?=[(])', Keyword),
+            (r'(floor|t(an|runcate)|round|ceiling)(?=[(])', Keyword),
+            # Other arithmetic functors
+            (r'(cos|a(cos|sin|tan|tan2)|exp|log|s(in|qrt)|xor)(?=[(])', Keyword),
+            # Term testing
+            (r'(var|atom(ic)?|integer|float|c(allable|ompound)|n(onvar|umber)|ground|acyclic_term)(?=[(])', Keyword),
+            # Term comparison
+            (r'compare(?=[(])', Keyword),
+            # Stream selection and control
+            (r'(curren|se)t_(in|out)put(?=[(])', Keyword),
+            (r'(open|close)(?=[(])', Keyword),
+            (r'flush_output(?=[(])', Keyword),
+            (r'(at_end_of_stream|flush_output)\b', Keyword),
+            (r'(stream_property|at_end_of_stream|set_stream_position)(?=[(])', Keyword),
+            # Character and byte input/output
+            (r'(nl|(get|peek|put)_(byte|c(har|ode)))(?=[(])', Keyword),
+            (r'\bnl\b', Keyword),
+            # Term input/output
+            (r'read(_term)?(?=[(])', Keyword),
+            (r'write(q|_(canonical|term))?(?=[(])', Keyword),
+            (r'(current_)?op(?=[(])', Keyword),
+            (r'(current_)?char_conversion(?=[(])', Keyword),
+            # Atomic term processing
+            (r'atom_(length|c(hars|o(ncat|des)))(?=[(])', Keyword),
+            (r'(char_code|sub_atom)(?=[(])', Keyword),
+            (r'number_c(har|ode)s(?=[(])', Keyword),
+            # Implementation defined hooks functions
+            (r'(se|curren)t_prolog_flag(?=[(])', Keyword),
+            (r'\bhalt\b', Keyword),
+            (r'halt(?=[(])', Keyword),
+            # Message sending operators
+            (r'(::|:|\^\^)', Operator),
+            # External call
+            (r'[{}]', Keyword),
+            # Logic and control
+            (r'(ignore|once)(?=[(])', Keyword),
+            (r'\brepeat\b', Keyword),
+            # Sorting
+            (r'(key)?sort(?=[(])', Keyword),
+            # Bitwise functors
+            (r'(>>|<<|/\\|\\\\|\\)', Operator),
+            # Predicate aliases
+            (r'\bas\b', Operator),
+            # Arithmetic evaluation
+            (r'\bis\b', Keyword),
+            # Arithmetic comparison
+            (r'(=:=|=\\=|<|=<|>=|>)', Operator),
+            # Term creation and decomposition
+            (r'=\.\.', Operator),
+            # Term unification
+            (r'(=|\\=)', Operator),
+            # Term comparison
+            (r'(==|\\==|@=<|@<|@>=|@>)', Operator),
+            # Evaluable functors
+            (r'(//|[-+*/])', Operator),
+            (r'\b(e|pi|div|mod|rem)\b', Operator),
+            # Other arithmetic functors
+            (r'\b\*\*\b', Operator),
+            # DCG rules
+            (r'-->', Operator),
+            # Control constructs
+            (r'([!;]|->)', Operator),
+            # Logic and control
+            (r'\\+', Operator),
+            # Mode operators
+            (r'[?@]', Operator),
+            # Existential quantifier
+            (r'\^', Operator),
+            # Punctuation
+            (r'[()\[\],.|]', Text),
+            # Atoms
+            (r"[a-z][a-zA-Z0-9_]*", Text),
+            (r"'", String, 'quoted_atom'),
+            # Double-quoted terms
+            (r'"', String, 'double_quoted_term'),
+        ],
+
+        'quoted_atom': [
+            (r"''", String),
+            (r"'", String, '#pop'),
+            (r'\\([\\abfnrtv"\']|(x[a-fA-F0-9]+|[0-7]+)\\)', String.Escape),
+            (r"[^\\'\n]+", String),
+            (r'\\', String),
+        ],
+
+        'double_quoted_term': [
+            (r'""', String),
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|(x[a-fA-F0-9]+|[0-7]+)\\)', String.Escape),
+            (r'[^\\"\n]+', String),
+            (r'\\', String),
+        ],
+
+        'directive': [
+            # Conditional compilation directives
+            (r'(el)?if(?=[(])', Keyword, 'root'),
+            (r'(e(lse|ndif))(?=[.])', Keyword, 'root'),
+            # Entity directives
+            (r'(category|object|protocol)(?=[(])', Keyword, 'entityrelations'),
+            (r'(end_(category|object|protocol))(?=[.])', Keyword, 'root'),
+            # Predicate scope directives
+            (r'(public|protected|private)(?=[(])', Keyword, 'root'),
+            # Other directives
+            (r'e(n(coding|sure_loaded)|xport)(?=[(])', Keyword, 'root'),
+            (r'in(clude|itialization|fo)(?=[(])', Keyword, 'root'),
+            (r'(built_in|dynamic|synchronized|threaded)(?=[.])', Keyword, 'root'),
+            (r'(alias|d(ynamic|iscontiguous)|m(eta_(non_terminal|predicate)|ode|ultifile)|s(et_(logtalk|prolog)_flag|ynchronized))(?=[(])', Keyword, 'root'),
+            (r'op(?=[(])', Keyword, 'root'),
+            (r'(c(alls|oinductive)|module|reexport|use(s|_module))(?=[(])', Keyword, 'root'),
+            (r'[a-z][a-zA-Z0-9_]*(?=[(])', Text, 'root'),
+            (r'[a-z][a-zA-Z0-9_]*(?=[.])', Text, 'root'),
+        ],
+
+        'entityrelations': [
+            (r'(complements|extends|i(nstantiates|mp(lements|orts))|specializes)(?=[(])', Keyword),
+            # Numbers
+            (r"0'[\\]?.", Number),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+\.?\d*((e|E)(\+|-)?\d+)?', Number),
+            # Variables
+            (r'([A-Z_][a-zA-Z0-9_]*)', Name.Variable),
+            # Atoms
+            (r"[a-z][a-zA-Z0-9_]*", Text),
+            (r"'", String, 'quoted_atom'),
+            # Double-quoted terms
+            (r'"', String, 'double_quoted_term'),
+            # End of entity-opening directive
+            (r'([)]\.)', Text, 'root'),
+            # Scope operator
+            (r'(::)', Operator),
+            # Punctuation
+            (r'[()\[\],.|]', Text),
+            # Comments
+            (r'%.*?\n', Comment),
+            (r'/\*(.|\n)*?\*/', Comment),
+            # Whitespace
+            (r'\n', Text),
+            (r'\s+', Text),
+        ]
+    }
+
+    def analyse_text(text):
+        if ':- object(' in text:
+            return 1.0
+        elif ':- protocol(' in text:
+            return 1.0
+        elif ':- category(' in text:
+            return 1.0
+        elif re.search(r'^:-\s[a-z]', text, re.M):
+            return 0.9
+        else:
+            return 0.0
diff --git a/.venv/Lib/site-packages/pygments/lexers/promql.py b/.venv/Lib/site-packages/pygments/lexers/promql.py
new file mode 100644 (file)
index 0000000..cad3c25
--- /dev/null
@@ -0,0 +1,176 @@
+"""
+    pygments.lexers.promql
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Prometheus Query Language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, default, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Whitespace
+
+__all__ = ["PromQLLexer"]
+
+
+class PromQLLexer(RegexLexer):
+    """
+    For PromQL queries.
+
+    For details about the grammar see:
+    https://github.com/prometheus/prometheus/tree/master/promql/parser
+
+    .. versionadded: 2.7
+    """
+
+    name = "PromQL"
+    url = 'https://prometheus.io/docs/prometheus/latest/querying/basics/'
+    aliases = ["promql"]
+    filenames = ["*.promql"]
+    version_added = ''
+
+    base_keywords = (
+        words(
+            (
+                "bool",
+                "by",
+                "group_left",
+                "group_right",
+                "ignoring",
+                "offset",
+                "on",
+                "without",
+            ),
+            suffix=r"\b",
+        ),
+        Keyword,
+    )
+
+    aggregator_keywords = (
+        words(
+            (
+                "sum",
+                "min",
+                "max",
+                "avg",
+                "group",
+                "stddev",
+                "stdvar",
+                "count",
+                "count_values",
+                "bottomk",
+                "topk",
+                "quantile",
+            ),
+            suffix=r"\b",
+        ),
+        Keyword,
+    )
+
+    function_keywords = (
+        words(
+            (
+                "abs",
+                "absent",
+                "absent_over_time",
+                "avg_over_time",
+                "ceil",
+                "changes",
+                "clamp_max",
+                "clamp_min",
+                "count_over_time",
+                "day_of_month",
+                "day_of_week",
+                "days_in_month",
+                "delta",
+                "deriv",
+                "exp",
+                "floor",
+                "histogram_quantile",
+                "holt_winters",
+                "hour",
+                "idelta",
+                "increase",
+                "irate",
+                "label_join",
+                "label_replace",
+                "ln",
+                "log10",
+                "log2",
+                "max_over_time",
+                "min_over_time",
+                "minute",
+                "month",
+                "predict_linear",
+                "quantile_over_time",
+                "rate",
+                "resets",
+                "round",
+                "scalar",
+                "sort",
+                "sort_desc",
+                "sqrt",
+                "stddev_over_time",
+                "stdvar_over_time",
+                "sum_over_time",
+                "time",
+                "timestamp",
+                "vector",
+                "year",
+            ),
+            suffix=r"\b",
+        ),
+        Keyword.Reserved,
+    )
+
+    tokens = {
+        "root": [
+            (r"\n", Whitespace),
+            (r"\s+", Whitespace),
+            (r",", Punctuation),
+            # Keywords
+            base_keywords,
+            aggregator_keywords,
+            function_keywords,
+            # Offsets
+            (r"[1-9][0-9]*[smhdwy]", String),
+            # Numbers
+            (r"-?[0-9]+\.[0-9]+", Number.Float),
+            (r"-?[0-9]+", Number.Integer),
+            # Comments
+            (r"#.*?$", Comment.Single),
+            # Operators
+            (r"(\+|\-|\*|\/|\%|\^)", Operator),
+            (r"==|!=|>=|<=|<|>", Operator),
+            (r"and|or|unless", Operator.Word),
+            # Metrics
+            (r"[_a-zA-Z][a-zA-Z0-9_]+", Name.Variable),
+            # Params
+            (r'(["\'])(.*?)(["\'])', bygroups(Punctuation, String, Punctuation)),
+            # Other states
+            (r"\(", Operator, "function"),
+            (r"\)", Operator),
+            (r"\{", Punctuation, "labels"),
+            (r"\[", Punctuation, "range"),
+        ],
+        "labels": [
+            (r"\}", Punctuation, "#pop"),
+            (r"\n", Whitespace),
+            (r"\s+", Whitespace),
+            (r",", Punctuation),
+            (r'([_a-zA-Z][a-zA-Z0-9_]*?)(\s*?)(=~|!=|=|!~)(\s*?)("|\')(.*?)("|\')',
+             bygroups(Name.Label, Whitespace, Operator, Whitespace,
+                      Punctuation, String, Punctuation)),
+        ],
+        "range": [
+            (r"\]", Punctuation, "#pop"),
+            (r"[1-9][0-9]*[smhdwy]", String),
+        ],
+        "function": [
+            (r"\)", Operator, "#pop"),
+            (r"\(", Operator, "#push"),
+            default("#pop"),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/prql.py b/.venv/Lib/site-packages/pygments/lexers/prql.py
new file mode 100644 (file)
index 0000000..ee95d2d
--- /dev/null
@@ -0,0 +1,251 @@
+"""
+    pygments.lexers.prql
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the PRQL query language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, combined, words, include, bygroups
+from pygments.token import Comment, Literal, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text, Whitespace
+
+__all__ = ['PrqlLexer']
+
+
+class PrqlLexer(RegexLexer):
+    """
+    For PRQL source code.
+
+    grammar: https://github.com/PRQL/prql/tree/main/grammars
+    """
+
+    name = 'PRQL'
+    url = 'https://prql-lang.org/'
+    aliases = ['prql']
+    filenames = ['*.prql']
+    mimetypes = ['application/prql', 'application/x-prql']
+    version_added = '2.17'
+
+    builtinTypes = words((
+        "bool",
+        "int",
+        "int8", "int16", "int32", "int64", "int128",
+        "float",
+        "text",
+        "set"), suffix=r'\b')
+
+    def innerstring_rules(ttype):
+        return [
+            # the new style '{}'.format(...) string formatting
+            (r'\{'
+             r'((\w+)((\.\w+)|(\[[^\]]+\]))*)?'  # field name
+             r'(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?'
+             r'\}', String.Interpol),
+
+            (r'[^\\\'"%{\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            (r'%|(\{{1,2})', ttype)
+        ]
+
+    def fstring_rules(ttype):
+        return [
+            (r'\}', String.Interpol),
+            (r'\{', String.Interpol, 'expr-inside-fstring'),
+            (r'[^\\\'"{}\n]+', ttype),
+            (r'[\'"\\]', ttype),
+        ]
+
+    tokens = {
+        'root': [
+
+            # Comments
+            (r'#!.*', String.Doc),
+            (r'#.*', Comment.Single),
+
+            # Whitespace
+            (r'\s+', Whitespace),
+
+            # Modules
+            (r'^(\s*)(module)(\s*)',
+             bygroups(Whitespace, Keyword.Namespace, Whitespace),
+             'imports'),
+
+            (builtinTypes, Keyword.Type),
+
+            # Main
+            (r'^prql ', Keyword.Reserved),
+
+            ('let', Keyword.Declaration),
+
+            include('keywords'),
+            include('expr'),
+
+            # Transforms
+            (r'^[A-Za-z_][a-zA-Z0-9_]*', Keyword),
+        ],
+        'expr': [
+            # non-raw f-strings
+            ('(f)(""")', bygroups(String.Affix, String.Double),
+             combined('fstringescape', 'tdqf')),
+            ("(f)(''')", bygroups(String.Affix, String.Single),
+             combined('fstringescape', 'tsqf')),
+            ('(f)(")', bygroups(String.Affix, String.Double),
+             combined('fstringescape', 'dqf')),
+            ("(f)(')", bygroups(String.Affix, String.Single),
+             combined('fstringescape', 'sqf')),
+
+            # non-raw s-strings
+            ('(s)(""")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'tdqf')),
+            ("(s)(''')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'tsqf')),
+            ('(s)(")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'dqf')),
+            ("(s)(')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'sqf')),
+
+            # raw strings
+            ('(?i)(r)(""")',
+             bygroups(String.Affix, String.Double), 'tdqs'),
+            ("(?i)(r)(''')",
+             bygroups(String.Affix, String.Single), 'tsqs'),
+            ('(?i)(r)(")',
+             bygroups(String.Affix, String.Double), 'dqs'),
+            ("(?i)(r)(')",
+             bygroups(String.Affix, String.Single), 'sqs'),
+
+            # non-raw strings
+            ('"""', String.Double, combined('stringescape', 'tdqs')),
+            ("'''", String.Single, combined('stringescape', 'tsqs')),
+            ('"', String.Double, combined('stringescape', 'dqs')),
+            ("'", String.Single, combined('stringescape', 'sqs')),
+
+            # Time and dates
+            (r'@\d{4}-\d{2}-\d{2}T\d{2}(:\d{2})?(:\d{2})?(\.\d{1,6})?(Z|[+-]\d{1,2}(:\d{1,2})?)?', Literal.Date),
+            (r'@\d{4}-\d{2}-\d{2}', Literal.Date),
+            (r'@\d{2}(:\d{2})?(:\d{2})?(\.\d{1,6})?(Z|[+-]\d{1,2}(:\d{1,2})?)?', Literal.Date),
+
+            (r'[^\S\n]+', Text),
+            include('numbers'),
+            (r'->|=>|==|!=|>=|<=|~=|&&|\|\||\?\?|\/\/', Operator),
+            (r'[-~+/*%=<>&^|.@]', Operator),
+            (r'[]{}:(),;[]', Punctuation),
+            include('functions'),
+
+            # Variable Names
+            (r'[A-Za-z_][a-zA-Z0-9_]*', Name.Variable),
+        ],
+        'numbers': [
+            (r'(\d(?:_?\d)*\.(?:\d(?:_?\d)*)?|(?:\d(?:_?\d)*)?\.\d(?:_?\d)*)'
+             r'([eE][+-]?\d(?:_?\d)*)?', Number.Float),
+            (r'\d(?:_?\d)*[eE][+-]?\d(?:_?\d)*j?', Number.Float),
+            (r'0[oO](?:_?[0-7])+', Number.Oct),
+            (r'0[bB](?:_?[01])+', Number.Bin),
+            (r'0[xX](?:_?[a-fA-F0-9])+', Number.Hex),
+            (r'\d(?:_?\d)*', Number.Integer),
+        ],
+        'fstringescape': [
+            include('stringescape'),
+        ],
+        'bytesescape': [
+            (r'\\([\\bfnrt"\']|\n|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'stringescape': [
+            (r'\\(N\{.*?\}|u\{[a-fA-F0-9]{1,6}\})', String.Escape),
+            include('bytesescape')
+        ],
+        'fstrings-single': fstring_rules(String.Single),
+        'fstrings-double': fstring_rules(String.Double),
+        'strings-single': innerstring_rules(String.Single),
+        'strings-double': innerstring_rules(String.Double),
+        'dqf': [
+            (r'"', String.Double, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include('fstrings-double')
+        ],
+        'sqf': [
+            (r"'", String.Single, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include('fstrings-single')
+        ],
+        'dqs': [
+            (r'"', String.Double, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include('strings-double')
+        ],
+        'sqs': [
+            (r"'", String.Single, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include('strings-single')
+        ],
+        'tdqf': [
+            (r'"""', String.Double, '#pop'),
+            include('fstrings-double'),
+            (r'\n', String.Double)
+        ],
+        'tsqf': [
+            (r"'''", String.Single, '#pop'),
+            include('fstrings-single'),
+            (r'\n', String.Single)
+        ],
+        'tdqs': [
+            (r'"""', String.Double, '#pop'),
+            include('strings-double'),
+            (r'\n', String.Double)
+        ],
+        'tsqs': [
+            (r"'''", String.Single, '#pop'),
+            include('strings-single'),
+            (r'\n', String.Single)
+        ],
+
+        'expr-inside-fstring': [
+            (r'[{([]', Punctuation, 'expr-inside-fstring-inner'),
+            # without format specifier
+            (r'(=\s*)?'         # debug (https://bugs.python.org/issue36817)
+             r'\}', String.Interpol, '#pop'),
+            # with format specifier
+            # we'll catch the remaining '}' in the outer scope
+            (r'(=\s*)?'         # debug (https://bugs.python.org/issue36817)
+             r':', String.Interpol, '#pop'),
+            (r'\s+', Whitespace),  # allow new lines
+            include('expr'),
+        ],
+        'expr-inside-fstring-inner': [
+            (r'[{([]', Punctuation, 'expr-inside-fstring-inner'),
+            (r'[])}]', Punctuation, '#pop'),
+            (r'\s+', Whitespace),  # allow new lines
+            include('expr'),
+        ],
+        'keywords': [
+            (words((
+                'into', 'case', 'type', 'module', 'internal',
+            ), suffix=r'\b'),
+                Keyword),
+            (words(('true', 'false', 'null'), suffix=r'\b'), Keyword.Constant),
+        ],
+        'functions': [
+            (words((
+                "min", "max", "sum", "average", "stddev", "every", "any",
+                "concat_array", "count", "lag", "lead", "first", "last",
+                "rank", "rank_dense", "row_number", "round", "as", "in",
+                "tuple_every", "tuple_map", "tuple_zip", "_eq", "_is_null",
+                "from_text", "lower", "upper", "read_parquet", "read_csv"),
+                suffix=r'\b'),
+             Name.Function),
+        ],
+
+        'comment': [
+            (r'-(?!\})', Comment.Multiline),
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r'[^-}]', Comment.Multiline),
+            (r'-\}', Comment.Multiline, '#pop'),
+        ],
+
+        'imports': [
+            (r'\w+(\.\w+)*', Name.Class, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/ptx.py b/.venv/Lib/site-packages/pygments/lexers/ptx.py
new file mode 100644 (file)
index 0000000..784ca13
--- /dev/null
@@ -0,0 +1,119 @@
+"""
+    pygments.lexers.ptx
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for other PTX language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Comment, Keyword, Name, String, Number, \
+    Punctuation, Whitespace, Operator
+
+__all__ = ["PtxLexer"]
+
+
+class PtxLexer(RegexLexer):
+    """
+    For NVIDIA `PTX <https://docs.nvidia.com/cuda/parallel-thread-execution/>`_
+    source.
+    """
+    name = 'PTX'
+    url = "https://docs.nvidia.com/cuda/parallel-thread-execution/"
+    filenames = ['*.ptx']
+    aliases = ['ptx']
+    mimetypes = ['text/x-ptx']
+    version_added = '2.16'
+
+    #: optional Comment or Whitespace
+    string = r'"[^"]*?"'
+    followsym = r'[a-zA-Z0-9_$]'
+    identifier = r'([-a-zA-Z$._][\w\-$.]*|' + string + ')'
+    block_label = r'(' + identifier + r'|(\d+))'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+
+            (block_label + r'\s*:', Name.Label),
+
+            include('keyword'),
+
+            (r'%' + identifier, Name.Variable),
+            (r'%\d+', Name.Variable.Anonymous),
+            (r'c?' + string, String),
+            (identifier, Name.Variable),
+            (r';', Punctuation),
+            (r'[*+-/]', Operator),
+
+            (r'0[xX][a-fA-F0-9]+', Number),
+            (r'-?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?', Number),
+
+            (r'[=<>{}\[\]()*.,!]|x\b', Punctuation)
+
+        ],
+        'whitespace': [
+            (r'(\n|\s+)+', Whitespace),
+            (r'//.*?\n', Comment)
+        ],
+
+        'keyword': [
+            # Instruction keywords
+            (words((
+                'abs', 'discard', 'min', 'shf', 'vadd',
+                'activemask', 'div', 'mma', 'shfl', 'vadd2',
+                'add', 'dp2a', 'mov', 'shl', 'vadd4',
+                'addc', 'dp4a', 'movmatrix', 'shr', 'vavrg2',
+                'alloca', 'elect', 'mul', 'sin', 'vavrg4',
+                'and', 'ex2', 'mul24', 'slct', 'vmad',
+                'applypriority', 'exit', 'multimem', 'sqrt', 'vmax',
+                'atom', 'fence', 'nanosleep', 'st', 'vmax2',
+                'bar', 'fma', 'neg', 'stackrestore', 'vmax4',
+                'barrier', 'fns', 'not', 'stacksave', 'vmin',
+                'bfe', 'getctarank', 'or', 'stmatrix', 'vmin2',
+                'bfi', 'griddepcontrol', 'pmevent', 'sub', 'vmin4',
+                'bfind', 'isspacep', 'popc', 'subc', 'vote',
+                'bmsk', 'istypep', 'prefetch', 'suld', 'vset',
+                'bra', 'ld', 'prefetchu', 'suq', 'vset2',
+                'brev', 'ldmatrix', 'prmt', 'sured', 'vset4',
+                'brkpt', 'ldu', 'rcp', 'sust', 'vshl',
+                'brx', 'lg2', 'red', 'szext', 'vshr',
+                'call', 'lop3', 'redux', 'tanh', 'vsub',
+                'clz', 'mad', 'rem', 'testp', 'vsub2',
+                'cnot', 'mad24', 'ret', 'tex', 'vsub4',
+                'copysign', 'madc', 'rsqrt', 'tld4', 'wgmma',
+                'cos', 'mapa', 'sad', 'trap', 'wmma',
+                'cp', 'match', 'selp', 'txq', 'xor',
+                'createpolicy', 'max', 'set', 'vabsdiff', 'cvt',
+                'mbarrier', 'setmaxnreg', 'vabsdiff2', 'cvta',
+                'membar', 'setp', 'vabsdiff4')), Keyword),
+            # State Spaces and Suffixes
+            (words((
+                'reg', '.sreg', '.const', '.global',
+                '.local', '.param', '.shared', '.tex',
+                '.wide', '.loc'
+            )), Keyword.Pseudo),
+            # PTX Directives
+            (words((
+                '.address_size', '.explicitcluster', '.maxnreg', '.section',
+                '.alias', '.extern', '.maxntid', '.shared',
+                '.align', '.file', '.minnctapersm', '.sreg',
+                '.branchtargets', '.func', '.noreturn', '.target',
+                '.callprototype', '.global', '.param', '.tex',
+                '.calltargets', '.loc', '.pragma', '.version',
+                '.common', '.local', '.reg', '.visible',
+                '.const', '.maxclusterrank', '.reqnctapercluster', '.weak',
+                '.entry', '.maxnctapersm', '.reqntid')), Keyword.Reserved),
+            # Fundamental Types
+            (words((
+                '.s8', '.s16', '.s32', '.s64',
+                '.u8', '.u16', '.u32', '.u64',
+                '.f16', '.f16x2', '.f32', '.f64',
+                '.b8', '.b16', '.b32', '.b64',
+                '.pred'
+            )), Keyword.Type)
+        ],
+
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/python.py b/.venv/Lib/site-packages/pygments/lexers/python.py
new file mode 100644 (file)
index 0000000..805f6ff
--- /dev/null
@@ -0,0 +1,1201 @@
+"""
+    pygments.lexers.python
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Python and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import keyword
+
+from pygments.lexer import DelegatingLexer, RegexLexer, include, \
+    bygroups, using, default, words, combined, this
+from pygments.util import get_bool_opt, shebang_matches
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Other, Error, Whitespace
+from pygments import unistring as uni
+
+__all__ = ['PythonLexer', 'PythonConsoleLexer', 'PythonTracebackLexer',
+           'Python2Lexer', 'Python2TracebackLexer',
+           'CythonLexer', 'DgLexer', 'NumPyLexer']
+
+
+class PythonLexer(RegexLexer):
+    """
+    For Python source code (version 3.x).
+
+    .. versionchanged:: 2.5
+       This is now the default ``PythonLexer``.  It is still available as the
+       alias ``Python3Lexer``.
+    """
+
+    name = 'Python'
+    url = 'https://www.python.org'
+    aliases = ['python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark', 'pyi']
+    filenames = [
+        '*.py',
+        '*.pyw',
+        # Type stubs
+        '*.pyi',
+        # Jython
+        '*.jy',
+        # Sage
+        '*.sage',
+        # SCons
+        '*.sc',
+        'SConstruct',
+        'SConscript',
+        # Skylark/Starlark (used by Bazel, Buck, and Pants)
+        '*.bzl',
+        'BUCK',
+        'BUILD',
+        'BUILD.bazel',
+        'WORKSPACE',
+        # Twisted Application infrastructure
+        '*.tac',
+    ]
+    mimetypes = ['text/x-python', 'application/x-python',
+                 'text/x-python3', 'application/x-python3']
+    version_added = '0.10'
+
+    uni_name = f"[{uni.xid_start}][{uni.xid_continue}]*"
+
+    def innerstring_rules(ttype):
+        return [
+            # the old style '%s' % (...) string formatting (still valid in Py3)
+            (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsaux%]', String.Interpol),
+            # the new style '{}'.format(...) string formatting
+            (r'\{'
+             r'((\w+)((\.\w+)|(\[[^\]]+\]))*)?'  # field name
+             r'(\![sra])?'                       # conversion
+             r'(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?'
+             r'\}', String.Interpol),
+
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"%{\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # unhandled string formatting sign
+            (r'%|(\{{1,2})', ttype)
+            # newlines are an error (use "nl" state)
+        ]
+
+    def fstring_rules(ttype):
+        return [
+            # Assuming that a '}' is the closing brace after format specifier.
+            # Sadly, this means that we won't detect syntax error. But it's
+            # more important to parse correct syntax correctly, than to
+            # highlight invalid syntax.
+            (r'\}', String.Interpol),
+            (r'\{', String.Interpol, 'expr-inside-fstring'),
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"{}\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # newlines are an error (use "nl" state)
+        ]
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")',
+             bygroups(Whitespace, String.Affix, String.Doc)),
+            (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')",
+             bygroups(Whitespace, String.Affix, String.Doc)),
+            (r'\A#!.+$', Comment.Hashbang),
+            (r'#.*$', Comment.Single),
+            (r'\\\n', Text),
+            (r'\\', Text),
+            include('keywords'),
+            include('soft-keywords'),
+            (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'classname'),
+            (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace),
+             'fromimport'),
+            (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace),
+             'import'),
+            include('expr'),
+        ],
+        'expr': [
+            # raw f-strings
+            ('(?i)(rf|fr)(""")',
+             bygroups(String.Affix, String.Double),
+             combined('rfstringescape', 'tdqf')),
+            ("(?i)(rf|fr)(''')",
+             bygroups(String.Affix, String.Single),
+             combined('rfstringescape', 'tsqf')),
+            ('(?i)(rf|fr)(")',
+             bygroups(String.Affix, String.Double),
+             combined('rfstringescape', 'dqf')),
+            ("(?i)(rf|fr)(')",
+             bygroups(String.Affix, String.Single),
+             combined('rfstringescape', 'sqf')),
+            # non-raw f-strings
+            ('([fF])(""")', bygroups(String.Affix, String.Double),
+             combined('fstringescape', 'tdqf')),
+            ("([fF])(''')", bygroups(String.Affix, String.Single),
+             combined('fstringescape', 'tsqf')),
+            ('([fF])(")', bygroups(String.Affix, String.Double),
+             combined('fstringescape', 'dqf')),
+            ("([fF])(')", bygroups(String.Affix, String.Single),
+             combined('fstringescape', 'sqf')),
+            # raw bytes and strings
+            ('(?i)(rb|br|r)(""")',
+             bygroups(String.Affix, String.Double), 'tdqs'),
+            ("(?i)(rb|br|r)(''')",
+             bygroups(String.Affix, String.Single), 'tsqs'),
+            ('(?i)(rb|br|r)(")',
+             bygroups(String.Affix, String.Double), 'dqs'),
+            ("(?i)(rb|br|r)(')",
+             bygroups(String.Affix, String.Single), 'sqs'),
+            # non-raw strings
+            ('([uU]?)(""")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'tdqs')),
+            ("([uU]?)(''')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'tsqs')),
+            ('([uU]?)(")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'dqs')),
+            ("([uU]?)(')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'sqs')),
+            # non-raw bytes
+            ('([bB])(""")', bygroups(String.Affix, String.Double),
+             combined('bytesescape', 'tdqs')),
+            ("([bB])(''')", bygroups(String.Affix, String.Single),
+             combined('bytesescape', 'tsqs')),
+            ('([bB])(")', bygroups(String.Affix, String.Double),
+             combined('bytesescape', 'dqs')),
+            ("([bB])(')", bygroups(String.Affix, String.Single),
+             combined('bytesescape', 'sqs')),
+
+            (r'[^\S\n]+', Text),
+            include('numbers'),
+            (r'!=|==|<<|>>|:=|[-~+/*%=<>&^|.]', Operator),
+            (r'[]{}:(),;[]', Punctuation),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            include('expr-keywords'),
+            include('builtins'),
+            include('magicfuncs'),
+            include('magicvars'),
+            include('name'),
+        ],
+        'expr-inside-fstring': [
+            (r'[{([]', Punctuation, 'expr-inside-fstring-inner'),
+            # without format specifier
+            (r'(=\s*)?'         # debug (https://bugs.python.org/issue36817)
+             r'(\![sraf])?'     # conversion
+             r'\}', String.Interpol, '#pop'),
+            # with format specifier
+            # we'll catch the remaining '}' in the outer scope
+            (r'(=\s*)?'         # debug (https://bugs.python.org/issue36817)
+             r'(\![sraf])?'     # conversion
+             r':', String.Interpol, '#pop'),
+            (r'\s+', Whitespace),  # allow new lines
+            include('expr'),
+        ],
+        'expr-inside-fstring-inner': [
+            (r'[{([]', Punctuation, 'expr-inside-fstring-inner'),
+            (r'[])}]', Punctuation, '#pop'),
+            (r'\s+', Whitespace),  # allow new lines
+            include('expr'),
+        ],
+        'expr-keywords': [
+            # Based on https://docs.python.org/3/reference/expressions.html
+            (words((
+                'async for', 'await', 'else', 'for', 'if', 'lambda',
+                'yield', 'yield from'), suffix=r'\b'),
+             Keyword),
+            (words(('True', 'False', 'None'), suffix=r'\b'), Keyword.Constant),
+        ],
+        'keywords': [
+            (words((
+                'assert', 'async', 'await', 'break', 'continue', 'del', 'elif',
+                'else', 'except', 'finally', 'for', 'global', 'if', 'lambda',
+                'pass', 'raise', 'nonlocal', 'return', 'try', 'while', 'yield',
+                'yield from', 'as', 'with'), suffix=r'\b'),
+             Keyword),
+            (words(('True', 'False', 'None'), suffix=r'\b'), Keyword.Constant),
+        ],
+        'soft-keywords': [
+            # `match`, `case` and `_` soft keywords
+            (r'(^[ \t]*)'              # at beginning of line + possible indentation
+             r'(match|case)\b'         # a possible keyword
+             r'(?![ \t]*(?:'           # not followed by...
+             r'[:,;=^&|@~)\]}]|(?:' +  # characters and keywords that mean this isn't
+                                       # pattern matching (but None/True/False is ok)
+             r'|'.join(k for k in keyword.kwlist if k[0].islower()) + r')\b))',
+             bygroups(Text, Keyword), 'soft-keywords-inner'),
+        ],
+        'soft-keywords-inner': [
+            # optional `_` keyword
+            (r'(\s+)([^\n_]*)(_\b)', bygroups(Whitespace, using(this), Keyword)),
+            default('#pop')
+        ],
+        'builtins': [
+            (words((
+                '__import__', 'abs', 'aiter', 'all', 'any', 'bin', 'bool', 'bytearray',
+                'breakpoint', 'bytes', 'callable', 'chr', 'classmethod', 'compile',
+                'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval',
+                'filter', 'float', 'format', 'frozenset', 'getattr', 'globals',
+                'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'isinstance',
+                'issubclass', 'iter', 'len', 'list', 'locals', 'map', 'max',
+                'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow',
+                'print', 'property', 'range', 'repr', 'reversed', 'round', 'set',
+                'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super',
+                'tuple', 'type', 'vars', 'zip'), prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Builtin),
+            (r'(?<!\.)(self|Ellipsis|NotImplemented|cls)\b', Name.Builtin.Pseudo),
+            (words((
+                'ArithmeticError', 'AssertionError', 'AttributeError',
+                'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning',
+                'EOFError', 'EnvironmentError', 'Exception', 'FloatingPointError',
+                'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
+                'ImportWarning', 'IndentationError', 'IndexError', 'KeyError',
+                'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError',
+                'NotImplementedError', 'OSError', 'OverflowError',
+                'PendingDeprecationWarning', 'ReferenceError', 'ResourceWarning',
+                'RuntimeError', 'RuntimeWarning', 'StopIteration',
+                'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit',
+                'TabError', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',
+                'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
+                'UnicodeWarning', 'UserWarning', 'ValueError', 'VMSError',
+                'Warning', 'WindowsError', 'ZeroDivisionError',
+                # new builtin exceptions from PEP 3151
+                'BlockingIOError', 'ChildProcessError', 'ConnectionError',
+                'BrokenPipeError', 'ConnectionAbortedError', 'ConnectionRefusedError',
+                'ConnectionResetError', 'FileExistsError', 'FileNotFoundError',
+                'InterruptedError', 'IsADirectoryError', 'NotADirectoryError',
+                'PermissionError', 'ProcessLookupError', 'TimeoutError',
+                # others new in Python 3
+                'StopAsyncIteration', 'ModuleNotFoundError', 'RecursionError',
+                'EncodingWarning'),
+                prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Exception),
+        ],
+        'magicfuncs': [
+            (words((
+                '__abs__', '__add__', '__aenter__', '__aexit__', '__aiter__',
+                '__and__', '__anext__', '__await__', '__bool__', '__bytes__',
+                '__call__', '__complex__', '__contains__', '__del__', '__delattr__',
+                '__delete__', '__delitem__', '__dir__', '__divmod__', '__enter__',
+                '__eq__', '__exit__', '__float__', '__floordiv__', '__format__',
+                '__ge__', '__get__', '__getattr__', '__getattribute__',
+                '__getitem__', '__gt__', '__hash__', '__iadd__', '__iand__',
+                '__ifloordiv__', '__ilshift__', '__imatmul__', '__imod__',
+                '__imul__', '__index__', '__init__', '__instancecheck__',
+                '__int__', '__invert__', '__ior__', '__ipow__', '__irshift__',
+                '__isub__', '__iter__', '__itruediv__', '__ixor__', '__le__',
+                '__len__', '__length_hint__', '__lshift__', '__lt__', '__matmul__',
+                '__missing__', '__mod__', '__mul__', '__ne__', '__neg__',
+                '__new__', '__next__', '__or__', '__pos__', '__pow__',
+                '__prepare__', '__radd__', '__rand__', '__rdivmod__', '__repr__',
+                '__reversed__', '__rfloordiv__', '__rlshift__', '__rmatmul__',
+                '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__',
+                '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__',
+                '__rxor__', '__set__', '__setattr__', '__setitem__', '__str__',
+                '__sub__', '__subclasscheck__', '__truediv__',
+                '__xor__'), suffix=r'\b'),
+             Name.Function.Magic),
+        ],
+        'magicvars': [
+            (words((
+                '__annotations__', '__bases__', '__class__', '__closure__',
+                '__code__', '__defaults__', '__dict__', '__doc__', '__file__',
+                '__func__', '__globals__', '__kwdefaults__', '__module__',
+                '__mro__', '__name__', '__objclass__', '__qualname__',
+                '__self__', '__slots__', '__weakref__'), suffix=r'\b'),
+             Name.Variable.Magic),
+        ],
+        'numbers': [
+            (r'(\d(?:_?\d)*\.(?:\d(?:_?\d)*)?|(?:\d(?:_?\d)*)?\.\d(?:_?\d)*)'
+             r'([eE][+-]?\d(?:_?\d)*)?', Number.Float),
+            (r'\d(?:_?\d)*[eE][+-]?\d(?:_?\d)*j?', Number.Float),
+            (r'0[oO](?:_?[0-7])+', Number.Oct),
+            (r'0[bB](?:_?[01])+', Number.Bin),
+            (r'0[xX](?:_?[a-fA-F0-9])+', Number.Hex),
+            (r'\d(?:_?\d)*', Number.Integer),
+        ],
+        'name': [
+            (r'@' + uni_name, Name.Decorator),
+            (r'@', Operator),  # new matrix multiplication operator
+            (uni_name, Name),
+        ],
+        'funcname': [
+            include('magicfuncs'),
+            (uni_name, Name.Function, '#pop'),
+            default('#pop'),
+        ],
+        'classname': [
+            (uni_name, Name.Class, '#pop'),
+        ],
+        'import': [
+            (r'(\s+)(as)(\s+)', bygroups(Whitespace, Keyword, Whitespace)),
+            (r'\.', Name.Namespace),
+            (uni_name, Name.Namespace),
+            (r'(\s*)(,)(\s*)', bygroups(Whitespace, Operator, Whitespace)),
+            default('#pop')  # all else: go back
+        ],
+        'fromimport': [
+            (r'(\s+)(import)\b', bygroups(Whitespace, Keyword.Namespace), '#pop'),
+            (r'\.', Name.Namespace),
+            # if None occurs here, it's "raise x from None", since None can
+            # never be a module name
+            (r'None\b', Keyword.Constant, '#pop'),
+            (uni_name, Name.Namespace),
+            default('#pop'),
+        ],
+        'rfstringescape': [
+            (r'\{\{', String.Escape),
+            (r'\}\}', String.Escape),
+        ],
+        'fstringescape': [
+            include('rfstringescape'),
+            include('stringescape'),
+        ],
+        'bytesescape': [
+            (r'\\([\\abfnrtv"\']|\n|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'stringescape': [
+            (r'\\(N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8})', String.Escape),
+            include('bytesescape')
+        ],
+        'fstrings-single': fstring_rules(String.Single),
+        'fstrings-double': fstring_rules(String.Double),
+        'strings-single': innerstring_rules(String.Single),
+        'strings-double': innerstring_rules(String.Double),
+        'dqf': [
+            (r'"', String.Double, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include('fstrings-double')
+        ],
+        'sqf': [
+            (r"'", String.Single, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include('fstrings-single')
+        ],
+        'dqs': [
+            (r'"', String.Double, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include('strings-double')
+        ],
+        'sqs': [
+            (r"'", String.Single, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include('strings-single')
+        ],
+        'tdqf': [
+            (r'"""', String.Double, '#pop'),
+            include('fstrings-double'),
+            (r'\n', String.Double)
+        ],
+        'tsqf': [
+            (r"'''", String.Single, '#pop'),
+            include('fstrings-single'),
+            (r'\n', String.Single)
+        ],
+        'tdqs': [
+            (r'"""', String.Double, '#pop'),
+            include('strings-double'),
+            (r'\n', String.Double)
+        ],
+        'tsqs': [
+            (r"'''", String.Single, '#pop'),
+            include('strings-single'),
+            (r'\n', String.Single)
+        ],
+    }
+
+    def analyse_text(text):
+        return shebang_matches(text, r'pythonw?(3(\.\d)?)?') or \
+            'import ' in text[:1000]
+
+
+Python3Lexer = PythonLexer
+
+
+class Python2Lexer(RegexLexer):
+    """
+    For Python 2.x source code.
+
+    .. versionchanged:: 2.5
+       This class has been renamed from ``PythonLexer``.  ``PythonLexer`` now
+       refers to the Python 3 variant.  File name patterns like ``*.py`` have
+       been moved to Python 3 as well.
+    """
+
+    name = 'Python 2.x'
+    url = 'https://www.python.org'
+    aliases = ['python2', 'py2']
+    filenames = []  # now taken over by PythonLexer (3.x)
+    mimetypes = ['text/x-python2', 'application/x-python2']
+    version_added = ''
+
+    def innerstring_rules(ttype):
+        return [
+            # the old style '%s' % (...) string formatting
+            (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsux%]', String.Interpol),
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"%\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # unhandled string formatting sign
+            (r'%', ttype),
+            # newlines are an error (use "nl" state)
+        ]
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")',
+             bygroups(Whitespace, String.Affix, String.Doc)),
+            (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')",
+             bygroups(Whitespace, String.Affix, String.Doc)),
+            (r'[^\S\n]+', Text),
+            (r'\A#!.+$', Comment.Hashbang),
+            (r'#.*$', Comment.Single),
+            (r'[]{}:(),;[]', Punctuation),
+            (r'\\\n', Text),
+            (r'\\', Text),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            (r'!=|==|<<|>>|[-~+/*%=<>&^|.]', Operator),
+            include('keywords'),
+            (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'classname'),
+            (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace),
+             'fromimport'),
+            (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace),
+             'import'),
+            include('builtins'),
+            include('magicfuncs'),
+            include('magicvars'),
+            include('backtick'),
+            ('([rR]|[uUbB][rR]|[rR][uUbB])(""")',
+             bygroups(String.Affix, String.Double), 'tdqs'),
+            ("([rR]|[uUbB][rR]|[rR][uUbB])(''')",
+             bygroups(String.Affix, String.Single), 'tsqs'),
+            ('([rR]|[uUbB][rR]|[rR][uUbB])(")',
+             bygroups(String.Affix, String.Double), 'dqs'),
+            ("([rR]|[uUbB][rR]|[rR][uUbB])(')",
+             bygroups(String.Affix, String.Single), 'sqs'),
+            ('([uUbB]?)(""")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'tdqs')),
+            ("([uUbB]?)(''')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'tsqs')),
+            ('([uUbB]?)(")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'dqs')),
+            ("([uUbB]?)(')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'sqs')),
+            include('name'),
+            include('numbers'),
+        ],
+        'keywords': [
+            (words((
+                'assert', 'break', 'continue', 'del', 'elif', 'else', 'except',
+                'exec', 'finally', 'for', 'global', 'if', 'lambda', 'pass',
+                'print', 'raise', 'return', 'try', 'while', 'yield',
+                'yield from', 'as', 'with'), suffix=r'\b'),
+             Keyword),
+        ],
+        'builtins': [
+            (words((
+                '__import__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin',
+                'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod',
+                'cmp', 'coerce', 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod',
+                'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float',
+                'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'hex', 'id',
+                'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len',
+                'list', 'locals', 'long', 'map', 'max', 'min', 'next', 'object',
+                'oct', 'open', 'ord', 'pow', 'property', 'range', 'raw_input', 'reduce',
+                'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
+                'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type',
+                'unichr', 'unicode', 'vars', 'xrange', 'zip'),
+                prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Builtin),
+            (r'(?<!\.)(self|None|Ellipsis|NotImplemented|False|True|cls'
+             r')\b', Name.Builtin.Pseudo),
+            (words((
+                'ArithmeticError', 'AssertionError', 'AttributeError',
+                'BaseException', 'DeprecationWarning', 'EOFError', 'EnvironmentError',
+                'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit',
+                'IOError', 'ImportError', 'ImportWarning', 'IndentationError',
+                'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
+                'MemoryError', 'NameError',
+                'NotImplementedError', 'OSError', 'OverflowError', 'OverflowWarning',
+                'PendingDeprecationWarning', 'ReferenceError',
+                'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration',
+                'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit',
+                'TabError', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',
+                'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
+                'UnicodeWarning', 'UserWarning', 'ValueError', 'VMSError', 'Warning',
+                'WindowsError', 'ZeroDivisionError'), prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Exception),
+        ],
+        'magicfuncs': [
+            (words((
+                '__abs__', '__add__', '__and__', '__call__', '__cmp__', '__coerce__',
+                '__complex__', '__contains__', '__del__', '__delattr__', '__delete__',
+                '__delitem__', '__delslice__', '__div__', '__divmod__', '__enter__',
+                '__eq__', '__exit__', '__float__', '__floordiv__', '__ge__', '__get__',
+                '__getattr__', '__getattribute__', '__getitem__', '__getslice__', '__gt__',
+                '__hash__', '__hex__', '__iadd__', '__iand__', '__idiv__', '__ifloordiv__',
+                '__ilshift__', '__imod__', '__imul__', '__index__', '__init__',
+                '__instancecheck__', '__int__', '__invert__', '__iop__', '__ior__',
+                '__ipow__', '__irshift__', '__isub__', '__iter__', '__itruediv__',
+                '__ixor__', '__le__', '__len__', '__long__', '__lshift__', '__lt__',
+                '__missing__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__',
+                '__nonzero__', '__oct__', '__op__', '__or__', '__pos__', '__pow__',
+                '__radd__', '__rand__', '__rcmp__', '__rdiv__', '__rdivmod__', '__repr__',
+                '__reversed__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__',
+                '__rop__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__',
+                '__rtruediv__', '__rxor__', '__set__', '__setattr__', '__setitem__',
+                '__setslice__', '__str__', '__sub__', '__subclasscheck__', '__truediv__',
+                '__unicode__', '__xor__'), suffix=r'\b'),
+             Name.Function.Magic),
+        ],
+        'magicvars': [
+            (words((
+                '__bases__', '__class__', '__closure__', '__code__', '__defaults__',
+                '__dict__', '__doc__', '__file__', '__func__', '__globals__',
+                '__metaclass__', '__module__', '__mro__', '__name__', '__self__',
+                '__slots__', '__weakref__'),
+                suffix=r'\b'),
+             Name.Variable.Magic),
+        ],
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+j?', Number.Float),
+            (r'0[0-7]+j?', Number.Oct),
+            (r'0[bB][01]+', Number.Bin),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+j?', Number.Integer)
+        ],
+        'backtick': [
+            ('`.*?`', String.Backtick),
+        ],
+        'name': [
+            (r'@[\w.]+', Name.Decorator),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'funcname': [
+            include('magicfuncs'),
+            (r'[a-zA-Z_]\w*', Name.Function, '#pop'),
+            default('#pop'),
+        ],
+        'classname': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'(?:[ \t]|\\\n)+', Text),
+            (r'as\b', Keyword.Namespace),
+            (r',', Operator),
+            (r'[a-zA-Z_][\w.]*', Name.Namespace),
+            default('#pop')  # all else: go back
+        ],
+        'fromimport': [
+            (r'(?:[ \t]|\\\n)+', Text),
+            (r'import\b', Keyword.Namespace, '#pop'),
+            # if None occurs here, it's "raise x from None", since None can
+            # never be a module name
+            (r'None\b', Name.Builtin.Pseudo, '#pop'),
+            # sadly, in "raise x from y" y will be highlighted as namespace too
+            (r'[a-zA-Z_.][\w.]*', Name.Namespace),
+            # anything else here also means "raise x from y" and is therefore
+            # not an error
+            default('#pop'),
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'strings-single': innerstring_rules(String.Single),
+        'strings-double': innerstring_rules(String.Double),
+        'dqs': [
+            (r'"', String.Double, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include('strings-double')
+        ],
+        'sqs': [
+            (r"'", String.Single, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include('strings-single')
+        ],
+        'tdqs': [
+            (r'"""', String.Double, '#pop'),
+            include('strings-double'),
+            (r'\n', String.Double)
+        ],
+        'tsqs': [
+            (r"'''", String.Single, '#pop'),
+            include('strings-single'),
+            (r'\n', String.Single)
+        ],
+    }
+
+    def analyse_text(text):
+        return shebang_matches(text, r'pythonw?2(\.\d)?')
+
+
+class _PythonConsoleLexerBase(RegexLexer):
+    name = 'Python console session'
+    aliases = ['pycon', 'python-console']
+    mimetypes = ['text/x-python-doctest']
+
+    """Auxiliary lexer for `PythonConsoleLexer`.
+
+    Code tokens are output as ``Token.Other.Code``, traceback tokens as
+    ``Token.Other.Traceback``.
+    """
+    tokens = {
+        'root': [
+            (r'(>>> )(.*\n)', bygroups(Generic.Prompt, Other.Code), 'continuations'),
+            # This happens, e.g., when tracebacks are embedded in documentation;
+            # trailing whitespaces are often stripped in such contexts.
+            (r'(>>>)(\n)', bygroups(Generic.Prompt, Whitespace)),
+            (r'(\^C)?Traceback \(most recent call last\):\n', Other.Traceback, 'traceback'),
+            # SyntaxError starts with this
+            (r'  File "[^"]+", line \d+', Other.Traceback, 'traceback'),
+            (r'.*\n', Generic.Output),
+        ],
+        'continuations': [
+            (r'(\.\.\. )(.*\n)', bygroups(Generic.Prompt, Other.Code)),
+            # See above.
+            (r'(\.\.\.)(\n)', bygroups(Generic.Prompt, Whitespace)),
+            default('#pop'),
+        ],
+        'traceback': [
+            # As soon as we see a traceback, consume everything until the next
+            # >>> prompt.
+            (r'(?=>>>( |$))', Text, '#pop'),
+            (r'(KeyboardInterrupt)(\n)', bygroups(Name.Class, Whitespace)),
+            (r'.*\n', Other.Traceback),
+        ],
+    }
+
+
+class PythonConsoleLexer(DelegatingLexer):
+    """
+    For Python console output or doctests, such as:
+
+    .. sourcecode:: pycon
+
+        >>> a = 'foo'
+        >>> print(a)
+        foo
+        >>> 1 / 0
+        Traceback (most recent call last):
+          File "<stdin>", line 1, in <module>
+        ZeroDivisionError: integer division or modulo by zero
+
+    Additional options:
+
+    `python3`
+        Use Python 3 lexer for code.  Default is ``True``.
+
+        .. versionadded:: 1.0
+        .. versionchanged:: 2.5
+           Now defaults to ``True``.
+    """
+
+    name = 'Python console session'
+    aliases = ['pycon', 'python-console']
+    mimetypes = ['text/x-python-doctest']
+    url = 'https://python.org'
+    version_added = ''
+
+    def __init__(self, **options):
+        python3 = get_bool_opt(options, 'python3', True)
+        if python3:
+            pylexer = PythonLexer
+            tblexer = PythonTracebackLexer
+        else:
+            pylexer = Python2Lexer
+            tblexer = Python2TracebackLexer
+        # We have two auxiliary lexers. Use DelegatingLexer twice with
+        # different tokens.  TODO: DelegatingLexer should support this
+        # directly, by accepting a tuplet of auxiliary lexers and a tuple of
+        # distinguishing tokens. Then we wouldn't need this intermediary
+        # class.
+        class _ReplaceInnerCode(DelegatingLexer):
+            def __init__(self, **options):
+                super().__init__(pylexer, _PythonConsoleLexerBase, Other.Code, **options)
+        super().__init__(tblexer, _ReplaceInnerCode, Other.Traceback, **options)
+
+
+class PythonTracebackLexer(RegexLexer):
+    """
+    For Python 3.x tracebacks, with support for chained exceptions.
+
+    .. versionchanged:: 2.5
+       This is now the default ``PythonTracebackLexer``.  It is still available
+       as the alias ``Python3TracebackLexer``.
+    """
+
+    name = 'Python Traceback'
+    aliases = ['pytb', 'py3tb']
+    filenames = ['*.pytb', '*.py3tb']
+    mimetypes = ['text/x-python-traceback', 'text/x-python3-traceback']
+    url = 'https://python.org'
+    version_added = '1.0'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'^(\^C)?Traceback \(most recent call last\):\n', Generic.Traceback, 'intb'),
+            (r'^During handling of the above exception, another '
+             r'exception occurred:\n\n', Generic.Traceback),
+            (r'^The above exception was the direct cause of the '
+             r'following exception:\n\n', Generic.Traceback),
+            (r'^(?=  File "[^"]+", line \d+)', Generic.Traceback, 'intb'),
+            (r'^.*\n', Other),
+        ],
+        'intb': [
+            (r'^(  File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Text, Name, Whitespace)),
+            (r'^(  File )("[^"]+")(, line )(\d+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Whitespace)),
+            (r'^(    )(.+)(\n)',
+             bygroups(Whitespace, using(PythonLexer), Whitespace), 'markers'),
+            (r'^([ \t]*)(\.\.\.)(\n)',
+             bygroups(Whitespace, Comment, Whitespace)),  # for doctests...
+            (r'^([^:]+)(: )(.+)(\n)',
+             bygroups(Generic.Error, Text, Name, Whitespace), '#pop'),
+            (r'^([a-zA-Z_][\w.]*)(:?\n)',
+             bygroups(Generic.Error, Whitespace), '#pop'),
+            default('#pop'),
+        ],
+        'markers': [
+            # Either `PEP 657 <https://www.python.org/dev/peps/pep-0657/>`
+            # error locations in Python 3.11+, or single-caret markers
+            # for syntax errors before that.
+            (r'^( {4,})([~^]+)(\n)',
+             bygroups(Whitespace, Punctuation.Marker, Whitespace),
+             '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+Python3TracebackLexer = PythonTracebackLexer
+
+
+class Python2TracebackLexer(RegexLexer):
+    """
+    For Python tracebacks.
+
+    .. versionchanged:: 2.5
+       This class has been renamed from ``PythonTracebackLexer``.
+       ``PythonTracebackLexer`` now refers to the Python 3 variant.
+    """
+
+    name = 'Python 2.x Traceback'
+    aliases = ['py2tb']
+    filenames = ['*.py2tb']
+    mimetypes = ['text/x-python2-traceback']
+    url = 'https://python.org'
+    version_added = '0.7'
+
+    tokens = {
+        'root': [
+            # Cover both (most recent call last) and (innermost last)
+            # The optional ^C allows us to catch keyboard interrupt signals.
+            (r'^(\^C)?(Traceback.*\n)',
+             bygroups(Text, Generic.Traceback), 'intb'),
+            # SyntaxError starts with this.
+            (r'^(?=  File "[^"]+", line \d+)', Generic.Traceback, 'intb'),
+            (r'^.*\n', Other),
+        ],
+        'intb': [
+            (r'^(  File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Text, Name, Whitespace)),
+            (r'^(  File )("[^"]+")(, line )(\d+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Whitespace)),
+            (r'^(    )(.+)(\n)',
+             bygroups(Text, using(Python2Lexer), Whitespace), 'marker'),
+            (r'^([ \t]*)(\.\.\.)(\n)',
+             bygroups(Text, Comment, Whitespace)),  # for doctests...
+            (r'^([^:]+)(: )(.+)(\n)',
+             bygroups(Generic.Error, Text, Name, Whitespace), '#pop'),
+            (r'^([a-zA-Z_]\w*)(:?\n)',
+             bygroups(Generic.Error, Whitespace), '#pop')
+        ],
+        'marker': [
+            # For syntax errors.
+            (r'( {4,})(\^)', bygroups(Text, Punctuation.Marker), '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class CythonLexer(RegexLexer):
+    """
+    For Pyrex and Cython source code.
+    """
+
+    name = 'Cython'
+    url = 'https://cython.org'
+    aliases = ['cython', 'pyx', 'pyrex']
+    filenames = ['*.pyx', '*.pxd', '*.pxi']
+    mimetypes = ['text/x-cython', 'application/x-cython']
+    version_added = '1.1'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'^(\s*)("""(?:.|\n)*?""")', bygroups(Whitespace, String.Doc)),
+            (r"^(\s*)('''(?:.|\n)*?''')", bygroups(Whitespace, String.Doc)),
+            (r'[^\S\n]+', Text),
+            (r'#.*$', Comment),
+            (r'[]{}:(),;[]', Punctuation),
+            (r'\\\n', Whitespace),
+            (r'\\', Text),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            (r'(<)([a-zA-Z0-9.?]+)(>)',
+             bygroups(Punctuation, Keyword.Type, Punctuation)),
+            (r'!=|==|<<|>>|[-~+/*%=<>&^|.?]', Operator),
+            (r'(from)(\d+)(<=)(\s+)(<)(\d+)(:)',
+             bygroups(Keyword, Number.Integer, Operator, Whitespace, Operator,
+                      Name, Punctuation)),
+            include('keywords'),
+            (r'(def|property)(\s+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (r'(cp?def)(\s+)', bygroups(Keyword, Whitespace), 'cdef'),
+            # (should actually start a block with only cdefs)
+            (r'(cdef)(:)', bygroups(Keyword, Punctuation)),
+            (r'(class|struct)(\s+)', bygroups(Keyword, Whitespace), 'classname'),
+            (r'(from)(\s+)', bygroups(Keyword, Whitespace), 'fromimport'),
+            (r'(c?import)(\s+)', bygroups(Keyword, Whitespace), 'import'),
+            include('builtins'),
+            include('backtick'),
+            ('(?:[rR]|[uU][rR]|[rR][uU])"""', String, 'tdqs'),
+            ("(?:[rR]|[uU][rR]|[rR][uU])'''", String, 'tsqs'),
+            ('(?:[rR]|[uU][rR]|[rR][uU])"', String, 'dqs'),
+            ("(?:[rR]|[uU][rR]|[rR][uU])'", String, 'sqs'),
+            ('[uU]?"""', String, combined('stringescape', 'tdqs')),
+            ("[uU]?'''", String, combined('stringescape', 'tsqs')),
+            ('[uU]?"', String, combined('stringescape', 'dqs')),
+            ("[uU]?'", String, combined('stringescape', 'sqs')),
+            include('name'),
+            include('numbers'),
+        ],
+        'keywords': [
+            (words((
+                'assert', 'async', 'await', 'break', 'by', 'continue', 'ctypedef', 'del', 'elif',
+                'else', 'except', 'except?', 'exec', 'finally', 'for', 'fused', 'gil',
+                'global', 'if', 'include', 'lambda', 'nogil', 'pass', 'print',
+                'raise', 'return', 'try', 'while', 'yield', 'as', 'with'), suffix=r'\b'),
+             Keyword),
+            (r'(DEF|IF|ELIF|ELSE)\b', Comment.Preproc),
+        ],
+        'builtins': [
+            (words((
+                '__import__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bint',
+                'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr',
+                'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'delattr',
+                'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit',
+                'file', 'filter', 'float', 'frozenset', 'getattr', 'globals',
+                'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'intern', 'isinstance',
+                'issubclass', 'iter', 'len', 'list', 'locals', 'long', 'map', 'max',
+                'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'Py_ssize_t',
+                'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed',
+                'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod',
+                'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'unsigned',
+                'vars', 'xrange', 'zip'), prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Builtin),
+            (r'(?<!\.)(self|None|Ellipsis|NotImplemented|False|True|NULL'
+             r')\b', Name.Builtin.Pseudo),
+            (words((
+                'ArithmeticError', 'AssertionError', 'AttributeError',
+                'BaseException', 'DeprecationWarning', 'EOFError', 'EnvironmentError',
+                'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit',
+                'IOError', 'ImportError', 'ImportWarning', 'IndentationError',
+                'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
+                'MemoryError', 'NameError', 'NotImplemented', 'NotImplementedError',
+                'OSError', 'OverflowError', 'OverflowWarning',
+                'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError',
+                'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError',
+                'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError',
+                'TypeError', 'UnboundLocalError', 'UnicodeDecodeError',
+                'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError',
+                'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning',
+                'ZeroDivisionError'), prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Exception),
+        ],
+        'numbers': [
+            (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'0\d+', Number.Oct),
+            (r'0[xX][a-fA-F0-9]+', Number.Hex),
+            (r'\d+L', Number.Integer.Long),
+            (r'\d+', Number.Integer)
+        ],
+        'backtick': [
+            ('`.*?`', String.Backtick),
+        ],
+        'name': [
+            (r'@\w+', Name.Decorator),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'funcname': [
+            (r'[a-zA-Z_]\w*', Name.Function, '#pop')
+        ],
+        'cdef': [
+            (r'(public|readonly|extern|api|inline)\b', Keyword.Reserved),
+            (r'(struct|enum|union|class)\b', Keyword),
+            (r'([a-zA-Z_]\w*)(\s*)(?=[(:#=]|$)',
+             bygroups(Name.Function, Whitespace), '#pop'),
+            (r'([a-zA-Z_]\w*)(\s*)(,)',
+             bygroups(Name.Function, Whitespace, Punctuation)),
+            (r'from\b', Keyword, '#pop'),
+            (r'as\b', Keyword),
+            (r':', Punctuation, '#pop'),
+            (r'(?=["\'])', Text, '#pop'),
+            (r'[a-zA-Z_]\w*', Keyword.Type),
+            (r'.', Text),
+        ],
+        'classname': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'(\s+)(as)(\s+)', bygroups(Whitespace, Keyword, Whitespace)),
+            (r'[a-zA-Z_][\w.]*', Name.Namespace),
+            (r'(\s*)(,)(\s*)', bygroups(Whitespace, Operator, Whitespace)),
+            default('#pop')  # all else: go back
+        ],
+        'fromimport': [
+            (r'(\s+)(c?import)\b', bygroups(Whitespace, Keyword), '#pop'),
+            (r'[a-zA-Z_.][\w.]*', Name.Namespace),
+            # ``cdef foo from "header"``, or ``for foo from 0 < i < 10``
+            default('#pop'),
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'strings': [
+            (r'%(\([a-zA-Z0-9]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsux%]', String.Interpol),
+            (r'[^\\\'"%\n]+', String),
+            # quotes, percents and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+            # unhandled string formatting sign
+            (r'%', String)
+            # newlines are an error (use "nl" state)
+        ],
+        'nl': [
+            (r'\n', String)
+        ],
+        'dqs': [
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here again for raw strings
+            include('strings')
+        ],
+        'sqs': [
+            (r"'", String, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here again for raw strings
+            include('strings')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop'),
+            include('strings'),
+            include('nl')
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop'),
+            include('strings'),
+            include('nl')
+        ],
+    }
+
+
+class DgLexer(RegexLexer):
+    """
+    Lexer for dg,
+    a functional and object-oriented programming language
+    running on the CPython 3 VM.
+    """
+    name = 'dg'
+    aliases = ['dg']
+    filenames = ['*.dg']
+    mimetypes = ['text/x-dg']
+    url = 'http://pyos.github.io/dg'
+    version_added = '1.6'
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'#.*?$', Comment.Single),
+
+            (r'(?i)0b[01]+', Number.Bin),
+            (r'(?i)0o[0-7]+', Number.Oct),
+            (r'(?i)0x[0-9a-f]+', Number.Hex),
+            (r'(?i)[+-]?[0-9]+\.[0-9]+(e[+-]?[0-9]+)?j?', Number.Float),
+            (r'(?i)[+-]?[0-9]+e[+-]?\d+j?', Number.Float),
+            (r'(?i)[+-]?[0-9]+j?', Number.Integer),
+
+            (r"(?i)(br|r?b?)'''", String, combined('stringescape', 'tsqs', 'string')),
+            (r'(?i)(br|r?b?)"""', String, combined('stringescape', 'tdqs', 'string')),
+            (r"(?i)(br|r?b?)'", String, combined('stringescape', 'sqs', 'string')),
+            (r'(?i)(br|r?b?)"', String, combined('stringescape', 'dqs', 'string')),
+
+            (r"`\w+'*`", Operator),
+            (r'\b(and|in|is|or|where)\b', Operator.Word),
+            (r'[!$%&*+\-./:<-@\\^|~;,]+', Operator),
+
+            (words((
+                'bool', 'bytearray', 'bytes', 'classmethod', 'complex', 'dict', 'dict\'',
+                'float', 'frozenset', 'int', 'list', 'list\'', 'memoryview', 'object',
+                'property', 'range', 'set', 'set\'', 'slice', 'staticmethod', 'str',
+                'super', 'tuple', 'tuple\'', 'type'),
+                   prefix=r'(?<!\.)', suffix=r'(?![\'\w])'),
+             Name.Builtin),
+            (words((
+                '__import__', 'abs', 'all', 'any', 'bin', 'bind', 'chr', 'cmp', 'compile',
+                'complex', 'delattr', 'dir', 'divmod', 'drop', 'dropwhile', 'enumerate',
+                'eval', 'exhaust', 'filter', 'flip', 'foldl1?', 'format', 'fst',
+                'getattr', 'globals', 'hasattr', 'hash', 'head', 'hex', 'id', 'init',
+                'input', 'isinstance', 'issubclass', 'iter', 'iterate', 'last', 'len',
+                'locals', 'map', 'max', 'min', 'next', 'oct', 'open', 'ord', 'pow',
+                'print', 'repr', 'reversed', 'round', 'setattr', 'scanl1?', 'snd',
+                'sorted', 'sum', 'tail', 'take', 'takewhile', 'vars', 'zip'),
+                   prefix=r'(?<!\.)', suffix=r'(?![\'\w])'),
+             Name.Builtin),
+            (r"(?<!\.)(self|Ellipsis|NotImplemented|None|True|False)(?!['\w])",
+             Name.Builtin.Pseudo),
+
+            (r"(?<!\.)[A-Z]\w*(Error|Exception|Warning)'*(?!['\w])",
+             Name.Exception),
+            (r"(?<!\.)(Exception|GeneratorExit|KeyboardInterrupt|StopIteration|"
+             r"SystemExit)(?!['\w])", Name.Exception),
+
+            (r"(?<![\w.])(except|finally|for|if|import|not|otherwise|raise|"
+             r"subclass|while|with|yield)(?!['\w])", Keyword.Reserved),
+
+            (r"[A-Z_]+'*(?!['\w])", Name),
+            (r"[A-Z]\w+'*(?!['\w])", Keyword.Type),
+            (r"\w+'*", Name),
+
+            (r'[()]', Punctuation),
+            (r'.', Error),
+        ],
+        'stringescape': [
+            (r'\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|'
+             r'U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'string': [
+            (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsux%]', String.Interpol),
+            (r'[^\\\'"%\n]+', String),
+            # quotes, percents and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+            # unhandled string formatting sign
+            (r'%', String),
+            (r'\n', String)
+        ],
+        'dqs': [
+            (r'"', String, '#pop')
+        ],
+        'sqs': [
+            (r"'", String, '#pop')
+        ],
+        'tdqs': [
+            (r'"""', String, '#pop')
+        ],
+        'tsqs': [
+            (r"'''", String, '#pop')
+        ],
+    }
+
+
+class NumPyLexer(PythonLexer):
+    """
+    A Python lexer recognizing Numerical Python builtins.
+    """
+
+    name = 'NumPy'
+    url = 'https://numpy.org/'
+    aliases = ['numpy']
+    version_added = '0.10'
+
+    # override the mimetypes to not inherit them from python
+    mimetypes = []
+    filenames = []
+
+    EXTRA_KEYWORDS = {
+        'abs', 'absolute', 'accumulate', 'add', 'alen', 'all', 'allclose',
+        'alltrue', 'alterdot', 'amax', 'amin', 'angle', 'any', 'append',
+        'apply_along_axis', 'apply_over_axes', 'arange', 'arccos', 'arccosh',
+        'arcsin', 'arcsinh', 'arctan', 'arctan2', 'arctanh', 'argmax', 'argmin',
+        'argsort', 'argwhere', 'around', 'array', 'array2string', 'array_equal',
+        'array_equiv', 'array_repr', 'array_split', 'array_str', 'arrayrange',
+        'asanyarray', 'asarray', 'asarray_chkfinite', 'ascontiguousarray',
+        'asfarray', 'asfortranarray', 'asmatrix', 'asscalar', 'astype',
+        'atleast_1d', 'atleast_2d', 'atleast_3d', 'average', 'bartlett',
+        'base_repr', 'beta', 'binary_repr', 'bincount', 'binomial',
+        'bitwise_and', 'bitwise_not', 'bitwise_or', 'bitwise_xor', 'blackman',
+        'bmat', 'broadcast', 'byte_bounds', 'bytes', 'byteswap', 'c_',
+        'can_cast', 'ceil', 'choose', 'clip', 'column_stack', 'common_type',
+        'compare_chararrays', 'compress', 'concatenate', 'conj', 'conjugate',
+        'convolve', 'copy', 'corrcoef', 'correlate', 'cos', 'cosh', 'cov',
+        'cross', 'cumprod', 'cumproduct', 'cumsum', 'delete', 'deprecate',
+        'diag', 'diagflat', 'diagonal', 'diff', 'digitize', 'disp', 'divide',
+        'dot', 'dsplit', 'dstack', 'dtype', 'dump', 'dumps', 'ediff1d', 'empty',
+        'empty_like', 'equal', 'exp', 'expand_dims', 'expm1', 'extract', 'eye',
+        'fabs', 'fastCopyAndTranspose', 'fft', 'fftfreq', 'fftshift', 'fill',
+        'finfo', 'fix', 'flat', 'flatnonzero', 'flatten', 'fliplr', 'flipud',
+        'floor', 'floor_divide', 'fmod', 'frexp', 'fromarrays', 'frombuffer',
+        'fromfile', 'fromfunction', 'fromiter', 'frompyfunc', 'fromstring',
+        'generic', 'get_array_wrap', 'get_include', 'get_numarray_include',
+        'get_numpy_include', 'get_printoptions', 'getbuffer', 'getbufsize',
+        'geterr', 'geterrcall', 'geterrobj', 'getfield', 'gradient', 'greater',
+        'greater_equal', 'gumbel', 'hamming', 'hanning', 'histogram',
+        'histogram2d', 'histogramdd', 'hsplit', 'hstack', 'hypot', 'i0',
+        'identity', 'ifft', 'imag', 'index_exp', 'indices', 'inf', 'info',
+        'inner', 'insert', 'int_asbuffer', 'interp', 'intersect1d',
+        'intersect1d_nu', 'inv', 'invert', 'iscomplex', 'iscomplexobj',
+        'isfinite', 'isfortran', 'isinf', 'isnan', 'isneginf', 'isposinf',
+        'isreal', 'isrealobj', 'isscalar', 'issctype', 'issubclass_',
+        'issubdtype', 'issubsctype', 'item', 'itemset', 'iterable', 'ix_',
+        'kaiser', 'kron', 'ldexp', 'left_shift', 'less', 'less_equal', 'lexsort',
+        'linspace', 'load', 'loads', 'loadtxt', 'log', 'log10', 'log1p', 'log2',
+        'logical_and', 'logical_not', 'logical_or', 'logical_xor', 'logspace',
+        'lstsq', 'mat', 'matrix', 'max', 'maximum', 'maximum_sctype',
+        'may_share_memory', 'mean', 'median', 'meshgrid', 'mgrid', 'min',
+        'minimum', 'mintypecode', 'mod', 'modf', 'msort', 'multiply', 'nan',
+        'nan_to_num', 'nanargmax', 'nanargmin', 'nanmax', 'nanmin', 'nansum',
+        'ndenumerate', 'ndim', 'ndindex', 'negative', 'newaxis', 'newbuffer',
+        'newbyteorder', 'nonzero', 'not_equal', 'obj2sctype', 'ogrid', 'ones',
+        'ones_like', 'outer', 'permutation', 'piecewise', 'pinv', 'pkgload',
+        'place', 'poisson', 'poly', 'poly1d', 'polyadd', 'polyder', 'polydiv',
+        'polyfit', 'polyint', 'polymul', 'polysub', 'polyval', 'power', 'prod',
+        'product', 'ptp', 'put', 'putmask', 'r_', 'randint', 'random_integers',
+        'random_sample', 'ranf', 'rank', 'ravel', 'real', 'real_if_close',
+        'recarray', 'reciprocal', 'reduce', 'remainder', 'repeat', 'require',
+        'reshape', 'resize', 'restoredot', 'right_shift', 'rint', 'roll',
+        'rollaxis', 'roots', 'rot90', 'round', 'round_', 'row_stack', 's_',
+        'sample', 'savetxt', 'sctype2char', 'searchsorted', 'seed', 'select',
+        'set_numeric_ops', 'set_printoptions', 'set_string_function',
+        'setbufsize', 'setdiff1d', 'seterr', 'seterrcall', 'seterrobj',
+        'setfield', 'setflags', 'setmember1d', 'setxor1d', 'shape',
+        'show_config', 'shuffle', 'sign', 'signbit', 'sin', 'sinc', 'sinh',
+        'size', 'slice', 'solve', 'sometrue', 'sort', 'sort_complex', 'source',
+        'split', 'sqrt', 'square', 'squeeze', 'standard_normal', 'std',
+        'subtract', 'sum', 'svd', 'swapaxes', 'take', 'tan', 'tanh', 'tensordot',
+        'test', 'tile', 'tofile', 'tolist', 'tostring', 'trace', 'transpose',
+        'trapz', 'tri', 'tril', 'trim_zeros', 'triu', 'true_divide', 'typeDict',
+        'typename', 'uniform', 'union1d', 'unique', 'unique1d', 'unravel_index',
+        'unwrap', 'vander', 'var', 'vdot', 'vectorize', 'view', 'vonmises',
+        'vsplit', 'vstack', 'weibull', 'where', 'who', 'zeros', 'zeros_like'
+    }
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                PythonLexer.get_tokens_unprocessed(self, text):
+            if token is Name and value in self.EXTRA_KEYWORDS:
+                yield index, Keyword.Pseudo, value
+            else:
+                yield index, token, value
+
+    def analyse_text(text):
+        ltext = text[:1000]
+        return (shebang_matches(text, r'pythonw?(3(\.\d)?)?') or
+                'import ' in ltext) \
+            and ('import numpy' in ltext or 'from numpy import' in ltext)
diff --git a/.venv/Lib/site-packages/pygments/lexers/q.py b/.venv/Lib/site-packages/pygments/lexers/q.py
new file mode 100644 (file)
index 0000000..bfa8017
--- /dev/null
@@ -0,0 +1,187 @@
+"""
+    pygments.lexers.q
+    ~~~~~~~~~~~~~~~~~
+
+    Lexer for the Q programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include, bygroups, inherit
+from pygments.token import Comment, Name, Number, Operator, Punctuation, \
+    String, Whitespace, Literal, Generic
+
+__all__ = ["KLexer", "QLexer"]
+
+
+class KLexer(RegexLexer):
+    """
+    For K source code.
+    """
+
+    name = "K"
+    aliases = ["k"]
+    filenames = ["*.k"]
+    url = "https://code.kx.com"
+    version_added = '2.12'
+
+    tokens = {
+        "whitespace": [
+            # hashbang script
+            (r"^#!.*", Comment.Hashbang),
+            # Comments
+            (r"^/\s*\n", Comment.Multiline, "comments"),
+            (r"(?<!\S)/.*", Comment.Single),
+            # Whitespace
+            (r"\s+", Whitespace),
+            # Strings
+            (r"\"", String.Double, "strings"),
+        ],
+        "root": [
+            include("whitespace"),
+            include("keywords"),
+            include("declarations"),
+        ],
+        "keywords": [
+            (words(("abs", "acos", "asin", "atan", "avg", "bin",
+                    "binr", "by", "cor", "cos", "cov", "dev",
+                    "delete", "div", "do", "enlist", "exec", "exit",
+                    "exp", "from", "getenv", "hopen", "if", "in",
+                    "insert", "last", "like", "log", "max", "min",
+                    "prd", "select", "setenv", "sin", "sqrt", "ss",
+                    "sum", "tan", "update", "var", "wavg", "while",
+                    "within", "wsum", "xexp"),
+                   suffix=r"\b"), Operator.Word),
+        ],
+        "declarations": [
+            # Timing
+            (r"^\\ts?", Comment.Preproc),
+            (r"^(\\\w\s+[^/\n]*?)(/.*)",
+             bygroups(Comment.Preproc, Comment.Single)),
+            # Generic System Commands
+            (r"^\\\w.*", Comment.Preproc),
+            # Prompt
+            (r"^[a-zA-Z]\)", Generic.Prompt),
+            # Function Names
+            (r"([.]?[a-zA-Z][\w.]*)(\s*)([-.~=!@#$%^&*_+|,<>?/\\:']?:)(\s*)(\{)",
+             bygroups(Name.Function, Whitespace, Operator, Whitespace, Punctuation),
+             "functions"),
+            # Variable Names
+            (r"([.]?[a-zA-Z][\w.]*)(\s*)([-.~=!@#$%^&*_+|,<>?/\\:']?:)",
+             bygroups(Name.Variable, Whitespace, Operator)),
+            # Functions
+            (r"\{", Punctuation, "functions"),
+            # Parentheses
+            (r"\(", Punctuation, "parentheses"),
+            # Brackets
+            (r"\[", Punctuation, "brackets"),
+            # Errors
+            (r"'`([a-zA-Z][\w.]*)?", Name.Exception),
+            # File Symbols
+            (r"`:([a-zA-Z/][\w./]*)?", String.Symbol),
+            # Symbols
+            (r"`([a-zA-Z][\w.]*)?", String.Symbol),
+            # Numbers
+            include("numbers"),
+            # Variable Names
+            (r"[a-zA-Z][\w.]*", Name),
+            # Operators
+            (r"[-=+*#$%@!~^&:.,<>'\\|/?_]", Operator),
+            # Punctuation
+            (r";", Punctuation),
+        ],
+        "functions": [
+            include("root"),
+            (r"\}", Punctuation, "#pop"),
+        ],
+        "parentheses": [
+            include("root"),
+            (r"\)", Punctuation, "#pop"),
+        ],
+        "brackets": [
+            include("root"),
+            (r"\]", Punctuation, "#pop"),
+        ],
+        "numbers": [
+            # Binary Values
+            (r"[01]+b", Number.Bin),
+            # Nulls/Infinities
+            (r"0[nNwW][cefghijmndzuvtp]?", Number),
+            # Timestamps
+            ((r"(?:[0-9]{4}[.][0-9]{2}[.][0-9]{2}|[0-9]+)"
+              "D(?:[0-9](?:[0-9](?::[0-9]{2}"
+              "(?::[0-9]{2}(?:[.][0-9]*)?)?)?)?)?"), Literal.Date),
+            # Datetimes
+            ((r"[0-9]{4}[.][0-9]{2}"
+              "(?:m|[.][0-9]{2}(?:T(?:[0-9]{2}:[0-9]{2}"
+              "(?::[0-9]{2}(?:[.][0-9]*)?)?)?)?)"), Literal.Date),
+            # Times
+            (r"[0-9]{2}:[0-9]{2}(?::[0-9]{2}(?:[.][0-9]{1,3})?)?",
+             Literal.Date),
+            # GUIDs
+            (r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}",
+             Number.Hex),
+            # Byte Vectors
+            (r"0x[0-9a-fA-F]+", Number.Hex),
+            # Floats
+            (r"([0-9]*[.]?[0-9]+|[0-9]+[.]?[0-9]*)[eE][+-]?[0-9]+[ef]?",
+             Number.Float),
+            (r"([0-9]*[.][0-9]+|[0-9]+[.][0-9]*)[ef]?", Number.Float),
+            (r"[0-9]+[ef]", Number.Float),
+            # Characters
+            (r"[0-9]+c", Number),
+            # Integers
+            (r"[0-9]+[ihtuv]", Number.Integer),
+            # Long Integers
+            (r"[0-9]+[jnp]?", Number.Integer.Long),
+        ],
+        "comments": [
+            (r"[^\\]+", Comment.Multiline),
+            (r"^\\", Comment.Multiline, "#pop"),
+            (r"\\", Comment.Multiline),
+        ],
+        "strings": [
+            (r'[^"\\]+', String.Double),
+            (r"\\.", String.Escape),
+            (r'"', String.Double, "#pop"),
+        ],
+    }
+
+
+class QLexer(KLexer):
+    """
+    For `Q <https://code.kx.com/>`_ source code.
+    """
+
+    name = "Q"
+    aliases = ["q"]
+    filenames = ["*.q"]
+    version_added = '2.12'
+
+    tokens = {
+        "root": [
+            (words(("aj", "aj0", "ajf", "ajf0", "all", "and", "any", "asc",
+                    "asof", "attr", "avgs", "ceiling", "cols", "count", "cross",
+                    "csv", "cut", "deltas", "desc", "differ", "distinct", "dsave",
+                    "each", "ej", "ema", "eval", "except", "fby", "fills", "first",
+                    "fkeys", "flip", "floor", "get", "group", "gtime", "hclose",
+                    "hcount", "hdel", "hsym", "iasc", "idesc", "ij", "ijf",
+                    "inter", "inv", "key", "keys", "lj", "ljf", "load", "lower",
+                    "lsq", "ltime", "ltrim", "mavg", "maxs", "mcount", "md5",
+                    "mdev", "med", "meta", "mins", "mmax", "mmin", "mmu", "mod",
+                    "msum", "neg", "next", "not", "null", "or", "over", "parse",
+                    "peach", "pj", "prds", "prior", "prev", "rand", "rank", "ratios",
+                    "raze", "read0", "read1", "reciprocal", "reval", "reverse",
+                    "rload", "rotate", "rsave", "rtrim", "save", "scan", "scov",
+                    "sdev", "set", "show", "signum", "ssr", "string", "sublist",
+                    "sums", "sv", "svar", "system", "tables", "til", "trim", "txf",
+                    "type", "uj", "ujf", "ungroup", "union", "upper", "upsert",
+                    "value", "view", "views", "vs", "where", "wj", "wj1", "ww",
+                    "xasc", "xbar", "xcol", "xcols", "xdesc", "xgroup", "xkey",
+                    "xlog", "xprev", "xrank"),
+                    suffix=r"\b"), Name.Builtin,
+            ),
+            inherit,
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/qlik.py b/.venv/Lib/site-packages/pygments/lexers/qlik.py
new file mode 100644 (file)
index 0000000..a29f89f
--- /dev/null
@@ -0,0 +1,117 @@
+"""
+    pygments.lexers.qlik
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the qlik scripting language
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text
+from pygments.lexers._qlik_builtins import OPERATORS_LIST, STATEMENT_LIST, \
+    SCRIPT_FUNCTIONS, CONSTANT_LIST
+
+__all__ = ["QlikLexer"]
+
+
+class QlikLexer(RegexLexer):
+    """
+    Lexer for qlik code, including .qvs files
+    """
+
+    name = "Qlik"
+    aliases = ["qlik", "qlikview", "qliksense", "qlikscript"]
+    filenames = ["*.qvs", "*.qvw"]
+    url = "https://qlik.com"
+    version_added = '2.12'
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        # Handle multi-line comments
+        "comment": [
+            (r"\*/", Comment.Multiline, "#pop"),
+            (r"[^*]+", Comment.Multiline),
+        ],
+        # Handle numbers
+        "numerics": [
+            (r"\b\d+\.\d+(e\d+)?[fd]?\b", Number.Float),
+            (r"\b\d+\b", Number.Integer),
+        ],
+        # Handle variable names in things
+        "interp": [
+            (
+                r"(\$\()(\w+)(\))",
+                bygroups(String.Interpol, Name.Variable, String.Interpol),
+            ),
+        ],
+        # Handle strings
+        "string": [
+            (r"'", String, "#pop"),
+            include("interp"),
+            (r"[^'$]+", String),
+            (r"\$", String),
+        ],
+        #
+        "assignment": [
+            (r";", Punctuation, "#pop"),
+            include("root"),
+        ],
+        "field_name_quote": [
+            (r'"', String.Symbol, "#pop"),
+            include("interp"),
+            (r"[^\"$]+", String.Symbol),
+            (r"\$", String.Symbol),
+        ],
+        "field_name_bracket": [
+            (r"\]", String.Symbol, "#pop"),
+            include("interp"),
+            (r"[^\]$]+", String.Symbol),
+            (r"\$", String.Symbol),
+        ],
+        "function": [(r"\)", Punctuation, "#pop"), include("root")],
+        "root": [
+            # Whitespace and comments
+            (r"\s+", Text.Whitespace),
+            (r"/\*", Comment.Multiline, "comment"),
+            (r"//.*\n", Comment.Single),
+            # variable assignment
+            (r"(let|set)(\s+)", bygroups(Keyword.Declaration, Text.Whitespace),
+             "assignment"),
+            # Word operators
+            (words(OPERATORS_LIST["words"], prefix=r"\b", suffix=r"\b"),
+             Operator.Word),
+            # Statements
+            (words(STATEMENT_LIST, suffix=r"\b"), Keyword),
+            # Table names
+            (r"[a-z]\w*:", Keyword.Declaration),
+            # Constants
+            (words(CONSTANT_LIST, suffix=r"\b"), Keyword.Constant),
+            # Functions
+            (words(SCRIPT_FUNCTIONS, suffix=r"(?=\s*\()"), Name.Builtin,
+             "function"),
+            # interpolation - e.g. $(variableName)
+            include("interp"),
+            # Quotes denote a field/file name
+            (r'"', String.Symbol, "field_name_quote"),
+            # Square brackets denote a field/file name
+            (r"\[", String.Symbol, "field_name_bracket"),
+            # Strings
+            (r"'", String, "string"),
+            # Numbers
+            include("numerics"),
+            # Operator symbols
+            (words(OPERATORS_LIST["symbols"]), Operator),
+            # Strings denoted by single quotes
+            (r"'.+?'", String),
+            # Words as text
+            (r"\b\w+\b", Text),
+            # Basic punctuation
+            (r"[,;.()\\/]", Punctuation),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/qvt.py b/.venv/Lib/site-packages/pygments/lexers/qvt.py
new file mode 100644 (file)
index 0000000..302d1b6
--- /dev/null
@@ -0,0 +1,153 @@
+"""
+    pygments.lexers.qvt
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for QVT Operational language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include, combined, default, \
+    words
+from pygments.token import Text, Comment, Operator, Keyword, Punctuation, \
+    Name, String, Number
+
+__all__ = ['QVToLexer']
+
+
+class QVToLexer(RegexLexer):
+    """
+    For the QVT Operational Mapping language.
+
+    Reference for implementing this: «Meta Object Facility (MOF) 2.0
+    Query/View/Transformation Specification», Version 1.1 - January 2011
+    (https://www.omg.org/spec/QVT/1.1/), see §8.4, «Concrete Syntax» in
+    particular.
+
+    Notable tokens assignments:
+
+    - Name.Class is assigned to the identifier following any of the following
+      keywords: metamodel, class, exception, primitive, enum, transformation
+      or library
+
+    - Name.Function is assigned to the names of mappings and queries
+
+    - Name.Builtin.Pseudo is assigned to the pre-defined variables 'this',
+      'self' and 'result'.
+    """
+    # With obvious borrowings & inspiration from the Java, Python and C lexers
+
+    name = 'QVTO'
+    aliases = ['qvto', 'qvt']
+    filenames = ['*.qvto']
+    url = 'https://www.omg.org/spec/QVT/1.1'
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'(--|//)(\s*)(directive:)?(.*)$',
+             bygroups(Comment, Comment, Comment.Preproc, Comment)),
+            # Uncomment the following if you want to distinguish between
+            # '/*' and '/**', à la javadoc
+            # (r'/[*]{2}(.|\n)*?[*]/', Comment.Multiline),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'\\\n', Text),
+            (r'(and|not|or|xor|##?)\b', Operator.Word),
+            (r'(:{1,2}=|[-+]=)\b', Operator.Word),
+            (r'(@|<<|>>)\b', Keyword),  # stereotypes
+            (r'!=|<>|==|=|!->|->|>=|<=|[.]{3}|[+/*%=<>&|.~]', Operator),
+            (r'[]{}:(),;[]', Punctuation),
+            (r'(true|false|unlimited|null)\b', Keyword.Constant),
+            (r'(this|self|result)\b', Name.Builtin.Pseudo),
+            (r'(var)\b', Keyword.Declaration),
+            (r'(from|import)\b', Keyword.Namespace, 'fromimport'),
+            (r'(metamodel|class|exception|primitive|enum|transformation|'
+             r'library)(\s+)(\w+)',
+             bygroups(Keyword.Word, Text, Name.Class)),
+            (r'(exception)(\s+)(\w+)',
+             bygroups(Keyword.Word, Text, Name.Exception)),
+            (r'(main)\b', Name.Function),
+            (r'(mapping|helper|query)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'operation'),
+            (r'(assert)(\s+)\b', bygroups(Keyword, Text), 'assert'),
+            (r'(Bag|Collection|Dict|OrderedSet|Sequence|Set|Tuple|List)\b',
+             Keyword.Type),
+            include('keywords'),
+            ('"', String, combined('stringescape', 'dqs')),
+            ("'", String, combined('stringescape', 'sqs')),
+            include('name'),
+            include('numbers'),
+            # (r'([a-zA-Z_]\w*)(::)([a-zA-Z_]\w*)',
+            # bygroups(Text, Text, Text)),
+        ],
+
+        'fromimport': [
+            (r'(?:[ \t]|\\\n)+', Text),
+            (r'[a-zA-Z_][\w.]*', Name.Namespace),
+            default('#pop'),
+        ],
+
+        'operation': [
+            (r'::', Text),
+            (r'(.*::)([a-zA-Z_]\w*)([ \t]*)(\()',
+             bygroups(Text, Name.Function, Text, Punctuation), '#pop')
+        ],
+
+        'assert': [
+            (r'(warning|error|fatal)\b', Keyword, '#pop'),
+            default('#pop'),  # all else: go back
+        ],
+
+        'keywords': [
+            (words((
+                'abstract', 'access', 'any', 'assert', 'blackbox', 'break',
+                'case', 'collect', 'collectNested', 'collectOne', 'collectselect',
+                'collectselectOne', 'composes', 'compute', 'configuration',
+                'constructor', 'continue', 'datatype', 'default', 'derived',
+                'disjuncts', 'do', 'elif', 'else', 'end', 'endif', 'except',
+                'exists', 'extends', 'forAll', 'forEach', 'forOne', 'from', 'if',
+                'implies', 'in', 'inherits', 'init', 'inout', 'intermediate',
+                'invresolve', 'invresolveIn', 'invresolveone', 'invresolveoneIn',
+                'isUnique', 'iterate', 'late', 'let', 'literal', 'log', 'map',
+                'merges', 'modeltype', 'new', 'object', 'one', 'ordered', 'out',
+                'package', 'population', 'property', 'raise', 'readonly',
+                'references', 'refines', 'reject', 'resolve', 'resolveIn',
+                'resolveone', 'resolveoneIn', 'return', 'select', 'selectOne',
+                'sortedBy', 'static', 'switch', 'tag', 'then', 'try', 'typedef',
+                'unlimited', 'uses', 'when', 'where', 'while', 'with', 'xcollect',
+                'xmap', 'xselect'), suffix=r'\b'), Keyword),
+        ],
+
+        # There is no need to distinguish between String.Single and
+        # String.Double: 'strings' is factorised for 'dqs' and 'sqs'
+        'strings': [
+            (r'[^\\\'"\n]+', String),
+            # quotes, percents and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+        ],
+        'stringescape': [
+            (r'\\([\\btnfr"\']|u[0-3][0-7]{2}|u[0-7]{1,2})', String.Escape)
+        ],
+        'dqs': [  # double-quoted string
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"', String.Escape),
+            include('strings')
+        ],
+        'sqs': [  # single-quoted string
+            (r"'", String, '#pop'),
+            (r"\\\\|\\'", String.Escape),
+            include('strings')
+        ],
+        'name': [
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        # numbers: excerpt taken from the python lexer
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+', Number.Float),
+            (r'\d+', Number.Integer)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/r.py b/.venv/Lib/site-packages/pygments/lexers/r.py
new file mode 100644 (file)
index 0000000..d3f65ba
--- /dev/null
@@ -0,0 +1,196 @@
+"""
+    pygments.lexers.r
+    ~~~~~~~~~~~~~~~~~
+
+    Lexers for the R/S languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, do_insertions
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+
+__all__ = ['RConsoleLexer', 'SLexer', 'RdLexer']
+
+
+line_re  = re.compile('.*?\n')
+
+
+class RConsoleLexer(Lexer):
+    """
+    For R console transcripts or R CMD BATCH output files.
+    """
+
+    name = 'RConsole'
+    aliases = ['rconsole', 'rout']
+    filenames = ['*.Rout']
+    url = 'https://www.r-project.org'
+    version_added = ''
+    _example = "rconsole/r-console-transcript.Rout"
+
+    def get_tokens_unprocessed(self, text):
+        slexer = SLexer(**self.options)
+
+        current_code_block = ''
+        insertions = []
+
+        for match in line_re.finditer(text):
+            line = match.group()
+            if line.startswith('>') or line.startswith('+'):
+                # Colorize the prompt as such,
+                # then put rest of line into current_code_block
+                insertions.append((len(current_code_block),
+                                   [(0, Generic.Prompt, line[:2])]))
+                current_code_block += line[2:]
+            else:
+                # We have reached a non-prompt line!
+                # If we have stored prompt lines, need to process them first.
+                if current_code_block:
+                    # Weave together the prompts and highlight code.
+                    yield from do_insertions(
+                        insertions, slexer.get_tokens_unprocessed(current_code_block))
+                    # Reset vars for next code block.
+                    current_code_block = ''
+                    insertions = []
+                # Now process the actual line itself, this is output from R.
+                yield match.start(), Generic.Output, line
+
+        # If we happen to end on a code block with nothing after it, need to
+        # process the last code block. This is neither elegant nor DRY so
+        # should be changed.
+        if current_code_block:
+            yield from do_insertions(
+                insertions, slexer.get_tokens_unprocessed(current_code_block))
+
+
+class SLexer(RegexLexer):
+    """
+    For S, S-plus, and R source code.
+    """
+
+    name = 'S'
+    aliases = ['splus', 's', 'r']
+    filenames = ['*.S', '*.R', '.Rhistory', '.Rprofile', '.Renviron']
+    mimetypes = ['text/S-plus', 'text/S', 'text/x-r-source', 'text/x-r',
+                 'text/x-R', 'text/x-r-history', 'text/x-r-profile']
+    url = 'https://www.r-project.org'
+    version_added = '0.10'
+
+    valid_name = r'`[^`\\]*(?:\\.[^`\\]*)*`|(?:[a-zA-Z]|\.[A-Za-z_.])[\w.]*|\.'
+    tokens = {
+        'comments': [
+            (r'#.*$', Comment.Single),
+        ],
+        'valid_name': [
+            (valid_name, Name),
+        ],
+        'function_name': [
+            (rf'({valid_name})\s*(?=\()', Name.Function),
+        ],
+        'punctuation': [
+            (r'\[{1,2}|\]{1,2}|\(|\)|;|,', Punctuation),
+        ],
+        'keywords': [
+            (r'(if|else|for|while|repeat|in|next|break|return|switch|function)'
+             r'(?![\w.])',
+             Keyword.Reserved),
+        ],
+        'operators': [
+            (r'<<?-|->>?|-|==|<=|>=|\|>|<|>|&&?|!=|\|\|?|\?', Operator),
+            (r'\*|\+|\^|/|!|%[^%]*%|=|~|\$|@|:{1,3}', Operator),
+        ],
+        'builtin_symbols': [
+            (r'(NULL|NA(_(integer|real|complex|character)_)?|'
+             r'letters|LETTERS|Inf|TRUE|FALSE|NaN|pi|\.\.(\.|[0-9]+))'
+             r'(?![\w.])',
+             Keyword.Constant),
+            (r'(T|F)\b', Name.Builtin.Pseudo),
+        ],
+        'numbers': [
+            # hex number
+            (r'0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?', Number.Hex),
+            # decimal number
+            (r'[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+|\.)([eE][+-]?[0-9]+)?[Li]?',
+             Number),
+        ],
+        'statements': [
+            include('comments'),
+            # whitespaces
+            (r'\s+', Whitespace),
+            (r'\'', String, 'string_squote'),
+            (r'\"', String, 'string_dquote'),
+            include('builtin_symbols'),
+            include('keywords'),
+            include('function_name'),
+            include('valid_name'),
+            include('numbers'),
+            include('punctuation'),
+            include('operators'),
+        ],
+        'root': [
+            # calls:
+            include('statements'),
+            # blocks:
+            (r'\{|\}', Punctuation),
+            # (r'\{', Punctuation, 'block'),
+            (r'.', Text),
+        ],
+        # 'block': [
+        #    include('statements'),
+        #    ('\{', Punctuation, '#push'),
+        #    ('\}', Punctuation, '#pop')
+        # ],
+        'string_squote': [
+            (r'([^\'\\]|\\.)*\'', String, '#pop'),
+        ],
+        'string_dquote': [
+            (r'([^"\\]|\\.)*"', String, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if re.search(r'[a-z0-9_\])\s]<-(?!-)', text):
+            return 0.11
+
+
+class RdLexer(RegexLexer):
+    """
+    Pygments Lexer for R documentation (Rd) files
+
+    This is a very minimal implementation, highlighting little more
+    than the macros. A description of Rd syntax is found in `Writing R
+    Extensions <http://cran.r-project.org/doc/manuals/R-exts.html>`_
+    and `Parsing Rd files <http://developer.r-project.org/parseRd.pdf>`_.
+    """
+    name = 'Rd'
+    aliases = ['rd']
+    filenames = ['*.Rd']
+    mimetypes = ['text/x-r-doc']
+    url = 'http://cran.r-project.org/doc/manuals/R-exts.html'
+    version_added = '1.6'
+
+    # To account for verbatim / LaTeX-like / and R-like areas
+    # would require parsing.
+    tokens = {
+        'root': [
+            # catch escaped brackets and percent sign
+            (r'\\[\\{}%]', String.Escape),
+            # comments
+            (r'%.*$', Comment),
+            # special macros with no arguments
+            (r'\\(?:cr|l?dots|R|tab)\b', Keyword.Constant),
+            # macros
+            (r'\\[a-zA-Z]+\b', Keyword),
+            # special preprocessor macros
+            (r'^\s*#(?:ifn?def|endif).*\b', Comment.Preproc),
+            # non-escaped brackets
+            (r'[{}]', Name.Builtin),
+            # everything else
+            (r'[^\\%\n{}]+', Text),
+            (r'.', Text),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/rdf.py b/.venv/Lib/site-packages/pygments/lexers/rdf.py
new file mode 100644 (file)
index 0000000..4930c1b
--- /dev/null
@@ -0,0 +1,468 @@
+"""
+    pygments.lexers.rdf
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for semantic web and RDF query languages and markup.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, default
+from pygments.token import Keyword, Punctuation, String, Number, Operator, \
+    Generic, Whitespace, Name, Literal, Comment, Text
+
+__all__ = ['SparqlLexer', 'TurtleLexer', 'ShExCLexer']
+
+
+class SparqlLexer(RegexLexer):
+    """
+    Lexer for SPARQL query language.
+    """
+    name = 'SPARQL'
+    aliases = ['sparql']
+    filenames = ['*.rq', '*.sparql']
+    mimetypes = ['application/sparql-query']
+    url = 'https://www.w3.org/TR/sparql11-query'
+    version_added = '2.0'
+
+    # character group definitions ::
+
+    PN_CHARS_BASE_GRP = ('a-zA-Z'
+                         '\u00c0-\u00d6'
+                         '\u00d8-\u00f6'
+                         '\u00f8-\u02ff'
+                         '\u0370-\u037d'
+                         '\u037f-\u1fff'
+                         '\u200c-\u200d'
+                         '\u2070-\u218f'
+                         '\u2c00-\u2fef'
+                         '\u3001-\ud7ff'
+                         '\uf900-\ufdcf'
+                         '\ufdf0-\ufffd')
+
+    PN_CHARS_U_GRP = (PN_CHARS_BASE_GRP + '_')
+
+    PN_CHARS_GRP = (PN_CHARS_U_GRP +
+                    r'\-' +
+                    r'0-9' +
+                    '\u00b7' +
+                    '\u0300-\u036f' +
+                    '\u203f-\u2040')
+
+    HEX_GRP = '0-9A-Fa-f'
+
+    PN_LOCAL_ESC_CHARS_GRP = r' _~.\-!$&"()*+,;=/?#@%'
+
+    # terminal productions ::
+
+    PN_CHARS_BASE = '[' + PN_CHARS_BASE_GRP + ']'
+
+    PN_CHARS_U = '[' + PN_CHARS_U_GRP + ']'
+
+    PN_CHARS = '[' + PN_CHARS_GRP + ']'
+
+    HEX = '[' + HEX_GRP + ']'
+
+    PN_LOCAL_ESC_CHARS = '[' + PN_LOCAL_ESC_CHARS_GRP + ']'
+
+    IRIREF = r'<(?:[^<>"{}|^`\\\x00-\x20])*>'
+
+    BLANK_NODE_LABEL = '_:[0-9' + PN_CHARS_U_GRP + '](?:[' + PN_CHARS_GRP + \
+                       '.]*' + PN_CHARS + ')?'
+
+    PN_PREFIX = PN_CHARS_BASE + '(?:[' + PN_CHARS_GRP + '.]*' + PN_CHARS + ')?'
+
+    VARNAME = '[0-9' + PN_CHARS_U_GRP + '][' + PN_CHARS_U_GRP + \
+              '0-9\u00b7\u0300-\u036f\u203f-\u2040]*'
+
+    PERCENT = '%' + HEX + HEX
+
+    PN_LOCAL_ESC = r'\\' + PN_LOCAL_ESC_CHARS
+
+    PLX = '(?:' + PERCENT + ')|(?:' + PN_LOCAL_ESC + ')'
+
+    PN_LOCAL = ('(?:[' + PN_CHARS_U_GRP + ':0-9' + ']|' + PLX + ')' +
+                '(?:(?:[' + PN_CHARS_GRP + '.:]|' + PLX + ')*(?:[' +
+                PN_CHARS_GRP + ':]|' + PLX + '))?')
+
+    EXPONENT = r'[eE][+-]?\d+'
+
+    # Lexer token definitions ::
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            # keywords ::
+            (r'(?i)(select|construct|describe|ask|where|filter|group\s+by|minus|'
+             r'distinct|reduced|from\s+named|from|order\s+by|desc|asc|limit|'
+             r'offset|values|bindings|load|into|clear|drop|create|add|move|copy|'
+             r'insert\s+data|delete\s+data|delete\s+where|with|delete|insert|'
+             r'using\s+named|using|graph|default|named|all|optional|service|'
+             r'silent|bind|undef|union|not\s+in|in|as|having|to|prefix|base)\b', Keyword),
+            (r'(a)\b', Keyword),
+            # IRIs ::
+            ('(' + IRIREF + ')', Name.Label),
+            # blank nodes ::
+            ('(' + BLANK_NODE_LABEL + ')', Name.Label),
+            #  # variables ::
+            ('[?$]' + VARNAME, Name.Variable),
+            # prefixed names ::
+            (r'(' + PN_PREFIX + r')?(\:)(' + PN_LOCAL + r')?',
+             bygroups(Name.Namespace, Punctuation, Name.Tag)),
+            # function names ::
+            (r'(?i)(str|lang|langmatches|datatype|bound|iri|uri|bnode|rand|abs|'
+             r'ceil|floor|round|concat|strlen|ucase|lcase|encode_for_uri|'
+             r'contains|strstarts|strends|strbefore|strafter|year|month|day|'
+             r'hours|minutes|seconds|timezone|tz|now|uuid|struuid|md5|sha1|sha256|sha384|'
+             r'sha512|coalesce|if|strlang|strdt|sameterm|isiri|isuri|isblank|'
+             r'isliteral|isnumeric|regex|substr|replace|exists|not\s+exists|'
+             r'count|sum|min|max|avg|sample|group_concat|separator)\b',
+             Name.Function),
+            # boolean literals ::
+            (r'(true|false)', Keyword.Constant),
+            # double literals ::
+            (r'[+\-]?(\d+\.\d*' + EXPONENT + r'|\.?\d+' + EXPONENT + ')', Number.Float),
+            # decimal literals ::
+            (r'[+\-]?(\d+\.\d*|\.\d+)', Number.Float),
+            # integer literals ::
+            (r'[+\-]?\d+', Number.Integer),
+            # operators ::
+            (r'(\|\||&&|=|\*|\-|\+|/|!=|<=|>=|!|<|>)', Operator),
+            # punctuation characters ::
+            (r'[(){}.;,:^\[\]]', Punctuation),
+            # line comments ::
+            (r'#[^\n]*', Comment),
+            # strings ::
+            (r'"""', String, 'triple-double-quoted-string'),
+            (r'"', String, 'single-double-quoted-string'),
+            (r"'''", String, 'triple-single-quoted-string'),
+            (r"'", String, 'single-single-quoted-string'),
+        ],
+        'triple-double-quoted-string': [
+            (r'"""', String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-double-quoted-string': [
+            (r'"', String, 'end-of-string'),
+            (r'[^"\\\n]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'triple-single-quoted-string': [
+            (r"'''", String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String.Escape, 'string-escape'),
+        ],
+        'single-single-quoted-string': [
+            (r"'", String, 'end-of-string'),
+            (r"[^'\\\n]+", String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'string-escape': [
+            (r'u' + HEX + '{4}', String.Escape, '#pop'),
+            (r'U' + HEX + '{8}', String.Escape, '#pop'),
+            (r'.', String.Escape, '#pop'),
+        ],
+        'end-of-string': [
+            (r'(@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)',
+             bygroups(Operator, Name.Function), '#pop:2'),
+            (r'\^\^', Operator, '#pop:2'),
+            default('#pop:2'),
+        ],
+    }
+
+
+class TurtleLexer(RegexLexer):
+    """
+    Lexer for Turtle data language.
+    """
+    name = 'Turtle'
+    aliases = ['turtle']
+    filenames = ['*.ttl']
+    mimetypes = ['text/turtle', 'application/x-turtle']
+    url = 'https://www.w3.org/TR/turtle'
+    version_added = '2.1'
+
+    # character group definitions ::
+    PN_CHARS_BASE_GRP = ('a-zA-Z'
+                         '\u00c0-\u00d6'
+                         '\u00d8-\u00f6'
+                         '\u00f8-\u02ff'
+                         '\u0370-\u037d'
+                         '\u037f-\u1fff'
+                         '\u200c-\u200d'
+                         '\u2070-\u218f'
+                         '\u2c00-\u2fef'
+                         '\u3001-\ud7ff'
+                         '\uf900-\ufdcf'
+                         '\ufdf0-\ufffd')
+
+    PN_CHARS_U_GRP = (PN_CHARS_BASE_GRP + '_')
+
+    PN_CHARS_GRP = (PN_CHARS_U_GRP +
+                    r'\-' +
+                    r'0-9' +
+                    '\u00b7' +
+                    '\u0300-\u036f' +
+                    '\u203f-\u2040')
+
+    PN_CHARS = '[' + PN_CHARS_GRP + ']'
+
+    PN_CHARS_BASE = '[' + PN_CHARS_BASE_GRP + ']'
+
+    PN_PREFIX = PN_CHARS_BASE + '(?:[' + PN_CHARS_GRP + '.]*' + PN_CHARS + ')?'
+
+    HEX_GRP = '0-9A-Fa-f'
+
+    HEX = '[' + HEX_GRP + ']'
+
+    PERCENT = '%' + HEX + HEX
+
+    PN_LOCAL_ESC_CHARS_GRP = r' _~.\-!$&"()*+,;=/?#@%'
+
+    PN_LOCAL_ESC_CHARS = '[' + PN_LOCAL_ESC_CHARS_GRP + ']'
+
+    PN_LOCAL_ESC = r'\\' + PN_LOCAL_ESC_CHARS
+
+    PLX = '(?:' + PERCENT + ')|(?:' + PN_LOCAL_ESC + ')'
+
+    PN_LOCAL = ('(?:[' + PN_CHARS_U_GRP + ':0-9' + ']|' + PLX + ')' +
+                '(?:(?:[' + PN_CHARS_GRP + '.:]|' + PLX + ')*(?:[' +
+                PN_CHARS_GRP + ':]|' + PLX + '))?')
+
+    patterns = {
+        'PNAME_NS': r'((?:[a-zA-Z][\w-]*)?\:)',  # Simplified character range
+        'IRIREF': r'(<[^<>"{}|^`\\\x00-\x20]*>)'
+    }
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+
+            # Base / prefix
+            (r'(@base|BASE)(\s+){IRIREF}(\s*)(\.?)'.format(**patterns),
+             bygroups(Keyword, Whitespace, Name.Variable, Whitespace,
+                      Punctuation)),
+            (r'(@prefix|PREFIX)(\s+){PNAME_NS}(\s+){IRIREF}(\s*)(\.?)'.format(**patterns),
+             bygroups(Keyword, Whitespace, Name.Namespace, Whitespace,
+                      Name.Variable, Whitespace, Punctuation)),
+
+            # The shorthand predicate 'a'
+            (r'(?<=\s)a(?=\s)', Keyword.Type),
+
+            # IRIREF
+            (r'{IRIREF}'.format(**patterns), Name.Variable),
+
+            # PrefixedName
+            (r'(' + PN_PREFIX + r')?(\:)(' + PN_LOCAL + r')?',
+             bygroups(Name.Namespace, Punctuation, Name.Tag)),
+
+            # BlankNodeLabel
+            (r'(_)(:)([' + PN_CHARS_U_GRP + r'0-9]([' + PN_CHARS_GRP + r'.]*' + PN_CHARS + ')?)',
+             bygroups(Name.Namespace, Punctuation, Name.Tag)),
+
+            # Comment
+            (r'#[^\n]+', Comment),
+
+            (r'\b(true|false)\b', Literal),
+            (r'[+\-]?\d*\.\d+', Number.Float),
+            (r'[+\-]?\d*(:?\.\d+)?E[+\-]?\d+', Number.Float),
+            (r'[+\-]?\d+', Number.Integer),
+            (r'[\[\](){}.;,:^]', Punctuation),
+
+            (r'"""', String, 'triple-double-quoted-string'),
+            (r'"', String, 'single-double-quoted-string'),
+            (r"'''", String, 'triple-single-quoted-string'),
+            (r"'", String, 'single-single-quoted-string'),
+        ],
+        'triple-double-quoted-string': [
+            (r'"""', String, 'end-of-string'),
+            (r'[^\\]+(?=""")', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-double-quoted-string': [
+            (r'"', String, 'end-of-string'),
+            (r'[^"\\\n]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'triple-single-quoted-string': [
+            (r"'''", String, 'end-of-string'),
+            (r"[^\\]+(?=''')", String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-single-quoted-string': [
+            (r"'", String, 'end-of-string'),
+            (r"[^'\\\n]+", String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'string-escape': [
+            (r'.', String, '#pop'),
+        ],
+        'end-of-string': [
+            (r'(@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)',
+             bygroups(Operator, Generic.Emph), '#pop:2'),
+
+            (r'(\^\^){IRIREF}'.format(**patterns), bygroups(Operator, Generic.Emph), '#pop:2'),
+
+            default('#pop:2'),
+
+        ],
+    }
+
+    # Turtle and Tera Term macro files share the same file extension
+    # but each has a recognizable and distinct syntax.
+    def analyse_text(text):
+        for t in ('@base ', 'BASE ', '@prefix ', 'PREFIX '):
+            if re.search(rf'^\s*{t}', text):
+                return 0.80
+
+
+class ShExCLexer(RegexLexer):
+    """
+    Lexer for ShExC shape expressions language syntax.
+    """
+    name = 'ShExC'
+    aliases = ['shexc', 'shex']
+    filenames = ['*.shex']
+    mimetypes = ['text/shex']
+    url = 'https://shex.io/shex-semantics/#shexc'
+    version_added = ''
+
+    # character group definitions ::
+
+    PN_CHARS_BASE_GRP = ('a-zA-Z'
+                         '\u00c0-\u00d6'
+                         '\u00d8-\u00f6'
+                         '\u00f8-\u02ff'
+                         '\u0370-\u037d'
+                         '\u037f-\u1fff'
+                         '\u200c-\u200d'
+                         '\u2070-\u218f'
+                         '\u2c00-\u2fef'
+                         '\u3001-\ud7ff'
+                         '\uf900-\ufdcf'
+                         '\ufdf0-\ufffd')
+
+    PN_CHARS_U_GRP = (PN_CHARS_BASE_GRP + '_')
+
+    PN_CHARS_GRP = (PN_CHARS_U_GRP +
+                    r'\-' +
+                    r'0-9' +
+                    '\u00b7' +
+                    '\u0300-\u036f' +
+                    '\u203f-\u2040')
+
+    HEX_GRP = '0-9A-Fa-f'
+
+    PN_LOCAL_ESC_CHARS_GRP = r"_~.\-!$&'()*+,;=/?#@%"
+
+    # terminal productions ::
+
+    PN_CHARS_BASE = '[' + PN_CHARS_BASE_GRP + ']'
+
+    PN_CHARS_U = '[' + PN_CHARS_U_GRP + ']'
+
+    PN_CHARS = '[' + PN_CHARS_GRP + ']'
+
+    HEX = '[' + HEX_GRP + ']'
+
+    PN_LOCAL_ESC_CHARS = '[' + PN_LOCAL_ESC_CHARS_GRP + ']'
+
+    UCHAR_NO_BACKSLASH = '(?:u' + HEX + '{4}|U' + HEX + '{8})'
+
+    UCHAR = r'\\' + UCHAR_NO_BACKSLASH
+
+    IRIREF = r'<(?:[^\x00-\x20<>"{}|^`\\]|' + UCHAR + ')*>'
+
+    BLANK_NODE_LABEL = '_:[0-9' + PN_CHARS_U_GRP + '](?:[' + PN_CHARS_GRP + \
+                       '.]*' + PN_CHARS + ')?'
+
+    PN_PREFIX = PN_CHARS_BASE + '(?:[' + PN_CHARS_GRP + '.]*' + PN_CHARS + ')?'
+
+    PERCENT = '%' + HEX + HEX
+
+    PN_LOCAL_ESC = r'\\' + PN_LOCAL_ESC_CHARS
+
+    PLX = '(?:' + PERCENT + ')|(?:' + PN_LOCAL_ESC + ')'
+
+    PN_LOCAL = ('(?:[' + PN_CHARS_U_GRP + ':0-9' + ']|' + PLX + ')' +
+                '(?:(?:[' + PN_CHARS_GRP + '.:]|' + PLX + ')*(?:[' +
+                PN_CHARS_GRP + ':]|' + PLX + '))?')
+
+    EXPONENT = r'[eE][+-]?\d+'
+
+    # Lexer token definitions ::
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            # keywords ::
+            (r'(?i)(base|prefix|start|external|'
+             r'literal|iri|bnode|nonliteral|length|minlength|maxlength|'
+             r'mininclusive|minexclusive|maxinclusive|maxexclusive|'
+             r'totaldigits|fractiondigits|'
+             r'closed|extra)\b', Keyword),
+            (r'(a)\b', Keyword),
+            # IRIs ::
+            ('(' + IRIREF + ')', Name.Label),
+            # blank nodes ::
+            ('(' + BLANK_NODE_LABEL + ')', Name.Label),
+            # prefixed names ::
+            (r'(' + PN_PREFIX + r')?(\:)(' + PN_LOCAL + ')?',
+             bygroups(Name.Namespace, Punctuation, Name.Tag)),
+            # boolean literals ::
+            (r'(true|false)', Keyword.Constant),
+            # double literals ::
+            (r'[+\-]?(\d+\.\d*' + EXPONENT + r'|\.?\d+' + EXPONENT + ')', Number.Float),
+            # decimal literals ::
+            (r'[+\-]?(\d+\.\d*|\.\d+)', Number.Float),
+            # integer literals ::
+            (r'[+\-]?\d+', Number.Integer),
+            # operators ::
+            (r'[@|$&=*+?^\-~]', Operator),
+            # operator keywords ::
+            (r'(?i)(and|or|not)\b', Operator.Word),
+            # punctuation characters ::
+            (r'[(){}.;,:^\[\]]', Punctuation),
+            # line comments ::
+            (r'#[^\n]*', Comment),
+            # strings ::
+            (r'"""', String, 'triple-double-quoted-string'),
+            (r'"', String, 'single-double-quoted-string'),
+            (r"'''", String, 'triple-single-quoted-string'),
+            (r"'", String, 'single-single-quoted-string'),
+        ],
+        'triple-double-quoted-string': [
+            (r'"""', String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-double-quoted-string': [
+            (r'"', String, 'end-of-string'),
+            (r'[^"\\\n]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'triple-single-quoted-string': [
+            (r"'''", String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String.Escape, 'string-escape'),
+        ],
+        'single-single-quoted-string': [
+            (r"'", String, 'end-of-string'),
+            (r"[^'\\\n]+", String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'string-escape': [
+            (UCHAR_NO_BACKSLASH, String.Escape, '#pop'),
+            (r'.', String.Escape, '#pop'),
+        ],
+        'end-of-string': [
+            (r'(@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)',
+             bygroups(Operator, Name.Function), '#pop:2'),
+            (r'\^\^', Operator, '#pop:2'),
+            default('#pop:2'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/rebol.py b/.venv/Lib/site-packages/pygments/lexers/rebol.py
new file mode 100644 (file)
index 0000000..4b37a74
--- /dev/null
@@ -0,0 +1,419 @@
+"""
+    pygments.lexers.rebol
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the REBOL and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Generic, Whitespace
+
+__all__ = ['RebolLexer', 'RedLexer']
+
+
+class RebolLexer(RegexLexer):
+    """
+    A REBOL lexer.
+    """
+    name = 'REBOL'
+    aliases = ['rebol']
+    filenames = ['*.r', '*.r3', '*.reb']
+    mimetypes = ['text/x-rebol']
+    url = 'http://www.rebol.com'
+    version_added = '1.1'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    escape_re = r'(?:\^\([0-9a-f]{1,4}\)*)'
+
+    def word_callback(lexer, match):
+        word = match.group()
+
+        if re.match(".*:$", word):
+            yield match.start(), Generic.Subheading, word
+        elif re.match(
+            r'(native|alias|all|any|as-string|as-binary|bind|bound\?|case|'
+            r'catch|checksum|comment|debase|dehex|exclude|difference|disarm|'
+            r'either|else|enbase|foreach|remove-each|form|free|get|get-env|if|'
+            r'in|intersect|loop|minimum-of|maximum-of|mold|new-line|'
+            r'new-line\?|not|now|prin|print|reduce|compose|construct|repeat|'
+            r'reverse|save|script\?|set|shift|switch|throw|to-hex|trace|try|'
+            r'type\?|union|unique|unless|unprotect|unset|until|use|value\?|'
+            r'while|compress|decompress|secure|open|close|read|read-io|'
+            r'write-io|write|update|query|wait|input\?|exp|log-10|log-2|'
+            r'log-e|square-root|cosine|sine|tangent|arccosine|arcsine|'
+            r'arctangent|protect|lowercase|uppercase|entab|detab|connected\?|'
+            r'browse|launch|stats|get-modes|set-modes|to-local-file|'
+            r'to-rebol-file|encloak|decloak|create-link|do-browser|bind\?|'
+            r'hide|draw|show|size-text|textinfo|offset-to-caret|'
+            r'caret-to-offset|local-request-file|rgb-to-hsv|hsv-to-rgb|'
+            r'crypt-strength\?|dh-make-key|dh-generate-key|dh-compute-key|'
+            r'dsa-make-key|dsa-generate-key|dsa-make-signature|'
+            r'dsa-verify-signature|rsa-make-key|rsa-generate-key|'
+            r'rsa-encrypt)$', word):
+            yield match.start(), Name.Builtin, word
+        elif re.match(
+            r'(add|subtract|multiply|divide|remainder|power|and~|or~|xor~|'
+            r'minimum|maximum|negate|complement|absolute|random|head|tail|'
+            r'next|back|skip|at|pick|first|second|third|fourth|fifth|sixth|'
+            r'seventh|eighth|ninth|tenth|last|path|find|select|make|to|copy\*|'
+            r'insert|remove|change|poke|clear|trim|sort|min|max|abs|cp|'
+            r'copy)$', word):
+            yield match.start(), Name.Function, word
+        elif re.match(
+            r'(error|source|input|license|help|install|echo|Usage|with|func|'
+            r'throw-on-error|function|does|has|context|probe|\?\?|as-pair|'
+            r'mod|modulo|round|repend|about|set-net|append|join|rejoin|reform|'
+            r'remold|charset|array|replace|move|extract|forskip|forall|alter|'
+            r'first+|also|take|for|forever|dispatch|attempt|what-dir|'
+            r'change-dir|clean-path|list-dir|dirize|rename|split-path|delete|'
+            r'make-dir|delete-dir|in-dir|confirm|dump-obj|upgrade|what|'
+            r'build-tag|process-source|build-markup|decode-cgi|read-cgi|'
+            r'write-user|save-user|set-user-name|protect-system|parse-xml|'
+            r'cvs-date|cvs-version|do-boot|get-net-info|desktop|layout|'
+            r'scroll-para|get-face|alert|set-face|uninstall|unfocus|'
+            r'request-dir|center-face|do-events|net-error|decode-url|'
+            r'parse-header|parse-header-date|parse-email-addrs|import-email|'
+            r'send|build-attach-body|resend|show-popup|hide-popup|open-events|'
+            r'find-key-face|do-face|viewtop|confine|find-window|'
+            r'insert-event-func|remove-event-func|inform|dump-pane|dump-face|'
+            r'flag-face|deflag-face|clear-fields|read-net|vbug|path-thru|'
+            r'read-thru|load-thru|do-thru|launch-thru|load-image|'
+            r'request-download|do-face-alt|set-font|set-para|get-style|'
+            r'set-style|make-face|stylize|choose|hilight-text|hilight-all|'
+            r'unlight-text|focus|scroll-drag|clear-face|reset-face|scroll-face|'
+            r'resize-face|load-stock|load-stock-block|notify|request|flash|'
+            r'request-color|request-pass|request-text|request-list|'
+            r'request-date|request-file|dbug|editor|link-relative-path|'
+            r'emailer|parse-error)$', word):
+            yield match.start(), Keyword.Namespace, word
+        elif re.match(
+            r'(halt|quit|do|load|q|recycle|call|run|ask|parse|view|unview|'
+            r'return|exit|break)$', word):
+            yield match.start(), Name.Exception, word
+        elif re.match('REBOL$', word):
+            yield match.start(), Generic.Heading, word
+        elif re.match("to-.*", word):
+            yield match.start(), Keyword, word
+        elif re.match(r'(\+|-|\*|/|//|\*\*|and|or|xor|=\?|=|==|<>|<|>|<=|>=)$',
+                      word):
+            yield match.start(), Operator, word
+        elif re.match(r".*\?$", word):
+            yield match.start(), Keyword, word
+        elif re.match(r".*\!$", word):
+            yield match.start(), Keyword.Type, word
+        elif re.match("'.*", word):
+            yield match.start(), Name.Variable.Instance, word  # lit-word
+        elif re.match("#.*", word):
+            yield match.start(), Name.Label, word  # issue
+        elif re.match("%.*", word):
+            yield match.start(), Name.Decorator, word  # file
+        else:
+            yield match.start(), Name.Variable, word
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'#"', String.Char, 'char'),
+            (r'#\{[0-9a-f]*\}', Number.Hex),
+            (r'2#\{', Number.Hex, 'bin2'),
+            (r'64#\{[0-9a-z+/=\s]*\}', Number.Hex),
+            (r'"', String, 'string'),
+            (r'\{', String, 'string2'),
+            (r';#+.*\n', Comment.Special),
+            (r';\*+.*\n', Comment.Preproc),
+            (r';.*\n', Comment),
+            (r'%"', Name.Decorator, 'stringFile'),
+            (r'%[^(^{")\s\[\]]+', Name.Decorator),
+            (r'[+-]?([a-z]{1,3})?\$\d+(\.\d+)?', Number.Float),  # money
+            (r'[+-]?\d+\:\d+(\:\d+)?(\.\d+)?', String.Other),    # time
+            (r'\d+[\-/][0-9a-z]+[\-/]\d+(\/\d+\:\d+((\:\d+)?'
+             r'([.\d+]?([+-]?\d+:\d+)?)?)?)?', String.Other),   # date
+            (r'\d+(\.\d+)+\.\d+', Keyword.Constant),             # tuple
+            (r'\d+X\d+', Keyword.Constant),                   # pair
+            (r'[+-]?\d+(\'\d+)?([.,]\d*)?E[+-]?\d+', Number.Float),
+            (r'[+-]?\d+(\'\d+)?[.,]\d*', Number.Float),
+            (r'[+-]?\d+(\'\d+)?', Number),
+            (r'[\[\]()]', Generic.Strong),
+            (r'[a-z]+[^(^{"\s:)]*://[^(^{"\s)]*', Name.Decorator),  # url
+            (r'mailto:[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),  # url
+            (r'[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),         # email
+            (r'comment\s"', Comment, 'commentString1'),
+            (r'comment\s\{', Comment, 'commentString2'),
+            (r'comment\s\[', Comment, 'commentBlock'),
+            (r'comment\s[^(\s{"\[]+', Comment),
+            (r'/[^(^{")\s/[\]]*', Name.Attribute),
+            (r'([^(^{")\s/[\]]+)(?=[:({"\s/\[\]])', word_callback),
+            (r'<[\w:.-]*>', Name.Tag),
+            (r'<[^(<>\s")]+', Name.Tag, 'tag'),
+            (r'([^(^{")\s]+)', Text),
+        ],
+        'string': [
+            (r'[^(^")]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'"', String, '#pop'),
+        ],
+        'string2': [
+            (r'[^(^{})]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'\{', String, '#push'),
+            (r'\}', String, '#pop'),
+        ],
+        'stringFile': [
+            (r'[^(^")]+', Name.Decorator),
+            (escape_re, Name.Decorator),
+            (r'\^.', Name.Decorator),
+            (r'"', Name.Decorator, '#pop'),
+        ],
+        'char': [
+            (escape_re + '"', String.Char, '#pop'),
+            (r'\^."', String.Char, '#pop'),
+            (r'."', String.Char, '#pop'),
+        ],
+        'tag': [
+            (escape_re, Name.Tag),
+            (r'"', Name.Tag, 'tagString'),
+            (r'[^(<>\r\n")]+', Name.Tag),
+            (r'>', Name.Tag, '#pop'),
+        ],
+        'tagString': [
+            (r'[^(^")]+', Name.Tag),
+            (escape_re, Name.Tag),
+            (r'[(|)]+', Name.Tag),
+            (r'\^.', Name.Tag),
+            (r'"', Name.Tag, '#pop'),
+        ],
+        'tuple': [
+            (r'(\d+\.)+', Keyword.Constant),
+            (r'\d+', Keyword.Constant, '#pop'),
+        ],
+        'bin2': [
+            (r'\s+', Number.Hex),
+            (r'([01]\s*){8}', Number.Hex),
+            (r'\}', Number.Hex, '#pop'),
+        ],
+        'commentString1': [
+            (r'[^(^")]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'"', Comment, '#pop'),
+        ],
+        'commentString2': [
+            (r'[^(^{})]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'\{', Comment, '#push'),
+            (r'\}', Comment, '#pop'),
+        ],
+        'commentBlock': [
+            (r'\[', Comment, '#push'),
+            (r'\]', Comment, '#pop'),
+            (r'"', Comment, "commentString1"),
+            (r'\{', Comment, "commentString2"),
+            (r'[^(\[\]"{)]+', Comment),
+        ],
+    }
+
+    def analyse_text(text):
+        """
+        Check if code contains REBOL header and so it probably not R code
+        """
+        if re.match(r'^\s*REBOL\s*\[', text, re.IGNORECASE):
+            # The code starts with REBOL header
+            return 1.0
+        elif re.search(r'\s*REBOL\s*\[', text, re.IGNORECASE):
+            # The code contains REBOL header but also some text before it
+            return 0.5
+
+
+class RedLexer(RegexLexer):
+    """
+    A Red-language lexer.
+    """
+    name = 'Red'
+    aliases = ['red', 'red/system']
+    filenames = ['*.red', '*.reds']
+    mimetypes = ['text/x-red', 'text/x-red-system']
+    url = 'https://www.red-lang.org'
+    version_added = '2.0'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    escape_re = r'(?:\^\([0-9a-f]{1,4}\)*)'
+
+    def word_callback(lexer, match):
+        word = match.group()
+
+        if re.match(".*:$", word):
+            yield match.start(), Generic.Subheading, word
+        elif re.match(r'(if|unless|either|any|all|while|until|loop|repeat|'
+                      r'foreach|forall|func|function|does|has|switch|'
+                      r'case|reduce|compose|get|set|print|prin|equal\?|'
+                      r'not-equal\?|strict-equal\?|lesser\?|greater\?|lesser-or-equal\?|'
+                      r'greater-or-equal\?|same\?|not|type\?|stats|'
+                      r'bind|union|replace|charset|routine)$', word):
+            yield match.start(), Name.Builtin, word
+        elif re.match(r'(make|random|reflect|to|form|mold|absolute|add|divide|multiply|negate|'
+                      r'power|remainder|round|subtract|even\?|odd\?|and~|complement|or~|xor~|'
+                      r'append|at|back|change|clear|copy|find|head|head\?|index\?|insert|'
+                      r'length\?|next|pick|poke|remove|reverse|select|sort|skip|swap|tail|tail\?|'
+                      r'take|trim|create|close|delete|modify|open|open\?|query|read|rename|'
+                      r'update|write)$', word):
+            yield match.start(), Name.Function, word
+        elif re.match(r'(yes|on|no|off|true|false|tab|cr|lf|newline|escape|slash|sp|space|null|'
+                      r'none|crlf|dot|null-byte)$', word):
+            yield match.start(), Name.Builtin.Pseudo, word
+        elif re.match(r'(#system-global|#include|#enum|#define|#either|#if|#import|#export|'
+                      r'#switch|#default|#get-definition)$', word):
+            yield match.start(), Keyword.Namespace, word
+        elif re.match(r'(system|halt|quit|quit-return|do|load|q|recycle|call|run|ask|parse|'
+                      r'raise-error|return|exit|break|alias|push|pop|probe|\?\?|spec-of|body-of|'
+                      r'quote|forever)$', word):
+            yield match.start(), Name.Exception, word
+        elif re.match(r'(action\?|block\?|char\?|datatype\?|file\?|function\?|get-path\?|zero\?|'
+                      r'get-word\?|integer\?|issue\?|lit-path\?|lit-word\?|logic\?|native\?|'
+                      r'op\?|paren\?|path\?|refinement\?|set-path\?|set-word\?|string\?|unset\?|'
+                      r'any-struct\?|none\?|word\?|any-series\?)$', word):
+            yield match.start(), Keyword, word
+        elif re.match(r'(JNICALL|stdcall|cdecl|infix)$', word):
+            yield match.start(), Keyword.Namespace, word
+        elif re.match("to-.*", word):
+            yield match.start(), Keyword, word
+        elif re.match(r'(\+|-\*\*|-|\*\*|//|/|\*|and|or|xor|=\?|===|==|=|<>|<=|>=|'
+                      r'<<<|>>>|<<|>>|<|>%)$', word):
+            yield match.start(), Operator, word
+        elif re.match(r".*\!$", word):
+            yield match.start(), Keyword.Type, word
+        elif re.match("'.*", word):
+            yield match.start(), Name.Variable.Instance, word  # lit-word
+        elif re.match("#.*", word):
+            yield match.start(), Name.Label, word  # issue
+        elif re.match("%.*", word):
+            yield match.start(), Name.Decorator, word  # file
+        elif re.match(":.*", word):
+            yield match.start(), Generic.Subheading, word  # get-word
+        else:
+            yield match.start(), Name.Variable, word
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'#"', String.Char, 'char'),
+            (r'#\{[0-9a-f\s]*\}', Number.Hex),
+            (r'2#\{', Number.Hex, 'bin2'),
+            (r'64#\{[0-9a-z+/=\s]*\}', Number.Hex),
+            (r'([0-9a-f]+)(h)((\s)|(?=[\[\]{}"()]))',
+             bygroups(Number.Hex, Name.Variable, Whitespace)),
+            (r'"', String, 'string'),
+            (r'\{', String, 'string2'),
+            (r';#+.*\n', Comment.Special),
+            (r';\*+.*\n', Comment.Preproc),
+            (r';.*\n', Comment),
+            (r'%"', Name.Decorator, 'stringFile'),
+            (r'%[^(^{")\s\[\]]+', Name.Decorator),
+            (r'[+-]?([a-z]{1,3})?\$\d+(\.\d+)?', Number.Float),  # money
+            (r'[+-]?\d+\:\d+(\:\d+)?(\.\d+)?', String.Other),    # time
+            (r'\d+[\-/][0-9a-z]+[\-/]\d+(/\d+:\d+((:\d+)?'
+             r'([\.\d+]?([+-]?\d+:\d+)?)?)?)?', String.Other),   # date
+            (r'\d+(\.\d+)+\.\d+', Keyword.Constant),             # tuple
+            (r'\d+X\d+', Keyword.Constant),                   # pair
+            (r'[+-]?\d+(\'\d+)?([.,]\d*)?E[+-]?\d+', Number.Float),
+            (r'[+-]?\d+(\'\d+)?[.,]\d*', Number.Float),
+            (r'[+-]?\d+(\'\d+)?', Number),
+            (r'[\[\]()]', Generic.Strong),
+            (r'[a-z]+[^(^{"\s:)]*://[^(^{"\s)]*', Name.Decorator),  # url
+            (r'mailto:[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),  # url
+            (r'[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),         # email
+            (r'comment\s"', Comment, 'commentString1'),
+            (r'comment\s\{', Comment, 'commentString2'),
+            (r'comment\s\[', Comment, 'commentBlock'),
+            (r'comment\s[^(\s{"\[]+', Comment),
+            (r'/[^(^{^")\s/[\]]*', Name.Attribute),
+            (r'([^(^{^")\s/[\]]+)(?=[:({"\s/\[\]])', word_callback),
+            (r'<[\w:.-]*>', Name.Tag),
+            (r'<[^(<>\s")]+', Name.Tag, 'tag'),
+            (r'([^(^{")\s]+)', Text),
+        ],
+        'string': [
+            (r'[^(^")]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'"', String, '#pop'),
+        ],
+        'string2': [
+            (r'[^(^{})]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'\{', String, '#push'),
+            (r'\}', String, '#pop'),
+        ],
+        'stringFile': [
+            (r'[^(^")]+', Name.Decorator),
+            (escape_re, Name.Decorator),
+            (r'\^.', Name.Decorator),
+            (r'"', Name.Decorator, '#pop'),
+        ],
+        'char': [
+            (escape_re + '"', String.Char, '#pop'),
+            (r'\^."', String.Char, '#pop'),
+            (r'."', String.Char, '#pop'),
+        ],
+        'tag': [
+            (escape_re, Name.Tag),
+            (r'"', Name.Tag, 'tagString'),
+            (r'[^(<>\r\n")]+', Name.Tag),
+            (r'>', Name.Tag, '#pop'),
+        ],
+        'tagString': [
+            (r'[^(^")]+', Name.Tag),
+            (escape_re, Name.Tag),
+            (r'[(|)]+', Name.Tag),
+            (r'\^.', Name.Tag),
+            (r'"', Name.Tag, '#pop'),
+        ],
+        'tuple': [
+            (r'(\d+\.)+', Keyword.Constant),
+            (r'\d+', Keyword.Constant, '#pop'),
+        ],
+        'bin2': [
+            (r'\s+', Number.Hex),
+            (r'([01]\s*){8}', Number.Hex),
+            (r'\}', Number.Hex, '#pop'),
+        ],
+        'commentString1': [
+            (r'[^(^")]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'"', Comment, '#pop'),
+        ],
+        'commentString2': [
+            (r'[^(^{})]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'\{', Comment, '#push'),
+            (r'\}', Comment, '#pop'),
+        ],
+        'commentBlock': [
+            (r'\[', Comment, '#push'),
+            (r'\]', Comment, '#pop'),
+            (r'"', Comment, "commentString1"),
+            (r'\{', Comment, "commentString2"),
+            (r'[^(\[\]"{)]+', Comment),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/rego.py b/.venv/Lib/site-packages/pygments/lexers/rego.py
new file mode 100644 (file)
index 0000000..6f2e3e9
--- /dev/null
@@ -0,0 +1,57 @@
+"""
+    pygments.lexers.rego
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Rego policy languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Operator, Keyword, Name, String, Number, Punctuation, Whitespace
+
+class RegoLexer(RegexLexer):
+    """
+    For Rego source.
+    """
+    name = 'Rego'
+    url = 'https://www.openpolicyagent.org/docs/latest/policy-language/'
+    filenames = ['*.rego']
+    aliases = ['rego']
+    mimetypes = ['text/x-rego']
+    version_added = '2.19'
+
+    reserved_words = (
+        'as', 'contains', 'data', 'default', 'else', 'every', 'false',
+        'if', 'in', 'import', 'package', 'not', 'null',
+        'some', 'true', 'with'
+    )
+
+    builtins = (
+        # https://www.openpolicyagent.org/docs/latest/philosophy/#the-opa-document-model
+        'data',  # Global variable for accessing base and virtual documents
+        'input', # Represents synchronously pushed base documents
+    )
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'#.*?$', Comment.Single),
+            (words(reserved_words, suffix=r'\b'), Keyword),
+            (words(builtins, suffix=r'\b'), Name.Builtin),
+            (r'[a-zA-Z_][a-zA-Z0-9_]*', Name),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r'`[^`]*`', String.Backtick),
+            (r'-?\d+(\.\d+)?', Number),
+            (r'(==|!=|<=|>=|:=)', Operator),  # Compound operators
+            (r'[=<>+\-*/%&|]', Operator),     # Single-character operators
+            (r'[\[\]{}(),.:;]', Punctuation),
+        ]
+    }
+
+__all__ = ['RegoLexer']
+
+
+
diff --git a/.venv/Lib/site-packages/pygments/lexers/resource.py b/.venv/Lib/site-packages/pygments/lexers/resource.py
new file mode 100644 (file)
index 0000000..9593c21
--- /dev/null
@@ -0,0 +1,83 @@
+"""
+    pygments.lexers.resource
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for resource definition files.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Comment, String, Number, Operator, Text, \
+    Keyword, Name
+
+__all__ = ['ResourceLexer']
+
+
+class ResourceLexer(RegexLexer):
+    """Lexer for ICU Resource bundles.
+    """
+    name = 'ResourceBundle'
+    aliases = ['resourcebundle', 'resource']
+    filenames = []
+    url = 'https://unicode-org.github.io/icu/userguide/locale/resources.html'
+    version_added = '2.0'
+
+    _types = (':table', ':array', ':string', ':bin', ':import', ':intvector',
+              ':int', ':alias')
+
+    flags = re.MULTILINE | re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'//.*?$', Comment),
+            (r'"', String, 'string'),
+            (r'-?\d+', Number.Integer),
+            (r'[,{}]', Operator),
+            (r'([^\s{{:]+)(\s*)({}?)'.format('|'.join(_types)),
+             bygroups(Name, Text, Keyword)),
+            (r'\s+', Text),
+            (words(_types), Keyword),
+        ],
+        'string': [
+            (r'(\\x[0-9a-f]{2}|\\u[0-9a-f]{4}|\\U00[0-9a-f]{6}|'
+             r'\\[0-7]{1,3}|\\c.|\\[abtnvfre\'"?\\]|\\\{|[^"{\\])+', String),
+            (r'\{', String.Escape, 'msgname'),
+            (r'"', String, '#pop')
+        ],
+        'msgname': [
+            (r'([^{},]+)(\s*)', bygroups(Name, String.Escape), ('#pop', 'message'))
+        ],
+        'message': [
+            (r'\{', String.Escape, 'msgname'),
+            (r'\}', String.Escape, '#pop'),
+            (r'(,)(\s*)([a-z]+)(\s*\})',
+             bygroups(Operator, String.Escape, Keyword, String.Escape), '#pop'),
+            (r'(,)(\s*)([a-z]+)(\s*)(,)(\s*)(offset)(\s*)(:)(\s*)(-?\d+)(\s*)',
+             bygroups(Operator, String.Escape, Keyword, String.Escape, Operator,
+                      String.Escape, Operator.Word, String.Escape, Operator,
+                      String.Escape, Number.Integer, String.Escape), 'choice'),
+            (r'(,)(\s*)([a-z]+)(\s*)(,)(\s*)',
+             bygroups(Operator, String.Escape, Keyword, String.Escape, Operator,
+                      String.Escape), 'choice'),
+            (r'\s+', String.Escape)
+        ],
+        'choice': [
+            (r'(=|<|>|<=|>=|!=)(-?\d+)(\s*\{)',
+             bygroups(Operator, Number.Integer, String.Escape), 'message'),
+            (r'([a-z]+)(\s*\{)', bygroups(Keyword.Type, String.Escape), 'str'),
+            (r'\}', String.Escape, ('#pop', '#pop')),
+            (r'\s+', String.Escape)
+        ],
+        'str': [
+            (r'\}', String.Escape, '#pop'),
+            (r'\{', String.Escape, 'msgname'),
+            (r'[^{}]+', String)
+        ]
+    }
+
+    def analyse_text(text):
+        if text.startswith('root:table'):
+            return 1.0
diff --git a/.venv/Lib/site-packages/pygments/lexers/ride.py b/.venv/Lib/site-packages/pygments/lexers/ride.py
new file mode 100644 (file)
index 0000000..4d60c29
--- /dev/null
@@ -0,0 +1,138 @@
+"""
+    pygments.lexers.ride
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Ride programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include
+from pygments.token import Comment, Keyword, Name, Number, Punctuation, \
+    String, Text
+
+__all__ = ['RideLexer']
+
+
+class RideLexer(RegexLexer):
+    """
+    For Ride source code.
+    """
+
+    name = 'Ride'
+    aliases = ['ride']
+    filenames = ['*.ride']
+    mimetypes = ['text/x-ride']
+    url = 'https://docs.waves.tech/en/ride'
+    version_added = '2.6'
+
+    validName = r'[a-zA-Z_][a-zA-Z0-9_\']*'
+
+    builtinOps = (
+        '||', '|', '>=', '>', '==', '!',
+        '=', '<=', '<', '::', ':+', ':', '!=', '/',
+        '.', '=>', '-', '+', '*', '&&', '%', '++',
+    )
+
+    globalVariablesName = (
+        'NOALG', 'MD5', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512',
+        'SHA3224', 'SHA3256', 'SHA3384', 'SHA3512', 'nil', 'this', 'unit',
+        'height', 'lastBlock', 'Buy', 'Sell', 'CEILING', 'FLOOR', 'DOWN',
+        'HALFDOWN', 'HALFEVEN', 'HALFUP', 'UP',
+    )
+
+    typesName = (
+        'Unit', 'Int', 'Boolean', 'ByteVector', 'String', 'Address', 'Alias',
+        'Transfer', 'AssetPair', 'DataEntry', 'Order', 'Transaction',
+        'GenesisTransaction', 'PaymentTransaction', 'ReissueTransaction',
+        'BurnTransaction', 'MassTransferTransaction', 'ExchangeTransaction',
+        'TransferTransaction', 'SetAssetScriptTransaction',
+        'InvokeScriptTransaction', 'IssueTransaction', 'LeaseTransaction',
+        'LeaseCancelTransaction', 'CreateAliasTransaction',
+        'SetScriptTransaction', 'SponsorFeeTransaction', 'DataTransaction',
+        'WriteSet', 'AttachedPayment', 'ScriptTransfer', 'TransferSet',
+        'ScriptResult', 'Invocation', 'Asset', 'BlockInfo', 'Issue', 'Reissue',
+        'Burn', 'NoAlg', 'Md5', 'Sha1', 'Sha224', 'Sha256', 'Sha384', 'Sha512',
+        'Sha3224', 'Sha3256', 'Sha3384', 'Sha3512', 'BinaryEntry',
+        'BooleanEntry', 'IntegerEntry', 'StringEntry', 'List', 'Ceiling',
+        'Down', 'Floor', 'HalfDown', 'HalfEven', 'HalfUp', 'Up',
+    )
+
+    functionsName = (
+        'fraction', 'size', 'toBytes', 'take', 'drop', 'takeRight', 'dropRight',
+        'toString', 'isDefined', 'extract', 'throw', 'getElement', 'value',
+        'cons', 'toUtf8String', 'toInt', 'indexOf', 'lastIndexOf', 'split',
+        'parseInt', 'parseIntValue', 'keccak256', 'blake2b256', 'sha256',
+        'sigVerify', 'toBase58String', 'fromBase58String', 'toBase64String',
+        'fromBase64String', 'transactionById', 'transactionHeightById',
+        'getInteger', 'getBoolean', 'getBinary', 'getString',
+        'addressFromPublicKey', 'addressFromString', 'addressFromRecipient',
+        'assetBalance', 'wavesBalance', 'getIntegerValue', 'getBooleanValue',
+        'getBinaryValue', 'getStringValue', 'addressFromStringValue',
+        'assetInfo', 'rsaVerify', 'checkMerkleProof', 'median',
+        'valueOrElse', 'valueOrErrorMessage', 'contains', 'log', 'pow',
+        'toBase16String', 'fromBase16String', 'blockInfoByHeight',
+        'transferTransactionById',
+    )
+
+    reservedWords = words((
+        'match', 'case', 'else', 'func', 'if',
+        'let', 'then', '@Callable', '@Verifier',
+    ), suffix=r'\b')
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'#.*', Comment.Single),
+            # Whitespace
+            (r'\s+', Text),
+            # Strings
+            (r'"', String, 'doublequote'),
+            (r'utf8\'', String, 'utf8quote'),
+            (r'base(58|64|16)\'', String, 'singlequote'),
+            # Keywords
+            (reservedWords, Keyword.Reserved),
+            (r'\{-#.*?#-\}', Keyword.Reserved),
+            (r'FOLD<\d+>', Keyword.Reserved),
+            # Types
+            (words(typesName), Keyword.Type),
+            # Main
+            # (specialName, Keyword.Reserved),
+            # Prefix Operators
+            (words(builtinOps, prefix=r'\(', suffix=r'\)'), Name.Function),
+            # Infix Operators
+            (words(builtinOps), Name.Function),
+            (words(globalVariablesName), Name.Function),
+            (words(functionsName), Name.Function),
+            # Numbers
+            include('numbers'),
+            # Variable Names
+            (validName, Name.Variable),
+            # Parens
+            (r'[,()\[\]{}]', Punctuation),
+        ],
+
+        'doublequote': [
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\[nrfvb\\"]', String.Escape),
+            (r'[^"]', String),
+            (r'"', String, '#pop'),
+        ],
+
+        'utf8quote': [
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\[nrfvb\\\']', String.Escape),
+            (r'[^\']', String),
+            (r'\'', String, '#pop'),
+        ],
+
+        'singlequote': [
+            (r'[^\']', String),
+            (r'\'', String, '#pop'),
+        ],
+
+        'numbers': [
+            (r'_?\d+', Number.Integer),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/rita.py b/.venv/Lib/site-packages/pygments/lexers/rita.py
new file mode 100644 (file)
index 0000000..536aaff
--- /dev/null
@@ -0,0 +1,42 @@
+"""
+    pygments.lexers.rita
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for RITA language
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Comment, Operator, Keyword, Name, Literal, \
+    Punctuation, Whitespace
+
+__all__ = ['RitaLexer']
+
+
+class RitaLexer(RegexLexer):
+    """
+    Lexer for RITA.
+    """
+    name = 'Rita'
+    url = 'https://github.com/zaibacu/rita-dsl'
+    filenames = ['*.rita']
+    aliases = ['rita']
+    mimetypes = ['text/rita']
+    version_added = '2.11'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'#(.*?)\n', Comment.Single),
+            (r'@(.*?)\n', Operator),  # Yes, whole line as an operator
+            (r'"(\w|\d|\s|(\\")|[\'_\-./,\?\!])+?"', Literal),
+            (r'\'(\w|\d|\s|(\\\')|["_\-./,\?\!])+?\'', Literal),
+            (r'([A-Z_]+)', Keyword),
+            (r'([a-z0-9_]+)', Name),
+            (r'((->)|[!?+*|=])', Operator),
+            (r'[\(\),\{\}]', Punctuation)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/rnc.py b/.venv/Lib/site-packages/pygments/lexers/rnc.py
new file mode 100644 (file)
index 0000000..b7a06bb
--- /dev/null
@@ -0,0 +1,66 @@
+"""
+    pygments.lexers.rnc
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Relax-NG Compact syntax
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Punctuation
+
+__all__ = ['RNCCompactLexer']
+
+
+class RNCCompactLexer(RegexLexer):
+    """
+    For RelaxNG-compact syntax.
+    """
+
+    name = 'Relax-NG Compact'
+    url = 'http://relaxng.org'
+    aliases = ['rng-compact', 'rnc']
+    filenames = ['*.rnc']
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            (r'namespace\b', Keyword.Namespace),
+            (r'(?:default|datatypes)\b', Keyword.Declaration),
+            (r'##.*$', Comment.Preproc),
+            (r'#.*$', Comment.Single),
+            (r'"[^"]*"', String.Double),
+            # TODO single quoted strings and escape sequences outside of
+            # double-quoted strings
+            (r'(?:element|attribute|mixed)\b', Keyword.Declaration, 'variable'),
+            (r'(text\b|xsd:[^ ]+)', Keyword.Type, 'maybe_xsdattributes'),
+            (r'[,?&*=|~]|>>', Operator),
+            (r'[(){}]', Punctuation),
+            (r'.', Text),
+        ],
+
+        # a variable has been declared using `element` or `attribute`
+        'variable': [
+            (r'[^{]+', Name.Variable),
+            (r'\{', Punctuation, '#pop'),
+        ],
+
+        # after an xsd:<datatype> declaration there may be attributes
+        'maybe_xsdattributes': [
+            (r'\{', Punctuation, 'xsdattributes'),
+            (r'\}', Punctuation, '#pop'),
+            (r'.', Text),
+        ],
+
+        # attributes take the form { key1 = value1 key2 = value2 ... }
+        'xsdattributes': [
+            (r'[^ =}]', Name.Attribute),
+            (r'=', Operator),
+            (r'"[^"]*"', String.Double),
+            (r'\}', Punctuation, '#pop'),
+            (r'.', Text),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/roboconf.py b/.venv/Lib/site-packages/pygments/lexers/roboconf.py
new file mode 100644 (file)
index 0000000..31adba9
--- /dev/null
@@ -0,0 +1,81 @@
+"""
+    pygments.lexers.roboconf
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Roboconf DSL.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, re
+from pygments.token import Text, Operator, Keyword, Name, Comment
+
+__all__ = ['RoboconfGraphLexer', 'RoboconfInstancesLexer']
+
+
+class RoboconfGraphLexer(RegexLexer):
+    """
+    Lexer for Roboconf graph files.
+    """
+    name = 'Roboconf Graph'
+    aliases = ['roboconf-graph']
+    filenames = ['*.graph']
+    url = 'https://roboconf.github.io/en/user-guide/graph-definition.html'
+    version_added = '2.1'
+
+    flags = re.IGNORECASE | re.MULTILINE
+    tokens = {
+        'root': [
+            # Skip white spaces
+            (r'\s+', Text),
+
+            # There is one operator
+            (r'=', Operator),
+
+            # Keywords
+            (words(('facet', 'import'), suffix=r'\s*\b', prefix=r'\b'), Keyword),
+            (words((
+                'installer', 'extends', 'exports', 'imports', 'facets',
+                'children'), suffix=r'\s*:?', prefix=r'\b'), Name),
+
+            # Comments
+            (r'#.*\n', Comment),
+
+            # Default
+            (r'[^#]', Text),
+            (r'.*\n', Text)
+        ]
+    }
+
+
+class RoboconfInstancesLexer(RegexLexer):
+    """
+    Lexer for Roboconf instances files.
+    """
+    name = 'Roboconf Instances'
+    aliases = ['roboconf-instances']
+    filenames = ['*.instances']
+    url = 'https://roboconf.github.io'
+    version_added = '2.1'
+
+    flags = re.IGNORECASE | re.MULTILINE
+    tokens = {
+        'root': [
+
+            # Skip white spaces
+            (r'\s+', Text),
+
+            # Keywords
+            (words(('instance of', 'import'), suffix=r'\s*\b', prefix=r'\b'), Keyword),
+            (words(('name', 'count'), suffix=r's*:?', prefix=r'\b'), Name),
+            (r'\s*[\w.-]+\s*:', Name),
+
+            # Comments
+            (r'#.*\n', Comment),
+
+            # Default
+            (r'[^#]', Text),
+            (r'.*\n', Text)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/robotframework.py b/.venv/Lib/site-packages/pygments/lexers/robotframework.py
new file mode 100644 (file)
index 0000000..f92d567
--- /dev/null
@@ -0,0 +1,551 @@
+"""
+    pygments.lexers.robotframework
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Robot Framework.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+#  Copyright 2012 Nokia Siemens Networks Oyj
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+import re
+
+from pygments.lexer import Lexer
+from pygments.token import Token
+
+__all__ = ['RobotFrameworkLexer']
+
+
+HEADING = Token.Generic.Heading
+SETTING = Token.Keyword.Namespace
+IMPORT = Token.Name.Namespace
+TC_KW_NAME = Token.Generic.Subheading
+KEYWORD = Token.Name.Function
+ARGUMENT = Token.String
+VARIABLE = Token.Name.Variable
+COMMENT = Token.Comment
+SEPARATOR = Token.Punctuation
+SYNTAX = Token.Punctuation
+GHERKIN = Token.Generic.Emph
+ERROR = Token.Error
+
+
+def normalize(string, remove=''):
+    string = string.lower()
+    for char in remove + ' ':
+        if char in string:
+            string = string.replace(char, '')
+    return string
+
+
+class RobotFrameworkLexer(Lexer):
+    """
+    For Robot Framework test data.
+
+    Supports both space and pipe separated plain text formats.
+    """
+    name = 'RobotFramework'
+    url = 'http://robotframework.org'
+    aliases = ['robotframework']
+    filenames = ['*.robot', '*.resource']
+    mimetypes = ['text/x-robotframework']
+    version_added = '1.6'
+
+    def __init__(self, **options):
+        options['tabsize'] = 2
+        options['encoding'] = 'UTF-8'
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        row_tokenizer = RowTokenizer()
+        var_tokenizer = VariableTokenizer()
+        index = 0
+        for row in text.splitlines():
+            for value, token in row_tokenizer.tokenize(row):
+                for value, token in var_tokenizer.tokenize(value, token):
+                    if value:
+                        yield index, token, str(value)
+                        index += len(value)
+
+
+class VariableTokenizer:
+
+    def tokenize(self, string, token):
+        var = VariableSplitter(string, identifiers='$@%&')
+        if var.start < 0 or token in (COMMENT, ERROR):
+            yield string, token
+            return
+        for value, token in self._tokenize(var, string, token):
+            if value:
+                yield value, token
+
+    def _tokenize(self, var, string, orig_token):
+        before = string[:var.start]
+        yield before, orig_token
+        yield var.identifier + '{', SYNTAX
+        yield from self.tokenize(var.base, VARIABLE)
+        yield '}', SYNTAX
+        if var.index is not None:
+            yield '[', SYNTAX
+            yield from self.tokenize(var.index, VARIABLE)
+            yield ']', SYNTAX
+        yield from self.tokenize(string[var.end:], orig_token)
+
+
+class RowTokenizer:
+
+    def __init__(self):
+        self._table = UnknownTable()
+        self._splitter = RowSplitter()
+        testcases = TestCaseTable()
+        settings = SettingTable(testcases.set_default_template)
+        variables = VariableTable()
+        keywords = KeywordTable()
+        self._tables = {'settings': settings, 'setting': settings,
+                        'metadata': settings,
+                        'variables': variables, 'variable': variables,
+                        'testcases': testcases, 'testcase': testcases,
+                        'tasks': testcases, 'task': testcases,
+                        'keywords': keywords, 'keyword': keywords,
+                        'userkeywords': keywords, 'userkeyword': keywords}
+
+    def tokenize(self, row):
+        commented = False
+        heading = False
+        for index, value in enumerate(self._splitter.split(row)):
+            # First value, and every second after that, is a separator.
+            index, separator = divmod(index-1, 2)
+            if value.startswith('#'):
+                commented = True
+            elif index == 0 and value.startswith('*'):
+                self._table = self._start_table(value)
+                heading = True
+            yield from self._tokenize(value, index, commented,
+                                      separator, heading)
+        self._table.end_row()
+
+    def _start_table(self, header):
+        name = normalize(header, remove='*')
+        return self._tables.get(name, UnknownTable())
+
+    def _tokenize(self, value, index, commented, separator, heading):
+        if commented:
+            yield value, COMMENT
+        elif separator:
+            yield value, SEPARATOR
+        elif heading:
+            yield value, HEADING
+        else:
+            yield from self._table.tokenize(value, index)
+
+
+class RowSplitter:
+    _space_splitter = re.compile('( {2,})')
+    _pipe_splitter = re.compile(r'((?:^| +)\|(?: +|$))')
+
+    def split(self, row):
+        splitter = (row.startswith('| ') and self._split_from_pipes
+                    or self._split_from_spaces)
+        yield from splitter(row)
+        yield '\n'
+
+    def _split_from_spaces(self, row):
+        yield ''  # Start with (pseudo)separator similarly as with pipes
+        yield from self._space_splitter.split(row)
+
+    def _split_from_pipes(self, row):
+        _, separator, rest = self._pipe_splitter.split(row, 1)
+        yield separator
+        while self._pipe_splitter.search(rest):
+            cell, separator, rest = self._pipe_splitter.split(rest, 1)
+            yield cell
+            yield separator
+        yield rest
+
+
+class Tokenizer:
+    _tokens = None
+
+    def __init__(self):
+        self._index = 0
+
+    def tokenize(self, value):
+        values_and_tokens = self._tokenize(value, self._index)
+        self._index += 1
+        if isinstance(values_and_tokens, type(Token)):
+            values_and_tokens = [(value, values_and_tokens)]
+        return values_and_tokens
+
+    def _tokenize(self, value, index):
+        index = min(index, len(self._tokens) - 1)
+        return self._tokens[index]
+
+    def _is_assign(self, value):
+        if value.endswith('='):
+            value = value[:-1].strip()
+        var = VariableSplitter(value, identifiers='$@&')
+        return var.start == 0 and var.end == len(value)
+
+
+class Comment(Tokenizer):
+    _tokens = (COMMENT,)
+
+
+class Setting(Tokenizer):
+    _tokens = (SETTING, ARGUMENT)
+    _keyword_settings = ('suitesetup', 'suiteprecondition', 'suiteteardown',
+                         'suitepostcondition', 'testsetup', 'tasksetup', 'testprecondition',
+                         'testteardown','taskteardown', 'testpostcondition', 'testtemplate', 'tasktemplate')
+    _import_settings = ('library', 'resource', 'variables')
+    _other_settings = ('documentation', 'metadata', 'forcetags', 'defaulttags',
+                       'testtimeout','tasktimeout')
+    _custom_tokenizer = None
+
+    def __init__(self, template_setter=None):
+        Tokenizer.__init__(self)
+        self._template_setter = template_setter
+
+    def _tokenize(self, value, index):
+        if index == 1 and self._template_setter:
+            self._template_setter(value)
+        if index == 0:
+            normalized = normalize(value)
+            if normalized in self._keyword_settings:
+                self._custom_tokenizer = KeywordCall(support_assign=False)
+            elif normalized in self._import_settings:
+                self._custom_tokenizer = ImportSetting()
+            elif normalized not in self._other_settings:
+                return ERROR
+        elif self._custom_tokenizer:
+            return self._custom_tokenizer.tokenize(value)
+        return Tokenizer._tokenize(self, value, index)
+
+
+class ImportSetting(Tokenizer):
+    _tokens = (IMPORT, ARGUMENT)
+
+
+class TestCaseSetting(Setting):
+    _keyword_settings = ('setup', 'precondition', 'teardown', 'postcondition',
+                         'template')
+    _import_settings = ()
+    _other_settings = ('documentation', 'tags', 'timeout')
+
+    def _tokenize(self, value, index):
+        if index == 0:
+            type = Setting._tokenize(self, value[1:-1], index)
+            return [('[', SYNTAX), (value[1:-1], type), (']', SYNTAX)]
+        return Setting._tokenize(self, value, index)
+
+
+class KeywordSetting(TestCaseSetting):
+    _keyword_settings = ('teardown',)
+    _other_settings = ('documentation', 'arguments', 'return', 'timeout', 'tags')
+
+
+class Variable(Tokenizer):
+    _tokens = (SYNTAX, ARGUMENT)
+
+    def _tokenize(self, value, index):
+        if index == 0 and not self._is_assign(value):
+            return ERROR
+        return Tokenizer._tokenize(self, value, index)
+
+
+class KeywordCall(Tokenizer):
+    _tokens = (KEYWORD, ARGUMENT)
+
+    def __init__(self, support_assign=True):
+        Tokenizer.__init__(self)
+        self._keyword_found = not support_assign
+        self._assigns = 0
+
+    def _tokenize(self, value, index):
+        if not self._keyword_found and self._is_assign(value):
+            self._assigns += 1
+            return SYNTAX  # VariableTokenizer tokenizes this later.
+        if self._keyword_found:
+            return Tokenizer._tokenize(self, value, index - self._assigns)
+        self._keyword_found = True
+        return GherkinTokenizer().tokenize(value, KEYWORD)
+
+
+class GherkinTokenizer:
+    _gherkin_prefix = re.compile('^(Given|When|Then|And|But) ', re.IGNORECASE)
+
+    def tokenize(self, value, token):
+        match = self._gherkin_prefix.match(value)
+        if not match:
+            return [(value, token)]
+        end = match.end()
+        return [(value[:end], GHERKIN), (value[end:], token)]
+
+
+class TemplatedKeywordCall(Tokenizer):
+    _tokens = (ARGUMENT,)
+
+
+class ForLoop(Tokenizer):
+
+    def __init__(self):
+        Tokenizer.__init__(self)
+        self._in_arguments = False
+
+    def _tokenize(self, value, index):
+        token = self._in_arguments and ARGUMENT or SYNTAX
+        if value.upper() in ('IN', 'IN RANGE'):
+            self._in_arguments = True
+        return token
+
+
+class _Table:
+    _tokenizer_class = None
+
+    def __init__(self, prev_tokenizer=None):
+        self._tokenizer = self._tokenizer_class()
+        self._prev_tokenizer = prev_tokenizer
+        self._prev_values_on_row = []
+
+    def tokenize(self, value, index):
+        if self._continues(value, index):
+            self._tokenizer = self._prev_tokenizer
+            yield value, SYNTAX
+        else:
+            yield from self._tokenize(value, index)
+        self._prev_values_on_row.append(value)
+
+    def _continues(self, value, index):
+        return value == '...' and all(self._is_empty(t)
+                                      for t in self._prev_values_on_row)
+
+    def _is_empty(self, value):
+        return value in ('', '\\')
+
+    def _tokenize(self, value, index):
+        return self._tokenizer.tokenize(value)
+
+    def end_row(self):
+        self.__init__(prev_tokenizer=self._tokenizer)
+
+
+class UnknownTable(_Table):
+    _tokenizer_class = Comment
+
+    def _continues(self, value, index):
+        return False
+
+
+class VariableTable(_Table):
+    _tokenizer_class = Variable
+
+
+class SettingTable(_Table):
+    _tokenizer_class = Setting
+
+    def __init__(self, template_setter, prev_tokenizer=None):
+        _Table.__init__(self, prev_tokenizer)
+        self._template_setter = template_setter
+
+    def _tokenize(self, value, index):
+        if index == 0 and normalize(value) == 'testtemplate':
+            self._tokenizer = Setting(self._template_setter)
+        return _Table._tokenize(self, value, index)
+
+    def end_row(self):
+        self.__init__(self._template_setter, prev_tokenizer=self._tokenizer)
+
+
+class TestCaseTable(_Table):
+    _setting_class = TestCaseSetting
+    _test_template = None
+    _default_template = None
+
+    @property
+    def _tokenizer_class(self):
+        if self._test_template or (self._default_template and
+                                   self._test_template is not False):
+            return TemplatedKeywordCall
+        return KeywordCall
+
+    def _continues(self, value, index):
+        return index > 0 and _Table._continues(self, value, index)
+
+    def _tokenize(self, value, index):
+        if index == 0:
+            if value:
+                self._test_template = None
+            return GherkinTokenizer().tokenize(value, TC_KW_NAME)
+        if index == 1 and self._is_setting(value):
+            if self._is_template(value):
+                self._test_template = False
+                self._tokenizer = self._setting_class(self.set_test_template)
+            else:
+                self._tokenizer = self._setting_class()
+        if index == 1 and self._is_for_loop(value):
+            self._tokenizer = ForLoop()
+        if index == 1 and self._is_empty(value):
+            return [(value, SYNTAX)]
+        return _Table._tokenize(self, value, index)
+
+    def _is_setting(self, value):
+        return value.startswith('[') and value.endswith(']')
+
+    def _is_template(self, value):
+        return normalize(value) == '[template]'
+
+    def _is_for_loop(self, value):
+        return value.startswith(':') and normalize(value, remove=':') == 'for'
+
+    def set_test_template(self, template):
+        self._test_template = self._is_template_set(template)
+
+    def set_default_template(self, template):
+        self._default_template = self._is_template_set(template)
+
+    def _is_template_set(self, template):
+        return normalize(template) not in ('', '\\', 'none', '${empty}')
+
+
+class KeywordTable(TestCaseTable):
+    _tokenizer_class = KeywordCall
+    _setting_class = KeywordSetting
+
+    def _is_template(self, value):
+        return False
+
+
+# Following code copied directly from Robot Framework 2.7.5.
+
+class VariableSplitter:
+
+    def __init__(self, string, identifiers):
+        self.identifier = None
+        self.base = None
+        self.index = None
+        self.start = -1
+        self.end = -1
+        self._identifiers = identifiers
+        self._may_have_internal_variables = False
+        try:
+            self._split(string)
+        except ValueError:
+            pass
+        else:
+            self._finalize()
+
+    def get_replaced_base(self, variables):
+        if self._may_have_internal_variables:
+            return variables.replace_string(self.base)
+        return self.base
+
+    def _finalize(self):
+        self.identifier = self._variable_chars[0]
+        self.base = ''.join(self._variable_chars[2:-1])
+        self.end = self.start + len(self._variable_chars)
+        if self._has_list_or_dict_variable_index():
+            self.index = ''.join(self._list_and_dict_variable_index_chars[1:-1])
+            self.end += len(self._list_and_dict_variable_index_chars)
+
+    def _has_list_or_dict_variable_index(self):
+        return self._list_and_dict_variable_index_chars\
+        and self._list_and_dict_variable_index_chars[-1] == ']'
+
+    def _split(self, string):
+        start_index, max_index = self._find_variable(string)
+        self.start = start_index
+        self._open_curly = 1
+        self._state = self._variable_state
+        self._variable_chars = [string[start_index], '{']
+        self._list_and_dict_variable_index_chars = []
+        self._string = string
+        start_index += 2
+        for index, char in enumerate(string[start_index:]):
+            index += start_index  # Giving start to enumerate only in Py 2.6+
+            try:
+                self._state(char, index)
+            except StopIteration:
+                return
+            if index  == max_index and not self._scanning_list_variable_index():
+                return
+
+    def _scanning_list_variable_index(self):
+        return self._state in [self._waiting_list_variable_index_state,
+                               self._list_variable_index_state]
+
+    def _find_variable(self, string):
+        max_end_index = string.rfind('}')
+        if max_end_index == -1:
+            raise ValueError('No variable end found')
+        if self._is_escaped(string, max_end_index):
+            return self._find_variable(string[:max_end_index])
+        start_index = self._find_start_index(string, 1, max_end_index)
+        if start_index == -1:
+            raise ValueError('No variable start found')
+        return start_index, max_end_index
+
+    def _find_start_index(self, string, start, end):
+        index = string.find('{', start, end) - 1
+        if index < 0:
+            return -1
+        if self._start_index_is_ok(string, index):
+            return index
+        return self._find_start_index(string, index+2, end)
+
+    def _start_index_is_ok(self, string, index):
+        return string[index] in self._identifiers\
+        and not self._is_escaped(string, index)
+
+    def _is_escaped(self, string, index):
+        escaped = False
+        while index > 0 and string[index-1] == '\\':
+            index -= 1
+            escaped = not escaped
+        return escaped
+
+    def _variable_state(self, char, index):
+        self._variable_chars.append(char)
+        if char == '}' and not self._is_escaped(self._string, index):
+            self._open_curly -= 1
+            if self._open_curly == 0:
+                if not self._is_list_or_dict_variable():
+                    raise StopIteration
+                self._state = self._waiting_list_variable_index_state
+        elif char in self._identifiers:
+            self._state = self._internal_variable_start_state
+
+    def _is_list_or_dict_variable(self):
+        return self._variable_chars[0] in ('@','&')
+
+    def _internal_variable_start_state(self, char, index):
+        self._state = self._variable_state
+        if char == '{':
+            self._variable_chars.append(char)
+            self._open_curly += 1
+            self._may_have_internal_variables = True
+        else:
+            self._variable_state(char, index)
+
+    def _waiting_list_variable_index_state(self, char, index):
+        if char != '[':
+            raise StopIteration
+        self._list_and_dict_variable_index_chars.append(char)
+        self._state = self._list_variable_index_state
+
+    def _list_variable_index_state(self, char, index):
+        self._list_and_dict_variable_index_chars.append(char)
+        if char == ']':
+            raise StopIteration
diff --git a/.venv/Lib/site-packages/pygments/lexers/ruby.py b/.venv/Lib/site-packages/pygments/lexers/ruby.py
new file mode 100644 (file)
index 0000000..72aaeb5
--- /dev/null
@@ -0,0 +1,518 @@
+"""
+    pygments.lexers.ruby
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Ruby and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, ExtendedRegexLexer, include, \
+    bygroups, default, LexerContext, do_insertions, words, line_re
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Generic, Whitespace
+from pygments.util import shebang_matches
+
+__all__ = ['RubyLexer', 'RubyConsoleLexer', 'FancyLexer']
+
+
+RUBY_OPERATORS = (
+    '*', '**', '-', '+', '-@', '+@', '/', '%', '&', '|', '^', '`', '~',
+    '[]', '[]=', '<<', '>>', '<', '<>', '<=>', '>', '>=', '==', '==='
+)
+
+
+class RubyLexer(ExtendedRegexLexer):
+    """
+    For Ruby source code.
+    """
+
+    name = 'Ruby'
+    url = 'http://www.ruby-lang.org'
+    aliases = ['ruby', 'rb', 'duby']
+    filenames = ['*.rb', '*.rbw', 'Rakefile', '*.rake', '*.gemspec',
+                 '*.rbx', '*.duby', 'Gemfile', 'Vagrantfile']
+    mimetypes = ['text/x-ruby', 'application/x-ruby']
+    version_added = ''
+
+    flags = re.DOTALL | re.MULTILINE
+
+    def heredoc_callback(self, match, ctx):
+        # okay, this is the hardest part of parsing Ruby...
+        # match: 1 = <<[-~]?, 2 = quote? 3 = name 4 = quote? 5 = rest of line
+
+        start = match.start(1)
+        yield start, Operator, match.group(1)        # <<[-~]?
+        yield match.start(2), String.Heredoc, match.group(2)   # quote ", ', `
+        yield match.start(3), String.Delimiter, match.group(3) # heredoc name
+        yield match.start(4), String.Heredoc, match.group(4)   # quote again
+
+        heredocstack = ctx.__dict__.setdefault('heredocstack', [])
+        outermost = not bool(heredocstack)
+        heredocstack.append((match.group(1) in ('<<-', '<<~'), match.group(3)))
+
+        ctx.pos = match.start(5)
+        ctx.end = match.end(5)
+        # this may find other heredocs, so limit the recursion depth
+        if len(heredocstack) < 100:
+            yield from self.get_tokens_unprocessed(context=ctx)
+        else:
+            yield ctx.pos, String.Heredoc, match.group(5)
+        ctx.pos = match.end()
+
+        if outermost:
+            # this is the outer heredoc again, now we can process them all
+            for tolerant, hdname in heredocstack:
+                lines = []
+                for match in line_re.finditer(ctx.text, ctx.pos):
+                    if tolerant:
+                        check = match.group().strip()
+                    else:
+                        check = match.group().rstrip()
+                    if check == hdname:
+                        for amatch in lines:
+                            yield amatch.start(), String.Heredoc, amatch.group()
+                        yield match.start(), String.Delimiter, match.group()
+                        ctx.pos = match.end()
+                        break
+                    else:
+                        lines.append(match)
+                else:
+                    # end of heredoc not found -- error!
+                    for amatch in lines:
+                        yield amatch.start(), Error, amatch.group()
+            ctx.end = len(ctx.text)
+            del heredocstack[:]
+
+    def gen_rubystrings_rules():
+        def intp_regex_callback(self, match, ctx):
+            yield match.start(1), String.Regex, match.group(1)  # begin
+            nctx = LexerContext(match.group(3), 0, ['interpolated-regex'])
+            for i, t, v in self.get_tokens_unprocessed(context=nctx):
+                yield match.start(3)+i, t, v
+            yield match.start(4), String.Regex, match.group(4)  # end[mixounse]*
+            ctx.pos = match.end()
+
+        def intp_string_callback(self, match, ctx):
+            yield match.start(1), String.Other, match.group(1)
+            nctx = LexerContext(match.group(3), 0, ['interpolated-string'])
+            for i, t, v in self.get_tokens_unprocessed(context=nctx):
+                yield match.start(3)+i, t, v
+            yield match.start(4), String.Other, match.group(4)  # end
+            ctx.pos = match.end()
+
+        states = {}
+        states['strings'] = [
+            # easy ones
+            (r'\:@{0,2}[a-zA-Z_]\w*[!?]?', String.Symbol),
+            (words(RUBY_OPERATORS, prefix=r'\:@{0,2}'), String.Symbol),
+            (r":'(\\\\|\\[^\\]|[^'\\])*'", String.Symbol),
+            (r':"', String.Symbol, 'simple-sym'),
+            (r'([a-zA-Z_]\w*)(:)(?!:)',
+             bygroups(String.Symbol, Punctuation)),  # Since Ruby 1.9
+            (r'"', String.Double, 'simple-string-double'),
+            (r"'", String.Single, 'simple-string-single'),
+            (r'(?<!\.)`', String.Backtick, 'simple-backtick'),
+        ]
+
+        # quoted string and symbol
+        for name, ttype, end in ('string-double', String.Double, '"'), \
+                                ('string-single', String.Single, "'"),\
+                                ('sym', String.Symbol, '"'), \
+                                ('backtick', String.Backtick, '`'):
+            states['simple-'+name] = [
+                include('string-intp-escaped'),
+                (rf'[^\\{end}#]+', ttype),
+                (r'[\\#]', ttype),
+                (end, ttype, '#pop'),
+            ]
+
+        # braced quoted strings
+        for lbrace, rbrace, bracecc, name in \
+                ('\\{', '\\}', '{}', 'cb'), \
+                ('\\[', '\\]', '\\[\\]', 'sb'), \
+                ('\\(', '\\)', '()', 'pa'), \
+                ('<', '>', '<>', 'ab'):
+            states[name+'-intp-string'] = [
+                (r'\\[\\' + bracecc + ']', String.Other),
+                (lbrace, String.Other, '#push'),
+                (rbrace, String.Other, '#pop'),
+                include('string-intp-escaped'),
+                (r'[\\#' + bracecc + ']', String.Other),
+                (r'[^\\#' + bracecc + ']+', String.Other),
+            ]
+            states['strings'].append((r'%[QWx]?' + lbrace, String.Other,
+                                      name+'-intp-string'))
+            states[name+'-string'] = [
+                (r'\\[\\' + bracecc + ']', String.Other),
+                (lbrace, String.Other, '#push'),
+                (rbrace, String.Other, '#pop'),
+                (r'[\\#' + bracecc + ']', String.Other),
+                (r'[^\\#' + bracecc + ']+', String.Other),
+            ]
+            states['strings'].append((r'%[qsw]' + lbrace, String.Other,
+                                      name+'-string'))
+            states[name+'-regex'] = [
+                (r'\\[\\' + bracecc + ']', String.Regex),
+                (lbrace, String.Regex, '#push'),
+                (rbrace + '[mixounse]*', String.Regex, '#pop'),
+                include('string-intp'),
+                (r'[\\#' + bracecc + ']', String.Regex),
+                (r'[^\\#' + bracecc + ']+', String.Regex),
+            ]
+            states['strings'].append((r'%r' + lbrace, String.Regex,
+                                      name+'-regex'))
+
+        # these must come after %<brace>!
+        states['strings'] += [
+            # %r regex
+            (r'(%r([\W_]))((?:\\\2|(?!\2).)*)(\2[mixounse]*)',
+             intp_regex_callback),
+            # regular fancy strings with qsw
+            (r'%[qsw]([\W_])((?:\\\1|(?!\1).)*)\1', String.Other),
+            (r'(%[QWx]([\W_]))((?:\\\2|(?!\2).)*)(\2)',
+             intp_string_callback),
+            # special forms of fancy strings after operators or
+            # in method calls with braces
+            (r'(?<=[-+/*%=<>&!^|~,(])(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)',
+             bygroups(Whitespace, String.Other, None)),
+            # and because of fixed width lookbehinds the whole thing a
+            # second time for line startings...
+            (r'^(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)',
+             bygroups(Whitespace, String.Other, None)),
+            # all regular fancy strings without qsw
+            (r'(%([^a-zA-Z0-9\s]))((?:\\\2|(?!\2).)*)(\2)',
+             intp_string_callback),
+        ]
+
+        return states
+
+    tokens = {
+        'root': [
+            (r'\A#!.+?$', Comment.Hashbang),
+            (r'#.*?$', Comment.Single),
+            (r'=begin\s.*?\n=end.*?$', Comment.Multiline),
+            # keywords
+            (words((
+                'BEGIN', 'END', 'alias', 'begin', 'break', 'case', 'defined?',
+                'do', 'else', 'elsif', 'end', 'ensure', 'for', 'if', 'in', 'next', 'redo',
+                'rescue', 'raise', 'retry', 'return', 'super', 'then', 'undef',
+                'unless', 'until', 'when', 'while', 'yield'), suffix=r'\b'),
+             Keyword),
+            # start of function, class and module names
+            (r'(module)(\s+)([a-zA-Z_]\w*'
+             r'(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Whitespace, Name.Namespace)),
+            (r'(def)(\s+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (r'def(?=[*%&^`~+-/\[<>=])', Keyword, 'funcname'),
+            (r'(class)(\s+)', bygroups(Keyword, Whitespace), 'classname'),
+            # special methods
+            (words((
+                'initialize', 'new', 'loop', 'include', 'extend', 'raise', 'attr_reader',
+                'attr_writer', 'attr_accessor', 'attr', 'catch', 'throw', 'private',
+                'module_function', 'public', 'protected', 'true', 'false', 'nil'),
+                suffix=r'\b'),
+             Keyword.Pseudo),
+            (r'(not|and|or)\b', Operator.Word),
+            (words((
+                'autoload', 'block_given', 'const_defined', 'eql', 'equal', 'frozen', 'include',
+                'instance_of', 'is_a', 'iterator', 'kind_of', 'method_defined', 'nil',
+                'private_method_defined', 'protected_method_defined',
+                'public_method_defined', 'respond_to', 'tainted'), suffix=r'\?'),
+             Name.Builtin),
+            (r'(chomp|chop|exit|gsub|sub)!', Name.Builtin),
+            (words((
+                'Array', 'Float', 'Integer', 'String', '__id__', '__send__', 'abort',
+                'ancestors', 'at_exit', 'autoload', 'binding', 'callcc', 'caller',
+                'catch', 'chomp', 'chop', 'class_eval', 'class_variables',
+                'clone', 'const_defined?', 'const_get', 'const_missing', 'const_set',
+                'constants', 'display', 'dup', 'eval', 'exec', 'exit', 'extend', 'fail', 'fork',
+                'format', 'freeze', 'getc', 'gets', 'global_variables', 'gsub',
+                'hash', 'id', 'included_modules', 'inspect', 'instance_eval',
+                'instance_method', 'instance_methods',
+                'instance_variable_get', 'instance_variable_set', 'instance_variables',
+                'lambda', 'load', 'local_variables', 'loop',
+                'method', 'method_missing', 'methods', 'module_eval', 'name',
+                'object_id', 'open', 'p', 'print', 'printf', 'private_class_method',
+                'private_instance_methods',
+                'private_methods', 'proc', 'protected_instance_methods',
+                'protected_methods', 'public_class_method',
+                'public_instance_methods', 'public_methods',
+                'putc', 'puts', 'raise', 'rand', 'readline', 'readlines', 'require',
+                'scan', 'select', 'self', 'send', 'set_trace_func', 'singleton_methods', 'sleep',
+                'split', 'sprintf', 'srand', 'sub', 'syscall', 'system', 'taint',
+                'test', 'throw', 'to_a', 'to_s', 'trace_var', 'trap', 'untaint',
+                'untrace_var', 'warn'), prefix=r'(?<!\.)', suffix=r'\b'),
+             Name.Builtin),
+            (r'__(FILE|LINE)__\b', Name.Builtin.Pseudo),
+            # normal heredocs
+            (r'(?<!\w)(<<[-~]?)(["`\']?)([a-zA-Z_]\w*)(\2)(.*?\n)',
+             heredoc_callback),
+            # empty string heredocs
+            (r'(<<[-~]?)("|\')()(\2)(.*?\n)', heredoc_callback),
+            (r'__END__', Comment.Preproc, 'end-part'),
+            # multiline regex (after keywords or assignments)
+            (r'(?:^|(?<=[=<>~!:])|'
+             r'(?<=(?:\s|;)when\s)|'
+             r'(?<=(?:\s|;)or\s)|'
+             r'(?<=(?:\s|;)and\s)|'
+             r'(?<=\.index\s)|'
+             r'(?<=\.scan\s)|'
+             r'(?<=\.sub\s)|'
+             r'(?<=\.sub!\s)|'
+             r'(?<=\.gsub\s)|'
+             r'(?<=\.gsub!\s)|'
+             r'(?<=\.match\s)|'
+             r'(?<=(?:\s|;)if\s)|'
+             r'(?<=(?:\s|;)elsif\s)|'
+             r'(?<=^when\s)|'
+             r'(?<=^index\s)|'
+             r'(?<=^scan\s)|'
+             r'(?<=^sub\s)|'
+             r'(?<=^gsub\s)|'
+             r'(?<=^sub!\s)|'
+             r'(?<=^gsub!\s)|'
+             r'(?<=^match\s)|'
+             r'(?<=^if\s)|'
+             r'(?<=^elsif\s)'
+             r')(\s*)(/)', bygroups(Text, String.Regex), 'multiline-regex'),
+            # multiline regex (in method calls or subscripts)
+            (r'(?<=\(|,|\[)/', String.Regex, 'multiline-regex'),
+            # multiline regex (this time the funny no whitespace rule)
+            (r'(\s+)(/)(?![\s=])', bygroups(Whitespace, String.Regex),
+             'multiline-regex'),
+            # lex numbers and ignore following regular expressions which
+            # are division operators in fact (grrrr. i hate that. any
+            # better ideas?)
+            # since pygments 0.7 we also eat a "?" operator after numbers
+            # so that the char operator does not work. Chars are not allowed
+            # there so that you can use the ternary operator.
+            # stupid example:
+            #   x>=0?n[x]:""
+            (r'(0_?[0-7]+(?:_[0-7]+)*)(\s*)([/?])?',
+             bygroups(Number.Oct, Whitespace, Operator)),
+            (r'(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*)(\s*)([/?])?',
+             bygroups(Number.Hex, Whitespace, Operator)),
+            (r'(0b[01]+(?:_[01]+)*)(\s*)([/?])?',
+             bygroups(Number.Bin, Whitespace, Operator)),
+            (r'([\d]+(?:_\d+)*)(\s*)([/?])?',
+             bygroups(Number.Integer, Whitespace, Operator)),
+            # Names
+            (r'@@[a-zA-Z_]\w*', Name.Variable.Class),
+            (r'@[a-zA-Z_]\w*', Name.Variable.Instance),
+            (r'\$\w+', Name.Variable.Global),
+            (r'\$[!@&`\'+~=/\\,;.<>_*$?:"^-]', Name.Variable.Global),
+            (r'\$-[0adFiIlpvw]', Name.Variable.Global),
+            (r'::', Operator),
+            include('strings'),
+            # chars
+            (r'\?(\\[MC]-)*'  # modifiers
+             r'(\\([\\abefnrstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)'
+             r'(?!\w)',
+             String.Char),
+            (r'[A-Z]\w+', Name.Constant),
+            # this is needed because ruby attributes can look
+            # like keywords (class) or like this: ` ?!?
+            (words(RUBY_OPERATORS, prefix=r'(\.|::)'),
+             bygroups(Operator, Name.Operator)),
+            (r'(\.|::)([a-zA-Z_]\w*[!?]?|[*%&^`~+\-/\[<>=])',
+             bygroups(Operator, Name)),
+            (r'[a-zA-Z_]\w*[!?]?', Name),
+            (r'(\[|\]|\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|'
+             r'!~|&&?|\|\||\.{1,3})', Operator),
+            (r'[-+/*%=<>&!^|~]=?', Operator),
+            (r'[(){};,/?:\\]', Punctuation),
+            (r'\s+', Whitespace)
+        ],
+        'funcname': [
+            (r'\(', Punctuation, 'defexpr'),
+            (r'(?:([a-zA-Z_]\w*)(\.))?'  # optional scope name, like "self."
+             r'('
+                r'[a-zA-Z\u0080-\uffff][a-zA-Z0-9_\u0080-\uffff]*[!?=]?'  # method name
+                r'|!=|!~|=~|\*\*?|[-+!~]@?|[/%&|^]|<=>|<[<=]?|>[>=]?|===?'  # or operator override
+                r'|\[\]=?'  # or element reference/assignment override
+                r'|`'  # or the undocumented backtick override
+             r')',
+             bygroups(Name.Class, Operator, Name.Function), '#pop'),
+            default('#pop')
+        ],
+        'classname': [
+            (r'\(', Punctuation, 'defexpr'),
+            (r'<<', Operator, '#pop'),
+            (r'[A-Z_]\w*', Name.Class, '#pop'),
+            default('#pop')
+        ],
+        'defexpr': [
+            (r'(\))(\.|::)?', bygroups(Punctuation, Operator), '#pop'),
+            (r'\(', Operator, '#push'),
+            include('root')
+        ],
+        'in-intp': [
+            (r'\{', String.Interpol, '#push'),
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        'string-intp': [
+            (r'#\{', String.Interpol, 'in-intp'),
+            (r'#@@?[a-zA-Z_]\w*', String.Interpol),
+            (r'#\$[a-zA-Z_]\w*', String.Interpol)
+        ],
+        'string-intp-escaped': [
+            include('string-intp'),
+            (r'\\([\\abefnrstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})',
+             String.Escape)
+        ],
+        'interpolated-regex': [
+            include('string-intp'),
+            (r'[\\#]', String.Regex),
+            (r'[^\\#]+', String.Regex),
+        ],
+        'interpolated-string': [
+            include('string-intp'),
+            (r'[\\#]', String.Other),
+            (r'[^\\#]+', String.Other),
+        ],
+        'multiline-regex': [
+            include('string-intp'),
+            (r'\\\\', String.Regex),
+            (r'\\/', String.Regex),
+            (r'[\\#]', String.Regex),
+            (r'[^\\/#]+', String.Regex),
+            (r'/[mixounse]*', String.Regex, '#pop'),
+        ],
+        'end-part': [
+            (r'.+', Comment.Preproc, '#pop')
+        ]
+    }
+    tokens.update(gen_rubystrings_rules())
+
+    def analyse_text(text):
+        return shebang_matches(text, r'ruby(1\.\d)?')
+
+
+class RubyConsoleLexer(Lexer):
+    """
+    For Ruby interactive console (**irb**) output.
+    """
+    name = 'Ruby irb session'
+    aliases = ['rbcon', 'irb']
+    mimetypes = ['text/x-ruby-shellsession']
+    url = 'https://www.ruby-lang.org'
+    version_added = ''
+    _example = 'rbcon/console'
+
+    _prompt_re = re.compile(r'irb\([a-zA-Z_]\w*\):\d{3}:\d+[>*"\'] '
+                            r'|>> |\?> ')
+
+    def get_tokens_unprocessed(self, text):
+        rblexer = RubyLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        for match in line_re.finditer(text):
+            line = match.group()
+            m = self._prompt_re.match(line)
+            if m is not None:
+                end = m.end()
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:end])]))
+                curcode += line[end:]
+            else:
+                if curcode:
+                    yield from do_insertions(
+                        insertions, rblexer.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+                yield match.start(), Generic.Output, line
+        if curcode:
+            yield from do_insertions(
+                insertions, rblexer.get_tokens_unprocessed(curcode))
+
+
+class FancyLexer(RegexLexer):
+    """
+    Pygments Lexer For Fancy.
+
+    Fancy is a self-hosted, pure object-oriented, dynamic,
+    class-based, concurrent general-purpose programming language
+    running on Rubinius, the Ruby VM.
+    """
+    name = 'Fancy'
+    url = 'https://github.com/bakkdoor/fancy'
+    filenames = ['*.fy', '*.fancypack']
+    aliases = ['fancy', 'fy']
+    mimetypes = ['text/x-fancysrc']
+    version_added = '1.5'
+
+    tokens = {
+        # copied from PerlLexer:
+        'balanced-regex': [
+            (r'/(\\\\|\\[^\\]|[^/\\])*/[egimosx]*', String.Regex, '#pop'),
+            (r'!(\\\\|\\[^\\]|[^!\\])*![egimosx]*', String.Regex, '#pop'),
+            (r'\\(\\\\|[^\\])*\\[egimosx]*', String.Regex, '#pop'),
+            (r'\{(\\\\|\\[^\\]|[^}\\])*\}[egimosx]*', String.Regex, '#pop'),
+            (r'<(\\\\|\\[^\\]|[^>\\])*>[egimosx]*', String.Regex, '#pop'),
+            (r'\[(\\\\|\\[^\\]|[^\]\\])*\][egimosx]*', String.Regex, '#pop'),
+            (r'\((\\\\|\\[^\\]|[^)\\])*\)[egimosx]*', String.Regex, '#pop'),
+            (r'@(\\\\|\\[^\\]|[^@\\])*@[egimosx]*', String.Regex, '#pop'),
+            (r'%(\\\\|\\[^\\]|[^%\\])*%[egimosx]*', String.Regex, '#pop'),
+            (r'\$(\\\\|\\[^\\]|[^$\\])*\$[egimosx]*', String.Regex, '#pop'),
+        ],
+        'root': [
+            (r'\s+', Whitespace),
+
+            # balanced delimiters (copied from PerlLexer):
+            (r's\{(\\\\|\\[^\\]|[^}\\])*\}\s*', String.Regex, 'balanced-regex'),
+            (r's<(\\\\|\\[^\\]|[^>\\])*>\s*', String.Regex, 'balanced-regex'),
+            (r's\[(\\\\|\\[^\\]|[^\]\\])*\]\s*', String.Regex, 'balanced-regex'),
+            (r's\((\\\\|\\[^\\]|[^)\\])*\)\s*', String.Regex, 'balanced-regex'),
+            (r'm?/(\\\\|\\[^\\]|[^///\n])*/[gcimosx]*', String.Regex),
+            (r'm(?=[/!\\{<\[(@%$])', String.Regex, 'balanced-regex'),
+
+            # Comments
+            (r'#(.*?)\n', Comment.Single),
+            # Symbols
+            (r'\'([^\'\s\[\](){}]+|\[\])', String.Symbol),
+            # Multi-line DoubleQuotedString
+            (r'"""(\\\\|\\[^\\]|[^\\])*?"""', String),
+            # DoubleQuotedString
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            # keywords
+            (r'(def|class|try|catch|finally|retry|return|return_local|match|'
+             r'case|->|=>)\b', Keyword),
+            # constants
+            (r'(self|super|nil|false|true)\b', Name.Constant),
+            (r'[(){};,/?|:\\]', Punctuation),
+            # names
+            (words((
+                'Object', 'Array', 'Hash', 'Directory', 'File', 'Class', 'String',
+                'Number', 'Enumerable', 'FancyEnumerable', 'Block', 'TrueClass',
+                'NilClass', 'FalseClass', 'Tuple', 'Symbol', 'Stack', 'Set',
+                'FancySpec', 'Method', 'Package', 'Range'), suffix=r'\b'),
+             Name.Builtin),
+            # functions
+            (r'[a-zA-Z](\w|[-+?!=*/^><%])*:', Name.Function),
+            # operators, must be below functions
+            (r'[-+*/~,<>=&!?%^\[\].$]+', Operator),
+            (r'[A-Z]\w*', Name.Constant),
+            (r'@[a-zA-Z_]\w*', Name.Variable.Instance),
+            (r'@@[a-zA-Z_]\w*', Name.Variable.Class),
+            ('@@?', Operator),
+            (r'[a-zA-Z_]\w*', Name),
+            # numbers - / checks are necessary to avoid mismarking regexes,
+            # see comment in RubyLexer
+            (r'(0[oO]?[0-7]+(?:_[0-7]+)*)(\s*)([/?])?',
+             bygroups(Number.Oct, Whitespace, Operator)),
+            (r'(0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*)(\s*)([/?])?',
+             bygroups(Number.Hex, Whitespace, Operator)),
+            (r'(0[bB][01]+(?:_[01]+)*)(\s*)([/?])?',
+             bygroups(Number.Bin, Whitespace, Operator)),
+            (r'([\d]+(?:_\d+)*)(\s*)([/?])?',
+             bygroups(Number.Integer, Whitespace, Operator)),
+            (r'\d+([eE][+-]?[0-9]+)|\d+\.\d+([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+', Number.Integer)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/rust.py b/.venv/Lib/site-packages/pygments/lexers/rust.py
new file mode 100644 (file)
index 0000000..6341047
--- /dev/null
@@ -0,0 +1,222 @@
+"""
+    pygments.lexers.rust
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Rust language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, words, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['RustLexer']
+
+
+class RustLexer(RegexLexer):
+    """
+    Lexer for the Rust programming language (version 1.47).
+    """
+    name = 'Rust'
+    url = 'https://www.rust-lang.org/'
+    filenames = ['*.rs', '*.rs.in']
+    aliases = ['rust', 'rs']
+    mimetypes = ['text/rust', 'text/x-rust']
+    version_added = '1.6'
+
+    keyword_types = (words((
+        'u8', 'u16', 'u32', 'u64', 'u128', 'i8', 'i16', 'i32', 'i64', 'i128',
+        'usize', 'isize', 'f32', 'f64', 'char', 'str', 'bool',
+    ), suffix=r'\b'), Keyword.Type)
+
+    builtin_funcs_types = (words((
+        'Copy', 'Send', 'Sized', 'Sync', 'Unpin',
+        'Drop', 'Fn', 'FnMut', 'FnOnce', 'drop',
+        'Box', 'ToOwned', 'Clone',
+        'PartialEq', 'PartialOrd', 'Eq', 'Ord',
+        'AsRef', 'AsMut', 'Into', 'From', 'Default',
+        'Iterator', 'Extend', 'IntoIterator', 'DoubleEndedIterator',
+        'ExactSizeIterator',
+        'Option', 'Some', 'None',
+        'Result', 'Ok', 'Err',
+        'String', 'ToString', 'Vec',
+    ), suffix=r'\b'), Name.Builtin)
+
+    builtin_macros = (words((
+        'asm', 'assert', 'assert_eq', 'assert_ne', 'cfg', 'column',
+        'compile_error', 'concat', 'concat_idents', 'dbg', 'debug_assert',
+        'debug_assert_eq', 'debug_assert_ne', 'env', 'eprint', 'eprintln',
+        'file', 'format', 'format_args', 'format_args_nl', 'global_asm',
+        'include', 'include_bytes', 'include_str',
+        'is_aarch64_feature_detected',
+        'is_arm_feature_detected',
+        'is_mips64_feature_detected',
+        'is_mips_feature_detected',
+        'is_powerpc64_feature_detected',
+        'is_powerpc_feature_detected',
+        'is_x86_feature_detected',
+        'line', 'llvm_asm', 'log_syntax', 'macro_rules', 'matches',
+        'module_path', 'option_env', 'panic', 'print', 'println', 'stringify',
+        'thread_local', 'todo', 'trace_macros', 'unimplemented', 'unreachable',
+        'vec', 'write', 'writeln',
+    ), suffix=r'!'), Name.Function.Magic)
+
+    tokens = {
+        'root': [
+            # rust allows a file to start with a shebang, but if the first line
+            # starts with #![ then it's not a shebang but a crate attribute.
+            (r'#![^[\r\n].*$', Comment.Preproc),
+            default('base'),
+        ],
+        'base': [
+            # Whitespace and Comments
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'//!.*?\n', String.Doc),
+            (r'///(\n|[^/].*?\n)', String.Doc),
+            (r'//(.*?)\n', Comment.Single),
+            (r'/\*\*(\n|[^/*])', String.Doc, 'doccomment'),
+            (r'/\*!', String.Doc, 'doccomment'),
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            # Macro parameters
+            (r"""\$([a-zA-Z_]\w*|\(,?|\),?|,?)""", Comment.Preproc),
+            # Keywords
+            (words(('as', 'async', 'await', 'box', 'const', 'crate', 'dyn',
+                    'else', 'extern', 'for', 'if', 'impl', 'in', 'loop',
+                    'match', 'move', 'mut', 'pub', 'ref', 'return', 'static',
+                    'super', 'trait', 'unsafe', 'use', 'where', 'while'),
+                   suffix=r'\b'), Keyword),
+            (words(('abstract', 'become', 'do', 'final', 'macro', 'override',
+                    'priv', 'typeof', 'try', 'unsized', 'virtual', 'yield'),
+                   suffix=r'\b'), Keyword.Reserved),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'self\b', Name.Builtin.Pseudo),
+            (r'mod\b', Keyword, 'modname'),
+            (r'let\b', Keyword.Declaration),
+            (r'fn\b', Keyword, 'funcname'),
+            (r'(struct|enum|type|union)\b', Keyword, 'typename'),
+            (r'(default)(\s+)(type|fn)\b', bygroups(Keyword, Whitespace, Keyword)),
+            keyword_types,
+            (r'[sS]elf\b', Name.Builtin.Pseudo),
+            # Prelude (taken from Rust's src/libstd/prelude.rs)
+            builtin_funcs_types,
+            builtin_macros,
+            # Path separators, so types don't catch them.
+            (r'::\b', Punctuation),
+            # Types in positions.
+            (r'(?::|->)', Punctuation, 'typename'),
+            # Labels
+            (r'(break|continue)(\b\s*)(\'[A-Za-z_]\w*)?',
+             bygroups(Keyword, Text.Whitespace, Name.Label)),
+
+            # Character literals
+            (r"""'(\\['"\\nrt]|\\x[0-7][0-9a-fA-F]|\\0"""
+             r"""|\\u\{[0-9a-fA-F]{1,6}\}|.)'""",
+             String.Char),
+            (r"""b'(\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\0"""
+             r"""|\\u\{[0-9a-fA-F]{1,6}\}|.)'""",
+             String.Char),
+
+            # Binary literals
+            (r'0b[01_]+', Number.Bin, 'number_lit'),
+            # Octal literals
+            (r'0o[0-7_]+', Number.Oct, 'number_lit'),
+            # Hexadecimal literals
+            (r'0[xX][0-9a-fA-F_]+', Number.Hex, 'number_lit'),
+            # Decimal literals
+            (r'[0-9][0-9_]*(\.[0-9_]+[eE][+\-]?[0-9_]+|'
+             r'\.[0-9_]*(?!\.)|[eE][+\-]?[0-9_]+)', Number.Float,
+             'number_lit'),
+            (r'[0-9][0-9_]*', Number.Integer, 'number_lit'),
+
+            # String literals
+            (r'b"', String, 'bytestring'),
+            (r'"', String, 'string'),
+            (r'(?s)b?r(#*)".*?"\1', String),
+
+            # Lifetime names
+            (r"'", Operator, 'lifetime'),
+
+            # Operators and Punctuation
+            (r'\.\.=?', Operator),
+            (r'[{}()\[\],.;]', Punctuation),
+            (r'[+\-*/%&|<>^!~@=:?]', Operator),
+
+            # Identifiers
+            (r'[a-zA-Z_]\w*', Name),
+            # Raw identifiers
+            (r'r#[a-zA-Z_]\w*', Name),
+
+            # Attributes
+            (r'#!?\[', Comment.Preproc, 'attribute['),
+
+            # Misc
+            # Lone hashes: not used in Rust syntax, but allowed in macro
+            # arguments, most famously for quote::quote!()
+            (r'#', Punctuation),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'doccomment': [
+            (r'[^*/]+', String.Doc),
+            (r'/\*', String.Doc, '#push'),
+            (r'\*/', String.Doc, '#pop'),
+            (r'[*/]', String.Doc),
+        ],
+        'modname': [
+            (r'\s+', Whitespace),
+            (r'[a-zA-Z_]\w*', Name.Namespace, '#pop'),
+            default('#pop'),
+        ],
+        'funcname': [
+            (r'\s+', Whitespace),
+            (r'[a-zA-Z_]\w*', Name.Function, '#pop'),
+            default('#pop'),
+        ],
+        'typename': [
+            (r'\s+', Whitespace),
+            (r'&', Keyword.Pseudo),
+            (r"'", Operator, 'lifetime'),
+            builtin_funcs_types,
+            keyword_types,
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            default('#pop'),
+        ],
+        'lifetime': [
+            (r"(static|_)", Name.Builtin),
+            (r"[a-zA-Z_]+\w*", Name.Attribute),
+            default('#pop'),
+        ],
+        'number_lit': [
+            (r'[ui](8|16|32|64|size)', Keyword, '#pop'),
+            (r'f(32|64)', Keyword, '#pop'),
+            default('#pop'),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r"""\\['"\\nrt]|\\x[0-7][0-9a-fA-F]|\\0"""
+             r"""|\\u\{[0-9a-fA-F]{1,6}\}""", String.Escape),
+            (r'[^\\"]+', String),
+            (r'\\', String),
+        ],
+        'bytestring': [
+            (r"""\\x[89a-fA-F][0-9a-fA-F]""", String.Escape),
+            include('string'),
+        ],
+        'attribute_common': [
+            (r'"', String, 'string'),
+            (r'\[', Comment.Preproc, 'attribute['),
+        ],
+        'attribute[': [
+            include('attribute_common'),
+            (r'\]', Comment.Preproc, '#pop'),
+            (r'[^"\]\[]+', Comment.Preproc),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/sas.py b/.venv/Lib/site-packages/pygments/lexers/sas.py
new file mode 100644 (file)
index 0000000..1b2ad43
--- /dev/null
@@ -0,0 +1,227 @@
+"""
+    pygments.lexers.sas
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for SAS.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Comment, Keyword, Name, Number, String, Text, \
+    Other, Generic
+
+__all__ = ['SASLexer']
+
+
+class SASLexer(RegexLexer):
+    """
+    For SAS files.
+    """
+    # Syntax from syntax/sas.vim by James Kidd <james.kidd@covance.com>
+
+    name      = 'SAS'
+    aliases   = ['sas']
+    filenames = ['*.SAS', '*.sas']
+    mimetypes = ['text/x-sas', 'text/sas', 'application/x-sas']
+    url = 'https://en.wikipedia.org/wiki/SAS_(software)'
+    version_added = '2.2'
+    flags     = re.IGNORECASE | re.MULTILINE
+
+    builtins_macros = (
+        "bquote", "nrbquote", "cmpres", "qcmpres", "compstor", "datatyp",
+        "display", "do", "else", "end", "eval", "global", "goto", "if",
+        "index", "input", "keydef", "label", "left", "length", "let",
+        "local", "lowcase", "macro", "mend", "nrquote",
+        "nrstr", "put", "qleft", "qlowcase", "qscan",
+        "qsubstr", "qsysfunc", "qtrim", "quote", "qupcase", "scan",
+        "str", "substr", "superq", "syscall", "sysevalf", "sysexec",
+        "sysfunc", "sysget", "syslput", "sysprod", "sysrc", "sysrput",
+        "then", "to", "trim", "unquote", "until", "upcase", "verify",
+        "while", "window"
+    )
+
+    builtins_conditionals = (
+        "do", "if", "then", "else", "end", "until", "while"
+    )
+
+    builtins_statements = (
+        "abort", "array", "attrib", "by", "call", "cards", "cards4",
+        "catname", "continue", "datalines", "datalines4", "delete", "delim",
+        "delimiter", "display", "dm", "drop", "endsas", "error", "file",
+        "filename", "footnote", "format", "goto", "in", "infile", "informat",
+        "input", "keep", "label", "leave", "length", "libname", "link",
+        "list", "lostcard", "merge", "missing", "modify", "options", "output",
+        "out", "page", "put", "redirect", "remove", "rename", "replace",
+        "retain", "return", "select", "set", "skip", "startsas", "stop",
+        "title", "update", "waitsas", "where", "window", "x", "systask"
+    )
+
+    builtins_sql = (
+        "add", "and", "alter", "as", "cascade", "check", "create",
+        "delete", "describe", "distinct", "drop", "foreign", "from",
+        "group", "having", "index", "insert", "into", "in", "key", "like",
+        "message", "modify", "msgtype", "not", "null", "on", "or",
+        "order", "primary", "references", "reset", "restrict", "select",
+        "set", "table", "unique", "update", "validate", "view", "where"
+    )
+
+    builtins_functions = (
+        "abs", "addr", "airy", "arcos", "arsin", "atan", "attrc",
+        "attrn", "band", "betainv", "blshift", "bnot", "bor",
+        "brshift", "bxor", "byte", "cdf", "ceil", "cexist", "cinv",
+        "close", "cnonct", "collate", "compbl", "compound",
+        "compress", "cos", "cosh", "css", "curobs", "cv", "daccdb",
+        "daccdbsl", "daccsl", "daccsyd", "dacctab", "dairy", "date",
+        "datejul", "datepart", "datetime", "day", "dclose", "depdb",
+        "depdbsl", "depsl", "depsyd",
+        "deptab", "dequote", "dhms", "dif", "digamma",
+        "dim", "dinfo", "dnum", "dopen", "doptname", "doptnum",
+        "dread", "dropnote", "dsname", "erf", "erfc", "exist", "exp",
+        "fappend", "fclose", "fcol", "fdelete", "fetch", "fetchobs",
+        "fexist", "fget", "fileexist", "filename", "fileref",
+        "finfo", "finv", "fipname", "fipnamel", "fipstate", "floor",
+        "fnonct", "fnote", "fopen", "foptname", "foptnum", "fpoint",
+        "fpos", "fput", "fread", "frewind", "frlen", "fsep", "fuzz",
+        "fwrite", "gaminv", "gamma", "getoption", "getvarc", "getvarn",
+        "hbound", "hms", "hosthelp", "hour", "ibessel", "index",
+        "indexc", "indexw", "input", "inputc", "inputn", "int",
+        "intck", "intnx", "intrr", "irr", "jbessel", "juldate",
+        "kurtosis", "lag", "lbound", "left", "length", "lgamma",
+        "libname", "libref", "log", "log10", "log2", "logpdf", "logpmf",
+        "logsdf", "lowcase", "max", "mdy", "mean", "min", "minute",
+        "mod", "month", "mopen", "mort", "n", "netpv", "nmiss",
+        "normal", "note", "npv", "open", "ordinal", "pathname",
+        "pdf", "peek", "peekc", "pmf", "point", "poisson", "poke",
+        "probbeta", "probbnml", "probchi", "probf", "probgam",
+        "probhypr", "probit", "probnegb", "probnorm", "probt",
+        "put", "putc", "putn", "qtr", "quote", "ranbin", "rancau",
+        "ranexp", "rangam", "range", "rank", "rannor", "ranpoi",
+        "rantbl", "rantri", "ranuni", "repeat", "resolve", "reverse",
+        "rewind", "right", "round", "saving", "scan", "sdf", "second",
+        "sign", "sin", "sinh", "skewness", "soundex", "spedis",
+        "sqrt", "std", "stderr", "stfips", "stname", "stnamel",
+        "substr", "sum", "symget", "sysget", "sysmsg", "sysprod",
+        "sysrc", "system", "tan", "tanh", "time", "timepart", "tinv",
+        "tnonct", "today", "translate", "tranwrd", "trigamma",
+        "trim", "trimn", "trunc", "uniform", "upcase", "uss", "var",
+        "varfmt", "varinfmt", "varlabel", "varlen", "varname",
+        "varnum", "varray", "varrayx", "vartype", "verify", "vformat",
+        "vformatd", "vformatdx", "vformatn", "vformatnx", "vformatw",
+        "vformatwx", "vformatx", "vinarray", "vinarrayx", "vinformat",
+        "vinformatd", "vinformatdx", "vinformatn", "vinformatnx",
+        "vinformatw", "vinformatwx", "vinformatx", "vlabel",
+        "vlabelx", "vlength", "vlengthx", "vname", "vnamex", "vtype",
+        "vtypex", "weekday", "year", "yyq", "zipfips", "zipname",
+        "zipnamel", "zipstate"
+    )
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('proc-data'),
+            include('cards-datalines'),
+            include('logs'),
+            include('general'),
+            (r'.', Text),
+        ],
+        # SAS is multi-line regardless, but * is ended by ;
+        'comments': [
+            (r'^\s*\*.*?;', Comment),
+            (r'/\*.*?\*/', Comment),
+            (r'^\s*\*(.|\n)*?;', Comment.Multiline),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+        ],
+        # Special highlight for proc, data, quit, run
+        'proc-data': [
+            (r'(^|;)\s*(proc \w+|data|run|quit)[\s;]',
+             Keyword.Reserved),
+        ],
+        # Special highlight cards and datalines
+        'cards-datalines': [
+            (r'^\s*(datalines|cards)\s*;\s*$', Keyword, 'data'),
+        ],
+        'data': [
+            (r'(.|\n)*^\s*;\s*$', Other, '#pop'),
+        ],
+        # Special highlight for put NOTE|ERROR|WARNING (order matters)
+        'logs': [
+            (r'\n?^\s*%?put ', Keyword, 'log-messages'),
+        ],
+        'log-messages': [
+            (r'NOTE(:|-).*', Generic, '#pop'),
+            (r'WARNING(:|-).*', Generic.Emph, '#pop'),
+            (r'ERROR(:|-).*', Generic.Error, '#pop'),
+            include('general'),
+        ],
+        'general': [
+            include('keywords'),
+            include('vars-strings'),
+            include('special'),
+            include('numbers'),
+        ],
+        # Keywords, statements, functions, macros
+        'keywords': [
+            (words(builtins_statements,
+                   prefix = r'\b',
+                   suffix = r'\b'),
+             Keyword),
+            (words(builtins_sql,
+                   prefix = r'\b',
+                   suffix = r'\b'),
+             Keyword),
+            (words(builtins_conditionals,
+                   prefix = r'\b',
+                   suffix = r'\b'),
+             Keyword),
+            (words(builtins_macros,
+                   prefix = r'%',
+                   suffix = r'\b'),
+             Name.Builtin),
+            (words(builtins_functions,
+                   prefix = r'\b',
+                   suffix = r'\('),
+             Name.Builtin),
+        ],
+        # Strings and user-defined variables and macros (order matters)
+        'vars-strings': [
+            (r'&[a-z_]\w{0,31}\.?', Name.Variable),
+            (r'%[a-z_]\w{0,31}', Name.Function),
+            (r'\'', String, 'string_squote'),
+            (r'"', String, 'string_dquote'),
+        ],
+        'string_squote': [
+            ('\'', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),
+            # AFAIK, macro variables are not evaluated in single quotes
+            # (r'&', Name.Variable, 'validvar'),
+            (r'[^$\'\\]+', String),
+            (r'[$\'\\]', String),
+        ],
+        'string_dquote': [
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),
+            (r'&', Name.Variable, 'validvar'),
+            (r'[^$&"\\]+', String),
+            (r'[$"\\]', String),
+        ],
+        'validvar': [
+            (r'[a-z_]\w{0,31}\.?', Name.Variable, '#pop'),
+        ],
+        # SAS numbers and special variables
+        'numbers': [
+            (r'\b[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+|\.)(E[+-]?[0-9]+)?i?\b',
+             Number),
+        ],
+        'special': [
+            (r'(null|missing|_all_|_automatic_|_character_|_n_|'
+             r'_infile_|_name_|_null_|_numeric_|_user_|_webout_)',
+             Keyword.Constant),
+        ],
+        # 'operators': [
+        #     (r'(-|=|<=|>=|<|>|<>|&|!=|'
+        #      r'\||\*|\+|\^|/|!|~|~=)', Operator)
+        # ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/savi.py b/.venv/Lib/site-packages/pygments/lexers/savi.py
new file mode 100644 (file)
index 0000000..1e443ae
--- /dev/null
@@ -0,0 +1,171 @@
+"""
+    pygments.lexers.savi
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Savi.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include
+from pygments.token import Whitespace, Keyword, Name, String, Number, \
+  Operator, Punctuation, Comment, Generic, Error
+
+__all__ = ['SaviLexer']
+
+
+# The canonical version of this file can be found in the following repository,
+# where it is kept in sync with any language changes, as well as the other
+# pygments-like lexers that are maintained for use with other tools:
+# - https://github.com/savi-lang/savi/blob/main/tooling/pygments/lexers/savi.py
+#
+# If you're changing this file in the pygments repository, please ensure that
+# any changes you make are also propagated to the official Savi repository,
+# in order to avoid accidental clobbering of your changes later when an update
+# from the Savi repository flows forward into the pygments repository.
+#
+# If you're changing this file in the Savi repository, please ensure that
+# any changes you make are also reflected in the other pygments-like lexers
+# (rouge, vscode, etc) so that all of the lexers can be kept cleanly in sync.
+
+class SaviLexer(RegexLexer):
+    """
+    For Savi source code.
+
+    .. versionadded: 2.10
+    """
+
+    name = 'Savi'
+    url = 'https://github.com/savi-lang/savi'
+    aliases = ['savi']
+    filenames = ['*.savi']
+    version_added = ''
+
+    tokens = {
+      "root": [
+        # Line Comment
+        (r'//.*?$', Comment.Single),
+
+        # Doc Comment
+        (r'::.*?$', Comment.Single),
+
+        # Capability Operator
+        (r'(\')(\w+)(?=[^\'])', bygroups(Operator, Name)),
+
+        # Double-Quote String
+        (r'\w?"', String.Double, "string.double"),
+
+        # Single-Char String
+        (r"'", String.Char, "string.char"),
+
+        # Type Name
+        (r'(_?[A-Z]\w*)', Name.Class),
+
+        # Nested Type Name
+        (r'(\.)(\s*)(_?[A-Z]\w*)', bygroups(Punctuation, Whitespace, Name.Class)),
+
+        # Declare
+        (r'^([ \t]*)(:\w+)',
+          bygroups(Whitespace, Name.Tag),
+          "decl"),
+
+        # Error-Raising Calls/Names
+        (r'((\w+|\+|\-|\*)\!)', Generic.Deleted),
+
+        # Numeric Values
+        (r'\b\d([\d_]*(\.[\d_]+)?)\b', Number),
+
+        # Hex Numeric Values
+        (r'\b0x([0-9a-fA-F_]+)\b', Number.Hex),
+
+        # Binary Numeric Values
+        (r'\b0b([01_]+)\b', Number.Bin),
+
+        # Function Call (with braces)
+        (r'\w+(?=\()', Name.Function),
+
+        # Function Call (with receiver)
+        (r'(\.)(\s*)(\w+)', bygroups(Punctuation, Whitespace, Name.Function)),
+
+        # Function Call (with self receiver)
+        (r'(@)(\w+)', bygroups(Punctuation, Name.Function)),
+
+        # Parenthesis
+        (r'\(', Punctuation, "root"),
+        (r'\)', Punctuation, "#pop"),
+
+        # Brace
+        (r'\{', Punctuation, "root"),
+        (r'\}', Punctuation, "#pop"),
+
+        # Bracket
+        (r'\[', Punctuation, "root"),
+        (r'(\])(\!)', bygroups(Punctuation, Generic.Deleted), "#pop"),
+        (r'\]', Punctuation, "#pop"),
+
+        # Punctuation
+        (r'[,;:\.@]', Punctuation),
+
+        # Piping Operators
+        (r'(\|\>)', Operator),
+
+        # Branching Operators
+        (r'(\&\&|\|\||\?\?|\&\?|\|\?|\.\?)', Operator),
+
+        # Comparison Operators
+        (r'(\<\=\>|\=\~|\=\=|\<\=|\>\=|\<|\>)', Operator),
+
+        # Arithmetic Operators
+        (r'(\+|\-|\/|\*|\%)', Operator),
+
+        # Assignment Operators
+        (r'(\=)', Operator),
+
+        # Other Operators
+        (r'(\!|\<\<|\<|\&|\|)', Operator),
+
+        # Identifiers
+        (r'\b\w+\b', Name),
+
+        # Whitespace
+        (r'[ \t\r]+\n*|\n+', Whitespace),
+      ],
+
+      # Declare (nested rules)
+      "decl": [
+        (r'\b[a-z_]\w*\b(?!\!)', Keyword.Declaration),
+        (r':', Punctuation, "#pop"),
+        (r'\n', Whitespace, "#pop"),
+        include("root"),
+      ],
+
+      # Double-Quote String (nested rules)
+      "string.double": [
+        (r'\\\(', String.Interpol, "string.interpolation"),
+        (r'\\u[0-9a-fA-F]{4}', String.Escape),
+        (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        (r'\\[bfnrt\\\']', String.Escape),
+        (r'\\"', String.Escape),
+        (r'"', String.Double, "#pop"),
+        (r'[^\\"]+', String.Double),
+        (r'.', Error),
+      ],
+
+      # Single-Char String (nested rules)
+      "string.char": [
+        (r'\\u[0-9a-fA-F]{4}', String.Escape),
+        (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        (r'\\[bfnrt\\\']', String.Escape),
+        (r"\\'", String.Escape),
+        (r"'", String.Char, "#pop"),
+        (r"[^\\']+", String.Char),
+        (r'.', Error),
+      ],
+
+      # Interpolation inside String (nested rules)
+      "string.interpolation": [
+        (r"\)", String.Interpol, "#pop"),
+        include("root"),
+      ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/scdoc.py b/.venv/Lib/site-packages/pygments/lexers/scdoc.py
new file mode 100644 (file)
index 0000000..8e850d0
--- /dev/null
@@ -0,0 +1,85 @@
+"""
+    pygments.lexers.scdoc
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for scdoc, a simple man page generator.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this
+from pygments.token import Text, Comment, Keyword, String, Generic
+
+__all__ = ['ScdocLexer']
+
+
+class ScdocLexer(RegexLexer):
+    """
+    `scdoc` is a simple man page generator for POSIX systems written in C99.
+    """
+    name = 'scdoc'
+    url = 'https://git.sr.ht/~sircmpwn/scdoc'
+    aliases = ['scdoc', 'scd']
+    filenames = ['*.scd', '*.scdoc']
+    version_added = '2.5'
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            # comment
+            (r'^(;.+\n)', bygroups(Comment)),
+
+            # heading with pound prefix
+            (r'^(#)([^#].+\n)', bygroups(Generic.Heading, Text)),
+            (r'^(#{2})(.+\n)', bygroups(Generic.Subheading, Text)),
+            # bulleted lists
+            (r'^(\s*)([*-])(\s)(.+\n)',
+            bygroups(Text, Keyword, Text, using(this, state='inline'))),
+            # numbered lists
+            (r'^(\s*)(\.+\.)( .+\n)',
+            bygroups(Text, Keyword, using(this, state='inline'))),
+            # quote
+            (r'^(\s*>\s)(.+\n)', bygroups(Keyword, Generic.Emph)),
+            # text block
+            (r'^(```\n)([\w\W]*?)(^```$)', bygroups(String, Text, String)),
+
+            include('inline'),
+        ],
+        'inline': [
+            # escape
+            (r'\\.', Text),
+            # underlines
+            (r'(\s)(_[^_]+_)(\W|\n)', bygroups(Text, Generic.Emph, Text)),
+            # bold
+            (r'(\s)(\*[^*]+\*)(\W|\n)', bygroups(Text, Generic.Strong, Text)),
+            # inline code
+            (r'`[^`]+`', String.Backtick),
+
+            # general text, must come last!
+            (r'[^\\\s]+', Text),
+            (r'.', Text),
+        ],
+    }
+
+    def analyse_text(text):
+        """We checks for bold and underline text with * and _. Also
+        every scdoc file must start with a strictly defined first line."""
+        result = 0
+
+        if '*' in text:
+            result += 0.01
+
+        if '_' in text:
+            result += 0.01
+
+        # name(section) ["left_footer" ["center_header"]]
+        first_line = text.partition('\n')[0]
+        scdoc_preamble_pattern = r'^.*\([1-7]\)( "[^"]+"){0,2}$'
+
+        if re.search(scdoc_preamble_pattern, first_line):
+            result += 0.5
+
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/scripting.py b/.venv/Lib/site-packages/pygments/lexers/scripting.py
new file mode 100644 (file)
index 0000000..17deae9
--- /dev/null
@@ -0,0 +1,1614 @@
+"""
+    pygments.lexers.scripting
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for scripting and embedded languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, default, combined, \
+    words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Whitespace, Other
+from pygments.util import get_bool_opt, get_list_opt
+
+__all__ = ['LuaLexer', 'LuauLexer', 'MoonScriptLexer', 'ChaiscriptLexer', 'LSLLexer',
+           'AppleScriptLexer', 'RexxLexer', 'MOOCodeLexer', 'HybrisLexer',
+           'EasytrieveLexer', 'JclLexer', 'MiniScriptLexer']
+
+
+def all_lua_builtins():
+    from pygments.lexers._lua_builtins import MODULES
+    return [w for values in MODULES.values() for w in values]
+
+class LuaLexer(RegexLexer):
+    """
+    For Lua source code.
+
+    Additional options accepted:
+
+    `func_name_highlighting`
+        If given and ``True``, highlight builtin function names
+        (default: ``True``).
+    `disabled_modules`
+        If given, must be a list of module names whose function names
+        should not be highlighted. By default all modules are highlighted.
+
+        To get a list of allowed modules have a look into the
+        `_lua_builtins` module:
+
+        .. sourcecode:: pycon
+
+            >>> from pygments.lexers._lua_builtins import MODULES
+            >>> MODULES.keys()
+            ['string', 'coroutine', 'modules', 'io', 'basic', ...]
+    """
+
+    name = 'Lua'
+    url = 'https://www.lua.org/'
+    aliases = ['lua']
+    filenames = ['*.lua', '*.wlua']
+    mimetypes = ['text/x-lua', 'application/x-lua']
+    version_added = ''
+
+    _comment_multiline = r'(?:--\[(?P<level>=*)\[[\w\W]*?\](?P=level)\])'
+    _comment_single = r'(?:--.*$)'
+    _space = r'(?:\s+)'
+    _s = rf'(?:{_comment_multiline}|{_comment_single}|{_space})'
+    _name = r'(?:[^\W\d]\w*)'
+
+    tokens = {
+        'root': [
+            # Lua allows a file to start with a shebang.
+            (r'#!.*', Comment.Preproc),
+            default('base'),
+        ],
+        'ws': [
+            (_comment_multiline, Comment.Multiline),
+            (_comment_single, Comment.Single),
+            (_space, Whitespace),
+        ],
+        'base': [
+            include('ws'),
+
+            (r'(?i)0x[\da-f]*(\.[\da-f]*)?(p[+-]?\d+)?', Number.Hex),
+            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number.Float),
+            (r'(?i)\d+e[+-]?\d+', Number.Float),
+            (r'\d+', Number.Integer),
+
+            # multiline strings
+            (r'(?s)\[(=*)\[.*?\]\1\]', String),
+
+            (r'::', Punctuation, 'label'),
+            (r'\.{3}', Punctuation),
+            (r'[=<>|~&+\-*/%#^]+|\.\.', Operator),
+            (r'[\[\]{}().,:;]+', Punctuation),
+            (r'(and|or|not)\b', Operator.Word),
+
+            ('(break|do|else|elseif|end|for|if|in|repeat|return|then|until|'
+             r'while)\b', Keyword.Reserved),
+            (r'goto\b', Keyword.Reserved, 'goto'),
+            (r'(local)\b', Keyword.Declaration),
+            (r'(true|false|nil)\b', Keyword.Constant),
+
+            (r'(function)\b', Keyword.Reserved, 'funcname'),
+
+            (words(all_lua_builtins(), suffix=r"\b"), Name.Builtin),
+            (fr'[A-Za-z_]\w*(?={_s}*[.:])', Name.Variable, 'varname'),
+            (fr'[A-Za-z_]\w*(?={_s}*\()', Name.Function),
+            (r'[A-Za-z_]\w*', Name.Variable),
+
+            ("'", String.Single, combined('stringescape', 'sqs')),
+            ('"', String.Double, combined('stringescape', 'dqs'))
+        ],
+
+        'varname': [
+            include('ws'),
+            (r'\.\.', Operator, '#pop'),
+            (r'[.:]', Punctuation),
+            (rf'{_name}(?={_s}*[.:])', Name.Property),
+            (rf'{_name}(?={_s}*\()', Name.Function, '#pop'),
+            (_name, Name.Property, '#pop'),
+        ],
+
+        'funcname': [
+            include('ws'),
+            (r'[.:]', Punctuation),
+            (rf'{_name}(?={_s}*[.:])', Name.Class),
+            (_name, Name.Function, '#pop'),
+            # inline function
+            (r'\(', Punctuation, '#pop'),
+        ],
+
+        'goto': [
+            include('ws'),
+            (_name, Name.Label, '#pop'),
+        ],
+
+        'label': [
+            include('ws'),
+            (r'::', Punctuation, '#pop'),
+            (_name, Name.Label),
+        ],
+
+        'stringescape': [
+            (r'\\([abfnrtv\\"\']|[\r\n]{1,2}|z\s*|x[0-9a-fA-F]{2}|\d{1,3}|'
+             r'u\{[0-9a-fA-F]+\})', String.Escape),
+        ],
+
+        'sqs': [
+            (r"'", String.Single, '#pop'),
+            (r"[^\\']+", String.Single),
+        ],
+
+        'dqs': [
+            (r'"', String.Double, '#pop'),
+            (r'[^\\"]+', String.Double),
+        ]
+    }
+
+    def __init__(self, **options):
+        self.func_name_highlighting = get_bool_opt(
+            options, 'func_name_highlighting', True)
+        self.disabled_modules = get_list_opt(options, 'disabled_modules', [])
+
+        self._functions = set()
+        if self.func_name_highlighting:
+            from pygments.lexers._lua_builtins import MODULES
+            for mod, func in MODULES.items():
+                if mod not in self.disabled_modules:
+                    self._functions.update(func)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name.Builtin and value not in self._functions:
+                if '.' in value:
+                    a, b = value.split('.')
+                    yield index, Name, a
+                    yield index + len(a), Punctuation, '.'
+                    yield index + len(a) + 1, Name, b
+                else:
+                    yield index, Name, value
+                continue
+            yield index, token, value
+
+def _luau_make_expression(should_pop, _s):
+    temp_list = [
+        (r'0[xX][\da-fA-F_]*', Number.Hex, '#pop'),
+        (r'0[bB][\d_]*', Number.Bin, '#pop'),
+        (r'\.?\d[\d_]*(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?', Number.Float, '#pop'),
+
+        (words((
+            'true', 'false', 'nil'
+        ), suffix=r'\b'), Keyword.Constant, '#pop'),
+
+        (r'\[(=*)\[[.\n]*?\]\1\]', String, '#pop'),
+
+        (r'(\.)([a-zA-Z_]\w*)(?=%s*[({"\'])', bygroups(Punctuation, Name.Function), '#pop'),
+        (r'(\.)([a-zA-Z_]\w*)', bygroups(Punctuation, Name.Variable), '#pop'),
+
+        (rf'[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*(?={_s}*[({{"\'])', Name.Other, '#pop'),
+        (r'[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*', Name, '#pop'),
+    ]
+    if should_pop:
+        return temp_list
+    return [entry[:2] for entry in temp_list]
+
+def _luau_make_expression_special(should_pop):
+    temp_list = [
+        (r'\{', Punctuation, ('#pop', 'closing_brace_base', 'expression')),
+        (r'\(', Punctuation, ('#pop', 'closing_parenthesis_base', 'expression')),
+
+        (r'::?', Punctuation, ('#pop', 'type_end', 'type_start')),
+
+        (r"'", String.Single, ('#pop', 'string_single')),
+        (r'"', String.Double, ('#pop', 'string_double')),
+        (r'`', String.Backtick, ('#pop', 'string_interpolated')),
+    ]
+    if should_pop:
+        return temp_list
+    return [(entry[0], entry[1], entry[2][1:]) for entry in temp_list]
+
+class LuauLexer(RegexLexer):
+    """
+    For Luau source code.
+
+    Additional options accepted:
+
+    `include_luau_builtins`
+        If given and ``True``, automatically highlight Luau builtins
+        (default: ``True``).
+    `include_roblox_builtins`
+        If given and ``True``, automatically highlight Roblox-specific builtins
+        (default: ``False``).
+    `additional_builtins`
+        If given, must be a list of additional builtins to highlight.
+    `disabled_builtins`
+        If given, must be a list of builtins that will not be highlighted.
+    """
+
+    name = 'Luau'
+    url = 'https://luau-lang.org/'
+    aliases = ['luau']
+    filenames = ['*.luau']
+    version_added = '2.18'
+
+    _comment_multiline = r'(?:--\[(?P<level>=*)\[[\w\W]*?\](?P=level)\])'
+    _comment_single = r'(?:--.*$)'
+    _s = r'(?:{}|{}|{})'.format(_comment_multiline, _comment_single, r'\s+')
+
+    tokens = {
+        'root': [
+            (r'#!.*', Comment.Hashbang, 'base'),
+            default('base'),
+        ],
+
+        'ws': [
+            (_comment_multiline, Comment.Multiline),
+            (_comment_single, Comment.Single),
+            (r'\s+', Whitespace),
+        ],
+
+        'base': [
+            include('ws'),
+
+            *_luau_make_expression_special(False),
+            (r'\.\.\.', Punctuation),
+
+            (rf'type\b(?={_s}+[a-zA-Z_])', Keyword.Reserved, 'type_declaration'),
+            (rf'export\b(?={_s}+[a-zA-Z_])', Keyword.Reserved),
+
+            (r'(?:\.\.|//|[+\-*\/%^<>=])=?', Operator, 'expression'),
+            (r'~=', Operator, 'expression'),
+
+            (words((
+                'and', 'or', 'not'
+            ), suffix=r'\b'), Operator.Word, 'expression'),
+
+            (words((
+                'elseif', 'for', 'if', 'in', 'repeat', 'return', 'until',
+                'while'), suffix=r'\b'), Keyword.Reserved, 'expression'),
+            (r'local\b', Keyword.Declaration, 'expression'),
+
+            (r'function\b', Keyword.Reserved, ('expression', 'func_name')),
+
+            (r'[\])};]+', Punctuation),
+
+            include('expression_static'),
+            *_luau_make_expression(False, _s),
+
+            (r'[\[.,]', Punctuation, 'expression'),
+        ],
+        'expression_static': [
+            (words((
+                'break', 'continue', 'do', 'else', 'elseif', 'end', 'for',
+                'if', 'in', 'repeat', 'return', 'then', 'until', 'while'),
+                suffix=r'\b'), Keyword.Reserved),
+        ],
+        'expression': [
+            include('ws'),
+
+            (r'if\b', Keyword.Reserved, ('ternary', 'expression')),
+
+            (r'local\b', Keyword.Declaration),
+            *_luau_make_expression_special(True),
+            (r'\.\.\.', Punctuation, '#pop'),
+
+            (r'function\b', Keyword.Reserved, 'func_name'),
+
+            include('expression_static'),
+            *_luau_make_expression(True, _s),
+
+            default('#pop'),
+        ],
+        'ternary': [
+            include('ws'),
+
+            (r'else\b', Keyword.Reserved, '#pop'),
+            (words((
+                'then', 'elseif',
+            ), suffix=r'\b'), Operator.Reserved, 'expression'),
+
+            default('#pop'),
+        ],
+
+        'closing_brace_pop': [
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'closing_parenthesis_pop': [
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'closing_gt_pop': [
+            (r'>', Punctuation, '#pop'),
+        ],
+
+        'closing_parenthesis_base': [
+            include('closing_parenthesis_pop'),
+            include('base'),
+        ],
+        'closing_parenthesis_type': [
+            include('closing_parenthesis_pop'),
+            include('type'),
+        ],
+        'closing_brace_base': [
+            include('closing_brace_pop'),
+            include('base'),
+        ],
+        'closing_brace_type': [
+            include('closing_brace_pop'),
+            include('type'),
+        ],
+        'closing_gt_type': [
+            include('closing_gt_pop'),
+            include('type'),
+        ],
+
+        'string_escape': [
+            (r'\\z\s*', String.Escape),
+            (r'\\(?:[abfnrtvz\\"\'`\{\n])|[\r\n]{1,2}|x[\da-fA-F]{2}|\d{1,3}|'
+             r'u\{\}[\da-fA-F]*\}', String.Escape),
+        ],
+        'string_single': [
+            include('string_escape'),
+
+            (r"'", String.Single, "#pop"),
+            (r"[^\\']+", String.Single),
+        ],
+        'string_double': [
+            include('string_escape'),
+
+            (r'"', String.Double, "#pop"),
+            (r'[^\\"]+', String.Double),
+        ],
+        'string_interpolated': [
+            include('string_escape'),
+
+            (r'\{', Punctuation, ('closing_brace_base', 'expression')),
+
+            (r'`', String.Backtick, "#pop"),
+            (r'[^\\`\{]+', String.Backtick),
+        ],
+
+        'func_name': [
+            include('ws'),
+
+            (r'[.:]', Punctuation),
+            (rf'[a-zA-Z_]\w*(?={_s}*[.:])', Name.Class),
+            (r'[a-zA-Z_]\w*', Name.Function),
+
+            (r'<', Punctuation, 'closing_gt_type'),
+
+            (r'\(', Punctuation, '#pop'),
+        ],
+
+        'type': [
+            include('ws'),
+
+            (r'\(', Punctuation, 'closing_parenthesis_type'),
+            (r'\{', Punctuation, 'closing_brace_type'),
+            (r'<', Punctuation, 'closing_gt_type'),
+
+            (r"'", String.Single, 'string_single'),
+            (r'"', String.Double, 'string_double'),
+
+            (r'[|&\.,\[\]:=]+', Punctuation),
+            (r'->', Punctuation),
+
+            (r'typeof\(', Name.Builtin, ('closing_parenthesis_base',
+                                         'expression')),
+            (r'[a-zA-Z_]\w*', Name.Class),
+        ],
+        'type_start': [
+            include('ws'),
+
+            (r'\(', Punctuation, ('#pop', 'closing_parenthesis_type')),
+            (r'\{', Punctuation, ('#pop', 'closing_brace_type')),
+            (r'<', Punctuation, ('#pop', 'closing_gt_type')),
+
+            (r"'", String.Single, ('#pop', 'string_single')),
+            (r'"', String.Double, ('#pop', 'string_double')),
+
+            (r'typeof\(', Name.Builtin, ('#pop', 'closing_parenthesis_base',
+                                         'expression')),
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+        ],
+        'type_end': [
+            include('ws'),
+
+            (r'[|&\.]', Punctuation, 'type_start'),
+            (r'->', Punctuation, 'type_start'),
+
+            (r'<', Punctuation, 'closing_gt_type'),
+
+            default('#pop'),
+        ],
+        'type_declaration': [
+            include('ws'),
+
+            (r'[a-zA-Z_]\w*', Name.Class),
+            (r'<', Punctuation, 'closing_gt_type'),
+
+            (r'=', Punctuation, ('#pop', 'type_end', 'type_start')),
+        ],
+    }
+
+    def __init__(self, **options):
+        self.include_luau_builtins = get_bool_opt(
+            options, 'include_luau_builtins', True)
+        self.include_roblox_builtins = get_bool_opt(
+            options, 'include_roblox_builtins', False)
+        self.additional_builtins = get_list_opt(options, 'additional_builtins', [])
+        self.disabled_builtins = get_list_opt(options, 'disabled_builtins', [])
+
+        self._builtins = set(self.additional_builtins)
+        if self.include_luau_builtins:
+            from pygments.lexers._luau_builtins import LUAU_BUILTINS
+            self._builtins.update(LUAU_BUILTINS)
+        if self.include_roblox_builtins:
+            from pygments.lexers._luau_builtins import ROBLOX_BUILTINS
+            self._builtins.update(ROBLOX_BUILTINS)
+        if self.additional_builtins:
+            self._builtins.update(self.additional_builtins)
+        self._builtins.difference_update(self.disabled_builtins)
+
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name or token is Name.Other:
+                split_value = value.split('.')
+                complete_value = []
+                new_index = index
+                for position in range(len(split_value), 0, -1):
+                    potential_string = '.'.join(split_value[:position])
+                    if potential_string in self._builtins:
+                        yield index, Name.Builtin, potential_string
+                        new_index += len(potential_string)
+
+                        if complete_value:
+                            yield new_index, Punctuation, '.'
+                            new_index += 1
+                        break
+                    complete_value.insert(0, split_value[position - 1])
+
+                for position, substring in enumerate(complete_value):
+                    if position + 1 == len(complete_value):
+                        if token is Name:
+                            yield new_index, Name.Variable, substring
+                            continue
+                        yield new_index, Name.Function, substring
+                        continue
+                    yield new_index, Name.Variable, substring
+                    new_index += len(substring)
+                    yield new_index, Punctuation, '.'
+                    new_index += 1
+
+                continue
+            yield index, token, value
+
+class MoonScriptLexer(LuaLexer):
+    """
+    For MoonScript source code.
+    """
+
+    name = 'MoonScript'
+    url = 'http://moonscript.org'
+    aliases = ['moonscript', 'moon']
+    filenames = ['*.moon']
+    mimetypes = ['text/x-moonscript', 'application/x-moonscript']
+    version_added = '1.5'
+
+    tokens = {
+        'root': [
+            (r'#!(.*?)$', Comment.Preproc),
+            default('base'),
+        ],
+        'base': [
+            ('--.*$', Comment.Single),
+            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number.Float),
+            (r'(?i)\d+e[+-]?\d+', Number.Float),
+            (r'(?i)0x[0-9a-f]*', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'\n', Whitespace),
+            (r'[^\S\n]+', Text),
+            (r'(?s)\[(=*)\[.*?\]\1\]', String),
+            (r'(->|=>)', Name.Function),
+            (r':[a-zA-Z_]\w*', Name.Variable),
+            (r'(==|!=|~=|<=|>=|\.\.\.|\.\.|[=+\-*/%^<>#!.\\:])', Operator),
+            (r'[;,]', Punctuation),
+            (r'[\[\]{}()]', Keyword.Type),
+            (r'[a-zA-Z_]\w*:', Name.Variable),
+            (words((
+                'class', 'extends', 'if', 'then', 'super', 'do', 'with',
+                'import', 'export', 'while', 'elseif', 'return', 'for', 'in',
+                'from', 'when', 'using', 'else', 'and', 'or', 'not', 'switch',
+                'break'), suffix=r'\b'),
+             Keyword),
+            (r'(true|false|nil)\b', Keyword.Constant),
+            (r'(and|or|not)\b', Operator.Word),
+            (r'(self)\b', Name.Builtin.Pseudo),
+            (r'@@?([a-zA-Z_]\w*)?', Name.Variable.Class),
+            (r'[A-Z]\w*', Name.Class),  # proper name
+            (words(all_lua_builtins(), suffix=r"\b"), Name.Builtin),
+            (r'[A-Za-z_]\w*', Name),
+            ("'", String.Single, combined('stringescape', 'sqs')),
+            ('"', String.Double, combined('stringescape', 'dqs'))
+        ],
+        'stringescape': [
+            (r'''\\([abfnrtv\\"']|\d{1,3})''', String.Escape)
+        ],
+        'sqs': [
+            ("'", String.Single, '#pop'),
+            ("[^']+", String)
+        ],
+        'dqs': [
+            ('"', String.Double, '#pop'),
+            ('[^"]+', String)
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text):
+        # set . as Operator instead of Punctuation
+        for index, token, value in LuaLexer.get_tokens_unprocessed(self, text):
+            if token == Punctuation and value == ".":
+                token = Operator
+            yield index, token, value
+
+
+class ChaiscriptLexer(RegexLexer):
+    """
+    For ChaiScript source code.
+    """
+
+    name = 'ChaiScript'
+    url = 'http://chaiscript.com/'
+    aliases = ['chaiscript', 'chai']
+    filenames = ['*.chai']
+    mimetypes = ['text/x-chaiscript', 'application/x-chaiscript']
+    version_added = '2.0'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'^\#.*?\n', Comment.Single)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            include('commentsandwhitespace'),
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|\.\.'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'[=+\-*/]', Operator),
+            (r'(for|in|while|do|break|return|continue|if|else|'
+             r'throw|try|catch'
+             r')\b', Keyword, 'slashstartsregex'),
+            (r'(var)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(attr|def|fun)\b', Keyword.Reserved),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'(eval|throw)\b', Name.Builtin),
+            (r'`\S+`', Name.Builtin),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"', String.Double, 'dqstring'),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ],
+        'dqstring': [
+            (r'\$\{[^"}]+?\}', String.Interpol),
+            (r'\$', String.Double),
+            (r'\\\\', String.Double),
+            (r'\\"', String.Double),
+            (r'[^\\"$]+', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+    }
+
+
+class LSLLexer(RegexLexer):
+    """
+    For Second Life's Linden Scripting Language source code.
+    """
+
+    name = 'LSL'
+    aliases = ['lsl']
+    filenames = ['*.lsl']
+    mimetypes = ['text/x-lsl']
+    url = 'https://wiki.secondlife.com/wiki/Linden_Scripting_Language'
+    version_added = '2.0'
+
+    flags = re.MULTILINE
+
+    lsl_keywords = r'\b(?:do|else|for|if|jump|return|while)\b'
+    lsl_types = r'\b(?:float|integer|key|list|quaternion|rotation|string|vector)\b'
+    lsl_states = r'\b(?:(?:state)\s+\w+|default)\b'
+    lsl_events = r'\b(?:state_(?:entry|exit)|touch(?:_(?:start|end))?|(?:land_)?collision(?:_(?:start|end))?|timer|listen|(?:no_)?sensor|control|(?:not_)?at_(?:rot_)?target|money|email|run_time_permissions|changed|attach|dataserver|moving_(?:start|end)|link_message|(?:on|object)_rez|remote_data|http_re(?:sponse|quest)|path_update|transaction_result)\b'
+    lsl_functions_builtin = r'\b(?:ll(?:ReturnObjectsBy(?:ID|Owner)|Json(?:2List|[GS]etValue|ValueType)|Sin|Cos|Tan|Atan2|Sqrt|Pow|Abs|Fabs|Frand|Floor|Ceil|Round|Vec(?:Mag|Norm|Dist)|Rot(?:Between|2(?:Euler|Fwd|Left|Up))|(?:Euler|Axes)2Rot|Whisper|(?:Region|Owner)?Say|Shout|Listen(?:Control|Remove)?|Sensor(?:Repeat|Remove)?|Detected(?:Name|Key|Owner|Type|Pos|Vel|Grab|Rot|Group|LinkNumber)|Die|Ground|Wind|(?:[GS]et)(?:AnimationOverride|MemoryLimit|PrimMediaParams|ParcelMusicURL|Object(?:Desc|Name)|PhysicsMaterial|Status|Scale|Color|Alpha|Texture|Pos|Rot|Force|Torque)|ResetAnimationOverride|(?:Scale|Offset|Rotate)Texture|(?:Rot)?Target(?:Remove)?|(?:Stop)?MoveToTarget|Apply(?:Rotational)?Impulse|Set(?:KeyframedMotion|ContentType|RegionPos|(?:Angular)?Velocity|Buoyancy|HoverHeight|ForceAndTorque|TimerEvent|ScriptState|Damage|TextureAnim|Sound(?:Queueing|Radius)|Vehicle(?:Type|(?:Float|Vector|Rotation)Param)|(?:Touch|Sit)?Text|Camera(?:Eye|At)Offset|PrimitiveParams|ClickAction|Link(?:Alpha|Color|PrimitiveParams(?:Fast)?|Texture(?:Anim)?|Camera|Media)|RemoteScriptAccessPin|PayPrice|LocalRot)|ScaleByFactor|Get(?:(?:Max|Min)ScaleFactor|ClosestNavPoint|StaticPath|SimStats|Env|PrimitiveParams|Link(?:PrimitiveParams|Number(?:OfSides)?|Key|Name|Media)|HTTPHeader|FreeURLs|Object(?:Details|PermMask|PrimCount)|Parcel(?:MaxPrims|Details|Prim(?:Count|Owners))|Attached|(?:SPMax|Free|Used)Memory|Region(?:Name|TimeDilation|FPS|Corner|AgentCount)|Root(?:Position|Rotation)|UnixTime|(?:Parcel|Region)Flags|(?:Wall|GMT)clock|SimulatorHostname|BoundingBox|GeometricCenter|Creator|NumberOf(?:Prims|NotecardLines|Sides)|Animation(?:List)?|(?:Camera|Local)(?:Pos|Rot)|Vel|Accel|Omega|Time(?:stamp|OfDay)|(?:Object|CenterOf)?Mass|MassMKS|Energy|Owner|(?:Owner)?Key|SunDirection|Texture(?:Offset|Scale|Rot)|Inventory(?:Number|Name|Key|Type|Creator|PermMask)|Permissions(?:Key)?|StartParameter|List(?:Length|EntryType)|Date|Agent(?:Size|Info|Language|List)|LandOwnerAt|NotecardLine|Script(?:Name|State))|(?:Get|Reset|GetAndReset)Time|PlaySound(?:Slave)?|LoopSound(?:Master|Slave)?|(?:Trigger|Stop|Preload)Sound|(?:(?:Get|Delete)Sub|Insert)String|To(?:Upper|Lower)|Give(?:InventoryList|Money)|RezObject|(?:Stop)?LookAt|Sleep|CollisionFilter|(?:Take|Release)Controls|DetachFromAvatar|AttachToAvatar(?:Temp)?|InstantMessage|(?:GetNext)?Email|StopHover|MinEventDelay|RotLookAt|String(?:Length|Trim)|(?:Start|Stop)Animation|TargetOmega|RequestPermissions|(?:Create|Break)Link|BreakAllLinks|(?:Give|Remove)Inventory|Water|PassTouches|Request(?:Agent|Inventory)Data|TeleportAgent(?:Home|GlobalCoords)?|ModifyLand|CollisionSound|ResetScript|MessageLinked|PushObject|PassCollisions|AxisAngle2Rot|Rot2(?:Axis|Angle)|A(?:cos|sin)|AngleBetween|AllowInventoryDrop|SubStringIndex|List2(?:CSV|Integer|Json|Float|String|Key|Vector|Rot|List(?:Strided)?)|DeleteSubList|List(?:Statistics|Sort|Randomize|(?:Insert|Find|Replace)List)|EdgeOfWorld|AdjustSoundVolume|Key2Name|TriggerSoundLimited|EjectFromLand|(?:CSV|ParseString)2List|OverMyLand|SameGroup|UnSit|Ground(?:Slope|Normal|Contour)|GroundRepel|(?:Set|Remove)VehicleFlags|(?:AvatarOn)?(?:Link)?SitTarget|Script(?:Danger|Profiler)|Dialog|VolumeDetect|ResetOtherScript|RemoteLoadScriptPin|(?:Open|Close)RemoteDataChannel|SendRemoteData|RemoteDataReply|(?:Integer|String)ToBase64|XorBase64|Log(?:10)?|Base64To(?:String|Integer)|ParseStringKeepNulls|RezAtRoot|RequestSimulatorData|ForceMouselook|(?:Load|Release|(?:E|Une)scape)URL|ParcelMedia(?:CommandList|Query)|ModPow|MapDestination|(?:RemoveFrom|AddTo|Reset)Land(?:Pass|Ban)List|(?:Set|Clear)CameraParams|HTTP(?:Request|Response)|TextBox|DetectedTouch(?:UV|Face|Pos|(?:N|Bin)ormal|ST)|(?:MD5|SHA1|DumpList2)String|Request(?:Secure)?URL|Clear(?:Prim|Link)Media|(?:Link)?ParticleSystem|(?:Get|Request)(?:Username|DisplayName)|RegionSayTo|CastRay|GenerateKey|TransferLindenDollars|ManageEstateAccess|(?:Create|Delete)Character|ExecCharacterCmd|Evade|FleeFrom|NavigateTo|PatrolPoints|Pursue|UpdateCharacter|WanderWithin))\b'
+    lsl_constants_float = r'\b(?:DEG_TO_RAD|PI(?:_BY_TWO)?|RAD_TO_DEG|SQRT2|TWO_PI)\b'
+    lsl_constants_integer = r'\b(?:JSON_APPEND|STATUS_(?:PHYSICS|ROTATE_[XYZ]|PHANTOM|SANDBOX|BLOCK_GRAB(?:_OBJECT)?|(?:DIE|RETURN)_AT_EDGE|CAST_SHADOWS|OK|MALFORMED_PARAMS|TYPE_MISMATCH|BOUNDS_ERROR|NOT_(?:FOUND|SUPPORTED)|INTERNAL_ERROR|WHITELIST_FAILED)|AGENT(?:_(?:BY_(?:LEGACY_|USER)NAME|FLYING|ATTACHMENTS|SCRIPTED|MOUSELOOK|SITTING|ON_OBJECT|AWAY|WALKING|IN_AIR|TYPING|CROUCHING|BUSY|ALWAYS_RUN|AUTOPILOT|LIST_(?:PARCEL(?:_OWNER)?|REGION)))?|CAMERA_(?:PITCH|DISTANCE|BEHINDNESS_(?:ANGLE|LAG)|(?:FOCUS|POSITION)(?:_(?:THRESHOLD|LOCKED|LAG))?|FOCUS_OFFSET|ACTIVE)|ANIM_ON|LOOP|REVERSE|PING_PONG|SMOOTH|ROTATE|SCALE|ALL_SIDES|LINK_(?:ROOT|SET|ALL_(?:OTHERS|CHILDREN)|THIS)|ACTIVE|PASSIVE|SCRIPTED|CONTROL_(?:FWD|BACK|(?:ROT_)?(?:LEFT|RIGHT)|UP|DOWN|(?:ML_)?LBUTTON)|PERMISSION_(?:RETURN_OBJECTS|DEBIT|OVERRIDE_ANIMATIONS|SILENT_ESTATE_MANAGEMENT|TAKE_CONTROLS|TRIGGER_ANIMATION|ATTACH|CHANGE_LINKS|(?:CONTROL|TRACK)_CAMERA|TELEPORT)|INVENTORY_(?:TEXTURE|SOUND|OBJECT|SCRIPT|LANDMARK|CLOTHING|NOTECARD|BODYPART|ANIMATION|GESTURE|ALL|NONE)|CHANGED_(?:INVENTORY|COLOR|SHAPE|SCALE|TEXTURE|LINK|ALLOWED_DROP|OWNER|REGION(?:_START)?|TELEPORT|MEDIA)|OBJECT_(?:(?:PHYSICS|SERVER|STREAMING)_COST|UNKNOWN_DETAIL|CHARACTER_TIME|PHANTOM|PHYSICS|TEMP_ON_REZ|NAME|DESC|POS|PRIM_EQUIVALENCE|RETURN_(?:PARCEL(?:_OWNER)?|REGION)|ROO?T|VELOCITY|OWNER|GROUP|CREATOR|ATTACHED_POINT|RENDER_WEIGHT|PATHFINDING_TYPE|(?:RUNNING|TOTAL)_SCRIPT_COUNT|SCRIPT_(?:MEMORY|TIME))|TYPE_(?:INTEGER|FLOAT|STRING|KEY|VECTOR|ROTATION|INVALID)|(?:DEBUG|PUBLIC)_CHANNEL|ATTACH_(?:AVATAR_CENTER|CHEST|HEAD|BACK|PELVIS|MOUTH|CHIN|NECK|NOSE|BELLY|[LR](?:SHOULDER|HAND|FOOT|EAR|EYE|[UL](?:ARM|LEG)|HIP)|(?:LEFT|RIGHT)_PEC|HUD_(?:CENTER_[12]|TOP_(?:RIGHT|CENTER|LEFT)|BOTTOM(?:_(?:RIGHT|LEFT))?))|LAND_(?:LEVEL|RAISE|LOWER|SMOOTH|NOISE|REVERT)|DATA_(?:ONLINE|NAME|BORN|SIM_(?:POS|STATUS|RATING)|PAYINFO)|PAYMENT_INFO_(?:ON_FILE|USED)|REMOTE_DATA_(?:CHANNEL|REQUEST|REPLY)|PSYS_(?:PART_(?:BF_(?:ZERO|ONE(?:_MINUS_(?:DEST_COLOR|SOURCE_(ALPHA|COLOR)))?|DEST_COLOR|SOURCE_(ALPHA|COLOR))|BLEND_FUNC_(DEST|SOURCE)|FLAGS|(?:START|END)_(?:COLOR|ALPHA|SCALE|GLOW)|MAX_AGE|(?:RIBBON|WIND|INTERP_(?:COLOR|SCALE)|BOUNCE|FOLLOW_(?:SRC|VELOCITY)|TARGET_(?:POS|LINEAR)|EMISSIVE)_MASK)|SRC_(?:MAX_AGE|PATTERN|ANGLE_(?:BEGIN|END)|BURST_(?:RATE|PART_COUNT|RADIUS|SPEED_(?:MIN|MAX))|ACCEL|TEXTURE|TARGET_KEY|OMEGA|PATTERN_(?:DROP|EXPLODE|ANGLE(?:_CONE(?:_EMPTY)?)?)))|VEHICLE_(?:REFERENCE_FRAME|TYPE_(?:NONE|SLED|CAR|BOAT|AIRPLANE|BALLOON)|(?:LINEAR|ANGULAR)_(?:FRICTION_TIMESCALE|MOTOR_DIRECTION)|LINEAR_MOTOR_OFFSET|HOVER_(?:HEIGHT|EFFICIENCY|TIMESCALE)|BUOYANCY|(?:LINEAR|ANGULAR)_(?:DEFLECTION_(?:EFFICIENCY|TIMESCALE)|MOTOR_(?:DECAY_)?TIMESCALE)|VERTICAL_ATTRACTION_(?:EFFICIENCY|TIMESCALE)|BANKING_(?:EFFICIENCY|MIX|TIMESCALE)|FLAG_(?:NO_DEFLECTION_UP|LIMIT_(?:ROLL_ONLY|MOTOR_UP)|HOVER_(?:(?:WATER|TERRAIN|UP)_ONLY|GLOBAL_HEIGHT)|MOUSELOOK_(?:STEER|BANK)|CAMERA_DECOUPLED))|PRIM_(?:TYPE(?:_(?:BOX|CYLINDER|PRISM|SPHERE|TORUS|TUBE|RING|SCULPT))?|HOLE_(?:DEFAULT|CIRCLE|SQUARE|TRIANGLE)|MATERIAL(?:_(?:STONE|METAL|GLASS|WOOD|FLESH|PLASTIC|RUBBER))?|SHINY_(?:NONE|LOW|MEDIUM|HIGH)|BUMP_(?:NONE|BRIGHT|DARK|WOOD|BARK|BRICKS|CHECKER|CONCRETE|TILE|STONE|DISKS|GRAVEL|BLOBS|SIDING|LARGETILE|STUCCO|SUCTION|WEAVE)|TEXGEN_(?:DEFAULT|PLANAR)|SCULPT_(?:TYPE_(?:SPHERE|TORUS|PLANE|CYLINDER|MASK)|FLAG_(?:MIRROR|INVERT))|PHYSICS(?:_(?:SHAPE_(?:CONVEX|NONE|PRIM|TYPE)))?|(?:POS|ROT)_LOCAL|SLICE|TEXT|FLEXIBLE|POINT_LIGHT|TEMP_ON_REZ|PHANTOM|POSITION|SIZE|ROTATION|TEXTURE|NAME|OMEGA|DESC|LINK_TARGET|COLOR|BUMP_SHINY|FULLBRIGHT|TEXGEN|GLOW|MEDIA_(?:ALT_IMAGE_ENABLE|CONTROLS|(?:CURRENT|HOME)_URL|AUTO_(?:LOOP|PLAY|SCALE|ZOOM)|FIRST_CLICK_INTERACT|(?:WIDTH|HEIGHT)_PIXELS|WHITELIST(?:_ENABLE)?|PERMS_(?:INTERACT|CONTROL)|PARAM_MAX|CONTROLS_(?:STANDARD|MINI)|PERM_(?:NONE|OWNER|GROUP|ANYONE)|MAX_(?:URL_LENGTH|WHITELIST_(?:SIZE|COUNT)|(?:WIDTH|HEIGHT)_PIXELS)))|MASK_(?:BASE|OWNER|GROUP|EVERYONE|NEXT)|PERM_(?:TRANSFER|MODIFY|COPY|MOVE|ALL)|PARCEL_(?:MEDIA_COMMAND_(?:STOP|PAUSE|PLAY|LOOP|TEXTURE|URL|TIME|AGENT|UNLOAD|AUTO_ALIGN|TYPE|SIZE|DESC|LOOP_SET)|FLAG_(?:ALLOW_(?:FLY|(?:GROUP_)?SCRIPTS|LANDMARK|TERRAFORM|DAMAGE|CREATE_(?:GROUP_)?OBJECTS)|USE_(?:ACCESS_(?:GROUP|LIST)|BAN_LIST|LAND_PASS_LIST)|LOCAL_SOUND_ONLY|RESTRICT_PUSHOBJECT|ALLOW_(?:GROUP|ALL)_OBJECT_ENTRY)|COUNT_(?:TOTAL|OWNER|GROUP|OTHER|SELECTED|TEMP)|DETAILS_(?:NAME|DESC|OWNER|GROUP|AREA|ID|SEE_AVATARS))|LIST_STAT_(?:MAX|MIN|MEAN|MEDIAN|STD_DEV|SUM(?:_SQUARES)?|NUM_COUNT|GEOMETRIC_MEAN|RANGE)|PAY_(?:HIDE|DEFAULT)|REGION_FLAG_(?:ALLOW_DAMAGE|FIXED_SUN|BLOCK_TERRAFORM|SANDBOX|DISABLE_(?:COLLISIONS|PHYSICS)|BLOCK_FLY|ALLOW_DIRECT_TELEPORT|RESTRICT_PUSHOBJECT)|HTTP_(?:METHOD|MIMETYPE|BODY_(?:MAXLENGTH|TRUNCATED)|CUSTOM_HEADER|PRAGMA_NO_CACHE|VERBOSE_THROTTLE|VERIFY_CERT)|STRING_(?:TRIM(?:_(?:HEAD|TAIL))?)|CLICK_ACTION_(?:NONE|TOUCH|SIT|BUY|PAY|OPEN(?:_MEDIA)?|PLAY|ZOOM)|TOUCH_INVALID_FACE|PROFILE_(?:NONE|SCRIPT_MEMORY)|RC_(?:DATA_FLAGS|DETECT_PHANTOM|GET_(?:LINK_NUM|NORMAL|ROOT_KEY)|MAX_HITS|REJECT_(?:TYPES|AGENTS|(?:NON)?PHYSICAL|LAND))|RCERR_(?:CAST_TIME_EXCEEDED|SIM_PERF_LOW|UNKNOWN)|ESTATE_ACCESS_(?:ALLOWED_(?:AGENT|GROUP)_(?:ADD|REMOVE)|BANNED_AGENT_(?:ADD|REMOVE))|DENSITY|FRICTION|RESTITUTION|GRAVITY_MULTIPLIER|KFM_(?:COMMAND|CMD_(?:PLAY|STOP|PAUSE|SET_MODE)|MODE|FORWARD|LOOP|PING_PONG|REVERSE|DATA|ROTATION|TRANSLATION)|ERR_(?:GENERIC|PARCEL_PERMISSIONS|MALFORMED_PARAMS|RUNTIME_PERMISSIONS|THROTTLED)|CHARACTER_(?:CMD_(?:(?:SMOOTH_)?STOP|JUMP)|DESIRED_(?:TURN_)?SPEED|RADIUS|STAY_WITHIN_PARCEL|LENGTH|ORIENTATION|ACCOUNT_FOR_SKIPPED_FRAMES|AVOIDANCE_MODE|TYPE(?:_(?:[A-D]|NONE))?|MAX_(?:DECEL|TURN_RADIUS|(?:ACCEL|SPEED)))|PURSUIT_(?:OFFSET|FUZZ_FACTOR|GOAL_TOLERANCE|INTERCEPT)|REQUIRE_LINE_OF_SIGHT|FORCE_DIRECT_PATH|VERTICAL|HORIZONTAL|AVOID_(?:CHARACTERS|DYNAMIC_OBSTACLES|NONE)|PU_(?:EVADE_(?:HIDDEN|SPOTTED)|FAILURE_(?:DYNAMIC_PATHFINDING_DISABLED|INVALID_(?:GOAL|START)|NO_(?:NAVMESH|VALID_DESTINATION)|OTHER|TARGET_GONE|(?:PARCEL_)?UNREACHABLE)|(?:GOAL|SLOWDOWN_DISTANCE)_REACHED)|TRAVERSAL_TYPE(?:_(?:FAST|NONE|SLOW))?|CONTENT_TYPE_(?:ATOM|FORM|HTML|JSON|LLSD|RSS|TEXT|XHTML|XML)|GCNP_(?:RADIUS|STATIC)|(?:PATROL|WANDER)_PAUSE_AT_WAYPOINTS|OPT_(?:AVATAR|CHARACTER|EXCLUSION_VOLUME|LEGACY_LINKSET|MATERIAL_VOLUME|OTHER|STATIC_OBSTACLE|WALKABLE)|SIM_STAT_PCT_CHARS_STEPPED)\b'
+    lsl_constants_integer_boolean = r'\b(?:FALSE|TRUE)\b'
+    lsl_constants_rotation = r'\b(?:ZERO_ROTATION)\b'
+    lsl_constants_string = r'\b(?:EOF|JSON_(?:ARRAY|DELETE|FALSE|INVALID|NULL|NUMBER|OBJECT|STRING|TRUE)|NULL_KEY|TEXTURE_(?:BLANK|DEFAULT|MEDIA|PLYWOOD|TRANSPARENT)|URL_REQUEST_(?:GRANTED|DENIED))\b'
+    lsl_constants_vector = r'\b(?:TOUCH_INVALID_(?:TEXCOORD|VECTOR)|ZERO_VECTOR)\b'
+    lsl_invalid_broken = r'\b(?:LAND_(?:LARGE|MEDIUM|SMALL)_BRUSH)\b'
+    lsl_invalid_deprecated = r'\b(?:ATTACH_[LR]PEC|DATA_RATING|OBJECT_ATTACHMENT_(?:GEOMETRY_BYTES|SURFACE_AREA)|PRIM_(?:CAST_SHADOWS|MATERIAL_LIGHT|TYPE_LEGACY)|PSYS_SRC_(?:INNER|OUTER)ANGLE|VEHICLE_FLAG_NO_FLY_UP|ll(?:Cloud|Make(?:Explosion|Fountain|Smoke|Fire)|RemoteDataSetRegion|Sound(?:Preload)?|XorBase64Strings(?:Correct)?))\b'
+    lsl_invalid_illegal = r'\b(?:event)\b'
+    lsl_invalid_unimplemented = r'\b(?:CHARACTER_(?:MAX_ANGULAR_(?:ACCEL|SPEED)|TURN_SPEED_MULTIPLIER)|PERMISSION_(?:CHANGE_(?:JOINTS|PERMISSIONS)|RELEASE_OWNERSHIP|REMAP_CONTROLS)|PRIM_PHYSICS_MATERIAL|PSYS_SRC_OBJ_REL_MASK|ll(?:CollisionSprite|(?:Stop)?PointAt|(?:(?:Refresh|Set)Prim)URL|(?:Take|Release)Camera|RemoteLoadScript))\b'
+    lsl_reserved_godmode = r'\b(?:ll(?:GodLikeRezObject|Set(?:Inventory|Object)PermMask))\b'
+    lsl_reserved_log = r'\b(?:print)\b'
+    lsl_operators = r'\+\+|\-\-|<<|>>|&&?|\|\|?|\^|~|[!%<>=*+\-/]=?'
+
+    tokens = {
+        'root':
+        [
+            (r'//.*?\n',                          Comment.Single),
+            (r'/\*',                              Comment.Multiline, 'comment'),
+            (r'"',                                String.Double, 'string'),
+            (lsl_keywords,                        Keyword),
+            (lsl_types,                           Keyword.Type),
+            (lsl_states,                          Name.Class),
+            (lsl_events,                          Name.Builtin),
+            (lsl_functions_builtin,               Name.Function),
+            (lsl_constants_float,                 Keyword.Constant),
+            (lsl_constants_integer,               Keyword.Constant),
+            (lsl_constants_integer_boolean,       Keyword.Constant),
+            (lsl_constants_rotation,              Keyword.Constant),
+            (lsl_constants_string,                Keyword.Constant),
+            (lsl_constants_vector,                Keyword.Constant),
+            (lsl_invalid_broken,                  Error),
+            (lsl_invalid_deprecated,              Error),
+            (lsl_invalid_illegal,                 Error),
+            (lsl_invalid_unimplemented,           Error),
+            (lsl_reserved_godmode,                Keyword.Reserved),
+            (lsl_reserved_log,                    Keyword.Reserved),
+            (r'\b([a-zA-Z_]\w*)\b',     Name.Variable),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d*', Number.Float),
+            (r'(\d+\.\d*|\.\d+)',                 Number.Float),
+            (r'0[xX][0-9a-fA-F]+',                Number.Hex),
+            (r'\d+',                              Number.Integer),
+            (lsl_operators,                       Operator),
+            (r':=?',                              Error),
+            (r'[,;{}()\[\]]',                     Punctuation),
+            (r'\n+',                              Whitespace),
+            (r'\s+',                              Whitespace)
+        ],
+        'comment':
+        [
+            (r'[^*/]+',                           Comment.Multiline),
+            (r'/\*',                              Comment.Multiline, '#push'),
+            (r'\*/',                              Comment.Multiline, '#pop'),
+            (r'[*/]',                             Comment.Multiline)
+        ],
+        'string':
+        [
+            (r'\\([nt"\\])',                      String.Escape),
+            (r'"',                                String.Double, '#pop'),
+            (r'\\.',                              Error),
+            (r'[^"\\]+',                          String.Double),
+        ]
+    }
+
+
+class AppleScriptLexer(RegexLexer):
+    """
+    For AppleScript source code,
+    including `AppleScript Studio
+    <http://developer.apple.com/documentation/AppleScript/
+    Reference/StudioReference>`_.
+    Contributed by Andreas Amann <aamann@mac.com>.
+    """
+
+    name = 'AppleScript'
+    url = 'https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html'
+    aliases = ['applescript']
+    filenames = ['*.applescript']
+    version_added = '1.0'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    Identifiers = r'[a-zA-Z]\w*'
+
+    # XXX: use words() for all of these
+    Literals = ('AppleScript', 'current application', 'false', 'linefeed',
+                'missing value', 'pi', 'quote', 'result', 'return', 'space',
+                'tab', 'text item delimiters', 'true', 'version')
+    Classes = ('alias ', 'application ', 'boolean ', 'class ', 'constant ',
+               'date ', 'file ', 'integer ', 'list ', 'number ', 'POSIX file ',
+               'real ', 'record ', 'reference ', 'RGB color ', 'script ',
+               'text ', 'unit types', '(?:Unicode )?text', 'string')
+    BuiltIn = ('attachment', 'attribute run', 'character', 'day', 'month',
+               'paragraph', 'word', 'year')
+    HandlerParams = ('about', 'above', 'against', 'apart from', 'around',
+                     'aside from', 'at', 'below', 'beneath', 'beside',
+                     'between', 'for', 'given', 'instead of', 'on', 'onto',
+                     'out of', 'over', 'since')
+    Commands = ('ASCII (character|number)', 'activate', 'beep', 'choose URL',
+                'choose application', 'choose color', 'choose file( name)?',
+                'choose folder', 'choose from list',
+                'choose remote application', 'clipboard info',
+                'close( access)?', 'copy', 'count', 'current date', 'delay',
+                'delete', 'display (alert|dialog)', 'do shell script',
+                'duplicate', 'exists', 'get eof', 'get volume settings',
+                'info for', 'launch', 'list (disks|folder)', 'load script',
+                'log', 'make', 'mount volume', 'new', 'offset',
+                'open( (for access|location))?', 'path to', 'print', 'quit',
+                'random number', 'read', 'round', 'run( script)?',
+                'say', 'scripting components',
+                'set (eof|the clipboard to|volume)', 'store script',
+                'summarize', 'system attribute', 'system info',
+                'the clipboard', 'time to GMT', 'write', 'quoted form')
+    References = ('(in )?back of', '(in )?front of', '[0-9]+(st|nd|rd|th)',
+                  'first', 'second', 'third', 'fourth', 'fifth', 'sixth',
+                  'seventh', 'eighth', 'ninth', 'tenth', 'after', 'back',
+                  'before', 'behind', 'every', 'front', 'index', 'last',
+                  'middle', 'some', 'that', 'through', 'thru', 'where', 'whose')
+    Operators = ("and", "or", "is equal", "equals", "(is )?equal to", "is not",
+                 "isn't", "isn't equal( to)?", "is not equal( to)?",
+                 "doesn't equal", "does not equal", "(is )?greater than",
+                 "comes after", "is not less than or equal( to)?",
+                 "isn't less than or equal( to)?", "(is )?less than",
+                 "comes before", "is not greater than or equal( to)?",
+                 "isn't greater than or equal( to)?",
+                 "(is  )?greater than or equal( to)?", "is not less than",
+                 "isn't less than", "does not come before",
+                 "doesn't come before", "(is )?less than or equal( to)?",
+                 "is not greater than", "isn't greater than",
+                 "does not come after", "doesn't come after", "starts? with",
+                 "begins? with", "ends? with", "contains?", "does not contain",
+                 "doesn't contain", "is in", "is contained by", "is not in",
+                 "is not contained by", "isn't contained by", "div", "mod",
+                 "not", "(a  )?(ref( to)?|reference to)", "is", "does")
+    Control = ('considering', 'else', 'error', 'exit', 'from', 'if',
+               'ignoring', 'in', 'repeat', 'tell', 'then', 'times', 'to',
+               'try', 'until', 'using terms from', 'while', 'whith',
+               'with timeout( of)?', 'with transaction', 'by', 'continue',
+               'end', 'its?', 'me', 'my', 'return', 'of', 'as')
+    Declarations = ('global', 'local', 'prop(erty)?', 'set', 'get')
+    Reserved = ('but', 'put', 'returning', 'the')
+    StudioClasses = ('action cell', 'alert reply', 'application', 'box',
+                     'browser( cell)?', 'bundle', 'button( cell)?', 'cell',
+                     'clip view', 'color well', 'color-panel',
+                     'combo box( item)?', 'control',
+                     'data( (cell|column|item|row|source))?', 'default entry',
+                     'dialog reply', 'document', 'drag info', 'drawer',
+                     'event', 'font(-panel)?', 'formatter',
+                     'image( (cell|view))?', 'matrix', 'menu( item)?', 'item',
+                     'movie( view)?', 'open-panel', 'outline view', 'panel',
+                     'pasteboard', 'plugin', 'popup button',
+                     'progress indicator', 'responder', 'save-panel',
+                     'scroll view', 'secure text field( cell)?', 'slider',
+                     'sound', 'split view', 'stepper', 'tab view( item)?',
+                     'table( (column|header cell|header view|view))',
+                     'text( (field( cell)?|view))?', 'toolbar( item)?',
+                     'user-defaults', 'view', 'window')
+    StudioEvents = ('accept outline drop', 'accept table drop', 'action',
+                    'activated', 'alert ended', 'awake from nib', 'became key',
+                    'became main', 'begin editing', 'bounds changed',
+                    'cell value', 'cell value changed', 'change cell value',
+                    'change item value', 'changed', 'child of item',
+                    'choose menu item', 'clicked', 'clicked toolbar item',
+                    'closed', 'column clicked', 'column moved',
+                    'column resized', 'conclude drop', 'data representation',
+                    'deminiaturized', 'dialog ended', 'document nib name',
+                    'double clicked', 'drag( (entered|exited|updated))?',
+                    'drop', 'end editing', 'exposed', 'idle', 'item expandable',
+                    'item value', 'item value changed', 'items changed',
+                    'keyboard down', 'keyboard up', 'launched',
+                    'load data representation', 'miniaturized', 'mouse down',
+                    'mouse dragged', 'mouse entered', 'mouse exited',
+                    'mouse moved', 'mouse up', 'moved',
+                    'number of browser rows', 'number of items',
+                    'number of rows', 'open untitled', 'opened', 'panel ended',
+                    'parameters updated', 'plugin loaded', 'prepare drop',
+                    'prepare outline drag', 'prepare outline drop',
+                    'prepare table drag', 'prepare table drop',
+                    'read from file', 'resigned active', 'resigned key',
+                    'resigned main', 'resized( sub views)?',
+                    'right mouse down', 'right mouse dragged',
+                    'right mouse up', 'rows changed', 'scroll wheel',
+                    'selected tab view item', 'selection changed',
+                    'selection changing', 'should begin editing',
+                    'should close', 'should collapse item',
+                    'should end editing', 'should expand item',
+                    'should open( untitled)?',
+                    'should quit( after last window closed)?',
+                    'should select column', 'should select item',
+                    'should select row', 'should select tab view item',
+                    'should selection change', 'should zoom', 'shown',
+                    'update menu item', 'update parameters',
+                    'update toolbar item', 'was hidden', 'was miniaturized',
+                    'will become active', 'will close', 'will dismiss',
+                    'will display browser cell', 'will display cell',
+                    'will display item cell', 'will display outline cell',
+                    'will finish launching', 'will hide', 'will miniaturize',
+                    'will move', 'will open', 'will pop up', 'will quit',
+                    'will resign active', 'will resize( sub views)?',
+                    'will select tab view item', 'will show', 'will zoom',
+                    'write to file', 'zoomed')
+    StudioCommands = ('animate', 'append', 'call method', 'center',
+                      'close drawer', 'close panel', 'display',
+                      'display alert', 'display dialog', 'display panel', 'go',
+                      'hide', 'highlight', 'increment', 'item for',
+                      'load image', 'load movie', 'load nib', 'load panel',
+                      'load sound', 'localized string', 'lock focus', 'log',
+                      'open drawer', 'path for', 'pause', 'perform action',
+                      'play', 'register', 'resume', 'scroll', 'select( all)?',
+                      'show', 'size to fit', 'start', 'step back',
+                      'step forward', 'stop', 'synchronize', 'unlock focus',
+                      'update')
+    StudioProperties = ('accepts arrow key', 'action method', 'active',
+                        'alignment', 'allowed identifiers',
+                        'allows branch selection', 'allows column reordering',
+                        'allows column resizing', 'allows column selection',
+                        'allows customization',
+                        'allows editing text attributes',
+                        'allows empty selection', 'allows mixed state',
+                        'allows multiple selection', 'allows reordering',
+                        'allows undo', 'alpha( value)?', 'alternate image',
+                        'alternate increment value', 'alternate title',
+                        'animation delay', 'associated file name',
+                        'associated object', 'auto completes', 'auto display',
+                        'auto enables items', 'auto repeat',
+                        'auto resizes( outline column)?',
+                        'auto save expanded items', 'auto save name',
+                        'auto save table columns', 'auto saves configuration',
+                        'auto scroll', 'auto sizes all columns to fit',
+                        'auto sizes cells', 'background color', 'bezel state',
+                        'bezel style', 'bezeled', 'border rect', 'border type',
+                        'bordered', 'bounds( rotation)?', 'box type',
+                        'button returned', 'button type',
+                        'can choose directories', 'can choose files',
+                        'can draw', 'can hide',
+                        'cell( (background color|size|type))?', 'characters',
+                        'class', 'click count', 'clicked( data)? column',
+                        'clicked data item', 'clicked( data)? row',
+                        'closeable', 'collating', 'color( (mode|panel))',
+                        'command key down', 'configuration',
+                        'content(s| (size|view( margins)?))?', 'context',
+                        'continuous', 'control key down', 'control size',
+                        'control tint', 'control view',
+                        'controller visible', 'coordinate system',
+                        'copies( on scroll)?', 'corner view', 'current cell',
+                        'current column', 'current( field)?  editor',
+                        'current( menu)? item', 'current row',
+                        'current tab view item', 'data source',
+                        'default identifiers', 'delta (x|y|z)',
+                        'destination window', 'directory', 'display mode',
+                        'displayed cell', 'document( (edited|rect|view))?',
+                        'double value', 'dragged column', 'dragged distance',
+                        'dragged items', 'draws( cell)? background',
+                        'draws grid', 'dynamically scrolls', 'echos bullets',
+                        'edge', 'editable', 'edited( data)? column',
+                        'edited data item', 'edited( data)? row', 'enabled',
+                        'enclosing scroll view', 'ending page',
+                        'error handling', 'event number', 'event type',
+                        'excluded from windows menu', 'executable path',
+                        'expanded', 'fax number', 'field editor', 'file kind',
+                        'file name', 'file type', 'first responder',
+                        'first visible column', 'flipped', 'floating',
+                        'font( panel)?', 'formatter', 'frameworks path',
+                        'frontmost', 'gave up', 'grid color', 'has data items',
+                        'has horizontal ruler', 'has horizontal scroller',
+                        'has parent data item', 'has resize indicator',
+                        'has shadow', 'has sub menu', 'has vertical ruler',
+                        'has vertical scroller', 'header cell', 'header view',
+                        'hidden', 'hides when deactivated', 'highlights by',
+                        'horizontal line scroll', 'horizontal page scroll',
+                        'horizontal ruler view', 'horizontally resizable',
+                        'icon image', 'id', 'identifier',
+                        'ignores multiple clicks',
+                        'image( (alignment|dims when disabled|frame style|scaling))?',
+                        'imports graphics', 'increment value',
+                        'indentation per level', 'indeterminate', 'index',
+                        'integer value', 'intercell spacing', 'item height',
+                        'key( (code|equivalent( modifier)?|window))?',
+                        'knob thickness', 'label', 'last( visible)? column',
+                        'leading offset', 'leaf', 'level', 'line scroll',
+                        'loaded', 'localized sort', 'location', 'loop mode',
+                        'main( (bunde|menu|window))?', 'marker follows cell',
+                        'matrix mode', 'maximum( content)? size',
+                        'maximum visible columns',
+                        'menu( form representation)?', 'miniaturizable',
+                        'miniaturized', 'minimized image', 'minimized title',
+                        'minimum column width', 'minimum( content)? size',
+                        'modal', 'modified', 'mouse down state',
+                        'movie( (controller|file|rect))?', 'muted', 'name',
+                        'needs display', 'next state', 'next text',
+                        'number of tick marks', 'only tick mark values',
+                        'opaque', 'open panel', 'option key down',
+                        'outline table column', 'page scroll', 'pages across',
+                        'pages down', 'palette label', 'pane splitter',
+                        'parent data item', 'parent window', 'pasteboard',
+                        'path( (names|separator))?', 'playing',
+                        'plays every frame', 'plays selection only', 'position',
+                        'preferred edge', 'preferred type', 'pressure',
+                        'previous text', 'prompt', 'properties',
+                        'prototype cell', 'pulls down', 'rate',
+                        'released when closed', 'repeated',
+                        'requested print time', 'required file type',
+                        'resizable', 'resized column', 'resource path',
+                        'returns records', 'reuses columns', 'rich text',
+                        'roll over', 'row height', 'rulers visible',
+                        'save panel', 'scripts path', 'scrollable',
+                        'selectable( identifiers)?', 'selected cell',
+                        'selected( data)? columns?', 'selected data items?',
+                        'selected( data)? rows?', 'selected item identifier',
+                        'selection by rect', 'send action on arrow key',
+                        'sends action when done editing', 'separates columns',
+                        'separator item', 'sequence number', 'services menu',
+                        'shared frameworks path', 'shared support path',
+                        'sheet', 'shift key down', 'shows alpha',
+                        'shows state by', 'size( mode)?',
+                        'smart insert delete enabled', 'sort case sensitivity',
+                        'sort column', 'sort order', 'sort type',
+                        'sorted( data rows)?', 'sound', 'source( mask)?',
+                        'spell checking enabled', 'starting page', 'state',
+                        'string value', 'sub menu', 'super menu', 'super view',
+                        'tab key traverses cells', 'tab state', 'tab type',
+                        'tab view', 'table view', 'tag', 'target( printer)?',
+                        'text color', 'text container insert',
+                        'text container origin', 'text returned',
+                        'tick mark position', 'time stamp',
+                        'title(d| (cell|font|height|position|rect))?',
+                        'tool tip', 'toolbar', 'trailing offset', 'transparent',
+                        'treat packages as directories', 'truncated labels',
+                        'types', 'unmodified characters', 'update views',
+                        'use sort indicator', 'user defaults',
+                        'uses data source', 'uses ruler',
+                        'uses threaded animation',
+                        'uses title from previous column', 'value wraps',
+                        'version',
+                        'vertical( (line scroll|page scroll|ruler view))?',
+                        'vertically resizable', 'view',
+                        'visible( document rect)?', 'volume', 'width', 'window',
+                        'windows menu', 'wraps', 'zoomable', 'zoomed')
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'¬\n', String.Escape),
+            (r"'s\s+", Text),  # This is a possessive, consider moving
+            (r'(--|#).*?$', Comment),
+            (r'\(\*', Comment.Multiline, 'comment'),
+            (r'[(){}!,.:]', Punctuation),
+            (r'(«)([^»]+)(»)',
+             bygroups(Text, Name.Builtin, Text)),
+            (r'\b((?:considering|ignoring)\s*)'
+             r'(application responses|case|diacriticals|hyphens|'
+             r'numeric strings|punctuation|white space)',
+             bygroups(Keyword, Name.Builtin)),
+            (r'(-|\*|\+|&|≠|>=?|<=?|=|≥|≤|/|÷|\^)', Operator),
+            (r"\b({})\b".format('|'.join(Operators)), Operator.Word),
+            (r'^(\s*(?:on|end)\s+)'
+             r'({})'.format('|'.join(StudioEvents[::-1])),
+             bygroups(Keyword, Name.Function)),
+            (r'^(\s*)(in|on|script|to)(\s+)', bygroups(Text, Keyword, Text)),
+            (r'\b(as )({})\b'.format('|'.join(Classes)),
+             bygroups(Keyword, Name.Class)),
+            (r'\b({})\b'.format('|'.join(Literals)), Name.Constant),
+            (r'\b({})\b'.format('|'.join(Commands)), Name.Builtin),
+            (r'\b({})\b'.format('|'.join(Control)), Keyword),
+            (r'\b({})\b'.format('|'.join(Declarations)), Keyword),
+            (r'\b({})\b'.format('|'.join(Reserved)), Name.Builtin),
+            (r'\b({})s?\b'.format('|'.join(BuiltIn)), Name.Builtin),
+            (r'\b({})\b'.format('|'.join(HandlerParams)), Name.Builtin),
+            (r'\b({})\b'.format('|'.join(StudioProperties)), Name.Attribute),
+            (r'\b({})s?\b'.format('|'.join(StudioClasses)), Name.Builtin),
+            (r'\b({})\b'.format('|'.join(StudioCommands)), Name.Builtin),
+            (r'\b({})\b'.format('|'.join(References)), Name.Builtin),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (rf'\b({Identifiers})\b', Name.Variable),
+            (r'[-+]?(\d+\.\d*|\d*\.\d+)(E[-+][0-9]+)?', Number.Float),
+            (r'[-+]?\d+', Number.Integer),
+        ],
+        'comment': [
+            (r'\(\*', Comment.Multiline, '#push'),
+            (r'\*\)', Comment.Multiline, '#pop'),
+            ('[^*(]+', Comment.Multiline),
+            ('[*(]', Comment.Multiline),
+        ],
+    }
+
+
+class RexxLexer(RegexLexer):
+    """
+    Rexx is a scripting language available for
+    a wide range of different platforms with its roots found on mainframe
+    systems. It is popular for I/O- and data based tasks and can act as glue
+    language to bind different applications together.
+    """
+    name = 'Rexx'
+    url = 'http://www.rexxinfo.org/'
+    aliases = ['rexx', 'arexx']
+    filenames = ['*.rexx', '*.rex', '*.rx', '*.arexx']
+    mimetypes = ['text/x-rexx']
+    version_added = '2.0'
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'"', String, 'string_double'),
+            (r"'", String, 'string_single'),
+            (r'[0-9]+(\.[0-9]+)?(e[+-]?[0-9])?', Number),
+            (r'([a-z_]\w*)(\s*)(:)(\s*)(procedure)\b',
+             bygroups(Name.Function, Whitespace, Operator, Whitespace,
+                      Keyword.Declaration)),
+            (r'([a-z_]\w*)(\s*)(:)',
+             bygroups(Name.Label, Whitespace, Operator)),
+            include('function'),
+            include('keyword'),
+            include('operator'),
+            (r'[a-z_]\w*', Text),
+        ],
+        'function': [
+            (words((
+                'abbrev', 'abs', 'address', 'arg', 'b2x', 'bitand', 'bitor', 'bitxor',
+                'c2d', 'c2x', 'center', 'charin', 'charout', 'chars', 'compare',
+                'condition', 'copies', 'd2c', 'd2x', 'datatype', 'date', 'delstr',
+                'delword', 'digits', 'errortext', 'form', 'format', 'fuzz', 'insert',
+                'lastpos', 'left', 'length', 'linein', 'lineout', 'lines', 'max',
+                'min', 'overlay', 'pos', 'queued', 'random', 'reverse', 'right', 'sign',
+                'sourceline', 'space', 'stream', 'strip', 'substr', 'subword', 'symbol',
+                'time', 'trace', 'translate', 'trunc', 'value', 'verify', 'word',
+                'wordindex', 'wordlength', 'wordpos', 'words', 'x2b', 'x2c', 'x2d',
+                'xrange'), suffix=r'(\s*)(\()'),
+             bygroups(Name.Builtin, Whitespace, Operator)),
+        ],
+        'keyword': [
+            (r'(address|arg|by|call|do|drop|else|end|exit|for|forever|if|'
+             r'interpret|iterate|leave|nop|numeric|off|on|options|parse|'
+             r'pull|push|queue|return|say|select|signal|to|then|trace|until|'
+             r'while)\b', Keyword.Reserved),
+        ],
+        'operator': [
+            (r'(-|//|/|\(|\)|\*\*|\*|\\<<|\\<|\\==|\\=|\\>>|\\>|\\|\|\||\||'
+             r'&&|&|%|\+|<<=|<<|<=|<>|<|==|=|><|>=|>>=|>>|>|¬<<|¬<|¬==|¬=|'
+             r'¬>>|¬>|¬|\.|,)', Operator),
+        ],
+        'string_double': [
+            (r'[^"\n]+', String),
+            (r'""', String),
+            (r'"', String, '#pop'),
+            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings.
+        ],
+        'string_single': [
+            (r'[^\'\n]+', String),
+            (r'\'\'', String),
+            (r'\'', String, '#pop'),
+            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings.
+        ],
+        'comment': [
+            (r'[^*]+', Comment.Multiline),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'\*', Comment.Multiline),
+        ]
+    }
+
+    def _c(s):
+        return re.compile(s, re.MULTILINE)
+    _ADDRESS_COMMAND_PATTERN = _c(r'^\s*address\s+command\b')
+    _ADDRESS_PATTERN = _c(r'^\s*address\s+')
+    _DO_WHILE_PATTERN = _c(r'^\s*do\s+while\b')
+    _IF_THEN_DO_PATTERN = _c(r'^\s*if\b.+\bthen\s+do\s*$')
+    _PROCEDURE_PATTERN = _c(r'^\s*([a-z_]\w*)(\s*)(:)(\s*)(procedure)\b')
+    _ELSE_DO_PATTERN = _c(r'\belse\s+do\s*$')
+    _PARSE_ARG_PATTERN = _c(r'^\s*parse\s+(upper\s+)?(arg|value)\b')
+    PATTERNS_AND_WEIGHTS = (
+        (_ADDRESS_COMMAND_PATTERN, 0.2),
+        (_ADDRESS_PATTERN, 0.05),
+        (_DO_WHILE_PATTERN, 0.1),
+        (_ELSE_DO_PATTERN, 0.1),
+        (_IF_THEN_DO_PATTERN, 0.1),
+        (_PROCEDURE_PATTERN, 0.5),
+        (_PARSE_ARG_PATTERN, 0.2),
+    )
+
+    def analyse_text(text):
+        """
+        Check for initial comment and patterns that distinguish Rexx from other
+        C-like languages.
+        """
+        if re.search(r'/\*\**\s*rexx', text, re.IGNORECASE):
+            # Header matches MVS Rexx requirements, this is certainly a Rexx
+            # script.
+            return 1.0
+        elif text.startswith('/*'):
+            # Header matches general Rexx requirements; the source code might
+            # still be any language using C comments such as C++, C# or Java.
+            lowerText = text.lower()
+            result = sum(weight
+                         for (pattern, weight) in RexxLexer.PATTERNS_AND_WEIGHTS
+                         if pattern.search(lowerText)) + 0.01
+            return min(result, 1.0)
+
+
+class MOOCodeLexer(RegexLexer):
+    """
+    For MOOCode (the MOO scripting language).
+    """
+    name = 'MOOCode'
+    url = 'http://www.moo.mud.org/'
+    filenames = ['*.moo']
+    aliases = ['moocode', 'moo']
+    mimetypes = ['text/x-moocode']
+    version_added = '0.9'
+
+    tokens = {
+        'root': [
+            # Numbers
+            (r'(0|[1-9][0-9_]*)', Number.Integer),
+            # Strings
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            # exceptions
+            (r'(E_PERM|E_DIV)', Name.Exception),
+            # db-refs
+            (r'((#[-0-9]+)|(\$\w+))', Name.Entity),
+            # Keywords
+            (r'\b(if|else|elseif|endif|for|endfor|fork|endfork|while'
+             r'|endwhile|break|continue|return|try'
+             r'|except|endtry|finally|in)\b', Keyword),
+            # builtins
+            (r'(random|length)', Name.Builtin),
+            # special variables
+            (r'(player|caller|this|args)', Name.Variable.Instance),
+            # skip whitespace
+            (r'\s+', Text),
+            (r'\n', Text),
+            # other operators
+            (r'([!;=,{}&|:.\[\]@()<>?]+)', Operator),
+            # function call
+            (r'(\w+)(\()', bygroups(Name.Function, Operator)),
+            # variables
+            (r'(\w+)', Text),
+        ]
+    }
+
+
+class HybrisLexer(RegexLexer):
+    """
+    For Hybris source code.
+    """
+
+    name = 'Hybris'
+    aliases = ['hybris']
+    filenames = ['*.hyb']
+    mimetypes = ['text/x-hybris', 'application/x-hybris']
+    url = 'https://github.com/evilsocket/hybris'
+    version_added = '1.4'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:function|method|operator\s+)+?)'
+             r'([a-zA-Z_]\w*)'
+             r'(\s*)(\()', bygroups(Keyword, Name.Function, Text, Operator)),
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w.]*', Name.Decorator),
+            (r'(break|case|catch|next|default|do|else|finally|for|foreach|of|'
+             r'unless|if|new|return|switch|me|throw|try|while)\b', Keyword),
+            (r'(extends|private|protected|public|static|throws|function|method|'
+             r'operator)\b', Keyword.Declaration),
+            (r'(true|false|null|__FILE__|__LINE__|__VERSION__|__LIB_PATH__|'
+             r'__INC_PATH__)\b', Keyword.Constant),
+            (r'(class|struct)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'class'),
+            (r'(import|include)(\s+)',
+             bygroups(Keyword.Namespace, Text), 'import'),
+            (words((
+                'gc_collect', 'gc_mm_items', 'gc_mm_usage', 'gc_collect_threshold',
+                'urlencode', 'urldecode', 'base64encode', 'base64decode', 'sha1', 'crc32',
+                'sha2', 'md5', 'md5_file', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos',
+                'cosh', 'exp', 'fabs', 'floor', 'fmod', 'log', 'log10', 'pow', 'sin',
+                'sinh', 'sqrt', 'tan', 'tanh', 'isint', 'isfloat', 'ischar', 'isstring',
+                'isarray', 'ismap', 'isalias', 'typeof', 'sizeof', 'toint', 'tostring',
+                'fromxml', 'toxml', 'binary', 'pack', 'load', 'eval', 'var_names',
+                'var_values', 'user_functions', 'dyn_functions', 'methods', 'call',
+                'call_method', 'mknod', 'mkfifo', 'mount', 'umount2', 'umount', 'ticks',
+                'usleep', 'sleep', 'time', 'strtime', 'strdate', 'dllopen', 'dlllink',
+                'dllcall', 'dllcall_argv', 'dllclose', 'env', 'exec', 'fork', 'getpid',
+                'wait', 'popen', 'pclose', 'exit', 'kill', 'pthread_create',
+                'pthread_create_argv', 'pthread_exit', 'pthread_join', 'pthread_kill',
+                'smtp_send', 'http_get', 'http_post', 'http_download', 'socket', 'bind',
+                'listen', 'accept', 'getsockname', 'getpeername', 'settimeout', 'connect',
+                'server', 'recv', 'send', 'close', 'print', 'println', 'printf', 'input',
+                'readline', 'serial_open', 'serial_fcntl', 'serial_get_attr',
+                'serial_get_ispeed', 'serial_get_ospeed', 'serial_set_attr',
+                'serial_set_ispeed', 'serial_set_ospeed', 'serial_write', 'serial_read',
+                'serial_close', 'xml_load', 'xml_parse', 'fopen', 'fseek', 'ftell',
+                'fsize', 'fread', 'fwrite', 'fgets', 'fclose', 'file', 'readdir',
+                'pcre_replace', 'size', 'pop', 'unmap', 'has', 'keys', 'values',
+                'length', 'find', 'substr', 'replace', 'split', 'trim', 'remove',
+                'contains', 'join'), suffix=r'\b'),
+             Name.Builtin),
+            (words((
+                'MethodReference', 'Runner', 'Dll', 'Thread', 'Pipe', 'Process',
+                'Runnable', 'CGI', 'ClientSocket', 'Socket', 'ServerSocket',
+                'File', 'Console', 'Directory', 'Exception'), suffix=r'\b'),
+             Keyword.Type),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'", String.Char),
+            (r'(\.)([a-zA-Z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'[~^*!%&\[\](){}<>|+=:;,./?\-@]+', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Text),
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+    }
+
+    def analyse_text(text):
+        """public method and private method don't seem to be quite common
+        elsewhere."""
+        result = 0
+        if re.search(r'\b(?:public|private)\s+method\b', text):
+            result += 0.01
+        return result
+
+
+
+class EasytrieveLexer(RegexLexer):
+    """
+    Easytrieve Plus is a programming language for extracting, filtering and
+    converting sequential data. Furthermore it can layout data for reports.
+    It is mainly used on mainframe platforms and can access several of the
+    mainframe's native file formats. It is somewhat comparable to awk.
+    """
+    name = 'Easytrieve'
+    aliases = ['easytrieve']
+    filenames = ['*.ezt', '*.mac']
+    mimetypes = ['text/x-easytrieve']
+    url = 'https://www.broadcom.com/products/mainframe/application-development/easytrieve-report-generator'
+    version_added = '2.1'
+    flags = 0
+
+    # Note: We cannot use r'\b' at the start and end of keywords because
+    # Easytrieve Plus delimiter characters are:
+    #
+    #   * space ( )
+    #   * apostrophe (')
+    #   * period (.)
+    #   * comma (,)
+    #   * parenthesis ( and )
+    #   * colon (:)
+    #
+    # Additionally words end once a '*' appears, indicatins a comment.
+    _DELIMITERS = r' \'.,():\n'
+    _DELIMITERS_OR_COMENT = _DELIMITERS + '*'
+    _DELIMITER_PATTERN = '[' + _DELIMITERS + ']'
+    _DELIMITER_PATTERN_CAPTURE = '(' + _DELIMITER_PATTERN + ')'
+    _NON_DELIMITER_OR_COMMENT_PATTERN = '[^' + _DELIMITERS_OR_COMENT + ']'
+    _OPERATORS_PATTERN = '[.+\\-/=\\[\\](){}<>;,&%¬]'
+    _KEYWORDS = [
+        'AFTER-BREAK', 'AFTER-LINE', 'AFTER-SCREEN', 'AIM', 'AND', 'ATTR',
+        'BEFORE', 'BEFORE-BREAK', 'BEFORE-LINE', 'BEFORE-SCREEN', 'BUSHU',
+        'BY', 'CALL', 'CASE', 'CHECKPOINT', 'CHKP', 'CHKP-STATUS', 'CLEAR',
+        'CLOSE', 'COL', 'COLOR', 'COMMIT', 'CONTROL', 'COPY', 'CURSOR', 'D',
+        'DECLARE', 'DEFAULT', 'DEFINE', 'DELETE', 'DENWA', 'DISPLAY', 'DLI',
+        'DO', 'DUPLICATE', 'E', 'ELSE', 'ELSE-IF', 'END', 'END-CASE',
+        'END-DO', 'END-IF', 'END-PROC', 'ENDPAGE', 'ENDTABLE', 'ENTER', 'EOF',
+        'EQ', 'ERROR', 'EXIT', 'EXTERNAL', 'EZLIB', 'F1', 'F10', 'F11', 'F12',
+        'F13', 'F14', 'F15', 'F16', 'F17', 'F18', 'F19', 'F2', 'F20', 'F21',
+        'F22', 'F23', 'F24', 'F25', 'F26', 'F27', 'F28', 'F29', 'F3', 'F30',
+        'F31', 'F32', 'F33', 'F34', 'F35', 'F36', 'F4', 'F5', 'F6', 'F7',
+        'F8', 'F9', 'FETCH', 'FILE-STATUS', 'FILL', 'FINAL', 'FIRST',
+        'FIRST-DUP', 'FOR', 'GE', 'GET', 'GO', 'GOTO', 'GQ', 'GR', 'GT',
+        'HEADING', 'HEX', 'HIGH-VALUES', 'IDD', 'IDMS', 'IF', 'IN', 'INSERT',
+        'JUSTIFY', 'KANJI-DATE', 'KANJI-DATE-LONG', 'KANJI-TIME', 'KEY',
+        'KEY-PRESSED', 'KOKUGO', 'KUN', 'LAST-DUP', 'LE', 'LEVEL', 'LIKE',
+        'LINE', 'LINE-COUNT', 'LINE-NUMBER', 'LINK', 'LIST', 'LOW-VALUES',
+        'LQ', 'LS', 'LT', 'MACRO', 'MASK', 'MATCHED', 'MEND', 'MESSAGE',
+        'MOVE', 'MSTART', 'NE', 'NEWPAGE', 'NOMASK', 'NOPRINT', 'NOT',
+        'NOTE', 'NOVERIFY', 'NQ', 'NULL', 'OF', 'OR', 'OTHERWISE', 'PA1',
+        'PA2', 'PA3', 'PAGE-COUNT', 'PAGE-NUMBER', 'PARM-REGISTER',
+        'PATH-ID', 'PATTERN', 'PERFORM', 'POINT', 'POS', 'PRIMARY', 'PRINT',
+        'PROCEDURE', 'PROGRAM', 'PUT', 'READ', 'RECORD', 'RECORD-COUNT',
+        'RECORD-LENGTH', 'REFRESH', 'RELEASE', 'RENUM', 'REPEAT', 'REPORT',
+        'REPORT-INPUT', 'RESHOW', 'RESTART', 'RETRIEVE', 'RETURN-CODE',
+        'ROLLBACK', 'ROW', 'S', 'SCREEN', 'SEARCH', 'SECONDARY', 'SELECT',
+        'SEQUENCE', 'SIZE', 'SKIP', 'SOKAKU', 'SORT', 'SQL', 'STOP', 'SUM',
+        'SYSDATE', 'SYSDATE-LONG', 'SYSIN', 'SYSIPT', 'SYSLST', 'SYSPRINT',
+        'SYSSNAP', 'SYSTIME', 'TALLY', 'TERM-COLUMNS', 'TERM-NAME',
+        'TERM-ROWS', 'TERMINATION', 'TITLE', 'TO', 'TRANSFER', 'TRC',
+        'UNIQUE', 'UNTIL', 'UPDATE', 'UPPERCASE', 'USER', 'USERID', 'VALUE',
+        'VERIFY', 'W', 'WHEN', 'WHILE', 'WORK', 'WRITE', 'X', 'XDM', 'XRST'
+    ]
+
+    tokens = {
+        'root': [
+            (r'\*.*\n', Comment.Single),
+            (r'\n+', Whitespace),
+            # Macro argument
+            (r'&' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+\.', Name.Variable,
+             'after_macro_argument'),
+            # Macro call
+            (r'%' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name.Variable),
+            (r'(FILE|MACRO|REPORT)(\s+)',
+             bygroups(Keyword.Declaration, Whitespace), 'after_declaration'),
+            (r'(JOB|PARM)' + r'(' + _DELIMITER_PATTERN + r')',
+             bygroups(Keyword.Declaration, Operator)),
+            (words(_KEYWORDS, suffix=_DELIMITER_PATTERN_CAPTURE),
+             bygroups(Keyword.Reserved, Operator)),
+            (_OPERATORS_PATTERN, Operator),
+            # Procedure declaration
+            (r'(' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+)(\s*)(\.?)(\s*)(PROC)(\s*\n)',
+             bygroups(Name.Function, Whitespace, Operator, Whitespace,
+                      Keyword.Declaration, Whitespace)),
+            (r'[0-9]+\.[0-9]*', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r"'(''|[^'])*'", String),
+            (r'\s+', Whitespace),
+            # Everything else just belongs to a name
+            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name),
+         ],
+        'after_declaration': [
+            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name.Function),
+            default('#pop'),
+        ],
+        'after_macro_argument': [
+            (r'\*.*\n', Comment.Single, '#pop'),
+            (r'\s+', Whitespace, '#pop'),
+            (_OPERATORS_PATTERN, Operator, '#pop'),
+            (r"'(''|[^'])*'", String, '#pop'),
+            # Everything else just belongs to a name
+            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name),
+        ],
+    }
+    _COMMENT_LINE_REGEX = re.compile(r'^\s*\*')
+    _MACRO_HEADER_REGEX = re.compile(r'^\s*MACRO')
+
+    def analyse_text(text):
+        """
+        Perform a structural analysis for basic Easytrieve constructs.
+        """
+        result = 0.0
+        lines = text.split('\n')
+        hasEndProc = False
+        hasHeaderComment = False
+        hasFile = False
+        hasJob = False
+        hasProc = False
+        hasParm = False
+        hasReport = False
+
+        def isCommentLine(line):
+            return EasytrieveLexer._COMMENT_LINE_REGEX.match(lines[0]) is not None
+
+        def isEmptyLine(line):
+            return not bool(line.strip())
+
+        # Remove possible empty lines and header comments.
+        while lines and (isEmptyLine(lines[0]) or isCommentLine(lines[0])):
+            if not isEmptyLine(lines[0]):
+                hasHeaderComment = True
+            del lines[0]
+
+        if EasytrieveLexer._MACRO_HEADER_REGEX.match(lines[0]):
+            # Looks like an Easytrieve macro.
+            result = 0.4
+            if hasHeaderComment:
+                result += 0.4
+        else:
+            # Scan the source for lines starting with indicators.
+            for line in lines:
+                words = line.split()
+                if (len(words) >= 2):
+                    firstWord = words[0]
+                    if not hasReport:
+                        if not hasJob:
+                            if not hasFile:
+                                if not hasParm:
+                                    if firstWord == 'PARM':
+                                        hasParm = True
+                                if firstWord == 'FILE':
+                                    hasFile = True
+                            if firstWord == 'JOB':
+                                hasJob = True
+                        elif firstWord == 'PROC':
+                            hasProc = True
+                        elif firstWord == 'END-PROC':
+                            hasEndProc = True
+                        elif firstWord == 'REPORT':
+                            hasReport = True
+
+            # Weight the findings.
+            if hasJob and (hasProc == hasEndProc):
+                if hasHeaderComment:
+                    result += 0.1
+                if hasParm:
+                    if hasProc:
+                        # Found PARM, JOB and PROC/END-PROC:
+                        # pretty sure this is Easytrieve.
+                        result += 0.8
+                    else:
+                        # Found PARAM and  JOB: probably this is Easytrieve
+                        result += 0.5
+                else:
+                    # Found JOB and possibly other keywords: might be Easytrieve
+                    result += 0.11
+                    if hasParm:
+                        # Note: PARAM is not a proper English word, so this is
+                        # regarded a much better indicator for Easytrieve than
+                        # the other words.
+                        result += 0.2
+                    if hasFile:
+                        result += 0.01
+                    if hasReport:
+                        result += 0.01
+        assert 0.0 <= result <= 1.0
+        return result
+
+
+class JclLexer(RegexLexer):
+    """
+    Job Control Language (JCL)
+    is a scripting language used on mainframe platforms to instruct the system
+    on how to run a batch job or start a subsystem. It is somewhat
+    comparable to MS DOS batch and Unix shell scripts.
+    """
+    name = 'JCL'
+    aliases = ['jcl']
+    filenames = ['*.jcl']
+    mimetypes = ['text/x-jcl']
+    url = 'https://en.wikipedia.org/wiki/Job_Control_Language'
+    version_added = '2.1'
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'//\*.*\n', Comment.Single),
+            (r'//', Keyword.Pseudo, 'statement'),
+            (r'/\*', Keyword.Pseudo, 'jes2_statement'),
+            # TODO: JES3 statement
+            (r'.*\n', Other)  # Input text or inline code in any language.
+        ],
+        'statement': [
+            (r'\s*\n', Whitespace, '#pop'),
+            (r'([a-z]\w*)(\s+)(exec|job)(\s*)',
+             bygroups(Name.Label, Whitespace, Keyword.Reserved, Whitespace),
+             'option'),
+            (r'[a-z]\w*', Name.Variable, 'statement_command'),
+            (r'\s+', Whitespace, 'statement_command'),
+        ],
+        'statement_command': [
+            (r'\s+(command|cntl|dd|endctl|endif|else|include|jcllib|'
+             r'output|pend|proc|set|then|xmit)\s+', Keyword.Reserved, 'option'),
+            include('option')
+        ],
+        'jes2_statement': [
+            (r'\s*\n', Whitespace, '#pop'),
+            (r'\$', Keyword, 'option'),
+            (r'\b(jobparam|message|netacct|notify|output|priority|route|'
+             r'setup|signoff|xeq|xmit)\b', Keyword, 'option'),
+        ],
+        'option': [
+            # (r'\n', Text, 'root'),
+            (r'\*', Name.Builtin),
+            (r'[\[\](){}<>;,]', Punctuation),
+            (r'[-+*/=&%]', Operator),
+            (r'[a-z_]\w*', Name),
+            (r'\d+\.\d*', Number.Float),
+            (r'\.\d+', Number.Float),
+            (r'\d+', Number.Integer),
+            (r"'", String, 'option_string'),
+            (r'[ \t]+', Whitespace, 'option_comment'),
+            (r'\.', Punctuation),
+        ],
+        'option_string': [
+            (r"(\n)(//)", bygroups(Text, Keyword.Pseudo)),
+            (r"''", String),
+            (r"[^']", String),
+            (r"'", String, '#pop'),
+        ],
+        'option_comment': [
+            # (r'\n', Text, 'root'),
+            (r'.+', Comment.Single),
+        ]
+    }
+
+    _JOB_HEADER_PATTERN = re.compile(r'^//[a-z#$@][a-z0-9#$@]{0,7}\s+job(\s+.*)?$',
+                                     re.IGNORECASE)
+
+    def analyse_text(text):
+        """
+        Recognize JCL job by header.
+        """
+        result = 0.0
+        lines = text.split('\n')
+        if len(lines) > 0:
+            if JclLexer._JOB_HEADER_PATTERN.match(lines[0]):
+                result = 1.0
+        assert 0.0 <= result <= 1.0
+        return result
+
+
+class MiniScriptLexer(RegexLexer):
+    """
+    For MiniScript source code.
+    """
+
+    name = 'MiniScript'
+    url = 'https://miniscript.org'
+    aliases = ['miniscript', 'ms']
+    filenames = ['*.ms']
+    mimetypes = ['text/x-minicript', 'application/x-miniscript']
+    version_added = '2.6'
+
+    tokens = {
+        'root': [
+            (r'#!(.*?)$', Comment.Preproc),
+            default('base'),
+        ],
+        'base': [
+            ('//.*$', Comment.Single),
+            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number),
+            (r'(?i)\d+e[+-]?\d+', Number),
+            (r'\d+', Number),
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'"', String, 'string_double'),
+            (r'(==|!=|<=|>=|[=+\-*/%^<>.:])', Operator),
+            (r'[;,\[\]{}()]', Punctuation),
+            (words((
+                'break', 'continue', 'else', 'end', 'for', 'function', 'if',
+                'in', 'isa', 'then', 'repeat', 'return', 'while'), suffix=r'\b'),
+             Keyword),
+            (words((
+                'abs', 'acos', 'asin', 'atan', 'ceil', 'char', 'cos', 'floor',
+                'log', 'round', 'rnd', 'pi', 'sign', 'sin', 'sqrt', 'str', 'tan',
+                'hasIndex', 'indexOf', 'len', 'val', 'code', 'remove', 'lower',
+                'upper', 'replace', 'split', 'indexes', 'values', 'join', 'sum',
+                'sort', 'shuffle', 'push', 'pop', 'pull', 'range',
+                'print', 'input', 'time', 'wait', 'locals', 'globals', 'outer',
+                'yield'), suffix=r'\b'),
+             Name.Builtin),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(and|or|not|new)\b', Operator.Word),
+            (r'(self|super|__isa)\b', Name.Builtin.Pseudo),
+            (r'[a-zA-Z_]\w*', Name.Variable)
+        ],
+        'string_double': [
+            (r'[^"\n]+', String),
+            (r'""', String),
+            (r'"', String, '#pop'),
+            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings.
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/sgf.py b/.venv/Lib/site-packages/pygments/lexers/sgf.py
new file mode 100644 (file)
index 0000000..f0e56cb
--- /dev/null
@@ -0,0 +1,59 @@
+"""
+    pygments.lexers.sgf
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Smart Game Format (sgf) file format.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Name, Literal, String, Punctuation, Whitespace
+
+__all__ = ["SmartGameFormatLexer"]
+
+
+class SmartGameFormatLexer(RegexLexer):
+    """
+    Lexer for Smart Game Format (sgf) file format.
+
+    The format is used to store game records of board games for two players
+    (mainly Go game).
+    """
+    name = 'SmartGameFormat'
+    url = 'https://www.red-bean.com/sgf/'
+    aliases = ['sgf']
+    filenames = ['*.sgf']
+    version_added = '2.4'
+
+    tokens = {
+        'root': [
+            (r'[():;]+', Punctuation),
+            # tokens:
+            (r'(A[BW]|AE|AN|AP|AR|AS|[BW]L|BM|[BW]R|[BW]S|[BW]T|CA|CH|CP|CR|'
+             r'DD|DM|DO|DT|EL|EV|EX|FF|FG|G[BW]|GC|GM|GN|HA|HO|ID|IP|IT|IY|KM|'
+             r'KO|LB|LN|LT|L|MA|MN|M|N|OB|OM|ON|OP|OT|OV|P[BW]|PC|PL|PM|RE|RG|'
+             r'RO|RU|SO|SC|SE|SI|SL|SO|SQ|ST|SU|SZ|T[BW]|TC|TE|TM|TR|UC|US|VW|'
+             r'V|[BW]|C)',
+             Name.Builtin),
+            # number:
+            (r'(\[)([0-9.]+)(\])',
+             bygroups(Punctuation, Literal.Number, Punctuation)),
+            # date:
+            (r'(\[)([0-9]{4}-[0-9]{2}-[0-9]{2})(\])',
+             bygroups(Punctuation, Literal.Date, Punctuation)),
+            # point:
+            (r'(\[)([a-z]{2})(\])',
+             bygroups(Punctuation, String, Punctuation)),
+            # double points:
+            (r'(\[)([a-z]{2})(:)([a-z]{2})(\])',
+             bygroups(Punctuation, String, Punctuation, String, Punctuation)),
+
+            (r'(\[)([\w\s#()+,\-.:?]+)(\])',
+             bygroups(Punctuation, String, Punctuation)),
+            (r'(\[)(\s.*)(\])',
+             bygroups(Punctuation, Whitespace, Punctuation)),
+            (r'\s+', Whitespace)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/shell.py b/.venv/Lib/site-packages/pygments/lexers/shell.py
new file mode 100644 (file)
index 0000000..744767a
--- /dev/null
@@ -0,0 +1,902 @@
+"""
+    pygments.lexers.shell
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various shells.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, do_insertions, bygroups, \
+    include, default, this, using, words, line_re
+from pygments.token import Punctuation, Whitespace, \
+    Text, Comment, Operator, Keyword, Name, String, Number, Generic
+from pygments.util import shebang_matches
+
+__all__ = ['BashLexer', 'BashSessionLexer', 'TcshLexer', 'BatchLexer',
+           'SlurmBashLexer', 'MSDOSSessionLexer', 'PowerShellLexer',
+           'PowerShellSessionLexer', 'TcshSessionLexer', 'FishShellLexer',
+           'ExeclineLexer']
+
+
+class BashLexer(RegexLexer):
+    """
+    Lexer for (ba|k|z|)sh shell scripts.
+    """
+
+    name = 'Bash'
+    aliases = ['bash', 'sh', 'ksh', 'zsh', 'shell', 'openrc']
+    filenames = ['*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass',
+                 '*.exheres-0', '*.exlib', '*.zsh',
+                 '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc',
+                 '.kshrc', 'kshrc',
+                 'PKGBUILD']
+    mimetypes = ['application/x-sh', 'application/x-shellscript', 'text/x-shellscript']
+    url = 'https://en.wikipedia.org/wiki/Unix_shell'
+    version_added = '0.6'
+
+    tokens = {
+        'root': [
+            include('basic'),
+            (r'`', String.Backtick, 'backticks'),
+            include('data'),
+            include('interp'),
+        ],
+        'interp': [
+            (r'\$\(\(', Keyword, 'math'),
+            (r'\$\(', Keyword, 'paren'),
+            (r'\$\{#?', String.Interpol, 'curly'),
+            (r'\$[a-zA-Z_]\w*', Name.Variable),  # user variable
+            (r'\$(?:\d+|[#$?!_*@-])', Name.Variable),      # builtin
+            (r'\$', Text),
+        ],
+        'basic': [
+            (r'\b(if|fi|else|while|in|do|done|for|then|return|function|case|'
+             r'select|break|continue|until|esac|elif)(\s*)\b',
+             bygroups(Keyword, Whitespace)),
+            (r'\b(alias|bg|bind|builtin|caller|cd|command|compgen|'
+             r'complete|declare|dirs|disown|echo|enable|eval|exec|exit|'
+             r'export|false|fc|fg|getopts|hash|help|history|jobs|kill|let|'
+             r'local|logout|popd|printf|pushd|pwd|read|readonly|set|shift|'
+             r'shopt|source|suspend|test|time|times|trap|true|type|typeset|'
+             r'ulimit|umask|unalias|unset|wait)(?=[\s)`])',
+             Name.Builtin),
+            (r'\A#!.+\n', Comment.Hashbang),
+            (r'#.*\n', Comment.Single),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(\+?=)', bygroups(Name.Variable, Whitespace, Operator)),
+            (r'[\[\]{}()=]', Operator),
+            (r'<<<', Operator),  # here-string
+            (r'<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+            (r'&&|\|\|', Operator),
+        ],
+        'data': [
+            (r'(?s)\$?"(\\.|[^"\\$])*"', String.Double),
+            (r'"', String.Double, 'string'),
+            (r"(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r"(?s)'.*?'", String.Single),
+            (r';', Punctuation),
+            (r'&', Punctuation),
+            (r'\|', Punctuation),
+            (r'\s+', Whitespace),
+            (r'\d+\b', Number),
+            (r'[^=\s\[\]{}()$"\'`\\<&|;]+', Text),
+            (r'<', Text),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+', String.Double),
+            include('interp'),
+        ],
+        'curly': [
+            (r'\}', String.Interpol, '#pop'),
+            (r':-', Keyword),
+            (r'\w+', Name.Variable),
+            (r'[^}:"\'`$\\]+', Punctuation),
+            (r':', Punctuation),
+            include('root'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+        'math': [
+            (r'\)\)', Keyword, '#pop'),
+            (r'\*\*|\|\||<<|>>|[-+*/%^|&<>]', Operator),
+            (r'\d+#[\da-zA-Z]+', Number),
+            (r'\d+#(?! )', Number),
+            (r'0[xX][\da-fA-F]+', Number),
+            (r'\d+', Number),
+            (r'[a-zA-Z_]\w*', Name.Variable),  # user variable
+            include('root'),
+        ],
+        'backticks': [
+            (r'`', String.Backtick, '#pop'),
+            include('root'),
+        ],
+    }
+
+    def analyse_text(text):
+        if shebang_matches(text, r'(ba|z|)sh'):
+            return 1
+        if text.startswith('$ '):
+            return 0.2
+
+
+class SlurmBashLexer(BashLexer):
+    """
+    Lexer for (ba|k|z|)sh Slurm scripts.
+    """
+
+    name = 'Slurm'
+    aliases = ['slurm', 'sbatch']
+    filenames = ['*.sl']
+    mimetypes = []
+    version_added = '2.4'
+    EXTRA_KEYWORDS = {'srun'}
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in BashLexer.get_tokens_unprocessed(self, text):
+            if token is Text and value in self.EXTRA_KEYWORDS:
+                yield index, Name.Builtin, value
+            elif token is Comment.Single and 'SBATCH' in value:
+                yield index, Keyword.Pseudo, value
+            else:
+                yield index, token, value
+
+
+class ShellSessionBaseLexer(Lexer):
+    """
+    Base lexer for shell sessions.
+
+    .. versionadded:: 2.1
+    """
+
+    _bare_continuation = False
+    _venv = re.compile(r'^(\([^)]*\))(\s*)')
+
+    def get_tokens_unprocessed(self, text):
+        innerlexer = self._innerLexerCls(**self.options)
+
+        pos = 0
+        curcode = ''
+        insertions = []
+        backslash_continuation = False
+
+        for match in line_re.finditer(text):
+            line = match.group()
+
+            venv_match = self._venv.match(line)
+            if venv_match:
+                venv = venv_match.group(1)
+                venv_whitespace = venv_match.group(2)
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt.VirtualEnv, venv)]))
+                if venv_whitespace:
+                    insertions.append((len(curcode),
+                                       [(0, Text, venv_whitespace)]))
+                line = line[venv_match.end():]
+
+            m = self._ps1rgx.match(line)
+            if m:
+                # To support output lexers (say diff output), the output
+                # needs to be broken by prompts whenever the output lexer
+                # changes.
+                if not insertions:
+                    pos = match.start()
+
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, m.group(1))]))
+                curcode += m.group(2)
+                backslash_continuation = curcode.endswith('\\\n')
+            elif backslash_continuation:
+                if line.startswith(self._ps2):
+                    insertions.append((len(curcode),
+                                       [(0, Generic.Prompt,
+                                         line[:len(self._ps2)])]))
+                    curcode += line[len(self._ps2):]
+                else:
+                    curcode += line
+                backslash_continuation = curcode.endswith('\\\n')
+            elif self._bare_continuation and line.startswith(self._ps2):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt,
+                                     line[:len(self._ps2)])]))
+                curcode += line[len(self._ps2):]
+            else:
+                if insertions:
+                    toks = innerlexer.get_tokens_unprocessed(curcode)
+                    for i, t, v in do_insertions(insertions, toks):
+                        yield pos+i, t, v
+                yield match.start(), Generic.Output, line
+                insertions = []
+                curcode = ''
+        if insertions:
+            for i, t, v in do_insertions(insertions,
+                                         innerlexer.get_tokens_unprocessed(curcode)):
+                yield pos+i, t, v
+
+
+class BashSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for Bash shell sessions, i.e. command lines, including a
+    prompt, interspersed with output.
+    """
+
+    name = 'Bash Session'
+    aliases = ['console', 'shell-session']
+    filenames = ['*.sh-session', '*.shell-session']
+    mimetypes = ['application/x-shell-session', 'application/x-sh-session']
+    url = 'https://en.wikipedia.org/wiki/Unix_shell'
+    version_added = '1.1'
+    _example = "console/example.sh-session"
+
+    _innerLexerCls = BashLexer
+    _ps1rgx = re.compile(
+        r'^((?:(?:\[.*?\])|(?:\(\S+\))?(?:| |sh\S*?|\w+\S+[@:]\S+(?:\s+\S+)' \
+        r'?|\[\S+[@:][^\n]+\].+))\s*[$#%]\s*)(.*\n?)')
+    _ps2 = '> '
+
+
+class BatchLexer(RegexLexer):
+    """
+    Lexer for the DOS/Windows Batch file format.
+    """
+    name = 'Batchfile'
+    aliases = ['batch', 'bat', 'dosbatch', 'winbatch']
+    filenames = ['*.bat', '*.cmd']
+    mimetypes = ['application/x-dos-batch']
+    url = 'https://en.wikipedia.org/wiki/Batch_file'
+    version_added = '0.7'
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    _nl = r'\n\x1a'
+    _punct = r'&<>|'
+    _ws = r'\t\v\f\r ,;=\xa0'
+    _nlws = r'\s\x1a\xa0,;='
+    _space = rf'(?:(?:(?:\^[{_nl}])?[{_ws}])+)'
+    _keyword_terminator = (rf'(?=(?:\^[{_nl}]?)?[{_ws}+./:[\\\]]|[{_nl}{_punct}(])')
+    _token_terminator = rf'(?=\^?[{_ws}]|[{_punct}{_nl}])'
+    _start_label = rf'((?:(?<=^[^:])|^[^:]?)[{_ws}]*)(:)'
+    _label = rf'(?:(?:[^{_nlws}{_punct}+:^]|\^[{_nl}]?[\w\W])*)'
+    _label_compound = rf'(?:(?:[^{_nlws}{_punct}+:^)]|\^[{_nl}]?[^)])*)'
+    _number = rf'(?:-?(?:0[0-7]+|0x[\da-f]+|\d+){_token_terminator})'
+    _opword = r'(?:equ|geq|gtr|leq|lss|neq)'
+    _string = rf'(?:"[^{_nl}"]*(?:"|(?=[{_nl}])))'
+    _variable = (r'(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|'
+                 rf'[^%:{_nl}]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%{_nl}^]|'
+                 rf'\^[^%{_nl}])[^={_nl}]*=(?:[^%{_nl}^]|\^[^%{_nl}])*)?)?%))|'
+                 rf'(?:\^?![^!:{_nl}]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:'
+                 rf'[^!{_nl}^]|\^[^!{_nl}])[^={_nl}]*=(?:[^!{_nl}^]|\^[^!{_nl}])*)?)?\^?!))')
+    _core_token = rf'(?:(?:(?:\^[{_nl}]?)?[^"{_nlws}{_punct}])+)'
+    _core_token_compound = rf'(?:(?:(?:\^[{_nl}]?)?[^"{_nlws}{_punct})])+)'
+    _token = rf'(?:[{_punct}]+|{_core_token})'
+    _token_compound = rf'(?:[{_punct}]+|{_core_token_compound})'
+    _stoken = (rf'(?:[{_punct}]+|(?:{_string}|{_variable}|{_core_token})+)')
+
+    def _make_begin_state(compound, _core_token=_core_token,
+                          _core_token_compound=_core_token_compound,
+                          _keyword_terminator=_keyword_terminator,
+                          _nl=_nl, _punct=_punct, _string=_string,
+                          _space=_space, _start_label=_start_label,
+                          _stoken=_stoken, _token_terminator=_token_terminator,
+                          _variable=_variable, _ws=_ws):
+        rest = '(?:{}|{}|[^"%{}{}{}])*'.format(_string, _variable, _nl, _punct,
+                                            ')' if compound else '')
+        rest_of_line = rf'(?:(?:[^{_nl}^]|\^[{_nl}]?[\w\W])*)'
+        rest_of_line_compound = rf'(?:(?:[^{_nl}^)]|\^[{_nl}]?[^)])*)'
+        set_space = rf'((?:(?:\^[{_nl}]?)?[^\S\n])*)'
+        suffix = ''
+        if compound:
+            _keyword_terminator = rf'(?:(?=\))|{_keyword_terminator})'
+            _token_terminator = rf'(?:(?=\))|{_token_terminator})'
+            suffix = '/compound'
+        return [
+            ((r'\)', Punctuation, '#pop') if compound else
+             (rf'\)((?=\()|{_token_terminator}){rest_of_line}',
+              Comment.Single)),
+            (rf'(?={_start_label})', Text, f'follow{suffix}'),
+            (_space, using(this, state='text')),
+            include(f'redirect{suffix}'),
+            (rf'[{_nl}]+', Text),
+            (r'\(', Punctuation, 'root/compound'),
+            (r'@+', Punctuation),
+            (rf'((?:for|if|rem)(?:(?=(?:\^[{_nl}]?)?/)|(?:(?!\^)|'
+             rf'(?<=m))(?:(?=\()|{_token_terminator})))({_space}?{_core_token_compound if compound else _core_token}?(?:\^[{_nl}]?)?/(?:\^[{_nl}]?)?\?)',
+             bygroups(Keyword, using(this, state='text')),
+             f'follow{suffix}'),
+            (rf'(goto{_keyword_terminator})({rest}(?:\^[{_nl}]?)?/(?:\^[{_nl}]?)?\?{rest})',
+             bygroups(Keyword, using(this, state='text')),
+             f'follow{suffix}'),
+            (words(('assoc', 'break', 'cd', 'chdir', 'cls', 'color', 'copy',
+                    'date', 'del', 'dir', 'dpath', 'echo', 'endlocal', 'erase',
+                    'exit', 'ftype', 'keys', 'md', 'mkdir', 'mklink', 'move',
+                    'path', 'pause', 'popd', 'prompt', 'pushd', 'rd', 'ren',
+                    'rename', 'rmdir', 'setlocal', 'shift', 'start', 'time',
+                    'title', 'type', 'ver', 'verify', 'vol'),
+                   suffix=_keyword_terminator), Keyword, f'follow{suffix}'),
+            (rf'(call)({_space}?)(:)',
+             bygroups(Keyword, using(this, state='text'), Punctuation),
+             f'call{suffix}'),
+            (rf'call{_keyword_terminator}', Keyword),
+            (rf'(for{_token_terminator}(?!\^))({_space})(/f{_token_terminator})',
+             bygroups(Keyword, using(this, state='text'), Keyword),
+             ('for/f', 'for')),
+            (rf'(for{_token_terminator}(?!\^))({_space})(/l{_token_terminator})',
+             bygroups(Keyword, using(this, state='text'), Keyword),
+             ('for/l', 'for')),
+            (rf'for{_token_terminator}(?!\^)', Keyword, ('for2', 'for')),
+            (rf'(goto{_keyword_terminator})({_space}?)(:?)',
+             bygroups(Keyword, using(this, state='text'), Punctuation),
+             f'label{suffix}'),
+            (rf'(if(?:(?=\()|{_token_terminator})(?!\^))({_space}?)((?:/i{_token_terminator})?)({_space}?)((?:not{_token_terminator})?)({_space}?)',
+             bygroups(Keyword, using(this, state='text'), Keyword,
+                      using(this, state='text'), Keyword,
+                      using(this, state='text')), ('(?', 'if')),
+            (rf'rem(((?=\()|{_token_terminator}){_space}?{_stoken}?.*|{_keyword_terminator}{rest_of_line_compound if compound else rest_of_line})',
+             Comment.Single, f'follow{suffix}'),
+            (rf'(set{_keyword_terminator}){set_space}(/a)',
+             bygroups(Keyword, using(this, state='text'), Keyword),
+             f'arithmetic{suffix}'),
+            (r'(set{}){}((?:/p)?){}((?:(?:(?:\^[{}]?)?[^"{}{}^={}]|'
+             r'\^[{}]?[^"=])+)?)((?:(?:\^[{}]?)?=)?)'.format(_keyword_terminator, set_space, set_space, _nl, _nl, _punct,
+              ')' if compound else '', _nl, _nl),
+             bygroups(Keyword, using(this, state='text'), Keyword,
+                      using(this, state='text'), using(this, state='variable'),
+                      Punctuation),
+             f'follow{suffix}'),
+            default(f'follow{suffix}')
+        ]
+
+    def _make_follow_state(compound, _label=_label,
+                           _label_compound=_label_compound, _nl=_nl,
+                           _space=_space, _start_label=_start_label,
+                           _token=_token, _token_compound=_token_compound,
+                           _ws=_ws):
+        suffix = '/compound' if compound else ''
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state += [
+            (rf'{_start_label}([{_ws}]*)({_label_compound if compound else _label})(.*)',
+             bygroups(Text, Punctuation, Text, Name.Label, Comment.Single)),
+            include(f'redirect{suffix}'),
+            (rf'(?=[{_nl}])', Text, '#pop'),
+            (r'\|\|?|&&?', Punctuation, '#pop'),
+            include('text')
+        ]
+        return state
+
+    def _make_arithmetic_state(compound, _nl=_nl, _punct=_punct,
+                               _string=_string, _variable=_variable,
+                               _ws=_ws, _nlws=_nlws):
+        op = r'=+\-*/!~'
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state += [
+            (r'0[0-7]+', Number.Oct),
+            (r'0x[\da-f]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'[(),]+', Punctuation),
+            (rf'([{op}]|%|\^\^)+', Operator),
+            (r'({}|{}|(\^[{}]?)?[^(){}%\^"{}{}]|\^[{}]?{})+'.format(_string, _variable, _nl, op, _nlws, _punct, _nlws,
+              r'[^)]' if compound else r'[\w\W]'),
+             using(this, state='variable')),
+            (r'(?=[\x00|&])', Text, '#pop'),
+            include('follow')
+        ]
+        return state
+
+    def _make_call_state(compound, _label=_label,
+                         _label_compound=_label_compound):
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state.append((r'(:?)(%s)' % (_label_compound if compound else _label),
+                      bygroups(Punctuation, Name.Label), '#pop'))
+        return state
+
+    def _make_label_state(compound, _label=_label,
+                          _label_compound=_label_compound, _nl=_nl,
+                          _punct=_punct, _string=_string, _variable=_variable):
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state.append((r'({}?)((?:{}|{}|\^[{}]?{}|[^"%^{}{}{}])*)'.format(_label_compound if compound else _label, _string,
+                       _variable, _nl, r'[^)]' if compound else r'[\w\W]', _nl,
+                       _punct, r')' if compound else ''),
+                      bygroups(Name.Label, Comment.Single), '#pop'))
+        return state
+
+    def _make_redirect_state(compound,
+                             _core_token_compound=_core_token_compound,
+                             _nl=_nl, _punct=_punct, _stoken=_stoken,
+                             _string=_string, _space=_space,
+                             _variable=_variable, _nlws=_nlws):
+        stoken_compound = (rf'(?:[{_punct}]+|(?:{_string}|{_variable}|{_core_token_compound})+)')
+        return [
+            (rf'((?:(?<=[{_nlws}])\d)?)(>>?&|<&)([{_nlws}]*)(\d)',
+             bygroups(Number.Integer, Punctuation, Text, Number.Integer)),
+            (rf'((?:(?<=[{_nlws}])(?<!\^[{_nl}])\d)?)(>>?|<)({_space}?{stoken_compound if compound else _stoken})',
+             bygroups(Number.Integer, Punctuation, using(this, state='text')))
+        ]
+
+    tokens = {
+        'root': _make_begin_state(False),
+        'follow': _make_follow_state(False),
+        'arithmetic': _make_arithmetic_state(False),
+        'call': _make_call_state(False),
+        'label': _make_label_state(False),
+        'redirect': _make_redirect_state(False),
+        'root/compound': _make_begin_state(True),
+        'follow/compound': _make_follow_state(True),
+        'arithmetic/compound': _make_arithmetic_state(True),
+        'call/compound': _make_call_state(True),
+        'label/compound': _make_label_state(True),
+        'redirect/compound': _make_redirect_state(True),
+        'variable-or-escape': [
+            (_variable, Name.Variable),
+            (rf'%%|\^[{_nl}]?(\^!|[\w\W])', String.Escape)
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (_variable, Name.Variable),
+            (r'\^!|%%', String.Escape),
+            (rf'[^"%^{_nl}]+|[%^]', String.Double),
+            default('#pop')
+        ],
+        'sqstring': [
+            include('variable-or-escape'),
+            (r'[^%]+|%', String.Single)
+        ],
+        'bqstring': [
+            include('variable-or-escape'),
+            (r'[^%]+|%', String.Backtick)
+        ],
+        'text': [
+            (r'"', String.Double, 'string'),
+            include('variable-or-escape'),
+            (rf'[^"%^{_nlws}{_punct}\d)]+|.', Text)
+        ],
+        'variable': [
+            (r'"', String.Double, 'string'),
+            include('variable-or-escape'),
+            (rf'[^"%^{_nl}]+|.', Name.Variable)
+        ],
+        'for': [
+            (rf'({_space})(in)({_space})(\()',
+             bygroups(using(this, state='text'), Keyword,
+                      using(this, state='text'), Punctuation), '#pop'),
+            include('follow')
+        ],
+        'for2': [
+            (r'\)', Punctuation),
+            (rf'({_space})(do{_token_terminator})',
+             bygroups(using(this, state='text'), Keyword), '#pop'),
+            (rf'[{_nl}]+', Text),
+            include('follow')
+        ],
+        'for/f': [
+            (rf'(")((?:{_variable}|[^"])*?")([{_nlws}]*)(\))',
+             bygroups(String.Double, using(this, state='string'), Text,
+                      Punctuation)),
+            (r'"', String.Double, ('#pop', 'for2', 'string')),
+            (rf"('(?:%%|{_variable}|[\w\W])*?')([{_nlws}]*)(\))",
+             bygroups(using(this, state='sqstring'), Text, Punctuation)),
+            (rf'(`(?:%%|{_variable}|[\w\W])*?`)([{_nlws}]*)(\))',
+             bygroups(using(this, state='bqstring'), Text, Punctuation)),
+            include('for2')
+        ],
+        'for/l': [
+            (r'-?\d+', Number.Integer),
+            include('for2')
+        ],
+        'if': [
+            (rf'((?:cmdextversion|errorlevel){_token_terminator})({_space})(\d+)',
+             bygroups(Keyword, using(this, state='text'),
+                      Number.Integer), '#pop'),
+            (rf'(defined{_token_terminator})({_space})({_stoken})',
+             bygroups(Keyword, using(this, state='text'),
+                      using(this, state='variable')), '#pop'),
+            (rf'(exist{_token_terminator})({_space}{_stoken})',
+             bygroups(Keyword, using(this, state='text')), '#pop'),
+            (rf'({_number}{_space})({_opword})({_space}{_number})',
+             bygroups(using(this, state='arithmetic'), Operator.Word,
+                      using(this, state='arithmetic')), '#pop'),
+            (_stoken, using(this, state='text'), ('#pop', 'if2')),
+        ],
+        'if2': [
+            (rf'({_space}?)(==)({_space}?{_stoken})',
+             bygroups(using(this, state='text'), Operator,
+                      using(this, state='text')), '#pop'),
+            (rf'({_space})({_opword})({_space}{_stoken})',
+             bygroups(using(this, state='text'), Operator.Word,
+                      using(this, state='text')), '#pop')
+        ],
+        '(?': [
+            (_space, using(this, state='text')),
+            (r'\(', Punctuation, ('#pop', 'else?', 'root/compound')),
+            default('#pop')
+        ],
+        'else?': [
+            (_space, using(this, state='text')),
+            (rf'else{_token_terminator}', Keyword, '#pop'),
+            default('#pop')
+        ]
+    }
+
+
+class MSDOSSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for MS DOS shell sessions, i.e. command lines, including a
+    prompt, interspersed with output.
+    """
+
+    name = 'MSDOS Session'
+    aliases = ['doscon']
+    filenames = []
+    mimetypes = []
+    url = 'https://en.wikipedia.org/wiki/MS-DOS'
+    version_added = '2.1'
+    _example = "doscon/session"
+
+    _innerLexerCls = BatchLexer
+    _ps1rgx = re.compile(r'^([^>]*>)(.*\n?)')
+    _ps2 = 'More? '
+
+
+class TcshLexer(RegexLexer):
+    """
+    Lexer for tcsh scripts.
+    """
+
+    name = 'Tcsh'
+    aliases = ['tcsh', 'csh']
+    filenames = ['*.tcsh', '*.csh']
+    mimetypes = ['application/x-csh']
+    url = 'https://www.tcsh.org'
+    version_added = '0.10'
+
+    tokens = {
+        'root': [
+            include('basic'),
+            (r'\$\(', Keyword, 'paren'),
+            (r'\$\{#?', Keyword, 'curly'),
+            (r'`', String.Backtick, 'backticks'),
+            include('data'),
+        ],
+        'basic': [
+            (r'\b(if|endif|else|while|then|foreach|case|default|'
+             r'break|continue|goto|breaksw|end|switch|endsw)\s*\b',
+             Keyword),
+            (r'\b(alias|alloc|bg|bindkey|builtins|bye|caller|cd|chdir|'
+             r'complete|dirs|echo|echotc|eval|exec|exit|fg|filetest|getxvers|'
+             r'glob|getspath|hashstat|history|hup|inlib|jobs|kill|'
+             r'limit|log|login|logout|ls-F|migrate|newgrp|nice|nohup|notify|'
+             r'onintr|popd|printenv|pushd|rehash|repeat|rootnode|popd|pushd|'
+             r'set|shift|sched|setenv|setpath|settc|setty|setxvers|shift|'
+             r'source|stop|suspend|source|suspend|telltc|time|'
+             r'umask|unalias|uncomplete|unhash|universe|unlimit|unset|unsetenv|'
+             r'ver|wait|warp|watchlog|where|which)\s*\b',
+             Name.Builtin),
+            (r'#.*', Comment),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Text, Operator)),
+            (r'[\[\]{}()=]+', Operator),
+            (r'<<\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+            (r';', Punctuation),
+        ],
+        'data': [
+            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
+            (r"(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r'\s+', Text),
+            (r'[^=\s\[\]{}()$"\'`\\;#]+', Text),
+            (r'\d+(?= |\Z)', Number),
+            (r'\$#?(\w+|.)', Name.Variable),
+        ],
+        'curly': [
+            (r'\}', Keyword, '#pop'),
+            (r':-', Keyword),
+            (r'\w+', Name.Variable),
+            (r'[^}:"\'`$]+', Punctuation),
+            (r':', Punctuation),
+            include('root'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+        'backticks': [
+            (r'`', String.Backtick, '#pop'),
+            include('root'),
+        ],
+    }
+
+
+class TcshSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for Tcsh sessions, i.e. command lines, including a
+    prompt, interspersed with output.
+    """
+
+    name = 'Tcsh Session'
+    aliases = ['tcshcon']
+    filenames = []
+    mimetypes = []
+    url = 'https://www.tcsh.org'
+    version_added = '2.1'
+    _example = "tcshcon/session"
+
+    _innerLexerCls = TcshLexer
+    _ps1rgx = re.compile(r'^([^>]+>)(.*\n?)')
+    _ps2 = '? '
+
+
+class PowerShellLexer(RegexLexer):
+    """
+    For Windows PowerShell code.
+    """
+    name = 'PowerShell'
+    aliases = ['powershell', 'pwsh', 'posh', 'ps1', 'psm1']
+    filenames = ['*.ps1', '*.psm1']
+    mimetypes = ['text/x-powershell']
+    url = 'https://learn.microsoft.com/en-us/powershell'
+    version_added = '1.5'
+
+    flags = re.DOTALL | re.IGNORECASE | re.MULTILINE
+
+    keywords = (
+        'while validateset validaterange validatepattern validatelength '
+        'validatecount until trap switch return ref process param parameter in '
+        'if global: local: function foreach for finally filter end elseif else '
+        'dynamicparam do default continue cmdletbinding break begin alias \\? '
+        '% #script #private #local #global mandatory parametersetname position '
+        'valuefrompipeline valuefrompipelinebypropertyname '
+        'valuefromremainingarguments helpmessage try catch throw').split()
+
+    operators = (
+        'and as band bnot bor bxor casesensitive ccontains ceq cge cgt cle '
+        'clike clt cmatch cne cnotcontains cnotlike cnotmatch contains '
+        'creplace eq exact f file ge gt icontains ieq ige igt ile ilike ilt '
+        'imatch ine inotcontains inotlike inotmatch ireplace is isnot le like '
+        'lt match ne not notcontains notlike notmatch or regex replace '
+        'wildcard').split()
+
+    verbs = (
+        'write where watch wait use update unregister unpublish unprotect '
+        'unlock uninstall undo unblock trace test tee take sync switch '
+        'suspend submit stop step start split sort skip show set send select '
+        'search scroll save revoke resume restore restart resolve resize '
+        'reset request repair rename remove register redo receive read push '
+        'publish protect pop ping out optimize open new move mount merge '
+        'measure lock limit join invoke install initialize import hide group '
+        'grant get format foreach find export expand exit enter enable edit '
+        'dismount disconnect disable deny debug cxnew copy convertto '
+        'convertfrom convert connect confirm compress complete compare close '
+        'clear checkpoint block backup assert approve aggregate add').split()
+
+    aliases_ = (
+        'ac asnp cat cd cfs chdir clc clear clhy cli clp cls clv cnsn '
+        'compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo epal '
+        'epcsv epsn erase etsn exsn fc fhx fl foreach ft fw gal gbp gc gci gcm '
+        'gcs gdr ghy gi gjb gl gm gmo gp gps gpv group gsn gsnp gsv gu gv gwmi '
+        'h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp '
+        'ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv '
+        'oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo '
+        'rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc select '
+        'set shcm si sl sleep sls sort sp spjb spps spsv start sujb sv swmi tee '
+        'trcm type wget where wjb write').split()
+
+    commenthelp = (
+        'component description example externalhelp forwardhelpcategory '
+        'forwardhelptargetname functionality inputs link '
+        'notes outputs parameter remotehelprunspace role synopsis').split()
+
+    tokens = {
+        'root': [
+            # we need to count pairs of parentheses for correct highlight
+            # of '$(...)' blocks in strings
+            (r'\(', Punctuation, 'child'),
+            (r'\s+', Text),
+            (r'^(\s*#[#\s]*)(\.(?:{}))([^\n]*$)'.format('|'.join(commenthelp)),
+             bygroups(Comment, String.Doc, Comment)),
+            (r'#[^\n]*?$', Comment),
+            (r'(&lt;|<)#', Comment.Multiline, 'multline'),
+            (r'@"\n', String.Heredoc, 'heredoc-double'),
+            (r"@'\n.*?\n'@", String.Heredoc),
+            # escaped syntax
+            (r'`[\'"$@-]', Punctuation),
+            (r'"', String.Double, 'string'),
+            (r"'([^']|'')*'", String.Single),
+            (r'(\$|@@|@)((global|script|private|env):)?\w+',
+             Name.Variable),
+            (r'({})\b'.format('|'.join(keywords)), Keyword),
+            (r'-({})\b'.format('|'.join(operators)), Operator),
+            (r'({})-[a-z_]\w*\b'.format('|'.join(verbs)), Name.Builtin),
+            (r'({})\s'.format('|'.join(aliases_)), Name.Builtin),
+            (r'\[[a-z_\[][\w. `,\[\]]*\]', Name.Constant),  # .net [type]s
+            (r'-[a-z_]\w*', Name),
+            (r'\w+', Name),
+            (r'[.,;:@{}\[\]$()=+*/\\&%!~?^`|<>-]', Punctuation),
+        ],
+        'child': [
+            (r'\)', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'multline': [
+            (r'[^#&.]+', Comment.Multiline),
+            (r'#(>|&gt;)', Comment.Multiline, '#pop'),
+            (r'\.({})'.format('|'.join(commenthelp)), String.Doc),
+            (r'[#&.]', Comment.Multiline),
+        ],
+        'string': [
+            (r"`[0abfnrtv'\"$`]", String.Escape),
+            (r'[^$`"]+', String.Double),
+            (r'\$\(', Punctuation, 'child'),
+            (r'""', String.Double),
+            (r'[`$]', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'heredoc-double': [
+            (r'\n"@', String.Heredoc, '#pop'),
+            (r'\$\(', Punctuation, 'child'),
+            (r'[^@\n]+"]', String.Heredoc),
+            (r".", String.Heredoc),
+        ]
+    }
+
+
+class PowerShellSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for PowerShell sessions, i.e. command lines, including a
+    prompt, interspersed with output.
+    """
+
+    name = 'PowerShell Session'
+    aliases = ['pwsh-session', 'ps1con']
+    filenames = []
+    mimetypes = []
+    url = 'https://learn.microsoft.com/en-us/powershell'
+    version_added = '2.1'
+    _example = "pwsh-session/session"
+
+    _innerLexerCls = PowerShellLexer
+    _bare_continuation = True
+    _ps1rgx = re.compile(r'^((?:\[[^]]+\]: )?PS[^>]*> ?)(.*\n?)')
+    _ps2 = '> '
+
+
+class FishShellLexer(RegexLexer):
+    """
+    Lexer for Fish shell scripts.
+    """
+
+    name = 'Fish'
+    aliases = ['fish', 'fishshell']
+    filenames = ['*.fish', '*.load']
+    mimetypes = ['application/x-fish']
+    url = 'https://fishshell.com'
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            include('basic'),
+            include('data'),
+            include('interp'),
+        ],
+        'interp': [
+            (r'\$\(\(', Keyword, 'math'),
+            (r'\(', Keyword, 'paren'),
+            (r'\$#?(\w+|.)', Name.Variable),
+        ],
+        'basic': [
+            (r'\b(begin|end|if|else|while|break|for|in|return|function|block|'
+             r'case|continue|switch|not|and|or|set|echo|exit|pwd|true|false|'
+             r'cd|count|test)(\s*)\b',
+             bygroups(Keyword, Text)),
+            (r'\b(alias|bg|bind|breakpoint|builtin|command|commandline|'
+             r'complete|contains|dirh|dirs|emit|eval|exec|fg|fish|fish_config|'
+             r'fish_indent|fish_pager|fish_prompt|fish_right_prompt|'
+             r'fish_update_completions|fishd|funced|funcsave|functions|help|'
+             r'history|isatty|jobs|math|mimedb|nextd|open|popd|prevd|psub|'
+             r'pushd|random|read|set_color|source|status|trap|type|ulimit|'
+             r'umask|vared|fc|getopts|hash|kill|printf|time|wait)\s*\b(?!\.)',
+             Name.Builtin),
+            (r'#.*\n', Comment),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Whitespace, Operator)),
+            (r'[\[\]()=]', Operator),
+            (r'<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+        ],
+        'data': [
+            (r'(?s)\$?"(\\\\|\\[0-7]+|\\.|[^"\\$])*"', String.Double),
+            (r'"', String.Double, 'string'),
+            (r"(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r"(?s)'.*?'", String.Single),
+            (r';', Punctuation),
+            (r'&|\||\^|<|>', Operator),
+            (r'\s+', Text),
+            (r'\d+(?= |\Z)', Number),
+            (r'[^=\s\[\]{}()$"\'`\\<&|;]+', Text),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+', String.Double),
+            include('interp'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+        'math': [
+            (r'\)\)', Keyword, '#pop'),
+            (r'[-+*/%^|&]|\*\*|\|\|', Operator),
+            (r'\d+#\d+', Number),
+            (r'\d+#(?! )', Number),
+            (r'\d+', Number),
+            include('root'),
+        ],
+    }
+
+class ExeclineLexer(RegexLexer):
+    """
+    Lexer for Laurent Bercot's execline language.
+    """
+
+    name = 'execline'
+    aliases = ['execline']
+    filenames = ['*.exec']
+    url = 'https://skarnet.org/software/execline'
+    version_added = '2.7'
+
+    tokens = {
+        'root': [
+            include('basic'),
+            include('data'),
+            include('interp')
+        ],
+        'interp': [
+            (r'\$\{', String.Interpol, 'curly'),
+            (r'\$[\w@#]+', Name.Variable),  # user variable
+            (r'\$', Text),
+        ],
+        'basic': [
+            (r'\b(background|backtick|cd|define|dollarat|elgetopt|'
+             r'elgetpositionals|elglob|emptyenv|envfile|exec|execlineb|'
+             r'exit|export|fdblock|fdclose|fdmove|fdreserve|fdswap|'
+             r'forbacktickx|foreground|forstdin|forx|getcwd|getpid|heredoc|'
+             r'homeof|if|ifelse|ifte|ifthenelse|importas|loopwhilex|'
+             r'multidefine|multisubstitute|pipeline|piperw|posix-cd|'
+             r'redirfd|runblock|shift|trap|tryexec|umask|unexport|wait|'
+             r'withstdinas)\b', Name.Builtin),
+            (r'\A#!.+\n', Comment.Hashbang),
+            (r'#.*\n', Comment.Single),
+            (r'[{}]', Operator)
+        ],
+        'data': [
+            (r'(?s)"(\\.|[^"\\$])*"', String.Double),
+            (r'"', String.Double, 'string'),
+            (r'\s+', Text),
+            (r'[^\s{}$"\\]+', Text)
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'(?s)(\\\\|\\.|[^"\\$])+', String.Double),
+            include('interp'),
+        ],
+        'curly': [
+            (r'\}', String.Interpol, '#pop'),
+            (r'[\w#@]+', Name.Variable),
+            include('root')
+        ]
+
+    }
+
+    def analyse_text(text):
+        if shebang_matches(text, r'execlineb'):
+            return 1
diff --git a/.venv/Lib/site-packages/pygments/lexers/sieve.py b/.venv/Lib/site-packages/pygments/lexers/sieve.py
new file mode 100644 (file)
index 0000000..fc48980
--- /dev/null
@@ -0,0 +1,78 @@
+"""
+    pygments.lexers.sieve
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Sieve file format.
+
+    https://tools.ietf.org/html/rfc5228
+    https://tools.ietf.org/html/rfc5173
+    https://tools.ietf.org/html/rfc5229
+    https://tools.ietf.org/html/rfc5230
+    https://tools.ietf.org/html/rfc5232
+    https://tools.ietf.org/html/rfc5235
+    https://tools.ietf.org/html/rfc5429
+    https://tools.ietf.org/html/rfc8580
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Comment, Name, Literal, String, Text, Punctuation, \
+    Keyword
+
+__all__ = ["SieveLexer"]
+
+
+class SieveLexer(RegexLexer):
+    """
+    Lexer for sieve format.
+    """
+    name = 'Sieve'
+    filenames = ['*.siv', '*.sieve']
+    aliases = ['sieve']
+    url = 'https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language)'
+    version_added = '2.6'
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'[();,{}\[\]]', Punctuation),
+            # import:
+            (r'(?i)require',
+             Keyword.Namespace),
+            # tags:
+            (r'(?i)(:)(addresses|all|contains|content|create|copy|comparator|'
+             r'count|days|detail|domain|fcc|flags|from|handle|importance|is|'
+             r'localpart|length|lowerfirst|lower|matches|message|mime|options|'
+             r'over|percent|quotewildcard|raw|regex|specialuse|subject|text|'
+             r'under|upperfirst|upper|value)',
+             bygroups(Name.Tag, Name.Tag)),
+            # tokens:
+            (r'(?i)(address|addflag|allof|anyof|body|discard|elsif|else|envelope|'
+             r'ereject|exists|false|fileinto|if|hasflag|header|keep|'
+             r'notify_method_capability|notify|not|redirect|reject|removeflag|'
+             r'setflag|size|spamtest|stop|string|true|vacation|virustest)',
+             Name.Builtin),
+            (r'(?i)set',
+             Keyword.Declaration),
+            # number:
+            (r'([0-9.]+)([kmgKMG])?',
+             bygroups(Literal.Number, Literal.Number)),
+            # comment:
+            (r'#.*$',
+             Comment.Single),
+            (r'/\*.*\*/',
+             Comment.Multiline),
+            # string:
+            (r'"[^"]*?"',
+             String),
+            # text block:
+            (r'text:',
+             Name.Tag, 'text'),
+        ],
+        'text': [
+            (r'[^.].*?\n', String),
+            (r'^\.', Punctuation, "#pop"),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/slash.py b/.venv/Lib/site-packages/pygments/lexers/slash.py
new file mode 100644 (file)
index 0000000..1c439d0
--- /dev/null
@@ -0,0 +1,183 @@
+"""
+    pygments.lexers.slash
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Slash programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import ExtendedRegexLexer, bygroups, DelegatingLexer
+from pygments.token import Name, Number, String, Comment, Punctuation, \
+    Other, Keyword, Operator, Whitespace
+
+__all__ = ['SlashLexer']
+
+
+class SlashLanguageLexer(ExtendedRegexLexer):
+    _nkw = r'(?=[^a-zA-Z_0-9])'
+
+    def move_state(new_state):
+        return ("#pop", new_state)
+
+    def right_angle_bracket(lexer, match, ctx):
+        if len(ctx.stack) > 1 and ctx.stack[-2] == "string":
+            ctx.stack.pop()
+        yield match.start(), String.Interpol, '}'
+        ctx.pos = match.end()
+        pass
+
+    tokens = {
+        "root": [
+            (r"<%=",        Comment.Preproc,    move_state("slash")),
+            (r"<%!!",       Comment.Preproc,    move_state("slash")),
+            (r"<%#.*?%>",   Comment.Multiline),
+            (r"<%",         Comment.Preproc,    move_state("slash")),
+            (r".|\n",       Other),
+        ],
+        "string": [
+            (r"\\",         String.Escape,      move_state("string_e")),
+            (r"\"",         String,             move_state("slash")),
+            (r"#\{",        String.Interpol,    "slash"),
+            (r'.|\n',       String),
+        ],
+        "string_e": [
+            (r'n',                  String.Escape,      move_state("string")),
+            (r't',                  String.Escape,      move_state("string")),
+            (r'r',                  String.Escape,      move_state("string")),
+            (r'e',                  String.Escape,      move_state("string")),
+            (r'x[a-fA-F0-9]{2}',    String.Escape,      move_state("string")),
+            (r'.',                  String.Escape,      move_state("string")),
+        ],
+        "regexp": [
+            (r'}[a-z]*',            String.Regex,       move_state("slash")),
+            (r'\\(.|\n)',           String.Regex),
+            (r'{',                  String.Regex,       "regexp_r"),
+            (r'.|\n',               String.Regex),
+        ],
+        "regexp_r": [
+            (r'}[a-z]*',            String.Regex,       "#pop"),
+            (r'\\(.|\n)',           String.Regex),
+            (r'{',                  String.Regex,       "regexp_r"),
+        ],
+        "slash": [
+            (r"%>",                     Comment.Preproc,    move_state("root")),
+            (r"\"",                     String,             move_state("string")),
+            (r"'[a-zA-Z0-9_]+",         String),
+            (r'%r{',                    String.Regex,       move_state("regexp")),
+            (r'/\*.*?\*/',              Comment.Multiline),
+            (r"(#|//).*?\n",            Comment.Single),
+            (r'-?[0-9]+e[+-]?[0-9]+',   Number.Float),
+            (r'-?[0-9]+\.[0-9]+(e[+-]?[0-9]+)?', Number.Float),
+            (r'-?[0-9]+',               Number.Integer),
+            (r'nil'+_nkw,               Name.Builtin),
+            (r'true'+_nkw,              Name.Builtin),
+            (r'false'+_nkw,             Name.Builtin),
+            (r'self'+_nkw,              Name.Builtin),
+            (r'(class)(\s+)([A-Z][a-zA-Z0-9_\']*)',
+                bygroups(Keyword, Whitespace, Name.Class)),
+            (r'class'+_nkw,             Keyword),
+            (r'extends'+_nkw,           Keyword),
+            (r'(def)(\s+)(self)(\s*)(\.)(\s*)([a-z_][a-zA-Z0-9_\']*=?|<<|>>|==|<=>|<=|<|>=|>|\+|-(self)?|~(self)?|\*|/|%|^|&&|&|\||\[\]=?)',
+                bygroups(Keyword, Whitespace, Name.Builtin, Whitespace, Punctuation, Whitespace, Name.Function)),
+            (r'(def)(\s+)([a-z_][a-zA-Z0-9_\']*=?|<<|>>|==|<=>|<=|<|>=|>|\+|-(self)?|~(self)?|\*|/|%|^|&&|&|\||\[\]=?)',
+                bygroups(Keyword, Whitespace, Name.Function)),
+            (r'def'+_nkw,               Keyword),
+            (r'if'+_nkw,                Keyword),
+            (r'elsif'+_nkw,             Keyword),
+            (r'else'+_nkw,              Keyword),
+            (r'unless'+_nkw,            Keyword),
+            (r'for'+_nkw,               Keyword),
+            (r'in'+_nkw,                Keyword),
+            (r'while'+_nkw,             Keyword),
+            (r'until'+_nkw,             Keyword),
+            (r'and'+_nkw,               Keyword),
+            (r'or'+_nkw,                Keyword),
+            (r'not'+_nkw,               Keyword),
+            (r'lambda'+_nkw,            Keyword),
+            (r'try'+_nkw,               Keyword),
+            (r'catch'+_nkw,             Keyword),
+            (r'return'+_nkw,            Keyword),
+            (r'next'+_nkw,              Keyword),
+            (r'last'+_nkw,              Keyword),
+            (r'throw'+_nkw,             Keyword),
+            (r'use'+_nkw,               Keyword),
+            (r'switch'+_nkw,            Keyword),
+            (r'\\',                     Keyword),
+            (r'λ',                      Keyword),
+            (r'__FILE__'+_nkw,          Name.Builtin.Pseudo),
+            (r'__LINE__'+_nkw,          Name.Builtin.Pseudo),
+            (r'[A-Z][a-zA-Z0-9_\']*'+_nkw, Name.Constant),
+            (r'[a-z_][a-zA-Z0-9_\']*'+_nkw, Name),
+            (r'@[a-z_][a-zA-Z0-9_\']*'+_nkw, Name.Variable.Instance),
+            (r'@@[a-z_][a-zA-Z0-9_\']*'+_nkw, Name.Variable.Class),
+            (r'\(',                     Punctuation),
+            (r'\)',                     Punctuation),
+            (r'\[',                     Punctuation),
+            (r'\]',                     Punctuation),
+            (r'\{',                     Punctuation),
+            (r'\}',                     right_angle_bracket),
+            (r';',                      Punctuation),
+            (r',',                      Punctuation),
+            (r'<<=',                    Operator),
+            (r'>>=',                    Operator),
+            (r'<<',                     Operator),
+            (r'>>',                     Operator),
+            (r'==',                     Operator),
+            (r'!=',                     Operator),
+            (r'=>',                     Operator),
+            (r'=',                      Operator),
+            (r'<=>',                    Operator),
+            (r'<=',                     Operator),
+            (r'>=',                     Operator),
+            (r'<',                      Operator),
+            (r'>',                      Operator),
+            (r'\+\+',                   Operator),
+            (r'\+=',                    Operator),
+            (r'-=',                     Operator),
+            (r'\*\*=',                  Operator),
+            (r'\*=',                    Operator),
+            (r'\*\*',                   Operator),
+            (r'\*',                     Operator),
+            (r'/=',                     Operator),
+            (r'\+',                     Operator),
+            (r'-',                      Operator),
+            (r'/',                      Operator),
+            (r'%=',                     Operator),
+            (r'%',                      Operator),
+            (r'^=',                     Operator),
+            (r'&&=',                    Operator),
+            (r'&=',                     Operator),
+            (r'&&',                     Operator),
+            (r'&',                      Operator),
+            (r'\|\|=',                  Operator),
+            (r'\|=',                    Operator),
+            (r'\|\|',                   Operator),
+            (r'\|',                     Operator),
+            (r'!',                      Operator),
+            (r'\.\.\.',                 Operator),
+            (r'\.\.',                   Operator),
+            (r'\.',                     Operator),
+            (r'::',                     Operator),
+            (r':',                      Operator),
+            (r'(\s|\n)+',               Whitespace),
+            (r'[a-z_][a-zA-Z0-9_\']*',  Name.Variable),
+        ],
+    }
+
+
+class SlashLexer(DelegatingLexer):
+    """
+    Lexer for the Slash programming language.
+    """
+
+    name = 'Slash'
+    aliases = ['slash']
+    filenames = ['*.sla']
+    url = 'https://github.com/arturadib/Slash-A'
+    version_added = '2.4'
+
+    def __init__(self, **options):
+        from pygments.lexers.web import HtmlLexer
+        super().__init__(HtmlLexer, SlashLanguageLexer, **options)
diff --git a/.venv/Lib/site-packages/pygments/lexers/smalltalk.py b/.venv/Lib/site-packages/pygments/lexers/smalltalk.py
new file mode 100644 (file)
index 0000000..674b7b4
--- /dev/null
@@ -0,0 +1,194 @@
+"""
+    pygments.lexers.smalltalk
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Smalltalk and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['SmalltalkLexer', 'NewspeakLexer']
+
+
+class SmalltalkLexer(RegexLexer):
+    """
+    For Smalltalk syntax.
+    Contributed by Stefan Matthias Aust.
+    Rewritten by Nils Winter.
+    """
+    name = 'Smalltalk'
+    url = 'http://www.smalltalk.org/'
+    filenames = ['*.st']
+    aliases = ['smalltalk', 'squeak', 'st']
+    mimetypes = ['text/x-smalltalk']
+    version_added = '0.10'
+
+    tokens = {
+        'root': [
+            (r'(<)(\w+:)(.*?)(>)', bygroups(Text, Keyword, Text, Text)),
+            include('squeak fileout'),
+            include('whitespaces'),
+            include('method definition'),
+            (r'(\|)([\w\s]*)(\|)', bygroups(Operator, Name.Variable, Operator)),
+            include('objects'),
+            (r'\^|\:=|\_', Operator),
+            # temporaries
+            (r'[\]({}.;!]', Text),
+        ],
+        'method definition': [
+            # Not perfect can't allow whitespaces at the beginning and the
+            # without breaking everything
+            (r'([a-zA-Z]+\w*:)(\s*)(\w+)',
+             bygroups(Name.Function, Text, Name.Variable)),
+            (r'^(\b[a-zA-Z]+\w*\b)(\s*)$', bygroups(Name.Function, Text)),
+            (r'^([-+*/\\~<>=|&!?,@%]+)(\s*)(\w+)(\s*)$',
+             bygroups(Name.Function, Text, Name.Variable, Text)),
+        ],
+        'blockvariables': [
+            include('whitespaces'),
+            (r'(:)(\s*)(\w+)',
+             bygroups(Operator, Text, Name.Variable)),
+            (r'\|', Operator, '#pop'),
+            default('#pop'),  # else pop
+        ],
+        'literals': [
+            (r"'(''|[^'])*'", String, 'afterobject'),
+            (r'\$.', String.Char, 'afterobject'),
+            (r'#\(', String.Symbol, 'parenth'),
+            (r'\)', Text, 'afterobject'),
+            (r'(\d+r)?-?\d+(\.\d+)?(e-?\d+)?', Number, 'afterobject'),
+        ],
+        '_parenth_helper': [
+            include('whitespaces'),
+            (r'(\d+r)?-?\d+(\.\d+)?(e-?\d+)?', Number),
+            (r'[-+*/\\~<>=|&#!?,@%\w:]+', String.Symbol),
+            # literals
+            (r"'(''|[^'])*'", String),
+            (r'\$.', String.Char),
+            (r'#*\(', String.Symbol, 'inner_parenth'),
+        ],
+        'parenth': [
+            # This state is a bit tricky since
+            # we can't just pop this state
+            (r'\)', String.Symbol, ('root', 'afterobject')),
+            include('_parenth_helper'),
+        ],
+        'inner_parenth': [
+            (r'\)', String.Symbol, '#pop'),
+            include('_parenth_helper'),
+        ],
+        'whitespaces': [
+            # skip whitespace and comments
+            (r'\s+', Text),
+            (r'"(""|[^"])*"', Comment),
+        ],
+        'objects': [
+            (r'\[', Text, 'blockvariables'),
+            (r'\]', Text, 'afterobject'),
+            (r'\b(self|super|true|false|nil|thisContext)\b',
+             Name.Builtin.Pseudo, 'afterobject'),
+            (r'\b[A-Z]\w*(?!:)\b', Name.Class, 'afterobject'),
+            (r'\b[a-z]\w*(?!:)\b', Name.Variable, 'afterobject'),
+            (r'#("(""|[^"])*"|[-+*/\\~<>=|&!?,@%]+|[\w:]+)',
+             String.Symbol, 'afterobject'),
+            include('literals'),
+        ],
+        'afterobject': [
+            (r'! !$', Keyword, '#pop'),  # squeak chunk delimiter
+            include('whitespaces'),
+            (r'\b(ifTrue:|ifFalse:|whileTrue:|whileFalse:|timesRepeat:)',
+             Name.Builtin, '#pop'),
+            (r'\b(new\b(?!:))', Name.Builtin),
+            (r'\:=|\_', Operator, '#pop'),
+            (r'\b[a-zA-Z]+\w*:', Name.Function, '#pop'),
+            (r'\b[a-zA-Z]+\w*', Name.Function),
+            (r'\w+:?|[-+*/\\~<>=|&!?,@%]+', Name.Function, '#pop'),
+            (r'\.', Punctuation, '#pop'),
+            (r';', Punctuation),
+            (r'[\])}]', Text),
+            (r'[\[({]', Text, '#pop'),
+        ],
+        'squeak fileout': [
+            # Squeak fileout format (optional)
+            (r'^"(""|[^"])*"!', Keyword),
+            (r"^'(''|[^'])*'!", Keyword),
+            (r'^(!)(\w+)( commentStamp: )(.*?)( prior: .*?!\n)(.*?)(!)',
+                bygroups(Keyword, Name.Class, Keyword, String, Keyword, Text, Keyword)),
+            (r"^(!)(\w+(?: class)?)( methodsFor: )('(?:''|[^'])*')(.*?!)",
+                bygroups(Keyword, Name.Class, Keyword, String, Keyword)),
+            (r'^(\w+)( subclass: )(#\w+)'
+             r'(\s+instanceVariableNames: )(.*?)'
+             r'(\s+classVariableNames: )(.*?)'
+             r'(\s+poolDictionaries: )(.*?)'
+             r'(\s+category: )(.*?)(!)',
+                bygroups(Name.Class, Keyword, String.Symbol, Keyword, String, Keyword,
+                         String, Keyword, String, Keyword, String, Keyword)),
+            (r'^(\w+(?: class)?)(\s+instanceVariableNames: )(.*?)(!)',
+                bygroups(Name.Class, Keyword, String, Keyword)),
+            (r'(!\n)(\].*)(! !)$', bygroups(Keyword, Text, Keyword)),
+            (r'! !$', Keyword),
+        ],
+    }
+
+
+class NewspeakLexer(RegexLexer):
+    """
+    For Newspeak syntax.
+    """
+    name = 'Newspeak'
+    url = 'http://newspeaklanguage.org/'
+    filenames = ['*.ns2']
+    aliases = ['newspeak', ]
+    mimetypes = ['text/x-newspeak']
+    version_added = '1.1'
+
+    tokens = {
+        'root': [
+            (r'\b(Newsqueak2)\b', Keyword.Declaration),
+            (r"'[^']*'", String),
+            (r'\b(class)(\s+)(\w+)(\s*)',
+             bygroups(Keyword.Declaration, Text, Name.Class, Text)),
+            (r'\b(mixin|self|super|private|public|protected|nil|true|false)\b',
+             Keyword),
+            (r'(\w+\:)(\s*)([a-zA-Z_]\w+)',
+             bygroups(Name.Function, Text, Name.Variable)),
+            (r'(\w+)(\s*)(=)',
+             bygroups(Name.Attribute, Text, Operator)),
+            (r'<\w+>', Comment.Special),
+            include('expressionstat'),
+            include('whitespace')
+        ],
+
+        'expressionstat': [
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'\d+', Number.Integer),
+            (r':\w+', Name.Variable),
+            (r'(\w+)(::)', bygroups(Name.Variable, Operator)),
+            (r'\w+:', Name.Function),
+            (r'\w+', Name.Variable),
+            (r'\(|\)', Punctuation),
+            (r'\[|\]', Punctuation),
+            (r'\{|\}', Punctuation),
+
+            (r'(\^|\+|\/|~|\*|<|>|=|@|%|\||&|\?|!|,|-|:)', Operator),
+            (r'\.|;', Punctuation),
+            include('whitespace'),
+            include('literals'),
+        ],
+        'literals': [
+            (r'\$.', String),
+            (r"'[^']*'", String),
+            (r"#'[^']*'", String.Symbol),
+            (r"#\w+:?", String.Symbol),
+            (r"#(\+|\/|~|\*|<|>|=|@|%|\||&|\?|!|,|-)+", String.Symbol)
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+            (r'"[^"]*"', Comment)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/smithy.py b/.venv/Lib/site-packages/pygments/lexers/smithy.py
new file mode 100644 (file)
index 0000000..bd479ae
--- /dev/null
@@ -0,0 +1,77 @@
+"""
+    pygments.lexers.smithy
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Smithy IDL.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Keyword, Name, String, \
+    Number, Whitespace, Punctuation
+
+__all__ = ['SmithyLexer']
+
+
+class SmithyLexer(RegexLexer):
+    """
+    For Smithy IDL
+    """
+    name = 'Smithy'
+    url = 'https://awslabs.github.io/smithy/'
+    filenames = ['*.smithy']
+    aliases = ['smithy']
+    version_added = '2.10'
+
+    unquoted = r'[A-Za-z0-9_\.#$-]+'
+    identifier = r"[A-Za-z0-9_\.#$-]+"
+
+    simple_shapes = (
+        'use', 'byte', 'short', 'integer', 'long', 'float', 'document',
+        'double', 'bigInteger', 'bigDecimal', 'boolean', 'blob', 'string',
+        'timestamp',
+    )
+
+    aggregate_shapes = (
+       'apply', 'list', 'map', 'set', 'structure', 'union', 'resource',
+       'operation', 'service', 'trait'
+    )
+
+    tokens = {
+        'root': [
+            (r'///.*$', Comment.Multiline),
+            (r'//.*$', Comment),
+            (r'@[0-9a-zA-Z\.#-]*', Name.Decorator),
+            (r'(=)', Name.Decorator),
+            (r'^(\$version)(:)(.+)',
+                bygroups(Keyword.Declaration, Name.Decorator, Name.Class)),
+            (r'^(namespace)(\s+' + identifier + r')\b',
+                bygroups(Keyword.Declaration, Name.Class)),
+            (words(simple_shapes,
+                   prefix=r'^', suffix=r'(\s+' + identifier + r')\b'),
+                bygroups(Keyword.Declaration, Name.Class)),
+            (words(aggregate_shapes,
+                   prefix=r'^', suffix=r'(\s+' + identifier + r')'),
+                bygroups(Keyword.Declaration, Name.Class)),
+            (r'^(metadata)(\s+)((?:\S+)|(?:\"[^"]+\"))(\s*)(=)',
+                bygroups(Keyword.Declaration, Whitespace, Name.Class,
+                         Whitespace, Name.Decorator)),
+            (r"(true|false|null)", Keyword.Constant),
+            (r"(-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)", Number),
+            (identifier + ":", Name.Label),
+            (identifier, Name.Variable.Class),
+            (r'\[', Text, "#push"),
+            (r'\]', Text, "#pop"),
+            (r'\(', Text, "#push"),
+            (r'\)', Text, "#pop"),
+            (r'\{', Text, "#push"),
+            (r'\}', Text, "#pop"),
+            (r'"{3}(\\\\|\n|\\")*"{3}', String.Doc),
+            (r'"(\\\\|\n|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\n|\\'|[^'])*'", String.Single),
+            (r'[:,]+', Punctuation),
+            (r'\s+', Whitespace),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/smv.py b/.venv/Lib/site-packages/pygments/lexers/smv.py
new file mode 100644 (file)
index 0000000..bf97b52
--- /dev/null
@@ -0,0 +1,78 @@
+"""
+    pygments.lexers.smv
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the SMV languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, Text
+
+__all__ = ['NuSMVLexer']
+
+
+class NuSMVLexer(RegexLexer):
+    """
+    Lexer for the NuSMV language.
+    """
+
+    name = 'NuSMV'
+    aliases = ['nusmv']
+    filenames = ['*.smv']
+    mimetypes = []
+    url = 'https://nusmv.fbk.eu'
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'(?s)\/\-\-.*?\-\-/', Comment),
+            (r'--.*\n', Comment),
+
+            # Reserved
+            (words(('MODULE', 'DEFINE', 'MDEFINE', 'CONSTANTS', 'VAR', 'IVAR',
+                    'FROZENVAR', 'INIT', 'TRANS', 'INVAR', 'SPEC', 'CTLSPEC',
+                    'LTLSPEC', 'PSLSPEC', 'COMPUTE', 'NAME', 'INVARSPEC',
+                    'FAIRNESS', 'JUSTICE', 'COMPASSION', 'ISA', 'ASSIGN',
+                    'CONSTRAINT', 'SIMPWFF', 'CTLWFF', 'LTLWFF', 'PSLWFF',
+                    'COMPWFF', 'IN', 'MIN', 'MAX', 'MIRROR', 'PRED',
+                    'PREDICATES'), suffix=r'(?![\w$#-])'),
+             Keyword.Declaration),
+            (r'process(?![\w$#-])', Keyword),
+            (words(('array', 'of', 'boolean', 'integer', 'real', 'word'),
+                   suffix=r'(?![\w$#-])'), Keyword.Type),
+            (words(('case', 'esac'), suffix=r'(?![\w$#-])'), Keyword),
+            (words(('word1', 'bool', 'signed', 'unsigned', 'extend', 'resize',
+                    'sizeof', 'uwconst', 'swconst', 'init', 'self', 'count',
+                    'abs', 'max', 'min'), suffix=r'(?![\w$#-])'),
+             Name.Builtin),
+            (words(('EX', 'AX', 'EF', 'AF', 'EG', 'AG', 'E', 'F', 'O', 'G',
+                    'H', 'X', 'Y', 'Z', 'A', 'U', 'S', 'V', 'T', 'BU', 'EBF',
+                    'ABF', 'EBG', 'ABG', 'next', 'mod', 'union', 'in', 'xor',
+                    'xnor'), suffix=r'(?![\w$#-])'),
+                Operator.Word),
+            (words(('TRUE', 'FALSE'), suffix=r'(?![\w$#-])'), Keyword.Constant),
+
+            # Names
+            (r'[a-zA-Z_][\w$#-]*', Name.Variable),
+
+            # Operators
+            (r':=', Operator),
+            (r'[-&|+*/<>!=]', Operator),
+
+            # Literals
+            (r'\-?\d+\b', Number.Integer),
+            (r'0[su][bB]\d*_[01_]+', Number.Bin),
+            (r'0[su][oO]\d*_[0-7_]+', Number.Oct),
+            (r'0[su][dD]\d*_[\d_]+', Number.Decimal),
+            (r'0[su][hH]\d*_[\da-fA-F_]+', Number.Hex),
+
+            # Whitespace, punctuation and the rest
+            (r'\s+', Text.Whitespace),
+            (r'[()\[\]{};?:.,]', Punctuation),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/snobol.py b/.venv/Lib/site-packages/pygments/lexers/snobol.py
new file mode 100644 (file)
index 0000000..bab51e9
--- /dev/null
@@ -0,0 +1,82 @@
+"""
+    pygments.lexers.snobol
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the SNOBOL language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['SnobolLexer']
+
+
+class SnobolLexer(RegexLexer):
+    """
+    Lexer for the SNOBOL4 programming language.
+
+    Recognizes the common ASCII equivalents of the original SNOBOL4 operators.
+    Does not require spaces around binary operators.
+    """
+
+    name = "Snobol"
+    aliases = ["snobol"]
+    filenames = ['*.snobol']
+    mimetypes = ['text/x-snobol']
+    url = 'https://www.regressive.org/snobol4'
+    version_added = '1.5'
+
+    tokens = {
+        # root state, start of line
+        # comments, continuation lines, and directives start in column 1
+        # as do labels
+        'root': [
+            (r'\*.*\n', Comment),
+            (r'[+.] ', Punctuation, 'statement'),
+            (r'-.*\n', Comment),
+            (r'END\s*\n', Name.Label, 'heredoc'),
+            (r'[A-Za-z$][\w$]*', Name.Label, 'statement'),
+            (r'\s+', Text, 'statement'),
+        ],
+        # statement state, line after continuation or label
+        'statement': [
+            (r'\s*\n', Text, '#pop'),
+            (r'\s+', Text),
+            (r'(?<=[^\w.])(LT|LE|EQ|NE|GE|GT|INTEGER|IDENT|DIFFER|LGT|SIZE|'
+             r'REPLACE|TRIM|DUPL|REMDR|DATE|TIME|EVAL|APPLY|OPSYN|LOAD|UNLOAD|'
+             r'LEN|SPAN|BREAK|ANY|NOTANY|TAB|RTAB|REM|POS|RPOS|FAIL|FENCE|'
+             r'ABORT|ARB|ARBNO|BAL|SUCCEED|INPUT|OUTPUT|TERMINAL)(?=[^\w.])',
+             Name.Builtin),
+            (r'[A-Za-z][\w.]*', Name),
+            # ASCII equivalents of original operators
+            # | for the EBCDIC equivalent, ! likewise
+            # \ for EBCDIC negation
+            (r'\*\*|[?$.!%*/#+\-@|&\\=]', Operator),
+            (r'"[^"]*"', String),
+            (r"'[^']*'", String),
+            # Accept SPITBOL syntax for real numbers
+            # as well as Macro SNOBOL4
+            (r'[0-9]+(?=[^.EeDd])', Number.Integer),
+            (r'[0-9]+(\.[0-9]*)?([EDed][-+]?[0-9]+)?', Number.Float),
+            # Goto
+            (r':', Punctuation, 'goto'),
+            (r'[()<>,;]', Punctuation),
+        ],
+        # Goto block
+        'goto': [
+            (r'\s*\n', Text, "#pop:2"),
+            (r'\s+', Text),
+            (r'F|S', Keyword),
+            (r'(\()([A-Za-z][\w.]*)(\))',
+             bygroups(Punctuation, Name.Label, Punctuation))
+        ],
+        # everything after the END statement is basically one
+        # big heredoc.
+        'heredoc': [
+            (r'.*\n', String.Heredoc)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/solidity.py b/.venv/Lib/site-packages/pygments/lexers/solidity.py
new file mode 100644 (file)
index 0000000..3182a14
--- /dev/null
@@ -0,0 +1,87 @@
+"""
+    pygments.lexers.solidity
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Solidity.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['SolidityLexer']
+
+
+class SolidityLexer(RegexLexer):
+    """
+    For Solidity source code.
+    """
+
+    name = 'Solidity'
+    aliases = ['solidity']
+    filenames = ['*.sol']
+    mimetypes = []
+    url = 'https://soliditylang.org'
+    version_added = '2.5'
+
+    datatype = (
+        r'\b(address|bool|(?:(?:bytes|hash|int|string|uint)(?:8|16|24|32|40|48|56|64'
+        r'|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208'
+        r'|216|224|232|240|248|256)?))\b'
+    )
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            (r'\bpragma\s+solidity\b', Keyword, 'pragma'),
+            (r'\b(contract)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword, Whitespace, Name.Entity)),
+            (datatype + r'(\s+)((?:external|public|internal|private)\s+)?' +
+             r'([a-zA-Z_]\w*)',
+             bygroups(Keyword.Type, Whitespace, Keyword, Name.Variable)),
+            (r'\b(enum|event|function|struct)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Type, Whitespace, Name.Variable)),
+            (r'\b(msg|block|tx)\.([A-Za-z_][a-zA-Z0-9_]*)\b', Keyword),
+            (words((
+                'block', 'break', 'constant', 'constructor', 'continue',
+                'contract', 'do', 'else', 'external', 'false', 'for',
+                'function', 'if', 'import', 'inherited', 'internal', 'is',
+                'library', 'mapping', 'memory', 'modifier', 'msg', 'new',
+                'payable', 'private', 'public', 'require', 'return',
+                'returns', 'struct', 'suicide', 'throw', 'this', 'true',
+                'tx', 'var', 'while'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Type),
+            (words(('keccak256',), prefix=r'\b', suffix=r'\b'), Name.Builtin),
+            (datatype, Keyword.Type),
+            include('constants'),
+            (r'[a-zA-Z_]\w*', Text),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[.;{}(),\[\]]', Punctuation)
+        ],
+        'comments': [
+            (r'//(\n|[\w\W]*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*][\w\W]*?[*](\\\n)?/', Comment.Multiline),
+            (r'/(\\\n)?[*][\w\W]*', Comment.Multiline)
+        ],
+        'constants': [
+            (r'("(\\"|.)*?")', String.Double),
+            (r"('(\\'|.)*?')", String.Single),
+            (r'\b0[xX][0-9a-fA-F]+\b', Number.Hex),
+            (r'\b\d+\b', Number.Decimal),
+        ],
+        'pragma': [
+            include('whitespace'),
+            include('comments'),
+            (r'(\^|>=|<)(\s*)(\d+\.\d+\.\d+)',
+             bygroups(Operator, Whitespace, Keyword)),
+            (r';', Punctuation, '#pop')
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+            (r'\n', Whitespace)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/soong.py b/.venv/Lib/site-packages/pygments/lexers/soong.py
new file mode 100644 (file)
index 0000000..bbf204d
--- /dev/null
@@ -0,0 +1,78 @@
+"""
+    pygments.lexers.soong
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Soong (Android.bp Blueprint) files.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include
+from pygments.token import Comment, Name, Number, Operator, Punctuation, \
+        String, Whitespace
+
+__all__ = ['SoongLexer']
+
+class SoongLexer(RegexLexer):
+    name = 'Soong'
+    version_added = '2.18'
+    url = 'https://source.android.com/docs/setup/reference/androidbp'
+    aliases = ['androidbp', 'bp', 'soong']
+    filenames = ['Android.bp']
+
+    tokens = {
+        'root': [
+            # A variable assignment
+            (r'(\w*)(\s*)(\+?=)(\s*)',
+             bygroups(Name.Variable, Whitespace, Operator, Whitespace),
+             'assign-rhs'),
+
+            # A top-level module
+            (r'(\w*)(\s*)(\{)',
+             bygroups(Name.Function, Whitespace, Punctuation),
+             'in-rule'),
+
+            # Everything else
+            include('comments'),
+            (r'\s+', Whitespace),  # newlines okay
+        ],
+        'assign-rhs': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'in-list': [
+            include('expr'),
+            include('comments'),
+            (r'\s+', Whitespace),  # newlines okay in a list
+            (r',', Punctuation),
+            (r'\]', Punctuation, '#pop'),
+        ],
+        'in-map': [
+            # A map key
+            (r'(\w+)(:)(\s*)', bygroups(Name, Punctuation, Whitespace)),
+
+            include('expr'),
+            include('comments'),
+            (r'\s+', Whitespace),  # newlines okay in a map
+            (r',', Punctuation),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'in-rule': [
+            # Just re-use map syntax
+            include('in-map'),
+        ],
+        'comments': [
+            (r'//.*', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+        ],
+        'expr': [
+            (r'(true|false)\b', Name.Builtin),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'".*?"', String),
+            (r'\{', Punctuation, 'in-map'),
+            (r'\[', Punctuation, 'in-list'),
+            (r'\w+', Name),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/sophia.py b/.venv/Lib/site-packages/pygments/lexers/sophia.py
new file mode 100644 (file)
index 0000000..37fcec5
--- /dev/null
@@ -0,0 +1,102 @@
+"""
+    pygments.lexers.sophia
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Sophia.
+
+    Derived from pygments/lexers/reason.py.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, default, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text
+
+__all__ = ['SophiaLexer']
+
+class SophiaLexer(RegexLexer):
+    """
+    A Sophia lexer.
+    """
+
+    name = 'Sophia'
+    aliases = ['sophia']
+    filenames = ['*.aes']
+    mimetypes = []
+    url = 'https://docs.aeternity.com/aesophia'
+    version_added = '2.11'
+
+    keywords = (
+        'contract', 'include', 'let', 'switch', 'type', 'record', 'datatype',
+        'if', 'elif', 'else', 'function', 'stateful', 'payable', 'public',
+        'entrypoint', 'private', 'indexed', 'namespace', 'interface', 'main',
+        'using', 'as', 'for', 'hiding',
+    )
+
+    builtins = ('state', 'put', 'abort', 'require')
+
+    word_operators = ('mod', 'band', 'bor', 'bxor', 'bnot')
+
+    primitive_types = ('int', 'address', 'bool', 'bits', 'bytes', 'string',
+                       'list', 'option', 'char', 'unit', 'map', 'event',
+                       'hash', 'signature', 'oracle', 'oracle_query')
+
+    tokens = {
+        'escape-sequence': [
+            (r'\\[\\"\'ntbr]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        ],
+        'root': [
+            (r'\s+', Text.Whitespace),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Class, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name.Function),
+            (r'//.*?\n', Comment.Single),
+            (r'\/\*(?!/)', Comment.Multiline, 'comment'),
+
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'#[\da-fA-F][\da-fA-F_]*', Name.Label),
+            (r'\d[\d_]*', Number.Integer),
+
+            (words(keywords, suffix=r'\b'), Keyword),
+            (words(builtins, suffix=r'\b'), Name.Builtin),
+            (words(word_operators, prefix=r'\b', suffix=r'\b'), Operator.Word),
+            (words(primitive_types, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+
+            (r'[=!<>+\\*/:&|?~@^-]', Operator.Word),
+            (r'[.;:{}(),\[\]]', Punctuation),
+
+            (r"(ak_|ok_|oq_|ct_)[\w']*", Name.Label),
+            (r"[^\W\d][\w']*", Name),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'[a-z][\w]*", Name.Variable),
+
+            (r'"', String.Double, 'string')
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'\/\*', Comment.Multiline, '#push'),
+            (r'\*\/', Comment.Multiline, '#pop'),
+            (r'\*', Comment.Multiline),
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            include('escape-sequence'),
+            (r'\\\n', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Function),
+            (r'[A-Z][\w\']*', Name.Function, '#pop'),
+            (r'[a-z_][\w\']*', Name, '#pop'),
+            default('#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/special.py b/.venv/Lib/site-packages/pygments/lexers/special.py
new file mode 100644 (file)
index 0000000..524946f
--- /dev/null
@@ -0,0 +1,122 @@
+"""
+    pygments.lexers.special
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Special lexers.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import ast
+
+from pygments.lexer import Lexer, line_re
+from pygments.token import Token, Error, Text, Generic
+from pygments.util import get_choice_opt
+
+
+__all__ = ['TextLexer', 'OutputLexer', 'RawTokenLexer']
+
+
+class TextLexer(Lexer):
+    """
+    "Null" lexer, doesn't highlight anything.
+    """
+    name = 'Text only'
+    aliases = ['text']
+    filenames = ['*.txt']
+    mimetypes = ['text/plain']
+    url = ""
+    version_added = ''
+
+    priority = 0.01
+
+    def get_tokens_unprocessed(self, text):
+        yield 0, Text, text
+
+    def analyse_text(text):
+        return TextLexer.priority
+
+
+class OutputLexer(Lexer):
+    """
+    Simple lexer that highlights everything as ``Token.Generic.Output``.
+    """
+    name = 'Text output'
+    aliases = ['output']
+    url = ""
+    version_added = '2.10'
+    _example = "output/output"
+
+    def get_tokens_unprocessed(self, text):
+        yield 0, Generic.Output, text
+
+
+_ttype_cache = {}
+
+
+class RawTokenLexer(Lexer):
+    """
+    Recreate a token stream formatted with the `RawTokenFormatter`.
+
+    Additional options accepted:
+
+    `compress`
+        If set to ``"gz"`` or ``"bz2"``, decompress the token stream with
+        the given compression algorithm before lexing (default: ``""``).
+    """
+    name = 'Raw token data'
+    aliases = []
+    filenames = []
+    mimetypes = ['application/x-pygments-tokens']
+    url = 'https://pygments.org/docs/formatters/#RawTokenFormatter'
+    version_added = ''
+
+    def __init__(self, **options):
+        self.compress = get_choice_opt(options, 'compress',
+                                       ['', 'none', 'gz', 'bz2'], '')
+        Lexer.__init__(self, **options)
+
+    def get_tokens(self, text):
+        if self.compress:
+            if isinstance(text, str):
+                text = text.encode('latin1')
+            try:
+                if self.compress == 'gz':
+                    import gzip
+                    text = gzip.decompress(text)
+                elif self.compress == 'bz2':
+                    import bz2
+                    text = bz2.decompress(text)
+            except OSError:
+                yield Error, text.decode('latin1')
+        if isinstance(text, bytes):
+            text = text.decode('latin1')
+
+        # do not call Lexer.get_tokens() because stripping is not optional.
+        text = text.strip('\n') + '\n'
+        for i, t, v in self.get_tokens_unprocessed(text):
+            yield t, v
+
+    def get_tokens_unprocessed(self, text):
+        length = 0
+        for match in line_re.finditer(text):
+            try:
+                ttypestr, val = match.group().rstrip().split('\t', 1)
+                ttype = _ttype_cache.get(ttypestr)
+                if not ttype:
+                    ttype = Token
+                    ttypes = ttypestr.split('.')[1:]
+                    for ttype_ in ttypes:
+                        if not ttype_ or not ttype_[0].isupper():
+                            raise ValueError('malformed token name')
+                        ttype = getattr(ttype, ttype_)
+                    _ttype_cache[ttypestr] = ttype
+                val = ast.literal_eval(val)
+                if not isinstance(val, str):
+                    raise ValueError('expected str')
+            except (SyntaxError, ValueError):
+                val = match.group()
+                ttype = Error
+            yield length, ttype, val
+            length += len(val)
diff --git a/.venv/Lib/site-packages/pygments/lexers/spice.py b/.venv/Lib/site-packages/pygments/lexers/spice.py
new file mode 100644 (file)
index 0000000..9d2b1a1
--- /dev/null
@@ -0,0 +1,70 @@
+"""
+    pygments.lexers.spice
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Spice programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['SpiceLexer']
+
+
+class SpiceLexer(RegexLexer):
+    """
+    For Spice source.
+    """
+    name = 'Spice'
+    url = 'https://www.spicelang.com'
+    filenames = ['*.spice']
+    aliases = ['spice', 'spicelang']
+    mimetypes = ['text/x-spice']
+    version_added = '2.11'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'\\\n', Text),
+            # comments
+            (r'//(.*?)\n', Comment.Single),
+            (r'/(\\\n)?[*]{2}(.|\n)*?[*](\\\n)?/', String.Doc),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            # keywords
+            (r'(import|as)\b', Keyword.Namespace),
+            (r'(f|p|type|struct|interface|enum|alias|operator)\b', Keyword.Declaration),
+            (words(('if', 'else', 'switch', 'case', 'default', 'for', 'foreach', 'do',
+                    'while', 'break', 'continue', 'fallthrough', 'return', 'assert',
+                    'unsafe', 'ext'), suffix=r'\b'), Keyword),
+            (words(('const', 'signed', 'unsigned', 'inline', 'public', 'heap', 'compose'),
+                   suffix=r'\b'), Keyword.Pseudo),
+            (words(('new', 'yield', 'stash', 'pick', 'sync', 'class'), suffix=r'\b'),
+                   Keyword.Reserved),
+            (r'(true|false|nil)\b', Keyword.Constant),
+            (words(('double', 'int', 'short', 'long', 'byte', 'char', 'string',
+                    'bool', 'dyn'), suffix=r'\b'), Keyword.Type),
+            (words(('printf', 'sizeof', 'alignof', 'len', 'panic'), suffix=r'\b(\()'),
+             bygroups(Name.Builtin, Punctuation)),
+            # numeric literals
+            (r'[-]?[0-9]*[.][0-9]+([eE][+-]?[0-9]+)?', Number.Double),
+            (r'0[bB][01]+[slu]?', Number.Bin),
+            (r'0[oO][0-7]+[slu]?', Number.Oct),
+            (r'0[xXhH][0-9a-fA-F]+[slu]?', Number.Hex),
+            (r'(0[dD])?[0-9]+[slu]?', Number.Integer),
+            # string literal
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            # char literal
+            (r'\'(\\\\|\\[^\\]|[^\'\\])\'', String.Char),
+            # tokens
+            (r'<<=|>>=|<<|>>|<=|>=|\+=|-=|\*=|/=|\%=|\|=|&=|\^=|&&|\|\||&|\||'
+             r'\+\+|--|\%|\^|\~|==|!=|->|::|[.]{3}|#!|#|[+\-*/&]', Operator),
+            (r'[|<>=!()\[\]{}.,;:\?]', Punctuation),
+            # identifiers
+            (r'[^\W\d]\w*', Name.Other),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/sql.py b/.venv/Lib/site-packages/pygments/lexers/sql.py
new file mode 100644 (file)
index 0000000..c3a11f4
--- /dev/null
@@ -0,0 +1,1203 @@
+"""
+    pygments.lexers.sql
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various SQL dialects and related interactive sessions.
+
+    Postgres specific lexers:
+
+    `PostgresLexer`
+        A SQL lexer for the PostgreSQL dialect. Differences w.r.t. the SQL
+        lexer are:
+
+        - keywords and data types list parsed from the PG docs (run the
+          `_postgres_builtins` module to update them);
+        - Content of $-strings parsed using a specific lexer, e.g. the content
+          of a PL/Python function is parsed using the Python lexer;
+        - parse PG specific constructs: E-strings, $-strings, U&-strings,
+          different operators and punctuation.
+
+    `PlPgsqlLexer`
+        A lexer for the PL/pgSQL language. Adds a few specific construct on
+        top of the PG SQL lexer (such as <<label>>).
+
+    `PostgresConsoleLexer`
+        A lexer to highlight an interactive psql session:
+
+        - identifies the prompt and does its best to detect the end of command
+          in multiline statement where not all the lines are prefixed by a
+          prompt, telling them apart from the output;
+        - highlights errors in the output and notification levels;
+        - handles psql backslash commands.
+
+    `PostgresExplainLexer`
+        A lexer to highlight Postgres execution plan.
+
+    The ``tests/examplefiles`` contains a few test files with data to be
+    parsed by these lexers.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import collections
+import re
+
+from pygments.lexer import Lexer, RegexLexer, do_insertions, bygroups, words
+from pygments.token import Punctuation, Whitespace, Text, Comment, Operator, \
+    Keyword, Name, String, Number, Generic, Literal
+from pygments.lexers import get_lexer_by_name, ClassNotFound
+
+from pygments.lexers._postgres_builtins import KEYWORDS, DATATYPES, \
+    PSEUDO_TYPES, PLPGSQL_KEYWORDS, EXPLAIN_KEYWORDS
+from pygments.lexers._mysql_builtins import \
+    MYSQL_CONSTANTS, \
+    MYSQL_DATATYPES, \
+    MYSQL_FUNCTIONS, \
+    MYSQL_KEYWORDS, \
+    MYSQL_OPTIMIZER_HINTS
+
+from pygments.lexers import _googlesql_builtins
+from pygments.lexers import _tsql_builtins
+
+
+__all__ = ['GoogleSqlLexer', 'PostgresLexer', 'PlPgsqlLexer',
+           'PostgresConsoleLexer', 'PostgresExplainLexer', 'SqlLexer',
+           'TransactSqlLexer', 'MySqlLexer', 'SqliteConsoleLexer', 'RqlLexer']
+
+line_re  = re.compile('.*?\n')
+sqlite_prompt_re = re.compile(r'^(?:sqlite|   ...)>(?= )')
+
+language_re = re.compile(r"\s+LANGUAGE\s+'?(\w+)'?", re.IGNORECASE)
+
+do_re = re.compile(r'\bDO\b', re.IGNORECASE)
+
+# Regular expressions for analyse_text()
+name_between_bracket_re = re.compile(r'\[[a-zA-Z_]\w*\]')
+name_between_backtick_re = re.compile(r'`[a-zA-Z_]\w*`')
+tsql_go_re = re.compile(r'\bgo\b', re.IGNORECASE)
+tsql_declare_re = re.compile(r'\bdeclare\s+@', re.IGNORECASE)
+tsql_variable_re = re.compile(r'@[a-zA-Z_]\w*\b')
+
+# Identifiers for analyse_text()
+googlesql_identifiers = (
+    _googlesql_builtins.functionnames
+    + _googlesql_builtins.keywords
+    + _googlesql_builtins.types)
+
+
+def language_callback(lexer, match):
+    """Parse the content of a $-string using a lexer
+
+    The lexer is chosen looking for a nearby LANGUAGE or assumed as
+    plpgsql if inside a DO statement and no LANGUAGE has been found.
+    """
+    lx = None
+    m = language_re.match(lexer.text[match.end():match.end()+100])
+    if m is not None:
+        lx = lexer._get_lexer(m.group(1))
+    else:
+        m = list(language_re.finditer(
+            lexer.text[max(0, match.start()-100):match.start()]))
+        if m:
+            lx = lexer._get_lexer(m[-1].group(1))
+        else:
+            m = list(do_re.finditer(
+                lexer.text[max(0, match.start()-25):match.start()]))
+            if m:
+                lx = lexer._get_lexer('plpgsql')
+
+    # 1 = $, 2 = delimiter, 3 = $
+    yield (match.start(1), String, match.group(1))
+    yield (match.start(2), String.Delimiter, match.group(2))
+    yield (match.start(3), String, match.group(3))
+    # 4 = string contents
+    if lx:
+        yield from lx.get_tokens_unprocessed(match.group(4))
+    else:
+        yield (match.start(4), String, match.group(4))
+    # 5 = $, 6 = delimiter, 7 = $
+    yield (match.start(5), String, match.group(5))
+    yield (match.start(6), String.Delimiter, match.group(6))
+    yield (match.start(7), String, match.group(7))
+
+
+class PostgresBase:
+    """Base class for Postgres-related lexers.
+
+    This is implemented as a mixin to avoid the Lexer metaclass kicking in.
+    this way the different lexer don't have a common Lexer ancestor. If they
+    had, _tokens could be created on this ancestor and not updated for the
+    other classes, resulting e.g. in PL/pgSQL parsed as SQL. This shortcoming
+    seem to suggest that regexp lexers are not really subclassable.
+    """
+    def get_tokens_unprocessed(self, text, *args):
+        # Have a copy of the entire text to be used by `language_callback`.
+        self.text = text
+        yield from super().get_tokens_unprocessed(text, *args)
+
+    def _get_lexer(self, lang):
+        if lang.lower() == 'sql':
+            return get_lexer_by_name('postgresql', **self.options)
+
+        tries = [lang]
+        if lang.startswith('pl'):
+            tries.append(lang[2:])
+        if lang.endswith('u'):
+            tries.append(lang[:-1])
+        if lang.startswith('pl') and lang.endswith('u'):
+            tries.append(lang[2:-1])
+
+        for lx in tries:
+            try:
+                return get_lexer_by_name(lx, **self.options)
+            except ClassNotFound:
+                pass
+        else:
+            # TODO: better logging
+            # print >>sys.stderr, "language not found:", lang
+            return None
+
+
+class PostgresLexer(PostgresBase, RegexLexer):
+    """
+    Lexer for the PostgreSQL dialect of SQL.
+    """
+
+    name = 'PostgreSQL SQL dialect'
+    aliases = ['postgresql', 'postgres']
+    mimetypes = ['text/x-postgresql']
+    url = 'https://www.postgresql.org'
+    version_added = '1.5'
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'--.*\n?', Comment.Single),
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'(' + '|'.join(s.replace(" ", r"\s+")
+                             for s in DATATYPES + PSEUDO_TYPES) + r')\b',
+             Name.Builtin),
+            (words(KEYWORDS, suffix=r'\b'), Keyword),
+            (r'[+*/<>=~!@#%^&|`?-]+', Operator),
+            (r'::', Operator),  # cast
+            (r'\$\d+', Name.Variable),
+            (r'([0-9]*\.[0-9]*|[0-9]+)(e[+-]?[0-9]+)?', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r"((?:E|U&)?)(')", bygroups(String.Affix, String.Single), 'string'),
+            # quoted identifier
+            (r'((?:U&)?)(")', bygroups(String.Affix, String.Name), 'quoted-ident'),
+            (r'(?s)(\$)([^$]*)(\$)(.*?)(\$)(\2)(\$)', language_callback),
+            (r'[a-z_]\w*', Name),
+
+            # psql variable in SQL
+            (r""":(['"]?)[a-z]\w*\b\1""", Name.Variable),
+
+            (r'[;:()\[\]{},.]', Punctuation),
+        ],
+        'multiline-comments': [
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[^/*]+', Comment.Multiline),
+            (r'[/*]', Comment.Multiline)
+        ],
+        'string': [
+            (r"[^']+", String.Single),
+            (r"''", String.Single),
+            (r"'", String.Single, '#pop'),
+        ],
+        'quoted-ident': [
+            (r'[^"]+', String.Name),
+            (r'""', String.Name),
+            (r'"', String.Name, '#pop'),
+        ],
+    }
+
+
+class PlPgsqlLexer(PostgresBase, RegexLexer):
+    """
+    Handle the extra syntax in Pl/pgSQL language.
+    """
+    name = 'PL/pgSQL'
+    aliases = ['plpgsql']
+    mimetypes = ['text/x-plpgsql']
+    url = 'https://www.postgresql.org/docs/current/plpgsql.html'
+    version_added = '1.5'
+
+    flags = re.IGNORECASE
+    # FIXME: use inheritance
+    tokens = {name: state[:] for (name, state) in PostgresLexer.tokens.items()}
+
+    # extend the keywords list
+    for i, pattern in enumerate(tokens['root']):
+        if pattern[1] == Keyword:
+            tokens['root'][i] = (
+                words(KEYWORDS + PLPGSQL_KEYWORDS, suffix=r'\b'),
+                Keyword)
+            del i
+            break
+    else:
+        assert 0, "SQL keywords not found"
+
+    # Add specific PL/pgSQL rules (before the SQL ones)
+    tokens['root'][:0] = [
+        (r'\%[a-z]\w*\b', Name.Builtin),     # actually, a datatype
+        (r':=', Operator),
+        (r'\<\<[a-z]\w*\>\>', Name.Label),
+        (r'\#[a-z]\w*\b', Keyword.Pseudo),   # #variable_conflict
+    ]
+
+
+class PsqlRegexLexer(PostgresBase, RegexLexer):
+    """
+    Extend the PostgresLexer adding support specific for psql commands.
+
+    This is not a complete psql lexer yet as it lacks prompt support
+    and output rendering.
+    """
+
+    name = 'PostgreSQL console - regexp based lexer'
+    aliases = []    # not public
+
+    flags = re.IGNORECASE
+    tokens = {name: state[:] for (name, state) in PostgresLexer.tokens.items()}
+
+    tokens['root'].append(
+        (r'\\[^\s]+', Keyword.Pseudo, 'psql-command'))
+    tokens['psql-command'] = [
+        (r'\n', Text, 'root'),
+        (r'\s+', Whitespace),
+        (r'\\[^\s]+', Keyword.Pseudo),
+        (r""":(['"]?)[a-z]\w*\b\1""", Name.Variable),
+        (r"'(''|[^'])*'", String.Single),
+        (r"`([^`])*`", String.Backtick),
+        (r"[^\s]+", String.Symbol),
+    ]
+
+
+re_prompt = re.compile(r'^(\S.*?)??[=\-\(\$\'\"][#>]')
+re_psql_command = re.compile(r'\s*\\')
+re_end_command = re.compile(r';\s*(--.*?)?$')
+re_psql_command = re.compile(r'(\s*)(\\.+?)(\s+)$')
+re_error = re.compile(r'(ERROR|FATAL):')
+re_message = re.compile(
+    r'((?:DEBUG|INFO|NOTICE|WARNING|ERROR|'
+    r'FATAL|HINT|DETAIL|CONTEXT|LINE [0-9]+):)(.*?\n)')
+
+
+class lookahead:
+    """Wrap an iterator and allow pushing back an item."""
+    def __init__(self, x):
+        self.iter = iter(x)
+        self._nextitem = None
+
+    def __iter__(self):
+        return self
+
+    def send(self, i):
+        self._nextitem = i
+        return i
+
+    def __next__(self):
+        if self._nextitem is not None:
+            ni = self._nextitem
+            self._nextitem = None
+            return ni
+        return next(self.iter)
+    next = __next__
+
+
+class PostgresConsoleLexer(Lexer):
+    """
+    Lexer for psql sessions.
+    """
+
+    name = 'PostgreSQL console (psql)'
+    aliases = ['psql', 'postgresql-console', 'postgres-console']
+    mimetypes = ['text/x-postgresql-psql']
+    url = 'https://www.postgresql.org'
+    version_added = '1.5'
+    _example = "psql/psql_session.txt"
+
+    def get_tokens_unprocessed(self, data):
+        sql = PsqlRegexLexer(**self.options)
+
+        lines = lookahead(line_re.findall(data))
+
+        # prompt-output cycle
+        while 1:
+
+            # consume the lines of the command: start with an optional prompt
+            # and continue until the end of command is detected
+            curcode = ''
+            insertions = []
+            for line in lines:
+                # Identify a shell prompt in case of psql commandline example
+                if line.startswith('$') and not curcode:
+                    lexer = get_lexer_by_name('console', **self.options)
+                    yield from lexer.get_tokens_unprocessed(line)
+                    break
+
+                # Identify a psql prompt
+                mprompt = re_prompt.match(line)
+                if mprompt is not None:
+                    insertions.append((len(curcode),
+                                       [(0, Generic.Prompt, mprompt.group())]))
+                    curcode += line[len(mprompt.group()):]
+                else:
+                    curcode += line
+
+                # Check if this is the end of the command
+                # TODO: better handle multiline comments at the end with
+                # a lexer with an external state?
+                if re_psql_command.match(curcode) \
+                   or re_end_command.search(curcode):
+                    break
+
+            # Emit the combined stream of command and prompt(s)
+            yield from do_insertions(insertions,
+                                     sql.get_tokens_unprocessed(curcode))
+
+            # Emit the output lines
+            out_token = Generic.Output
+            for line in lines:
+                mprompt = re_prompt.match(line)
+                if mprompt is not None:
+                    # push the line back to have it processed by the prompt
+                    lines.send(line)
+                    break
+
+                mmsg = re_message.match(line)
+                if mmsg is not None:
+                    if mmsg.group(1).startswith("ERROR") \
+                       or mmsg.group(1).startswith("FATAL"):
+                        out_token = Generic.Error
+                    yield (mmsg.start(1), Generic.Strong, mmsg.group(1))
+                    yield (mmsg.start(2), out_token, mmsg.group(2))
+                else:
+                    yield (0, out_token, line)
+            else:
+                return
+
+
+class PostgresExplainLexer(RegexLexer):
+    """
+    Handle PostgreSQL EXPLAIN output
+    """
+
+    name = 'PostgreSQL EXPLAIN dialect'
+    aliases = ['postgres-explain']
+    filenames = ['*.explain']
+    mimetypes = ['text/x-postgresql-explain']
+    url = 'https://www.postgresql.org/docs/current/using-explain.html'
+    version_added = '2.15'
+
+    tokens = {
+        'root': [
+            (r'(:|\(|\)|ms|kB|->|\.\.|\,|\/)', Punctuation),
+            (r'(\s+)', Whitespace),
+
+            # This match estimated cost and effectively measured counters with ANALYZE
+            # Then, we move to instrumentation state
+            (r'(cost)(=?)', bygroups(Name.Class, Punctuation), 'instrumentation'),
+            (r'(actual)( )(=?)', bygroups(Name.Class, Whitespace, Punctuation), 'instrumentation'),
+
+            # Misc keywords
+            (words(('actual', 'Memory Usage', 'Disk Usage', 'Memory', 'Buckets', 'Batches',
+                    'originally', 'row', 'rows', 'Hits', 'Misses',
+                    'Evictions', 'Overflows', 'Planned Partitions'), suffix=r'\b'),
+             Comment.Single),
+
+            (r'(hit|read|dirtied|written|write|time|calls)(=)', bygroups(Comment.Single, Operator)),
+            (r'(shared|temp|local)', Keyword.Pseudo),
+
+            # We move to sort state in order to emphasize specific keywords (especially disk access)
+            (r'(Sort Method)(: )', bygroups(Comment.Preproc, Punctuation), 'sort'),
+
+            # These keywords can be followed by an object, like a table
+            (r'(Sort Key|Group Key|Presorted Key|Hash Key)(:)( )',
+             bygroups(Comment.Preproc, Punctuation, Whitespace), 'object_name'),
+            (r'(Cache Key|Cache Mode)(:)( )', bygroups(Comment, Punctuation, Whitespace), 'object_name'),
+
+            # These keywords can be followed by a predicate
+            (words(('Join Filter', 'Subplans Removed', 'Filter', 'Merge Cond',
+                    'Hash Cond', 'Index Cond', 'Recheck Cond', 'Heap Blocks',
+                    'TID Cond', 'Run Condition', 'Order By', 'Function Call',
+                    'Table Function Call', 'Inner Unique', 'Params Evaluated',
+                    'Single Copy', 'Sampling', 'One-Time Filter', 'Output',
+                    'Relations', 'Remote SQL'), suffix=r'\b'),
+             Comment.Preproc, 'predicate'),
+
+            # Special keyword to handle ON CONFLICT
+            (r'Conflict ', Comment.Preproc, 'conflict'),
+
+            # Special keyword for InitPlan or SubPlan
+            (r'(InitPlan|SubPlan)( )(\d+)( )',
+             bygroups(Keyword, Whitespace, Number.Integer, Whitespace),
+             'init_plan'),
+
+            (words(('Sort Method', 'Join Filter', 'Planning time',
+                    'Planning Time', 'Execution time', 'Execution Time',
+                    'Workers Planned', 'Workers Launched', 'Buffers',
+                    'Planning', 'Worker', 'Query Identifier', 'Time',
+                    'Full-sort Groups', 'Pre-sorted Groups'), suffix=r'\b'), Comment.Preproc),
+
+            # Emphasize these keywords
+
+            (words(('Rows Removed by Join Filter', 'Rows Removed by Filter',
+                    'Rows Removed by Index Recheck',
+                    'Heap Fetches', 'never executed'),
+                   suffix=r'\b'), Name.Exception),
+            (r'(I/O Timings)(:)( )', bygroups(Name.Exception, Punctuation, Whitespace)),
+
+            (words(EXPLAIN_KEYWORDS, suffix=r'\b'), Keyword),
+
+            # join keywords
+            (r'((Right|Left|Full|Semi|Anti) Join)', Keyword.Type),
+            (r'(Parallel |Async |Finalize |Partial )', Comment.Preproc),
+            (r'Backward', Comment.Preproc),
+            (r'(Intersect|Except|Hash)', Comment.Preproc),
+
+            (r'(CTE)( )(\w*)?', bygroups(Comment, Whitespace, Name.Variable)),
+
+
+            # Treat "on" and "using" as a punctuation
+            (r'(on|using)', Punctuation, 'object_name'),
+
+
+            # strings
+            (r"'(''|[^'])*'", String.Single),
+            # numbers
+            (r'-?\d+\.\d+', Number.Float),
+            (r'(-?\d+)', Number.Integer),
+
+            # boolean
+            (r'(true|false)', Name.Constant),
+            # explain header
+            (r'\s*QUERY PLAN\s*\n\s*-+', Comment.Single),
+            # Settings
+            (r'(Settings)(:)( )', bygroups(Comment.Preproc, Punctuation, Whitespace), 'setting'),
+
+            # Handle JIT counters
+            (r'(JIT|Functions|Options|Timing)(:)', bygroups(Comment.Preproc, Punctuation)),
+            (r'(Inlining|Optimization|Expressions|Deforming|Generation|Emission|Total)', Keyword.Pseudo),
+
+            # Handle Triggers counters
+            (r'(Trigger)( )(\S*)(:)( )',
+             bygroups(Comment.Preproc, Whitespace, Name.Variable, Punctuation, Whitespace)),
+
+        ],
+        'expression': [
+            # matches any kind of parenthesized expression
+            # the first opening paren is matched by the 'caller'
+            (r'\(', Punctuation, '#push'),
+            (r'\)', Punctuation, '#pop'),
+            (r'(never executed)', Name.Exception),
+            (r'[^)(]+', Comment),
+        ],
+        'object_name': [
+
+            # This is a cost or analyze measure
+            (r'(\(cost)(=?)', bygroups(Name.Class, Punctuation), 'instrumentation'),
+            (r'(\(actual)( )(=?)', bygroups(Name.Class, Whitespace, Punctuation), 'instrumentation'),
+
+            # if object_name is parenthesized, mark opening paren as
+            # punctuation, call 'expression', and exit state
+            (r'\(', Punctuation, 'expression'),
+            (r'(on)', Punctuation),
+            # matches possibly schema-qualified table and column names
+            (r'\w+(\.\w+)*( USING \S+| \w+ USING \S+)', Name.Variable),
+            (r'\"?\w+\"?(?:\.\"?\w+\"?)?', Name.Variable),
+            (r'\'\S*\'', Name.Variable),
+
+            # if we encounter a comma, another object is listed
+            (r',\n', Punctuation, 'object_name'),
+            (r',', Punctuation, 'object_name'),
+
+            # special case: "*SELECT*"
+            (r'"\*SELECT\*( \d+)?"(.\w+)?', Name.Variable),
+            (r'"\*VALUES\*(_\d+)?"(.\w+)?', Name.Variable),
+            (r'"ANY_subquery"', Name.Variable),
+
+            # Variable $1 ...
+            (r'\$\d+', Name.Variable),
+            # cast
+            (r'::\w+', Name.Variable),
+            (r' +', Whitespace),
+            (r'"', Punctuation),
+            (r'\[\.\.\.\]', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'predicate': [
+            # if predicate is parenthesized, mark paren as punctuation
+            (r'(\()([^\n]*)(\))', bygroups(Punctuation, Name.Variable, Punctuation), '#pop'),
+            # otherwise color until newline
+            (r'[^\n]*', Name.Variable, '#pop'),
+        ],
+        'instrumentation': [
+            (r'=|\.\.', Punctuation),
+            (r' +', Whitespace),
+            (r'(rows|width|time|loops)', Name.Class),
+            (r'\d+\.\d+', Number.Float),
+            (r'(\d+)', Number.Integer),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'conflict': [
+            (r'(Resolution: )(\w+)', bygroups(Comment.Preproc, Name.Variable)),
+            (r'(Arbiter \w+:)', Comment.Preproc, 'object_name'),
+            (r'(Filter: )', Comment.Preproc, 'predicate'),
+        ],
+        'setting': [
+            (r'([a-z_]*?)(\s*)(=)(\s*)(\'.*?\')', bygroups(Name.Attribute, Whitespace, Operator, Whitespace, String)),
+            (r'\, ', Punctuation),
+        ],
+        'init_plan': [
+            (r'\(', Punctuation),
+            (r'returns \$\d+(,\$\d+)?', Name.Variable),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'sort': [
+            (r':|kB', Punctuation),
+            (r'(quicksort|top-N|heapsort|Average|Memory|Peak)', Comment.Prepoc),
+            (r'(external|merge|Disk|sort)', Name.Exception),
+            (r'(\d+)', Number.Integer),
+            (r' +', Whitespace),
+        ],
+    }
+
+
+class SqlLexer(RegexLexer):
+    """
+    Lexer for Structured Query Language. Currently, this lexer does
+    not recognize any special syntax except ANSI SQL.
+    """
+
+    name = 'SQL'
+    aliases = ['sql']
+    filenames = ['*.sql']
+    mimetypes = ['text/x-sql']
+    url = 'https://en.wikipedia.org/wiki/SQL'
+    version_added = ''
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'--.*\n?', Comment.Single),
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (words((
+                'ABORT', 'ABS', 'ABSOLUTE', 'ACCESS', 'ADA', 'ADD', 'ADMIN', 'AFTER',
+                'AGGREGATE', 'ALIAS', 'ALL', 'ALLOCATE', 'ALTER', 'ANALYSE', 'ANALYZE',
+                'AND', 'ANY', 'ARE', 'AS', 'ASC', 'ASENSITIVE', 'ASSERTION', 'ASSIGNMENT',
+                'ASYMMETRIC', 'AT', 'ATOMIC', 'AUTHORIZATION', 'AVG', 'BACKWARD',
+                'BEFORE', 'BEGIN', 'BETWEEN', 'BITVAR', 'BIT_LENGTH', 'BOTH', 'BREADTH',
+                'BY', 'C', 'CACHE', 'CALL', 'CALLED', 'CARDINALITY', 'CASCADE',
+                'CASCADED', 'CASE', 'CAST', 'CATALOG', 'CATALOG_NAME', 'CHAIN',
+                'CHARACTERISTICS', 'CHARACTER_LENGTH', 'CHARACTER_SET_CATALOG',
+                'CHARACTER_SET_NAME', 'CHARACTER_SET_SCHEMA', 'CHAR_LENGTH', 'CHECK',
+                'CHECKED', 'CHECKPOINT', 'CLASS', 'CLASS_ORIGIN', 'CLOB', 'CLOSE',
+                'CLUSTER', 'COALESCE', 'COBOL', 'COLLATE', 'COLLATION',
+                'COLLATION_CATALOG', 'COLLATION_NAME', 'COLLATION_SCHEMA', 'COLUMN',
+                'COLUMN_NAME', 'COMMAND_FUNCTION', 'COMMAND_FUNCTION_CODE', 'COMMENT',
+                'COMMIT', 'COMMITTED', 'COMPLETION', 'CONDITION_NUMBER', 'CONNECT',
+                'CONNECTION', 'CONNECTION_NAME', 'CONSTRAINT', 'CONSTRAINTS',
+                'CONSTRAINT_CATALOG', 'CONSTRAINT_NAME', 'CONSTRAINT_SCHEMA',
+                'CONSTRUCTOR', 'CONTAINS', 'CONTINUE', 'CONVERSION', 'CONVERT',
+                'COPY', 'CORRESPONDING', 'COUNT', 'CREATE', 'CREATEDB', 'CREATEUSER',
+                'CROSS', 'CUBE', 'CURRENT', 'CURRENT_DATE', 'CURRENT_PATH',
+                'CURRENT_ROLE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER',
+                'CURSOR', 'CURSOR_NAME', 'CYCLE', 'DATA', 'DATABASE',
+                'DATETIME_INTERVAL_CODE', 'DATETIME_INTERVAL_PRECISION', 'DAY',
+                'DEALLOCATE', 'DECLARE', 'DEFAULT', 'DEFAULTS', 'DEFERRABLE',
+                'DEFERRED', 'DEFINED', 'DEFINER', 'DELETE', 'DELIMITER', 'DELIMITERS',
+                'DEREF', 'DESC', 'DESCRIBE', 'DESCRIPTOR', 'DESTROY', 'DESTRUCTOR',
+                'DETERMINISTIC', 'DIAGNOSTICS', 'DICTIONARY', 'DISCONNECT', 'DISPATCH',
+                'DISTINCT', 'DO', 'DOMAIN', 'DROP', 'DYNAMIC', 'DYNAMIC_FUNCTION',
+                'DYNAMIC_FUNCTION_CODE', 'EACH', 'ELSE', 'ELSIF', 'ENCODING',
+                'ENCRYPTED', 'END', 'END-EXEC', 'EQUALS', 'ESCAPE', 'EVERY', 'EXCEPTION',
+                'EXCEPT', 'EXCLUDING', 'EXCLUSIVE', 'EXEC', 'EXECUTE', 'EXISTING',
+                'EXISTS', 'EXPLAIN', 'EXTERNAL', 'EXTRACT', 'FALSE', 'FETCH', 'FINAL',
+                'FIRST', 'FOR', 'FORCE', 'FOREIGN', 'FORTRAN', 'FORWARD', 'FOUND', 'FREE',
+                'FREEZE', 'FROM', 'FULL', 'FUNCTION', 'G', 'GENERAL', 'GENERATED', 'GET',
+                'GLOBAL', 'GO', 'GOTO', 'GRANT', 'GRANTED', 'GROUP', 'GROUPING',
+                'HANDLER', 'HAVING', 'HIERARCHY', 'HOLD', 'HOST', 'IDENTITY', 'IF',
+                'IGNORE', 'ILIKE', 'IMMEDIATE', 'IMMEDIATELY', 'IMMUTABLE', 'IMPLEMENTATION', 'IMPLICIT',
+                'IN', 'INCLUDING', 'INCREMENT', 'INDEX', 'INDITCATOR', 'INFIX',
+                'INHERITS', 'INITIALIZE', 'INITIALLY', 'INNER', 'INOUT', 'INPUT',
+                'INSENSITIVE', 'INSERT', 'INSTANTIABLE', 'INSTEAD', 'INTERSECT', 'INTO',
+                'INVOKER', 'IS', 'ISNULL', 'ISOLATION', 'ITERATE', 'JOIN', 'KEY',
+                'KEY_MEMBER', 'KEY_TYPE', 'LANCOMPILER', 'LANGUAGE', 'LARGE', 'LAST',
+                'LATERAL', 'LEADING', 'LEFT', 'LENGTH', 'LESS', 'LEVEL', 'LIKE', 'LIMIT',
+                'LISTEN', 'LOAD', 'LOCAL', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATION',
+                'LOCATOR', 'LOCK', 'LOWER', 'MAP', 'MATCH', 'MAX', 'MAXVALUE',
+                'MESSAGE_LENGTH', 'MESSAGE_OCTET_LENGTH', 'MESSAGE_TEXT', 'METHOD', 'MIN',
+                'MINUTE', 'MINVALUE', 'MOD', 'MODE', 'MODIFIES', 'MODIFY', 'MONTH',
+                'MORE', 'MOVE', 'MUMPS', 'NAMES', 'NATIONAL', 'NATURAL', 'NCHAR', 'NCLOB',
+                'NEW', 'NEXT', 'NO', 'NOCREATEDB', 'NOCREATEUSER', 'NONE', 'NOT',
+                'NOTHING', 'NOTIFY', 'NOTNULL', 'NULL', 'NULLABLE', 'NULLIF', 'OBJECT',
+                'OCTET_LENGTH', 'OF', 'OFF', 'OFFSET', 'OIDS', 'OLD', 'ON', 'ONLY',
+                'OPEN', 'OPERATION', 'OPERATOR', 'OPTION', 'OPTIONS', 'OR', 'ORDER',
+                'ORDINALITY', 'OUT', 'OUTER', 'OUTPUT', 'OVERLAPS', 'OVERLAY',
+                'OVERRIDING', 'OWNER', 'PAD', 'PARAMETER', 'PARAMETERS', 'PARAMETER_MODE',
+                'PARAMETER_NAME', 'PARAMETER_ORDINAL_POSITION',
+                'PARAMETER_SPECIFIC_CATALOG', 'PARAMETER_SPECIFIC_NAME',
+                'PARAMETER_SPECIFIC_SCHEMA', 'PARTIAL', 'PASCAL', 'PENDANT', 'PERIOD', 'PLACING',
+                'PLI', 'POSITION', 'POSTFIX', 'PRECEEDS', 'PRECISION', 'PREFIX', 'PREORDER',
+                'PREPARE', 'PRESERVE', 'PRIMARY', 'PRIOR', 'PRIVILEGES', 'PROCEDURAL',
+                'PROCEDURE', 'PUBLIC', 'READ', 'READS', 'RECHECK', 'RECURSIVE', 'REF',
+                'REFERENCES', 'REFERENCING', 'REINDEX', 'RELATIVE', 'RENAME',
+                'REPEATABLE', 'REPLACE', 'RESET', 'RESTART', 'RESTRICT', 'RESULT',
+                'RETURN', 'RETURNED_LENGTH', 'RETURNED_OCTET_LENGTH', 'RETURNED_SQLSTATE',
+                'RETURNS', 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK', 'ROLLUP', 'ROUTINE',
+                'ROUTINE_CATALOG', 'ROUTINE_NAME', 'ROUTINE_SCHEMA', 'ROW', 'ROWS',
+                'ROW_COUNT', 'RULE', 'SAVE_POINT', 'SCALE', 'SCHEMA', 'SCHEMA_NAME',
+                'SCOPE', 'SCROLL', 'SEARCH', 'SECOND', 'SECURITY', 'SELECT', 'SELF',
+                'SENSITIVE', 'SERIALIZABLE', 'SERVER_NAME', 'SESSION', 'SESSION_USER',
+                'SET', 'SETOF', 'SETS', 'SHARE', 'SHOW', 'SIMILAR', 'SIMPLE', 'SIZE',
+                'SOME', 'SOURCE', 'SPACE', 'SPECIFIC', 'SPECIFICTYPE', 'SPECIFIC_NAME',
+                'SQL', 'SQLCODE', 'SQLERROR', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNINIG',
+                'STABLE', 'START', 'STATE', 'STATEMENT', 'STATIC', 'STATISTICS', 'STDIN',
+                'STDOUT', 'STORAGE', 'STRICT', 'STRUCTURE', 'STYPE', 'SUBCLASS_ORIGIN',
+                'SUBLIST', 'SUBSTRING', 'SUCCEEDS', 'SUM', 'SYMMETRIC', 'SYSID', 'SYSTEM',
+                'SYSTEM_USER', 'TABLE', 'TABLE_NAME', ' TEMP', 'TEMPLATE', 'TEMPORARY',
+                'TERMINATE', 'THAN', 'THEN', 'TIME', 'TIMESTAMP', 'TIMEZONE_HOUR',
+                'TIMEZONE_MINUTE', 'TO', 'TOAST', 'TRAILING', 'TRANSACTION',
+                'TRANSACTIONS_COMMITTED', 'TRANSACTIONS_ROLLED_BACK', 'TRANSACTION_ACTIVE',
+                'TRANSFORM', 'TRANSFORMS', 'TRANSLATE', 'TRANSLATION', 'TREAT', 'TRIGGER',
+                'TRIGGER_CATALOG', 'TRIGGER_NAME', 'TRIGGER_SCHEMA', 'TRIM', 'TRUE',
+                'TRUNCATE', 'TRUSTED', 'TYPE', 'UNCOMMITTED', 'UNDER', 'UNENCRYPTED',
+                'UNION', 'UNIQUE', 'UNKNOWN', 'UNLISTEN', 'UNNAMED', 'UNNEST', 'UNTIL',
+                'UPDATE', 'UPPER', 'USAGE', 'USER', 'USER_DEFINED_TYPE_CATALOG',
+                'USER_DEFINED_TYPE_NAME', 'USER_DEFINED_TYPE_SCHEMA', 'USING', 'VACUUM',
+                'VALID', 'VALIDATOR', 'VALUES', 'VARIABLE', 'VERBOSE',
+                'VERSION', 'VERSIONS', 'VERSIONING', 'VIEW',
+                'VOLATILE', 'WHEN', 'WHENEVER', 'WHERE', 'WITH', 'WITHOUT', 'WORK',
+                'WRITE', 'YEAR', 'ZONE'), suffix=r'\b'),
+             Keyword),
+            (words((
+                'ARRAY', 'BIGINT', 'BINARY', 'BIT', 'BLOB', 'BOOLEAN', 'CHAR',
+                'CHARACTER', 'DATE', 'DEC', 'DECIMAL', 'FLOAT', 'INT', 'INTEGER',
+                'INTERVAL', 'NUMBER', 'NUMERIC', 'REAL', 'SERIAL', 'SMALLINT',
+                'VARCHAR', 'VARYING', 'INT8', 'SERIAL8', 'TEXT'), suffix=r'\b'),
+             Name.Builtin),
+            (r'[+*/<>=~!@#%^&|`?-]', Operator),
+            (r'[0-9]+', Number.Integer),
+            # TODO: Backslash escapes?
+            (r"'(''|[^'])*'", String.Single),
+            (r'"(""|[^"])*"', String.Symbol),  # not a real string literal in ANSI SQL
+            (r'[a-z_][\w$]*', Name),  # allow $s in strings for Oracle
+            (r'[;:()\[\],.]', Punctuation)
+        ],
+        'multiline-comments': [
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[^/*]+', Comment.Multiline),
+            (r'[/*]', Comment.Multiline)
+        ]
+    }
+
+    def analyse_text(self, text):
+        return
+
+
+class TransactSqlLexer(RegexLexer):
+    """
+    Transact-SQL (T-SQL) is Microsoft's and Sybase's proprietary extension to
+    SQL.
+
+    The list of keywords includes ODBC and keywords reserved for future use..
+    """
+
+    name = 'Transact-SQL'
+    aliases = ['tsql', 't-sql']
+    filenames = ['*.sql']
+    mimetypes = ['text/x-tsql']
+    url = 'https://www.tsql.info'
+    version_added = ''
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'--.*[$|\n]?', Comment.Single),
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (words(_tsql_builtins.OPERATORS), Operator),
+            (words(_tsql_builtins.OPERATOR_WORDS, suffix=r'\b'), Operator.Word),
+            (words(_tsql_builtins.TYPES, suffix=r'\b'), Name.Class),
+            (words(_tsql_builtins.FUNCTIONS, suffix=r'\b'), Name.Function),
+            (r'(goto)(\s+)(\w+\b)', bygroups(Keyword, Whitespace, Name.Label)),
+            (words(_tsql_builtins.KEYWORDS, suffix=r'\b'), Keyword),
+            (r'(\[)([^]]+)(\])', bygroups(Operator, Name, Operator)),
+            (r'0x[0-9a-f]+', Number.Hex),
+            # Float variant 1, for example: 1., 1.e2, 1.2e3
+            (r'[0-9]+\.[0-9]*(e[+-]?[0-9]+)?', Number.Float),
+            # Float variant 2, for example: .1, .1e2
+            (r'\.[0-9]+(e[+-]?[0-9]+)?', Number.Float),
+            # Float variant 3, for example: 123e45
+            (r'[0-9]+e[+-]?[0-9]+', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r"'(''|[^'])*'", String.Single),
+            (r'"(""|[^"])*"', String.Symbol),
+            (r'[;(),.]', Punctuation),
+            # Below we use \w even for the first "real" character because
+            # tokens starting with a digit have already been recognized
+            # as Number above.
+            (r'@@\w+', Name.Builtin),
+            (r'@\w+', Name.Variable),
+            (r'(\w+)(:)', bygroups(Name.Label, Punctuation)),
+            (r'#?#?\w+', Name),  # names for temp tables and anything else
+            (r'\?', Name.Variable.Magic),  # parameter for prepared statements
+        ],
+        'multiline-comments': [
+            (r'/\*', Comment.Multiline, 'multiline-comments'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[^/*]+', Comment.Multiline),
+            (r'[/*]', Comment.Multiline)
+        ]
+    }
+
+    def analyse_text(text):
+        rating = 0
+        if tsql_declare_re.search(text):
+            # Found T-SQL variable declaration.
+            rating = 1.0
+        else:
+            name_between_backtick_count = len(
+                name_between_backtick_re.findall(text))
+            name_between_bracket_count = len(
+                name_between_bracket_re.findall(text))
+            # We need to check if there are any names using
+            # backticks or brackets, as otherwise both are 0
+            # and 0 >= 2 * 0, so we would always assume it's true
+            dialect_name_count = name_between_backtick_count + name_between_bracket_count
+            if dialect_name_count >= 1 and \
+               name_between_bracket_count >= 2 * name_between_backtick_count:
+                # Found at least twice as many [name] as `name`.
+                rating += 0.5
+            elif name_between_bracket_count > name_between_backtick_count:
+                rating += 0.2
+            elif name_between_bracket_count > 0:
+                rating += 0.1
+            if tsql_variable_re.search(text) is not None:
+                rating += 0.1
+            if tsql_go_re.search(text) is not None:
+                rating += 0.1
+        return rating
+
+
+class MySqlLexer(RegexLexer):
+    """The Oracle MySQL lexer.
+
+    This lexer does not attempt to maintain strict compatibility with
+    MariaDB syntax or keywords. Although MySQL and MariaDB's common code
+    history suggests there may be significant overlap between the two,
+    compatibility between the two is not a target for this lexer.
+    """
+
+    name = 'MySQL'
+    aliases = ['mysql']
+    mimetypes = ['text/x-mysql']
+    url = 'https://www.mysql.com'
+    version_added = ''
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+
+            # Comments
+            (r'(?:#|--\s+).*', Comment.Single),
+            (r'/\*\+', Comment.Special, 'optimizer-hints'),
+            (r'/\*', Comment.Multiline, 'multiline-comment'),
+
+            # Hexadecimal literals
+            (r"x'([0-9a-f]{2})+'", Number.Hex),  # MySQL requires paired hex characters in this form.
+            (r'0x[0-9a-f]+', Number.Hex),
+
+            # Binary literals
+            (r"b'[01]+'", Number.Bin),
+            (r'0b[01]+', Number.Bin),
+
+            # Numeric literals
+            (r'[0-9]+\.[0-9]*(e[+-]?[0-9]+)?', Number.Float),  # Mandatory integer, optional fraction and exponent
+            (r'[0-9]*\.[0-9]+(e[+-]?[0-9]+)?', Number.Float),  # Mandatory fraction, optional integer and exponent
+            (r'[0-9]+e[+-]?[0-9]+', Number.Float),  # Exponents with integer significands are still floats
+            (r'[0-9]+(?=[^0-9a-z$_\u0080-\uffff])', Number.Integer),  # Integers that are not in a schema object name
+
+            # Date literals
+            (r"\{\s*d\s*(?P<quote>['\"])\s*\d{2}(\d{2})?.?\d{2}.?\d{2}\s*(?P=quote)\s*\}",
+             Literal.Date),
+
+            # Time literals
+            (r"\{\s*t\s*(?P<quote>['\"])\s*(?:\d+\s+)?\d{1,2}.?\d{1,2}.?\d{1,2}(\.\d*)?\s*(?P=quote)\s*\}",
+             Literal.Date),
+
+            # Timestamp literals
+            (
+                r"\{\s*ts\s*(?P<quote>['\"])\s*"
+                r"\d{2}(?:\d{2})?.?\d{2}.?\d{2}"  # Date part
+                r"\s+"  # Whitespace between date and time
+                r"\d{1,2}.?\d{1,2}.?\d{1,2}(\.\d*)?"  # Time part
+                r"\s*(?P=quote)\s*\}",
+                Literal.Date
+            ),
+
+            # String literals
+            (r"'", String.Single, 'single-quoted-string'),
+            (r'"', String.Double, 'double-quoted-string'),
+
+            # Variables
+            (r'@@(?:global\.|persist\.|persist_only\.|session\.)?[a-z_]+', Name.Variable),
+            (r'@[a-z0-9_$.]+', Name.Variable),
+            (r"@'", Name.Variable, 'single-quoted-variable'),
+            (r'@"', Name.Variable, 'double-quoted-variable'),
+            (r"@`", Name.Variable, 'backtick-quoted-variable'),
+            (r'\?', Name.Variable),  # For demonstrating prepared statements
+
+            # Operators
+            (r'[!%&*+/:<=>^|~-]+', Operator),
+
+            # Exceptions; these words tokenize differently in different contexts.
+            (r'\b(set)(?!\s*\()', Keyword),
+            (r'\b(character)(\s+)(set)\b', bygroups(Keyword, Whitespace, Keyword)),
+            # In all other known cases, "SET" is tokenized by MYSQL_DATATYPES.
+
+            (words(MYSQL_CONSTANTS, prefix=r'\b', suffix=r'\b'), Name.Constant),
+            (words(MYSQL_DATATYPES, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+            (words(MYSQL_KEYWORDS, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(MYSQL_FUNCTIONS, prefix=r'\b', suffix=r'\b(\s*)(\()'),
+             bygroups(Name.Function, Whitespace, Punctuation)),
+
+            # Schema object names
+            #
+            # Note: Although the first regex supports unquoted all-numeric
+            # identifiers, this will not be a problem in practice because
+            # numeric literals have already been handled above.
+            #
+            ('[0-9a-z$_\u0080-\uffff]+', Name),
+            (r'`', Name.Quoted, 'schema-object-name'),
+
+            # Punctuation
+            (r'[(),.;]', Punctuation),
+        ],
+
+        # Multiline comment substates
+        # ---------------------------
+
+        'optimizer-hints': [
+            (r'[^*a-z]+', Comment.Special),
+            (r'\*/', Comment.Special, '#pop'),
+            (words(MYSQL_OPTIMIZER_HINTS, suffix=r'\b'), Comment.Preproc),
+            ('[a-z]+', Comment.Special),
+            (r'\*', Comment.Special),
+        ],
+
+        'multiline-comment': [
+            (r'[^*]+', Comment.Multiline),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'\*', Comment.Multiline),
+        ],
+
+        # String substates
+        # ----------------
+
+        'single-quoted-string': [
+            (r"[^'\\]+", String.Single),
+            (r"''", String.Escape),
+            (r"""\\[0'"bnrtZ\\%_]""", String.Escape),
+            (r"'", String.Single, '#pop'),
+        ],
+
+        'double-quoted-string': [
+            (r'[^"\\]+', String.Double),
+            (r'""', String.Escape),
+            (r"""\\[0'"bnrtZ\\%_]""", String.Escape),
+            (r'"', String.Double, '#pop'),
+        ],
+
+        # Variable substates
+        # ------------------
+
+        'single-quoted-variable': [
+            (r"[^']+", Name.Variable),
+            (r"''", Name.Variable),
+            (r"'", Name.Variable, '#pop'),
+        ],
+
+        'double-quoted-variable': [
+            (r'[^"]+', Name.Variable),
+            (r'""', Name.Variable),
+            (r'"', Name.Variable, '#pop'),
+        ],
+
+        'backtick-quoted-variable': [
+            (r'[^`]+', Name.Variable),
+            (r'``', Name.Variable),
+            (r'`', Name.Variable, '#pop'),
+        ],
+
+        # Schema object name substates
+        # ----------------------------
+        #
+        # "Name.Quoted" and "Name.Quoted.Escape" are non-standard but
+        # formatters will style them as "Name" by default but add
+        # additional styles based on the token name. This gives users
+        # flexibility to add custom styles as desired.
+        #
+        'schema-object-name': [
+            (r'[^`]+', Name.Quoted),
+            (r'``', Name.Quoted.Escape),
+            (r'`', Name.Quoted, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        rating = 0
+        name_between_backtick_count = len(
+            name_between_backtick_re.findall(text))
+        name_between_bracket_count = len(
+            name_between_bracket_re.findall(text))
+        # Same logic as above in the TSQL analysis
+        dialect_name_count = name_between_backtick_count + name_between_bracket_count
+        if dialect_name_count >= 1 and \
+           name_between_backtick_count >= 2 * name_between_bracket_count:
+            # Found at least twice as many `name` as [name].
+            rating += 0.5
+        elif name_between_backtick_count > name_between_bracket_count:
+            rating += 0.2
+        elif name_between_backtick_count > 0:
+            rating += 0.1
+        return rating
+
+
+class GoogleSqlLexer(RegexLexer):
+    """
+    GoogleSQL is Google's standard SQL dialect, formerly known as ZetaSQL.
+
+    The list of keywords includes reserved words for future use.
+    """
+
+    name = 'GoogleSQL'
+    aliases = ['googlesql', 'zetasql']
+    filenames = ['*.googlesql', '*.googlesql.sql']
+    mimetypes = ['text/x-google-sql', 'text/x-google-sql-aux']
+    url = 'https://cloud.google.com/bigquery/googlesql'
+    version_added = '2.19'
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+
+            # Comments
+            (r'(?:#|--\s+).*', Comment.Single),
+            (r'/\*', Comment.Multiline, 'multiline-comment'),
+
+            # Hexadecimal literals
+            (r"x'([0-9a-f]{2})+'", Number.Hex),
+            (r'0x[0-9a-f]+', Number.Hex),
+
+            # Binary literals
+            (r"b'[01]+'", Number.Bin),
+            (r'0b[01]+', Number.Bin),
+
+            # Numeric literals
+            (r'[0-9]+\.[0-9]*(e[+-]?[0-9]+)?', Number.Float),  # Mandatory integer, optional fraction and exponent
+            (r'[0-9]*\.[0-9]+(e[+-]?[0-9]+)?', Number.Float),  # Mandatory fraction, optional integer and exponent
+            (r'[0-9]+e[+-]?[0-9]+', Number.Float),  # Exponents with integer significands are still floats
+            (r'[0-9]+(?=[^0-9a-z$_\u0080-\uffff])', Number.Integer),  # Integers that are not in a schema object name
+
+            # Date literals
+            (r"\{\s*d\s*(?P<quote>['\"])\s*\d{2}(\d{2})?.?\d{2}.?\d{2}\s*(?P=quote)\s*\}",
+             Literal.Date),
+
+            # Time literals
+            (r"\{\s*t\s*(?P<quote>['\"])\s*(?:\d+\s+)?\d{1,2}.?\d{1,2}.?\d{1,2}(\.\d*)?\s*(?P=quote)\s*\}",
+             Literal.Date),
+
+            # Timestamp literals
+            (
+                r"\{\s*ts\s*(?P<quote>['\"])\s*"
+                r"\d{2}(?:\d{2})?.?\d{2}.?\d{2}"  # Date part
+                r"\s+"  # Whitespace between date and time
+                r"\d{1,2}.?\d{1,2}.?\d{1,2}(\.\d*)?"  # Time part
+                r"\s*(?P=quote)\s*\}",
+                Literal.Date
+            ),
+
+            # String literals
+            (r"'", String.Single, 'single-quoted-string'),
+            (r'"', String.Double, 'double-quoted-string'),
+
+            # Variables
+            (r'@@(?:global\.|persist\.|persist_only\.|session\.)?[a-z_]+', Name.Variable),
+            (r'@[a-z0-9_$.]+', Name.Variable),
+            (r"@'", Name.Variable, 'single-quoted-variable'),
+            (r'@"', Name.Variable, 'double-quoted-variable'),
+            (r"@`", Name.Variable, 'backtick-quoted-variable'),
+            (r'\?', Name.Variable),  # For demonstrating prepared statements
+
+            # Exceptions; these words tokenize differently in different contexts.
+            (r'\b(set)(?!\s*\()', Keyword),
+            (r'\b(character)(\s+)(set)\b', bygroups(Keyword, Whitespace, Keyword)),
+
+            # Constants, types, keywords, functions, operators
+            (words(_googlesql_builtins.constants, prefix=r'\b', suffix=r'\b'), Name.Constant),
+            (words(_googlesql_builtins.types, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+            (words(_googlesql_builtins.keywords, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(_googlesql_builtins.functionnames, prefix=r'\b', suffix=r'\b(\s*)(\()'),
+             bygroups(Name.Function, Whitespace, Punctuation)),
+            (words(_googlesql_builtins.operators, prefix=r'\b', suffix=r'\b'), Operator),
+
+            # Schema object names
+            #
+            # Note: Although the first regex supports unquoted all-numeric
+            # identifiers, this will not be a problem in practice because
+            # numeric literals have already been handled above.
+            #
+            ('[0-9a-z$_\u0080-\uffff]+', Name),
+            (r'`', Name.Quoted, 'schema-object-name'),
+
+            # Punctuation
+            (r'[(),.;]', Punctuation),
+        ],
+
+        # Multiline comment substates
+        # ---------------------------
+
+        'multiline-comment': [
+            (r'[^*]+', Comment.Multiline),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'\*', Comment.Multiline),
+        ],
+
+        # String substates
+        # ----------------
+
+        'single-quoted-string': [
+            (r"[^'\\]+", String.Single),
+            (r"''", String.Escape),
+            (r"""\\[0'"bnrtZ\\%_]""", String.Escape),
+            (r"'", String.Single, '#pop'),
+        ],
+
+        'double-quoted-string': [
+            (r'[^"\\]+', String.Double),
+            (r'""', String.Escape),
+            (r"""\\[0'"bnrtZ\\%_]""", String.Escape),
+            (r'"', String.Double, '#pop'),
+        ],
+
+        # Variable substates
+        # ------------------
+
+        'single-quoted-variable': [
+            (r"[^']+", Name.Variable),
+            (r"''", Name.Variable),
+            (r"'", Name.Variable, '#pop'),
+        ],
+
+        'double-quoted-variable': [
+            (r'[^"]+', Name.Variable),
+            (r'""', Name.Variable),
+            (r'"', Name.Variable, '#pop'),
+        ],
+
+        'backtick-quoted-variable': [
+            (r'[^`]+', Name.Variable),
+            (r'``', Name.Variable),
+            (r'`', Name.Variable, '#pop'),
+        ],
+
+        # Schema object name substates
+        # ----------------------------
+        #
+        # "Name.Quoted" and "Name.Quoted.Escape" are non-standard but
+        # formatters will style them as "Name" by default but add
+        # additional styles based on the token name. This gives users
+        # flexibility to add custom styles as desired.
+        #
+        'schema-object-name': [
+            (r'[^`]+', Name.Quoted),
+            (r'``', Name.Quoted.Escape),
+            (r'`', Name.Quoted, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        tokens = collections.Counter(text.split())
+        return 0.001 * sum(count for t, count in tokens.items()
+                           if t in googlesql_identifiers)
+
+
+class SqliteConsoleLexer(Lexer):
+    """
+    Lexer for example sessions using sqlite3.
+    """
+
+    name = 'sqlite3con'
+    aliases = ['sqlite3']
+    filenames = ['*.sqlite3-console']
+    mimetypes = ['text/x-sqlite3-console']
+    url = 'https://www.sqlite.org'
+    version_added = '0.11'
+    _example = "sqlite3/sqlite3.sqlite3-console"
+
+    def get_tokens_unprocessed(self, data):
+        sql = SqlLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        for match in line_re.finditer(data):
+            line = match.group()
+            prompt_match = sqlite_prompt_re.match(line)
+            if prompt_match is not None:
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:7])]))
+                insertions.append((len(curcode),
+                                   [(7, Whitespace, ' ')]))
+                curcode += line[8:]
+            else:
+                if curcode:
+                    yield from do_insertions(insertions,
+                                             sql.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+                if line.startswith('SQL error: '):
+                    yield (match.start(), Generic.Traceback, line)
+                else:
+                    yield (match.start(), Generic.Output, line)
+        if curcode:
+            yield from do_insertions(insertions,
+                                     sql.get_tokens_unprocessed(curcode))
+
+
+class RqlLexer(RegexLexer):
+    """
+    Lexer for Relation Query Language.
+    """
+    name = 'RQL'
+    url = 'http://www.logilab.org/project/rql'
+    aliases = ['rql']
+    filenames = ['*.rql']
+    mimetypes = ['text/x-rql']
+    version_added = '2.0'
+
+    flags = re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'(DELETE|SET|INSERT|UNION|DISTINCT|WITH|WHERE|BEING|OR'
+             r'|AND|NOT|GROUPBY|HAVING|ORDERBY|ASC|DESC|LIMIT|OFFSET'
+             r'|TODAY|NOW|TRUE|FALSE|NULL|EXISTS)\b', Keyword),
+            (r'[+*/<>=%-]', Operator),
+            (r'(Any|is|instance_of|CWEType|CWRelation)\b', Name.Builtin),
+            (r'[0-9]+', Number.Integer),
+            (r'[A-Z_]\w*\??', Name),
+            (r"'(''|[^'])*'", String.Single),
+            (r'"(""|[^"])*"', String.Single),
+            (r'[;:()\[\],.]', Punctuation)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/srcinfo.py b/.venv/Lib/site-packages/pygments/lexers/srcinfo.py
new file mode 100644 (file)
index 0000000..daf654e
--- /dev/null
@@ -0,0 +1,62 @@
+"""
+    pygments.lexers.srcinfo
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for .SRCINFO files used by Arch Linux Packages.
+
+    The description of the format can be found in the wiki:
+    https://wiki.archlinux.org/title/.SRCINFO
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Keyword, Name, Operator, Whitespace
+
+__all__ = ['SrcinfoLexer']
+
+keywords = (
+    'pkgbase', 'pkgname',
+    'pkgver', 'pkgrel', 'epoch',
+    'pkgdesc', 'url', 'install', 'changelog',
+    'arch', 'groups', 'license', 'noextract', 'options', 'backup',
+    'validpgpkeys',
+)
+
+architecture_dependent_keywords = (
+    'source', 'depends', 'checkdepends', 'makedepends', 'optdepends',
+    'provides', 'conflicts', 'replaces',
+    'md5sums', 'sha1sums', 'sha224sums', 'sha256sums', 'sha384sums',
+    'sha512sums',
+)
+
+
+class SrcinfoLexer(RegexLexer):
+    """Lexer for .SRCINFO files used by Arch Linux Packages.
+    """
+
+    name = 'Srcinfo'
+    aliases = ['srcinfo']
+    filenames = ['.SRCINFO']
+    url = 'https://wiki.archlinux.org/title/.SRCINFO'
+    version_added = '2.11'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'#.*', Comment.Single),
+            (words(keywords), Keyword, 'assignment'),
+            (words(architecture_dependent_keywords, suffix=r'_\w+'),
+             Keyword, 'assignment'),
+            (r'\w+', Name.Variable, 'assignment'),
+        ],
+        'assignment': [
+            (r' +', Whitespace),
+            (r'=', Operator, 'value'),
+        ],
+        'value': [
+            (r' +', Whitespace),
+            (r'.*', Text, '#pop:2'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/stata.py b/.venv/Lib/site-packages/pygments/lexers/stata.py
new file mode 100644 (file)
index 0000000..dc93cb4
--- /dev/null
@@ -0,0 +1,170 @@
+"""
+    pygments.lexers.stata
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Stata
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+from pygments.lexer import RegexLexer, default, include, words
+from pygments.token import Comment, Keyword, Name, Number, \
+    String, Text, Operator
+
+from pygments.lexers._stata_builtins import builtins_base, builtins_functions
+
+__all__ = ['StataLexer']
+
+
+class StataLexer(RegexLexer):
+    """
+    For Stata do files.
+    """
+    # Syntax based on
+    # - http://fmwww.bc.edu/RePEc/bocode/s/synlightlist.ado
+    # - https://github.com/isagalaev/highlight.js/blob/master/src/languages/stata.js
+    # - https://github.com/jpitblado/vim-stata/blob/master/syntax/stata.vim
+
+    name = 'Stata'
+    url = 'http://www.stata.com/'
+    version_added = '2.2'
+    aliases   = ['stata', 'do']
+    filenames = ['*.do', '*.ado']
+    mimetypes = ['text/x-stata', 'text/stata', 'application/x-stata']
+    flags     = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('strings'),
+            include('macros'),
+            include('numbers'),
+            include('keywords'),
+            include('operators'),
+            include('format'),
+            (r'.', Text),
+        ],
+        # Comments are a complicated beast in Stata because they can be
+        # nested and there are a few corner cases with that. See:
+        # - github.com/kylebarron/language-stata/issues/90
+        # - statalist.org/forums/forum/general-stata-discussion/general/1448244
+        'comments': [
+            (r'(^//|(?<=\s)//)(?!/)', Comment.Single, 'comments-double-slash'),
+            (r'^\s*\*', Comment.Single, 'comments-star'),
+            (r'/\*', Comment.Multiline, 'comments-block'),
+            (r'(^///|(?<=\s)///)', Comment.Special, 'comments-triple-slash')
+        ],
+        'comments-block': [
+            (r'/\*', Comment.Multiline, '#push'),
+            # this ends and restarts a comment block. but need to catch this so
+            # that it doesn\'t start _another_ level of comment blocks
+            (r'\*/\*', Comment.Multiline),
+            (r'(\*/\s+\*(?!/)[^\n]*)|(\*/)', Comment.Multiline, '#pop'),
+            # Match anything else as a character inside the comment
+            (r'.', Comment.Multiline),
+        ],
+        'comments-star': [
+            (r'///.*?\n', Comment.Single,
+                ('#pop', 'comments-triple-slash')),
+            (r'(^//|(?<=\s)//)(?!/)', Comment.Single,
+                ('#pop', 'comments-double-slash')),
+            (r'/\*', Comment.Multiline, 'comments-block'),
+            (r'.(?=\n)', Comment.Single, '#pop'),
+            (r'.', Comment.Single),
+        ],
+        'comments-triple-slash': [
+            (r'\n', Comment.Special, '#pop'),
+            # A // breaks out of a comment for the rest of the line
+            (r'//.*?(?=\n)', Comment.Single, '#pop'),
+            (r'.', Comment.Special),
+        ],
+        'comments-double-slash': [
+            (r'\n', Text, '#pop'),
+            (r'.', Comment.Single),
+        ],
+        # `"compound string"' and regular "string"; note the former are
+        # nested.
+        'strings': [
+            (r'`"', String, 'string-compound'),
+            (r'(?<!`)"', String, 'string-regular'),
+        ],
+        'string-compound': [
+            (r'`"', String, '#push'),
+            (r'"\'', String, '#pop'),
+            (r'\\\\|\\"|\\\$|\\`|\\\n', String.Escape),
+            include('macros'),
+            (r'.', String)
+        ],
+        'string-regular': [
+            (r'(")(?!\')|(?=\n)', String, '#pop'),
+            (r'\\\\|\\"|\\\$|\\`|\\\n', String.Escape),
+            include('macros'),
+            (r'.', String)
+        ],
+        # A local is usually
+        #     `\w{0,31}'
+        #     `:extended macro'
+        #     `=expression'
+        #     `[rsen](results)'
+        #     `(++--)scalar(++--)'
+        #
+        # However, there are all sorts of weird rules wrt edge
+        # cases. Instead of writing 27 exceptions, anything inside
+        # `' is a local.
+        #
+        # A global is more restricted, so we do follow rules. Note only
+        # locals explicitly enclosed ${} can be nested.
+        'macros': [
+            (r'\$(\{|(?=[$`]))', Name.Variable.Global, 'macro-global-nested'),
+            (r'\$', Name.Variable.Global,  'macro-global-name'),
+            (r'`', Name.Variable, 'macro-local'),
+        ],
+        'macro-local': [
+            (r'`', Name.Variable, '#push'),
+            (r"'", Name.Variable, '#pop'),
+            (r'\$(\{|(?=[$`]))', Name.Variable.Global, 'macro-global-nested'),
+            (r'\$', Name.Variable.Global, 'macro-global-name'),
+            (r'.', Name.Variable),  # fallback
+        ],
+        'macro-global-nested': [
+            (r'\$(\{|(?=[$`]))', Name.Variable.Global, '#push'),
+            (r'\}', Name.Variable.Global, '#pop'),
+            (r'\$', Name.Variable.Global, 'macro-global-name'),
+            (r'`', Name.Variable, 'macro-local'),
+            (r'\w', Name.Variable.Global),  # fallback
+            default('#pop'),
+        ],
+        'macro-global-name': [
+            (r'\$(\{|(?=[$`]))', Name.Variable.Global, 'macro-global-nested', '#pop'),
+            (r'\$', Name.Variable.Global, 'macro-global-name', '#pop'),
+            (r'`', Name.Variable, 'macro-local', '#pop'),
+            (r'\w{1,32}', Name.Variable.Global, '#pop'),
+        ],
+        # Built in functions and statements
+        'keywords': [
+            (words(builtins_functions, prefix = r'\b', suffix = r'(?=\()'),
+             Name.Function),
+            (words(builtins_base, prefix = r'(^\s*|\s)', suffix = r'\b'),
+             Keyword),
+        ],
+        # http://www.stata.com/help.cgi?operators
+        'operators': [
+            (r'-|==|<=|>=|<|>|&|!=', Operator),
+            (r'\*|\+|\^|/|!|~|==|~=', Operator)
+        ],
+        # Stata numbers
+        'numbers': [
+            # decimal number
+            (r'\b[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+|\.)([eE][+-]?[0-9]+)?[i]?\b',
+             Number),
+        ],
+        # Stata formats
+        'format': [
+            (r'%-?\d{1,2}(\.\d{1,2})?[gfe]c?', Name.Other),
+            (r'%(21x|16H|16L|8H|8L)', Name.Other),
+            (r'%-?(tc|tC|td|tw|tm|tq|th|ty|tg)\S{0,32}', Name.Other),
+            (r'%[-~]?\d{1,4}s', Name.Other),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/supercollider.py b/.venv/Lib/site-packages/pygments/lexers/supercollider.py
new file mode 100644 (file)
index 0000000..0f19d2a
--- /dev/null
@@ -0,0 +1,94 @@
+"""
+    pygments.lexers.supercollider
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for SuperCollider
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['SuperColliderLexer']
+
+
+class SuperColliderLexer(RegexLexer):
+    """
+    For SuperCollider source code.
+    """
+
+    name = 'SuperCollider'
+    url = 'http://supercollider.github.io/'
+    aliases = ['supercollider', 'sc']
+    filenames = ['*.sc', '*.scd']
+    mimetypes = ['application/supercollider', 'text/supercollider']
+    version_added = '2.1'
+
+    flags = re.DOTALL | re.MULTILINE
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'<!--', Comment),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop'),
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (words((
+                'for', 'in', 'while', 'do', 'break', 'return', 'continue',
+                'switch', 'case', 'default', 'if', 'else', 'throw', 'try',
+                'catch', 'finally', 'new', 'delete', 'typeof', 'instanceof',
+                'void'), suffix=r'\b'),
+             Keyword, 'slashstartsregex'),
+            (words(('var', 'let', 'with', 'function', 'arg'), suffix=r'\b'),
+             Keyword.Declaration, 'slashstartsregex'),
+            (words((
+                '(abstract', 'boolean', 'byte', 'char', 'class', 'const',
+                'debugger', 'double', 'enum', 'export', 'extends', 'final',
+                'float', 'goto', 'implements', 'import', 'int', 'interface',
+                'long', 'native', 'package', 'private', 'protected', 'public',
+                'short', 'static', 'super', 'synchronized', 'throws',
+                'transient', 'volatile'), suffix=r'\b'),
+             Keyword.Reserved),
+            (words(('true', 'false', 'nil', 'inf'), suffix=r'\b'), Keyword.Constant),
+            (words((
+                'Array', 'Boolean', 'Date', 'Error', 'Function', 'Number',
+                'Object', 'Packages', 'RegExp', 'String',
+                'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'super',
+                'thisFunctionDef', 'thisFunction', 'thisMethod', 'thisProcess',
+                'thisThread', 'this'), suffix=r'\b'),
+             Name.Builtin),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'\\?[$a-zA-Z_]\w*', String.Symbol),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ]
+    }
+
+    def analyse_text(text):
+        """We're searching for a common function and a unique keyword here."""
+        if 'SinOsc' in text or 'thisFunctionDef' in text:
+            return 0.1
diff --git a/.venv/Lib/site-packages/pygments/lexers/tablegen.py b/.venv/Lib/site-packages/pygments/lexers/tablegen.py
new file mode 100644 (file)
index 0000000..5bcb3ee
--- /dev/null
@@ -0,0 +1,177 @@
+"""
+    pygments.lexers.tablegen
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for LLVM's TableGen DSL.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words, using
+from pygments.lexers.c_cpp import CppLexer
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text, Whitespace, Error
+
+__all__ = ['TableGenLexer']
+
+KEYWORDS = (
+    'assert',
+    'class',
+    'code',
+    'def',
+    'dump',
+    'else',
+    'foreach',
+    'defm',
+    'defset',
+    'defvar',
+    'field',
+    'if',
+    'in',
+    'include',
+    'let',
+    'multiclass',
+    'then',
+)
+
+KEYWORDS_CONST = (
+    'false',
+    'true',
+)
+KEYWORDS_TYPE = (
+    'bit',
+    'bits',
+    'dag',
+    'int',
+    'list',
+    'string',
+)
+
+BANG_OPERATORS = (
+    'add',
+    'and',
+    'cast',
+    'con',
+    'cond',
+    'dag',
+    'div',
+    'empty',
+    'eq',
+    'exists',
+    'filter',
+    'find',
+    'foldl',
+    'foreach',
+    'ge',
+    'getdagarg',
+    'getdagname',
+    'getdagop',
+    'gt',
+    'head',
+    'if',
+    'interleave',
+    'isa',
+    'le',
+    'listconcat',
+    'listremove',
+    'listsplat',
+    'logtwo',
+    'lt',
+    'mul',
+    'ne',
+    'not',
+    'or',
+    'range',
+    'repr',
+    'setdagarg',
+    'setdagname',
+    'setdagop',
+    'shl',
+    'size',
+    'sra',
+    'srl',
+    'strconcat',
+    'sub',
+    'subst',
+    'substr',
+    'tail',
+    'tolower',
+    'toupper',
+    'xor',
+)
+
+class TableGenLexer(RegexLexer):
+    """
+    Lexer for TableGen
+    """
+
+    name = 'TableGen'
+    url = 'https://llvm.org/docs/TableGen/ProgRef.html'
+    aliases = ['tablegen', 'td']
+    filenames = ['*.td']
+
+    version_added = '2.19'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'//.*?$', Comment.SingleLine),
+            (r'#(define|ifdef|ifndef|else|endif)', Comment.Preproc),
+
+            # Binary/hex numbers. Note that these take priority over names,
+            # which may begin with numbers.
+            (r'0b[10]+', Number.Bin),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+
+            # Keywords
+            (words(KEYWORDS, suffix=r'\b'), Keyword),
+            (words(KEYWORDS_CONST, suffix=r'\b'), Keyword.Constant),
+            (words(KEYWORDS_TYPE, suffix=r'\b'), Keyword.Type),
+
+            # Bang operators
+            (words(BANG_OPERATORS, prefix=r'\!', suffix=r'\b'), Operator),
+            # Unknown bang operators are an error
+            (r'![a-zA-Z]+', Error),
+
+            # Names and identifiers
+            (r'[0-9]*[a-zA-Z_][a-zA-Z_0-9]*', Name),
+            (r'\$[a-zA-Z_][a-zA-Z_0-9]*', Name.Variable),
+
+            # Place numbers after keywords. Names/identifiers may begin with
+            # numbers, and we want to parse 1X as one name token as opposed to
+            # a number and a name.
+            (r'[-\+]?[0-9]+', Number.Integer),
+
+            # String literals
+            (r'"', String, 'dqs'),
+            (r'\[\{', Text, 'codeblock'),
+
+            # Misc. punctuation
+            (r'[-+\[\]{}()<>\.,;:=?#]+', Punctuation),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'strings': [
+            (r'\\[\\\'"tn]', String.Escape),
+            (r'[^\\"]+', String),
+        ],
+        # Double-quoted string, a la C
+        'dqs': [
+            (r'"', String, '#pop'),
+            include('strings'),
+        ],
+        # No escaping inside a code block - everything is literal
+        # Assume that the code inside a code block is C++. This isn't always
+        # true in TableGen, but is the far most common scenario.
+        'codeblock': [
+            (r'\}\]', Text, '#pop'),
+            (r'([^}]+|\}[^]])*', using(CppLexer)),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/tact.py b/.venv/Lib/site-packages/pygments/lexers/tact.py
new file mode 100644 (file)
index 0000000..9199a5b
--- /dev/null
@@ -0,0 +1,303 @@
+"""
+    pygments.lexers.tact
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Tact.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, words
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Whitespace, Punctuation
+
+__all__ = ['TactLexer']
+
+
+class TactLexer(RegexLexer):
+    """For Tact source code."""
+
+    name = 'Tact'
+    aliases = ['tact']
+    filenames = ['*.tact']
+    url = "https://tact-lang.org"
+    version_added = '2.18'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'[.;(),\[\]{}]', Punctuation),
+            (r'\?|!!', Operator),
+            include('comments'),
+            include('import-in'),
+            include('struct-in'),
+            include('contract-or-trait-in'),
+            include('annotation-in'),
+            include('fun-declaration-in'),
+            include('const-declaration-in'),
+            include('statements'),
+        ],
+        'import-in': [
+            (r'((?<=\.\.\.)|(?<![.$]))\b(import)\b(\s*)', bygroups(Punctuation, Keyword, Whitespace), 'import'),
+        ],
+        'import': [
+            (r';', Punctuation, '#pop'),
+            include('comments'),
+            include('string-in'),
+            (r'\s+', Whitespace),
+        ],
+        'struct-in': [
+            (r'((?<=\.\.\.)|(?<![.$]))\b(struct|message)\b', bygroups(Punctuation, Keyword), 'struct'),
+        ],
+        'struct': [
+            include('comments'),
+            include('struct-header'),
+            include('struct-body-in'),
+            (r'\s+', Whitespace),
+        ],
+        'struct-header': [
+            include('comments'),
+            (r'\b\w+', Name.Class),
+            (r'(\()((?:\b0[xX])[0-9a-fA-F][0-9a-fA-F_]*\b)(\))', bygroups(Punctuation, Number.Hex, Punctuation)),
+            (r'(\()((?:\b[0-9]+\b))(\))', bygroups(Punctuation, Number.Integer, Punctuation)),
+        ],
+        'struct-body-in': [
+            (r'\{', Punctuation, 'struct-body'),
+        ],
+        'struct-body': [
+            (r'\}', Punctuation, '#pop:2'),
+            include('comments'),
+            include('field-declaration-in'),
+        ],
+        'contract-or-trait-in': [
+            (r'((?<=\.\.\.)|(?<![.$]))\b(contract|trait)\b', Keyword, 'contract-or-trait'),
+        ],
+        'contract-or-trait': [
+            include('comments'),
+            (r'with', Keyword),
+            (r'\b\w+', Name.Class),
+            include('contract-or-trait-body-in'),
+            (r'\s+', Whitespace),
+            (r',', Punctuation),
+        ],
+        'contract-or-trait-body-in': [
+            (r'\{', Punctuation, 'contract-or-trait-body'),
+        ],
+        'contract-or-trait-body': [
+            (r'\}', Punctuation, '#pop:2'),
+            include('comments'),
+            include('init-declaration-in'),
+            include('receive-declaration-in'),
+            include('bounce-declaration-in'),
+            include('fun-declaration-in'),
+            include('const-declaration-in'),
+            include('field-declaration-in'),
+            (r'\s+', Whitespace),
+        ],
+        'field-declaration-in': [
+            (r'\b\w+', Name.Property, 'field-declaration'),
+        ],
+        'field-declaration': [
+            (r';', Punctuation, '#pop'),
+            include('comments'),
+            include('type-annotation-in'),
+            include('variable-init-in'),
+        ],
+        'const-declaration-in': [
+            (r'(?=\b(?:(?:get|native|extends|mutates|virtual|override|inline|abstract)\s*)*const\b)', Keyword, 'const-declaration'),
+        ],
+        'const-declaration': [
+            (r'(;)', Punctuation, '#pop'),
+            (r'const', Keyword),
+            (words(('get', 'native', 'extends', 'mutates', 'virtual', 'override', 'inline', 'abstract'), suffix=r'\b'), Keyword),
+            (r'\b\w+\b', Name.Constant),
+            include('comments'),
+            include('type-annotation-in'),
+            include('variable-init-in'),
+            (r'\s+', Whitespace),
+        ],
+        'init-declaration-in': [
+            (r'(init)', Keyword, 'init-declaration')
+        ],
+        'init-declaration': [
+            (r'(?<=\})', Punctuation, '#pop'),
+            include('comments'),
+            include('fun-arguments-in'),
+            include('block-declaration-in'),
+            (r'\s+', Whitespace),
+        ],
+        'receive-declaration-in': [
+            (r'(receive|exernal)', Keyword, 'receive-declaration')
+        ],
+        'receive-declaration': [
+            (r'(?<=\})', Punctuation, '#pop'),
+            include('comments'),
+            include('fun-arguments-in'),
+            include('block-declaration-in'),
+        ],
+        'bounce-declaration-in': [
+            (r'(bounced)', Keyword, 'bounce-declaration')
+        ],
+        'bounce-declaration': [
+            (r'(?<=\})', Punctuation, '#pop'),
+            include('comments'),
+            include('fun-arguments-in'),
+            include('block-declaration-in'),
+        ],
+        'fun-declaration-in': [
+            (r'(?=\b(?:(?:get|native|extends|mutates|virtual|override|inline|abstract)\s*)*fun\b)', Keyword, 'fun-declaration')
+        ],
+        'fun-declaration': [
+            (r'(?<=\}|\;)', Punctuation, '#pop'),
+            (r'fun', Keyword),
+            (r'\b(get|native|extends|mutates|virtual|override|inline|abstract)\b', Keyword),
+            (r'\b[\w]+', Name.Function),
+            include('fun-declaration-body'),
+            (r'[,;]', Punctuation),
+        ],
+        'fun-declaration-body': [
+            include('comments'),
+            include('fun-arguments-in'),
+            include('type-annotation-in'),
+            include('block-declaration-in'),
+            (r'\s+', Whitespace),
+        ],
+        'fun-arguments-in': [
+            (r'\(', Punctuation, 'fun-arguments'),
+        ],
+        'fun-arguments': [
+            (r'\)', Punctuation, '#pop'),
+            include('comments'),
+            include('string-in'),
+            include('type-annotation-in'),
+            (r'(self)|(\b[\w]+\b)', bygroups(Name.Variable.Instance, Name.Variable)),
+            (r',', Punctuation),
+            (r'\s+', Whitespace),
+        ],
+        'block-declaration-in': [
+            (r'\{', Punctuation, 'block-declaration')
+        ],
+        'block-declaration': [
+            (r'\}', Punctuation, '#pop'),
+            include('statements'),
+        ],
+        'statements': [
+            include('comments'),
+            include('block-declaration-in'),
+            include('expressions'),
+        ],
+        'annotation-in': [
+            (r'(@)(\w+)(\()', bygroups(Keyword.Pseudo, Keyword, Punctuation), 'annotation')
+        ],
+        'annotation': [
+            (r'\)', Punctuation, '#pop'),
+            include('annotation-argument'),
+            (r'\s+', Whitespace),
+        ],
+        'annotation-argument': [
+            (r'\w+', Name.Function.Magic),
+        ],
+        'expressions': [
+            include('comments'),
+            include('type-annotation-in'),
+            include('keywords'),
+            include('numeric'),
+            include('string-in'),
+            include('variable'),
+            include('function-call'),
+            include('struct-init-in'),
+        ],
+        'struct-init-in': [
+            (r'(\b\w+)(\s*)(\{)', bygroups(Name.Class, Whitespace, Punctuation), 'struct-init')
+        ],
+        'struct-init': [
+            (r'(\})', Punctuation, '#pop'),
+            include('comments'),
+            include('struct-property-in'),
+            (r'\s+', Whitespace),
+            (r',', Punctuation),
+        ],
+        'struct-property-in': [
+            (r'(\b[\w]+)(\s*)(:)', bygroups(Name.Property, Whitespace, Punctuation), 'struct-property')
+        ],
+        'struct-property': [
+            (r'(?=\}|\,)', Punctuation, '#pop'),
+            include('comments'),
+            include('expressions'),
+            (r'\s+', Whitespace),
+        ],
+        'variable-init-in': [
+            (r'(=)', Operator, 'variable-init')
+        ],
+        'variable-init': [
+            (r'(?=\}|\{|\,|\;)',Punctuation, '#pop'),
+            include('comments'),
+            include('expressions'),
+            (r'\s+', Whitespace),
+        ],
+        'type-annotation-in': [
+            (r'(:)(\s+)', bygroups(Punctuation, Whitespace), 'type-annotation')
+        ],
+        'type-annotation': [
+            (r'(?=\{|\;|\=|\,|\))', Punctuation, '#pop'),
+            include('comments'),
+            include('type-as-in'),
+            include('type-generic-in'),
+            (r'\?', Operator),
+            (r'\b\w+', Keyword.Type),
+            (r'\s+', Whitespace),
+        ],
+        'type-generic-in': [
+            (r'<', Punctuation, 'type-generic'),
+        ],
+        'type-generic': [
+            (r'>', Punctuation, '#pop'),
+            include('comments'),
+            include('type-as-in'),
+            (r'\b\w+', Keyword.Type),
+            (r'\s+', Whitespace),
+            (r',', Punctuation),
+        ],
+        'type-as-in': [
+            (r'\b(as)(\s+)', bygroups(Keyword, Whitespace), 'type-as'),
+        ],
+        'type-as': [
+            (r'(?=\{|\;|\=|\,|\)|\>)', Punctuation, '#pop'),
+            include('comments'),
+            (r'\b\w+', Keyword.Type),
+            (r'\s+', Whitespace),
+        ],
+        'keywords': [
+            (words(('if', 'else', 'while', 'do', 'until', 'repeat', 'return', 'extends', 'mutates', 'virtual', 'override', 'inline', 'native', 'let', 'const', 'fun', 'self', 'is', 'initOf', 'map', 'bounced', 'get', 'as'), prefix=r'\b', suffix=r'\b'), Keyword),
+            (r'(<=>|>=|<=|!=|==|\^>>|~>>|>>|<<|\/%|\^%|~%|\^\/|~\/|\+=|-=|\*=|\/=|~\/=|\^\/=|%=|\^%=|<<=|>>=|~>>=|\^>>=|&=|\|=|\^=|\^|=|~|\/|%|-|\*|\+|>|<|&|\||:|\?)', Operator),
+            (words(('true', 'false'), prefix=r'\b', suffix=r'\b'), Keyword.Constant),
+        ],
+        'string-in': [
+            (r'"', String, 'string'),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\.', String.Escape),
+            (r'[^\\"]+', String.Double),
+        ],
+        'numeric': [
+            (r'(?:\b0[xX])[0-9a-fA-F][0-9a-fA-F_]*\b', Number.Hex),
+            (r'(?:\b[0-9]+\b)', Number.Integer),
+        ],
+        'comments': [
+            (r'//.*', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comments-multiline'),
+        ],
+        'comments-multiline': [
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[^*]+', Comment.Multiline),
+            (r'[*]', Comment.Multiline),
+        ],
+        'variable': [
+            (r'\b\w+\b(?!\s*\()(?!\s*\{)', Name.Variable)
+        ],
+        'function-call': [
+            (r'\b\w+\b(?=\s*\()(?!\s*\{)', Name.Function)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/tal.py b/.venv/Lib/site-packages/pygments/lexers/tal.py
new file mode 100644 (file)
index 0000000..33c1bdc
--- /dev/null
@@ -0,0 +1,77 @@
+"""
+    pygments.lexers.tal
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Uxntal
+
+    .. versionadded:: 2.12
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Keyword, Name, String, Number, \
+    Punctuation, Whitespace, Literal
+
+__all__ = ['TalLexer']
+
+
+class TalLexer(RegexLexer):
+    """
+    For Uxntal source code.
+    """
+
+    name = 'Tal'
+    aliases = ['tal', 'uxntal']
+    filenames = ['*.tal']
+    mimetypes = ['text/x-uxntal']
+    url = 'https://wiki.xxiivv.com/site/uxntal.html'
+    version_added = '2.12'
+
+    instructions = [
+        'BRK', 'LIT', 'INC', 'POP', 'DUP', 'NIP', 'SWP', 'OVR', 'ROT',
+        'EQU', 'NEQ', 'GTH', 'LTH', 'JMP', 'JCN', 'JSR', 'STH',
+        'LDZ', 'STZ', 'LDR', 'STR', 'LDA', 'STA', 'DEI', 'DEO',
+        'ADD', 'SUB', 'MUL', 'DIV', 'AND', 'ORA', 'EOR', 'SFT'
+    ]
+
+    tokens = {
+        # the comment delimiters must not be adjacent to non-space characters.
+        # this means ( foo ) is a valid comment but (foo) is not. this also
+        # applies to nested comments.
+        'comment': [
+            (r'(?<!\S)\((?!\S)', Comment.Multiline, '#push'), # nested comments
+            (r'(?<!\S)\)(?!\S)', Comment.Multiline, '#pop'), # nested comments
+            (r'[^()]+', Comment.Multiline), # comments
+            (r'[()]+', Comment.Multiline), # comments
+        ],
+        'root': [
+            (r'\s+', Whitespace), # spaces
+            (r'(?<!\S)\((?!\S)', Comment.Multiline, 'comment'), # comments
+            (words(instructions, prefix=r'(?<!\S)', suffix=r'2?k?r?(?!\S)'),
+             Keyword.Reserved), # instructions
+            (r'[][{}](?!\S)', Punctuation), # delimiters
+            (r'#([0-9a-f]{2}){1,2}(?!\S)', Number.Hex), # integer
+            (r'"\S+', String), # raw string
+            (r'([0-9a-f]{2}){1,2}(?!\S)', Literal), # raw integer
+            (r'[|$][0-9a-f]{1,4}(?!\S)', Keyword.Declaration), # abs/rel pad
+            (r'%\S+', Name.Decorator), # macro
+            (r'@\S+', Name.Function), # label
+            (r'&\S+', Name.Label), # sublabel
+            (r'/\S+', Name.Tag), # spacer
+            (r'\.\S+', Name.Variable.Magic), # literal zero page addr
+            (r',\S+', Name.Variable.Instance), # literal rel addr
+            (r';\S+', Name.Variable.Global), # literal abs addr
+            (r'-\S+', Literal), # raw zero page addr
+            (r'_\S+', Literal), # raw relative addr
+            (r'=\S+', Literal), # raw absolute addr
+            (r'!\S+', Name.Function), # immediate jump
+            (r'\?\S+', Name.Function), # conditional immediate jump
+            (r'~\S+', Keyword.Namespace), # include
+            (r'\S+', Name.Function), # macro invocation, immediate subroutine
+        ]
+    }
+
+    def analyse_text(text):
+        return '|0100' in text[:500]
diff --git a/.venv/Lib/site-packages/pygments/lexers/tcl.py b/.venv/Lib/site-packages/pygments/lexers/tcl.py
new file mode 100644 (file)
index 0000000..f156efa
--- /dev/null
@@ -0,0 +1,148 @@
+"""
+    pygments.lexers.tcl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Tcl and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Whitespace
+from pygments.util import shebang_matches
+
+__all__ = ['TclLexer']
+
+
+class TclLexer(RegexLexer):
+    """
+    For Tcl source code.
+    """
+
+    keyword_cmds_re = words((
+        'after', 'apply', 'array', 'break', 'catch', 'continue', 'elseif',
+        'else', 'error', 'eval', 'expr', 'for', 'foreach', 'global', 'if',
+        'namespace', 'proc', 'rename', 'return', 'set', 'switch', 'then',
+        'trace', 'unset', 'update', 'uplevel', 'upvar', 'variable', 'vwait',
+        'while'), prefix=r'\b', suffix=r'\b')
+
+    builtin_cmds_re = words((
+        'append', 'bgerror', 'binary', 'cd', 'chan', 'clock', 'close',
+        'concat', 'dde', 'dict', 'encoding', 'eof', 'exec', 'exit', 'fblocked',
+        'fconfigure', 'fcopy', 'file', 'fileevent', 'flush', 'format', 'gets',
+        'glob', 'history', 'http', 'incr', 'info', 'interp', 'join', 'lappend',
+        'lassign', 'lindex', 'linsert', 'list', 'llength', 'load', 'loadTk',
+        'lrange', 'lrepeat', 'lreplace', 'lreverse', 'lsearch', 'lset', 'lsort',
+        'mathfunc', 'mathop', 'memory', 'msgcat', 'open', 'package', 'pid',
+        'pkg::create', 'pkg_mkIndex', 'platform', 'platform::shell', 'puts',
+        'pwd', 're_syntax', 'read', 'refchan', 'regexp', 'registry', 'regsub',
+        'scan', 'seek', 'socket', 'source', 'split', 'string', 'subst', 'tell',
+        'time', 'tm', 'unknown', 'unload'), prefix=r'\b', suffix=r'\b')
+
+    name = 'Tcl'
+    url = 'https://www.tcl.tk/about/language.html'
+    aliases = ['tcl']
+    filenames = ['*.tcl', '*.rvt']
+    mimetypes = ['text/x-tcl', 'text/x-script.tcl', 'application/x-tcl']
+    version_added = '0.10'
+
+    def _gen_command_rules(keyword_cmds_re, builtin_cmds_re, context=""):
+        return [
+            (keyword_cmds_re, Keyword, 'params' + context),
+            (builtin_cmds_re, Name.Builtin, 'params' + context),
+            (r'([\w.-]+)', Name.Variable, 'params' + context),
+            (r'#', Comment, 'comment'),
+        ]
+
+    tokens = {
+        'root': [
+            include('command'),
+            include('basic'),
+            include('data'),
+            (r'\}', Keyword),  # HACK: somehow we miscounted our braces
+        ],
+        'command': _gen_command_rules(keyword_cmds_re, builtin_cmds_re),
+        'command-in-brace': _gen_command_rules(keyword_cmds_re,
+                                               builtin_cmds_re,
+                                               "-in-brace"),
+        'command-in-bracket': _gen_command_rules(keyword_cmds_re,
+                                                 builtin_cmds_re,
+                                                 "-in-bracket"),
+        'command-in-paren': _gen_command_rules(keyword_cmds_re,
+                                               builtin_cmds_re,
+                                               "-in-paren"),
+        'basic': [
+            (r'\(', Keyword, 'paren'),
+            (r'\[', Keyword, 'bracket'),
+            (r'\{', Keyword, 'brace'),
+            (r'"', String.Double, 'string'),
+            (r'(eq|ne|in|ni)\b', Operator.Word),
+            (r'!=|==|<<|>>|<=|>=|&&|\|\||\*\*|[-+~!*/%<>&^|?:]', Operator),
+        ],
+        'data': [
+            (r'\s+', Whitespace),
+            (r'0x[a-fA-F0-9]+', Number.Hex),
+            (r'0[0-7]+', Number.Oct),
+            (r'\d+\.\d+', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'\$[\w.:-]+', Name.Variable),
+            (r'\$\{[\w.:-]+\}', Name.Variable),
+            (r'[\w.,@:-]+', Text),
+        ],
+        'params': [
+            (r';', Keyword, '#pop'),
+            (r'\n', Text, '#pop'),
+            (r'(else|elseif|then)\b', Keyword),
+            include('basic'),
+            include('data'),
+        ],
+        'params-in-brace': [
+            (r'\}', Keyword, ('#pop', '#pop')),
+            include('params')
+        ],
+        'params-in-paren': [
+            (r'\)', Keyword, ('#pop', '#pop')),
+            include('params')
+        ],
+        'params-in-bracket': [
+            (r'\]', Keyword, ('#pop', '#pop')),
+            include('params')
+        ],
+        'string': [
+            (r'\[', String.Double, 'string-square'),
+            (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\])', String.Double),
+            (r'"', String.Double, '#pop')
+        ],
+        'string-square': [
+            (r'\[', String.Double, 'string-square'),
+            (r'(?s)(\\\\|\\[0-7]+|\\.|\\\n|[^\]\\])', String.Double),
+            (r'\]', String.Double, '#pop')
+        ],
+        'brace': [
+            (r'\}', Keyword, '#pop'),
+            include('command-in-brace'),
+            include('basic'),
+            include('data'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('command-in-paren'),
+            include('basic'),
+            include('data'),
+        ],
+        'bracket': [
+            (r'\]', Keyword, '#pop'),
+            include('command-in-bracket'),
+            include('basic'),
+            include('data'),
+        ],
+        'comment': [
+            (r'.*[^\\]\n', Comment, '#pop'),
+            (r'.*\\\n', Comment),
+        ],
+    }
+
+    def analyse_text(text):
+        return shebang_matches(text, r'(tcl)')
diff --git a/.venv/Lib/site-packages/pygments/lexers/teal.py b/.venv/Lib/site-packages/pygments/lexers/teal.py
new file mode 100644 (file)
index 0000000..54ee268
--- /dev/null
@@ -0,0 +1,88 @@
+"""
+    pygments.lexers.teal
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for TEAL.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include, words
+from pygments.token import Comment, Name, Number, String, Text, Keyword, \
+    Whitespace
+
+__all__ = ['TealLexer']
+
+
+class TealLexer(RegexLexer):
+    """
+    For the Transaction Execution Approval Language (TEAL)
+
+    For more information about the grammar, see:
+    https://github.com/algorand/go-algorand/blob/master/data/transactions/logic/assembler.go
+    """
+    name = 'teal'
+    url = 'https://developer.algorand.org/docs/reference/teal/specification/'
+    aliases = ['teal']
+    filenames = ['*.teal']
+    version_added = '2.9'
+
+    keywords = words({
+        'Sender', 'Fee', 'FirstValid', 'FirstValidTime', 'LastValid', 'Note',
+        'Lease', 'Receiver', 'Amount', 'CloseRemainderTo', 'VotePK',
+        'SelectionPK', 'VoteFirst', 'VoteLast', 'VoteKeyDilution', 'Type',
+        'TypeEnum', 'XferAsset', 'AssetAmount', 'AssetSender', 'AssetReceiver',
+        'AssetCloseTo', 'GroupIndex', 'TxID', 'ApplicationID', 'OnCompletion',
+        'ApplicationArgs', 'NumAppArgs', 'Accounts', 'NumAccounts',
+        'ApprovalProgram', 'ClearStateProgram', 'RekeyTo', 'ConfigAsset',
+        'ConfigAssetTotal', 'ConfigAssetDecimals', 'ConfigAssetDefaultFrozen',
+        'ConfigAssetUnitName', 'ConfigAssetName', 'ConfigAssetURL',
+        'ConfigAssetMetadataHash', 'ConfigAssetManager', 'ConfigAssetReserve',
+        'ConfigAssetFreeze', 'ConfigAssetClawback', 'FreezeAsset',
+        'FreezeAssetAccount', 'FreezeAssetFrozen',
+        'NoOp', 'OptIn', 'CloseOut', 'ClearState', 'UpdateApplication',
+        'DeleteApplication',
+        'MinTxnFee', 'MinBalance', 'MaxTxnLife', 'ZeroAddress', 'GroupSize',
+        'LogicSigVersion', 'Round', 'LatestTimestamp', 'CurrentApplicationID',
+        'AssetBalance', 'AssetFrozen',
+        'AssetTotal', 'AssetDecimals', 'AssetDefaultFrozen', 'AssetUnitName',
+        'AssetName', 'AssetURL', 'AssetMetadataHash', 'AssetManager',
+        'AssetReserve', 'AssetFreeze', 'AssetClawback',
+    }, suffix=r'\b')
+
+    identifier = r'[^ \t\n]+(?=\/\/)|[^ \t\n]+'
+    newline = r'\r?\n'
+    tokens = {
+        'root': [
+            include('whitespace'),
+            # pragmas match specifically on the space character
+            (r'^#pragma .*' + newline, Comment.Directive),
+            # labels must be followed by a space,
+            # but anything after that is ignored
+            ('(' + identifier + ':' + ')' + '([ \t].*)',
+                bygroups(Name.Label, Comment.Single)),
+            (identifier, Name.Function, 'function-args'),
+        ],
+        'function-args': [
+            include('whitespace'),
+            (r'"', String, 'string'),
+            (r'(b(?:ase)?(?:32|64) ?)(\(?[a-zA-Z0-9+/=]+\)?)',
+                bygroups(String.Affix, String.Other)),
+            (r'[A-Z2-7]{58}', Number),  # address
+            (r'0x[\da-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (keywords, Keyword),
+            (identifier, Name.Attributes),  # branch targets
+            (newline, Text, '#pop'),
+        ],
+        'string': [
+            (r'\\(?:["nrt\\]|x\d\d)', String.Escape),
+            (r'[^\\\"\n]+', String),
+            (r'"', String, '#pop'),
+        ],
+        'whitespace': [
+            (r'[ \t]+', Whitespace),
+            (r'//[^\n]+', Comment.Single),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/templates.py b/.venv/Lib/site-packages/pygments/lexers/templates.py
new file mode 100644 (file)
index 0000000..ff796d3
--- /dev/null
@@ -0,0 +1,2355 @@
+"""
+    pygments.lexers.templates
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various template engines' markup.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexers.html import HtmlLexer, XmlLexer
+from pygments.lexers.javascript import JavascriptLexer, LassoLexer
+from pygments.lexers.css import CssLexer
+from pygments.lexers.php import PhpLexer
+from pygments.lexers.python import PythonLexer
+from pygments.lexers.perl import PerlLexer
+from pygments.lexers.jvm import JavaLexer, TeaLangLexer
+from pygments.lexers.data import YamlLexer
+from pygments.lexers.sql import SqlLexer
+from pygments.lexer import Lexer, DelegatingLexer, RegexLexer, bygroups, \
+    include, using, this, default, combined
+from pygments.token import Error, Punctuation, Whitespace, \
+    Text, Comment, Operator, Keyword, Name, String, Number, Other, Token
+from pygments.util import html_doctype_matches, looks_like_xml
+
+__all__ = ['HtmlPhpLexer', 'XmlPhpLexer', 'CssPhpLexer',
+           'JavascriptPhpLexer', 'ErbLexer', 'RhtmlLexer',
+           'XmlErbLexer', 'CssErbLexer', 'JavascriptErbLexer',
+           'SmartyLexer', 'HtmlSmartyLexer', 'XmlSmartyLexer',
+           'CssSmartyLexer', 'JavascriptSmartyLexer', 'DjangoLexer',
+           'HtmlDjangoLexer', 'CssDjangoLexer', 'XmlDjangoLexer',
+           'JavascriptDjangoLexer', 'GenshiLexer', 'HtmlGenshiLexer',
+           'GenshiTextLexer', 'CssGenshiLexer', 'JavascriptGenshiLexer',
+           'MyghtyLexer', 'MyghtyHtmlLexer', 'MyghtyXmlLexer',
+           'MyghtyCssLexer', 'MyghtyJavascriptLexer', 'MasonLexer', 'MakoLexer',
+           'MakoHtmlLexer', 'MakoXmlLexer', 'MakoJavascriptLexer',
+           'MakoCssLexer', 'JspLexer', 'CheetahLexer', 'CheetahHtmlLexer',
+           'CheetahXmlLexer', 'CheetahJavascriptLexer', 'EvoqueLexer',
+           'EvoqueHtmlLexer', 'EvoqueXmlLexer', 'ColdfusionLexer',
+           'ColdfusionHtmlLexer', 'ColdfusionCFCLexer', 'VelocityLexer',
+           'VelocityHtmlLexer', 'VelocityXmlLexer', 'SspLexer',
+           'TeaTemplateLexer', 'LassoHtmlLexer', 'LassoXmlLexer',
+           'LassoCssLexer', 'LassoJavascriptLexer', 'HandlebarsLexer',
+           'HandlebarsHtmlLexer', 'YamlJinjaLexer', 'LiquidLexer',
+           'TwigLexer', 'TwigHtmlLexer', 'Angular2Lexer', 'Angular2HtmlLexer',
+           'SqlJinjaLexer']
+
+
+class ErbLexer(Lexer):
+    """
+    Generic ERB (Ruby Templating) lexer.
+
+    Just highlights ruby code between the preprocessor directives, other data
+    is left untouched by the lexer.
+
+    All options are also forwarded to the `RubyLexer`.
+    """
+
+    name = 'ERB'
+    url = 'https://github.com/ruby/erb'
+    aliases = ['erb']
+    mimetypes = ['application/x-ruby-templating']
+    version_added = ''
+
+    _block_re = re.compile(r'(<%%|%%>|<%=|<%#|<%-|<%|-%>|%>|^%[^%].*?$)', re.M)
+
+    def __init__(self, **options):
+        from pygments.lexers.ruby import RubyLexer
+        self.ruby_lexer = RubyLexer(**options)
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        """
+        Since ERB doesn't allow "<%" and other tags inside of ruby
+        blocks we have to use a split approach here that fails for
+        that too.
+        """
+        tokens = self._block_re.split(text)
+        tokens.reverse()
+        state = idx = 0
+        try:
+            while True:
+                # text
+                if state == 0:
+                    val = tokens.pop()
+                    yield idx, Other, val
+                    idx += len(val)
+                    state = 1
+                # block starts
+                elif state == 1:
+                    tag = tokens.pop()
+                    # literals
+                    if tag in ('<%%', '%%>'):
+                        yield idx, Other, tag
+                        idx += 3
+                        state = 0
+                    # comment
+                    elif tag == '<%#':
+                        yield idx, Comment.Preproc, tag
+                        val = tokens.pop()
+                        yield idx + 3, Comment, val
+                        idx += 3 + len(val)
+                        state = 2
+                    # blocks or output
+                    elif tag in ('<%', '<%=', '<%-'):
+                        yield idx, Comment.Preproc, tag
+                        idx += len(tag)
+                        data = tokens.pop()
+                        r_idx = 0
+                        for r_idx, r_token, r_value in \
+                                self.ruby_lexer.get_tokens_unprocessed(data):
+                            yield r_idx + idx, r_token, r_value
+                        idx += len(data)
+                        state = 2
+                    elif tag in ('%>', '-%>'):
+                        yield idx, Error, tag
+                        idx += len(tag)
+                        state = 0
+                    # % raw ruby statements
+                    else:
+                        yield idx, Comment.Preproc, tag[0]
+                        r_idx = 0
+                        for r_idx, r_token, r_value in \
+                                self.ruby_lexer.get_tokens_unprocessed(tag[1:]):
+                            yield idx + 1 + r_idx, r_token, r_value
+                        idx += len(tag)
+                        state = 0
+                # block ends
+                elif state == 2:
+                    tag = tokens.pop()
+                    if tag not in ('%>', '-%>'):
+                        yield idx, Other, tag
+                    else:
+                        yield idx, Comment.Preproc, tag
+                    idx += len(tag)
+                    state = 0
+        except IndexError:
+            return
+
+    def analyse_text(text):
+        if '<%' in text and '%>' in text:
+            return 0.4
+
+
+class SmartyLexer(RegexLexer):
+    """
+    Generic Smarty template lexer.
+
+    Just highlights smarty code between the preprocessor directives, other
+    data is left untouched by the lexer.
+    """
+
+    name = 'Smarty'
+    url = 'https://www.smarty.net/'
+    aliases = ['smarty']
+    filenames = ['*.tpl']
+    mimetypes = ['application/x-smarty']
+    version_added = ''
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'[^{]+', Other),
+            (r'(\{)(\*.*?\*)(\})',
+             bygroups(Comment.Preproc, Comment, Comment.Preproc)),
+            (r'(\{php\})(.*?)(\{/php\})',
+             bygroups(Comment.Preproc, using(PhpLexer, startinline=True),
+                      Comment.Preproc)),
+            (r'(\{)(/?[a-zA-Z_]\w*)(\s*)',
+             bygroups(Comment.Preproc, Name.Function, Text), 'smarty'),
+            (r'\{', Comment.Preproc, 'smarty')
+        ],
+        'smarty': [
+            (r'\s+', Text),
+            (r'\{', Comment.Preproc, '#push'),
+            (r'\}', Comment.Preproc, '#pop'),
+            (r'#[a-zA-Z_]\w*#', Name.Variable),
+            (r'\$[a-zA-Z_]\w*(\.\w+)*', Name.Variable),
+            (r'[~!%^&*()+=|\[\]:;,.<>/?@-]', Operator),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'[a-zA-Z_]\w*', Name.Attribute)
+        ]
+    }
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search(r'\{if\s+.*?\}.*?\{/if\}', text):
+            rv += 0.15
+        if re.search(r'\{include\s+file=.*?\}', text):
+            rv += 0.15
+        if re.search(r'\{foreach\s+.*?\}.*?\{/foreach\}', text):
+            rv += 0.15
+        if re.search(r'\{\$.*?\}', text):
+            rv += 0.01
+        return rv
+
+
+class VelocityLexer(RegexLexer):
+    """
+    Generic Velocity template lexer.
+
+    Just highlights velocity directives and variable references, other
+    data is left untouched by the lexer.
+    """
+
+    name = 'Velocity'
+    url = 'https://velocity.apache.org/'
+    aliases = ['velocity']
+    filenames = ['*.vm', '*.fhtml']
+    version_added = ''
+
+    flags = re.MULTILINE | re.DOTALL
+
+    identifier = r'[a-zA-Z_]\w*'
+
+    tokens = {
+        'root': [
+            (r'[^{#$]+', Other),
+            (r'(#)(\*.*?\*)(#)',
+             bygroups(Comment.Preproc, Comment, Comment.Preproc)),
+            (r'(##)(.*?$)',
+             bygroups(Comment.Preproc, Comment)),
+            (r'(#\{?)(' + identifier + r')(\}?)(\s?\()',
+             bygroups(Comment.Preproc, Name.Function, Comment.Preproc, Punctuation),
+             'directiveparams'),
+            (r'(#\{?)(' + identifier + r')(\}|\b)',
+             bygroups(Comment.Preproc, Name.Function, Comment.Preproc)),
+            (r'\$!?\{?', Punctuation, 'variable')
+        ],
+        'variable': [
+            (identifier, Name.Variable),
+            (r'\(', Punctuation, 'funcparams'),
+            (r'(\.)(' + identifier + r')',
+             bygroups(Punctuation, Name.Variable), '#push'),
+            (r'\}', Punctuation, '#pop'),
+            default('#pop')
+        ],
+        'directiveparams': [
+            (r'(&&|\|\||==?|!=?|[-<>+*%&|^/])|\b(eq|ne|gt|lt|ge|le|not|in)\b',
+             Operator),
+            (r'\[', Operator, 'rangeoperator'),
+            (r'\b' + identifier + r'\b', Name.Function),
+            include('funcparams')
+        ],
+        'rangeoperator': [
+            (r'\.\.', Operator),
+            include('funcparams'),
+            (r'\]', Operator, '#pop')
+        ],
+        'funcparams': [
+            (r'\$!?\{?', Punctuation, 'variable'),
+            (r'\s+', Text),
+            (r'[,:]', Punctuation),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+            (r"\b[0-9]+\b", Number),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'\(', Punctuation, '#push'),
+            (r'\)', Punctuation, '#pop'),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+            (r'\[', Punctuation, '#push'),
+            (r'\]', Punctuation, '#pop'),
+        ]
+    }
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search(r'#\{?macro\}?\(.*?\).*?#\{?end\}?', text, re.DOTALL):
+            rv += 0.25
+        if re.search(r'#\{?if\}?\(.+?\).*?#\{?end\}?', text, re.DOTALL):
+            rv += 0.15
+        if re.search(r'#\{?foreach\}?\(.+?\).*?#\{?end\}?', text, re.DOTALL):
+            rv += 0.15
+        if re.search(r'\$!?\{?[a-zA-Z_]\w*(\([^)]*\))?'
+                     r'(\.\w+(\([^)]*\))?)*\}?', text):
+            rv += 0.01
+        return rv
+
+
+class VelocityHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `VelocityLexer` that highlights unlexed data
+    with the `HtmlLexer`.
+
+    """
+
+    name = 'HTML+Velocity'
+    aliases = ['html+velocity']
+    version_added = ''
+    alias_filenames = ['*.html', '*.fhtml']
+    mimetypes = ['text/html+velocity']
+    url = 'https://velocity.apache.org/'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, VelocityLexer, **options)
+
+
+class VelocityXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `VelocityLexer` that highlights unlexed data
+    with the `XmlLexer`.
+
+    """
+
+    name = 'XML+Velocity'
+    aliases = ['xml+velocity']
+    version_added = ''
+    alias_filenames = ['*.xml', '*.vm']
+    mimetypes = ['application/xml+velocity']
+    url = 'https://velocity.apache.org/'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, VelocityLexer, **options)
+
+    def analyse_text(text):
+        rv = VelocityLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class DjangoLexer(RegexLexer):
+    """
+    Generic `Django <https://www.djangoproject.com/documentation/templates/>`_
+    and `Jinja <https://jinja.palletsprojects.com>`_ template lexer.
+
+    It just highlights django/jinja code between the preprocessor directives,
+    other data is left untouched by the lexer.
+    """
+
+    name = 'Django/Jinja'
+    aliases = ['django', 'jinja']
+    mimetypes = ['application/x-django-templating', 'application/x-jinja']
+    url = 'https://www.djangoproject.com/documentation/templates'
+    version_added = ''
+
+    flags = re.M | re.S
+
+    tokens = {
+        'root': [
+            (r'[^{]+', Other),
+            (r'\{\{', Comment.Preproc, 'var'),
+            # jinja/django comments
+            (r'\{#.*?#\}', Comment),
+            # django comments
+            (r'(\{%)(-?\s*)(comment)(\s*-?)(%\})(.*?)'
+             r'(\{%)(-?\s*)(endcomment)(\s*-?)(%\})',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Comment.Preproc,
+                      Comment, Comment.Preproc, Text, Keyword, Text,
+                      Comment.Preproc)),
+            # raw jinja blocks
+            (r'(\{%)(-?\s*)(raw)(\s*-?)(%\})(.*?)'
+             r'(\{%)(-?\s*)(endraw)(\s*-?)(%\})',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Comment.Preproc,
+                      Text, Comment.Preproc, Text, Keyword, Text,
+                      Comment.Preproc)),
+            # filter blocks
+            (r'(\{%)(-?\s*)(filter)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Name.Function),
+             'block'),
+            (r'(\{%)(-?\s*)([a-zA-Z_]\w*)',
+             bygroups(Comment.Preproc, Text, Keyword), 'block'),
+            (r'\{', Other)
+        ],
+        'varnames': [
+            (r'(\|)(\s*)([a-zA-Z_]\w*)',
+             bygroups(Operator, Text, Name.Function)),
+            (r'(is)(\s+)(not)?(\s+)?([a-zA-Z_]\w*)',
+             bygroups(Keyword, Text, Keyword, Text, Name.Function)),
+            (r'(_|true|false|none|True|False|None)\b', Keyword.Pseudo),
+            (r'(in|as|reversed|recursive|not|and|or|is|if|else|import|'
+             r'with(?:(?:out)?\s*context)?|scoped|ignore\s+missing)\b',
+             Keyword),
+            (r'(loop|block|super|forloop)\b', Name.Builtin),
+            (r'[a-zA-Z_][\w-]*', Name.Variable),
+            (r'\.\w+', Name.Variable),
+            (r':?"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r":?'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'([{}()\[\]+\-*/%,:~]|[><=]=?|!=)', Operator),
+            (r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+        ],
+        'var': [
+            (r'\s+', Text),
+            (r'(-?)(\}\})', bygroups(Text, Comment.Preproc), '#pop'),
+            include('varnames')
+        ],
+        'block': [
+            (r'\s+', Text),
+            (r'(-?)(%\})', bygroups(Text, Comment.Preproc), '#pop'),
+            include('varnames'),
+            (r'.', Punctuation)
+        ]
+    }
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search(r'\{%\s*(block|extends)', text) is not None:
+            rv += 0.4
+        if re.search(r'\{%\s*if\s*.*?%\}', text) is not None:
+            rv += 0.1
+        if re.search(r'\{\{.*?\}\}', text) is not None:
+            rv += 0.1
+        return rv
+
+
+class MyghtyLexer(RegexLexer):
+    """
+    Generic myghty templates lexer. Code that isn't Myghty
+    markup is yielded as `Token.Other`.
+    """
+
+    name = 'Myghty'
+    url = 'http://www.myghty.org/'
+    aliases = ['myghty']
+    filenames = ['*.myt', 'autodelegate']
+    mimetypes = ['application/x-myghty']
+    version_added = '0.6'
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'(?s)(<%(?:def|method))(\s*)(.*?)(>)(.*?)(</%\2\s*>)',
+             bygroups(Name.Tag, Text, Name.Function, Name.Tag,
+                      using(this), Name.Tag)),
+            (r'(?s)(<%\w+)(.*?)(>)(.*?)(</%\2\s*>)',
+             bygroups(Name.Tag, Name.Function, Name.Tag,
+                      using(PythonLexer), Name.Tag)),
+            (r'(<&[^|])(.*?)(,.*?)?(&>)',
+             bygroups(Name.Tag, Name.Function, using(PythonLexer), Name.Tag)),
+            (r'(?s)(<&\|)(.*?)(,.*?)?(&>)',
+             bygroups(Name.Tag, Name.Function, using(PythonLexer), Name.Tag)),
+            (r'</&>', Name.Tag),
+            (r'(?s)(<%!?)(.*?)(%>)',
+             bygroups(Name.Tag, using(PythonLexer), Name.Tag)),
+            (r'(?<=^)#[^\n]*(\n|\Z)', Comment),
+            (r'(?<=^)(%)([^\n]*)(\n|\Z)',
+             bygroups(Name.Tag, using(PythonLexer), Other)),
+            (r"""(?sx)
+                 (.+?)               # anything, followed by:
+                 (?:
+                  (?<=\n)(?=[%#]) |  # an eval or comment line
+                  (?=</?[%&]) |      # a substitution or block or
+                                     # call start or end
+                                     # - don't consume
+                  (\\\n) |           # an escaped newline
+                  \Z                 # end of string
+                 )""", bygroups(Other, Operator)),
+        ]
+    }
+
+
+class MyghtyHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `MyghtyLexer` that highlights unlexed data
+    with the `HtmlLexer`.
+    """
+
+    name = 'HTML+Myghty'
+    aliases = ['html+myghty']
+    mimetypes = ['text/html+myghty']
+    url = 'http://www.myghty.org/'
+    version_added = '0.6'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, MyghtyLexer, **options)
+
+
+class MyghtyXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `MyghtyLexer` that highlights unlexed data
+    with the `XmlLexer`.
+    """
+
+    name = 'XML+Myghty'
+    aliases = ['xml+myghty']
+    mimetypes = ['application/xml+myghty']
+    url = 'http://www.myghty.org/'
+    version_added = '0.6'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, MyghtyLexer, **options)
+
+
+class MyghtyJavascriptLexer(DelegatingLexer):
+    """
+    Subclass of the `MyghtyLexer` that highlights unlexed data
+    with the `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Myghty'
+    aliases = ['javascript+myghty', 'js+myghty']
+    mimetypes = ['application/x-javascript+myghty',
+                 'text/x-javascript+myghty',
+                 'text/javascript+mygthy']
+    url = 'http://www.myghty.org/'
+    version_added = '0.6'
+
+    def __init__(self, **options):
+        super().__init__(JavascriptLexer, MyghtyLexer, **options)
+
+
+class MyghtyCssLexer(DelegatingLexer):
+    """
+    Subclass of the `MyghtyLexer` that highlights unlexed data
+    with the `CssLexer`.
+    """
+
+    name = 'CSS+Myghty'
+    aliases = ['css+myghty']
+    mimetypes = ['text/css+myghty']
+    url = 'http://www.myghty.org/'
+    version_added = '0.6'
+
+    def __init__(self, **options):
+        super().__init__(CssLexer, MyghtyLexer, **options)
+
+
+class MasonLexer(RegexLexer):
+    """
+    Generic mason templates lexer. Stolen from Myghty lexer. Code that isn't
+    Mason markup is HTML.
+    """
+    name = 'Mason'
+    url = 'http://www.masonhq.com/'
+    aliases = ['mason']
+    filenames = ['*.m', '*.mhtml', '*.mc', '*.mi', 'autohandler', 'dhandler']
+    mimetypes = ['application/x-mason']
+    version_added = '1.4'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'(?s)(<%doc>)(.*?)(</%doc>)',
+             bygroups(Name.Tag, Comment.Multiline, Name.Tag)),
+            (r'(?s)(<%(?:def|method))(\s*)(.*?)(>)(.*?)(</%\2\s*>)',
+             bygroups(Name.Tag, Whitespace, Name.Function, Name.Tag,
+                      using(this), Name.Tag)),
+            (r'(?s)(<%(\w+)(.*?)(>))(.*?)(</%\2\s*>)',
+             bygroups(Name.Tag, None, None, None, using(PerlLexer), Name.Tag)),
+            (r'(?s)(<&[^|])(.*?)(,.*?)?(&>)',
+             bygroups(Name.Tag, Name.Function, using(PerlLexer), Name.Tag)),
+            (r'(?s)(<&\|)(.*?)(,.*?)?(&>)',
+             bygroups(Name.Tag, Name.Function, using(PerlLexer), Name.Tag)),
+            (r'</&>', Name.Tag),
+            (r'(?s)(<%!?)(.*?)(%>)',
+             bygroups(Name.Tag, using(PerlLexer), Name.Tag)),
+            (r'(?<=^)#[^\n]*(\n|\Z)', Comment),
+            (r'(?<=^)(%)([^\n]*)(\n|\Z)',
+             bygroups(Name.Tag, using(PerlLexer), Other)),
+            (r"""(?sx)
+                 (.+?)               # anything, followed by:
+                 (?:
+                  (?<=\n)(?=[%#]) |  # an eval or comment line
+                  (?=</?[%&]) |      # a substitution or block or
+                                     # call start or end
+                                     # - don't consume
+                  (\\\n) |           # an escaped newline
+                  \Z                 # end of string
+                 )""", bygroups(using(HtmlLexer), Operator)),
+        ]
+    }
+
+    def analyse_text(text):
+        result = 0.0
+        if re.search(r'</%(class|doc|init)>', text) is not None:
+            result = 1.0
+        elif re.search(r'<&.+&>', text, re.DOTALL) is not None:
+            result = 0.11
+        return result
+
+
+class MakoLexer(RegexLexer):
+    """
+    Generic mako templates lexer. Code that isn't Mako
+    markup is yielded as `Token.Other`.
+    """
+
+    name = 'Mako'
+    url = 'http://www.makotemplates.org/'
+    aliases = ['mako']
+    filenames = ['*.mao']
+    mimetypes = ['application/x-mako']
+    version_added = '0.7'
+
+    tokens = {
+        'root': [
+            (r'(\s*)(%)(\s*end(?:\w+))(\n|\Z)',
+             bygroups(Text.Whitespace, Comment.Preproc, Keyword, Other)),
+            (r'(\s*)(%)([^\n]*)(\n|\Z)',
+             bygroups(Text.Whitespace, Comment.Preproc, using(PythonLexer), Other)),
+            (r'(\s*)(##[^\n]*)(\n|\Z)',
+             bygroups(Text.Whitespace, Comment.Single, Text.Whitespace)),
+            (r'(?s)<%doc>.*?</%doc>', Comment.Multiline),
+            (r'(<%)([\w.:]+)',
+             bygroups(Comment.Preproc, Name.Builtin), 'tag'),
+            (r'(</%)([\w.:]+)(>)',
+             bygroups(Comment.Preproc, Name.Builtin, Comment.Preproc)),
+            (r'<%(?=([\w.:]+))', Comment.Preproc, 'ondeftags'),
+            (r'(?s)(<%(?:!?))(.*?)(%>)',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            (r'(\$\{)(.*?)(\})',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            (r'''(?sx)
+                (.+?)                # anything, followed by:
+                (?:
+                 (?<=\n)(?=%|\#\#) | # an eval or comment line
+                 (?=\#\*) |          # multiline comment
+                 (?=</?%) |          # a python block
+                                     # call start or end
+                 (?=\$\{) |          # a substitution
+                 (?<=\n)(?=\s*%) |
+                                     # - don't consume
+                 (\\\n) |            # an escaped newline
+                 \Z                  # end of string
+                )
+            ''', bygroups(Other, Operator)),
+            (r'\s+', Text),
+        ],
+        'ondeftags': [
+            (r'<%', Comment.Preproc),
+            (r'(?<=<%)(include|inherit|namespace|page)', Name.Builtin),
+            include('tag'),
+        ],
+        'tag': [
+            (r'((?:\w+)\s*=)(\s*)(".*?")',
+             bygroups(Name.Attribute, Text, String)),
+            (r'/?\s*>', Comment.Preproc, '#pop'),
+            (r'\s+', Text),
+        ],
+        'attr': [
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
+
+
+class MakoHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `MakoLexer` that highlights unlexed data
+    with the `HtmlLexer`.
+    """
+
+    name = 'HTML+Mako'
+    aliases = ['html+mako']
+    mimetypes = ['text/html+mako']
+    url = 'http://www.makotemplates.org/'
+    version_added = '0.7'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, MakoLexer, **options)
+
+
+class MakoXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `MakoLexer` that highlights unlexed data
+    with the `XmlLexer`.
+    """
+
+    name = 'XML+Mako'
+    aliases = ['xml+mako']
+    mimetypes = ['application/xml+mako']
+    url = 'http://www.makotemplates.org/'
+    version_added = '0.7'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, MakoLexer, **options)
+
+
+class MakoJavascriptLexer(DelegatingLexer):
+    """
+    Subclass of the `MakoLexer` that highlights unlexed data
+    with the `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Mako'
+    aliases = ['javascript+mako', 'js+mako']
+    mimetypes = ['application/x-javascript+mako',
+                 'text/x-javascript+mako',
+                 'text/javascript+mako']
+    url = 'http://www.makotemplates.org/'
+    version_added = '0.7'
+
+    def __init__(self, **options):
+        super().__init__(JavascriptLexer, MakoLexer, **options)
+
+
+class MakoCssLexer(DelegatingLexer):
+    """
+    Subclass of the `MakoLexer` that highlights unlexed data
+    with the `CssLexer`.
+    """
+
+    name = 'CSS+Mako'
+    aliases = ['css+mako']
+    mimetypes = ['text/css+mako']
+    url = 'http://www.makotemplates.org/'
+    version_added = '0.7'
+
+    def __init__(self, **options):
+        super().__init__(CssLexer, MakoLexer, **options)
+
+
+# Genshi and Cheetah lexers courtesy of Matt Good.
+
+class CheetahPythonLexer(Lexer):
+    """
+    Lexer for handling Cheetah's special $ tokens in Python syntax.
+    """
+
+    def get_tokens_unprocessed(self, text):
+        pylexer = PythonLexer(**self.options)
+        for pos, type_, value in pylexer.get_tokens_unprocessed(text):
+            if type_ == Token.Error and value == '$':
+                type_ = Comment.Preproc
+            yield pos, type_, value
+
+
+class CheetahLexer(RegexLexer):
+    """
+    Generic cheetah templates lexer. Code that isn't Cheetah
+    markup is yielded as `Token.Other`.  This also works for
+    `spitfire templates`_ which use the same syntax.
+
+    .. _spitfire templates: http://code.google.com/p/spitfire/
+    """
+
+    name = 'Cheetah'
+    url = 'http://www.cheetahtemplate.org/'
+    aliases = ['cheetah', 'spitfire']
+    filenames = ['*.tmpl', '*.spt']
+    mimetypes = ['application/x-cheetah', 'application/x-spitfire']
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'(##[^\n]*)$',
+             (bygroups(Comment))),
+            (r'#[*](.|\n)*?[*]#', Comment),
+            (r'#end[^#\n]*(?:#|$)', Comment.Preproc),
+            (r'#slurp$', Comment.Preproc),
+            (r'(#[a-zA-Z]+)([^#\n]*)(#|$)',
+             (bygroups(Comment.Preproc, using(CheetahPythonLexer),
+                       Comment.Preproc))),
+            # TODO support other Python syntax like $foo['bar']
+            (r'(\$)([a-zA-Z_][\w.]*\w)',
+             bygroups(Comment.Preproc, using(CheetahPythonLexer))),
+            (r'(?s)(\$\{!?)(.*?)(\})',
+             bygroups(Comment.Preproc, using(CheetahPythonLexer),
+                      Comment.Preproc)),
+            (r'''(?sx)
+                (.+?)               # anything, followed by:
+                (?:
+                 (?=\#[#a-zA-Z]*) | # an eval comment
+                 (?=\$[a-zA-Z_{]) | # a substitution
+                 \Z                 # end of string
+                )
+            ''', Other),
+            (r'\s+', Text),
+        ],
+    }
+
+
+class CheetahHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `CheetahLexer` that highlights unlexed data
+    with the `HtmlLexer`.
+    """
+
+    name = 'HTML+Cheetah'
+    aliases = ['html+cheetah', 'html+spitfire', 'htmlcheetah']
+    mimetypes = ['text/html+cheetah', 'text/html+spitfire']
+    url = 'http://www.cheetahtemplate.org/'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, CheetahLexer, **options)
+
+
+class CheetahXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `CheetahLexer` that highlights unlexed data
+    with the `XmlLexer`.
+    """
+
+    name = 'XML+Cheetah'
+    aliases = ['xml+cheetah', 'xml+spitfire']
+    mimetypes = ['application/xml+cheetah', 'application/xml+spitfire']
+    url = 'http://www.cheetahtemplate.org/'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, CheetahLexer, **options)
+
+
+class CheetahJavascriptLexer(DelegatingLexer):
+    """
+    Subclass of the `CheetahLexer` that highlights unlexed data
+    with the `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Cheetah'
+    aliases = ['javascript+cheetah', 'js+cheetah',
+               'javascript+spitfire', 'js+spitfire']
+    mimetypes = ['application/x-javascript+cheetah',
+                 'text/x-javascript+cheetah',
+                 'text/javascript+cheetah',
+                 'application/x-javascript+spitfire',
+                 'text/x-javascript+spitfire',
+                 'text/javascript+spitfire']
+    url = 'http://www.cheetahtemplate.org/'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(JavascriptLexer, CheetahLexer, **options)
+
+
+class GenshiTextLexer(RegexLexer):
+    """
+    A lexer that highlights genshi text templates.
+    """
+
+    name = 'Genshi Text'
+    url = 'https://genshi.edgewall.org/'
+    aliases = ['genshitext']
+    mimetypes = ['application/x-genshi-text', 'text/x-genshi']
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'[^#$\s]+', Other),
+            (r'^(\s*)(##.*)$', bygroups(Text, Comment)),
+            (r'^(\s*)(#)', bygroups(Text, Comment.Preproc), 'directive'),
+            include('variable'),
+            (r'[#$\s]', Other),
+        ],
+        'directive': [
+            (r'\n', Text, '#pop'),
+            (r'(?:def|for|if)\s+.*', using(PythonLexer), '#pop'),
+            (r'(choose|when|with)([^\S\n]+)(.*)',
+             bygroups(Keyword, Text, using(PythonLexer)), '#pop'),
+            (r'(choose|otherwise)\b', Keyword, '#pop'),
+            (r'(end\w*)([^\S\n]*)(.*)', bygroups(Keyword, Text, Comment), '#pop'),
+        ],
+        'variable': [
+            (r'(?<!\$)(\$\{)(.+?)(\})',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            (r'(?<!\$)(\$)([a-zA-Z_][\w.]*)',
+             Name.Variable),
+        ]
+    }
+
+
+class GenshiMarkupLexer(RegexLexer):
+    """
+    Base lexer for Genshi markup, used by `HtmlGenshiLexer` and
+    `GenshiLexer`.
+    """
+
+    flags = re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'[^<$]+', Other),
+            (r'(<\?python)(.*?)(\?>)',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            # yield style and script blocks as Other
+            (r'<\s*(script|style)\s*.*?>.*?<\s*/\1\s*>', Other),
+            (r'<\s*py:[a-zA-Z0-9]+', Name.Tag, 'pytag'),
+            (r'<\s*[a-zA-Z0-9:.]+', Name.Tag, 'tag'),
+            include('variable'),
+            (r'[<$]', Other),
+        ],
+        'pytag': [
+            (r'\s+', Text),
+            (r'[\w:-]+\s*=', Name.Attribute, 'pyattr'),
+            (r'/?\s*>', Name.Tag, '#pop'),
+        ],
+        'pyattr': [
+            ('(")(.*?)(")', bygroups(String, using(PythonLexer), String), '#pop'),
+            ("(')(.*?)(')", bygroups(String, using(PythonLexer), String), '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+        'tag': [
+            (r'\s+', Text),
+            (r'py:[\w-]+\s*=', Name.Attribute, 'pyattr'),
+            (r'[\w:-]+\s*=', Name.Attribute, 'attr'),
+            (r'/?\s*>', Name.Tag, '#pop'),
+        ],
+        'attr': [
+            ('"', String, 'attr-dstring'),
+            ("'", String, 'attr-sstring'),
+            (r'[^\s>]*', String, '#pop')
+        ],
+        'attr-dstring': [
+            ('"', String, '#pop'),
+            include('strings'),
+            ("'", String)
+        ],
+        'attr-sstring': [
+            ("'", String, '#pop'),
+            include('strings'),
+            ("'", String)
+        ],
+        'strings': [
+            ('[^"\'$]+', String),
+            include('variable')
+        ],
+        'variable': [
+            (r'(?<!\$)(\$\{)(.+?)(\})',
+             bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)),
+            (r'(?<!\$)(\$)([a-zA-Z_][\w\.]*)',
+             Name.Variable),
+        ]
+    }
+
+
+class HtmlGenshiLexer(DelegatingLexer):
+    """
+    A lexer that highlights `genshi <https://genshi.edgewall.org/>`_ and
+    `kid <http://kid-templating.org/>`_ kid HTML templates.
+    """
+
+    name = 'HTML+Genshi'
+    aliases = ['html+genshi', 'html+kid']
+    version_added = ''
+    alias_filenames = ['*.html', '*.htm', '*.xhtml']
+    mimetypes = ['text/html+genshi']
+    url = 'https://genshi.edgewall.org/'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, GenshiMarkupLexer, **options)
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search(r'\$\{.*?\}', text) is not None:
+            rv += 0.2
+        if re.search(r'py:(.*?)=["\']', text) is not None:
+            rv += 0.2
+        return rv + HtmlLexer.analyse_text(text) - 0.01
+
+
+class GenshiLexer(DelegatingLexer):
+    """
+    A lexer that highlights `genshi <https://genshi.edgewall.org/>`_ and
+    `kid <http://kid-templating.org/>`_ kid XML templates.
+    """
+
+    name = 'Genshi'
+    aliases = ['genshi', 'kid', 'xml+genshi', 'xml+kid']
+    filenames = ['*.kid']
+    version_added = ''
+    alias_filenames = ['*.xml']
+    mimetypes = ['application/x-genshi', 'application/x-kid']
+    url = 'https://genshi.edgewall.org/'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, GenshiMarkupLexer, **options)
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search(r'\$\{.*?\}', text) is not None:
+            rv += 0.2
+        if re.search(r'py:(.*?)=["\']', text) is not None:
+            rv += 0.2
+        return rv + XmlLexer.analyse_text(text) - 0.01
+
+
+class JavascriptGenshiLexer(DelegatingLexer):
+    """
+    A lexer that highlights javascript code in genshi text templates.
+    """
+
+    name = 'JavaScript+Genshi Text'
+    aliases = ['js+genshitext', 'js+genshi', 'javascript+genshitext',
+               'javascript+genshi']
+    version_added = ''
+    alias_filenames = ['*.js']
+    mimetypes = ['application/x-javascript+genshi',
+                 'text/x-javascript+genshi',
+                 'text/javascript+genshi']
+    url = 'https://genshi.edgewall.org'
+
+    def __init__(self, **options):
+        super().__init__(JavascriptLexer, GenshiTextLexer, **options)
+
+    def analyse_text(text):
+        return GenshiLexer.analyse_text(text) - 0.05
+
+
+class CssGenshiLexer(DelegatingLexer):
+    """
+    A lexer that highlights CSS definitions in genshi text templates.
+    """
+
+    name = 'CSS+Genshi Text'
+    aliases = ['css+genshitext', 'css+genshi']
+    version_added = ''
+    alias_filenames = ['*.css']
+    mimetypes = ['text/css+genshi']
+    url = 'https://genshi.edgewall.org'
+
+    def __init__(self, **options):
+        super().__init__(CssLexer, GenshiTextLexer, **options)
+
+    def analyse_text(text):
+        return GenshiLexer.analyse_text(text) - 0.05
+
+
+class RhtmlLexer(DelegatingLexer):
+    """
+    Subclass of the ERB lexer that highlights the unlexed data with the
+    html lexer.
+
+    Nested Javascript and CSS is highlighted too.
+    """
+
+    name = 'RHTML'
+    aliases = ['rhtml', 'html+erb', 'html+ruby']
+    filenames = ['*.rhtml']
+    version_added = ''
+    alias_filenames = ['*.html', '*.htm', '*.xhtml']
+    mimetypes = ['text/html+ruby']
+    url = 'https://github.com/ruby/erb'
+
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, ErbLexer, **options)
+
+    def analyse_text(text):
+        rv = ErbLexer.analyse_text(text) - 0.01
+        if html_doctype_matches(text):
+            # one more than the XmlErbLexer returns
+            rv += 0.5
+        return rv
+
+
+class XmlErbLexer(DelegatingLexer):
+    """
+    Subclass of `ErbLexer` which highlights data outside preprocessor
+    directives with the `XmlLexer`.
+    """
+
+    name = 'XML+Ruby'
+    aliases = ['xml+ruby', 'xml+erb']
+    version_added = ''
+    alias_filenames = ['*.xml']
+    mimetypes = ['application/xml+ruby']
+    url = 'https://github.com/ruby/erb'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, ErbLexer, **options)
+
+    def analyse_text(text):
+        rv = ErbLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class CssErbLexer(DelegatingLexer):
+    """
+    Subclass of `ErbLexer` which highlights unlexed data with the `CssLexer`.
+    """
+
+    name = 'CSS+Ruby'
+    aliases = ['css+ruby', 'css+erb']
+    version_added = ''
+    alias_filenames = ['*.css']
+    mimetypes = ['text/css+ruby']
+    url = 'https://github.com/ruby/erb'
+
+    def __init__(self, **options):
+        super().__init__(CssLexer, ErbLexer, **options)
+
+    def analyse_text(text):
+        return ErbLexer.analyse_text(text) - 0.05
+
+
+class JavascriptErbLexer(DelegatingLexer):
+    """
+    Subclass of `ErbLexer` which highlights unlexed data with the
+    `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Ruby'
+    aliases = ['javascript+ruby', 'js+ruby', 'javascript+erb', 'js+erb']
+    version_added = ''
+    alias_filenames = ['*.js']
+    mimetypes = ['application/x-javascript+ruby',
+                 'text/x-javascript+ruby',
+                 'text/javascript+ruby']
+    url = 'https://github.com/ruby/erb'
+
+    def __init__(self, **options):
+        super().__init__(JavascriptLexer, ErbLexer, **options)
+
+    def analyse_text(text):
+        return ErbLexer.analyse_text(text) - 0.05
+
+
+class HtmlPhpLexer(DelegatingLexer):
+    """
+    Subclass of `PhpLexer` that highlights unhandled data with the `HtmlLexer`.
+
+    Nested Javascript and CSS is highlighted too.
+    """
+
+    name = 'HTML+PHP'
+    aliases = ['html+php']
+    filenames = ['*.phtml']
+    version_added = ''
+    alias_filenames = ['*.php', '*.html', '*.htm', '*.xhtml',
+                       '*.php[345]']
+    mimetypes = ['application/x-php',
+                 'application/x-httpd-php', 'application/x-httpd-php3',
+                 'application/x-httpd-php4', 'application/x-httpd-php5']
+    url = 'https://www.php.net'
+
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, PhpLexer, **options)
+
+    def analyse_text(text):
+        rv = PhpLexer.analyse_text(text) - 0.01
+        if html_doctype_matches(text):
+            rv += 0.5
+        return rv
+
+
+class XmlPhpLexer(DelegatingLexer):
+    """
+    Subclass of `PhpLexer` that highlights unhandled data with the `XmlLexer`.
+    """
+
+    name = 'XML+PHP'
+    aliases = ['xml+php']
+    version_added = ''
+    alias_filenames = ['*.xml', '*.php', '*.php[345]']
+    mimetypes = ['application/xml+php']
+    url = 'https://www.php.net'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, PhpLexer, **options)
+
+    def analyse_text(text):
+        rv = PhpLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class CssPhpLexer(DelegatingLexer):
+    """
+    Subclass of `PhpLexer` which highlights unmatched data with the `CssLexer`.
+    """
+
+    name = 'CSS+PHP'
+    aliases = ['css+php']
+    version_added = ''
+    alias_filenames = ['*.css']
+    mimetypes = ['text/css+php']
+    url = 'https://www.php.net'
+
+    def __init__(self, **options):
+        super().__init__(CssLexer, PhpLexer, **options)
+
+    def analyse_text(text):
+        return PhpLexer.analyse_text(text) - 0.05
+
+
+class JavascriptPhpLexer(DelegatingLexer):
+    """
+    Subclass of `PhpLexer` which highlights unmatched data with the
+    `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+PHP'
+    aliases = ['javascript+php', 'js+php']
+    version_added = ''
+    alias_filenames = ['*.js']
+    mimetypes = ['application/x-javascript+php',
+                 'text/x-javascript+php',
+                 'text/javascript+php']
+    url = 'https://www.php.net'
+
+    def __init__(self, **options):
+        super().__init__(JavascriptLexer, PhpLexer, **options)
+
+    def analyse_text(text):
+        return PhpLexer.analyse_text(text)
+
+
+class HtmlSmartyLexer(DelegatingLexer):
+    """
+    Subclass of the `SmartyLexer` that highlights unlexed data with the
+    `HtmlLexer`.
+
+    Nested Javascript and CSS is highlighted too.
+    """
+
+    name = 'HTML+Smarty'
+    aliases = ['html+smarty']
+    version_added = ''
+    alias_filenames = ['*.html', '*.htm', '*.xhtml', '*.tpl']
+    mimetypes = ['text/html+smarty']
+    url = 'https://www.smarty.net/'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, SmartyLexer, **options)
+
+    def analyse_text(text):
+        rv = SmartyLexer.analyse_text(text) - 0.01
+        if html_doctype_matches(text):
+            rv += 0.5
+        return rv
+
+
+class XmlSmartyLexer(DelegatingLexer):
+    """
+    Subclass of the `SmartyLexer` that highlights unlexed data with the
+    `XmlLexer`.
+    """
+
+    name = 'XML+Smarty'
+    aliases = ['xml+smarty']
+    version_added = ''
+    alias_filenames = ['*.xml', '*.tpl']
+    mimetypes = ['application/xml+smarty']
+    url = 'https://www.smarty.net/'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, SmartyLexer, **options)
+
+    def analyse_text(text):
+        rv = SmartyLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class CssSmartyLexer(DelegatingLexer):
+    """
+    Subclass of the `SmartyLexer` that highlights unlexed data with the
+    `CssLexer`.
+    """
+
+    name = 'CSS+Smarty'
+    aliases = ['css+smarty']
+    version_added = ''
+    alias_filenames = ['*.css', '*.tpl']
+    mimetypes = ['text/css+smarty']
+    url = 'https://www.smarty.net/'
+
+    def __init__(self, **options):
+        super().__init__(CssLexer, SmartyLexer, **options)
+
+    def analyse_text(text):
+        return SmartyLexer.analyse_text(text) - 0.05
+
+
+class JavascriptSmartyLexer(DelegatingLexer):
+    """
+    Subclass of the `SmartyLexer` that highlights unlexed data with the
+    `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Smarty'
+    aliases = ['javascript+smarty', 'js+smarty']
+    version_added = ''
+    alias_filenames = ['*.js', '*.tpl']
+    mimetypes = ['application/x-javascript+smarty',
+                 'text/x-javascript+smarty',
+                 'text/javascript+smarty']
+    url = 'https://www.smarty.net/'
+
+    def __init__(self, **options):
+        super().__init__(JavascriptLexer, SmartyLexer, **options)
+
+    def analyse_text(text):
+        return SmartyLexer.analyse_text(text) - 0.05
+
+
+class HtmlDjangoLexer(DelegatingLexer):
+    """
+    Subclass of the `DjangoLexer` that highlights unlexed data with the
+    `HtmlLexer`.
+
+    Nested Javascript and CSS is highlighted too.
+    """
+
+    name = 'HTML+Django/Jinja'
+    aliases = ['html+django', 'html+jinja', 'htmldjango']
+    filenames = ['*.html.j2', '*.htm.j2', '*.xhtml.j2', '*.html.jinja2', '*.htm.jinja2', '*.xhtml.jinja2']
+    version_added = ''
+    alias_filenames = ['*.html', '*.htm', '*.xhtml']
+    mimetypes = ['text/html+django', 'text/html+jinja']
+    url = 'https://www.djangoproject.com/documentation/templates'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, DjangoLexer, **options)
+
+    def analyse_text(text):
+        rv = DjangoLexer.analyse_text(text) - 0.01
+        if html_doctype_matches(text):
+            rv += 0.5
+        return rv
+
+
+class XmlDjangoLexer(DelegatingLexer):
+    """
+    Subclass of the `DjangoLexer` that highlights unlexed data with the
+    `XmlLexer`.
+    """
+
+    name = 'XML+Django/Jinja'
+    aliases = ['xml+django', 'xml+jinja']
+    filenames = ['*.xml.j2', '*.xml.jinja2']
+    version_added = ''
+    alias_filenames = ['*.xml']
+    mimetypes = ['application/xml+django', 'application/xml+jinja']
+    url = 'https://www.djangoproject.com/documentation/templates'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, DjangoLexer, **options)
+
+    def analyse_text(text):
+        rv = DjangoLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class CssDjangoLexer(DelegatingLexer):
+    """
+    Subclass of the `DjangoLexer` that highlights unlexed data with the
+    `CssLexer`.
+    """
+
+    name = 'CSS+Django/Jinja'
+    aliases = ['css+django', 'css+jinja']
+    filenames = ['*.css.j2', '*.css.jinja2']
+    version_added = ''
+    alias_filenames = ['*.css']
+    mimetypes = ['text/css+django', 'text/css+jinja']
+    url = 'https://www.djangoproject.com/documentation/templates'
+
+    def __init__(self, **options):
+        super().__init__(CssLexer, DjangoLexer, **options)
+
+    def analyse_text(text):
+        return DjangoLexer.analyse_text(text) - 0.05
+
+
+class JavascriptDjangoLexer(DelegatingLexer):
+    """
+    Subclass of the `DjangoLexer` that highlights unlexed data with the
+    `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Django/Jinja'
+    aliases = ['javascript+django', 'js+django',
+               'javascript+jinja', 'js+jinja']
+    filenames = ['*.js.j2', '*.js.jinja2']
+    version_added = ''
+    alias_filenames = ['*.js']
+    mimetypes = ['application/x-javascript+django',
+                 'application/x-javascript+jinja',
+                 'text/x-javascript+django',
+                 'text/x-javascript+jinja',
+                 'text/javascript+django',
+                 'text/javascript+jinja']
+    url = 'https://www.djangoproject.com/documentation/templates'
+
+    def __init__(self, **options):
+        super().__init__(JavascriptLexer, DjangoLexer, **options)
+
+    def analyse_text(text):
+        return DjangoLexer.analyse_text(text) - 0.05
+
+
+class JspRootLexer(RegexLexer):
+    """
+    Base for the `JspLexer`. Yields `Token.Other` for area outside of
+    JSP tags.
+
+    .. versionadded:: 0.7
+    """
+
+    tokens = {
+        'root': [
+            (r'<%\S?', Keyword, 'sec'),
+            # FIXME: I want to make these keywords but still parse attributes.
+            (r'</?jsp:(forward|getProperty|include|plugin|setProperty|useBean).*?>',
+             Keyword),
+            (r'[^<]+', Other),
+            (r'<', Other),
+        ],
+        'sec': [
+            (r'%>', Keyword, '#pop'),
+            # note: '\w\W' != '.' without DOTALL.
+            (r'[\w\W]+?(?=%>|\Z)', using(JavaLexer)),
+        ],
+    }
+
+
+class JspLexer(DelegatingLexer):
+    """
+    Lexer for Java Server Pages.
+    """
+    name = 'Java Server Page'
+    aliases = ['jsp']
+    filenames = ['*.jsp']
+    mimetypes = ['application/x-jsp']
+    url = 'https://projects.eclipse.org/projects/ee4j.jsp'
+    version_added = '0.7'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, JspRootLexer, **options)
+
+    def analyse_text(text):
+        rv = JavaLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        if '<%' in text and '%>' in text:
+            rv += 0.1
+        return rv
+
+
+class EvoqueLexer(RegexLexer):
+    """
+    For files using the Evoque templating system.
+    """
+    name = 'Evoque'
+    aliases = ['evoque']
+    filenames = ['*.evoque']
+    mimetypes = ['application/x-evoque']
+    url = 'https://gizmojo.org/templating'
+    version_added = '1.1'
+
+    flags = re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'[^#$]+', Other),
+            (r'#\[', Comment.Multiline, 'comment'),
+            (r'\$\$', Other),
+            # svn keywords
+            (r'\$\w+:[^$\n]*\$', Comment.Multiline),
+            # directives: begin, end
+            (r'(\$)(begin|end)(\{(%)?)(.*?)((?(4)%)\})',
+             bygroups(Punctuation, Name.Builtin, Punctuation, None,
+                      String, Punctuation)),
+            # directives: evoque, overlay
+            # see doc for handling first name arg: /directives/evoque/
+            # + minor inconsistency: the "name" in e.g. $overlay{name=site_base}
+            # should be using(PythonLexer), not passed out as String
+            (r'(\$)(evoque|overlay)(\{(%)?)(\s*[#\w\-"\'.]+)?'
+             r'(.*?)((?(4)%)\})',
+             bygroups(Punctuation, Name.Builtin, Punctuation, None,
+                      String, using(PythonLexer), Punctuation)),
+            # directives: if, for, prefer, test
+            (r'(\$)(\w+)(\{(%)?)(.*?)((?(4)%)\})',
+             bygroups(Punctuation, Name.Builtin, Punctuation, None,
+                      using(PythonLexer), Punctuation)),
+            # directive clauses (no {} expression)
+            (r'(\$)(else|rof|fi)', bygroups(Punctuation, Name.Builtin)),
+            # expressions
+            (r'(\$\{(%)?)(.*?)((!)(.*?))?((?(2)%)\})',
+             bygroups(Punctuation, None, using(PythonLexer),
+                      Name.Builtin, None, None, Punctuation)),
+            (r'#', Other),
+        ],
+        'comment': [
+            (r'[^\]#]', Comment.Multiline),
+            (r'#\[', Comment.Multiline, '#push'),
+            (r'\]#', Comment.Multiline, '#pop'),
+            (r'[\]#]', Comment.Multiline)
+        ],
+    }
+
+    def analyse_text(text):
+        """Evoque templates use $evoque, which is unique."""
+        if '$evoque' in text:
+            return 1
+
+class EvoqueHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `EvoqueLexer` that highlights unlexed data with the
+    `HtmlLexer`.
+    """
+    name = 'HTML+Evoque'
+    aliases = ['html+evoque']
+    alias_filenames = ['*.html']
+    mimetypes = ['text/html+evoque']
+    url = 'https://gizmojo.org/templating'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, EvoqueLexer, **options)
+
+    def analyse_text(text):
+        return EvoqueLexer.analyse_text(text)
+
+
+class EvoqueXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `EvoqueLexer` that highlights unlexed data with the
+    `XmlLexer`.
+    """
+    name = 'XML+Evoque'
+    aliases = ['xml+evoque']
+    alias_filenames = ['*.xml']
+    mimetypes = ['application/xml+evoque']
+    url = 'https://gizmojo.org/templating'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, EvoqueLexer, **options)
+
+    def analyse_text(text):
+        return EvoqueLexer.analyse_text(text)
+
+
+class ColdfusionLexer(RegexLexer):
+    """
+    Coldfusion statements
+    """
+    name = 'cfstatement'
+    aliases = ['cfs']
+    filenames = []
+    mimetypes = []
+    url = 'https://www.adobe.com/products/coldfusion-family.html'
+    version_added = ''
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'//.*?\n', Comment.Single),
+            (r'/\*(?:.|\n)*?\*/', Comment.Multiline),
+            (r'\+\+|--', Operator),
+            (r'[-+*/^&=!]', Operator),
+            (r'<=|>=|<|>|==', Operator),
+            (r'mod\b', Operator),
+            (r'(eq|lt|gt|lte|gte|not|is|and|or)\b', Operator),
+            (r'\|\||&&', Operator),
+            (r'\?', Operator),
+            (r'"', String.Double, 'string'),
+            # There is a special rule for allowing html in single quoted
+            # strings, evidently.
+            (r"'.*?'", String.Single),
+            (r'\d+', Number),
+            (r'(if|else|len|var|xml|default|break|switch|component|property|function|do|'
+             r'try|catch|in|continue|for|return|while|required|any|array|binary|boolean|'
+             r'component|date|guid|numeric|query|string|struct|uuid|case)\b', Keyword),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(application|session|client|cookie|super|this|variables|arguments)\b',
+             Name.Constant),
+            (r'([a-z_$][\w.]*)(\s*)(\()',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'[a-z_$][\w.]*', Name.Variable),
+            (r'[()\[\]{};:,.\\]', Punctuation),
+            (r'\s+', Text),
+        ],
+        'string': [
+            (r'""', String.Double),
+            (r'#.+?#', String.Interp),
+            (r'[^"#]+', String.Double),
+            (r'#', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+    }
+
+
+class ColdfusionMarkupLexer(RegexLexer):
+    """
+    Coldfusion markup only
+    """
+    name = 'Coldfusion'
+    aliases = ['cf']
+    filenames = []
+    mimetypes = []
+    url = 'https://www.adobe.com/products/coldfusion-family.html'
+
+    tokens = {
+        'root': [
+            (r'[^<]+', Other),
+            include('tags'),
+            (r'<[^<>]*', Other),
+        ],
+        'tags': [
+            (r'<!---', Comment.Multiline, 'cfcomment'),
+            (r'(?s)<!--.*?-->', Comment),
+            (r'<cfoutput.*?>', Name.Builtin, 'cfoutput'),
+            (r'(?s)(<cfscript.*?>)(.+?)(</cfscript.*?>)',
+             bygroups(Name.Builtin, using(ColdfusionLexer), Name.Builtin)),
+            # negative lookbehind is for strings with embedded >
+            (r'(?s)(</?cf(?:component|include|if|else|elseif|loop|return|'
+             r'dbinfo|dump|abort|location|invoke|throw|file|savecontent|'
+             r'mailpart|mail|header|content|zip|image|lock|argument|try|'
+             r'catch|break|directory|http|set|function|param)\b)(.*?)((?<!\\)>)',
+             bygroups(Name.Builtin, using(ColdfusionLexer), Name.Builtin)),
+        ],
+        'cfoutput': [
+            (r'[^#<]+', Other),
+            (r'(#)(.*?)(#)', bygroups(Punctuation, using(ColdfusionLexer),
+                                      Punctuation)),
+            # (r'<cfoutput.*?>', Name.Builtin, '#push'),
+            (r'</cfoutput.*?>', Name.Builtin, '#pop'),
+            include('tags'),
+            (r'(?s)<[^<>]*', Other),
+            (r'#', Other),
+        ],
+        'cfcomment': [
+            (r'<!---', Comment.Multiline, '#push'),
+            (r'--->', Comment.Multiline, '#pop'),
+            (r'([^<-]|<(?!!---)|-(?!-->))+', Comment.Multiline),
+        ],
+    }
+
+
+class ColdfusionHtmlLexer(DelegatingLexer):
+    """
+    Coldfusion markup in html
+    """
+    name = 'Coldfusion HTML'
+    aliases = ['cfm']
+    filenames = ['*.cfm', '*.cfml']
+    mimetypes = ['application/x-coldfusion']
+    url = 'https://www.adobe.com/products/coldfusion-family.html'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, ColdfusionMarkupLexer, **options)
+
+
+class ColdfusionCFCLexer(DelegatingLexer):
+    """
+    Coldfusion markup/script components
+    """
+    name = 'Coldfusion CFC'
+    aliases = ['cfc']
+    filenames = ['*.cfc']
+    mimetypes = []
+    url = 'https://www.adobe.com/products/coldfusion-family.html'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        super().__init__(ColdfusionHtmlLexer, ColdfusionLexer, **options)
+
+
+class SspLexer(DelegatingLexer):
+    """
+    Lexer for Scalate Server Pages.
+    """
+    name = 'Scalate Server Page'
+    aliases = ['ssp']
+    filenames = ['*.ssp']
+    mimetypes = ['application/x-ssp']
+    url = 'https://scalate.github.io/scalate/'
+    version_added = '1.4'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, JspRootLexer, **options)
+
+    def analyse_text(text):
+        rv = 0.0
+        if re.search(r'val \w+\s*:', text):
+            rv += 0.6
+        if looks_like_xml(text):
+            rv += 0.2
+        if '<%' in text and '%>' in text:
+            rv += 0.1
+        return rv
+
+
+class TeaTemplateRootLexer(RegexLexer):
+    """
+    Base for the `TeaTemplateLexer`. Yields `Token.Other` for area outside of
+    code blocks.
+
+    .. versionadded:: 1.5
+    """
+
+    tokens = {
+        'root': [
+            (r'<%\S?', Keyword, 'sec'),
+            (r'[^<]+', Other),
+            (r'<', Other),
+        ],
+        'sec': [
+            (r'%>', Keyword, '#pop'),
+            # note: '\w\W' != '.' without DOTALL.
+            (r'[\w\W]+?(?=%>|\Z)', using(TeaLangLexer)),
+        ],
+    }
+
+
+class TeaTemplateLexer(DelegatingLexer):
+    """
+    Lexer for Tea Templates.
+    """
+    name = 'Tea'
+    aliases = ['tea']
+    filenames = ['*.tea']
+    mimetypes = ['text/x-tea']
+    url = 'https://github.com/teatrove/teatrove'
+    version_added = '1.5'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, TeaTemplateRootLexer, **options)
+
+    def analyse_text(text):
+        rv = TeaLangLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        if '<%' in text and '%>' in text:
+            rv += 0.1
+        return rv
+
+
+class LassoHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `LassoLexer` which highlights unhandled data with the
+    `HtmlLexer`.
+
+    Nested JavaScript and CSS is also highlighted.
+    """
+
+    name = 'HTML+Lasso'
+    aliases = ['html+lasso']
+    version_added = '1.6'
+    alias_filenames = ['*.html', '*.htm', '*.xhtml', '*.lasso', '*.lasso[89]',
+                       '*.incl', '*.inc', '*.las']
+    mimetypes = ['text/html+lasso',
+                 'application/x-httpd-lasso',
+                 'application/x-httpd-lasso[89]']
+    url = 'https://www.lassosoft.com'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, LassoLexer, **options)
+
+    def analyse_text(text):
+        rv = LassoLexer.analyse_text(text) - 0.01
+        if html_doctype_matches(text):  # same as HTML lexer
+            rv += 0.5
+        return rv
+
+
+class LassoXmlLexer(DelegatingLexer):
+    """
+    Subclass of the `LassoLexer` which highlights unhandled data with the
+    `XmlLexer`.
+    """
+
+    name = 'XML+Lasso'
+    aliases = ['xml+lasso']
+    version_added = '1.6'
+    alias_filenames = ['*.xml', '*.lasso', '*.lasso[89]',
+                       '*.incl', '*.inc', '*.las']
+    mimetypes = ['application/xml+lasso']
+    url = 'https://www.lassosoft.com'
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, LassoLexer, **options)
+
+    def analyse_text(text):
+        rv = LassoLexer.analyse_text(text) - 0.01
+        if looks_like_xml(text):
+            rv += 0.4
+        return rv
+
+
+class LassoCssLexer(DelegatingLexer):
+    """
+    Subclass of the `LassoLexer` which highlights unhandled data with the
+    `CssLexer`.
+    """
+
+    name = 'CSS+Lasso'
+    aliases = ['css+lasso']
+    version_added = '1.6'
+    alias_filenames = ['*.css']
+    mimetypes = ['text/css+lasso']
+    url = 'https://www.lassosoft.com'
+
+    def __init__(self, **options):
+        options['requiredelimiters'] = True
+        super().__init__(CssLexer, LassoLexer, **options)
+
+    def analyse_text(text):
+        rv = LassoLexer.analyse_text(text) - 0.05
+        if re.search(r'\w+:[^;]+;', text):
+            rv += 0.1
+        if 'padding:' in text:
+            rv += 0.1
+        return rv
+
+
+class LassoJavascriptLexer(DelegatingLexer):
+    """
+    Subclass of the `LassoLexer` which highlights unhandled data with the
+    `JavascriptLexer`.
+    """
+
+    name = 'JavaScript+Lasso'
+    aliases = ['javascript+lasso', 'js+lasso']
+    version_added = '1.6'
+    alias_filenames = ['*.js']
+    mimetypes = ['application/x-javascript+lasso',
+                 'text/x-javascript+lasso',
+                 'text/javascript+lasso']
+    url = 'https://www.lassosoft.com'
+
+    def __init__(self, **options):
+        options['requiredelimiters'] = True
+        super().__init__(JavascriptLexer, LassoLexer, **options)
+
+    def analyse_text(text):
+        rv = LassoLexer.analyse_text(text) - 0.05
+        return rv
+
+
+class HandlebarsLexer(RegexLexer):
+    """
+    Generic handlebars template lexer.
+
+    Highlights only the Handlebars template tags (stuff between `{{` and `}}`).
+    Everything else is left for a delegating lexer.
+    """
+
+    name = "Handlebars"
+    url = 'https://handlebarsjs.com/'
+    aliases = ['handlebars']
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            (r'[^{]+', Other),
+
+            # Comment start {{!  }} or {{!--
+            (r'\{\{!.*\}\}', Comment),
+
+            # HTML Escaping open {{{expression
+            (r'(\{\{\{)(\s*)', bygroups(Comment.Special, Text), 'tag'),
+
+            # {{blockOpen {{#blockOpen {{/blockClose with optional tilde ~
+            (r'(\{\{)([#~/]+)([^\s}]*)',
+             bygroups(Comment.Preproc, Number.Attribute, Number.Attribute), 'tag'),
+            (r'(\{\{)(\s*)', bygroups(Comment.Preproc, Text), 'tag'),
+        ],
+
+        'tag': [
+            (r'\s+', Text),
+            # HTML Escaping close }}}
+            (r'\}\}\}', Comment.Special, '#pop'),
+            # blockClose}}, includes optional tilde ~
+            (r'(~?)(\}\})', bygroups(Number, Comment.Preproc), '#pop'),
+
+            # {{opt=something}}
+            (r'([^\s}]+)(=)', bygroups(Name.Attribute, Operator)),
+
+            # Partials {{> ...}}
+            (r'(>)(\s*)(@partial-block)', bygroups(Keyword, Text, Keyword)),
+            (r'(#?>)(\s*)([\w-]+)', bygroups(Keyword, Text, Name.Variable)),
+            (r'(>)(\s*)(\()', bygroups(Keyword, Text, Punctuation),
+             'dynamic-partial'),
+
+            include('generic'),
+        ],
+        'dynamic-partial': [
+            (r'\s+', Text),
+            (r'\)', Punctuation, '#pop'),
+
+            (r'(lookup)(\s+)(\.|this)(\s+)', bygroups(Keyword, Text,
+                                                      Name.Variable, Text)),
+            (r'(lookup)(\s+)(\S+)', bygroups(Keyword, Text,
+                                             using(this, state='variable'))),
+            (r'[\w-]+', Name.Function),
+
+            include('generic'),
+        ],
+        'variable': [
+            (r'[()/@a-zA-Z][\w-]*', Name.Variable),
+            (r'\.[\w-]+', Name.Variable),
+            (r'(this\/|\.\/|(\.\.\/)+)[\w-]+', Name.Variable),
+        ],
+        'generic': [
+            include('variable'),
+
+            # borrowed from DjangoLexer
+            (r':?"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r":?'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+        ]
+    }
+
+
+class HandlebarsHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `HandlebarsLexer` that highlights unlexed data with the
+    `HtmlLexer`.
+    """
+
+    name = "HTML+Handlebars"
+    aliases = ["html+handlebars"]
+    filenames = ['*.handlebars', '*.hbs']
+    mimetypes = ['text/html+handlebars', 'text/x-handlebars-template']
+    url = 'https://handlebarsjs.com/'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, HandlebarsLexer, **options)
+
+
+class YamlJinjaLexer(DelegatingLexer):
+    """
+    Subclass of the `DjangoLexer` that highlights unlexed data with the
+    `YamlLexer`.
+
+    Commonly used in Saltstack salt states.
+    """
+
+    name = 'YAML+Jinja'
+    aliases = ['yaml+jinja', 'salt', 'sls']
+    filenames = ['*.sls', '*.yaml.j2', '*.yml.j2', '*.yaml.jinja2', '*.yml.jinja2']
+    mimetypes = ['text/x-yaml+jinja', 'text/x-sls']
+    url = 'https://jinja.palletsprojects.com'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        super().__init__(YamlLexer, DjangoLexer, **options)
+
+
+class LiquidLexer(RegexLexer):
+    """
+    Lexer for Liquid templates.
+    """
+    name = 'liquid'
+    url = 'https://www.rubydoc.info/github/Shopify/liquid'
+    aliases = ['liquid']
+    filenames = ['*.liquid']
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            (r'[^{]+', Text),
+            # tags and block tags
+            (r'(\{%)(\s*)', bygroups(Punctuation, Whitespace), 'tag-or-block'),
+            # output tags
+            (r'(\{\{)(\s*)([^\s}]+)',
+             bygroups(Punctuation, Whitespace, using(this, state = 'generic')),
+             'output'),
+            (r'\{', Text)
+        ],
+
+        'tag-or-block': [
+            # builtin logic blocks
+            (r'(if|unless|elsif|case)(?=\s+)', Keyword.Reserved, 'condition'),
+            (r'(when)(\s+)', bygroups(Keyword.Reserved, Whitespace),
+             combined('end-of-block', 'whitespace', 'generic')),
+            (r'(else)(\s*)(%\})',
+             bygroups(Keyword.Reserved, Whitespace, Punctuation), '#pop'),
+
+            # other builtin blocks
+            (r'(capture)(\s+)([^\s%]+)(\s*)(%\})',
+             bygroups(Name.Tag, Whitespace, using(this, state = 'variable'),
+                      Whitespace, Punctuation), '#pop'),
+            (r'(comment)(\s*)(%\})',
+             bygroups(Name.Tag, Whitespace, Punctuation), 'comment'),
+            (r'(raw)(\s*)(%\})',
+             bygroups(Name.Tag, Whitespace, Punctuation), 'raw'),
+
+            # end of block
+            (r'(end(case|unless|if))(\s*)(%\})',
+             bygroups(Keyword.Reserved, None, Whitespace, Punctuation), '#pop'),
+            (r'(end([^\s%]+))(\s*)(%\})',
+             bygroups(Name.Tag, None, Whitespace, Punctuation), '#pop'),
+
+            # builtin tags (assign and include are handled together with usual tags)
+            (r'(cycle)(\s+)(?:([^\s:]*)(:))?(\s*)',
+             bygroups(Name.Tag, Whitespace,
+                      using(this, state='generic'), Punctuation, Whitespace),
+             'variable-tag-markup'),
+
+            # other tags or blocks
+            (r'([^\s%]+)(\s*)', bygroups(Name.Tag, Whitespace), 'tag-markup')
+        ],
+
+        'output': [
+            include('whitespace'),
+            (r'\}\}', Punctuation, '#pop'),  # end of output
+
+            (r'\|', Punctuation, 'filters')
+        ],
+
+        'filters': [
+            include('whitespace'),
+            (r'\}\}', Punctuation, ('#pop', '#pop')),  # end of filters and output
+
+            (r'([^\s|:]+)(:?)(\s*)',
+             bygroups(Name.Function, Punctuation, Whitespace), 'filter-markup')
+        ],
+
+        'filter-markup': [
+            (r'\|', Punctuation, '#pop'),
+            include('end-of-tag'),
+            include('default-param-markup')
+        ],
+
+        'condition': [
+            include('end-of-block'),
+            include('whitespace'),
+
+            (r'([^\s=!><]+)(\s*)([=!><]=?)(\s*)(\S+)(\s*)(%\})',
+             bygroups(using(this, state = 'generic'), Whitespace, Operator,
+                      Whitespace, using(this, state = 'generic'), Whitespace,
+                      Punctuation)),
+            (r'\b!', Operator),
+            (r'\bnot\b', Operator.Word),
+            (r'([\w.\'"]+)(\s+)(contains)(\s+)([\w.\'"]+)',
+             bygroups(using(this, state = 'generic'), Whitespace, Operator.Word,
+                      Whitespace, using(this, state = 'generic'))),
+
+            include('generic'),
+            include('whitespace')
+        ],
+
+        'generic-value': [
+            include('generic'),
+            include('end-at-whitespace')
+        ],
+
+        'operator': [
+            (r'(\s*)((=|!|>|<)=?)(\s*)',
+             bygroups(Whitespace, Operator, None, Whitespace), '#pop'),
+            (r'(\s*)(\bcontains\b)(\s*)',
+             bygroups(Whitespace, Operator.Word, Whitespace), '#pop'),
+        ],
+
+        'end-of-tag': [
+            (r'\}\}', Punctuation, '#pop')
+        ],
+
+        'end-of-block': [
+            (r'%\}', Punctuation, ('#pop', '#pop'))
+        ],
+
+        'end-at-whitespace': [
+            (r'\s+', Whitespace, '#pop')
+        ],
+
+        # states for unknown markup
+        'param-markup': [
+            include('whitespace'),
+            # params with colons or equals
+            (r'([^\s=:]+)(\s*)(=|:)',
+             bygroups(Name.Attribute, Whitespace, Operator)),
+            # explicit variables
+            (r'(\{\{)(\s*)([^\s}])(\s*)(\}\})',
+             bygroups(Punctuation, Whitespace, using(this, state = 'variable'),
+                      Whitespace, Punctuation)),
+
+            include('string'),
+            include('number'),
+            include('keyword'),
+            (r',', Punctuation)
+        ],
+
+        'default-param-markup': [
+            include('param-markup'),
+            (r'.', Text)  # fallback for switches / variables / un-quoted strings / ...
+        ],
+
+        'variable-param-markup': [
+            include('param-markup'),
+            include('variable'),
+            (r'.', Text)  # fallback
+        ],
+
+        'tag-markup': [
+            (r'%\}', Punctuation, ('#pop', '#pop')),  # end of tag
+            include('default-param-markup')
+        ],
+
+        'variable-tag-markup': [
+            (r'%\}', Punctuation, ('#pop', '#pop')),  # end of tag
+            include('variable-param-markup')
+        ],
+
+        # states for different values types
+        'keyword': [
+            (r'\b(false|true)\b', Keyword.Constant)
+        ],
+
+        'variable': [
+            (r'[a-zA-Z_]\w*', Name.Variable),
+            (r'(?<=\w)\.(?=\w)', Punctuation)
+        ],
+
+        'string': [
+            (r"'[^']*'", String.Single),
+            (r'"[^"]*"', String.Double)
+        ],
+
+        'number': [
+            (r'\d+\.\d+', Number.Float),
+            (r'\d+', Number.Integer)
+        ],
+
+        'generic': [  # decides for variable, string, keyword or number
+            include('keyword'),
+            include('string'),
+            include('number'),
+            include('variable')
+        ],
+
+        'whitespace': [
+            (r'[ \t]+', Whitespace)
+        ],
+
+        # states for builtin blocks
+        'comment': [
+            (r'(\{%)(\s*)(endcomment)(\s*)(%\})',
+             bygroups(Punctuation, Whitespace, Name.Tag, Whitespace,
+                      Punctuation), ('#pop', '#pop')),
+            (r'.', Comment)
+        ],
+
+        'raw': [
+            (r'[^{]+', Text),
+            (r'(\{%)(\s*)(endraw)(\s*)(%\})',
+             bygroups(Punctuation, Whitespace, Name.Tag, Whitespace,
+                      Punctuation), '#pop'),
+            (r'\{', Text)
+        ],
+    }
+
+
+class TwigLexer(RegexLexer):
+    """
+    Twig template lexer.
+
+    It just highlights Twig code between the preprocessor directives,
+    other data is left untouched by the lexer.
+    """
+
+    name = 'Twig'
+    aliases = ['twig']
+    mimetypes = ['application/x-twig']
+    url = 'https://twig.symfony.com'
+    version_added = '2.0'
+
+    flags = re.M | re.S
+
+    # Note that a backslash is included in the following two patterns
+    # PHP uses a backslash as a namespace separator
+    _ident_char = r'[\\\w-]|[^\x00-\x7f]'
+    _ident_begin = r'(?:[\\_a-z]|[^\x00-\x7f])'
+    _ident_end = r'(?:' + _ident_char + ')*'
+    _ident_inner = _ident_begin + _ident_end
+
+    tokens = {
+        'root': [
+            (r'[^{]+', Other),
+            (r'\{\{', Comment.Preproc, 'var'),
+            # twig comments
+            (r'\{\#.*?\#\}', Comment),
+            # raw twig blocks
+            (r'(\{%)(-?\s*)(raw)(\s*-?)(%\})(.*?)'
+             r'(\{%)(-?\s*)(endraw)(\s*-?)(%\})',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Comment.Preproc,
+                      Other, Comment.Preproc, Text, Keyword, Text,
+                      Comment.Preproc)),
+            (r'(\{%)(-?\s*)(verbatim)(\s*-?)(%\})(.*?)'
+             r'(\{%)(-?\s*)(endverbatim)(\s*-?)(%\})',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Comment.Preproc,
+                      Other, Comment.Preproc, Text, Keyword, Text,
+                      Comment.Preproc)),
+            # filter blocks
+            (rf'(\{{%)(-?\s*)(filter)(\s+)({_ident_inner})',
+             bygroups(Comment.Preproc, Text, Keyword, Text, Name.Function),
+             'tag'),
+            (r'(\{%)(-?\s*)([a-zA-Z_]\w*)',
+             bygroups(Comment.Preproc, Text, Keyword), 'tag'),
+            (r'\{', Other),
+        ],
+        'varnames': [
+            (rf'(\|)(\s*)({_ident_inner})',
+             bygroups(Operator, Text, Name.Function)),
+            (rf'(is)(\s+)(not)?(\s*)({_ident_inner})',
+             bygroups(Keyword, Text, Keyword, Text, Name.Function)),
+            (r'(?i)(true|false|none|null)\b', Keyword.Pseudo),
+            (r'(in|not|and|b-and|or|b-or|b-xor|is'
+             r'if|elseif|else|import'
+             r'constant|defined|divisibleby|empty|even|iterable|odd|sameas'
+             r'matches|starts\s+with|ends\s+with)\b',
+             Keyword),
+            (r'(loop|block|parent)\b', Name.Builtin),
+            (_ident_inner, Name.Variable),
+            (r'\.' + _ident_inner, Name.Variable),
+            (r'\.[0-9]+', Number),
+            (r':?"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r":?'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'([{}()\[\]+\-*/,:~%]|\.\.|\?|:|\*\*|\/\/|!=|[><=]=?)', Operator),
+            (r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+        ],
+        'var': [
+            (r'\s+', Text),
+            (r'(-?)(\}\})', bygroups(Text, Comment.Preproc), '#pop'),
+            include('varnames')
+        ],
+        'tag': [
+            (r'\s+', Text),
+            (r'(-?)(%\})', bygroups(Text, Comment.Preproc), '#pop'),
+            include('varnames'),
+            (r'.', Punctuation),
+        ],
+    }
+
+
+class TwigHtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `TwigLexer` that highlights unlexed data with the
+    `HtmlLexer`.
+    """
+
+    name = "HTML+Twig"
+    aliases = ["html+twig"]
+    filenames = ['*.twig']
+    mimetypes = ['text/html+twig']
+    url = 'https://twig.symfony.com'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, TwigLexer, **options)
+
+
+class Angular2Lexer(RegexLexer):
+    """
+    Generic angular2 template lexer.
+
+    Highlights only the Angular template tags (stuff between `{{` and `}}` and
+    special attributes: '(event)=', '[property]=', '[(twoWayBinding)]=').
+    Everything else is left for a delegating lexer.
+    """
+
+    name = "Angular2"
+    url = 'https://angular.io/guide/template-syntax'
+    aliases = ['ng2']
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            (r'[^{([*#]+', Other),
+
+            # {{meal.name}}
+            (r'(\{\{)(\s*)', bygroups(Comment.Preproc, Text), 'ngExpression'),
+
+            # (click)="deleteOrder()"; [value]="test"; [(twoWayTest)]="foo.bar"
+            (r'([([]+)([\w:.-]+)([\])]+)(\s*)(=)(\s*)',
+             bygroups(Punctuation, Name.Attribute, Punctuation, Text, Operator, Text),
+             'attr'),
+            (r'([([]+)([\w:.-]+)([\])]+)(\s*)',
+             bygroups(Punctuation, Name.Attribute, Punctuation, Text)),
+
+            # *ngIf="..."; #f="ngForm"
+            (r'([*#])([\w:.-]+)(\s*)(=)(\s*)',
+             bygroups(Punctuation, Name.Attribute, Text, Operator, Text), 'attr'),
+            (r'([*#])([\w:.-]+)(\s*)',
+             bygroups(Punctuation, Name.Attribute, Text)),
+        ],
+
+        'ngExpression': [
+            (r'\s+(\|\s+)?', Text),
+            (r'\}\}', Comment.Preproc, '#pop'),
+
+            # Literals
+            (r':?(true|false)', String.Boolean),
+            (r':?"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r":?'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|"
+             r"0[xX][0-9a-fA-F]+[Ll]?", Number),
+
+            # Variabletext
+            (r'[a-zA-Z][\w-]*(\(.*\))?', Name.Variable),
+            (r'\.[\w-]+(\(.*\))?', Name.Variable),
+
+            # inline If
+            (r'(\?)(\s*)([^}\s]+)(\s*)(:)(\s*)([^}\s]+)(\s*)',
+             bygroups(Operator, Text, String, Text, Operator, Text, String, Text)),
+        ],
+        'attr': [
+            ('".*?"', String, '#pop'),
+            ("'.*?'", String, '#pop'),
+            (r'[^\s>]+', String, '#pop'),
+        ],
+    }
+
+
+class Angular2HtmlLexer(DelegatingLexer):
+    """
+    Subclass of the `Angular2Lexer` that highlights unlexed data with the
+    `HtmlLexer`.
+    """
+
+    name = "HTML + Angular2"
+    aliases = ["html+ng2"]
+    filenames = ['*.ng2']
+    url = 'https://angular.io/guide/template-syntax'
+    version_added = '2.0'
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, Angular2Lexer, **options)
+
+
+class SqlJinjaLexer(DelegatingLexer):
+    """
+    Templated SQL lexer.
+    """
+
+    name = 'SQL+Jinja'
+    aliases = ['sql+jinja']
+    filenames = ['*.sql', '*.sql.j2', '*.sql.jinja2']
+    url = 'https://jinja.palletsprojects.com'
+    version_added = '2.13'
+
+    def __init__(self, **options):
+        super().__init__(SqlLexer, DjangoLexer, **options)
+
+    def analyse_text(text):
+        rv = 0.0
+        # dbt's ref function
+        if re.search(r'\{\{\s*ref\(.*\)\s*\}\}', text):
+            rv += 0.4
+        # dbt's source function
+        if re.search(r'\{\{\s*source\(.*\)\s*\}\}', text):
+            rv += 0.25
+        # Jinja macro
+        if re.search(r'\{%-?\s*macro \w+\(.*\)\s*-?%\}', text):
+            rv += 0.15
+        return rv
diff --git a/.venv/Lib/site-packages/pygments/lexers/teraterm.py b/.venv/Lib/site-packages/pygments/lexers/teraterm.py
new file mode 100644 (file)
index 0000000..a2c2980
--- /dev/null
@@ -0,0 +1,325 @@
+"""
+    pygments.lexers.teraterm
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Tera Term macro files.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Text, Comment, Operator, Name, String, \
+    Number, Keyword, Error
+
+__all__ = ['TeraTermLexer']
+
+
+class TeraTermLexer(RegexLexer):
+    """
+    For Tera Term macro source code.
+    """
+    name = 'Tera Term macro'
+    url = 'https://ttssh2.osdn.jp/'
+    aliases = ['teratermmacro', 'teraterm', 'ttl']
+    filenames = ['*.ttl']
+    mimetypes = ['text/x-teratermmacro']
+    version_added = '2.4'
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('labels'),
+            include('commands'),
+            include('builtin-variables'),
+            include('user-variables'),
+            include('operators'),
+            include('numeric-literals'),
+            include('string-literals'),
+            include('all-whitespace'),
+            (r'\S', Text),
+        ],
+        'comments': [
+            (r';[^\r\n]*', Comment.Single),
+            (r'/\*', Comment.Multiline, 'in-comment'),
+        ],
+        'in-comment': [
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[^*/]+', Comment.Multiline),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'labels': [
+            (r'(?i)^(\s*)(:[a-z0-9_]+)', bygroups(Text.Whitespace, Name.Label)),
+        ],
+        'commands': [
+            (
+                r'(?i)\b('
+                r'basename|'
+                r'beep|'
+                r'bplusrecv|'
+                r'bplussend|'
+                r'break|'
+                r'bringupbox|'
+                # 'call' is handled separately.
+                r'callmenu|'
+                r'changedir|'
+                r'checksum16|'
+                r'checksum16file|'
+                r'checksum32|'
+                r'checksum32file|'
+                r'checksum8|'
+                r'checksum8file|'
+                r'clearscreen|'
+                r'clipb2var|'
+                r'closesbox|'
+                r'closett|'
+                r'code2str|'
+                r'connect|'
+                r'continue|'
+                r'crc16|'
+                r'crc16file|'
+                r'crc32|'
+                r'crc32file|'
+                r'cygconnect|'
+                r'delpassword|'
+                r'dirname|'
+                r'dirnamebox|'
+                r'disconnect|'
+                r'dispstr|'
+                r'do|'
+                r'else|'
+                r'elseif|'
+                r'enablekeyb|'
+                r'end|'
+                r'endif|'
+                r'enduntil|'
+                r'endwhile|'
+                r'exec|'
+                r'execcmnd|'
+                r'exit|'
+                r'expandenv|'
+                r'fileclose|'
+                r'fileconcat|'
+                r'filecopy|'
+                r'filecreate|'
+                r'filedelete|'
+                r'filelock|'
+                r'filemarkptr|'
+                r'filenamebox|'
+                r'fileopen|'
+                r'fileread|'
+                r'filereadln|'
+                r'filerename|'
+                r'filesearch|'
+                r'fileseek|'
+                r'fileseekback|'
+                r'filestat|'
+                r'filestrseek|'
+                r'filestrseek2|'
+                r'filetruncate|'
+                r'fileunlock|'
+                r'filewrite|'
+                r'filewriteln|'
+                r'findclose|'
+                r'findfirst|'
+                r'findnext|'
+                r'flushrecv|'
+                r'foldercreate|'
+                r'folderdelete|'
+                r'foldersearch|'
+                r'for|'
+                r'getdate|'
+                r'getdir|'
+                r'getenv|'
+                r'getfileattr|'
+                r'gethostname|'
+                r'getipv4addr|'
+                r'getipv6addr|'
+                r'getmodemstatus|'
+                r'getpassword|'
+                r'getspecialfolder|'
+                r'gettime|'
+                r'gettitle|'
+                r'getttdir|'
+                r'getver|'
+                # 'goto' is handled separately.
+                r'if|'
+                r'ifdefined|'
+                r'include|'
+                r'inputbox|'
+                r'int2str|'
+                r'intdim|'
+                r'ispassword|'
+                r'kmtfinish|'
+                r'kmtget|'
+                r'kmtrecv|'
+                r'kmtsend|'
+                r'listbox|'
+                r'loadkeymap|'
+                r'logautoclosemode|'
+                r'logclose|'
+                r'loginfo|'
+                r'logopen|'
+                r'logpause|'
+                r'logrotate|'
+                r'logstart|'
+                r'logwrite|'
+                r'loop|'
+                r'makepath|'
+                r'messagebox|'
+                r'mpause|'
+                r'next|'
+                r'passwordbox|'
+                r'pause|'
+                r'quickvanrecv|'
+                r'quickvansend|'
+                r'random|'
+                r'recvln|'
+                r'regexoption|'
+                r'restoresetup|'
+                r'return|'
+                r'rotateleft|'
+                r'rotateright|'
+                r'scprecv|'
+                r'scpsend|'
+                r'send|'
+                r'sendbreak|'
+                r'sendbroadcast|'
+                r'sendfile|'
+                r'sendkcode|'
+                r'sendln|'
+                r'sendlnbroadcast|'
+                r'sendlnmulticast|'
+                r'sendmulticast|'
+                r'setbaud|'
+                r'setdate|'
+                r'setdebug|'
+                r'setdir|'
+                r'setdlgpos|'
+                r'setdtr|'
+                r'setecho|'
+                r'setenv|'
+                r'setexitcode|'
+                r'setfileattr|'
+                r'setflowctrl|'
+                r'setmulticastname|'
+                r'setpassword|'
+                r'setrts|'
+                r'setspeed|'
+                r'setsync|'
+                r'settime|'
+                r'settitle|'
+                r'show|'
+                r'showtt|'
+                r'sprintf|'
+                r'sprintf2|'
+                r'statusbox|'
+                r'str2code|'
+                r'str2int|'
+                r'strcompare|'
+                r'strconcat|'
+                r'strcopy|'
+                r'strdim|'
+                r'strinsert|'
+                r'strjoin|'
+                r'strlen|'
+                r'strmatch|'
+                r'strremove|'
+                r'strreplace|'
+                r'strscan|'
+                r'strspecial|'
+                r'strsplit|'
+                r'strtrim|'
+                r'testlink|'
+                r'then|'
+                r'tolower|'
+                r'toupper|'
+                r'unlink|'
+                r'until|'
+                r'uptime|'
+                r'var2clipb|'
+                r'wait|'
+                r'wait4all|'
+                r'waitevent|'
+                r'waitln|'
+                r'waitn|'
+                r'waitrecv|'
+                r'waitregex|'
+                r'while|'
+                r'xmodemrecv|'
+                r'xmodemsend|'
+                r'yesnobox|'
+                r'ymodemrecv|'
+                r'ymodemsend|'
+                r'zmodemrecv|'
+                r'zmodemsend'
+                r')\b',
+                Keyword,
+            ),
+            (r'(?i)(call|goto)([ \t]+)([a-z0-9_]+)',
+             bygroups(Keyword, Text.Whitespace, Name.Label)),
+        ],
+        'builtin-variables': [
+            (
+                r'(?i)('
+                r'groupmatchstr1|'
+                r'groupmatchstr2|'
+                r'groupmatchstr3|'
+                r'groupmatchstr4|'
+                r'groupmatchstr5|'
+                r'groupmatchstr6|'
+                r'groupmatchstr7|'
+                r'groupmatchstr8|'
+                r'groupmatchstr9|'
+                r'inputstr|'
+                r'matchstr|'
+                r'mtimeout|'
+                r'param1|'
+                r'param2|'
+                r'param3|'
+                r'param4|'
+                r'param5|'
+                r'param6|'
+                r'param7|'
+                r'param8|'
+                r'param9|'
+                r'paramcnt|'
+                r'params|'
+                r'result|'
+                r'timeout'
+                r')\b',
+                Name.Builtin
+            ),
+        ],
+        'user-variables': [
+            (r'(?i)[a-z_][a-z0-9_]*', Name.Variable),
+        ],
+        'numeric-literals': [
+            (r'(-?)([0-9]+)', bygroups(Operator, Number.Integer)),
+            (r'(?i)\$[0-9a-f]+', Number.Hex),
+        ],
+        'string-literals': [
+            (r'(?i)#(?:[0-9]+|\$[0-9a-f]+)', String.Char),
+            (r"'[^'\n]*'", String.Single),
+            (r'"[^"\n]*"', String.Double),
+            # Opening quotes without a closing quote on the same line are errors.
+            (r"('[^']*)(\n)", bygroups(Error, Text.Whitespace)),
+            (r'("[^"]*)(\n)', bygroups(Error, Text.Whitespace)),
+        ],
+        'operators': [
+            (r'and|not|or|xor', Operator.Word),
+            (r'[!%&*+<=>^~\|\/-]+', Operator),
+            (r'[()]', String.Symbol),
+        ],
+        'all-whitespace': [
+            (r'\s+', Text.Whitespace),
+        ],
+    }
+
+    # Turtle and Tera Term macro files share the same file extension
+    # but each has a recognizable and distinct syntax.
+    def analyse_text(text):
+        if re.search(TeraTermLexer.tokens['commands'][0][0], text):
+            return 0.01
diff --git a/.venv/Lib/site-packages/pygments/lexers/testing.py b/.venv/Lib/site-packages/pygments/lexers/testing.py
new file mode 100644 (file)
index 0000000..e6c5926
--- /dev/null
@@ -0,0 +1,209 @@
+"""
+    pygments.lexers.testing
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for testing languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Comment, Keyword, Name, String, Number, Generic, Text
+
+__all__ = ['GherkinLexer', 'TAPLexer']
+
+
+class GherkinLexer(RegexLexer):
+    """
+    For Gherkin syntax.
+    """
+    name = 'Gherkin'
+    aliases = ['gherkin', 'cucumber']
+    filenames = ['*.feature']
+    mimetypes = ['text/x-gherkin']
+    url = 'https://cucumber.io/docs/gherkin'
+    version_added = '1.2'
+
+    feature_keywords = '^(기능|機能|功能|フィーチャ|خاصية|תכונה|Функціонал|Функционалност|Функционал|Фича|Особина|Могућност|Özellik|Właściwość|Tính năng|Trajto|Savybė|Požiadavka|Požadavek|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Fīča|Funzionalità|Funktionalität|Funkcionalnost|Funkcionalitāte|Funcționalitate|Functionaliteit|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Feature|Egenskap|Egenskab|Crikey|Característica|Arwedd)(:)(.*)$'
+    feature_element_keywords = '^(\\s*)(시나리오 개요|시나리오|배경|背景|場景大綱|場景|场景大纲|场景|劇本大綱|劇本|剧本大纲|剧本|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|シナリオ|سيناريو مخطط|سيناريو|الخلفية|תרחיש|תבנית תרחיש|רקע|Тарих|Сценарій|Сценарио|Сценарий структураси|Сценарий|Структура сценарію|Структура сценарија|Структура сценария|Скица|Рамка на сценарий|Пример|Предыстория|Предистория|Позадина|Передумова|Основа|Концепт|Контекст|Założenia|Wharrimean is|Tình huống|The thing of it is|Tausta|Taust|Tapausaihio|Tapaus|Szenariogrundriss|Szenario|Szablon scenariusza|Stsenaarium|Struktura scenarija|Skica|Skenario konsep|Skenario|Situācija|Senaryo taslağı|Senaryo|Scénář|Scénario|Schema dello scenario|Scenārijs pēc parauga|Scenārijs|Scenár|Scenaro|Scenariusz|Scenariul de şablon|Scenariul de sablon|Scenariu|Scenario Outline|Scenario Amlinellol|Scenario|Scenarijus|Scenarijaus šablonas|Scenarij|Scenarie|Rerefons|Raamstsenaarium|Primer|Pozadí|Pozadina|Pozadie|Plan du scénario|Plan du Scénario|Osnova scénáře|Osnova|Náčrt Scénáře|Náčrt Scenáru|Mate|MISHUN SRSLY|MISHUN|Kịch bản|Konturo de la scenaro|Kontext|Konteksts|Kontekstas|Kontekst|Koncept|Khung tình huống|Khung kịch bản|Háttér|Grundlage|Geçmiş|Forgatókönyv vázlat|Forgatókönyv|Fono|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l\'escenari|Escenario|Escenari|Dis is what went down|Dasar|Contexto|Contexte|Contesto|Condiţii|Conditii|Cenário|Cenario|Cefndir|Bối cảnh|Blokes|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|All y\'all|Achtergrond|Abstrakt Scenario|Abstract Scenario)(:)(.*)$'
+    examples_keywords = '^(\\s*)(예|例子|例|サンプル|امثلة|דוגמאות|Сценарији|Примери|Приклади|Мисоллар|Значения|Örnekler|Voorbeelden|Variantai|Tapaukset|Scenarios|Scenariji|Scenarijai|Příklady|Példák|Príklady|Przykłady|Primjeri|Primeri|Piemēri|Pavyzdžiai|Paraugs|Juhtumid|Exemplos|Exemples|Exemplele|Exempel|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|EXAMPLZ|Dữ liệu|Contoh|Cobber|Beispiele)(:)(.*)$'
+    step_keywords = '^(\\s*)(하지만|조건|먼저|만일|만약|단|그리고|그러면|那麼|那么|而且|當|当|前提|假設|假设|假如|假定|但是|但し|並且|并且|同時|同时|もし|ならば|ただし|しかし|かつ|و |متى |لكن |عندما |ثم |بفرض |اذاً |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Унда |То |Припустимо, що |Припустимо |Онда |Но |Нехай |Лекин |Когато |Када |Кад |К тому же |И |Задато |Задати |Задате |Если |Допустим |Дадено |Ва |Бирок |Аммо |Али |Але |Агар |А |І |Și |És |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Youse know when youse got |Youse know like when |Yna |Ya know how |Ya gotta |Y |Wun |Wtedy |When y\'all |When |Wenn |WEN |Và |Ve |Und |Un |Thì |Then y\'all |Then |Tapi |Tak |Tada |Tad |Så |Stel |Soit |Siis |Si |Sed |Se |Quando |Quand |Quan |Pryd |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Når |När |Niin |Nhưng |N |Mutta |Men |Mas |Maka |Majd |Mais |Maar |Ma |Lorsque |Lorsqu\'|Kun |Kuid |Kui |Khi |Keď |Ketika |Když |Kaj |Kai |Kada |Kad |Jeżeli |Ja |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y\'all |Given |Gitt |Gegeven |Gegeben sei |Fakat |Eğer ki |Etant donné |Et |Então |Entonces |Entao |En |Eeldades |E |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Dengan |Den youse gotta |De |Dato |Dar |Dann |Dan |Dado |Dacă |Daca |DEN |Când |Cuando |Cho |Cept |Cand |Cal |But y\'all |But |Buh |Biết |Bet |BUT |Atès |Atunci |Atesa |Anrhegedig a |Angenommen |And y\'all |And |An |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Aber |AN |A také |A |\\* )'
+
+    tokens = {
+        'comments': [
+            (r'^\s*#.*$', Comment),
+        ],
+        'feature_elements': [
+            (step_keywords, Keyword, "step_content_stack"),
+            include('comments'),
+            (r"(\s|.)", Name.Function),
+        ],
+        'feature_elements_on_stack': [
+            (step_keywords, Keyword, "#pop:2"),
+            include('comments'),
+            (r"(\s|.)", Name.Function),
+        ],
+        'examples_table': [
+            (r"\s+\|", Keyword, 'examples_table_header'),
+            include('comments'),
+            (r"(\s|.)", Name.Function),
+        ],
+        'examples_table_header': [
+            (r"\s+\|\s*$", Keyword, "#pop:2"),
+            include('comments'),
+            (r"\\\|", Name.Variable),
+            (r"\s*\|", Keyword),
+            (r"[^|]", Name.Variable),
+        ],
+        'scenario_sections_on_stack': [
+            (feature_element_keywords,
+             bygroups(Name.Function, Keyword, Keyword, Name.Function),
+             "feature_elements_on_stack"),
+        ],
+        'narrative': [
+            include('scenario_sections_on_stack'),
+            include('comments'),
+            (r"(\s|.)", Name.Function),
+        ],
+        'table_vars': [
+            (r'(<[^>]+>)', Name.Variable),
+        ],
+        'numbers': [
+            (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', String),
+        ],
+        'string': [
+            include('table_vars'),
+            (r'(\s|.)', String),
+        ],
+        'py_string': [
+            (r'"""', Keyword, "#pop"),
+            include('string'),
+        ],
+        'step_content_root': [
+            (r"$", Keyword, "#pop"),
+            include('step_content'),
+        ],
+        'step_content_stack': [
+            (r"$", Keyword, "#pop:2"),
+            include('step_content'),
+        ],
+        'step_content': [
+            (r'"', Name.Function, "double_string"),
+            include('table_vars'),
+            include('numbers'),
+            include('comments'),
+            (r'(\s|.)', Name.Function),
+        ],
+        'table_content': [
+            (r"\s+\|\s*$", Keyword, "#pop"),
+            include('comments'),
+            (r"\\\|", String),
+            (r"\s*\|", Keyword),
+            include('string'),
+        ],
+        'double_string': [
+            (r'"', Name.Function, "#pop"),
+            include('string'),
+        ],
+        'root': [
+            (r'\n', Name.Function),
+            include('comments'),
+            (r'"""', Keyword, "py_string"),
+            (r'\s+\|', Keyword, 'table_content'),
+            (r'"', Name.Function, "double_string"),
+            include('table_vars'),
+            include('numbers'),
+            (r'(\s*)(@[^@\r\n\t ]+)', bygroups(Name.Function, Name.Tag)),
+            (step_keywords, bygroups(Name.Function, Keyword),
+             'step_content_root'),
+            (feature_keywords, bygroups(Keyword, Keyword, Name.Function),
+             'narrative'),
+            (feature_element_keywords,
+             bygroups(Name.Function, Keyword, Keyword, Name.Function),
+             'feature_elements'),
+            (examples_keywords,
+             bygroups(Name.Function, Keyword, Keyword, Name.Function),
+             'examples_table'),
+            (r'(\s|.)', Name.Function),
+        ]
+    }
+
+    def analyse_text(self, text):
+        return
+
+
+class TAPLexer(RegexLexer):
+    """
+    For Test Anything Protocol (TAP) output.
+    """
+    name = 'TAP'
+    url = 'https://testanything.org/'
+    aliases = ['tap']
+    filenames = ['*.tap']
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            # A TAP version may be specified.
+            (r'^TAP version \d+\n', Name.Namespace),
+
+            # Specify a plan with a plan line.
+            (r'^1\.\.\d+', Keyword.Declaration, 'plan'),
+
+            # A test failure
+            (r'^(not ok)([^\S\n]*)(\d*)',
+             bygroups(Generic.Error, Text, Number.Integer), 'test'),
+
+            # A test success
+            (r'^(ok)([^\S\n]*)(\d*)',
+             bygroups(Keyword.Reserved, Text, Number.Integer), 'test'),
+
+            # Diagnostics start with a hash.
+            (r'^#.*\n', Comment),
+
+            # TAP's version of an abort statement.
+            (r'^Bail out!.*\n', Generic.Error),
+
+            # TAP ignores any unrecognized lines.
+            (r'^.*\n', Text),
+        ],
+        'plan': [
+            # Consume whitespace (but not newline).
+            (r'[^\S\n]+', Text),
+
+            # A plan may have a directive with it.
+            (r'#', Comment, 'directive'),
+
+            # Or it could just end.
+            (r'\n', Comment, '#pop'),
+
+            # Anything else is wrong.
+            (r'.*\n', Generic.Error, '#pop'),
+        ],
+        'test': [
+            # Consume whitespace (but not newline).
+            (r'[^\S\n]+', Text),
+
+            # A test may have a directive with it.
+            (r'#', Comment, 'directive'),
+
+            (r'\S+', Text),
+
+            (r'\n', Text, '#pop'),
+        ],
+        'directive': [
+            # Consume whitespace (but not newline).
+            (r'[^\S\n]+', Comment),
+
+            # Extract todo items.
+            (r'(?i)\bTODO\b', Comment.Preproc),
+
+            # Extract skip items.
+            (r'(?i)\bSKIP\S*', Comment.Preproc),
+
+            (r'\S+', Comment),
+
+            (r'\n', Comment, '#pop:2'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/text.py b/.venv/Lib/site-packages/pygments/lexers/text.py
new file mode 100644 (file)
index 0000000..f552478
--- /dev/null
@@ -0,0 +1,27 @@
+"""
+    pygments.lexers.text
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for non-source code file types.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# ruff: noqa: F401
+from pygments.lexers.configs import ApacheConfLexer, NginxConfLexer, \
+    SquidConfLexer, LighttpdConfLexer, IniLexer, RegeditLexer, PropertiesLexer, \
+    UnixConfigLexer
+from pygments.lexers.console import PyPyLogLexer
+from pygments.lexers.textedit import VimLexer
+from pygments.lexers.markup import BBCodeLexer, MoinWikiLexer, RstLexer, \
+    TexLexer, GroffLexer
+from pygments.lexers.installers import DebianControlLexer, DebianSourcesLexer, SourcesListLexer
+from pygments.lexers.make import MakefileLexer, BaseMakefileLexer, CMakeLexer
+from pygments.lexers.haxe import HxmlLexer
+from pygments.lexers.sgf import SmartGameFormatLexer
+from pygments.lexers.diff import DiffLexer, DarcsPatchLexer
+from pygments.lexers.data import YamlLexer
+from pygments.lexers.textfmts import IrcLogsLexer, GettextLexer, HttpLexer
+
+__all__ = []
diff --git a/.venv/Lib/site-packages/pygments/lexers/textedit.py b/.venv/Lib/site-packages/pygments/lexers/textedit.py
new file mode 100644 (file)
index 0000000..ea6a0a9
--- /dev/null
@@ -0,0 +1,205 @@
+"""
+    pygments.lexers.textedit
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for languages related to text processing.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+from bisect import bisect
+
+from pygments.lexer import RegexLexer, bygroups, default, include, this, using
+from pygments.lexers.python import PythonLexer
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text, Whitespace
+
+__all__ = ['AwkLexer', 'SedLexer', 'VimLexer']
+
+
+class AwkLexer(RegexLexer):
+    """
+    For Awk scripts.
+    """
+
+    name = 'Awk'
+    aliases = ['awk', 'gawk', 'mawk', 'nawk']
+    filenames = ['*.awk']
+    mimetypes = ['application/x-awk']
+    url = 'https://en.wikipedia.org/wiki/AWK'
+    version_added = '1.5'
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'#.*$', Comment.Single)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'\B', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'\+\+|--|\|\||&&|in\b|\$|!?~|\?|:|'
+             r'(\*\*|[-<>+*%\^/!=|])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(break|continue|do|while|exit|for|if|else|'
+             r'return)\b', Keyword, 'slashstartsregex'),
+            (r'function\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(atan2|cos|exp|int|log|rand|sin|sqrt|srand|gensub|gsub|index|'
+             r'length|match|split|sprintf|sub|substr|tolower|toupper|close|'
+             r'fflush|getline|next|nextfile|print|printf|strftime|systime|'
+             r'delete|system)\b', Keyword.Reserved),
+            (r'(ARGC|ARGIND|ARGV|BEGIN|CONVFMT|ENVIRON|END|ERRNO|FIELDWIDTHS|'
+             r'FILENAME|FNR|FS|IGNORECASE|NF|NR|OFMT|OFS|ORFS|RLENGTH|RS|'
+             r'RSTART|RT|SUBSEP)\b', Name.Builtin),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ]
+    }
+
+
+class SedLexer(RegexLexer):
+    """
+    Lexer for Sed script files.
+    """
+    name = 'Sed'
+    aliases = ['sed', 'gsed', 'ssed']
+    filenames = ['*.sed', '*.[gs]sed']
+    mimetypes = ['text/x-sed']
+    url = 'https://en.wikipedia.org/wiki/Sed'
+    version_added = ''
+    flags = re.MULTILINE
+
+    # Match the contents within delimiters such as /<contents>/
+    _inside_delims = r'((?:(?:\\[^\n]|[^\\])*?\\\n)*?(?:\\.|[^\\])*?)'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'#.*$', Comment.Single),
+            (r'[0-9]+', Number.Integer),
+            (r'\$', Operator),
+            (r'[{};,!]', Punctuation),
+            (r'[dDFgGhHlnNpPqQxz=]', Keyword),
+            (r'([berRtTvwW:])([^;\n]*)', bygroups(Keyword, String.Single)),
+            (r'([aci])((?:.*?\\\n)*(?:.*?[^\\]$))', bygroups(Keyword, String.Double)),
+            (r'([qQ])([0-9]*)', bygroups(Keyword, Number.Integer)),
+            (r'(/)' + _inside_delims + r'(/)', bygroups(Punctuation, String.Regex, Punctuation)),
+            (r'(\\(.))' + _inside_delims + r'(\2)',
+             bygroups(Punctuation, None, String.Regex, Punctuation)),
+            (r'(y)(.)' + _inside_delims + r'(\2)' + _inside_delims + r'(\2)',
+             bygroups(Keyword, Punctuation, String.Single, Punctuation, String.Single, Punctuation)),
+            (r'(s)(.)' + _inside_delims + r'(\2)' + _inside_delims + r'(\2)((?:[gpeIiMm]|[0-9])*)',
+             bygroups(Keyword, Punctuation, String.Regex, Punctuation, String.Single, Punctuation,
+                      Keyword))
+        ]
+    }
+
+class VimLexer(RegexLexer):
+    """
+    Lexer for VimL script files.
+    """
+    name = 'VimL'
+    aliases = ['vim']
+    filenames = ['*.vim', '.vimrc', '.exrc', '.gvimrc',
+                 '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc']
+    mimetypes = ['text/x-vim']
+    url = 'https://www.vim.org'
+    version_added = '0.8'
+
+    flags = re.MULTILINE
+
+    _python = r'py(?:t(?:h(?:o(?:n)?)?)?)?'
+
+    tokens = {
+        'root': [
+            (r'^([ \t:]*)(' + _python + r')([ \t]*)(<<)([ \t]*)(.*)((?:\n|.)*)(\6)',
+             bygroups(using(this), Keyword, Text, Operator, Text, Text,
+                      using(PythonLexer), Text)),
+            (r'^([ \t:]*)(' + _python + r')([ \t])(.*)',
+             bygroups(using(this), Keyword, Text, using(PythonLexer))),
+
+            (r'^\s*".*', Comment),
+
+            (r'[ \t]+', Text),
+            # TODO: regexes can have other delims
+            (r'/[^/\\\n]*(?:\\[\s\S][^/\\\n]*)*/', String.Regex),
+            (r'"[^"\\\n]*(?:\\[\s\S][^"\\\n]*)*"', String.Double),
+            (r"'[^\n']*(?:''[^\n']*)*'", String.Single),
+
+            # Who decided that doublequote was a good comment character??
+            (r'(?<=\s)"[^\-:.%#=*].*', Comment),
+            (r'-?\d+', Number),
+            (r'#[0-9a-f]{6}', Number.Hex),
+            (r'^:', Punctuation),
+            (r'[()<>+=!|,~-]', Punctuation),  # Inexact list.  Looks decent.
+            (r'\b(let|if|else|endif|elseif|fun|function|endfunction)\b',
+             Keyword),
+            (r'\b(NONE|bold|italic|underline|dark|light)\b', Name.Builtin),
+            (r'\b\w+\b', Name.Other),  # These are postprocessed below
+            (r'.', Text),
+        ],
+    }
+
+    def __init__(self, **options):
+        from pygments.lexers._vim_builtins import auto, command, option
+        self._cmd = command
+        self._opt = option
+        self._aut = auto
+
+        RegexLexer.__init__(self, **options)
+
+    def is_in(self, w, mapping):
+        r"""
+        It's kind of difficult to decide if something might be a keyword
+        in VimL because it allows you to abbreviate them.  In fact,
+        'ab[breviate]' is a good example.  :ab, :abbre, or :abbreviate are
+        valid ways to call it so rather than making really awful regexps
+        like::
+
+            \bab(?:b(?:r(?:e(?:v(?:i(?:a(?:t(?:e)?)?)?)?)?)?)?)?\b
+
+        we match `\b\w+\b` and then call is_in() on those tokens.  See
+        `scripts/get_vimkw.py` for how the lists are extracted.
+        """
+        p = bisect(mapping, (w,))
+        if p > 0:
+            if mapping[p-1][0] == w[:len(mapping[p-1][0])] and \
+               mapping[p-1][1][:len(w)] == w:
+                return True
+        if p < len(mapping):
+            return mapping[p][0] == w[:len(mapping[p][0])] and \
+                mapping[p][1][:len(w)] == w
+        return False
+
+    def get_tokens_unprocessed(self, text):
+        # TODO: builtins are only subsequent tokens on lines
+        #       and 'keywords' only happen at the beginning except
+        #       for :au ones
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name.Other:
+                if self.is_in(value, self._cmd):
+                    yield index, Keyword, value
+                elif self.is_in(value, self._opt) or \
+                        self.is_in(value, self._aut):
+                    yield index, Name.Builtin, value
+                else:
+                    yield index, Text, value
+            else:
+                yield index, token, value
diff --git a/.venv/Lib/site-packages/pygments/lexers/textfmts.py b/.venv/Lib/site-packages/pygments/lexers/textfmts.py
new file mode 100644 (file)
index 0000000..6dd4e58
--- /dev/null
@@ -0,0 +1,436 @@
+"""
+    pygments.lexers.textfmts
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various text formats.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexers import guess_lexer, get_lexer_by_name
+from pygments.lexer import RegexLexer, bygroups, default, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Generic, Literal, Punctuation
+from pygments.util import ClassNotFound
+
+__all__ = ['IrcLogsLexer', 'TodotxtLexer', 'HttpLexer', 'GettextLexer',
+           'NotmuchLexer', 'KernelLogLexer']
+
+
+class IrcLogsLexer(RegexLexer):
+    """
+    Lexer for IRC logs in *irssi*, *xchat* or *weechat* style.
+    """
+
+    name = 'IRC logs'
+    aliases = ['irc']
+    filenames = ['*.weechatlog']
+    mimetypes = ['text/x-irclog']
+    url = 'https://en.wikipedia.org/wiki/Internet_Relay_Chat'
+    version_added = ''
+
+    flags = re.VERBOSE | re.MULTILINE
+    timestamp = r"""
+        (
+          # irssi / xchat and others
+          (?: \[|\()?                  # Opening bracket or paren for the timestamp
+            (?:                        # Timestamp
+                (?: (?:\d{1,4} [-/])*  # Date as - or /-separated groups of digits
+                    (?:\d{1,4})
+                 [T ])?                # Date/time separator: T or space
+                (?: \d?\d [:.])*       # Time as :/.-separated groups of 1 or 2 digits
+                    (?: \d?\d)
+            )
+          (?: \]|\))?\s+               # Closing bracket or paren for the timestamp
+        |
+          # weechat
+          \d{4}\s\w{3}\s\d{2}\s        # Date
+          \d{2}:\d{2}:\d{2}\s+         # Time + Whitespace
+        |
+          # xchat
+          \w{3}\s\d{2}\s               # Date
+          \d{2}:\d{2}:\d{2}\s+         # Time + Whitespace
+        )?
+    """
+    tokens = {
+        'root': [
+            # log start/end
+            (r'^\*\*\*\*(.*)\*\*\*\*$', Comment),
+            # hack
+            ("^" + timestamp + r'(\s*<[^>]*>\s*)$', bygroups(Comment.Preproc, Name.Tag)),
+            # normal msgs
+            ("^" + timestamp + r"""
+                (\s*<.*?>\s*)          # Nick """,
+             bygroups(Comment.Preproc, Name.Tag), 'msg'),
+            # /me msgs
+            ("^" + timestamp + r"""
+                (\s*[*]\s+)            # Star
+                (\S+\s+.*?\n)          # Nick + rest of message """,
+             bygroups(Comment.Preproc, Keyword, Generic.Inserted)),
+            # join/part msgs
+            ("^" + timestamp + r"""
+                (\s*(?:\*{3}|<?-[!@=P]?->?)\s*)  # Star(s) or symbols
+                (\S+\s+)                     # Nick + Space
+                (.*?\n)                         # Rest of message """,
+             bygroups(Comment.Preproc, Keyword, String, Comment)),
+            (r"^.*?\n", Text),
+        ],
+        'msg': [
+            (r"\S+:(?!//)", Name.Attribute),  # Prefix
+            (r".*\n", Text, '#pop'),
+        ],
+    }
+
+
+class GettextLexer(RegexLexer):
+    """
+    Lexer for Gettext catalog files.
+    """
+    name = 'Gettext Catalog'
+    aliases = ['pot', 'po']
+    filenames = ['*.pot', '*.po']
+    mimetypes = ['application/x-gettext', 'text/x-gettext', 'text/gettext']
+    url = 'https://www.gnu.org/software/gettext'
+    version_added = '0.9'
+
+    tokens = {
+        'root': [
+            (r'^#,\s.*?$', Keyword.Type),
+            (r'^#:\s.*?$', Keyword.Declaration),
+            # (r'^#$', Comment),
+            (r'^(#|#\.\s|#\|\s|#~\s|#\s).*$', Comment.Single),
+            (r'^(")([A-Za-z-]+:)(.*")$',
+             bygroups(String, Name.Property, String)),
+            (r'^".*"$', String),
+            (r'^(msgid|msgid_plural|msgstr|msgctxt)(\s+)(".*")$',
+             bygroups(Name.Variable, Text, String)),
+            (r'^(msgstr\[)(\d)(\])(\s+)(".*")$',
+             bygroups(Name.Variable, Number.Integer, Name.Variable, Text, String)),
+        ]
+    }
+
+
+class HttpLexer(RegexLexer):
+    """
+    Lexer for HTTP sessions.
+    """
+
+    name = 'HTTP'
+    aliases = ['http']
+    url = 'https://httpwg.org/specs'
+    version_added = '1.5'
+
+    flags = re.DOTALL
+
+    def get_tokens_unprocessed(self, text, stack=('root',)):
+        """Reset the content-type state."""
+        self.content_type = None
+        return RegexLexer.get_tokens_unprocessed(self, text, stack)
+
+    def header_callback(self, match):
+        if match.group(1).lower() == 'content-type':
+            content_type = match.group(5).strip()
+            if ';' in content_type:
+                content_type = content_type[:content_type.find(';')].strip()
+            self.content_type = content_type
+        yield match.start(1), Name.Attribute, match.group(1)
+        yield match.start(2), Text, match.group(2)
+        yield match.start(3), Operator, match.group(3)
+        yield match.start(4), Text, match.group(4)
+        yield match.start(5), Literal, match.group(5)
+        yield match.start(6), Text, match.group(6)
+
+    def continuous_header_callback(self, match):
+        yield match.start(1), Text, match.group(1)
+        yield match.start(2), Literal, match.group(2)
+        yield match.start(3), Text, match.group(3)
+
+    def content_callback(self, match):
+        content_type = getattr(self, 'content_type', None)
+        content = match.group()
+        offset = match.start()
+        if content_type:
+            from pygments.lexers import get_lexer_for_mimetype
+            possible_lexer_mimetypes = [content_type]
+            if '+' in content_type:
+                # application/calendar+xml can be treated as application/xml
+                # if there's not a better match.
+                general_type = re.sub(r'^(.*)/.*\+(.*)$', r'\1/\2',
+                                      content_type)
+                possible_lexer_mimetypes.append(general_type)
+
+            for i in possible_lexer_mimetypes:
+                try:
+                    lexer = get_lexer_for_mimetype(i)
+                except ClassNotFound:
+                    pass
+                else:
+                    for idx, token, value in lexer.get_tokens_unprocessed(content):
+                        yield offset + idx, token, value
+                    return
+        yield offset, Text, content
+
+    tokens = {
+        'root': [
+            (r'([a-zA-Z][-_a-zA-Z]+)( +)([^ ]+)( +)'
+             r'(HTTP)(/)(1\.[01]|2(?:\.0)?|3)(\r?\n|\Z)',
+             bygroups(Name.Function, Text, Name.Namespace, Text,
+                      Keyword.Reserved, Operator, Number, Text),
+             'headers'),
+            (r'(HTTP)(/)(1\.[01]|2(?:\.0)?|3)( +)(\d{3})(?:( +)([^\r\n]*))?(\r?\n|\Z)',
+             bygroups(Keyword.Reserved, Operator, Number, Text, Number, Text,
+                      Name.Exception, Text),
+             'headers'),
+        ],
+        'headers': [
+            (r'([^\s:]+)( *)(:)( *)([^\r\n]*)(\r?\n|\Z)', header_callback),
+            (r'([\t ]+)([^\r\n]+)(\r?\n|\Z)', continuous_header_callback),
+            (r'\r?\n', Text, 'content')
+        ],
+        'content': [
+            (r'.+', content_callback)
+        ]
+    }
+
+    def analyse_text(text):
+        return any (
+            re.search(pattern, text) is not None
+            for pattern in (
+                r'^([a-zA-Z][-_a-zA-Z]+)( +)([^ ]+)( +)(HTTP)(/)(1\.[01]|2(?:\.0)?|3)(\r?\n|\Z)',
+                r'^(HTTP)(/)(1\.[01]|2(?:\.0)?|3)( +)(\d{3})(?:( +)([^\r\n]*))?(\r?\n|\Z)',
+            )
+        )
+
+
+class TodotxtLexer(RegexLexer):
+    """
+    Lexer for Todo.txt todo list format.
+    """
+
+    name = 'Todotxt'
+    url = 'http://todotxt.com/'
+    aliases = ['todotxt']
+    version_added = '2.0'
+    # *.todotxt is not a standard extension for Todo.txt files; including it
+    # makes testing easier, and also makes autodetecting file type easier.
+    filenames = ['todo.txt', '*.todotxt']
+    mimetypes = ['text/x-todo']
+
+    # Aliases mapping standard token types of Todo.txt format concepts
+    CompleteTaskText = Operator  # Chosen to de-emphasize complete tasks
+    IncompleteTaskText = Text    # Incomplete tasks should look like plain text
+
+    # Priority should have most emphasis to indicate importance of tasks
+    Priority = Generic.Heading
+    # Dates should have next most emphasis because time is important
+    Date = Generic.Subheading
+
+    # Project and context should have equal weight, and be in different colors
+    Project = Generic.Error
+    Context = String
+
+    # If tag functionality is added, it should have the same weight as Project
+    # and Context, and a different color. Generic.Traceback would work well.
+
+    # Regex patterns for building up rules; dates, priorities, projects, and
+    # contexts are all atomic
+    # TODO: Make date regex more ISO 8601 compliant
+    date_regex = r'\d{4,}-\d{2}-\d{2}'
+    priority_regex = r'\([A-Z]\)'
+    project_regex = r'\+\S+'
+    context_regex = r'@\S+'
+
+    # Compound regex expressions
+    complete_one_date_regex = r'(x )(' + date_regex + r')'
+    complete_two_date_regex = (complete_one_date_regex + r'( )(' +
+                               date_regex + r')')
+    priority_date_regex = r'(' + priority_regex + r')( )(' + date_regex + r')'
+
+    tokens = {
+        # Should parse starting at beginning of line; each line is a task
+        'root': [
+            # Complete task entry points: two total:
+            # 1. Complete task with two dates
+            (complete_two_date_regex, bygroups(CompleteTaskText, Date,
+                                               CompleteTaskText, Date),
+             'complete'),
+            # 2. Complete task with one date
+            (complete_one_date_regex, bygroups(CompleteTaskText, Date),
+             'complete'),
+
+            # Incomplete task entry points: six total:
+            # 1. Priority plus date
+            (priority_date_regex, bygroups(Priority, IncompleteTaskText, Date),
+             'incomplete'),
+            # 2. Priority only
+            (priority_regex, Priority, 'incomplete'),
+            # 3. Leading date
+            (date_regex, Date, 'incomplete'),
+            # 4. Leading context
+            (context_regex, Context, 'incomplete'),
+            # 5. Leading project
+            (project_regex, Project, 'incomplete'),
+            # 6. Non-whitespace catch-all
+            (r'\S+', IncompleteTaskText, 'incomplete'),
+        ],
+
+        # Parse a complete task
+        'complete': [
+            # Newline indicates end of task, should return to root
+            (r'\s*\n', CompleteTaskText, '#pop'),
+            # Tokenize contexts and projects
+            (context_regex, Context),
+            (project_regex, Project),
+            # Tokenize non-whitespace text
+            (r'\S+', CompleteTaskText),
+            # Tokenize whitespace not containing a newline
+            (r'\s+', CompleteTaskText),
+        ],
+
+        # Parse an incomplete task
+        'incomplete': [
+            # Newline indicates end of task, should return to root
+            (r'\s*\n', IncompleteTaskText, '#pop'),
+            # Tokenize contexts and projects
+            (context_regex, Context),
+            (project_regex, Project),
+            # Tokenize non-whitespace text
+            (r'\S+', IncompleteTaskText),
+            # Tokenize whitespace not containing a newline
+            (r'\s+', IncompleteTaskText),
+        ],
+    }
+
+
+class NotmuchLexer(RegexLexer):
+    """
+    For Notmuch email text format.
+
+    Additional options accepted:
+
+    `body_lexer`
+        If given, highlight the contents of the message body with the specified
+        lexer, else guess it according to the body content (default: ``None``).
+    """
+
+    name = 'Notmuch'
+    url = 'https://notmuchmail.org/'
+    aliases = ['notmuch']
+    version_added = '2.5'
+
+    def _highlight_code(self, match):
+        code = match.group(1)
+
+        try:
+            if self.body_lexer:
+                lexer = get_lexer_by_name(self.body_lexer)
+            else:
+                lexer = guess_lexer(code.strip())
+        except ClassNotFound:
+            lexer = get_lexer_by_name('text')
+
+        yield from lexer.get_tokens_unprocessed(code)
+
+    tokens = {
+        'root': [
+            (r'\fmessage\{\s*', Keyword, ('message', 'message-attr')),
+        ],
+        'message-attr': [
+            (r'(\s*id:\s*)(\S+)', bygroups(Name.Attribute, String)),
+            (r'(\s*(?:depth|match|excluded):\s*)(\d+)',
+             bygroups(Name.Attribute, Number.Integer)),
+            (r'(\s*filename:\s*)(.+\n)',
+             bygroups(Name.Attribute, String)),
+            default('#pop'),
+        ],
+        'message': [
+            (r'\fmessage\}\n', Keyword, '#pop'),
+            (r'\fheader\{\n', Keyword, 'header'),
+            (r'\fbody\{\n', Keyword, 'body'),
+        ],
+        'header': [
+            (r'\fheader\}\n', Keyword, '#pop'),
+            (r'((?:Subject|From|To|Cc|Date):\s*)(.*\n)',
+             bygroups(Name.Attribute, String)),
+            (r'(.*)(\s*\(.*\))(\s*\(.*\)\n)',
+             bygroups(Generic.Strong, Literal, Name.Tag)),
+        ],
+        'body': [
+            (r'\fpart\{\n', Keyword, 'part'),
+            (r'\f(part|attachment)\{\s*', Keyword, ('part', 'part-attr')),
+            (r'\fbody\}\n', Keyword, '#pop'),
+        ],
+        'part-attr': [
+            (r'(ID:\s*)(\d+)', bygroups(Name.Attribute, Number.Integer)),
+            (r'(,\s*)((?:Filename|Content-id):\s*)([^,]+)',
+             bygroups(Punctuation, Name.Attribute, String)),
+            (r'(,\s*)(Content-type:\s*)(.+\n)',
+             bygroups(Punctuation, Name.Attribute, String)),
+            default('#pop'),
+        ],
+        'part': [
+            (r'\f(?:part|attachment)\}\n', Keyword, '#pop'),
+            (r'\f(?:part|attachment)\{\s*', Keyword, ('#push', 'part-attr')),
+            (r'^Non-text part: .*\n', Comment),
+            (r'(?s)(.*?(?=\f(?:part|attachment)\}\n))', _highlight_code),
+        ],
+    }
+
+    def analyse_text(text):
+        return 1.0 if text.startswith('\fmessage{') else 0.0
+
+    def __init__(self, **options):
+        self.body_lexer = options.get('body_lexer', None)
+        RegexLexer.__init__(self, **options)
+
+
+class KernelLogLexer(RegexLexer):
+    """
+    For Linux Kernel log ("dmesg") output.
+    """
+    name = 'Kernel log'
+    aliases = ['kmsg', 'dmesg']
+    filenames = ['*.kmsg', '*.dmesg']
+    url = 'https://fr.wikipedia.org/wiki/Dmesg'
+    version_added = '2.6'
+
+    tokens = {
+        'root': [
+            (r'^[^:]+:debug : (?=\[)', Text, 'debug'),
+            (r'^[^:]+:info  : (?=\[)', Text, 'info'),
+            (r'^[^:]+:warn  : (?=\[)', Text, 'warn'),
+            (r'^[^:]+:notice: (?=\[)', Text, 'warn'),
+            (r'^[^:]+:err   : (?=\[)', Text, 'error'),
+            (r'^[^:]+:crit  : (?=\[)', Text, 'error'),
+            (r'^(?=\[)', Text, 'unknown'),
+        ],
+        'unknown': [
+            (r'^(?=.+(warning|notice|audit|deprecated))', Text, 'warn'),
+            (r'^(?=.+(error|critical|fail|Bug))', Text, 'error'),
+            default('info'),
+        ],
+        'base': [
+            (r'\[[0-9. ]+\] ', Number),
+            (r'(?<=\] ).+?:', Keyword),
+            (r'\n', Text, '#pop'),
+        ],
+        'debug': [
+            include('base'),
+            (r'.+\n', Comment, '#pop')
+        ],
+        'info': [
+            include('base'),
+            (r'.+\n', Text, '#pop')
+        ],
+        'warn': [
+            include('base'),
+            (r'.+\n', Generic.Strong, '#pop')
+        ],
+        'error': [
+            include('base'),
+            (r'.+\n', Generic.Error, '#pop')
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/theorem.py b/.venv/Lib/site-packages/pygments/lexers/theorem.py
new file mode 100644 (file)
index 0000000..9e3f150
--- /dev/null
@@ -0,0 +1,410 @@
+"""
+    pygments.lexers.theorem
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for theorem-proving languages.
+
+    See also :mod:`pygments.lexers.lean`
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+# compatibility import
+from pygments.lexers.lean import LeanLexer # noqa: F401
+
+__all__ = ['CoqLexer', 'IsabelleLexer']
+
+
+class CoqLexer(RegexLexer):
+    """
+    For the Coq theorem prover.
+    """
+
+    name = 'Coq'
+    url = 'http://coq.inria.fr/'
+    aliases = ['coq']
+    filenames = ['*.v']
+    mimetypes = ['text/x-coq']
+    version_added = '1.5'
+
+    flags = 0 # no re.MULTILINE
+
+    keywords1 = (
+        # Vernacular commands
+        'Section', 'Module', 'End', 'Require', 'Import', 'Export', 'Include', 'Variable',
+        'Variables', 'Parameter', 'Parameters', 'Axiom', 'Axioms', 'Hypothesis',
+        'Hypotheses', 'Notation', 'Local', 'Tactic', 'Reserved', 'Scope',
+        'Open', 'Close', 'Bind', 'Declare', 'Delimit', 'Definition', 'Example', 'Let',
+        'Ltac', 'Ltac2', 'Fixpoint', 'CoFixpoint', 'Morphism', 'Relation', 'Implicit',
+        'Arguments', 'Types', 'Contextual', 'Strict', 'Prenex',
+        'Implicits', 'Inductive', 'CoInductive', 'Record', 'Structure',
+        'Variant', 'Canonical', 'Coercion', 'Theorem', 'Lemma', 'Fact',
+        'Remark', 'Corollary', 'Proposition', 'Property', 'Goal',
+        'Proof', 'Restart', 'Save', 'Qed', 'Defined', 'Abort', 'Admitted',
+        'Hint', 'Resolve', 'Rewrite', 'View', 'Search', 'Compute', 'Eval',
+        'Show', 'Print', 'Printing', 'All', 'Graph', 'Projections', 'inside',
+        'outside', 'Check', 'Global', 'Instance', 'Class', 'Existing',
+        'Universe', 'Polymorphic', 'Monomorphic', 'Context', 'Scheme', 'From',
+        'Undo', 'Fail', 'Function', 'Program', 'Elpi', 'Extract', 'Opaque',
+        'Transparent', 'Unshelve', 'Next Obligation',
+    )
+    keywords2 = (
+        # Gallina
+        'forall', 'exists', 'exists2', 'fun', 'fix', 'cofix', 'struct',
+        'match', 'end',  'in', 'return', 'let', 'if', 'is', 'then', 'else',
+        'for', 'of', 'nosimpl', 'with', 'as',
+    )
+    keywords3 = (
+        # Sorts
+        'Type', 'Prop', 'SProp', 'Set',
+    )
+    keywords4 = (
+        # Tactics
+        'pose', 'set', 'move', 'case', 'elim', 'apply', 'clear', 'hnf', 'intro',
+        'intros', 'generalize', 'rename', 'pattern', 'after', 'destruct',
+        'induction', 'using', 'refine', 'inversion', 'injection', 'rewrite',
+        'congr', 'unlock', 'compute', 'ring', 'field', 'replace', 'fold',
+        'unfold', 'change', 'cutrewrite', 'simpl', 'have', 'suff', 'wlog',
+        'suffices', 'without', 'loss', 'nat_norm', 'assert', 'cut', 'trivial',
+        'revert', 'bool_congr', 'nat_congr', 'symmetry', 'transitivity', 'auto',
+        'split', 'left', 'right', 'autorewrite', 'tauto', 'setoid_rewrite',
+        'intuition', 'eauto', 'eapply', 'econstructor', 'etransitivity',
+        'constructor', 'erewrite', 'red', 'cbv', 'lazy', 'vm_compute',
+        'native_compute', 'subst',
+    )
+    keywords5 = (
+        # Terminators
+        'by', 'now', 'done', 'exact', 'reflexivity',
+        'tauto', 'romega', 'omega', 'lia', 'nia', 'lra', 'nra', 'psatz',
+        'assumption', 'solve', 'contradiction', 'discriminate',
+        'congruence', 'admit'
+    )
+    keywords6 = (
+        # Control
+        'do', 'last', 'first', 'try', 'idtac', 'repeat',
+    )
+    # 'as', 'assert', 'begin', 'class', 'constraint', 'do', 'done',
+    # 'downto', 'else', 'end', 'exception', 'external', 'false',
+    # 'for', 'fun', 'function', 'functor', 'if', 'in', 'include',
+    # 'inherit', 'initializer', 'lazy', 'let', 'match', 'method',
+    # 'module', 'mutable', 'new', 'object', 'of', 'open', 'private',
+    # 'raise', 'rec', 'sig', 'struct', 'then', 'to', 'true', 'try',
+    # 'type', 'val', 'virtual', 'when', 'while', 'with'
+    keyopts = (
+        '!=', '#', '&', '&&', r'\(', r'\)', r'\*', r'\+', ',', '-', r'-\.',
+        '->', r'\.', r'\.\.', ':', '::', ':=', ':>', ';', ';;', '<', '<-',
+        '<->', '=', '>', '>]', r'>\}', r'\?', r'\?\?', r'\[', r'\[<', r'\[>',
+        r'\[\|', ']', '_', '`', r'\{', r'\{<', r'lp:\{\{', r'\|', r'\|]', r'\}', '~', '=>',
+        r'/\\', r'\\/', r'\{\|', r'\|\}',
+        # 'Π', 'Σ', # Not defined in the standard library
+        'λ', '¬', '∧', '∨', '∀', '∃', '→', '↔', '≠', '≤', '≥',
+    )
+    operators = r'[!$%&*+\./:<=>?@^|~-]'
+    prefix_syms = r'[!?~]'
+    infix_syms = r'[=<>@^|&+\*/$%-]'
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'false|true|\(\)|\[\]', Name.Builtin.Pseudo),
+            (r'\(\*', Comment, 'comment'),
+            (r'\b(?:[^\W\d][\w\']*\.)+[^\W\d][\w\']*\b', Name),
+            (r'\bEquations\b\??', Keyword.Namespace),
+            (r'\b(Elpi)(\s+)(Program|Query|Accumulate|Command|Typecheck|Db|Export|Tactic)?\b', bygroups(Keyword.Namespace,Text,Keyword.Namespace)),
+            # Very weak heuristic to distinguish the Set vernacular from the Set sort
+            (r'\bUnset\b|\bSet(?=[ \t]+[A-Z][a-z][^\n]*?\.)', Keyword.Namespace, 'set-options'),
+            (r'\b(?:String|Number)\s+Notation', Keyword.Namespace, 'sn-notation'),
+            (words(keywords1, prefix=r'\b', suffix=r'\b'), Keyword.Namespace),
+            (words(keywords2, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keywords3, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+            (words(keywords4, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keywords5, prefix=r'\b', suffix=r'\b'), Keyword.Pseudo),
+            (words(keywords6, prefix=r'\b', suffix=r'\b'), Keyword.Reserved),
+            # (r'\b([A-Z][\w\']*)(\.)', Name.Namespace, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name),
+            (r'({})'.format('|'.join(keyopts[::-1])), Operator),
+            (rf'({infix_syms}|{prefix_syms})?{operators}', Operator),
+
+            (r"[^\W\d][\w']*", Name),
+
+            (r'\d[\d_]*', Number.Integer),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'0[oO][0-7][0-7_]*', Number.Oct),
+            (r'0[bB][01][01_]*', Number.Bin),
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'", String.Char),
+
+            (r"'.'", String.Char),
+            (r"'", Keyword),  # a stray quote is another syntax element
+
+            (r'"', String.Double, 'string'),
+
+            (r'[~?][a-z][\w\']*:', Name),
+            (r'\S', Name.Builtin.Pseudo),
+        ],
+        'set-options': [
+            (r'\s+', Text),
+            (r'[A-Z]\w*', Keyword.Namespace),
+            (r'"', String.Double, 'string'),
+            (r'\d+', Number.Integer),
+            (r'\.', Punctuation, '#pop'),
+        ],
+        'sn-notation': [
+            (r'\s+', Text),
+            # Extra keywords to highlight only in this scope
+            (r'\b(?:via|mapping|abstract|warning|after)\b', Keyword),
+            (r'=>|[()\[\]:,]', Operator),
+            (r'\b[^\W\d][\w\']*(?:\.[^\W\d][\w\']*)*\b', Name),
+            (r'\d[\d_]*', Number.Integer),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'\(\*', Comment, 'comment'),
+            (r'\.', Punctuation, '#pop'),
+        ],
+        'comment': [
+            # Consume comments like ***** as one token
+            (r'([^(*)]+|\*+(?!\)))+', Comment),
+            (r'\(\*', Comment, '#push'),
+            (r'\*\)', Comment, '#pop'),
+            (r'[(*)]', Comment),
+        ],
+        'string': [
+            (r'[^"]+', String.Double),
+            (r'""', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
+            (r'[A-Z][\w\']*', Name.Class, '#pop'),
+            (r'[a-z][a-z0-9_\']*', Name, '#pop'),
+            default('#pop')
+        ],
+    }
+
+    def analyse_text(text):
+        if 'Qed' in text and 'Proof' in text:
+            return 1
+
+
+class IsabelleLexer(RegexLexer):
+    """
+    For the Isabelle proof assistant.
+    """
+
+    name = 'Isabelle'
+    url = 'https://isabelle.in.tum.de/'
+    aliases = ['isabelle']
+    filenames = ['*.thy']
+    mimetypes = ['text/x-isabelle']
+    version_added = '2.0'
+
+    keyword_minor = (
+        'and', 'assumes', 'attach', 'avoids', 'binder', 'checking',
+        'class_instance', 'class_relation', 'code_module', 'congs',
+        'constant', 'constrains', 'datatypes', 'defines', 'file', 'fixes',
+        'for', 'functions', 'hints', 'identifier', 'if', 'imports', 'in',
+        'includes', 'infix', 'infixl', 'infixr', 'is', 'keywords', 'lazy',
+        'module_name', 'monos', 'morphisms', 'no_discs_sels', 'notes',
+        'obtains', 'open', 'output', 'overloaded', 'parametric', 'permissive',
+        'pervasive', 'rep_compat', 'shows', 'structure', 'type_class',
+        'type_constructor', 'unchecked', 'unsafe', 'where',
+    )
+
+    keyword_diag = (
+        'ML_command', 'ML_val', 'class_deps', 'code_deps', 'code_thms',
+        'display_drafts', 'find_consts', 'find_theorems', 'find_unused_assms',
+        'full_prf', 'help', 'locale_deps', 'nitpick', 'pr', 'prf',
+        'print_abbrevs', 'print_antiquotations', 'print_attributes',
+        'print_binds', 'print_bnfs', 'print_bundles',
+        'print_case_translations', 'print_cases', 'print_claset',
+        'print_classes', 'print_codeproc', 'print_codesetup',
+        'print_coercions', 'print_commands', 'print_context',
+        'print_defn_rules', 'print_dependencies', 'print_facts',
+        'print_induct_rules', 'print_inductives', 'print_interps',
+        'print_locale', 'print_locales', 'print_methods', 'print_options',
+        'print_orders', 'print_quot_maps', 'print_quotconsts',
+        'print_quotients', 'print_quotientsQ3', 'print_quotmapsQ3',
+        'print_rules', 'print_simpset', 'print_state', 'print_statement',
+        'print_syntax', 'print_theorems', 'print_theory', 'print_trans_rules',
+        'prop', 'pwd', 'quickcheck', 'refute', 'sledgehammer', 'smt_status',
+        'solve_direct', 'spark_status', 'term', 'thm', 'thm_deps', 'thy_deps',
+        'try', 'try0', 'typ', 'unused_thms', 'value', 'values', 'welcome',
+        'print_ML_antiquotations', 'print_term_bindings', 'values_prolog',
+    )
+
+    keyword_thy = ('theory', 'begin', 'end')
+
+    keyword_section = ('header', 'chapter')
+
+    keyword_subsection = (
+        'section', 'subsection', 'subsubsection', 'sect', 'subsect',
+        'subsubsect',
+    )
+
+    keyword_theory_decl = (
+        'ML', 'ML_file', 'abbreviation', 'adhoc_overloading', 'arities',
+        'atom_decl', 'attribute_setup', 'axiomatization', 'bundle',
+        'case_of_simps', 'class', 'classes', 'classrel', 'codatatype',
+        'code_abort', 'code_class', 'code_const', 'code_datatype',
+        'code_identifier', 'code_include', 'code_instance', 'code_modulename',
+        'code_monad', 'code_printing', 'code_reflect', 'code_reserved',
+        'code_type', 'coinductive', 'coinductive_set', 'consts', 'context',
+        'datatype', 'datatype_new', 'datatype_new_compat', 'declaration',
+        'declare', 'default_sort', 'defer_recdef', 'definition', 'defs',
+        'domain', 'domain_isomorphism', 'domaindef', 'equivariance',
+        'export_code', 'extract', 'extract_type', 'fixrec', 'fun',
+        'fun_cases', 'hide_class', 'hide_const', 'hide_fact', 'hide_type',
+        'import_const_map', 'import_file', 'import_tptp', 'import_type_map',
+        'inductive', 'inductive_set', 'instantiation', 'judgment', 'lemmas',
+        'lifting_forget', 'lifting_update', 'local_setup', 'locale',
+        'method_setup', 'nitpick_params', 'no_adhoc_overloading',
+        'no_notation', 'no_syntax', 'no_translations', 'no_type_notation',
+        'nominal_datatype', 'nonterminal', 'notation', 'notepad', 'oracle',
+        'overloading', 'parse_ast_translation', 'parse_translation',
+        'partial_function', 'primcorec', 'primrec', 'primrec_new',
+        'print_ast_translation', 'print_translation', 'quickcheck_generator',
+        'quickcheck_params', 'realizability', 'realizers', 'recdef', 'record',
+        'refute_params', 'setup', 'setup_lifting', 'simproc_setup',
+        'simps_of_case', 'sledgehammer_params', 'spark_end', 'spark_open',
+        'spark_open_siv', 'spark_open_vcg', 'spark_proof_functions',
+        'spark_types', 'statespace', 'syntax', 'syntax_declaration', 'text',
+        'text_raw', 'theorems', 'translations', 'type_notation',
+        'type_synonym', 'typed_print_translation', 'typedecl', 'hoarestate',
+        'install_C_file', 'install_C_types', 'wpc_setup', 'c_defs', 'c_types',
+        'memsafe', 'SML_export', 'SML_file', 'SML_import', 'approximate',
+        'bnf_axiomatization', 'cartouche', 'datatype_compat',
+        'free_constructors', 'functor', 'nominal_function',
+        'nominal_termination', 'permanent_interpretation',
+        'binds', 'defining', 'smt2_status', 'term_cartouche',
+        'boogie_file', 'text_cartouche',
+    )
+
+    keyword_theory_script = ('inductive_cases', 'inductive_simps')
+
+    keyword_theory_goal = (
+        'ax_specification', 'bnf', 'code_pred', 'corollary', 'cpodef',
+        'crunch', 'crunch_ignore',
+        'enriched_type', 'function', 'instance', 'interpretation', 'lemma',
+        'lift_definition', 'nominal_inductive', 'nominal_inductive2',
+        'nominal_primrec', 'pcpodef', 'primcorecursive',
+        'quotient_definition', 'quotient_type', 'recdef_tc', 'rep_datatype',
+        'schematic_corollary', 'schematic_lemma', 'schematic_theorem',
+        'spark_vc', 'specification', 'subclass', 'sublocale', 'termination',
+        'theorem', 'typedef', 'wrap_free_constructors',
+    )
+
+    keyword_qed = ('by', 'done', 'qed')
+    keyword_abandon_proof = ('sorry', 'oops')
+
+    keyword_proof_goal = ('have', 'hence', 'interpret')
+
+    keyword_proof_block = ('next', 'proof')
+
+    keyword_proof_chain = (
+        'finally', 'from', 'then', 'ultimately', 'with',
+    )
+
+    keyword_proof_decl = (
+        'ML_prf', 'also', 'include', 'including', 'let', 'moreover', 'note',
+        'txt', 'txt_raw', 'unfolding', 'using', 'write',
+    )
+
+    keyword_proof_asm = ('assume', 'case', 'def', 'fix', 'presume')
+
+    keyword_proof_asm_goal = ('guess', 'obtain', 'show', 'thus')
+
+    keyword_proof_script = (
+        'apply', 'apply_end', 'apply_trace', 'back', 'defer', 'prefer',
+    )
+
+    operators = (
+        '::', ':', '(', ')', '[', ']', '_', '=', ',', '|',
+        '+', '-', '!', '?',
+    )
+
+    proof_operators = ('{', '}', '.', '..')
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'\(\*', Comment, 'comment'),
+            (r'\\<open>', String.Symbol, 'cartouche'),
+            (r'\{\*|‹', String, 'cartouche'),
+
+            (words(operators), Operator),
+            (words(proof_operators), Operator.Word),
+
+            (words(keyword_minor, prefix=r'\b', suffix=r'\b'), Keyword.Pseudo),
+
+            (words(keyword_diag, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+
+            (words(keyword_thy, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_theory_decl, prefix=r'\b', suffix=r'\b'), Keyword),
+
+            (words(keyword_section, prefix=r'\b', suffix=r'\b'), Generic.Heading),
+            (words(keyword_subsection, prefix=r'\b', suffix=r'\b'), Generic.Subheading),
+
+            (words(keyword_theory_goal, prefix=r'\b', suffix=r'\b'), Keyword.Namespace),
+            (words(keyword_theory_script, prefix=r'\b', suffix=r'\b'), Keyword.Namespace),
+
+            (words(keyword_abandon_proof, prefix=r'\b', suffix=r'\b'), Generic.Error),
+
+            (words(keyword_qed, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_proof_goal, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_proof_block, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_proof_decl, prefix=r'\b', suffix=r'\b'), Keyword),
+
+            (words(keyword_proof_chain, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_proof_asm, prefix=r'\b', suffix=r'\b'), Keyword),
+            (words(keyword_proof_asm_goal, prefix=r'\b', suffix=r'\b'), Keyword),
+
+            (words(keyword_proof_script, prefix=r'\b', suffix=r'\b'), Keyword.Pseudo),
+
+            (r'\\<(\w|\^)*>', Text.Symbol),
+
+            (r"'[^\W\d][.\w']*", Name.Type),
+
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'0[oO][0-7][0-7_]*', Number.Oct),
+            (r'0[bB][01][01_]*', Number.Bin),
+
+            (r'"', String, 'string'),
+            (r'`', String.Other, 'fact'),
+            (r'[^\s:|\[\]\-()=,+!?{}._][^\s:|\[\]\-()=,+!?{}]*', Name),
+        ],
+        'comment': [
+            (r'[^(*)]+', Comment),
+            (r'\(\*', Comment, '#push'),
+            (r'\*\)', Comment, '#pop'),
+            (r'[(*)]', Comment),
+        ],
+        'cartouche': [
+            (r'[^{*}\\‹›]+', String),
+            (r'\\<open>', String.Symbol, '#push'),
+            (r'\{\*|‹', String, '#push'),
+            (r'\\<close>', String.Symbol, '#pop'),
+            (r'\*\}|›', String, '#pop'),
+            (r'\\<(\w|\^)*>', String.Symbol),
+            (r'[{*}\\]', String),
+        ],
+        'string': [
+            (r'[^"\\]+', String),
+            (r'\\<(\w|\^)*>', String.Symbol),
+            (r'\\"', String),
+            (r'\\', String),
+            (r'"', String, '#pop'),
+        ],
+        'fact': [
+            (r'[^`\\]+', String.Other),
+            (r'\\<(\w|\^)*>', String.Symbol),
+            (r'\\`', String.Other),
+            (r'\\', String.Other),
+            (r'`', String.Other, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/thingsdb.py b/.venv/Lib/site-packages/pygments/lexers/thingsdb.py
new file mode 100644 (file)
index 0000000..ee859c9
--- /dev/null
@@ -0,0 +1,140 @@
+"""
+    pygments.lexers.thingsdb
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the ThingsDB language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups
+from pygments.token import Comment, Keyword, Name, Number, String, Text, \
+    Operator, Punctuation, Whitespace
+
+__all__ = ['ThingsDBLexer']
+
+
+class ThingsDBLexer(RegexLexer):
+    """
+    Lexer for the ThingsDB programming language.
+    """
+    name = 'ThingsDB'
+    aliases = ['ti', 'thingsdb']
+    filenames = ['*.ti']
+    url = 'https://www.thingsdb.net'
+    version_added = '2.9'
+
+    tokens = {
+        'root': [
+            include('expression'),
+        ],
+        'expression': [
+            include('comments'),
+            include('whitespace'),
+
+            # numbers
+            (r'[-+]?0b[01]+', Number.Bin),
+            (r'[-+]?0o[0-8]+', Number.Oct),
+            (r'([-+]?0x[0-9a-fA-F]+)', Number.Hex),
+            (r'[-+]?[0-9]+', Number.Integer),
+            (r'[-+]?((inf|nan)([^0-9A-Za-z_]|$)|[0-9]*\.[0-9]+(e[+-][0-9]+)?)',
+             Number.Float),
+
+            # strings
+            (r'(?:"(?:[^"]*)")+', String.Double),
+            (r"(?:'(?:[^']*)')+", String.Single),
+            (r"(?:`(?:[^`]*)`)+", String.Backtick),
+
+            # literals
+            (r'(true|false|nil)\b', Keyword.Constant),
+
+            # name constants
+            (r'(FULL|USER|GRANT|CHANGE|JOIN|RUN|QUERY|'
+             r'DEBUG|INFO|WARNING|ERROR|CRITICAL|'
+             r'NO_IDS|INT_MIN|INT_MAX)\b', Name.Constant),
+
+            # regular expressions
+            (r'(/[^/\\]*(?:\\.[^/\\]*)*/i?)', String.Regex),
+
+            # name, assignments and functions
+            include('names'),
+
+            (r'[(){}\[\],;]', Punctuation),
+            (r'[+\-*/%&|<>^!~@=:?]', Operator),
+        ],
+        'names': [
+            (r'(\.)'
+             r'(first|last|then|else|load|at|again_in|again_at|err|cancel|'
+             r'closure|set_closure|args|set_args|owner|set_owner|equals|copy|'
+             r'dup|assign|week|weekday|yday|zone|len|call|doc|emit|extract|'
+             r'choice|code|format|msg|each|every|extend|extend_unique|filter|'
+             r'find|flat|find_index|has|index_of|count|sum|is_unique|unique|'
+             r'join|map|map_id|map_wrap|map_type|vmap|move|pop|push|fill|'
+             r'remove|replace|restrict|restriction|shift|sort|splice|to|add|'
+             r'one|clear|contains|ends_with|name|lower|replace|reverse|'
+             r'starts_with|split|test|trim|trim_left|trim_right|upper|del|ren|'
+             r'to_type|to_thing|get|id|keys|reduce|set|some|value|values|wrap|'
+             r'unshift|unwrap|search)'
+             r'(\()',
+             bygroups(Name.Function, Name.Function, Punctuation), 'arguments'),
+            (r'(alt_raise|assert|base64_encode|base64_decode|bool|bytes|'
+             r'closure|datetime|deep|future|is_future|del_enum|del_type|room|'
+             r'is_room|task|tasks|is_task|is_email|is_url|is_tel|is_time_zone|'
+             r'timeit|enum|enum_info|enum_map|enums_info|err|regex|is_regex|'
+             r'change_id|float|has_enum|has_type|int|is_array|is_ascii|'
+             r'is_float|is_bool|is_bytes|is_closure|is_datetime|is_enum|'
+             r'is_err|is_mpdata|is_inf|is_int|is_list|is_nan|is_nil|is_raw|'
+             r'is_set|is_str|is_thing|is_timeval|is_tuple|is_utf8|json_dump|'
+             r'json_load|list|log|import|export|root|mod_enum|mod_type|new|'
+             r'new_type|now|raise|rand|range|randint|randstr|refs|rename_enum|'
+             r'set|set_enum|set_type|str|thing|timeval|try|type|type_assert|'
+             r'type_count|type_info|types_info|nse|wse|backup_info|'
+             r'backups_info|backups_ok|counters|del_backup|has_backup|'
+             r'new_backup|node_info|nodes_info|reset_counters|restart_module|'
+             r'set_log_level|shutdown|has_module|del_module|module_info|'
+             r'modules_info|new_module|deploy_module|rename_module|'
+             r'refresh_module|set_module_conf|set_module_scope|'
+             r'collections_info|del_collection|del_expired|del_node|del_token|'
+             r'del_user|grant|has_collection|has_node|has_token|has_user|'
+             r'new_collection|new_node|new_token|new_user|rename_collection|'
+             r'rename_user|restore|revoke|set_password|set_time_zone|'
+             r'set_default_deep|time_zones_info|user_info|users_info|'
+             r'del_procedure|has_procedure|new_procedure|mod_procedure|'
+             r'procedure_doc|procedure_info|procedures_info|rename_procedure|'
+             r'run|assert_err|auth_err|bad_data_err|cancelled_err|'
+             r'rename_type|forbidden_err|lookup_err|max_quota_err|node_err|'
+             r'num_arguments_err|operation_err|overflow_err|syntax_err|'
+             r'collection_info|type_err|value_err|zero_div_err)'
+             r'(\()',
+             bygroups(Name.Function, Punctuation),
+             'arguments'),
+            (r'(\.[A-Za-z_][0-9A-Za-z_]*)'
+             r'(\s*)(=)',
+             bygroups(Name.Attribute, Text, Operator)),
+            (r'\.[A-Za-z_][0-9A-Za-z_]*', Name.Attribute),
+            (r'([A-Za-z_][0-9A-Za-z_]*)(\s*)(=)',
+             bygroups(Name.Variable, Text, Operator)),
+            (r'[A-Za-z_][0-9A-Za-z_]*', Name.Variable),
+        ],
+        'whitespace': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+        ],
+        'comments': [
+            (r'//(.*?)\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'arguments': [
+            include('expression'),
+            (',', Punctuation),
+            (r'\(', Punctuation, '#push'),
+            (r'\)', Punctuation, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/tlb.py b/.venv/Lib/site-packages/pygments/lexers/tlb.py
new file mode 100644 (file)
index 0000000..e652eac
--- /dev/null
@@ -0,0 +1,59 @@
+"""
+    pygments.lexers.tlb
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for TL-b.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Operator, Name, \
+    Number, Whitespace, Punctuation, Comment
+
+__all__ = ['TlbLexer']
+
+
+class TlbLexer(RegexLexer):
+    """
+    For TL-b source code.
+    """
+
+    name = 'Tl-b'
+    aliases = ['tlb']
+    filenames = ['*.tlb']
+    url = 'https://docs.ton.org/#/overviews/TL-B'
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+
+            include('comments'),
+
+            (r'[0-9]+', Number),
+            (words((
+                '+', '-', '*', '=', '?', '~', '.',
+                '^', '==', '<', '>', '<=', '>=', '!='
+            )), Operator),
+            (words(('##', '#<', '#<=')), Name.Tag),
+            (r'#[0-9a-f]*_?', Name.Tag),
+            (r'\$[01]*_?', Name.Tag),
+
+            (r'[a-zA-Z_][0-9a-zA-Z_]*', Name),
+
+            (r'[;():\[\]{}]', Punctuation)
+        ],
+
+        'comments': [
+            (r'//.*', Comment.Singleline),
+            (r'/\*', Comment.Multiline, 'comment'),
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/tls.py b/.venv/Lib/site-packages/pygments/lexers/tls.py
new file mode 100644 (file)
index 0000000..a3079a2
--- /dev/null
@@ -0,0 +1,54 @@
+"""
+    pygments.lexers.tls
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the TLS presentation language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+import re
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['TlsLexer']
+
+
+class TlsLexer(RegexLexer):
+    """
+    The TLS presentation language, described in RFC 8446.
+    """
+    name = 'TLS Presentation Language'
+    url = 'https://www.rfc-editor.org/rfc/rfc8446#section-3'
+    filenames = []
+    aliases = ['tls']
+    mimetypes = []
+    version_added = '2.16'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            # comments
+            (r'/[*].*?[*]/', Comment.Multiline),
+            # Keywords
+            (words(('struct', 'enum', 'select', 'case'), suffix=r'\b'),
+             Keyword),
+            (words(('uint8', 'uint16', 'uint24', 'uint32', 'uint64', 'opaque'),
+                   suffix=r'\b'), Keyword.Type),
+            # numeric literals
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            # string literal
+            (r'"(\\.|[^"\\])*"', String),
+            # tokens
+            (r'[.]{2}', Operator),
+            (r'[+\-*/&^]', Operator),
+            (r'[|<>=!()\[\]{}.,;:\?]', Punctuation),
+            # identifiers
+            (r'[^\W\d]\w*', Name.Other),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/tnt.py b/.venv/Lib/site-packages/pygments/lexers/tnt.py
new file mode 100644 (file)
index 0000000..1ae2ed8
--- /dev/null
@@ -0,0 +1,270 @@
+"""
+    pygments.lexers.tnt
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Typographic Number Theory.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer
+from pygments.token import Text, Comment, Operator, Keyword, Name, Number, \
+    Punctuation, Error
+
+__all__ = ['TNTLexer']
+
+
+class TNTLexer(Lexer):
+    """
+    Lexer for Typographic Number Theory, as described in the book
+    Gödel, Escher, Bach, by Douglas R. Hofstadter
+    """
+
+    name = 'Typographic Number Theory'
+    url = 'https://github.com/Kenny2github/language-tnt'
+    aliases = ['tnt']
+    filenames = ['*.tnt']
+    version_added = '2.7'
+
+    cur = []
+
+    LOGIC = set('⊃→]&∧^|∨Vv')
+    OPERATORS = set('+.⋅*')
+    VARIABLES = set('abcde')
+    PRIMES = set("'′")
+    NEGATORS = set('~!')
+    QUANTIFIERS = set('AE∀∃')
+    NUMBERS = set('0123456789')
+    WHITESPACE = set('\t \v\n')
+
+    RULES = re.compile('''(?xi)
+        joining | separation | double-tilde | fantasy\\ rule
+        | carry[- ]over(?:\\ of)?(?:\\ line)?\\ ([0-9]+) | detachment
+        | contrapositive | De\\ Morgan | switcheroo
+        | specification | generalization | interchange
+        | existence | symmetry | transitivity
+        | add\\ S | drop\\ S | induction
+        | axiom\\ ([1-5]) | premise | push | pop
+    ''')
+    LINENOS = re.compile(r'(?:[0-9]+)(?:(?:, ?|,? and )(?:[0-9]+))*')
+    COMMENT = re.compile(r'\[[^\n\]]+\]')
+
+    def __init__(self, *args, **kwargs):
+        Lexer.__init__(self, *args, **kwargs)
+        self.cur = []
+
+    def whitespace(self, start, text, required=False):
+        """Tokenize whitespace."""
+        end = start
+        try:
+            while text[end] in self.WHITESPACE:
+                end += 1
+        except IndexError:
+            end = len(text)
+        if required and end == start:
+            raise AssertionError
+        if end != start:
+            self.cur.append((start, Text, text[start:end]))
+        return end
+
+    def variable(self, start, text):
+        """Tokenize a variable."""
+        if text[start] not in self.VARIABLES:
+            raise AssertionError
+        end = start+1
+        while text[end] in self.PRIMES:
+            end += 1
+        self.cur.append((start, Name.Variable, text[start:end]))
+        return end
+
+    def term(self, start, text):
+        """Tokenize a term."""
+        if text[start] == 'S':  # S...S(...) or S...0
+            end = start+1
+            while text[end] == 'S':
+                end += 1
+            self.cur.append((start, Number.Integer, text[start:end]))
+            return self.term(end, text)
+        if text[start] == '0':  # the singleton 0
+            self.cur.append((start, Number.Integer, text[start]))
+            return start+1
+        if text[start] in self.VARIABLES:  # a''...
+            return self.variable(start, text)
+        if text[start] == '(':  # (...+...)
+            self.cur.append((start, Punctuation, text[start]))
+            start = self.term(start+1, text)
+            if text[start] not in self.OPERATORS:
+                raise AssertionError
+            self.cur.append((start, Operator, text[start]))
+            start = self.term(start+1, text)
+            if text[start] != ')':
+                raise AssertionError
+            self.cur.append((start, Punctuation, text[start]))
+            return start+1
+        raise AssertionError  # no matches
+
+    def formula(self, start, text):
+        """Tokenize a formula."""
+        if text[start] in self.NEGATORS:  # ~<...>
+            end = start+1
+            while text[end] in self.NEGATORS:
+                end += 1
+            self.cur.append((start, Operator, text[start:end]))
+            return self.formula(end, text)
+        if text[start] in self.QUANTIFIERS:  # Aa:<...>
+            self.cur.append((start, Keyword.Declaration, text[start]))
+            start = self.variable(start+1, text)
+            if text[start] != ':':
+                raise AssertionError
+            self.cur.append((start, Punctuation, text[start]))
+            return self.formula(start+1, text)
+        if text[start] == '<':  # <...&...>
+            self.cur.append((start, Punctuation, text[start]))
+            start = self.formula(start+1, text)
+            if text[start] not in self.LOGIC:
+                raise AssertionError
+            self.cur.append((start, Operator, text[start]))
+            start = self.formula(start+1, text)
+            if text[start] != '>':
+                raise AssertionError
+            self.cur.append((start, Punctuation, text[start]))
+            return start+1
+        # ...=...
+        start = self.term(start, text)
+        if text[start] != '=':
+            raise AssertionError
+        self.cur.append((start, Operator, text[start]))
+        start = self.term(start+1, text)
+        return start
+
+    def rule(self, start, text):
+        """Tokenize a rule."""
+        match = self.RULES.match(text, start)
+        if match is None:
+            raise AssertionError
+        groups = sorted(match.regs[1:])  # exclude whole match
+        for group in groups:
+            if group[0] >= 0:  # this group matched
+                self.cur.append((start, Keyword, text[start:group[0]]))
+                self.cur.append((group[0], Number.Integer,
+                                 text[group[0]:group[1]]))
+                if group[1] != match.end():
+                    self.cur.append((group[1], Keyword,
+                                     text[group[1]:match.end()]))
+                break
+        else:
+            self.cur.append((start, Keyword, text[start:match.end()]))
+        return match.end()
+
+    def lineno(self, start, text):
+        """Tokenize a line referral."""
+        end = start
+        while text[end] not in self.NUMBERS:
+            end += 1
+        self.cur.append((start, Punctuation, text[start]))
+        self.cur.append((start+1, Text, text[start+1:end]))
+        start = end
+        match = self.LINENOS.match(text, start)
+        if match is None:
+            raise AssertionError
+        if text[match.end()] != ')':
+            raise AssertionError
+        self.cur.append((match.start(), Number.Integer, match.group(0)))
+        self.cur.append((match.end(), Punctuation, text[match.end()]))
+        return match.end() + 1
+
+    def error_till_line_end(self, start, text):
+        """Mark everything from ``start`` to the end of the line as Error."""
+        end = start
+        try:
+            while text[end] != '\n':  # there's whitespace in rules
+                end += 1
+        except IndexError:
+            end = len(text)
+        if end != start:
+            self.cur.append((start, Error, text[start:end]))
+        end = self.whitespace(end, text)
+        return end
+
+    def get_tokens_unprocessed(self, text):
+        """Returns a list of TNT tokens."""
+        self.cur = []
+        start = end = self.whitespace(0, text)
+        while start <= end < len(text):
+            try:
+                # try line number
+                while text[end] in self.NUMBERS:
+                    end += 1
+                if end != start:  # actual number present
+                    self.cur.append((start, Number.Integer, text[start:end]))
+                    # whitespace is required after a line number
+                    orig = len(self.cur)
+                    try:
+                        start = end = self.whitespace(end, text, True)
+                    except AssertionError:
+                        del self.cur[orig:]
+                        start = end = self.error_till_line_end(end, text)
+                        continue
+                # at this point it could be a comment
+                match = self.COMMENT.match(text, start)
+                if match is not None:
+                    self.cur.append((start, Comment, text[start:match.end()]))
+                    start = end = match.end()
+                    # anything after the closing bracket is invalid
+                    start = end = self.error_till_line_end(start, text)
+                    # do not attempt to process the rest
+                    continue
+                del match
+                if text[start] in '[]':  # fantasy push or pop
+                    self.cur.append((start, Keyword, text[start]))
+                    start += 1
+                    end += 1
+                else:
+                    # one formula, possibly containing subformulae
+                    orig = len(self.cur)
+                    try:
+                        start = end = self.formula(start, text)
+                    except (AssertionError, RecursionError):  # not well-formed
+                        del self.cur[orig:]
+                        while text[end] not in self.WHITESPACE:
+                            end += 1
+                        self.cur.append((start, Error, text[start:end]))
+                        start = end
+                # skip whitespace after formula
+                orig = len(self.cur)
+                try:
+                    start = end = self.whitespace(end, text, True)
+                except AssertionError:
+                    del self.cur[orig:]
+                    start = end = self.error_till_line_end(start, text)
+                    continue
+                # rule proving this formula a theorem
+                orig = len(self.cur)
+                try:
+                    start = end = self.rule(start, text)
+                except AssertionError:
+                    del self.cur[orig:]
+                    start = end = self.error_till_line_end(start, text)
+                    continue
+                # skip whitespace after rule
+                start = end = self.whitespace(end, text)
+                # line marker
+                if text[start] == '(':
+                    orig = len(self.cur)
+                    try:
+                        start = end = self.lineno(start, text)
+                    except AssertionError:
+                        del self.cur[orig:]
+                        start = end = self.error_till_line_end(start, text)
+                        continue
+                    start = end = self.whitespace(start, text)
+            except IndexError:
+                try:
+                    del self.cur[orig:]
+                except NameError:
+                    pass  # if orig was never defined, fine
+                self.error_till_line_end(start, text)
+        return self.cur
diff --git a/.venv/Lib/site-packages/pygments/lexers/trafficscript.py b/.venv/Lib/site-packages/pygments/lexers/trafficscript.py
new file mode 100644 (file)
index 0000000..8c801c4
--- /dev/null
@@ -0,0 +1,51 @@
+"""
+    pygments.lexers.trafficscript
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for RiverBed's TrafficScript (RTS) language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import String, Number, Name, Keyword, Operator, Text, Comment
+
+__all__ = ['RtsLexer']
+
+
+class RtsLexer(RegexLexer):
+    """
+    For Riverbed Stingray Traffic Manager
+    """
+    name = 'TrafficScript'
+    aliases = ['trafficscript', 'rts']
+    filenames = ['*.rts']
+    url = 'https://riverbed.com'
+    version_added = '2.1'
+
+    tokens = {
+        'root' : [
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String),
+            (r'"', String, 'escapable-string'),
+            (r'(0x[0-9a-fA-F]+|\d+)', Number),
+            (r'\d+\.\d+', Number.Float),
+            (r'\$[a-zA-Z](\w|_)*', Name.Variable),
+            (r'(if|else|for(each)?|in|while|do|break|sub|return|import)', Keyword),
+            (r'[a-zA-Z][\w.]*', Name.Function),
+            (r'[-+*/%=,;(){}<>^.!~|&\[\]\?\:]', Operator),
+            (r'(>=|<=|==|!=|'
+             r'&&|\|\||'
+             r'\+=|.=|-=|\*=|/=|%=|<<=|>>=|&=|\|=|\^=|'
+             r'>>|<<|'
+             r'\+\+|--|=>)', Operator),
+            (r'[ \t\r]+', Text),
+            (r'#[^\n]*', Comment),
+        ],
+        'escapable-string' : [
+            (r'\\[tsn]', String.Escape),
+            (r'[^"]', String),
+            (r'"', String, '#pop'),
+        ],
+
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/typoscript.py b/.venv/Lib/site-packages/pygments/lexers/typoscript.py
new file mode 100644 (file)
index 0000000..d71d5c3
--- /dev/null
@@ -0,0 +1,216 @@
+"""
+    pygments.lexers.typoscript
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for TypoScript
+
+    `TypoScriptLexer`
+        A TypoScript lexer.
+
+    `TypoScriptCssDataLexer`
+        Lexer that highlights markers, constants and registers within css.
+
+    `TypoScriptHtmlDataLexer`
+        Lexer that highlights markers, constants and registers within html tags.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using
+from pygments.token import Text, Comment, Name, String, Number, \
+    Operator, Punctuation
+
+__all__ = ['TypoScriptLexer', 'TypoScriptCssDataLexer', 'TypoScriptHtmlDataLexer']
+
+
+class TypoScriptCssDataLexer(RegexLexer):
+    """
+    Lexer that highlights markers, constants and registers within css blocks.
+    """
+
+    name = 'TypoScriptCssData'
+    aliases = ['typoscriptcssdata']
+    url = 'http://docs.typo3.org/typo3cms/TyposcriptReference/'
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            # marker: ###MARK###
+            (r'(.*)(###\w+###)(.*)', bygroups(String, Name.Constant, String)),
+            # constant: {$some.constant}
+            (r'(\{)(\$)((?:[\w\-]+\.)*)([\w\-]+)(\})',
+             bygroups(String.Symbol, Operator, Name.Constant,
+                      Name.Constant, String.Symbol)),  # constant
+            # constant: {register:somevalue}
+            (r'(.*)(\{)([\w\-]+)(\s*:\s*)([\w\-]+)(\})(.*)',
+             bygroups(String, String.Symbol, Name.Constant, Operator,
+                      Name.Constant, String.Symbol, String)),  # constant
+            # whitespace
+            (r'\s+', Text),
+            # comments
+            (r'/\*(?:(?!\*/).)*\*/', Comment),
+            (r'(?<!(#|\'|"))(?:#(?!(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))[^\n#]+|//[^\n]*)',
+             Comment),
+            # other
+            (r'[<>,:=.*%+|]', String),
+            (r'[\w"\-!/&;(){}]+', String),
+        ]
+    }
+
+
+class TypoScriptHtmlDataLexer(RegexLexer):
+    """
+    Lexer that highlights markers, constants and registers within html tags.
+    """
+
+    name = 'TypoScriptHtmlData'
+    aliases = ['typoscripthtmldata']
+    url = 'http://docs.typo3.org/typo3cms/TyposcriptReference/'
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            # INCLUDE_TYPOSCRIPT
+            (r'(INCLUDE_TYPOSCRIPT)', Name.Class),
+            # Language label or extension resource FILE:... or LLL:... or EXT:...
+            (r'(EXT|FILE|LLL):[^}\n"]*', String),
+            # marker: ###MARK###
+            (r'(.*)(###\w+###)(.*)', bygroups(String, Name.Constant, String)),
+            # constant: {$some.constant}
+            (r'(\{)(\$)((?:[\w\-]+\.)*)([\w\-]+)(\})',
+             bygroups(String.Symbol, Operator, Name.Constant,
+                      Name.Constant, String.Symbol)),  # constant
+            # constant: {register:somevalue}
+            (r'(.*)(\{)([\w\-]+)(\s*:\s*)([\w\-]+)(\})(.*)',
+             bygroups(String, String.Symbol, Name.Constant, Operator,
+                      Name.Constant, String.Symbol, String)),  # constant
+            # whitespace
+            (r'\s+', Text),
+            # other
+            (r'[<>,:=.*%+|]', String),
+            (r'[\w"\-!/&;(){}#]+', String),
+        ]
+    }
+
+
+class TypoScriptLexer(RegexLexer):
+    """
+    Lexer for TypoScript code.
+    """
+
+    name = 'TypoScript'
+    url = 'http://docs.typo3.org/typo3cms/TyposcriptReference/'
+    aliases = ['typoscript']
+    filenames = ['*.typoscript']
+    mimetypes = ['text/x-typoscript']
+    version_added = '2.2'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'root': [
+            include('comment'),
+            include('constant'),
+            include('html'),
+            include('label'),
+            include('whitespace'),
+            include('keywords'),
+            include('punctuation'),
+            include('operator'),
+            include('structure'),
+            include('literal'),
+            include('other'),
+        ],
+        'keywords': [
+            # Conditions
+            (r'(?i)(\[)(browser|compatVersion|dayofmonth|dayofweek|dayofyear|'
+             r'device|ELSE|END|GLOBAL|globalString|globalVar|hostname|hour|IP|'
+             r'language|loginUser|loginuser|minute|month|page|PIDinRootline|'
+             r'PIDupinRootline|system|treeLevel|useragent|userFunc|usergroup|'
+             r'version)([^\]]*)(\])',
+             bygroups(String.Symbol, Name.Constant, Text, String.Symbol)),
+            # Functions
+            (r'(?=[\w\-])(HTMLparser|HTMLparser_tags|addParams|cache|encapsLines|'
+             r'filelink|if|imageLinkWrap|imgResource|makelinks|numRows|numberFormat|'
+             r'parseFunc|replacement|round|select|split|stdWrap|strPad|tableStyle|'
+             r'tags|textStyle|typolink)(?![\w\-])', Name.Function),
+            # Toplevel objects and _*
+            (r'(?:(=?\s*<?\s+|^\s*))(cObj|field|config|content|constants|FEData|'
+             r'file|frameset|includeLibs|lib|page|plugin|register|resources|sitemap|'
+             r'sitetitle|styles|temp|tt_[^:.\s]*|types|xmlnews|INCLUDE_TYPOSCRIPT|'
+             r'_CSS_DEFAULT_STYLE|_DEFAULT_PI_VARS|_LOCAL_LANG)(?![\w\-])',
+             bygroups(Operator, Name.Builtin)),
+            # Content objects
+            (r'(?=[\w\-])(CASE|CLEARGIF|COA|COA_INT|COBJ_ARRAY|COLUMNS|CONTENT|'
+             r'CTABLE|EDITPANEL|FILE|FILES|FLUIDTEMPLATE|FORM|HMENU|HRULER|HTML|'
+             r'IMAGE|IMGTEXT|IMG_RESOURCE|LOAD_REGISTER|MEDIA|MULTIMEDIA|OTABLE|'
+             r'PAGE|QTOBJECT|RECORDS|RESTORE_REGISTER|SEARCHRESULT|SVG|SWFOBJECT|'
+             r'TEMPLATE|TEXT|USER|USER_INT)(?![\w\-])', Name.Class),
+            # Menu states
+            (r'(?=[\w\-])(ACTIFSUBRO|ACTIFSUB|ACTRO|ACT|CURIFSUBRO|CURIFSUB|CURRO|'
+             r'CUR|IFSUBRO|IFSUB|NO|SPC|USERDEF1RO|USERDEF1|USERDEF2RO|USERDEF2|'
+             r'USRRO|USR)', Name.Class),
+            # Menu objects
+            (r'(?=[\w\-])(GMENU_FOLDOUT|GMENU_LAYERS|GMENU|IMGMENUITEM|IMGMENU|'
+             r'JSMENUITEM|JSMENU|TMENUITEM|TMENU_LAYERS|TMENU)', Name.Class),
+            # PHP objects
+            (r'(?=[\w\-])(PHP_SCRIPT(_EXT|_INT)?)', Name.Class),
+            (r'(?=[\w\-])(userFunc)(?![\w\-])', Name.Function),
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+        ],
+        'html': [
+            (r'<\S[^\n>]*>', using(TypoScriptHtmlDataLexer)),
+            (r'&[^;\n]*;', String),
+            (r'(?s)(_CSS_DEFAULT_STYLE)(\s*)(\()(.*(?=\n\)))',
+             bygroups(Name.Class, Text, String.Symbol, using(TypoScriptCssDataLexer))),
+        ],
+        'literal': [
+            (r'0x[0-9A-Fa-f]+t?', Number.Hex),
+            # (r'[0-9]*\.[0-9]+([eE][0-9]+)?[fd]?\s*(?:[^=])', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r'(###\w+###)', Name.Constant),
+        ],
+        'label': [
+            # Language label or extension resource FILE:... or LLL:... or EXT:...
+            (r'(EXT|FILE|LLL):[^}\n"]*', String),
+            # Path to a resource
+            (r'(?![^\w\-])([\w\-]+(?:/[\w\-]+)+/?)(\S*\n)',
+             bygroups(String, String)),
+        ],
+        'punctuation': [
+            (r'[,.]', Punctuation),
+        ],
+        'operator': [
+            (r'[<>,:=.*%+|]', Operator),
+        ],
+        'structure': [
+            # Brackets and braces
+            (r'[{}()\[\]\\]', String.Symbol),
+        ],
+        'constant': [
+            # Constant: {$some.constant}
+            (r'(\{)(\$)((?:[\w\-]+\.)*)([\w\-]+)(\})',
+                bygroups(String.Symbol, Operator, Name.Constant,
+                         Name.Constant, String.Symbol)),  # constant
+            # Constant: {register:somevalue}
+            (r'(\{)([\w\-]+)(\s*:\s*)([\w\-]+)(\})',
+                bygroups(String.Symbol, Name.Constant, Operator,
+                         Name.Constant, String.Symbol)),  # constant
+            # Hex color: #ff0077
+            (r'(#[a-fA-F0-9]{6}\b|#[a-fA-F0-9]{3}\b)', String.Char)
+        ],
+        'comment': [
+            (r'(?<!(#|\'|"))(?:#(?!(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))[^\n#]+|//[^\n]*)',
+             Comment),
+            (r'/\*(?:(?!\*/).)*\*/', Comment),
+            (r'(\s*#\s*\n)', Comment),
+        ],
+        'other': [
+            (r'[\w"\-!/&;]+', Text),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/typst.py b/.venv/Lib/site-packages/pygments/lexers/typst.py
new file mode 100644 (file)
index 0000000..21f8efd
--- /dev/null
@@ -0,0 +1,160 @@
+"""
+    pygments.lexers.typst
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Typst language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, bygroups, include
+from pygments.token import Comment, Keyword, Name, String, Punctuation, \
+    Whitespace, Generic, Operator, Number, Text
+from pygments.util import get_choice_opt
+
+__all__ = ['TypstLexer']
+
+
+class TypstLexer(RegexLexer):
+    """
+    For Typst code.
+
+    Additional options accepted:
+
+    `start`
+        Specifies the starting state of the lexer (one of 'markup', 'math',
+        'code'). The default is 'markup'.
+    """
+
+    name = 'Typst'
+    aliases = ['typst']
+    filenames = ['*.typ']
+    mimetypes = ['text/x-typst']
+    url = 'https://typst.app'
+    version_added = '2.18'
+
+    MATH_SHORTHANDS = (
+        '[|', '|]', '||', '*', ':=', '::=', '...', '\'', '-', '=:', '!=', '>>',
+        '>=', '>>>', '<<', '<=', '<<<', '->', '|->', '=>', '|=>', '==>',
+        '-->', '~~>', '~>', '>->', '->>', '<-', '<==', '<--', '<~~', '<~',
+        '<-<','<<-','<->','<=>','<==>','<-->', '>', '<', '~', ':', '|'
+    )
+
+    tokens = {
+        'root': [
+            include('markup'),
+        ],
+        # common cases going from math/markup into code mode
+        'into_code': [
+            (words(('#let', '#set', '#show'), suffix=r'\b'), Keyword.Declaration, 'inline_code'),
+            (words(('#import', '#include'), suffix=r'\b'), Keyword.Namespace, 'inline_code'),
+            (words(('#if', '#for', '#while', '#export'), suffix=r'\b'), Keyword.Reserved, 'inline_code'),
+            (r'#\{', Punctuation, 'code'),
+            (r'#\(', Punctuation, 'code'),
+            (r'(#[a-zA-Z_][a-zA-Z0-9_-]*)(\[)', bygroups(Name.Function, Punctuation), 'markup'),
+            (r'(#[a-zA-Z_][a-zA-Z0-9_-]*)(\()', bygroups(Name.Function, Punctuation), 'code'),
+            (words(('#true', '#false', '#none', '#auto'), suffix=r'\b'), Keyword.Constant),
+            (r'#[a-zA-Z_][a-zA-Z0-9_]*', Name.Variable),
+            (r'#0x[0-9a-fA-F]+', Number.Hex),
+            (r'#0b[01]+', Number.Bin),
+            (r'#0o[0-7]+', Number.Oct),
+            (r'#[0-9]+[\.e][0-9]+', Number.Float),
+            (r'#[0-9]+', Number.Integer),
+        ],
+        'markup': [
+            include('comment'),
+            (r'^\s*=+.*$', Generic.Heading),
+            (r'[*][^*]*[*]', Generic.Strong),
+            (r'_[^_]*_', Generic.Emph),
+            (r'\$', Punctuation, 'math'),
+            (r'`[^`]*`', String.Backtick),  # inline code
+            (r'^(\s*)(-)(\s+)', bygroups(Whitespace, Punctuation, Whitespace)),  # unnumbered list
+            (r'^(\s*)(\+)(\s+)', bygroups(Whitespace, Punctuation, Whitespace)),  # numbered list
+            (r'^(\s*)([0-9]+\.)', bygroups(Whitespace, Punctuation)),  # numbered list variant
+            (r'^(\s*)(/)(\s+)([^:]+)(:)', bygroups(Whitespace, Punctuation, Whitespace, Name.Variable, Punctuation)),  # definitions
+            (r'<[a-zA-Z_][a-zA-Z0-9_-]*>', Name.Label),  # label
+            (r'@[a-zA-Z_][a-zA-Z0-9_-]*', Name.Label),  # reference
+            (r'\\#', Text), # escaped
+            include('into_code'),
+            (r'```(?:.|\n)*?```', String.Backtick),  # code block
+            (r'https?://[0-9a-zA-Z~/%#&=\',;.+?]*', Generic.Emph),  # links
+            (words(('---', '\\', '~', '--', '...'), suffix=r'\B'), Punctuation),  # special chars shorthand
+            (r'\\\[', Punctuation),  # escaped
+            (r'\\\]', Punctuation),  # escaped
+            (r'\[', Punctuation, '#push'),
+            (r'\]', Punctuation, '#pop'),
+            (r'[ \t]+\n?|\n', Whitespace),
+            (r'((?![*_$`<@\\#\] ]|https?://).)+', Text),
+        ],
+        'math': [
+            include('comment'),
+            (words(('\\_', '\\^', '\\&')), Text), # escapes
+            (words(('_', '^', '&', ';')), Punctuation),
+            (words(('+', '/', '=') + MATH_SHORTHANDS), Operator),
+            (r'\\', Punctuation), # line break
+            (r'\\\$', Punctuation),  # escaped
+            (r'\$', Punctuation, '#pop'),  # end of math mode
+            include('into_code'),
+            (r'([a-zA-Z][a-zA-Z0-9-]*)(\s*)(\()', bygroups(Name.Function, Whitespace, Punctuation)),
+            (r'([a-zA-Z][a-zA-Z0-9-]*)(:)', bygroups(Name.Variable, Punctuation)), # named arguments in math functions
+            (r'([a-zA-Z][a-zA-Z0-9-]*)', Name.Variable), # both variables and symbols (_ isn't supported for variables)
+            (r'[0-9]+(\.[0-9]+)?', Number),
+            (r'\.{1,3}|\(|\)|,|\{|\}', Punctuation),
+            (r'"[^"]*"', String.Double),
+            (r'[ \t\n]+', Whitespace),
+        ],
+        'comment': [
+            (r'//.*$', Comment.Single),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+        ],
+        'code': [
+            include('comment'),
+            (r'\[', Punctuation, 'markup'),
+            (r'\(|\{', Punctuation, 'code'),
+            (r'\)|\}', Punctuation, '#pop'),
+            (r'"[^"]*"', String.Double),
+            (r',|\.{1,2}', Punctuation),
+            (r'=', Operator),
+            (words(('and', 'or', 'not'), suffix=r'\b'), Operator.Word),
+            (r'=>|<=|==|!=|>|<|-=|\+=|\*=|/=|\+|-|\\|\*', Operator), # comparisons
+            (r'([a-zA-Z_][a-zA-Z0-9_-]*)(:)', bygroups(Name.Variable, Punctuation)),
+            (r'([a-zA-Z_][a-zA-Z0-9_-]*)(\()', bygroups(Name.Function, Punctuation), 'code'),
+            (words(('as', 'break', 'export', 'continue', 'else', 'for', 'if',
+                    'in', 'return', 'while'), suffix=r'\b'),
+             Keyword.Reserved),
+             (words(('import', 'include'), suffix=r'\b'), Keyword.Namespace),
+            (words(('auto', 'none', 'true', 'false'), suffix=r'\b'), Keyword.Constant),
+            (r'([0-9.]+)(mm|pt|cm|in|em|fr|%)', bygroups(Number, Keyword.Reserved)),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'[0-9]+[\.e][0-9]+', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (words(('let', 'set', 'show'), suffix=r'\b'), Keyword.Declaration),
+            # FIXME: make this work
+            ## (r'(import|include)( *)(")([^"])(")',
+            ##  bygroups(Keyword.Reserved, Text, Punctuation, String.Double, Punctuation)),
+            (r'([a-zA-Z_][a-zA-Z0-9_-]*)', Name.Variable),
+            (r'[ \t\n]+', Whitespace),
+            (r':', Punctuation), # from imports like "import a: b" or "show: text.with(..)"
+        ],
+        'inline_code': [
+            (r';\b', Punctuation, '#pop'),
+            (r'\n', Whitespace, '#pop'),
+            include('code'),
+        ],
+    }
+
+    def __init__(self, **options):
+        self.start_state = get_choice_opt(
+            options, 'start', ['markup', 'code', 'math'], 'markup', True)
+
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        if self.start_state != 'markup': # markup is equivalent to root
+            stack.append(self.start_state)
+
+        yield from RegexLexer.get_tokens_unprocessed(self, text, stack)
diff --git a/.venv/Lib/site-packages/pygments/lexers/ul4.py b/.venv/Lib/site-packages/pygments/lexers/ul4.py
new file mode 100644 (file)
index 0000000..552832c
--- /dev/null
@@ -0,0 +1,309 @@
+"""
+    pygments.lexers.ul4
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the UL4 templating language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, DelegatingLexer, bygroups, words, include
+from pygments.token import Comment, Text, Keyword, String, Number, Literal, \
+    Name, Other, Operator
+from pygments.lexers.web import HtmlLexer, XmlLexer, CssLexer, JavascriptLexer
+from pygments.lexers.python import PythonLexer
+
+__all__ = ['UL4Lexer', 'HTMLUL4Lexer', 'XMLUL4Lexer', 'CSSUL4Lexer',
+           'JavascriptUL4Lexer', 'PythonUL4Lexer']
+
+
+class UL4Lexer(RegexLexer):
+    """
+    Generic lexer for UL4.
+    """
+
+    flags = re.MULTILINE | re.DOTALL
+
+    name = 'UL4'
+    aliases = ['ul4']
+    filenames = ['*.ul4']
+    url = 'https://python.livinglogic.de/UL4.html'
+    version_added = '2.12'
+
+    tokens = {
+        "root": [
+            (
+                # Template header without name:
+                # ``<?ul4?>``
+                r"(<\?)(\s*)(ul4)(\s*)(\?>)",
+                bygroups(Comment.Preproc, Text.Whitespace, Keyword,
+                         Text.Whitespace, Comment.Preproc),
+            ),
+            (
+                # Template header with name (potentially followed by the signature):
+                # ``<?ul4 foo(bar=42)?>``
+                r"(<\?)(\s*)(ul4)(\s*)([a-zA-Z_][a-zA-Z_0-9]*)?",
+                bygroups(Comment.Preproc, Text.Whitespace, Keyword,
+                         Text.Whitespace, Name.Function),
+                "ul4", # Switch to "expression" mode
+            ),
+            (
+                # Comment:
+                # ``<?note?>...<?end note?>``
+                r"<\?\s*note\s*\?>",
+                Comment,
+                "note", # Switch to "note" mode
+            ),
+            (
+                # Comment:
+                # ``<?note foobar?>``
+                r"<\?\s*note\s.*?\?>",
+                Comment,
+            ),
+            (
+                # Template documentation:
+                # ``<?doc?>...<?end doc?>``
+                r"<\?\s*doc\s*\?>",
+                String.Doc,
+                "doc",
+            ),
+            (
+                # Template documentation:
+                # ``<?doc foobar?>``
+                r"<\?\s*doc\s.*?\?>",
+                String.Doc,
+            ),
+            (
+                # ``<?ignore?>`` tag for commenting out code:
+                # ``<?ignore?>...<?end ignore?>``
+                r"<\?\s*ignore\s*\?>",
+                Comment,
+                "ignore", # Switch to "ignore" mode
+            ),
+            (
+                # ``<?def?>`` tag for defining local templates
+                # ``<?def foo(bar=42)?>...<?end def?>``
+                r"(<\?)(\s*)(def)(\s*)([a-zA-Z_][a-zA-Z_0-9]*)?",
+                bygroups(Comment.Preproc, Text.Whitespace, Keyword,
+                         Text.Whitespace, Name.Function),
+                "ul4", # Switch to "expression" mode
+            ),
+            (
+                # The rest of the supported tags
+                r"(<\?)(\s*)(printx|print|for|if|elif|else|while|code|renderblocks?|render)\b",
+                bygroups(Comment.Preproc, Text.Whitespace, Keyword),
+                "ul4", # Switch to "expression" mode
+            ),
+            (
+                # ``<?end?>`` tag for ending ``<?def?>``, ``<?for?>``,
+                # ``<?if?>``, ``<?while?>``, ``<?renderblock?>`` and
+                # ``<?renderblocks?>`` blocks.
+                r"(<\?)(\s*)(end)\b",
+                bygroups(Comment.Preproc, Text.Whitespace, Keyword),
+                "end", # Switch to "end tag" mode
+            ),
+            (
+                # ``<?whitespace?>`` tag for configuring whitespace handlng
+                r"(<\?)(\s*)(whitespace)\b",
+                bygroups(Comment.Preproc, Text.Whitespace, Keyword),
+                "whitespace", # Switch to "whitespace" mode
+            ),
+            # Plain text
+            (r"[^<]+", Other),
+            (r"<", Other),
+        ],
+        # Ignore mode ignores everything upto the matching ``<?end ignore?>`` tag
+        "ignore": [
+            # Nested ``<?ignore?>`` tag
+            (r"<\?\s*ignore\s*\?>", Comment, "#push"),
+            # ``<?end ignore?>`` tag
+            (r"<\?\s*end\s+ignore\s*\?>", Comment, "#pop"),
+            # Everything else
+            (r"[^<]+", Comment),
+            (r".", Comment),
+        ],
+        # Note mode ignores everything upto the matching ``<?end note?>`` tag
+        "note": [
+            # Nested ``<?note?>`` tag
+            (r"<\?\s*note\s*\?>", Comment, "#push"),
+            # ``<?end note?>`` tag
+            (r"<\?\s*end\s+note\s*\?>", Comment, "#pop"),
+            # Everything else
+            (r"[^<]+", Comment),
+            (r".", Comment),
+        ],
+        # Doc mode ignores everything upto the matching ``<?end doc?>`` tag
+        "doc": [
+            # Nested ``<?doc?>`` tag
+            (r"<\?\s*doc\s*\?>", String.Doc, "#push"),
+            # ``<?end doc?>`` tag
+            (r"<\?\s*end\s+doc\s*\?>", String.Doc, "#pop"),
+            # Everything else
+            (r"[^<]+", String.Doc),
+            (r".", String.Doc),
+        ],
+        # UL4 expressions
+        "ul4": [
+            # End the tag
+            (r"\?>", Comment.Preproc, "#pop"),
+            # Start triple quoted string constant
+            ("'''", String, "string13"),
+            ('"""', String, "string23"),
+            # Start single quoted string constant
+            ("'", String, "string1"),
+            ('"', String, "string2"),
+            # Floating point number
+            (r"\d+\.\d*([eE][+-]?\d+)?", Number.Float),
+            (r"\.\d+([eE][+-]?\d+)?", Number.Float),
+            (r"\d+[eE][+-]?\d+", Number.Float),
+            # Binary integer: ``0b101010``
+            (r"0[bB][01]+", Number.Bin),
+            # Octal integer: ``0o52``
+            (r"0[oO][0-7]+", Number.Oct),
+            # Hexadecimal integer: ``0x2a``
+            (r"0[xX][0-9a-fA-F]+", Number.Hex),
+            # Date or datetime: ``@(2000-02-29)``/``@(2000-02-29T12:34:56.987654)``
+            (r"@\(\d\d\d\d-\d\d-\d\d(T(\d\d:\d\d(:\d\d(\.\d{6})?)?)?)?\)", Literal.Date),
+            # Color: ``#fff``, ``#fff8f0`` etc.
+            (r"#[0-9a-fA-F]{8}", Literal.Color),
+            (r"#[0-9a-fA-F]{6}", Literal.Color),
+            (r"#[0-9a-fA-F]{3,4}", Literal.Color),
+            # Decimal integer: ``42``
+            (r"\d+", Number.Integer),
+            # Operators
+            (r"//|==|!=|>=|<=|<<|>>|\+=|-=|\*=|/=|//=|<<=|>>=|&=|\|=|^=|=|[\[\]{},:*/().~%&|<>^+-]", Operator),
+            # Keywords
+            (words(("for", "in", "if", "else", "not", "is", "and", "or"), suffix=r"\b"), Keyword),
+            # Builtin constants
+            (words(("None", "False", "True"), suffix=r"\b"), Keyword.Constant),
+            # Variable names
+            (r"[a-zA-Z_][a-zA-Z0-9_]*", Name),
+            # Whitespace
+            (r"\s+", Text.Whitespace),
+        ],
+        # ``<?end ...?>`` tag for closing the last open block
+        "end": [
+            (r"\?>", Comment.Preproc, "#pop"),
+            (words(("for", "if", "def", "while", "renderblock", "renderblocks"), suffix=r"\b"), Keyword),
+            (r"\s+", Text),
+        ],
+        # Content of the ``<?whitespace ...?>`` tag:
+        # ``keep``, ``strip`` or ``smart``
+        "whitespace": [
+            (r"\?>", Comment.Preproc, "#pop"),
+            (words(("keep", "strip", "smart"), suffix=r"\b"), Comment.Preproc),
+            (r"\s+", Text.Whitespace),
+        ],
+        # Inside a string constant
+        "stringescapes": [
+            (r"""\\[\\'"abtnfr]""", String.Escape),
+            (r"\\x[0-9a-fA-F]{2}", String.Escape),
+            (r"\\u[0-9a-fA-F]{4}", String.Escape),
+            (r"\\U[0-9a-fA-F]{8}", String.Escape),
+        ],
+        # Inside a triple quoted string started with ``'''``
+        "string13": [
+            (r"'''", String, "#pop"),
+            include("stringescapes"),
+            (r"[^\\']+", String),
+            (r'.', String),
+        ],
+        # Inside a triple quoted string started with ``"""``
+        "string23": [
+            (r'"""', String, "#pop"),
+            include("stringescapes"),
+            (r'[^\\"]+', String),
+            (r'.', String),
+        ],
+        # Inside a single quoted string started with ``'``
+        "string1": [
+            (r"'", String, "#pop"),
+            include("stringescapes"),
+            (r"[^\\']+", String),
+            (r'.', String),
+        ],
+        # Inside a single quoted string started with ``"``
+        "string2": [
+            (r'"', String, "#pop"),
+            include("stringescapes"),
+            (r'[^\\"]+', String),
+            (r'.', String),
+        ],
+    }
+
+class HTMLUL4Lexer(DelegatingLexer):
+    """
+    Lexer for UL4 embedded in HTML.
+    """
+
+    name = 'HTML+UL4'
+    aliases = ['html+ul4']
+    filenames = ['*.htmlul4']
+    url = 'https://python.livinglogic.de/UL4.html'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(HtmlLexer, UL4Lexer, **options)
+
+
+class XMLUL4Lexer(DelegatingLexer):
+    """
+    Lexer for UL4 embedded in XML.
+    """
+
+    name = 'XML+UL4'
+    aliases = ['xml+ul4']
+    filenames = ['*.xmlul4']
+    url = 'https://python.livinglogic.de/UL4.html'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(XmlLexer, UL4Lexer, **options)
+
+
+class CSSUL4Lexer(DelegatingLexer):
+    """
+    Lexer for UL4 embedded in CSS.
+    """
+
+    name = 'CSS+UL4'
+    aliases = ['css+ul4']
+    filenames = ['*.cssul4']
+    url = 'https://python.livinglogic.de/UL4.html'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(CssLexer, UL4Lexer, **options)
+
+
+class JavascriptUL4Lexer(DelegatingLexer):
+    """
+    Lexer for UL4 embedded in Javascript.
+    """
+
+    name = 'Javascript+UL4'
+    aliases = ['js+ul4']
+    filenames = ['*.jsul4']
+    url = 'https://python.livinglogic.de/UL4.html'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(JavascriptLexer, UL4Lexer, **options)
+
+
+class PythonUL4Lexer(DelegatingLexer):
+    """
+    Lexer for UL4 embedded in Python.
+    """
+
+    name = 'Python+UL4'
+    aliases = ['py+ul4']
+    filenames = ['*.pyul4']
+    url = 'https://python.livinglogic.de/UL4.html'
+    version_added = ''
+
+    def __init__(self, **options):
+        super().__init__(PythonLexer, UL4Lexer, **options)
diff --git a/.venv/Lib/site-packages/pygments/lexers/unicon.py b/.venv/Lib/site-packages/pygments/lexers/unicon.py
new file mode 100644 (file)
index 0000000..1077661
--- /dev/null
@@ -0,0 +1,413 @@
+"""
+    pygments.lexers.unicon
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Icon and Unicon languages, including ucode VM.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, words, using, this
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['IconLexer', 'UcodeLexer', 'UniconLexer']
+
+
+class UniconLexer(RegexLexer):
+    """
+    For Unicon source code.
+    """
+
+    name = 'Unicon'
+    aliases = ['unicon']
+    filenames = ['*.icn']
+    mimetypes = ['text/unicon']
+    url = 'https://www.unicon.org'
+    version_added = '2.4'
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'#.*?\n', Comment.Single),
+            (r'[^\S\n]+', Text),
+            (r'class|method|procedure', Keyword.Declaration, 'subprogram'),
+            (r'(record)(\s+)(\w+)',
+             bygroups(Keyword.Declaration, Text, Keyword.Type), 'type_def'),
+            (r'(#line|\$C|\$Cend|\$define|\$else|\$endif|\$error|\$ifdef|'
+             r'\$ifndef|\$include|\$line|\$undef)\b', Keyword.PreProc),
+            (r'(&null|&fail)\b', Keyword.Constant),
+            (r'&allocated|&ascii|&clock|&collections|&column|&col|&control|'
+             r'&cset|&current|&dateline|&date|&digits|&dump|'
+             r'&errno|&errornumber|&errortext|&errorvalue|&error|&errout|'
+             r'&eventcode|&eventvalue|&eventsource|&e|'
+             r'&features|&file|&host|&input|&interval|&lcase|&letters|'
+             r'&level|&line|&ldrag|&lpress|&lrelease|'
+             r'&main|&mdrag|&meta|&mpress|&mrelease|&now|&output|'
+             r'&phi|&pick|&pi|&pos|&progname|'
+             r'&random|&rdrag|&regions|&resize|&row|&rpress|&rrelease|'
+             r'&shift|&source|&storage|&subject|'
+             r'&time|&trace|&ucase|&version|'
+             r'&window|&x|&y', Keyword.Reserved),
+            (r'(by|of|not|to)\b', Keyword.Reserved),
+            (r'(global|local|static|abstract)\b', Keyword.Reserved),
+            (r'package|link|import', Keyword.Declaration),
+            (words((
+                'break', 'case', 'create', 'critical', 'default', 'end', 'all',
+                'do', 'else', 'every', 'fail', 'if', 'import', 'initial',
+                'initially', 'invocable', 'next',
+                'repeat', 'return', 'suspend',
+                'then', 'thread', 'until', 'while'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+            (words((
+                'Abort', 'abs', 'acos', 'Active', 'Alert', 'any', 'Any', 'Arb',
+                'Arbno', 'args', 'array', 'asin', 'atan', 'atanh', 'Attrib',
+                'Bal', 'bal', 'Bg', 'Break', 'Breakx',
+                'callout', 'center', 'char', 'chdir', 'chmod', 'chown', 'chroot',
+                'classname', 'Clip', 'Clone', 'close', 'cofail', 'collect',
+                'Color', 'ColorValue', 'condvar', 'constructor', 'copy',
+                'CopyArea', 'cos', 'Couple', 'crypt', 'cset', 'ctime',
+                'dbcolumns', 'dbdriver', 'dbkeys', 'dblimits', 'dbproduct',
+                'dbtables', 'delay', 'delete', 'detab', 'display', 'DrawArc',
+                'DrawCircle', 'DrawCube', 'DrawCurve', 'DrawCylinder',
+                'DrawDisk', 'DrawImage', 'DrawLine', 'DrawPoint', 'DrawPolygon',
+                'DrawRectangle', 'DrawSegment', 'DrawSphere', 'DrawString',
+                'DrawTorus', 'dtor',
+                'entab', 'EraseArea', 'errorclear', 'Event', 'eventmask',
+                'EvGet', 'EvSend', 'exec', 'exit', 'exp', 'Eye',
+                'Fail', 'fcntl', 'fdup', 'Fence', 'fetch', 'Fg', 'fieldnames',
+                'filepair', 'FillArc', 'FillCircle', 'FillPolygon',
+                'FillRectangle', 'find', 'flock', 'flush', 'Font', 'fork',
+                'FreeColor', 'FreeSpace', 'function',
+                'get', 'getch', 'getche', 'getegid', 'getenv', 'geteuid',
+                'getgid', 'getgr', 'gethost', 'getpgrp', 'getpid', 'getppid',
+                'getpw', 'getrusage', 'getserv', 'GetSpace', 'gettimeofday',
+                'getuid', 'globalnames', 'GotoRC', 'GotoXY', 'gtime', 'hardlink',
+                'iand', 'icom', 'IdentityMatrix', 'image', 'InPort', 'insert',
+                'Int86', 'integer', 'ioctl', 'ior', 'ishift', 'istate', 'ixor',
+                'kbhit', 'key', 'keyword', 'kill',
+                'left', 'Len', 'list', 'load', 'loadfunc', 'localnames',
+                'lock', 'log', 'Lower', 'lstat',
+                'many', 'map', 'match', 'MatrixMode', 'max', 'member',
+                'membernames', 'methodnames', 'methods', 'min', 'mkdir', 'move',
+                'MultMatrix', 'mutex',
+                'name', 'NewColor', 'Normals', 'NotAny', 'numeric',
+                'open', 'opencl', 'oprec', 'ord', 'OutPort',
+                'PaletteChars', 'PaletteColor', 'PaletteKey', 'paramnames',
+                'parent', 'Pattern', 'Peek', 'Pending', 'pipe', 'Pixel',
+                'PlayAudio', 'Poke', 'pop', 'PopMatrix', 'Pos', 'pos',
+                'proc', 'pull', 'push', 'PushMatrix', 'PushRotate', 'PushScale',
+                'PushTranslate', 'put',
+                'QueryPointer',
+                'Raise', 'read', 'ReadImage', 'readlink', 'reads', 'ready',
+                'real', 'receive', 'Refresh', 'Rem', 'remove', 'rename',
+                'repl', 'reverse', 'right', 'rmdir', 'Rotate', 'Rpos',
+                'Rtab', 'rtod', 'runerr',
+                'save', 'Scale', 'seek', 'select', 'send', 'seq',
+                'serial', 'set', 'setenv', 'setgid', 'setgrent',
+                'sethostent', 'setpgrp', 'setpwent', 'setservent',
+                'setuid', 'signal', 'sin', 'sort', 'sortf', 'Span',
+                'spawn', 'sql', 'sqrt', 'stat', 'staticnames', 'stop',
+                'StopAudio', 'string', 'structure', 'Succeed', 'Swi',
+                'symlink', 'sys_errstr', 'system', 'syswrite',
+                'Tab', 'tab', 'table', 'tan',
+                'Texcoord', 'Texture', 'TextWidth', 'Translate',
+                'trap', 'trim', 'truncate', 'trylock', 'type',
+                'umask', 'Uncouple', 'unlock', 'upto', 'utime',
+                'variable', 'VAttrib',
+                'wait', 'WAttrib', 'WDefault', 'WFlush', 'where',
+                'WinAssociate', 'WinButton', 'WinColorDialog', 'WindowContents',
+                'WinEditRegion', 'WinFontDialog', 'WinMenuBar', 'WinOpenDialog',
+                'WinPlayMedia', 'WinSaveDialog', 'WinScrollBar', 'WinSelectDialog',
+                'write', 'WriteImage', 'writes', 'WSection',
+                'WSync'), prefix=r'\b', suffix=r'\b'),
+             Name.Function),
+            include('numbers'),
+            (r'<@|<<@|>@|>>@|\.>|->|===|~===|\*\*|\+\+|--|\.|~==|~=|<=|>=|==|'
+             r'=|<<=|<<|>>=|>>|:=:|:=|->|<->|\+:=|\|', Operator),
+            (r'"(?:[^\\"]|\\.)*"', String),
+            (r"'(?:[^\\']|\\.)*'", String.Character),
+            (r'[*<>+=/&!?@~\\-]', Operator),
+            (r'\^', Operator),
+            (r'(\w+)(\s*|[(,])', bygroups(Name, using(this))),
+            (r"[\[\]]", Punctuation),
+            (r"<>|=>|[()|:;,.'`{}%&?]", Punctuation),
+            (r'\n+', Text),
+        ],
+        'numbers': [
+            (r'\b([+-]?([2-9]|[12][0-9]|3[0-6])[rR][0-9a-zA-Z]+)\b', Number.Hex),
+            (r'[+-]?[0-9]*\.([0-9]*)([Ee][+-]?[0-9]*)?', Number.Float),
+            (r'\b([+-]?[0-9]+[KMGTPkmgtp]?)\b', Number.Integer),
+        ],
+        'subprogram': [
+            (r'\(', Punctuation, ('#pop', 'formal_part')),
+            (r';', Punctuation, '#pop'),
+            (r'"[^"]+"|\w+', Name.Function),
+            include('root'),
+        ],
+        'type_def': [
+            (r'\(', Punctuation, 'formal_part'),
+        ],
+        'formal_part': [
+            (r'\)', Punctuation, '#pop'),
+            (r'\w+', Name.Variable),
+            (r',', Punctuation),
+            (r'(:string|:integer|:real)\b', Keyword.Reserved),
+            include('root'),
+        ],
+    }
+
+
+class IconLexer(RegexLexer):
+    """
+    Lexer for Icon.
+    """
+    name = 'Icon'
+    aliases = ['icon']
+    filenames = ['*.icon', '*.ICON']
+    mimetypes = []
+    url = 'https://www2.cs.arizona.edu/icon'
+    version_added = '1.6'
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'#.*?\n', Comment.Single),
+            (r'[^\S\n]+', Text),
+            (r'class|method|procedure', Keyword.Declaration, 'subprogram'),
+            (r'(record)(\s+)(\w+)',
+             bygroups(Keyword.Declaration, Text, Keyword.Type), 'type_def'),
+            (r'(#line|\$C|\$Cend|\$define|\$else|\$endif|\$error|\$ifdef|'
+             r'\$ifndef|\$include|\$line|\$undef)\b', Keyword.PreProc),
+            (r'(&null|&fail)\b', Keyword.Constant),
+            (r'&allocated|&ascii|&clock|&collections|&column|&col|&control|'
+             r'&cset|&current|&dateline|&date|&digits|&dump|'
+             r'&errno|&errornumber|&errortext|&errorvalue|&error|&errout|'
+             r'&eventcode|&eventvalue|&eventsource|&e|'
+             r'&features|&file|&host|&input|&interval|&lcase|&letters|'
+             r'&level|&line|&ldrag|&lpress|&lrelease|'
+             r'&main|&mdrag|&meta|&mpress|&mrelease|&now|&output|'
+             r'&phi|&pick|&pi|&pos|&progname|'
+             r'&random|&rdrag|&regions|&resize|&row|&rpress|&rrelease|'
+             r'&shift|&source|&storage|&subject|'
+             r'&time|&trace|&ucase|&version|'
+             r'&window|&x|&y', Keyword.Reserved),
+            (r'(by|of|not|to)\b', Keyword.Reserved),
+            (r'(global|local|static)\b', Keyword.Reserved),
+            (r'link', Keyword.Declaration),
+            (words((
+                'break', 'case', 'create', 'default', 'end', 'all',
+                'do', 'else', 'every', 'fail', 'if', 'initial',
+                'invocable', 'next',
+                'repeat', 'return', 'suspend',
+                'then', 'until', 'while'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Reserved),
+            (words((
+                'abs', 'acos', 'Active', 'Alert', 'any',
+                'args', 'array', 'asin', 'atan', 'atanh', 'Attrib',
+                'bal', 'Bg',
+                'callout', 'center', 'char', 'chdir', 'chmod', 'chown', 'chroot',
+                'Clip', 'Clone', 'close', 'cofail', 'collect',
+                'Color', 'ColorValue', 'condvar', 'copy',
+                'CopyArea', 'cos', 'Couple', 'crypt', 'cset', 'ctime',
+                'delay', 'delete', 'detab', 'display', 'DrawArc',
+                'DrawCircle', 'DrawCube', 'DrawCurve', 'DrawCylinder',
+                'DrawDisk', 'DrawImage', 'DrawLine', 'DrawPoint', 'DrawPolygon',
+                'DrawRectangle', 'DrawSegment', 'DrawSphere', 'DrawString',
+                'DrawTorus', 'dtor',
+                'entab', 'EraseArea', 'errorclear', 'Event', 'eventmask',
+                'EvGet', 'EvSend', 'exec', 'exit', 'exp', 'Eye',
+                'fcntl', 'fdup', 'fetch', 'Fg', 'fieldnames',
+                'FillArc', 'FillCircle', 'FillPolygon',
+                'FillRectangle', 'find', 'flock', 'flush', 'Font',
+                'FreeColor', 'FreeSpace', 'function',
+                'get', 'getch', 'getche', 'getenv',
+                'GetSpace', 'gettimeofday',
+                'getuid', 'globalnames', 'GotoRC', 'GotoXY', 'gtime', 'hardlink',
+                'iand', 'icom', 'IdentityMatrix', 'image', 'InPort', 'insert',
+                'Int86', 'integer', 'ioctl', 'ior', 'ishift', 'istate', 'ixor',
+                'kbhit', 'key', 'keyword', 'kill',
+                'left', 'Len', 'list', 'load', 'loadfunc', 'localnames',
+                'lock', 'log', 'Lower', 'lstat',
+                'many', 'map', 'match', 'MatrixMode', 'max', 'member',
+                'membernames', 'methodnames', 'methods', 'min', 'mkdir', 'move',
+                'MultMatrix', 'mutex',
+                'name', 'NewColor', 'Normals', 'numeric',
+                'open', 'opencl', 'oprec', 'ord', 'OutPort',
+                'PaletteChars', 'PaletteColor', 'PaletteKey', 'paramnames',
+                'parent', 'Pattern', 'Peek', 'Pending', 'pipe', 'Pixel',
+                'Poke', 'pop', 'PopMatrix', 'Pos', 'pos',
+                'proc', 'pull', 'push', 'PushMatrix', 'PushRotate', 'PushScale',
+                'PushTranslate', 'put',
+                'QueryPointer',
+                'Raise', 'read', 'ReadImage', 'readlink', 'reads', 'ready',
+                'real', 'receive', 'Refresh', 'Rem', 'remove', 'rename',
+                'repl', 'reverse', 'right', 'rmdir', 'Rotate', 'Rpos',
+                'rtod', 'runerr',
+                'save', 'Scale', 'seek', 'select', 'send', 'seq',
+                'serial', 'set', 'setenv',
+                'setuid', 'signal', 'sin', 'sort', 'sortf',
+                'spawn', 'sql', 'sqrt', 'stat', 'staticnames', 'stop',
+                'string', 'structure', 'Swi',
+                'symlink', 'sys_errstr', 'system', 'syswrite',
+                'tab', 'table', 'tan',
+                'Texcoord', 'Texture', 'TextWidth', 'Translate',
+                'trap', 'trim', 'truncate', 'trylock', 'type',
+                'umask', 'Uncouple', 'unlock', 'upto', 'utime',
+                'variable',
+                'wait', 'WAttrib', 'WDefault', 'WFlush', 'where',
+                'WinAssociate', 'WinButton', 'WinColorDialog', 'WindowContents',
+                'WinEditRegion', 'WinFontDialog', 'WinMenuBar', 'WinOpenDialog',
+                'WinPlayMedia', 'WinSaveDialog', 'WinScrollBar', 'WinSelectDialog',
+                'write', 'WriteImage', 'writes', 'WSection',
+                'WSync'), prefix=r'\b', suffix=r'\b'),
+             Name.Function),
+            include('numbers'),
+            (r'===|~===|\*\*|\+\+|--|\.|==|~==|<=|>=|=|~=|<<=|<<|>>=|>>|'
+             r':=:|:=|<->|<-|\+:=|\|\||\|', Operator),
+            (r'"(?:[^\\"]|\\.)*"', String),
+            (r"'(?:[^\\']|\\.)*'", String.Character),
+            (r'[*<>+=/&!?@~\\-]', Operator),
+            (r'(\w+)(\s*|[(,])', bygroups(Name, using(this))),
+            (r"[\[\]]", Punctuation),
+            (r"<>|=>|[()|:;,.'`{}%\^&?]", Punctuation),
+            (r'\n+', Text),
+        ],
+        'numbers': [
+            (r'\b([+-]?([2-9]|[12][0-9]|3[0-6])[rR][0-9a-zA-Z]+)\b', Number.Hex),
+            (r'[+-]?[0-9]*\.([0-9]*)([Ee][+-]?[0-9]*)?', Number.Float),
+            (r'\b([+-]?[0-9]+[KMGTPkmgtp]?)\b', Number.Integer),
+        ],
+        'subprogram': [
+            (r'\(', Punctuation, ('#pop', 'formal_part')),
+            (r';', Punctuation, '#pop'),
+            (r'"[^"]+"|\w+', Name.Function),
+            include('root'),
+        ],
+        'type_def': [
+            (r'\(', Punctuation, 'formal_part'),
+        ],
+        'formal_part': [
+            (r'\)', Punctuation, '#pop'),
+            (r'\w+', Name.Variable),
+            (r',', Punctuation),
+            (r'(:string|:integer|:real)\b', Keyword.Reserved),
+            include('root'),
+        ],
+    }
+
+
+class UcodeLexer(RegexLexer):
+    """
+    Lexer for Icon ucode files.
+    """
+    name = 'ucode'
+    aliases = ['ucode']
+    filenames = ['*.u', '*.u1', '*.u2']
+    mimetypes = []
+    url = 'http://www.unicon.org'
+    version_added = '2.4'
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'(#.*\n)', Comment),
+            (words((
+                'con', 'declend', 'end',
+                'global',
+                'impl', 'invocable',
+                'lab', 'link', 'local',
+                'record',
+                'uid', 'unions',
+                'version'),
+                prefix=r'\b', suffix=r'\b'),
+             Name.Function),
+            (words((
+                'colm', 'filen', 'line', 'synt'),
+                prefix=r'\b', suffix=r'\b'),
+             Comment),
+            (words((
+                'asgn',
+                'bang', 'bscan',
+                'cat', 'ccase', 'chfail',
+                'coact', 'cofail', 'compl',
+                'coret', 'create', 'cset',
+                'diff', 'div', 'dup',
+                'efail', 'einit', 'end', 'eqv', 'eret',
+                'error', 'escan', 'esusp',
+                'field',
+                'goto',
+                'init', 'int', 'inter',
+                'invoke',
+                'keywd',
+                'lconcat', 'lexeq', 'lexge',
+                'lexgt', 'lexle', 'lexlt', 'lexne',
+                'limit', 'llist', 'lsusp',
+                'mark', 'mark0', 'minus', 'mod', 'mult',
+                'neg', 'neqv', 'nonnull', 'noop', 'null',
+                'number', 'numeq', 'numge', 'numgt',
+                'numle', 'numlt', 'numne',
+                'pfail', 'plus', 'pnull', 'pop', 'power',
+                'pret', 'proc', 'psusp', 'push1', 'pushn1',
+                'random', 'rasgn', 'rcv', 'rcvbk', 'real',
+                'refresh', 'rswap',
+                'sdup', 'sect', 'size', 'snd', 'sndbk',
+                'str', 'subsc', 'swap',
+                'tabmat', 'tally', 'toby', 'trace',
+                'unmark',
+                'value', 'var'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Declaration),
+            (words((
+                'any',
+                'case',
+                'endcase', 'endevery', 'endif',
+                'endifelse', 'endrepeat', 'endsuspend',
+                'enduntil', 'endwhile', 'every',
+                'if', 'ifelse',
+                'repeat',
+                'suspend',
+                'until',
+                'while'),
+             prefix=r'\b', suffix=r'\b'),
+             Name.Constant),
+            (r'\d+(\s*|\.$|$)', Number.Integer),
+            (r'[+-]?\d*\.\d+(E[-+]?\d+)?', Number.Float),
+            (r'[+-]?\d+\.\d*(E[-+]?\d+)?', Number.Float),
+            (r"(<>|=>|[()|:;,.'`]|[{}]|[%^]|[&?])", Punctuation),
+            (r'\s+\b', Text),
+            (r'[\w-]+', Text),
+        ],
+    }
+
+    def analyse_text(text):
+        """endsuspend and endrepeat are unique to this language, and
+        \\self, /self doesn't seem to get used anywhere else either."""
+        result = 0
+
+        if 'endsuspend' in text:
+            result += 0.1
+
+        if 'endrepeat' in text:
+            result += 0.1
+
+        if ':=' in text:
+            result += 0.01
+
+        if 'procedure' in text and 'end' in text:
+            result += 0.01
+
+        # This seems quite unique to unicon -- doesn't appear in any other
+        # example source we have (A quick search reveals that \SELF appears in
+        # Perl/Raku code)
+        if r'\self' in text and r'/self' in text:
+            result += 0.5
+
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/urbi.py b/.venv/Lib/site-packages/pygments/lexers/urbi.py
new file mode 100644 (file)
index 0000000..93cfced
--- /dev/null
@@ -0,0 +1,145 @@
+"""
+    pygments.lexers.urbi
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for UrbiScript language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import ExtendedRegexLexer, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['UrbiscriptLexer']
+
+
+class UrbiscriptLexer(ExtendedRegexLexer):
+    """
+    For UrbiScript source code.
+    """
+
+    name = 'UrbiScript'
+    aliases = ['urbiscript']
+    filenames = ['*.u']
+    mimetypes = ['application/x-urbiscript']
+    url = 'https://github.com/urbiforge/urbi'
+    version_added = '1.5'
+
+    flags = re.DOTALL
+
+    # TODO
+    # - handle Experimental and deprecated tags with specific tokens
+    # - handle Angles and Durations with specific tokens
+
+    def blob_callback(lexer, match, ctx):
+        text_before_blob = match.group(1)
+        blob_start = match.group(2)
+        blob_size_str = match.group(3)
+        blob_size = int(blob_size_str)
+        yield match.start(), String, text_before_blob
+        ctx.pos += len(text_before_blob)
+
+        # if blob size doesn't match blob format (example : "\B(2)(aaa)")
+        # yield blob as a string
+        if ctx.text[match.end() + blob_size] != ")":
+            result = "\\B(" + blob_size_str + ")("
+            yield match.start(), String, result
+            ctx.pos += len(result)
+            return
+
+        # if blob is well formatted, yield as Escape
+        blob_text = blob_start + ctx.text[match.end():match.end()+blob_size] + ")"
+        yield match.start(), String.Escape, blob_text
+        ctx.pos = match.end() + blob_size + 1  # +1 is the ending ")"
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            # comments
+            (r'//.*?\n', Comment),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'(every|for|loop|while)(?:;|&|\||,)', Keyword),
+            (words((
+                'assert', 'at', 'break', 'case', 'catch', 'closure', 'compl',
+                'continue', 'default', 'else', 'enum', 'every', 'external',
+                'finally', 'for', 'freezeif', 'if', 'new', 'onleave', 'return',
+                'stopif', 'switch', 'this', 'throw', 'timeout', 'try',
+                'waituntil', 'whenever', 'while'), suffix=r'\b'),
+             Keyword),
+            (words((
+                'asm', 'auto', 'bool', 'char', 'const_cast', 'delete', 'double',
+                'dynamic_cast', 'explicit', 'export', 'extern', 'float', 'friend',
+                'goto', 'inline', 'int', 'long', 'mutable', 'namespace', 'register',
+                'reinterpret_cast', 'short', 'signed', 'sizeof', 'static_cast',
+                'struct', 'template', 'typedef', 'typeid', 'typename', 'union',
+                'unsigned', 'using', 'virtual', 'volatile', 'wchar_t'), suffix=r'\b'),
+             Keyword.Reserved),
+            # deprecated keywords, use a meaningful token when available
+            (r'(emit|foreach|internal|loopn|static)\b', Keyword),
+            # ignored keywords, use a meaningful token when available
+            (r'(private|protected|public)\b', Keyword),
+            (r'(var|do|const|function|class)\b', Keyword.Declaration),
+            (r'(true|false|nil|void)\b', Keyword.Constant),
+            (words((
+                'Barrier', 'Binary', 'Boolean', 'CallMessage', 'Channel', 'Code',
+                'Comparable', 'Container', 'Control', 'Date', 'Dictionary', 'Directory',
+                'Duration', 'Enumeration', 'Event', 'Exception', 'Executable', 'File',
+                'Finalizable', 'Float', 'FormatInfo', 'Formatter', 'Global', 'Group',
+                'Hash', 'InputStream', 'IoService', 'Job', 'Kernel', 'Lazy', 'List',
+                'Loadable', 'Lobby', 'Location', 'Logger', 'Math', 'Mutex', 'nil',
+                'Object', 'Orderable', 'OutputStream', 'Pair', 'Path', 'Pattern',
+                'Position', 'Primitive', 'Process', 'Profile', 'PseudoLazy', 'PubSub',
+                'RangeIterable', 'Regexp', 'Semaphore', 'Server', 'Singleton', 'Socket',
+                'StackFrame', 'Stream', 'String', 'System', 'Tag', 'Timeout',
+                'Traceable', 'TrajectoryGenerator', 'Triplet', 'Tuple', 'UObject',
+                'UValue', 'UVar'), suffix=r'\b'),
+             Name.Builtin),
+            (r'(?:this)\b', Name.Builtin.Pseudo),
+            # don't match single | and &
+            (r'(?:[-=+*%/<>~^:]+|\.&?|\|\||&&)', Operator),
+            (r'(?:and_eq|and|bitand|bitor|in|not|not_eq|or_eq|or|xor_eq|xor)\b',
+             Operator.Word),
+            (r'[{}\[\]()]+', Punctuation),
+            (r'(?:;|\||,|&|\?|!)+', Punctuation),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            # Float, Integer, Angle and Duration
+            (r'(?:[0-9]+(?:(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?)?'
+             r'((?:rad|deg|grad)|(?:ms|s|min|h|d))?)\b', Number.Float),
+            # handle binary blob in strings
+            (r'"', String.Double, "string.double"),
+            (r"'", String.Single, "string.single"),
+        ],
+        'string.double': [
+            (r'((?:\\\\|\\"|[^"])*?)(\\B\((\d+)\)\()', blob_callback),
+            (r'(\\\\|\\[^\\]|[^"\\])*?"', String.Double, '#pop'),
+        ],
+        'string.single': [
+            (r"((?:\\\\|\\'|[^'])*?)(\\B\((\d+)\)\()", blob_callback),
+            (r"(\\\\|\\[^\\]|[^'\\])*?'", String.Single, '#pop'),
+        ],
+        # from http://pygments.org/docs/lexerdevelopment/#changing-states
+        'comment': [
+            (r'[^*/]', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ]
+    }
+
+    def analyse_text(text):
+        """This is fairly similar to C and others, but freezeif and
+        waituntil are unique keywords."""
+        result = 0
+
+        if 'freezeif' in text:
+            result += 0.05
+
+        if 'waituntil' in text:
+            result += 0.05
+
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/usd.py b/.venv/Lib/site-packages/pygments/lexers/usd.py
new file mode 100644 (file)
index 0000000..468a373
--- /dev/null
@@ -0,0 +1,85 @@
+"""
+    pygments.lexers.usd
+    ~~~~~~~~~~~~~~~~~~~
+
+    The module that parses Pixar's Universal Scene Description file format.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.lexer import words as words_
+from pygments.lexers._usd_builtins import COMMON_ATTRIBUTES, KEYWORDS, \
+    OPERATORS, SPECIAL_NAMES, TYPES
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text, Whitespace
+
+__all__ = ["UsdLexer"]
+
+
+def _keywords(words, type_):
+    return [(words_(words, prefix=r"\b", suffix=r"\b"), type_)]
+
+
+_TYPE = r"(\w+(?:\[\])?)"
+_BASE_ATTRIBUTE = r"(\w+(?:\:\w+)*)(?:(\.)(timeSamples))?"
+_WHITESPACE = r"([ \t]+)"
+
+
+class UsdLexer(RegexLexer):
+    """
+    A lexer that parses Pixar's Universal Scene Description file format.
+    """
+
+    name = "USD"
+    url = 'https://graphics.pixar.com/usd/release/index.html'
+    aliases = ["usd", "usda"]
+    filenames = ["*.usd", "*.usda"]
+    version_added = '2.6'
+
+    tokens = {
+        "root": [
+            (rf"(custom){_WHITESPACE}(uniform)(\s+){_TYPE}(\s+){_BASE_ATTRIBUTE}(\s*)(=)",
+             bygroups(Keyword.Token, Whitespace, Keyword.Token, Whitespace,
+                      Keyword.Type, Whitespace, Name.Attribute, Text,
+                      Name.Keyword.Tokens, Whitespace, Operator)),
+            (rf"(custom){_WHITESPACE}{_TYPE}(\s+){_BASE_ATTRIBUTE}(\s*)(=)",
+             bygroups(Keyword.Token, Whitespace, Keyword.Type, Whitespace,
+                      Name.Attribute, Text, Name.Keyword.Tokens, Whitespace,
+                      Operator)),
+            (rf"(uniform){_WHITESPACE}{_TYPE}(\s+){_BASE_ATTRIBUTE}(\s*)(=)",
+             bygroups(Keyword.Token, Whitespace, Keyword.Type, Whitespace,
+                      Name.Attribute, Text, Name.Keyword.Tokens, Whitespace,
+                      Operator)),
+            (rf"{_TYPE}{_WHITESPACE}{_BASE_ATTRIBUTE}(\s*)(=)",
+             bygroups(Keyword.Type, Whitespace, Name.Attribute, Text,
+                      Name.Keyword.Tokens, Whitespace, Operator)),
+        ] +
+        _keywords(KEYWORDS, Keyword.Tokens) +
+        _keywords(SPECIAL_NAMES, Name.Builtins) +
+        _keywords(COMMON_ATTRIBUTES, Name.Attribute) +
+        [(r"\b\w+:[\w:]+\b", Name.Attribute)] +
+        _keywords(OPERATORS, Operator) +  # more attributes
+        [(type_ + r"\[\]", Keyword.Type) for type_ in TYPES] +
+        _keywords(TYPES, Keyword.Type) +
+        [
+            (r"[(){}\[\]]", Punctuation),
+            ("#.*?$", Comment.Single),
+            (",", Punctuation),
+            (";", Punctuation),  # ";"s are allowed to combine separate metadata lines
+            ("=", Operator),
+            (r"[-]*([0-9]*[.])?[0-9]+(?:e[+-]*\d+)?", Number),
+            (r"'''(?:.|\n)*?'''", String),
+            (r'"""(?:.|\n)*?"""', String),
+            (r"'.*?'", String),
+            (r'".*?"', String),
+            (r"<(\.\./)*([\w/]+|[\w/]+\.\w+[\w:]*)>", Name.Namespace),
+            (r"@.*?@", String.Interpol),
+            (r'\(.*"[.\\n]*".*\)', String.Doc),
+            (r"\A#usda .+$", Comment.Hashbang),
+            (r"\s+", Whitespace),
+            (r"\w+", Text),
+            (r"[_:.]+", Punctuation),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/varnish.py b/.venv/Lib/site-packages/pygments/lexers/varnish.py
new file mode 100644 (file)
index 0000000..5c3de79
--- /dev/null
@@ -0,0 +1,189 @@
+"""
+    pygments.lexers.varnish
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Varnish configuration
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this, \
+    inherit, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal, Whitespace
+
+__all__ = ['VCLLexer', 'VCLSnippetLexer']
+
+
+class VCLLexer(RegexLexer):
+    """
+    For Varnish Configuration Language (VCL).
+    """
+    name = 'VCL'
+    aliases = ['vcl']
+    filenames = ['*.vcl']
+    mimetypes = ['text/x-vclsrc']
+    url = 'https://www.varnish-software.com/developers/tutorials/varnish-configuration-language-vcl'
+    version_added = '2.2'
+
+    def analyse_text(text):
+        # If the very first line is 'vcl 4.0;' it's pretty much guaranteed
+        # that this is VCL
+        if text.startswith('vcl 4.0;'):
+            return 1.0
+        # Skip over comments and blank lines
+        # This is accurate enough that returning 0.9 is reasonable.
+        # Almost no VCL files start without some comments.
+        elif '\nvcl 4.0;' in text[:1000]:
+            return 0.9
+
+    tokens = {
+        'probe': [
+            include('whitespace'),
+            include('comments'),
+            (r'(\.\w+)(\s*=\s*)([^;]*)(;)',
+             bygroups(Name.Attribute, Operator, using(this), Punctuation)),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'acl': [
+            include('whitespace'),
+            include('comments'),
+            (r'[!/]+', Operator),
+            (r';', Punctuation),
+            (r'\d+', Number),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'backend': [
+            include('whitespace'),
+            (r'(\.probe)(\s*=\s*)(\w+)(;)',
+             bygroups(Name.Attribute, Operator, Name.Variable.Global, Punctuation)),
+            (r'(\.probe)(\s*=\s*)(\{)',
+             bygroups(Name.Attribute, Operator, Punctuation), 'probe'),
+            (r'(\.\w+\b)(\s*=\s*)([^;\s]*)(\s*;)',
+             bygroups(Name.Attribute, Operator, using(this), Punctuation)),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'statements': [
+            (r'(\d\.)?\d+[sdwhmy]', Literal.Date),
+            (r'(\d\.)?\d+ms', Literal.Date),
+            (r'(vcl_pass|vcl_hash|vcl_hit|vcl_init|vcl_backend_fetch|vcl_pipe|'
+             r'vcl_backend_response|vcl_synth|vcl_deliver|vcl_backend_error|'
+             r'vcl_fini|vcl_recv|vcl_purge|vcl_miss)\b', Name.Function),
+            (r'(pipe|retry|hash|synth|deliver|purge|abandon|lookup|pass|fail|ok|'
+             r'miss|fetch|restart)\b', Name.Constant),
+            (r'(beresp|obj|resp|req|req_top|bereq)\.http\.[a-zA-Z_-]+\b', Name.Variable),
+            (words((
+                'obj.status', 'req.hash_always_miss', 'beresp.backend', 'req.esi_level',
+                'req.can_gzip', 'beresp.ttl', 'obj.uncacheable', 'req.ttl', 'obj.hits',
+                'client.identity', 'req.hash_ignore_busy', 'obj.reason', 'req.xid',
+                'req_top.proto', 'beresp.age', 'obj.proto', 'obj.age', 'local.ip',
+                'beresp.uncacheable', 'req.method', 'beresp.backend.ip', 'now',
+                'obj.grace', 'req.restarts', 'beresp.keep', 'req.proto', 'resp.proto',
+                'bereq.xid', 'bereq.between_bytes_timeout', 'req.esi',
+                'bereq.first_byte_timeout', 'bereq.method', 'bereq.connect_timeout',
+                'beresp.do_gzip',  'resp.status', 'beresp.do_gunzip',
+                'beresp.storage_hint', 'resp.is_streaming', 'beresp.do_stream',
+                'req_top.method', 'bereq.backend', 'beresp.backend.name', 'beresp.status',
+                'req.url', 'obj.keep', 'obj.ttl', 'beresp.reason', 'bereq.retries',
+                'resp.reason', 'bereq.url', 'beresp.do_esi', 'beresp.proto', 'client.ip',
+                'bereq.proto', 'server.hostname', 'remote.ip', 'req.backend_hint',
+                'server.identity', 'req_top.url', 'beresp.grace', 'beresp.was_304',
+                'server.ip', 'bereq.uncacheable'), suffix=r'\b'),
+             Name.Variable),
+            (r'[!%&+*\-,/<.}{>=|~]+', Operator),
+            (r'[();]', Punctuation),
+
+            (r'[,]+', Punctuation),
+            (words(('hash_data', 'regsub', 'regsuball', 'if', 'else',
+                    'elsif', 'elif', 'synth', 'synthetic', 'ban',
+                    'return', 'set', 'unset', 'import', 'include', 'new',
+                    'rollback', 'call'), suffix=r'\b'),
+             Keyword),
+            (r'storage\.\w+\.\w+\b', Name.Variable),
+            (words(('true', 'false')), Name.Builtin),
+            (r'\d+\b', Number),
+            (r'(backend)(\s+\w+)(\s*\{)',
+             bygroups(Keyword, Name.Variable.Global, Punctuation), 'backend'),
+            (r'(probe\s)(\s*\w+\s)(\{)',
+             bygroups(Keyword, Name.Variable.Global, Punctuation), 'probe'),
+            (r'(acl\s)(\s*\w+\s)(\{)',
+             bygroups(Keyword, Name.Variable.Global, Punctuation), 'acl'),
+            (r'(vcl )(4.0)(;)$',
+             bygroups(Keyword.Reserved, Name.Constant, Punctuation)),
+            (r'(sub\s+)([a-zA-Z]\w*)(\s*\{)',
+                bygroups(Keyword, Name.Function, Punctuation)),
+            (r'([a-zA-Z_]\w*)'
+             r'(\.)'
+             r'([a-zA-Z_]\w*)'
+             r'(\s*\(.*\))',
+             bygroups(Name.Function, Punctuation, Name.Function, using(this))),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'comments': [
+            (r'#.*$', Comment),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'//.*$', Comment),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'[^"\n]+', String),  # all other characters
+        ],
+        'multistring': [
+            (r'[^"}]', String),
+            (r'"\}', String, '#pop'),
+            (r'["}]', String),
+        ],
+        'whitespace': [
+            (r'L?"', String, 'string'),
+            (r'\{"', String, 'multistring'),
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'\\\n', Text),  # line continuation
+        ],
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            include('statements'),
+            (r'\s+', Whitespace),
+        ],
+    }
+
+
+class VCLSnippetLexer(VCLLexer):
+    """
+    For Varnish Configuration Language snippets.
+    """
+    name = 'VCLSnippets'
+    aliases = ['vclsnippets', 'vclsnippet']
+    mimetypes = ['text/x-vclsnippet']
+    filenames = []
+    url = 'https://www.varnish-software.com/developers/tutorials/varnish-configuration-language-vcl'
+    version_added = '2.2'
+
+    def analyse_text(text):
+        # override method inherited from VCLLexer
+        return 0
+
+    tokens = {
+        'snippetspre': [
+            (r'\.\.\.+', Comment),
+            (r'(bereq|req|req_top|resp|beresp|obj|client|server|local|remote|'
+             r'storage)($|\.\*)', Name.Variable),
+        ],
+        'snippetspost': [
+            (r'(backend)\b', Keyword.Reserved),
+        ],
+        'root': [
+            include('snippetspre'),
+            inherit,
+            include('snippetspost'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/verification.py b/.venv/Lib/site-packages/pygments/lexers/verification.py
new file mode 100644 (file)
index 0000000..ac06757
--- /dev/null
@@ -0,0 +1,113 @@
+"""
+    pygments.lexers.verification
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Intermediate Verification Languages (IVLs).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Comment, Operator, Keyword, Name, Number, \
+    Punctuation, Text, Generic
+
+__all__ = ['BoogieLexer', 'SilverLexer']
+
+
+class BoogieLexer(RegexLexer):
+    """
+    For Boogie source code.
+    """
+    name = 'Boogie'
+    url = 'https://boogie-docs.readthedocs.io/en/latest/'
+    aliases = ['boogie']
+    filenames = ['*.bpl']
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            # Whitespace and Comments
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'//[/!](.*?)\n', Comment.Doc),
+            (r'//(.*?)\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            (words((
+                'axiom', 'break', 'call', 'ensures', 'else', 'exists', 'function',
+                'forall', 'if', 'invariant', 'modifies', 'procedure',  'requires',
+                'then', 'var', 'while'),
+             suffix=r'\b'), Keyword),
+            (words(('const',), suffix=r'\b'), Keyword.Reserved),
+
+            (words(('bool', 'int', 'ref'), suffix=r'\b'), Keyword.Type),
+            include('numbers'),
+            (r"(>=|<=|:=|!=|==>|&&|\|\||[+/\-=>*<\[\]])", Operator),
+            (r'\{.*?\}', Generic.Emph), #triggers
+            (r"([{}():;,.])", Punctuation),
+            # Identifier
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'numbers': [
+            (r'[0-9]+', Number.Integer),
+        ],
+    }
+
+
+class SilverLexer(RegexLexer):
+    """
+    For Silver source code.
+    """
+    name = 'Silver'
+    aliases = ['silver']
+    filenames = ['*.sil', '*.vpr']
+    url = 'https://github.com/viperproject/silver'
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            # Whitespace and Comments
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'//[/!](.*?)\n', Comment.Doc),
+            (r'//(.*?)\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            (words((
+                'result', 'true', 'false', 'null', 'method', 'function',
+                'predicate', 'program', 'domain', 'axiom', 'var', 'returns',
+                'field', 'define', 'fold', 'unfold', 'inhale', 'exhale', 'new', 'assert',
+                'assume', 'goto', 'while', 'if', 'elseif', 'else', 'fresh',
+                'constraining', 'Seq', 'Set', 'Multiset', 'union', 'intersection',
+                'setminus', 'subset', 'unfolding', 'in', 'old', 'forall', 'exists',
+                'acc', 'wildcard', 'write', 'none', 'epsilon', 'perm', 'unique',
+                'apply', 'package', 'folding', 'label', 'forperm'),
+             suffix=r'\b'), Keyword),
+            (words(('requires', 'ensures', 'invariant'), suffix=r'\b'), Name.Decorator),
+            (words(('Int', 'Perm', 'Bool', 'Ref', 'Rational'), suffix=r'\b'), Keyword.Type),
+            include('numbers'),
+            (r'[!%&*+=|?:<>/\-\[\]]', Operator),
+            (r'\{.*?\}', Generic.Emph), #triggers
+            (r'([{}():;,.])', Punctuation),
+            # Identifier
+            (r'[\w$]\w*', Name),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'numbers': [
+            (r'[0-9]+', Number.Integer),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/verifpal.py b/.venv/Lib/site-packages/pygments/lexers/verifpal.py
new file mode 100644 (file)
index 0000000..e226339
--- /dev/null
@@ -0,0 +1,65 @@
+"""
+    pygments.lexers.verifpal
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Verifpal languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, bygroups, default
+from pygments.token import Comment, Keyword, Name, String, Punctuation, \
+    Whitespace
+
+__all__ = ['VerifpalLexer']
+
+
+class VerifpalLexer(RegexLexer):
+    """
+    For Verifpal code.
+    """
+
+    name = 'Verifpal'
+    aliases = ['verifpal']
+    filenames = ['*.vp']
+    mimetypes = ['text/x-verifpal']
+    url = 'https://verifpal.com'
+    version_added = '2.16'
+
+    tokens = {
+        'root': [
+            (r'//.*$', Comment.Single),
+            (r'(principal)( +)(\w+)( *)(\[)(.*)$', bygroups(Name.Builtin, Whitespace, String, Whitespace, Punctuation, Whitespace)),
+            (r'(attacker)( *)(\[)( *)(passive|active)( *)(\])( *)$', bygroups(Name.Builtin, Whitespace, Punctuation, Whitespace, String, Whitespace, Punctuation, Whitespace)),
+            (r'(knows)( +)(private|public)( +)', bygroups(Name.Builtin, Whitespace, Keyword.Constant, Whitespace), 'shared'),
+            (r'(queries)( +)(\[)', bygroups(Name.Builtin, Whitespace, Punctuation), 'queries'),
+            (r'(\w+)( +)(->|→)( *)(\w+)( *)(\:)', bygroups(String, Whitespace, Punctuation, Whitespace, String, Whitespace, Punctuation), 'shared'),
+            (words(('generates', 'leaks'), suffix=r'\b'), Name.Builtin, 'shared'),
+            (words(( 'phase', 'precondition',), suffix=r'\b'), Name.Builtin),
+            (r'[\[\(\)\]\?:=→^,]', Punctuation),
+            (r'->', Punctuation),
+            (words(('password',), suffix=r'\b'), Keyword.Constant),
+            (words(('AEAD_DEC', 'AEAD_ENC', 'ASSERT', 'BLIND', 'CONCAT',
+                    'DEC', 'ENC', 'G', 'HASH', 'HKDF', 'MAC', 'PKE_DEC',
+                    'PKE_ENC', 'PW_HASH', 'RINGSIGN', 'RINGSIGNVERIF',
+                    'SHAMIR_JOIN', 'SHAMIR_SPLIT', 'SIGN', 'SIGNVERIF',
+                    'SPLIT', 'UNBLIND', '_', 'nil'), suffix=r'\b'),
+             Name.Function),
+            (r'\s+', Whitespace),
+            (r'\w+', Name.Variable),
+        ],
+        'shared': [
+            (r'[\^\[\],]', Punctuation),
+            (r' +', Whitespace),
+            (r'\w+', Name.Variable),
+            default('#pop')
+        ],
+        'queries': [
+            (r'\s+', Name.Variable),
+            (words(('confidentiality?', 'authentication?', 'freshness?',
+                    'unlinkability?', 'equivalence?'), suffix='( )'),
+             bygroups(Keyword.Pseudo, Whitespace), 'shared'),
+            default('#pop')
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/vip.py b/.venv/Lib/site-packages/pygments/lexers/vip.py
new file mode 100644 (file)
index 0000000..22395e1
--- /dev/null
@@ -0,0 +1,150 @@
+"""
+    pygments.lexers.vip
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Visual Prolog & Grammar files.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, inherit, words, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['VisualPrologLexer', 'VisualPrologGrammarLexer']
+
+
+class VisualPrologBaseLexer(RegexLexer):
+    minorendkw = ('try', 'foreach', 'if')
+    minorkwexp = ('and', 'catch', 'do', 'else', 'elseif', 'erroneous', 'externally', 'failure', 'finally', 'foreach', 'if', 'or', 'orelse', 'otherwise', 'then',
+                  'try', 'div', 'mod', 'rem', 'quot')
+    dockw = ('short', 'detail', 'end', 'withdomain')
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (words(minorendkw, prefix=r'\bend\s+', suffix=r'\b'), Keyword.Minor),
+            (r'end', Keyword),
+            (words(minorkwexp, suffix=r'\b'), Keyword.Minor),
+            (r'0[xo][\da-fA-F_]+', Number),
+            (r'((\d[\d_]*)?\.)?\d[\d_]*([eE][\-+]?\d+)?', Number),
+            (r'_\w*', Name.Variable.Anonymous),
+            (r'[A-Z]\w*', Name.Variable),
+            (r'@\w+', Name.Variable),
+            (r'[a-z]\w*', Name),
+            (r'/\*', Comment, 'comment'),
+            (r'\%', Comment, 'commentline'),
+            (r'"', String.Symbol, 'string'),
+            (r'\'', String.Symbol, 'stringsingle'),
+            (r'@"', String.Symbol, 'atstring'),
+            (r'[\-+*^/!?<>=~:]+', Operator),
+            (r'[$,.[\]|(){}\\]+', Punctuation),
+            (r'.', Text),
+        ],
+        'commentdoc': [
+            (words(dockw, prefix=r'@', suffix=r'\b'), Comment.Preproc),
+            (r'@', Comment),
+        ],
+        'commentline': [
+            include('commentdoc'),
+            (r'[^@\n]+', Comment),
+            (r'$', Comment, '#pop'),
+        ],
+        'comment': [
+            include('commentdoc'),
+            (r'[^@*/]+', Comment),
+            (r'/\*', Comment, '#push'),
+            (r'\*/', Comment, '#pop'),
+            (r'[*/]', Comment),
+        ],
+        'stringescape': [
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\[\'"ntr\\]', String.Escape),
+        ],
+        'stringsingle': [
+            include('stringescape'),
+            (r'\'', String.Symbol, '#pop'),
+            (r'[^\'\\\n]+', String),
+            (r'\n', String.Escape.Error, '#pop'),
+        ],
+        'string': [
+            include('stringescape'),
+            (r'"', String.Symbol, '#pop'),
+            (r'[^"\\\n]+', String),
+            (r'\n', String.Escape.Error, '#pop'),
+        ],
+        'atstring': [
+            (r'""', String.Escape),
+            (r'"', String.Symbol, '#pop'),
+            (r'[^"]+', String),
+        ]
+    }
+
+
+class VisualPrologLexer(VisualPrologBaseLexer):
+    """Lexer for VisualProlog
+    """
+    name = 'Visual Prolog'
+    url = 'https://www.visual-prolog.com/'
+    aliases = ['visualprolog']
+    filenames = ['*.pro', '*.cl', '*.i', '*.pack', '*.ph']
+    version_added = '2.17'
+
+    majorkw = ('goal', 'namespace', 'interface', 'class', 'implement', 'where', 'open', 'inherits', 'supports', 'resolve',
+               'delegate', 'monitor', 'constants', 'domains', 'predicates', 'constructors', 'properties', 'clauses', 'facts')
+    minorkw = ('align', 'anyflow', 'as', 'bitsize', 'determ', 'digits', 'erroneous', 'externally', 'failure', 'from',
+               'guard', 'multi', 'nondeterm', 'or', 'orelse', 'otherwise', 'procedure', 'resolve', 'single', 'suspending')
+    directivekw = ('bininclude', 'else', 'elseif', 'endif', 'error', 'export', 'externally', 'from', 'grammargenerate',
+                   'grammarinclude', 'if', 'include', 'message', 'options', 'orrequires', 'requires', 'stringinclude', 'then')
+    tokens = {
+        'root': [
+            (words(minorkw, suffix=r'\b'), Keyword.Minor),
+            (words(majorkw, suffix=r'\b'), Keyword),
+            (words(directivekw, prefix='#', suffix=r'\b'), Keyword.Directive),
+            inherit
+        ]
+    }
+
+    def analyse_text(text):
+        """Competes with IDL and Prolog on *.pro; div. lisps on*.cl and SwigLexer on *.i"""
+        # These are *really* good indicators (and not conflicting with the other languages)
+        # end-scope first on line e.g. 'end implement'
+        # section keyword alone on line e.g. 'clauses'
+        if re.search(r'^\s*(end\s+(interface|class|implement)|(clauses|predicates|domains|facts|constants|properties)\s*$)', text):
+            return 0.98
+        else:
+            return 0
+
+
+class VisualPrologGrammarLexer(VisualPrologBaseLexer):
+    """Lexer for VisualProlog grammar
+    """
+
+    name = 'Visual Prolog Grammar'
+    url = 'https://www.visual-prolog.com/'
+    aliases = ['visualprologgrammar']
+    filenames = ['*.vipgrm']
+    version_added = '2.17'
+
+    majorkw = ('open', 'namespace', 'grammar', 'nonterminals',
+               'startsymbols', 'terminals', 'rules', 'precedence')
+    directivekw = ('bininclude', 'stringinclude')
+    tokens = {
+        'root': [
+            (words(majorkw, suffix=r'\b'), Keyword),
+            (words(directivekw, prefix='#', suffix=r'\b'), Keyword.Directive),
+            inherit
+        ]
+    }
+
+    def analyse_text(text):
+        """No competditors (currently)"""
+        # These are *really* good indicators
+        # end-scope first on line e.g. 'end grammar'
+        # section keyword alone on line e.g. 'rules'
+        if re.search(r'^\s*(end\s+grammar|(nonterminals|startsymbols|terminals|rules|precedence)\s*$)', text):
+            return 0.98
+        else:
+            return 0
diff --git a/.venv/Lib/site-packages/pygments/lexers/vyper.py b/.venv/Lib/site-packages/pygments/lexers/vyper.py
new file mode 100644 (file)
index 0000000..002ffed
--- /dev/null
@@ -0,0 +1,140 @@
+"""
+    pygments.lexers.vyper
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Vyper Smart Contract language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import (Comment, String, Name, Keyword, Number,
+                            Operator, Punctuation, Text, Whitespace)
+
+__all__ = ['VyperLexer']
+
+
+class VyperLexer(RegexLexer):
+    """For the Vyper smart contract language.
+    """
+    name = 'Vyper'
+    aliases = ['vyper']
+    filenames = ['*.vy']
+    url = "https://vyper.readthedocs.io"
+    version_added = '2.17'
+
+    tokens = {
+        'root': [
+            # Whitespace
+            (r'\s+', Whitespace),
+
+            # Line continuations
+            (r'(\\)(\n|\r\n|\r)', bygroups(Text, Whitespace)),
+
+            # Comments - inline and multiline
+            (r'#.*$', Comment.Single),
+            (r'\"\"\"', Comment.Multiline, 'multiline-comment'),
+
+            # Strings - single and double
+            (r"'", String.Single, 'single-string'),
+            (r'"', String.Double, 'double-string'),
+
+            # Functions (working)
+            (r'(def)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)',
+             bygroups(Keyword, Whitespace, Name.Function)),
+
+            # Event and Struct
+            (r'(event|struct|interface|log)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)',
+             bygroups(Keyword, Whitespace, Name.Class)),
+
+            # Imports
+            (r'(from)(\s+)(vyper\.\w+)(\s+)(import)(\s+)(\w+)',
+             bygroups(Keyword, Whitespace, Name.Namespace, Whitespace,
+                      Keyword, Whitespace, Name.Class)),
+
+            # Numeric Literals
+            (r'\b0x[0-9a-fA-F]+\b', Number.Hex),
+            (r'\b(\d{1,3}(?:_\d{3})*|\d+)\b', Number.Integer),
+            (r'\b\d+\.\d*\b', Number.Float),
+
+            # Keywords
+            (words(('def', 'event', 'pass', 'return', 'for', 'while', 'if', 'elif',
+                    'else', 'assert', 'raise', 'import', 'in', 'struct', 'implements',
+                    'interface', 'from', 'indexed', 'log', 'extcall', 'staticcall'),
+                   prefix=r'\b', suffix=r'\b'), Keyword),
+
+            # Visibility and State Mutability
+            (words(('public', 'private', 'view', 'pure', 'constant',
+                    'immutable', 'nonpayable'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Declaration),
+
+            # Built-in Functions
+            (words(('bitwise_and', 'bitwise_not', 'bitwise_or', 'bitwise_xor', 'shift',
+                    'create_minimal_proxy_to', 'create_copy_of', 'create_from_blueprint',
+                    'ecadd', 'ecmul', 'ecrecover', 'keccak256', 'sha256', 'concat', 'convert',
+                    'uint2str', 'extract32', 'slice', 'abs', 'ceil', 'floor', 'max', 'max_value',
+                    'min', 'min_value', 'pow_mod256', 'sqrt', 'isqrt', 'uint256_addmod',
+                    'uint256_mulmod', 'unsafe_add', 'unsafe_sub', 'unsafe_mul', 'unsafe_div',
+                    'as_wei_value', 'blockhash', 'empty', 'len', 'method_id', '_abi_encode',
+                    '_abi_decode', 'print', 'range'), prefix=r'\b', suffix=r'\b'),
+             Name.Builtin),
+
+            # Built-in Variables and Attributes
+            (words(('msg.sender', 'msg.value', 'block.timestamp', 'block.number', 'msg.gas'),
+                   prefix=r'\b', suffix=r'\b'),
+             Name.Builtin.Pseudo),
+
+            (words(('uint', 'uint8', 'uint16', 'uint32', 'uint64', 'uint128', 'uint256',
+                    'int', 'int8', 'int16', 'int32', 'int64', 'int128', 'int256', 'bool',
+                    'decimal', 'bytes', 'bytes1', 'bytes2', 'bytes3', 'bytes4', 'bytes5',
+                    'bytes6', 'bytes7', 'bytes8', 'bytes9', 'bytes10', 'bytes11',
+                    'bytes12', 'bytes13', 'bytes14', 'bytes15', 'bytes16', 'bytes17',
+                    'bytes18', 'bytes19', 'bytes20', 'bytes21', 'bytes22', 'bytes23',
+                    'bytes24', 'bytes25', 'bytes26', 'bytes27', 'bytes28', 'bytes29',
+                    'bytes30', 'bytes31', 'bytes32', 'string', 'String', 'address',
+                    'enum', 'struct'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Type),
+
+            # indexed keywords
+            (r'\b(indexed)\b(\s*)(\()(\s*)(\w+)(\s*)(\))',
+             bygroups(Keyword, Whitespace, Punctuation, Whitespace,
+                      Keyword.Type, Punctuation)),
+
+            # Operators and Punctuation
+            (r'(\+|\-|\*|\/|<=?|>=?|==|!=|=|\||&|%)', Operator),
+            (r'[.,:;()\[\]{}]', Punctuation),
+
+            # Other variable names and types
+            (r'@[\w.]+', Name.Decorator),
+            (r'__\w+__', Name.Magic),  # Matches double underscores followed by word characters
+            (r'EMPTY_BYTES32', Name.Constant),
+            (r'\bERC20\b', Name.Class),
+            (r'\bself\b', Name.Attribute),
+
+            (r'Bytes\[\d+\]', Keyword.Type),
+
+            # Generic names and variables
+            (r'\b[a-zA-Z_]\w*\b:', Name.Variable),
+            (r'\b[a-zA-Z_]\w*\b', Name),
+
+        ],
+
+        'multiline-comment': [
+            (r'\"\"\"', Comment.Multiline, '#pop'),
+            (r'[^"]+', Comment.Multiline),
+            (r'\"', Comment.Multiline)
+        ],
+
+        'single-string': [
+            (r"[^\\']+", String.Single),
+            (r"'", String.Single, '#pop'),
+            (r'\\.', String.Escape),
+        ],
+
+        'double-string': [
+            (r'[^\\"]+', String.Double),
+            (r'"', String.Double, '#pop'),
+            (r'\\.', String.Escape),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/web.py b/.venv/Lib/site-packages/pygments/lexers/web.py
new file mode 100644 (file)
index 0000000..3d35966
--- /dev/null
@@ -0,0 +1,24 @@
+"""
+    pygments.lexers.web
+    ~~~~~~~~~~~~~~~~~~~
+
+    Just export previously exported lexers.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# ruff: noqa: F401
+from pygments.lexers.html import HtmlLexer, DtdLexer, XmlLexer, XsltLexer, \
+    HamlLexer, ScamlLexer, JadeLexer
+from pygments.lexers.css import CssLexer, SassLexer, ScssLexer
+from pygments.lexers.javascript import JavascriptLexer, LiveScriptLexer, \
+    DartLexer, TypeScriptLexer, LassoLexer, ObjectiveJLexer, CoffeeScriptLexer
+from pygments.lexers.actionscript import ActionScriptLexer, \
+    ActionScript3Lexer, MxmlLexer
+from pygments.lexers.php import PhpLexer
+from pygments.lexers.webmisc import DuelLexer, XQueryLexer, SlimLexer, QmlLexer
+from pygments.lexers.data import JsonLexer
+JSONLexer = JsonLexer  # for backwards compatibility with Pygments 1.5
+
+__all__ = []
diff --git a/.venv/Lib/site-packages/pygments/lexers/webassembly.py b/.venv/Lib/site-packages/pygments/lexers/webassembly.py
new file mode 100644 (file)
index 0000000..78cd4ca
--- /dev/null
@@ -0,0 +1,119 @@
+"""
+    pygments.lexers.webassembly
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the WebAssembly text format.
+
+    The grammar can be found at https://github.com/WebAssembly/spec/blob/master/interpreter/README.md
+    and https://webassembly.github.io/spec/core/text/.
+
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, bygroups, default
+from pygments.token import Text, Comment, Operator, Keyword, String, Number, Punctuation, Name
+
+__all__ = ['WatLexer']
+
+keywords = (
+    'module', 'import', 'func', 'funcref', 'start', 'param', 'local', 'type',
+    'result', 'export', 'memory', 'global', 'mut', 'data', 'table', 'elem',
+    'if', 'then', 'else', 'end', 'block', 'loop'
+)
+
+builtins = (
+    'unreachable', 'nop', 'block', 'loop', 'if', 'else', 'end', 'br', 'br_if',
+    'br_table', 'return', 'call', 'call_indirect', 'drop', 'select',
+    'local.get', 'local.set', 'local.tee', 'global.get', 'global.set',
+    'i32.load', 'i64.load', 'f32.load', 'f64.load', 'i32.load8_s',
+    'i32.load8_u', 'i32.load16_s', 'i32.load16_u', 'i64.load8_s',
+    'i64.load8_u', 'i64.load16_s', 'i64.load16_u', 'i64.load32_s',
+    'i64.load32_u', 'i32.store', 'i64.store', 'f32.store', 'f64.store',
+    'i32.store8', 'i32.store16', 'i64.store8', 'i64.store16', 'i64.store32',
+    'memory.size', 'memory.grow', 'i32.const', 'i64.const', 'f32.const',
+    'f64.const', 'i32.eqz', 'i32.eq', 'i32.ne', 'i32.lt_s', 'i32.lt_u',
+    'i32.gt_s', 'i32.gt_u', 'i32.le_s', 'i32.le_u', 'i32.ge_s', 'i32.ge_u',
+    'i64.eqz', 'i64.eq', 'i64.ne', 'i64.lt_s', 'i64.lt_u', 'i64.gt_s',
+    'i64.gt_u', 'i64.le_s', 'i64.le_u', 'i64.ge_s', 'i64.ge_u', 'f32.eq',
+    'f32.ne', 'f32.lt', 'f32.gt', 'f32.le', 'f32.ge', 'f64.eq', 'f64.ne',
+    'f64.lt', 'f64.gt', 'f64.le', 'f64.ge', 'i32.clz', 'i32.ctz', 'i32.popcnt',
+    'i32.add', 'i32.sub', 'i32.mul', 'i32.div_s', 'i32.div_u', 'i32.rem_s',
+    'i32.rem_u', 'i32.and', 'i32.or', 'i32.xor', 'i32.shl', 'i32.shr_s',
+    'i32.shr_u', 'i32.rotl', 'i32.rotr', 'i64.clz', 'i64.ctz', 'i64.popcnt',
+    'i64.add', 'i64.sub', 'i64.mul', 'i64.div_s', 'i64.div_u', 'i64.rem_s',
+    'i64.rem_u', 'i64.and', 'i64.or', 'i64.xor', 'i64.shl', 'i64.shr_s',
+    'i64.shr_u', 'i64.rotl', 'i64.rotr', 'f32.abs', 'f32.neg', 'f32.ceil',
+    'f32.floor', 'f32.trunc', 'f32.nearest', 'f32.sqrt', 'f32.add', 'f32.sub',
+    'f32.mul', 'f32.div', 'f32.min', 'f32.max', 'f32.copysign', 'f64.abs',
+    'f64.neg', 'f64.ceil', 'f64.floor', 'f64.trunc', 'f64.nearest', 'f64.sqrt',
+    'f64.add', 'f64.sub', 'f64.mul', 'f64.div', 'f64.min', 'f64.max',
+    'f64.copysign', 'i32.wrap_i64', 'i32.trunc_f32_s', 'i32.trunc_f32_u',
+    'i32.trunc_f64_s', 'i32.trunc_f64_u', 'i64.extend_i32_s',
+    'i64.extend_i32_u', 'i64.trunc_f32_s', 'i64.trunc_f32_u',
+    'i64.trunc_f64_s', 'i64.trunc_f64_u', 'f32.convert_i32_s',
+    'f32.convert_i32_u', 'f32.convert_i64_s', 'f32.convert_i64_u',
+    'f32.demote_f64', 'f64.convert_i32_s', 'f64.convert_i32_u',
+    'f64.convert_i64_s', 'f64.convert_i64_u', 'f64.promote_f32',
+    'i32.reinterpret_f32', 'i64.reinterpret_f64', 'f32.reinterpret_i32',
+    'f64.reinterpret_i64',
+)
+
+
+class WatLexer(RegexLexer):
+    """Lexer for the WebAssembly text format.
+    """
+
+    name = 'WebAssembly'
+    url = 'https://webassembly.org/'
+    aliases = ['wast', 'wat']
+    filenames = ['*.wat', '*.wast']
+    version_added = '2.9'
+
+    tokens = {
+        'root': [
+            (words(keywords, suffix=r'(?=[^a-z_\.])'), Keyword),
+            (words(builtins), Name.Builtin, 'arguments'),
+            (words(['i32', 'i64', 'f32', 'f64']), Keyword.Type),
+            (r'\$[A-Za-z0-9!#$%&\'*+./:<=>?@\\^_`|~-]+', Name.Variable), # yes, all of the are valid in identifiers
+            (r';;.*?$', Comment.Single),
+            (r'\(;', Comment.Multiline, 'nesting_comment'),
+            (r'[+-]?0x[\dA-Fa-f](_?[\dA-Fa-f])*(.([\dA-Fa-f](_?[\dA-Fa-f])*)?)?([pP][+-]?[\dA-Fa-f](_?[\dA-Fa-f])*)?', Number.Float),
+            (r'[+-]?\d.\d(_?\d)*[eE][+-]?\d(_?\d)*', Number.Float),
+            (r'[+-]?\d.\d(_?\d)*', Number.Float),
+            (r'[+-]?\d.[eE][+-]?\d(_?\d)*', Number.Float),
+            (r'[+-]?(inf|nan:0x[\dA-Fa-f](_?[\dA-Fa-f])*|nan)', Number.Float),
+            (r'[+-]?0x[\dA-Fa-f](_?[\dA-Fa-f])*', Number.Hex),
+            (r'[+-]?\d(_?\d)*', Number.Integer),
+            (r'[\(\)]', Punctuation),
+            (r'"', String.Double, 'string'),
+            (r'\s+', Text),
+        ],
+        'nesting_comment': [
+            (r'\(;', Comment.Multiline, '#push'),
+            (r';\)', Comment.Multiline, '#pop'),
+            (r'[^;(]+', Comment.Multiline),
+            (r'[;(]', Comment.Multiline),
+        ],
+        'string': [
+            (r'\\[\dA-Fa-f][\dA-Fa-f]', String.Escape), # must have exactly two hex digits
+            (r'\\t', String.Escape),
+            (r'\\n', String.Escape),
+            (r'\\r', String.Escape),
+            (r'\\"', String.Escape),
+            (r"\\'", String.Escape),
+            (r'\\u\{[\dA-Fa-f](_?[\dA-Fa-f])*\}', String.Escape),
+            (r'\\\\', String.Escape),
+            (r'"', String.Double, '#pop'),
+            (r'[^"\\]+', String.Double),
+        ],
+        'arguments': [
+            (r'\s+', Text),
+            (r'(offset)(=)(0x[\dA-Fa-f](_?[\dA-Fa-f])*)', bygroups(Keyword, Operator, Number.Hex)),
+            (r'(offset)(=)(\d(_?\d)*)', bygroups(Keyword, Operator, Number.Integer)),
+            (r'(align)(=)(0x[\dA-Fa-f](_?[\dA-Fa-f])*)', bygroups(Keyword, Operator, Number.Hex)),
+            (r'(align)(=)(\d(_?\d)*)', bygroups(Keyword, Operator, Number.Integer)),
+            default('#pop'),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/webidl.py b/.venv/Lib/site-packages/pygments/lexers/webidl.py
new file mode 100644 (file)
index 0000000..3bbd12e
--- /dev/null
@@ -0,0 +1,298 @@
+"""
+    pygments.lexers.webidl
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Web IDL, including some extensions.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, default, include, words
+from pygments.token import Comment, Keyword, Name, Number, Punctuation, \
+    String, Text
+
+__all__ = ['WebIDLLexer']
+
+_builtin_types = (
+    # primitive types
+    'byte', 'octet', 'boolean',
+    r'(?:unsigned\s+)?(?:short|long(?:\s+long)?)',
+    r'(?:unrestricted\s+)?(?:float|double)',
+    # string types
+    'DOMString', 'ByteString', 'USVString',
+    # exception types
+    'Error', 'DOMException',
+    # typed array types
+    'Uint8Array', 'Uint16Array', 'Uint32Array', 'Uint8ClampedArray',
+    'Float32Array', 'Float64Array',
+    # buffer source types
+    'ArrayBuffer', 'DataView', 'Int8Array', 'Int16Array', 'Int32Array',
+    # other
+    'any', 'void', 'object', 'RegExp',
+)
+_identifier = r'_?[A-Za-z][a-zA-Z0-9_-]*'
+_keyword_suffix = r'(?![\w-])'
+_string = r'"[^"]*"'
+
+
+class WebIDLLexer(RegexLexer):
+    """
+    For Web IDL.
+    """
+
+    name = 'Web IDL'
+    url = 'https://www.w3.org/wiki/Web_IDL'
+    aliases = ['webidl']
+    filenames = ['*.webidl']
+    version_added = '2.6'
+
+    tokens = {
+        'common': [
+            (r'\s+', Text),
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+            (r'//.*', Comment.Single),
+            (r'^#.*', Comment.Preproc),
+        ],
+        'root': [
+            include('common'),
+            (r'\[', Punctuation, 'extended_attributes'),
+            (r'partial' + _keyword_suffix, Keyword),
+            (r'typedef' + _keyword_suffix, Keyword, ('typedef', 'type')),
+            (r'interface' + _keyword_suffix, Keyword, 'interface_rest'),
+            (r'enum' + _keyword_suffix, Keyword, 'enum_rest'),
+            (r'callback' + _keyword_suffix, Keyword, 'callback_rest'),
+            (r'dictionary' + _keyword_suffix, Keyword, 'dictionary_rest'),
+            (r'namespace' + _keyword_suffix, Keyword, 'namespace_rest'),
+            (_identifier, Name.Class, 'implements_rest'),
+        ],
+        'extended_attributes': [
+            include('common'),
+            (r',', Punctuation),
+            (_identifier, Name.Decorator),
+            (r'=', Punctuation, 'extended_attribute_rest'),
+            (r'\(', Punctuation, 'argument_list'),
+            (r'\]', Punctuation, '#pop'),
+        ],
+        'extended_attribute_rest': [
+            include('common'),
+            (_identifier, Name, 'extended_attribute_named_rest'),
+            (_string, String),
+            (r'\(', Punctuation, 'identifier_list'),
+            default('#pop'),
+        ],
+        'extended_attribute_named_rest': [
+            include('common'),
+            (r'\(', Punctuation, 'argument_list'),
+            default('#pop'),
+        ],
+        'argument_list': [
+            include('common'),
+            (r'\)', Punctuation, '#pop'),
+            default('argument'),
+        ],
+        'argument': [
+            include('common'),
+            (r'optional' + _keyword_suffix, Keyword),
+            (r'\[', Punctuation, 'extended_attributes'),
+            (r',', Punctuation, '#pop'),
+            (r'\)', Punctuation, '#pop:2'),
+            default(('argument_rest', 'type'))
+        ],
+        'argument_rest': [
+            include('common'),
+            (_identifier, Name.Variable),
+            (r'\.\.\.', Punctuation),
+            (r'=', Punctuation, 'default_value'),
+            default('#pop'),
+        ],
+        'identifier_list': [
+            include('common'),
+            (_identifier, Name.Class),
+            (r',', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'type': [
+            include('common'),
+            (r'(?:' + r'|'.join(_builtin_types) + r')' + _keyword_suffix,
+             Keyword.Type, 'type_null'),
+            (words(('sequence', 'Promise', 'FrozenArray'),
+                   suffix=_keyword_suffix), Keyword.Type, 'type_identifier'),
+            (_identifier, Name.Class, 'type_identifier'),
+            (r'\(', Punctuation, 'union_type'),
+        ],
+        'union_type': [
+            include('common'),
+            (r'or' + _keyword_suffix, Keyword),
+            (r'\)', Punctuation, ('#pop', 'type_null')),
+            default('type'),
+        ],
+        'type_identifier': [
+            (r'<', Punctuation, 'type_list'),
+            default(('#pop', 'type_null'))
+        ],
+        'type_null': [
+            (r'\?', Punctuation),
+            default('#pop:2'),
+        ],
+        'default_value': [
+            include('common'),
+            include('const_value'),
+            (_string, String, '#pop'),
+            (r'\[\s*\]', Punctuation, '#pop'),
+        ],
+        'const_value': [
+            include('common'),
+            (words(('true', 'false', '-Infinity', 'Infinity', 'NaN', 'null'),
+                   suffix=_keyword_suffix), Keyword.Constant, '#pop'),
+            (r'-?(?:(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:[Ee][+-]?[0-9]+)?' +
+             r'|[0-9]+[Ee][+-]?[0-9]+)', Number.Float, '#pop'),
+            (r'-?[1-9][0-9]*', Number.Integer, '#pop'),
+            (r'-?0[Xx][0-9A-Fa-f]+', Number.Hex, '#pop'),
+            (r'-?0[0-7]*', Number.Oct, '#pop'),
+        ],
+        'typedef': [
+            include('common'),
+            (_identifier, Name.Class),
+            (r';', Punctuation, '#pop'),
+        ],
+        'namespace_rest': [
+            include('common'),
+            (_identifier, Name.Namespace),
+            (r'\{', Punctuation, 'namespace_body'),
+            (r';', Punctuation, '#pop'),
+        ],
+        'namespace_body': [
+            include('common'),
+            (r'\[', Punctuation, 'extended_attributes'),
+            (r'readonly' + _keyword_suffix, Keyword),
+            (r'attribute' + _keyword_suffix,
+             Keyword, ('attribute_rest', 'type')),
+            (r'const' + _keyword_suffix, Keyword, ('const_rest', 'type')),
+            (r'\}', Punctuation, '#pop'),
+            default(('operation_rest', 'type')),
+        ],
+        'interface_rest': [
+            include('common'),
+            (_identifier, Name.Class),
+            (r':', Punctuation),
+            (r'\{', Punctuation, 'interface_body'),
+            (r';', Punctuation, '#pop'),
+        ],
+        'interface_body': [
+            (words(('iterable', 'maplike', 'setlike'), suffix=_keyword_suffix),
+             Keyword, 'iterable_maplike_setlike_rest'),
+            (words(('setter', 'getter', 'creator', 'deleter', 'legacycaller',
+                    'inherit', 'static', 'stringifier', 'jsonifier'),
+                   suffix=_keyword_suffix), Keyword),
+            (r'serializer' + _keyword_suffix, Keyword, 'serializer_rest'),
+            (r';', Punctuation),
+            include('namespace_body'),
+        ],
+        'attribute_rest': [
+            include('common'),
+            (_identifier, Name.Variable),
+            (r';', Punctuation, '#pop'),
+        ],
+        'const_rest': [
+            include('common'),
+            (_identifier, Name.Constant),
+            (r'=', Punctuation, 'const_value'),
+            (r';', Punctuation, '#pop'),
+        ],
+        'operation_rest': [
+            include('common'),
+            (r';', Punctuation, '#pop'),
+            default('operation'),
+        ],
+        'operation': [
+            include('common'),
+            (_identifier, Name.Function),
+            (r'\(', Punctuation, 'argument_list'),
+            (r';', Punctuation, '#pop:2'),
+        ],
+        'iterable_maplike_setlike_rest': [
+            include('common'),
+            (r'<', Punctuation, 'type_list'),
+            (r';', Punctuation, '#pop'),
+        ],
+        'type_list': [
+            include('common'),
+            (r',', Punctuation),
+            (r'>', Punctuation, '#pop'),
+            default('type'),
+        ],
+        'serializer_rest': [
+            include('common'),
+            (r'=', Punctuation, 'serialization_pattern'),
+            (r';', Punctuation, '#pop'),
+            default('operation'),
+        ],
+        'serialization_pattern': [
+            include('common'),
+            (_identifier, Name.Variable, '#pop'),
+            (r'\{', Punctuation, 'serialization_pattern_map'),
+            (r'\[', Punctuation, 'serialization_pattern_list'),
+        ],
+        'serialization_pattern_map': [
+            include('common'),
+            (words(('getter', 'inherit', 'attribute'),
+                   suffix=_keyword_suffix), Keyword),
+            (r',', Punctuation),
+            (_identifier, Name.Variable),
+            (r'\}', Punctuation, '#pop:2'),
+        ],
+        'serialization_pattern_list': [
+            include('common'),
+            (words(('getter', 'attribute'), suffix=_keyword_suffix), Keyword),
+            (r',', Punctuation),
+            (_identifier, Name.Variable),
+            (r']', Punctuation, '#pop:2'),
+        ],
+        'enum_rest': [
+            include('common'),
+            (_identifier, Name.Class),
+            (r'\{', Punctuation, 'enum_body'),
+            (r';', Punctuation, '#pop'),
+        ],
+        'enum_body': [
+            include('common'),
+            (_string, String),
+            (r',', Punctuation),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'callback_rest': [
+            include('common'),
+            (r'interface' + _keyword_suffix,
+             Keyword, ('#pop', 'interface_rest')),
+            (_identifier, Name.Class),
+            (r'=', Punctuation, ('operation', 'type')),
+            (r';', Punctuation, '#pop'),
+        ],
+        'dictionary_rest': [
+            include('common'),
+            (_identifier, Name.Class),
+            (r':', Punctuation),
+            (r'\{', Punctuation, 'dictionary_body'),
+            (r';', Punctuation, '#pop'),
+        ],
+        'dictionary_body': [
+            include('common'),
+            (r'\[', Punctuation, 'extended_attributes'),
+            (r'required' + _keyword_suffix, Keyword),
+            (r'\}', Punctuation, '#pop'),
+            default(('dictionary_item', 'type')),
+        ],
+        'dictionary_item': [
+            include('common'),
+            (_identifier, Name.Variable),
+            (r'=', Punctuation, 'default_value'),
+            (r';', Punctuation, '#pop'),
+        ],
+        'implements_rest': [
+            include('common'),
+            (r'implements' + _keyword_suffix, Keyword),
+            (_identifier, Name.Class),
+            (r';', Punctuation, '#pop'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/webmisc.py b/.venv/Lib/site-packages/pygments/lexers/webmisc.py
new file mode 100644 (file)
index 0000000..347592d
--- /dev/null
@@ -0,0 +1,1006 @@
+"""
+    pygments.lexers.webmisc
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for misc. web stuff.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, bygroups, \
+    default, using
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal, Whitespace
+
+from pygments.lexers.css import _indentation, _starts_block
+from pygments.lexers.html import HtmlLexer
+from pygments.lexers.javascript import JavascriptLexer
+from pygments.lexers.ruby import RubyLexer
+
+__all__ = ['DuelLexer', 'SlimLexer', 'XQueryLexer', 'QmlLexer', 'CirruLexer']
+
+
+class DuelLexer(RegexLexer):
+    """
+    Lexer for Duel Views Engine (formerly JBST) markup with JavaScript code blocks.
+    """
+
+    name = 'Duel'
+    url = 'http://duelengine.org/'
+    aliases = ['duel', 'jbst', 'jsonml+bst']
+    filenames = ['*.duel', '*.jbst']
+    mimetypes = ['text/x-duel', 'text/x-jbst']
+    version_added = '1.4'
+
+    flags = re.DOTALL
+
+    tokens = {
+        'root': [
+            (r'(<%[@=#!:]?)(.*?)(%>)',
+             bygroups(Name.Tag, using(JavascriptLexer), Name.Tag)),
+            (r'(<%\$)(.*?)(:)(.*?)(%>)',
+             bygroups(Name.Tag, Name.Function, Punctuation, String, Name.Tag)),
+            (r'(<%--)(.*?)(--%>)',
+             bygroups(Name.Tag, Comment.Multiline, Name.Tag)),
+            (r'(<script.*?>)(.*?)(</script>)',
+             bygroups(using(HtmlLexer),
+                      using(JavascriptLexer), using(HtmlLexer))),
+            (r'(.+?)(?=<)', using(HtmlLexer)),
+            (r'.+', using(HtmlLexer)),
+        ],
+    }
+
+
+class XQueryLexer(ExtendedRegexLexer):
+    """
+    An XQuery lexer, parsing a stream and outputting the tokens needed to
+    highlight xquery code.
+    """
+    name = 'XQuery'
+    url = 'https://www.w3.org/XML/Query/'
+    aliases = ['xquery', 'xqy', 'xq', 'xql', 'xqm']
+    filenames = ['*.xqy', '*.xquery', '*.xq', '*.xql', '*.xqm']
+    mimetypes = ['text/xquery', 'application/xquery']
+    version_added = '1.4'
+
+    xquery_parse_state = []
+
+    # FIX UNICODE LATER
+    # ncnamestartchar = (
+    #    r"[A-Z]|_|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|"
+    #    r"[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|"
+    #    r"[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|"
+    #    r"[\u10000-\uEFFFF]"
+    # )
+    ncnamestartchar = r"(?:[A-Z]|_|[a-z])"
+    # FIX UNICODE LATER
+    # ncnamechar = ncnamestartchar + (r"|-|\.|[0-9]|\u00B7|[\u0300-\u036F]|"
+    #                                 r"[\u203F-\u2040]")
+    ncnamechar = r"(?:" + ncnamestartchar + r"|-|\.|[0-9])"
+    ncname = f"(?:{ncnamestartchar}+{ncnamechar}*)"
+    pitarget_namestartchar = r"(?:[A-KN-WYZ]|_|:|[a-kn-wyz])"
+    pitarget_namechar = r"(?:" + pitarget_namestartchar + r"|-|\.|[0-9])"
+    pitarget = f"{pitarget_namestartchar}+{pitarget_namechar}*"
+    prefixedname = f"{ncname}:{ncname}"
+    unprefixedname = ncname
+    qname = f"(?:{prefixedname}|{unprefixedname})"
+
+    entityref = r'(?:&(?:lt|gt|amp|quot|apos|nbsp);)'
+    charref = r'(?:&#[0-9]+;|&#x[0-9a-fA-F]+;)'
+
+    stringdouble = r'(?:"(?:' + entityref + r'|' + charref + r'|""|[^&"])*")'
+    stringsingle = r"(?:'(?:" + entityref + r"|" + charref + r"|''|[^&'])*')"
+
+    # FIX UNICODE LATER
+    # elementcontentchar = (r'\t|\r|\n|[\u0020-\u0025]|[\u0028-\u003b]|'
+    #                       r'[\u003d-\u007a]|\u007c|[\u007e-\u007F]')
+    elementcontentchar = r'[A-Za-z]|\s|\d|[!"#$%()*+,\-./:;=?@\[\\\]^_\'`|~]'
+    # quotattrcontentchar = (r'\t|\r|\n|[\u0020-\u0021]|[\u0023-\u0025]|'
+    #                        r'[\u0027-\u003b]|[\u003d-\u007a]|\u007c|[\u007e-\u007F]')
+    quotattrcontentchar = r'[A-Za-z]|\s|\d|[!#$%()*+,\-./:;=?@\[\\\]^_\'`|~]'
+    # aposattrcontentchar = (r'\t|\r|\n|[\u0020-\u0025]|[\u0028-\u003b]|'
+    #                        r'[\u003d-\u007a]|\u007c|[\u007e-\u007F]')
+    aposattrcontentchar = r'[A-Za-z]|\s|\d|[!"#$%()*+,\-./:;=?@\[\\\]^_`|~]'
+
+    # CHAR elements - fix the above elementcontentchar, quotattrcontentchar,
+    #                 aposattrcontentchar
+    # x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+
+    flags = re.DOTALL | re.MULTILINE
+
+    def punctuation_root_callback(lexer, match, ctx):
+        yield match.start(), Punctuation, match.group(1)
+        # transition to root always - don't pop off stack
+        ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def operator_root_callback(lexer, match, ctx):
+        yield match.start(), Operator, match.group(1)
+        # transition to root always - don't pop off stack
+        ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def popstate_tag_callback(lexer, match, ctx):
+        yield match.start(), Name.Tag, match.group(1)
+        if lexer.xquery_parse_state:
+            ctx.stack.append(lexer.xquery_parse_state.pop())
+        ctx.pos = match.end()
+
+    def popstate_xmlcomment_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append(lexer.xquery_parse_state.pop())
+        ctx.pos = match.end()
+
+    def popstate_kindtest_callback(lexer, match, ctx):
+        yield match.start(), Punctuation, match.group(1)
+        next_state = lexer.xquery_parse_state.pop()
+        if next_state == 'occurrenceindicator':
+            if re.match("[?*+]+", match.group(2)):
+                yield match.start(), Punctuation, match.group(2)
+                ctx.stack.append('operator')
+                ctx.pos = match.end()
+            else:
+                ctx.stack.append('operator')
+                ctx.pos = match.end(1)
+        else:
+            ctx.stack.append(next_state)
+            ctx.pos = match.end(1)
+
+    def popstate_callback(lexer, match, ctx):
+        yield match.start(), Punctuation, match.group(1)
+        # if we have run out of our state stack, pop whatever is on the pygments
+        # state stack
+        if len(lexer.xquery_parse_state) == 0:
+            ctx.stack.pop()
+            if not ctx.stack:
+                # make sure we have at least the root state on invalid inputs
+                ctx.stack = ['root']
+        elif len(ctx.stack) > 1:
+            ctx.stack.append(lexer.xquery_parse_state.pop())
+        else:
+            # i don't know if i'll need this, but in case, default back to root
+            ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def pushstate_element_content_starttag_callback(lexer, match, ctx):
+        yield match.start(), Name.Tag, match.group(1)
+        lexer.xquery_parse_state.append('element_content')
+        ctx.stack.append('start_tag')
+        ctx.pos = match.end()
+
+    def pushstate_cdata_section_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('cdata_section')
+        lexer.xquery_parse_state.append(ctx.state.pop)
+        ctx.pos = match.end()
+
+    def pushstate_starttag_callback(lexer, match, ctx):
+        yield match.start(), Name.Tag, match.group(1)
+        lexer.xquery_parse_state.append(ctx.state.pop)
+        ctx.stack.append('start_tag')
+        ctx.pos = match.end()
+
+    def pushstate_operator_order_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Whitespace, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        ctx.stack = ['root']
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_operator_map_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Whitespace, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        ctx.stack = ['root']
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_operator_root_validate(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Whitespace, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        ctx.stack = ['root']
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_operator_root_validate_withmode(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Whitespace, match.group(2)
+        yield match.start(), Keyword, match.group(3)
+        ctx.stack = ['root']
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_operator_processing_instruction_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('processing_instruction')
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_element_content_processing_instruction_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('processing_instruction')
+        lexer.xquery_parse_state.append('element_content')
+        ctx.pos = match.end()
+
+    def pushstate_element_content_cdata_section_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('cdata_section')
+        lexer.xquery_parse_state.append('element_content')
+        ctx.pos = match.end()
+
+    def pushstate_operator_cdata_section_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('cdata_section')
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_element_content_xmlcomment_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('xml_comment')
+        lexer.xquery_parse_state.append('element_content')
+        ctx.pos = match.end()
+
+    def pushstate_operator_xmlcomment_callback(lexer, match, ctx):
+        yield match.start(), String.Doc, match.group(1)
+        ctx.stack.append('xml_comment')
+        lexer.xquery_parse_state.append('operator')
+        ctx.pos = match.end()
+
+    def pushstate_kindtest_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Whitespace, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('kindtest')
+        ctx.stack.append('kindtest')
+        ctx.pos = match.end()
+
+    def pushstate_operator_kindtestforpi_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Whitespace, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('operator')
+        ctx.stack.append('kindtestforpi')
+        ctx.pos = match.end()
+
+    def pushstate_operator_kindtest_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Whitespace, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('operator')
+        ctx.stack.append('kindtest')
+        ctx.pos = match.end()
+
+    def pushstate_occurrenceindicator_kindtest_callback(lexer, match, ctx):
+        yield match.start(), Name.Tag, match.group(1)
+        yield match.start(), Whitespace, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('occurrenceindicator')
+        ctx.stack.append('kindtest')
+        ctx.pos = match.end()
+
+    def pushstate_operator_starttag_callback(lexer, match, ctx):
+        yield match.start(), Name.Tag, match.group(1)
+        lexer.xquery_parse_state.append('operator')
+        ctx.stack.append('start_tag')
+        ctx.pos = match.end()
+
+    def pushstate_operator_root_callback(lexer, match, ctx):
+        yield match.start(), Punctuation, match.group(1)
+        lexer.xquery_parse_state.append('operator')
+        ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def pushstate_operator_root_construct_callback(lexer, match, ctx):
+        yield match.start(), Keyword, match.group(1)
+        yield match.start(), Whitespace, match.group(2)
+        yield match.start(), Punctuation, match.group(3)
+        lexer.xquery_parse_state.append('operator')
+        ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def pushstate_root_callback(lexer, match, ctx):
+        yield match.start(), Punctuation, match.group(1)
+        cur_state = ctx.stack.pop()
+        lexer.xquery_parse_state.append(cur_state)
+        ctx.stack = ['root']
+        ctx.pos = match.end()
+
+    def pushstate_operator_attribute_callback(lexer, match, ctx):
+        yield match.start(), Name.Attribute, match.group(1)
+        ctx.stack.append('operator')
+        ctx.pos = match.end()
+
+    tokens = {
+        'comment': [
+            # xquery comments
+            (r'[^:()]+', Comment),
+            (r'\(:', Comment, '#push'),
+            (r':\)', Comment, '#pop'),
+            (r'[:()]', Comment),
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+        ],
+        'operator': [
+            include('whitespace'),
+            (r'(\})', popstate_callback),
+            (r'\(:', Comment, 'comment'),
+
+            (r'(\{)', pushstate_root_callback),
+            (r'then|else|external|at|div|except', Keyword, 'root'),
+            (r'order by', Keyword, 'root'),
+            (r'group by', Keyword, 'root'),
+            (r'is|mod|order\s+by|stable\s+order\s+by', Keyword, 'root'),
+            (r'and|or', Operator.Word, 'root'),
+            (r'(eq|ge|gt|le|lt|ne|idiv|intersect|in)(?=\b)',
+             Operator.Word, 'root'),
+            (r'return|satisfies|to|union|where|count|preserve\s+strip',
+             Keyword, 'root'),
+            (r'(>=|>>|>|<=|<<|<|-|\*|!=|\+|\|\||\||:=|=|!)',
+             operator_root_callback),
+            (r'(::|:|;|\[|//|/|,)',
+             punctuation_root_callback),
+            (r'(castable|cast)(\s+)(as)\b',
+             bygroups(Keyword, Whitespace, Keyword), 'singletype'),
+            (r'(instance)(\s+)(of)\b',
+             bygroups(Keyword, Whitespace, Keyword), 'itemtype'),
+            (r'(treat)(\s+)(as)\b',
+             bygroups(Keyword, Whitespace, Keyword), 'itemtype'),
+            (r'(case)(\s+)(' + stringdouble + ')',
+             bygroups(Keyword, Whitespace, String.Double), 'itemtype'),
+            (r'(case)(\s+)(' + stringsingle + ')',
+             bygroups(Keyword, Whitespace, String.Single), 'itemtype'),
+            (r'(case|as)\b', Keyword, 'itemtype'),
+            (r'(\))(\s*)(as)',
+             bygroups(Punctuation, Whitespace, Keyword), 'itemtype'),
+            (r'\$', Name.Variable, 'varname'),
+            (r'(for|let|previous|next)(\s+)(\$)',
+             bygroups(Keyword, Whitespace, Name.Variable), 'varname'),
+            (r'(for)(\s+)(tumbling|sliding)(\s+)(window)(\s+)(\$)',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword,
+                      Whitespace, Name.Variable),
+             'varname'),
+            # (r'\)|\?|\]', Punctuation, '#push'),
+            (r'\)|\?|\]', Punctuation),
+            (r'(empty)(\s+)(greatest|least)',
+             bygroups(Keyword, Whitespace, Keyword)),
+            (r'ascending|descending|default', Keyword, '#push'),
+            (r'(allowing)(\s+)(empty)',
+             bygroups(Keyword, Whitespace, Keyword)),
+            (r'external', Keyword),
+            (r'(start|when|end)', Keyword, 'root'),
+            (r'(only)(\s+)(end)', bygroups(Keyword, Whitespace, Keyword),
+             'root'),
+            (r'collation', Keyword, 'uritooperator'),
+
+            # eXist specific XQUF
+            (r'(into|following|preceding|with)', Keyword, 'root'),
+
+            # support for current context on rhs of Simple Map Operator
+            (r'\.', Operator),
+
+            # finally catch all string literals and stay in operator state
+            (stringdouble, String.Double),
+            (stringsingle, String.Single),
+
+            (r'(catch)(\s*)', bygroups(Keyword, Whitespace), 'root'),
+        ],
+        'uritooperator': [
+            (stringdouble, String.Double, '#pop'),
+            (stringsingle, String.Single, '#pop'),
+        ],
+        'namespacedecl': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (r'(at)(\s+)('+stringdouble+')',
+             bygroups(Keyword, Whitespace, String.Double)),
+            (r"(at)(\s+)("+stringsingle+')',
+             bygroups(Keyword, Whitespace, String.Single)),
+            (stringdouble, String.Double),
+            (stringsingle, String.Single),
+            (r',', Punctuation),
+            (r'=', Operator),
+            (r';', Punctuation, 'root'),
+            (ncname, Name.Namespace),
+        ],
+        'namespacekeyword': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (stringdouble, String.Double, 'namespacedecl'),
+            (stringsingle, String.Single, 'namespacedecl'),
+            (r'inherit|no-inherit', Keyword, 'root'),
+            (r'namespace', Keyword, 'namespacedecl'),
+            (r'(default)(\s+)(element)', bygroups(Keyword, Text, Keyword)),
+            (r'preserve|no-preserve', Keyword),
+            (r',', Punctuation),
+        ],
+        'annotationname': [
+            (r'\(:', Comment, 'comment'),
+            (qname, Name.Decorator),
+            (r'(\()(' + stringdouble + ')', bygroups(Punctuation, String.Double)),
+            (r'(\()(' + stringsingle + ')', bygroups(Punctuation, String.Single)),
+            (r'(\,)(\s+)(' + stringdouble + ')',
+             bygroups(Punctuation, Text, String.Double)),
+            (r'(\,)(\s+)(' + stringsingle + ')',
+             bygroups(Punctuation, Text, String.Single)),
+            (r'\)', Punctuation),
+            (r'(\s+)(\%)', bygroups(Text, Name.Decorator), 'annotationname'),
+            (r'(\s+)(variable)(\s+)(\$)',
+             bygroups(Text, Keyword.Declaration, Text, Name.Variable), 'varname'),
+            (r'(\s+)(function)(\s+)',
+             bygroups(Text, Keyword.Declaration, Text), 'root')
+        ],
+        'varname': [
+            (r'\(:', Comment, 'comment'),
+            (r'(' + qname + r')(\()?', bygroups(Name, Punctuation), 'operator'),
+        ],
+        'singletype': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (ncname + r'(:\*)', Name.Variable, 'operator'),
+            (qname, Name.Variable, 'operator'),
+        ],
+        'itemtype': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (r'\$', Name.Variable, 'varname'),
+            (r'(void)(\s*)(\()(\s*)(\))',
+             bygroups(Keyword, Text, Punctuation, Text, Punctuation), 'operator'),
+            (r'(element|attribute|schema-element|schema-attribute|comment|text|'
+             r'node|binary|document-node|empty-sequence)(\s*)(\()',
+             pushstate_occurrenceindicator_kindtest_callback),
+            # Marklogic specific type?
+            (r'(processing-instruction)(\s*)(\()',
+             bygroups(Keyword, Text, Punctuation),
+             ('occurrenceindicator', 'kindtestforpi')),
+            (r'(item)(\s*)(\()(\s*)(\))(?=[*+?])',
+             bygroups(Keyword, Text, Punctuation, Text, Punctuation),
+             'occurrenceindicator'),
+            (r'(\(\#)(\s*)', bygroups(Punctuation, Text), 'pragma'),
+            (r';', Punctuation, '#pop'),
+            (r'then|else', Keyword, '#pop'),
+            (r'(at)(\s+)(' + stringdouble + ')',
+             bygroups(Keyword, Text, String.Double), 'namespacedecl'),
+            (r'(at)(\s+)(' + stringsingle + ')',
+             bygroups(Keyword, Text, String.Single), 'namespacedecl'),
+            (r'except|intersect|in|is|return|satisfies|to|union|where|count',
+             Keyword, 'root'),
+            (r'and|div|eq|ge|gt|le|lt|ne|idiv|mod|or', Operator.Word, 'root'),
+            (r':=|=|,|>=|>>|>|\[|\(|<=|<<|<|-|!=|\|\||\|', Operator, 'root'),
+            (r'external|at', Keyword, 'root'),
+            (r'(stable)(\s+)(order)(\s+)(by)',
+             bygroups(Keyword, Text, Keyword, Text, Keyword), 'root'),
+            (r'(castable|cast)(\s+)(as)',
+             bygroups(Keyword, Text, Keyword), 'singletype'),
+            (r'(treat)(\s+)(as)', bygroups(Keyword, Text, Keyword)),
+            (r'(instance)(\s+)(of)', bygroups(Keyword, Text, Keyword)),
+            (r'(case)(\s+)(' + stringdouble + ')',
+             bygroups(Keyword, Text, String.Double), 'itemtype'),
+            (r'(case)(\s+)(' + stringsingle + ')',
+             bygroups(Keyword, Text, String.Single), 'itemtype'),
+            (r'case|as', Keyword, 'itemtype'),
+            (r'(\))(\s*)(as)', bygroups(Operator, Text, Keyword), 'itemtype'),
+            (ncname + r':\*', Keyword.Type, 'operator'),
+            (r'(function|map|array)(\()', bygroups(Keyword.Type, Punctuation)),
+            (qname, Keyword.Type, 'occurrenceindicator'),
+        ],
+        'kindtest': [
+            (r'\(:', Comment, 'comment'),
+            (r'\{', Punctuation, 'root'),
+            (r'(\))([*+?]?)', popstate_kindtest_callback),
+            (r'\*', Name, 'closekindtest'),
+            (qname, Name, 'closekindtest'),
+            (r'(element|schema-element)(\s*)(\()', pushstate_kindtest_callback),
+        ],
+        'kindtestforpi': [
+            (r'\(:', Comment, 'comment'),
+            (r'\)', Punctuation, '#pop'),
+            (ncname, Name.Variable),
+            (stringdouble, String.Double),
+            (stringsingle, String.Single),
+        ],
+        'closekindtest': [
+            (r'\(:', Comment, 'comment'),
+            (r'(\))', popstate_callback),
+            (r',', Punctuation),
+            (r'(\{)', pushstate_operator_root_callback),
+            (r'\?', Punctuation),
+        ],
+        'xml_comment': [
+            (r'(-->)', popstate_xmlcomment_callback),
+            (r'[^-]{1,2}', Literal),
+            (r'\t|\r|\n|[\u0020-\uD7FF]|[\uE000-\uFFFD]|[\U00010000-\U0010FFFF]',
+             Literal),
+        ],
+        'processing_instruction': [
+            (r'\s+', Text, 'processing_instruction_content'),
+            (r'\?>', String.Doc, '#pop'),
+            (pitarget, Name),
+        ],
+        'processing_instruction_content': [
+            (r'\?>', String.Doc, '#pop'),
+            (r'\t|\r|\n|[\u0020-\uD7FF]|[\uE000-\uFFFD]|[\U00010000-\U0010FFFF]',
+             Literal),
+        ],
+        'cdata_section': [
+            (r']]>', String.Doc, '#pop'),
+            (r'\t|\r|\n|[\u0020-\uD7FF]|[\uE000-\uFFFD]|[\U00010000-\U0010FFFF]',
+             Literal),
+        ],
+        'start_tag': [
+            include('whitespace'),
+            (r'(/>)', popstate_tag_callback),
+            (r'>', Name.Tag, 'element_content'),
+            (r'"', Punctuation, 'quot_attribute_content'),
+            (r"'", Punctuation, 'apos_attribute_content'),
+            (r'=', Operator),
+            (qname, Name.Tag),
+        ],
+        'quot_attribute_content': [
+            (r'"', Punctuation, 'start_tag'),
+            (r'(\{)', pushstate_root_callback),
+            (r'""', Name.Attribute),
+            (quotattrcontentchar, Name.Attribute),
+            (entityref, Name.Attribute),
+            (charref, Name.Attribute),
+            (r'\{\{|\}\}', Name.Attribute),
+        ],
+        'apos_attribute_content': [
+            (r"'", Punctuation, 'start_tag'),
+            (r'\{', Punctuation, 'root'),
+            (r"''", Name.Attribute),
+            (aposattrcontentchar, Name.Attribute),
+            (entityref, Name.Attribute),
+            (charref, Name.Attribute),
+            (r'\{\{|\}\}', Name.Attribute),
+        ],
+        'element_content': [
+            (r'</', Name.Tag, 'end_tag'),
+            (r'(\{)', pushstate_root_callback),
+            (r'(<!--)', pushstate_element_content_xmlcomment_callback),
+            (r'(<\?)', pushstate_element_content_processing_instruction_callback),
+            (r'(<!\[CDATA\[)', pushstate_element_content_cdata_section_callback),
+            (r'(<)', pushstate_element_content_starttag_callback),
+            (elementcontentchar, Literal),
+            (entityref, Literal),
+            (charref, Literal),
+            (r'\{\{|\}\}', Literal),
+        ],
+        'end_tag': [
+            include('whitespace'),
+            (r'(>)', popstate_tag_callback),
+            (qname, Name.Tag),
+        ],
+        'xmlspace_decl': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (r'preserve|strip', Keyword, '#pop'),
+        ],
+        'declareordering': [
+            (r'\(:', Comment, 'comment'),
+            include('whitespace'),
+            (r'ordered|unordered', Keyword, '#pop'),
+        ],
+        'xqueryversion': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (stringdouble, String.Double),
+            (stringsingle, String.Single),
+            (r'encoding', Keyword),
+            (r';', Punctuation, '#pop'),
+        ],
+        'pragma': [
+            (qname, Name.Variable, 'pragmacontents'),
+        ],
+        'pragmacontents': [
+            (r'#\)', Punctuation, 'operator'),
+            (r'\t|\r|\n|[\u0020-\uD7FF]|[\uE000-\uFFFD]|[\U00010000-\U0010FFFF]',
+             Literal),
+            (r'(\s+)', Whitespace),
+        ],
+        'occurrenceindicator': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+            (r'\*|\?|\+', Operator, 'operator'),
+            (r':=', Operator, 'root'),
+            default('operator'),
+        ],
+        'option': [
+            include('whitespace'),
+            (qname, Name.Variable, '#pop'),
+        ],
+        'qname_braren': [
+            include('whitespace'),
+            (r'(\{)', pushstate_operator_root_callback),
+            (r'(\()', Punctuation, 'root'),
+        ],
+        'element_qname': [
+            (qname, Name.Variable, 'root'),
+        ],
+        'attribute_qname': [
+            (qname, Name.Variable, 'root'),
+        ],
+        'root': [
+            include('whitespace'),
+            (r'\(:', Comment, 'comment'),
+
+            # handle operator state
+            # order on numbers matters - handle most complex first
+            (r'\d+(\.\d*)?[eE][+-]?\d+', Number.Float, 'operator'),
+            (r'(\.\d+)[eE][+-]?\d+', Number.Float, 'operator'),
+            (r'(\.\d+|\d+\.\d*)', Number.Float, 'operator'),
+            (r'(\d+)', Number.Integer, 'operator'),
+            (r'(\.\.|\.|\))', Punctuation, 'operator'),
+            (r'(declare)(\s+)(construction)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration), 'operator'),
+            (r'(declare)(\s+)(default)(\s+)(order)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration, Text, Keyword.Declaration), 'operator'),
+            (r'(declare)(\s+)(context)(\s+)(item)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration, Text, Keyword.Declaration), 'operator'),
+            (ncname + r':\*', Name, 'operator'),
+            (r'\*:'+ncname, Name.Tag, 'operator'),
+            (r'\*', Name.Tag, 'operator'),
+            (stringdouble, String.Double, 'operator'),
+            (stringsingle, String.Single, 'operator'),
+
+            (r'(\}|\])', popstate_callback),
+
+            # NAMESPACE DECL
+            (r'(declare)(\s+)(default)(\s+)(collation)',
+             bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration,
+                      Whitespace, Keyword.Declaration)),
+            (r'(module|declare)(\s+)(namespace)',
+             bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration),
+             'namespacedecl'),
+            (r'(declare)(\s+)(base-uri)',
+             bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration),
+             'namespacedecl'),
+
+            # NAMESPACE KEYWORD
+            (r'(declare)(\s+)(default)(\s+)(element|function)',
+             bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration,
+                      Whitespace, Keyword.Declaration),
+             'namespacekeyword'),
+            (r'(import)(\s+)(schema|module)',
+             bygroups(Keyword.Pseudo, Whitespace, Keyword.Pseudo),
+             'namespacekeyword'),
+            (r'(declare)(\s+)(copy-namespaces)',
+             bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration),
+             'namespacekeyword'),
+
+            # VARNAMEs
+            (r'(for|let|some|every)(\s+)(\$)',
+             bygroups(Keyword, Whitespace, Name.Variable), 'varname'),
+            (r'(for)(\s+)(tumbling|sliding)(\s+)(window)(\s+)(\$)',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword,
+                      Whitespace, Name.Variable),
+             'varname'),
+            (r'\$', Name.Variable, 'varname'),
+            (r'(declare)(\s+)(variable)(\s+)(\$)',
+             bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration,
+                      Whitespace, Name.Variable),
+             'varname'),
+
+            # ANNOTATED GLOBAL VARIABLES AND FUNCTIONS
+            (r'(declare)(\s+)(\%)', bygroups(Keyword.Declaration, Whitespace,
+                                             Name.Decorator),
+             'annotationname'),
+
+            # ITEMTYPE
+            (r'(\))(\s+)(as)', bygroups(Operator, Whitespace, Keyword),
+             'itemtype'),
+
+            (r'(element|attribute|schema-element|schema-attribute|comment|'
+             r'text|node|document-node|empty-sequence)(\s+)(\()',
+             pushstate_operator_kindtest_callback),
+
+            (r'(processing-instruction)(\s+)(\()',
+             pushstate_operator_kindtestforpi_callback),
+
+            (r'(<!--)', pushstate_operator_xmlcomment_callback),
+
+            (r'(<\?)', pushstate_operator_processing_instruction_callback),
+
+            (r'(<!\[CDATA\[)', pushstate_operator_cdata_section_callback),
+
+            # (r'</', Name.Tag, 'end_tag'),
+            (r'(<)', pushstate_operator_starttag_callback),
+
+            (r'(declare)(\s+)(boundary-space)',
+             bygroups(Keyword.Declaration, Text, Keyword.Declaration), 'xmlspace_decl'),
+
+            (r'(validate)(\s+)(lax|strict)',
+             pushstate_operator_root_validate_withmode),
+            (r'(validate)(\s*)(\{)', pushstate_operator_root_validate),
+            (r'(typeswitch)(\s*)(\()', bygroups(Keyword, Whitespace,
+                                                Punctuation)),
+            (r'(switch)(\s*)(\()', bygroups(Keyword, Whitespace, Punctuation)),
+            (r'(element|attribute|namespace)(\s*)(\{)',
+             pushstate_operator_root_construct_callback),
+
+            (r'(document|text|processing-instruction|comment)(\s*)(\{)',
+             pushstate_operator_root_construct_callback),
+            # ATTRIBUTE
+            (r'(attribute)(\s+)(?=' + qname + r')',
+             bygroups(Keyword, Whitespace), 'attribute_qname'),
+            # ELEMENT
+            (r'(element)(\s+)(?=' + qname + r')',
+             bygroups(Keyword, Whitespace), 'element_qname'),
+            # PROCESSING_INSTRUCTION
+            (r'(processing-instruction|namespace)(\s+)(' + ncname + r')(\s*)(\{)',
+             bygroups(Keyword, Whitespace, Name.Variable, Whitespace,
+                      Punctuation),
+             'operator'),
+
+            (r'(declare|define)(\s+)(function)',
+             bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration)),
+
+            (r'(\{|\[)', pushstate_operator_root_callback),
+
+            (r'(unordered|ordered)(\s*)(\{)',
+             pushstate_operator_order_callback),
+
+            (r'(map|array)(\s*)(\{)',
+             pushstate_operator_map_callback),
+
+            (r'(declare)(\s+)(ordering)',
+             bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration),
+             'declareordering'),
+
+            (r'(xquery)(\s+)(version)',
+             bygroups(Keyword.Pseudo, Whitespace, Keyword.Pseudo),
+             'xqueryversion'),
+
+            (r'(\(#)(\s*)', bygroups(Punctuation, Whitespace), 'pragma'),
+
+            # sometimes return can occur in root state
+            (r'return', Keyword),
+
+            (r'(declare)(\s+)(option)', bygroups(Keyword.Declaration,
+                                                 Whitespace,
+                                                 Keyword.Declaration),
+             'option'),
+
+            # URI LITERALS - single and double quoted
+            (r'(at)(\s+)('+stringdouble+')', String.Double, 'namespacedecl'),
+            (r'(at)(\s+)('+stringsingle+')', String.Single, 'namespacedecl'),
+
+            (r'(ancestor-or-self|ancestor|attribute|child|descendant-or-self)(::)',
+             bygroups(Keyword, Punctuation)),
+            (r'(descendant|following-sibling|following|parent|preceding-sibling'
+             r'|preceding|self)(::)', bygroups(Keyword, Punctuation)),
+
+            (r'(if)(\s*)(\()', bygroups(Keyword, Whitespace, Punctuation)),
+
+            (r'then|else', Keyword),
+
+            # eXist specific XQUF
+            (r'(update)(\s*)(insert|delete|replace|value|rename)',
+             bygroups(Keyword, Whitespace, Keyword)),
+            (r'(into|following|preceding|with)', Keyword),
+
+            # Marklogic specific
+            (r'(try)(\s*)', bygroups(Keyword, Whitespace), 'root'),
+            (r'(catch)(\s*)(\()(\$)',
+             bygroups(Keyword, Whitespace, Punctuation, Name.Variable),
+             'varname'),
+
+
+            (r'(@'+qname+')', Name.Attribute, 'operator'),
+            (r'(@'+ncname+')', Name.Attribute, 'operator'),
+            (r'@\*:'+ncname, Name.Attribute, 'operator'),
+            (r'@\*', Name.Attribute, 'operator'),
+            (r'(@)', Name.Attribute, 'operator'),
+
+            (r'//|/|\+|-|;|,|\(|\)', Punctuation),
+
+            # STANDALONE QNAMES
+            (qname + r'(?=\s*\{)', Name.Tag, 'qname_braren'),
+            (qname + r'(?=\s*\([^:])', Name.Function, 'qname_braren'),
+            (r'(' + qname + ')(#)([0-9]+)', bygroups(Name.Function, Keyword.Type, Number.Integer)),
+            (qname, Name.Tag, 'operator'),
+        ]
+    }
+
+
+class QmlLexer(RegexLexer):
+    """
+    For QML files.
+    """
+
+    # QML is based on javascript, so much of this is taken from the
+    # JavascriptLexer above.
+
+    name = 'QML'
+    url = 'https://doc.qt.io/qt-6/qmlapplications.html'
+    aliases = ['qml', 'qbs']
+    filenames = ['*.qml', '*.qbs']
+    mimetypes = ['application/x-qml', 'application/x-qt.qbs+qml']
+    version_added = '1.6'
+
+    # pasted from JavascriptLexer, with some additions
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'<!--', Comment),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+
+            # QML insertions
+            (r'\bid\s*:\s*[A-Za-z][\w.]*', Keyword.Declaration,
+             'slashstartsregex'),
+            (r'\b[A-Za-z][\w.]*\s*:', Keyword, 'slashstartsregex'),
+
+            # the rest from JavascriptLexer
+            (r'(for|in|while|do|break|return|continue|switch|case|default|if|else|'
+             r'throw|try|catch|finally|new|delete|typeof|instanceof|void|'
+             r'this)\b', Keyword, 'slashstartsregex'),
+            (r'(var|let|with|function)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(abstract|boolean|byte|char|class|const|debugger|double|enum|export|'
+             r'extends|final|float|goto|implements|import|int|interface|long|native|'
+             r'package|private|protected|public|short|static|super|synchronized|throws|'
+             r'transient|volatile)\b', Keyword.Reserved),
+            (r'(true|false|null|NaN|Infinity|undefined)\b', Keyword.Constant),
+            (r'(Array|Boolean|Date|Error|Function|Math|netscape|'
+             r'Number|Object|Packages|RegExp|String|sun|decodeURI|'
+             r'decodeURIComponent|encodeURI|encodeURIComponent|'
+             r'Error|eval|isFinite|isNaN|parseFloat|parseInt|document|this|'
+             r'window)\b', Name.Builtin),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ]
+    }
+
+
+class CirruLexer(RegexLexer):
+    r"""
+    * using ``()`` for expressions, but restricted in a same line
+    * using ``""`` for strings, with ``\`` for escaping chars
+    * using ``$`` as folding operator
+    * using ``,`` as unfolding operator
+    * using indentations for nested blocks
+    """
+
+    name = 'Cirru'
+    url = 'http://cirru.org/'
+    aliases = ['cirru']
+    filenames = ['*.cirru']
+    mimetypes = ['text/x-cirru']
+    version_added = '2.0'
+    flags = re.MULTILINE
+
+    tokens = {
+        'string': [
+            (r'[^"\\\n]+', String),
+            (r'\\', String.Escape, 'escape'),
+            (r'"', String, '#pop'),
+        ],
+        'escape': [
+            (r'.', String.Escape, '#pop'),
+        ],
+        'function': [
+            (r'\,', Operator, '#pop'),
+            (r'[^\s"()]+', Name.Function, '#pop'),
+            (r'\)', Operator, '#pop'),
+            (r'(?=\n)', Text, '#pop'),
+            (r'\(', Operator, '#push'),
+            (r'"', String, ('#pop', 'string')),
+            (r'[ ]+', Text.Whitespace),
+        ],
+        'line': [
+            (r'(?<!\w)\$(?!\w)', Operator, 'function'),
+            (r'\(', Operator, 'function'),
+            (r'\)', Operator),
+            (r'\n', Text, '#pop'),
+            (r'"', String, 'string'),
+            (r'[ ]+', Text.Whitespace),
+            (r'[+-]?[\d.]+\b', Number),
+            (r'[^\s"()]+', Name.Variable)
+        ],
+        'root': [
+            (r'^\n+', Text.Whitespace),
+            default(('line', 'function')),
+        ]
+    }
+
+
+class SlimLexer(ExtendedRegexLexer):
+    """
+    For Slim markup.
+    """
+
+    name = 'Slim'
+    aliases = ['slim']
+    filenames = ['*.slim']
+    mimetypes = ['text/x-slim']
+    url = 'https://slim-template.github.io'
+    version_added = '2.0'
+
+    flags = re.IGNORECASE
+    _dot = r'(?: \|\n(?=.* \|)|.)'
+    tokens = {
+        'root': [
+            (r'[ \t]*\n', Text),
+            (r'[ \t]*', _indentation),
+        ],
+
+        'css': [
+            (r'\.[\w:-]+', Name.Class, 'tag'),
+            (r'\#[\w:-]+', Name.Function, 'tag'),
+        ],
+
+        'eval-or-plain': [
+            (r'([ \t]*==?)(.*\n)',
+             bygroups(Punctuation, using(RubyLexer)),
+             'root'),
+            (r'[ \t]+[\w:-]+(?==)', Name.Attribute, 'html-attributes'),
+            default('plain'),
+        ],
+
+        'content': [
+            include('css'),
+            (r'[\w:-]+:[ \t]*\n', Text, 'plain'),
+            (r'(-)(.*\n)',
+             bygroups(Punctuation, using(RubyLexer)),
+             '#pop'),
+            (r'\|' + _dot + r'*\n', _starts_block(Text, 'plain'), '#pop'),
+            (r'/' + _dot + r'*\n', _starts_block(Comment.Preproc, 'slim-comment-block'), '#pop'),
+            (r'[\w:-]+', Name.Tag, 'tag'),
+            include('eval-or-plain'),
+        ],
+
+        'tag': [
+            include('css'),
+            (r'[<>]{1,2}(?=[ \t=])', Punctuation),
+            (r'[ \t]+\n', Punctuation, '#pop:2'),
+            include('eval-or-plain'),
+        ],
+
+        'plain': [
+            (r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text),
+            (r'(#\{)(.*?)(\})',
+             bygroups(String.Interpol, using(RubyLexer), String.Interpol)),
+            (r'\n', Text, 'root'),
+        ],
+
+        'html-attributes': [
+            (r'=', Punctuation),
+            (r'"[^"]+"', using(RubyLexer), 'tag'),
+            (r'\'[^\']+\'', using(RubyLexer), 'tag'),
+            (r'\w+', Text, 'tag'),
+        ],
+
+        'slim-comment-block': [
+            (_dot + '+', Comment.Preproc),
+            (r'\n', Text, 'root'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/wgsl.py b/.venv/Lib/site-packages/pygments/lexers/wgsl.py
new file mode 100644 (file)
index 0000000..8fe950d
--- /dev/null
@@ -0,0 +1,406 @@
+"""
+    pygments.lexers.wgsl
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the WebGPU Shading Language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words, default
+from pygments.token import Comment, Operator, Keyword, Name, \
+    Number, Punctuation, Whitespace
+from pygments import unistring as uni
+
+__all__ = ['WgslLexer']
+
+LF = '\\u000a'
+VT = '\\u000b'
+FF = '\\u000c'
+CR = '\\u000d'
+NextLine = '\\u0085'
+LineSep = '\\u2028'
+ParaSep = '\\u2029'
+LineEndCodePoints = [LF,VT,FF,CR,NextLine,LineSep,ParaSep]
+NotLineEndRE = '[^' + "".join(LineEndCodePoints) + ']'
+LineEndRE = '[' + "".join(LineEndCodePoints) + ']'
+
+# https://www.w3.org/TR/WGSL/#syntax-ident_pattern_token
+ident_pattern_token = f'([{uni.xid_start}][{uni.xid_continue}]+)|[{uni.xid_start}]'
+
+
+class WgslLexer(RegexLexer):
+    """
+    Lexer for the WebGPU Shading Language.
+    """
+    name = 'WebGPU Shading Language'
+    url = 'https://www.w3.org/TR/WGSL/'
+    aliases = ['wgsl']
+    filenames = ['*.wgsl']
+    mimetypes = ['text/wgsl']
+    version_added = '2.15'
+
+    # https://www.w3.org/TR/WGSL/#var-and-value
+    keyword_decl = (words('var let const override'.split(),suffix=r'\b'), Keyword.Declaration)
+    # https://www.w3.org/TR/WGSL/#keyword-summary
+    keywords = (words("""
+                alias
+                break
+                case
+                const_assert
+                continue
+                continuing
+                default
+                diagnostic
+                discard
+                else
+                enable
+                false
+                fn
+                for
+                if
+                loop
+                requires
+                return
+                struct
+                switch
+                true
+                while
+                """.split(), suffix=r'\b'), Keyword)
+
+    # https://www.w3.org/TR/WGSL/#reserved-words
+    keyword_reserved = (words("""
+                NULL
+                Self
+                abstract
+                active
+                alignas
+                alignof
+                as
+                asm
+                asm_fragment
+                async
+                attribute
+                auto
+                await
+                become
+                binding_array
+                cast
+                catch
+                class
+                co_await
+                co_return
+                co_yield
+                coherent
+                column_major
+                common
+                compile
+                compile_fragment
+                concept
+                const_cast
+                consteval
+                constexpr
+                constinit
+                crate
+                debugger
+                decltype
+                delete
+                demote
+                demote_to_helper
+                do
+                dynamic_cast
+                enum
+                explicit
+                export
+                extends
+                extern
+                external
+                fallthrough
+                filter
+                final
+                finally
+                friend
+                from
+                fxgroup
+                get
+                goto
+                groupshared
+                highp
+                impl
+                implements
+                import
+                inline
+                instanceof
+                interface
+                layout
+                lowp
+                macro
+                macro_rules
+                match
+                mediump
+                meta
+                mod
+                module
+                move
+                mut
+                mutable
+                namespace
+                new
+                nil
+                noexcept
+                noinline
+                nointerpolation
+                noperspective
+                null
+                nullptr
+                of
+                operator
+                package
+                packoffset
+                partition
+                pass
+                patch
+                pixelfragment
+                precise
+                precision
+                premerge
+                priv
+                protected
+                pub
+                public
+                readonly
+                ref
+                regardless
+                register
+                reinterpret_cast
+                require
+                resource
+                restrict
+                self
+                set
+                shared
+                sizeof
+                smooth
+                snorm
+                static
+                static_assert
+                static_cast
+                std
+                subroutine
+                super
+                target
+                template
+                this
+                thread_local
+                throw
+                trait
+                try
+                type
+                typedef
+                typeid
+                typename
+                typeof
+                union
+                unless
+                unorm
+                unsafe
+                unsized
+                use
+                using
+                varying
+                virtual
+                volatile
+                wgsl
+                where
+                with
+                writeonly
+                yield
+                """.split(), suffix=r'\b'), Keyword.Reserved)
+
+    # https://www.w3.org/TR/WGSL/#predeclared-enumerants
+    predeclared_enums = (words("""
+          read write read_write
+          function private workgroup uniform storage
+          perspective linear flat
+          center centroid sample
+          vertex_index instance_index position front_facing frag_depth
+              local_invocation_id local_invocation_index
+              global_invocation_id workgroup_id num_workgroups
+              sample_index sample_mask
+          rgba8unorm
+          rgba8snorm
+          rgba8uint
+          rgba8sint
+          rgba16uint
+          rgba16sint
+          rgba16float
+          r32uint
+          r32sint
+          r32float
+          rg32uint
+          rg32sint
+          rg32float
+          rgba32uint
+          rgba32sint
+          rgba32float
+          bgra8unorm
+          """.split(), suffix=r'\b'), Name.Builtin)
+
+    # https://www.w3.org/TR/WGSL/#predeclared-types
+    predeclared_types = (words("""
+          bool
+          f16
+          f32
+          i32
+          sampler sampler_comparison
+          texture_depth_2d
+          texture_depth_2d_array
+          texture_depth_cube
+          texture_depth_cube_array
+          texture_depth_multisampled_2d
+          texture_external
+          texture_external
+          u32
+          """.split(), suffix=r'\b'), Name.Builtin)
+
+    # https://www.w3.org/TR/WGSL/#predeclared-types
+    predeclared_type_generators = (words("""
+          array
+          atomic
+          mat2x2
+          mat2x3
+          mat2x4
+          mat3x2
+          mat3x3
+          mat3x4
+          mat4x2
+          mat4x3
+          mat4x4
+          ptr
+          texture_1d
+          texture_2d
+          texture_2d_array
+          texture_3d
+          texture_cube
+          texture_cube_array
+          texture_multisampled_2d
+          texture_storage_1d
+          texture_storage_2d
+          texture_storage_2d_array
+          texture_storage_3d
+          vec2
+          vec3
+          vec4
+          """.split(), suffix=r'\b'), Name.Builtin)
+
+    # Predeclared type aliases for vectors
+    # https://www.w3.org/TR/WGSL/#vector-types
+    predeclared_type_alias_vectors = (words("""
+          vec2i vec3i vec4i
+          vec2u vec3u vec4u
+          vec2f vec3f vec4f
+          vec2h vec3h vec4h
+          """.split(), suffix=r'\b'), Name.Builtin)
+
+    # Predeclared type aliases for matrices
+    # https://www.w3.org/TR/WGSL/#matrix-types
+    predeclared_type_alias_matrices = (words("""
+          mat2x2f mat2x3f mat2x4f
+          mat3x2f mat3x3f mat3x4f
+          mat4x2f mat4x3f mat4x4f
+          mat2x2h mat2x3h mat2x4h
+          mat3x2h mat3x3h mat3x4h
+          mat4x2h mat4x3h mat4x4h
+          """.split(), suffix=r'\b'), Name.Builtin)
+
+    tokens = {
+        'blankspace': [
+            # https://www.w3.org/TR/WGSL/#blankspace
+            (r'[\u0020\u0009\u000a\u000b\u000c\u000d\u0085\u200e\u200f\u2028\u2029]+', Whitespace),
+        ],
+        'comments': [
+            # Line ending comments
+            # Match up CR/LF pair first.
+            (rf'//{NotLineEndRE}*{CR}{LF}', Comment.Single),
+            (rf'//{NotLineEndRE}*{LineEndRE}', Comment.Single),
+            (r'/\*', Comment.Multiline, 'block_comment'),
+        ],
+        'attribute': [
+            include('blankspace'),
+            include('comments'),
+            (ident_pattern_token, Name.Decorator,'#pop'),
+            default('#pop'),
+        ],
+        'root': [
+            include('blankspace'),
+            include('comments'),
+
+            # Attributes.
+            # https://www.w3.org/TR/WGSL/#attributes
+            # Mark the '@' and the attribute name as a decorator.
+            (r'@', Name.Decorator, 'attribute'),
+
+            # Keywords
+            (r'(true|false)\b', Keyword.Constant),
+            keyword_decl,
+            keywords,
+            keyword_reserved,
+
+            # Predeclared
+            predeclared_enums,
+            predeclared_types,
+            predeclared_type_generators,
+            predeclared_type_alias_vectors,
+            predeclared_type_alias_matrices,
+
+            # Decimal float literals
+            # https://www.w3.org/TR/WGSL/#syntax-decimal_float_literal
+            # 0, with type-specifying suffix.
+            (r'0[fh]', Number.Float),
+            # Other decimal integer, with type-specifying suffix.
+            (r'[1-9][0-9]*[fh]', Number.Float),
+            #    Has decimal point, at least one digit after decimal.
+            (r'[0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[fh]?', Number.Float),
+            #    Has decimal point, at least one digit before decimal.
+            (r'[0-9]+\.[0-9]*([eE][+-]?[0-9]+)?[fh]?', Number.Float),
+            #    Has at least one digit, and has an exponent.
+            (r'[0-9]+[eE][+-]?[0-9]+[fh]?', Number.Float),
+
+            # Hex float literals
+            # https://www.w3.org/TR/WGSL/#syntax-hex_float_literal
+            (r'0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+([pP][+-]?[0-9]+[fh]?)?', Number.Float),
+            (r'0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*([pP][+-]?[0-9]+[fh]?)?', Number.Float),
+            (r'0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+[fh]?', Number.Float),
+
+            # Hexadecimal integer literals
+            # https://www.w3.org/TR/WGSL/#syntax-hex_int_literal
+            (r'0[xX][0-9a-fA-F]+[iu]?', Number.Hex),
+            # Decimal integer literals
+            # https://www.w3.org/TR/WGSL/#syntax-decimal_int_literal
+            # We need two rules here because 01 is not valid.
+            (r'[1-9][0-9]*[iu]?', Number.Integer),
+            (r'0[iu]?', Number.Integer), # Must match last.
+
+            # Operators and Punctuation
+            (r'[{}()\[\],\.;:]', Punctuation),
+            (r'->', Punctuation), # Return-type arrow
+            (r'[+\-*/%&|<>^!~=]', Operator),
+
+            # TODO: Treat context-depedendent names specially
+            # https://www.w3.org/TR/WGSL/#context-dependent-name
+
+            # Identifiers
+            (ident_pattern_token, Name),
+
+            # TODO: templates start and end tokens.
+            # https://www.w3.org/TR/WGSL/#template-lists-sec
+        ],
+        'block_comment': [
+            # https://www.w3.org/TR/WGSL/#block-comment
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/whiley.py b/.venv/Lib/site-packages/pygments/lexers/whiley.py
new file mode 100644 (file)
index 0000000..ea98eb2
--- /dev/null
@@ -0,0 +1,115 @@
+"""
+    pygments.lexers.whiley
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Whiley language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text
+
+__all__ = ['WhileyLexer']
+
+
+class WhileyLexer(RegexLexer):
+    """
+    Lexer for the Whiley programming language.
+    """
+    name = 'Whiley'
+    url = 'http://whiley.org/'
+    filenames = ['*.whiley']
+    aliases = ['whiley']
+    mimetypes = ['text/x-whiley']
+    version_added = '2.2'
+
+    # See the language specification:
+    # http://whiley.org/download/WhileyLanguageSpec.pdf
+
+    tokens = {
+        'root': [
+            # Whitespace
+            (r'\s+', Text),
+
+            # Comments
+            (r'//.*', Comment.Single),
+            # don't parse empty comment as doc comment
+            (r'/\*\*/', Comment.Multiline),
+            (r'(?s)/\*\*.*?\*/', String.Doc),
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+
+            # Keywords
+            (words((
+                'if', 'else', 'while', 'for', 'do', 'return',
+                'switch', 'case', 'default', 'break', 'continue',
+                'requires', 'ensures', 'where', 'assert', 'assume',
+                'all', 'no', 'some', 'in', 'is', 'new',
+                'throw', 'try', 'catch', 'debug', 'skip', 'fail',
+                'finite', 'total'), suffix=r'\b'), Keyword.Reserved),
+            (words((
+                'function', 'method', 'public', 'private', 'protected',
+                'export', 'native'), suffix=r'\b'), Keyword.Declaration),
+            # "constant" & "type" are not keywords unless used in declarations
+            (r'(constant|type)(\s+)([a-zA-Z_]\w*)(\s+)(is)\b',
+             bygroups(Keyword.Declaration, Text, Name, Text, Keyword.Reserved)),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(bool|byte|int|real|any|void)\b', Keyword.Type),
+            # "from" is not a keyword unless used with import
+            (r'(import)(\s+)(\*)([^\S\n]+)(from)\b',
+             bygroups(Keyword.Namespace, Text, Punctuation, Text, Keyword.Namespace)),
+            (r'(import)(\s+)([a-zA-Z_]\w*)([^\S\n]+)(from)\b',
+             bygroups(Keyword.Namespace, Text, Name, Text, Keyword.Namespace)),
+            (r'(package|import)\b', Keyword.Namespace),
+
+            # standard library: https://github.com/Whiley/WhileyLibs/
+            (words((
+                # types defined in whiley.lang.Int
+                'i8', 'i16', 'i32', 'i64',
+                'u8', 'u16', 'u32', 'u64',
+                'uint', 'nat',
+
+                # whiley.lang.Any
+                'toString'), suffix=r'\b'), Name.Builtin),
+
+            # byte literal
+            (r'[01]+b', Number.Bin),
+
+            # decimal literal
+            (r'[0-9]+\.[0-9]+', Number.Float),
+            # match "1." but not ranges like "3..5"
+            (r'[0-9]+\.(?!\.)', Number.Float),
+
+            # integer literal
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+
+            # character literal
+            (r"""'[^\\]'""", String.Char),
+            (r"""(')(\\['"\\btnfr])(')""",
+             bygroups(String.Char, String.Escape, String.Char)),
+
+            # string literal
+            (r'"', String, 'string'),
+
+            # operators and punctuation
+            (r'[{}()\[\],.;]', Punctuation),
+            (r'[+\-*/%&|<>^!~@=:?'
+             # unicode operators
+             r'\u2200\u2203\u2205\u2282\u2286\u2283\u2287'
+             r'\u222A\u2229\u2264\u2265\u2208\u2227\u2228'
+             r']', Operator),
+
+            # identifier
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\[btnfr]', String.Escape),
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\.', String),
+            (r'[^\\"]+', String),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/wowtoc.py b/.venv/Lib/site-packages/pygments/lexers/wowtoc.py
new file mode 100644 (file)
index 0000000..2b18757
--- /dev/null
@@ -0,0 +1,120 @@
+"""
+    pygments.lexers.wowtoc
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for World of Warcraft TOC files
+
+    TOC files describe game addons.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Comment, Name, Text, Punctuation, String, Keyword
+
+__all__ = ["WoWTocLexer"]
+
+def _create_tag_line_pattern(inner_pattern, ignore_case=False):
+    return ((r"(?i)" if ignore_case else r"")
+        + r"^(##)( *)"  # groups 1, 2
+        + inner_pattern  # group 3
+        + r"( *)(:)( *)(.*?)( *)$")  # groups 4, 5, 6, 7, 8
+
+
+def _create_tag_line_token(inner_pattern, inner_token, ignore_case=False):
+    # this function template-izes the tag line for a specific type of tag, which will
+    # have a different pattern and different token. otherwise, everything about a tag
+    # line is the same
+    return (
+        _create_tag_line_pattern(inner_pattern, ignore_case=ignore_case),
+        bygroups(
+            Keyword.Declaration,
+            Text.Whitespace,
+            inner_token,
+            Text.Whitespace,
+            Punctuation,
+            Text.Whitespace,
+            String,
+            Text.Whitespace,
+        ),
+    )
+
+
+class WoWTocLexer(RegexLexer):
+    """
+    Lexer for World of Warcraft TOC files.
+    """
+
+    name = "World of Warcraft TOC"
+    aliases = ["wowtoc"]
+    filenames = ["*.toc"]
+    url = 'https://wowpedia.fandom.com/wiki/TOC_format'
+    version_added = '2.14'
+
+    tokens = {
+        "root": [
+            # official localized tags, Notes and Title
+            # (normal part is insensitive, locale part is sensitive)
+            _create_tag_line_token(
+                r"((?:[nN][oO][tT][eE][sS]|[tT][iI][tT][lL][eE])-(?:ptBR|zhCN|"
+                r"enCN|frFR|deDE|itIT|esMX|ptPT|koKR|ruRU|esES|zhTW|enTW|enGB|enUS))",
+                Name.Builtin,
+            ),
+            # other official tags
+            _create_tag_line_token(
+                r"(Interface|Title|Notes|RequiredDeps|Dep[^: ]*|OptionalDeps|"
+                r"LoadOnDemand|LoadWith|LoadManagers|SavedVariablesPerCharacter|"
+                r"SavedVariables|DefaultState|Secure|Author|Version)",
+                Name.Builtin,
+                ignore_case=True,
+            ),
+            # user-defined tags
+            _create_tag_line_token(
+                r"(X-[^: ]*)",
+                Name.Variable,
+                ignore_case=True,
+            ),
+            # non-conforming tags, but still valid
+            _create_tag_line_token(
+                r"([^: ]*)",
+                Name.Other,
+            ),
+
+            # Comments
+            (r"^#.*$", Comment),
+
+            # Addon Files
+            (r"^.+$", Name),
+        ]
+    }
+
+    def analyse_text(text):
+        # at time of writing, this file suffix conflict's with one of Tex's in
+        # markup.py. Tex's anaylse_text() appears to be definitive (binary) and does not
+        # share any likeness to WoW TOCs, which means we wont have to compete with it by
+        # abitrary increments in score.
+
+        result = 0
+
+        # while not required, an almost certain marker of WoW TOC's is the interface tag
+        # if this tag is omitted, players will need to opt-in to loading the addon with
+        # an options change ("Load out of date addons"). the value is also standardized:
+        # `<major><minor><patch>`, with minor and patch being two-digit zero-padded.
+        interface_pattern = _create_tag_line_pattern(r"(Interface)", ignore_case=True)
+        match = re.search(interface_pattern, text)
+        if match and re.match(r"(\d+)(\d{2})(\d{2})", match.group(7)):
+            result += 0.8
+
+        casefolded = text.casefold()
+        # Lua file listing is good marker too, but probably conflicts with many other
+        # lexers
+        if ".lua" in casefolded:
+            result += 0.1
+        # ditto for XML files, but they're less used in WoW TOCs
+        if ".xml" in casefolded:
+            result += 0.05
+
+        return result
diff --git a/.venv/Lib/site-packages/pygments/lexers/wren.py b/.venv/Lib/site-packages/pygments/lexers/wren.py
new file mode 100644 (file)
index 0000000..ec2cd54
--- /dev/null
@@ -0,0 +1,98 @@
+"""
+    pygments.lexers.wren
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Wren.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import include, RegexLexer, words
+from pygments.token import Whitespace, Punctuation, Keyword, Name, Comment, \
+    Operator, Number, String
+
+__all__ = ['WrenLexer']
+
+class WrenLexer(RegexLexer):
+    """
+    For Wren source code, version 0.4.0.
+    """
+    name = 'Wren'
+    url = 'https://wren.io'
+    aliases = ['wren']
+    filenames = ['*.wren']
+    version_added = '2.14'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # Whitespace.
+            (r'\s+', Whitespace),
+            (r'[,\\\[\]{}]', Punctuation),
+
+            # Really 'root', not '#push': in 'interpolation',
+            # parentheses inside the interpolation expression are
+            # Punctuation, not String.Interpol.
+            (r'\(', Punctuation, 'root'),
+            (r'\)', Punctuation, '#pop'),
+
+            # Keywords.
+            (words((
+                'as', 'break', 'class', 'construct', 'continue', 'else',
+                'for', 'foreign', 'if', 'import', 'return', 'static', 'super',
+                'this', 'var', 'while'), prefix = r'(?<!\.)',
+                suffix = r'\b'), Keyword),
+
+            (words((
+                'true', 'false', 'null'), prefix = r'(?<!\.)',
+                suffix = r'\b'), Keyword.Constant),
+
+            (words((
+                'in', 'is'), prefix = r'(?<!\.)',
+                suffix = r'\b'), Operator.Word),
+
+            # Comments.
+            (r'/\*', Comment.Multiline, 'comment'), # Multiline, can nest.
+            (r'//.*?$', Comment.Single),            # Single line.
+            (r'#.*?(\(.*?\))?$', Comment.Special),  # Attribute or shebang.
+
+            # Names and operators.
+            (r'[!%&*+\-./:<=>?\\^|~]+', Operator),
+            (r'[a-z][a-zA-Z_0-9]*', Name),
+            (r'[A-Z][a-zA-Z_0-9]*', Name.Class),
+            (r'__[a-zA-Z_0-9]*', Name.Variable.Class),
+            (r'_[a-zA-Z_0-9]*', Name.Variable.Instance),
+
+            # Numbers.
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+(\.\d+)?([eE][-+]?\d+)?', Number.Float),
+
+            # Strings.
+            (r'""".*?"""', String),   # Raw string
+            (r'"', String, 'string'), # Other string
+        ],
+        'comment': [
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'([^*/]|\*(?!/)|/(?!\*))+', Comment.Multiline),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\[\\%"0abefnrtv]', String.Escape), # Escape.
+            (r'\\x[a-fA-F0-9]{2}', String.Escape), # Byte escape.
+            (r'\\u[a-fA-F0-9]{4}', String.Escape), # Unicode escape.
+            (r'\\U[a-fA-F0-9]{8}', String.Escape), # Long Unicode escape.
+
+            (r'%\(', String.Interpol, 'interpolation'),
+            (r'[^\\"%]+', String), # All remaining characters.
+        ],
+        'interpolation': [
+            # redefine closing paren to be String.Interpol
+            (r'\)', String.Interpol, '#pop'),
+            include('root'),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/x10.py b/.venv/Lib/site-packages/pygments/lexers/x10.py
new file mode 100644 (file)
index 0000000..4b5d097
--- /dev/null
@@ -0,0 +1,66 @@
+"""
+    pygments.lexers.x10
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the X10 programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Text, Comment, Keyword, String
+
+__all__ = ['X10Lexer']
+
+
+class X10Lexer(RegexLexer):
+    """
+    For the X10 language.
+    """
+
+    name = 'X10'
+    url = 'http://x10-lang.org/'
+    aliases = ['x10', 'xten']
+    filenames = ['*.x10']
+    mimetypes = ['text/x-x10']
+    version_added = '2.2'
+
+    keywords = (
+        'as', 'assert', 'async', 'at', 'athome', 'ateach', 'atomic',
+        'break', 'case', 'catch', 'class', 'clocked', 'continue',
+        'def', 'default', 'do', 'else', 'final', 'finally', 'finish',
+        'for', 'goto', 'haszero', 'here', 'if', 'import', 'in',
+        'instanceof', 'interface', 'isref', 'new', 'offer',
+        'operator', 'package', 'return', 'struct', 'switch', 'throw',
+        'try', 'type', 'val', 'var', 'when', 'while'
+    )
+
+    types = (
+        'void'
+    )
+
+    values = (
+        'false', 'null', 'self', 'super', 'this', 'true'
+    )
+
+    modifiers = (
+        'abstract', 'extends', 'implements', 'native', 'offers',
+        'private', 'property', 'protected', 'public', 'static',
+        'throws', 'transient'
+    )
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*(.|\n)*?\*/', Comment.Multiline),
+            (r'\b({})\b'.format('|'.join(keywords)), Keyword),
+            (r'\b({})\b'.format('|'.join(types)), Keyword.Type),
+            (r'\b({})\b'.format('|'.join(values)), Keyword.Constant),
+            (r'\b({})\b'.format('|'.join(modifiers)), Keyword.Declaration),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char),
+            (r'.', Text)
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/xorg.py b/.venv/Lib/site-packages/pygments/lexers/xorg.py
new file mode 100644 (file)
index 0000000..37251e4
--- /dev/null
@@ -0,0 +1,38 @@
+"""
+    pygments.lexers.xorg
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Xorg configs.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Comment, String, Name, Text
+
+__all__ = ['XorgLexer']
+
+
+class XorgLexer(RegexLexer):
+    """Lexer for xorg.conf files."""
+    name = 'Xorg'
+    url = 'https://www.x.org/wiki/'
+    aliases = ['xorg.conf']
+    filenames = ['xorg.conf']
+    mimetypes = []
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'#.*$', Comment),
+
+            (r'((?:Sub)?Section)(\s+)("\w+")',
+             bygroups(String.Escape, Text, String.Escape)),
+            (r'(End(?:Sub)?Section)', String.Escape),
+
+            (r'(\w+)(\s+)([^\n#]+)',
+             bygroups(Name.Builtin, Text, Name.Constant)),
+        ],
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/yang.py b/.venv/Lib/site-packages/pygments/lexers/yang.py
new file mode 100644 (file)
index 0000000..e7f3951
--- /dev/null
@@ -0,0 +1,103 @@
+"""
+    pygments.lexers.yang
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the YANG 1.1 modeling language. See :rfc:`7950`.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Token, Name, String, Comment, Number
+
+__all__ = ['YangLexer']
+
+
+class YangLexer(RegexLexer):
+    """
+    Lexer for YANG, based on RFC7950.
+    """
+    name = 'YANG'
+    url = 'https://tools.ietf.org/html/rfc7950/'
+    aliases = ['yang']
+    filenames = ['*.yang']
+    mimetypes = ['application/yang']
+    version_added = '2.7'
+
+    #Keywords from RFC7950 ; oriented at BNF style
+    TOP_STMTS_KEYWORDS = ("module", "submodule")
+    MODULE_HEADER_STMT_KEYWORDS = ("belongs-to", "namespace", "prefix", "yang-version")
+    META_STMT_KEYWORDS = ("contact", "description", "organization",
+                          "reference", "revision")
+    LINKAGE_STMTS_KEYWORDS = ("import", "include", "revision-date")
+    BODY_STMT_KEYWORDS = ("action", "argument", "augment", "deviation",
+                          "extension", "feature", "grouping", "identity",
+                          "if-feature", "input", "notification", "output",
+                          "rpc", "typedef")
+    DATA_DEF_STMT_KEYWORDS = ("anydata", "anyxml", "case", "choice",
+                              "config", "container", "deviate", "leaf",
+                              "leaf-list", "list", "must", "presence",
+                              "refine", "uses", "when")
+    TYPE_STMT_KEYWORDS = ("base", "bit", "default", "enum", "error-app-tag",
+                          "error-message", "fraction-digits", "length",
+                          "max-elements", "min-elements", "modifier",
+                          "ordered-by", "path", "pattern", "position",
+                          "range", "require-instance", "status", "type",
+                          "units", "value", "yin-element")
+    LIST_STMT_KEYWORDS = ("key", "mandatory", "unique")
+
+    #RFC7950 other keywords
+    CONSTANTS_KEYWORDS = ("add", "current", "delete", "deprecated", "false",
+                          "invert-match", "max", "min", "not-supported",
+                          "obsolete", "replace", "true", "unbounded", "user")
+
+    #RFC7950 Built-In Types
+    TYPES = ("binary", "bits", "boolean", "decimal64", "empty", "enumeration",
+             "identityref", "instance-identifier", "int16", "int32", "int64",
+             "int8", "leafref", "string", "uint16", "uint32", "uint64",
+             "uint8", "union")
+
+    suffix_re_pattern = r'(?=[^\w\-:])'
+
+    tokens = {
+        'comments': [
+            (r'[^*/]', Comment),
+            (r'/\*', Comment, '#push'),
+            (r'\*/', Comment, '#pop'),
+            (r'[*/]', Comment),
+        ],
+        "root": [
+            (r'\s+', Text.Whitespace),
+            (r'[{};]+', Token.Punctuation),
+            (r'(?<![\-\w])(and|or|not|\+|\.)(?![\-\w])', Token.Operator),
+
+            (r'"(?:\\"|[^"])*?"', String.Double),
+            (r"'(?:\\'|[^'])*?'", String.Single),
+
+            (r'/\*', Comment, 'comments'),
+            (r'//.*?$', Comment),
+
+            #match BNF stmt for `node-identifier` with [ prefix ":"]
+            (r'(?:^|(?<=[\s{};]))([\w.-]+)(:)([\w.-]+)(?=[\s{};])',
+             bygroups(Name.Namespace, Token.Punctuation, Name.Variable)),
+
+            #match BNF stmt `date-arg-str`
+            (r'([0-9]{4}\-[0-9]{2}\-[0-9]{2})(?=[\s{};])', Name.Label),
+            (r'([0-9]+\.[0-9]+)(?=[\s{};])', Number.Float),
+            (r'([0-9]+)(?=[\s{};])', Number.Integer),
+
+            (words(TOP_STMTS_KEYWORDS, suffix=suffix_re_pattern), Token.Keyword),
+            (words(MODULE_HEADER_STMT_KEYWORDS, suffix=suffix_re_pattern), Token.Keyword),
+            (words(META_STMT_KEYWORDS, suffix=suffix_re_pattern), Token.Keyword),
+            (words(LINKAGE_STMTS_KEYWORDS, suffix=suffix_re_pattern), Token.Keyword),
+            (words(BODY_STMT_KEYWORDS, suffix=suffix_re_pattern), Token.Keyword),
+            (words(DATA_DEF_STMT_KEYWORDS, suffix=suffix_re_pattern), Token.Keyword),
+            (words(TYPE_STMT_KEYWORDS, suffix=suffix_re_pattern), Token.Keyword),
+            (words(LIST_STMT_KEYWORDS, suffix=suffix_re_pattern), Token.Keyword),
+            (words(TYPES, suffix=suffix_re_pattern), Name.Class),
+            (words(CONSTANTS_KEYWORDS, suffix=suffix_re_pattern), Name.Class),
+
+            (r'[^;{}\s\'"]+', Name.Variable),
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/yara.py b/.venv/Lib/site-packages/pygments/lexers/yara.py
new file mode 100644 (file)
index 0000000..29694f5
--- /dev/null
@@ -0,0 +1,69 @@
+"""
+    pygments.lexers.yara
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for YARA.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, String, Name, Text, Punctuation, \
+    Operator, Keyword, Whitespace, Number
+
+__all__ = ['YaraLexer']
+
+
+class YaraLexer(RegexLexer):
+    """
+    For YARA rules
+    """
+
+    name = 'YARA'
+    url = 'https://virustotal.github.io/yara/'
+    aliases = ['yara', 'yar']
+    filenames = ['*.yar']
+    mimetypes = ['text/x-yara']
+    version_added = '2.16'
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'//.*?$', Comment.Single),
+            (r'\#.*?$', Comment.Single),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (words(('rule', 'private', 'global', 'import', 'include'),
+                   prefix=r'\b', suffix=r'\b'),
+             Keyword.Declaration),
+            (words(('strings', 'condition', 'meta'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (words(('ascii', 'at', 'base64', 'base64wide', 'condition',
+                    'contains', 'endswith', 'entrypoint', 'filesize', 'for',
+                    'fullword', 'icontains', 'iendswith', 'iequals', 'in',
+                    'include', 'int16', 'int16be', 'int32', 'int32be', 'int8',
+                    'int8be', 'istartswith', 'matches', 'meta', 'nocase',
+                    'none', 'of', 'startswith', 'strings', 'them', 'uint16',
+                    'uint16be', 'uint32', 'uint32be', 'uint8', 'uint8be',
+                    'wide', 'xor', 'defined'),
+                   prefix=r'\b', suffix=r'\b'),
+             Name.Builtin),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'(and|or|not|any|all)\b', Operator.Word),
+            (r'(\$\w+)', Name.Variable),
+            (r'"[^"]*"', String.Double),
+            (r'\'[^\']*\'', String.Single),
+            (r'\{.*?\}$', Number.Hex),
+            (r'(/.*?/)', String.Regex),
+            (r'[a-z_]\w*', Name),
+            (r'[$(){}[\].?+*|]', Punctuation),
+            (r'[:=,;]', Punctuation),
+            (r'.', Text)
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/lexers/zig.py b/.venv/Lib/site-packages/pygments/lexers/zig.py
new file mode 100644 (file)
index 0000000..2b0168a
--- /dev/null
@@ -0,0 +1,125 @@
+"""
+    pygments.lexers.zig
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Zig.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['ZigLexer']
+
+
+class ZigLexer(RegexLexer):
+    """
+    Lexer for the Zig language.
+
+    grammar: https://ziglang.org/documentation/master/#Grammar
+    """
+    name = 'Zig'
+    url = 'http://www.ziglang.org'
+    aliases = ['zig']
+    filenames = ['*.zig']
+    mimetypes = ['text/zig']
+    version_added = ''
+
+    type_keywords = (
+        words(('bool', 'f16', 'f32', 'f64', 'f128', 'void', 'noreturn', 'type',
+               'anyerror', 'promise', 'i0', 'u0', 'isize',  'usize', 'comptime_int',
+               'comptime_float', 'c_short', 'c_ushort', 'c_int', 'c_uint', 'c_long',
+               'c_ulong', 'c_longlong', 'c_ulonglong', 'c_longdouble', 'c_void'
+               'i8', 'u8', 'i16', 'u16', 'i32', 'u32', 'i64', 'u64', 'i128',
+               'u128'), suffix=r'\b'),
+        Keyword.Type)
+
+    storage_keywords = (
+        words(('const', 'var', 'extern', 'packed', 'export', 'pub', 'noalias',
+               'inline', 'comptime', 'nakedcc', 'stdcallcc', 'volatile', 'allowzero',
+               'align', 'linksection', 'threadlocal'), suffix=r'\b'),
+        Keyword.Reserved)
+
+    structure_keywords = (
+        words(('struct', 'enum', 'union', 'error'), suffix=r'\b'),
+        Keyword)
+
+    statement_keywords = (
+        words(('break', 'return', 'continue', 'asm', 'defer', 'errdefer',
+               'unreachable', 'try', 'catch', 'async', 'await', 'suspend',
+               'resume', 'cancel'), suffix=r'\b'),
+        Keyword)
+
+    conditional_keywords = (
+        words(('if', 'else', 'switch', 'and', 'or', 'orelse'), suffix=r'\b'),
+        Keyword)
+
+    repeat_keywords = (
+        words(('while', 'for'), suffix=r'\b'),
+        Keyword)
+
+    other_keywords = (
+        words(('fn', 'usingnamespace', 'test'), suffix=r'\b'),
+        Keyword)
+
+    constant_keywords = (
+        words(('true', 'false', 'null', 'undefined'), suffix=r'\b'),
+        Keyword.Constant)
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'//.*?\n', Comment.Single),
+
+            # Keywords
+            statement_keywords,
+            storage_keywords,
+            structure_keywords,
+            repeat_keywords,
+            type_keywords,
+            constant_keywords,
+            conditional_keywords,
+            other_keywords,
+
+            # Floats
+            (r'0x[0-9a-fA-F]+\.[0-9a-fA-F]+([pP][\-+]?[0-9a-fA-F]+)?', Number.Float),
+            (r'0x[0-9a-fA-F]+\.?[pP][\-+]?[0-9a-fA-F]+', Number.Float),
+            (r'[0-9]+\.[0-9]+([eE][-+]?[0-9]+)?', Number.Float),
+            (r'[0-9]+\.?[eE][-+]?[0-9]+', Number.Float),
+
+            # Integers
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+
+            # Identifier
+            (r'@[a-zA-Z_]\w*', Name.Builtin),
+            (r'[a-zA-Z_]\w*', Name),
+
+            # Characters
+            (r'\'\\\'\'', String.Escape),
+            (r'\'\\(x[a-fA-F0-9]{2}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{6}|[nr\\t\'"])\'',
+             String.Escape),
+            (r'\'[^\\\']\'', String),
+
+            # Strings
+            (r'\\\\[^\n]*', String.Heredoc),
+            (r'c\\\\[^\n]*', String.Heredoc),
+            (r'c?"', String, 'string'),
+
+            # Operators, Punctuation
+            (r'[+%=><|^!?/\-*&~:]', Operator),
+            (r'[{}()\[\],.;]', Punctuation)
+        ],
+        'string': [
+            (r'\\(x[a-fA-F0-9]{2}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{6}|[nr\\t\'"])',
+             String.Escape),
+            (r'[^\\"\n]+', String),
+            (r'"', String, '#pop')
+        ]
+    }
diff --git a/.venv/Lib/site-packages/pygments/modeline.py b/.venv/Lib/site-packages/pygments/modeline.py
new file mode 100644 (file)
index 0000000..c310f0e
--- /dev/null
@@ -0,0 +1,43 @@
+"""
+    pygments.modeline
+    ~~~~~~~~~~~~~~~~~
+
+    A simple modeline parser (based on pymodeline).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+__all__ = ['get_filetype_from_buffer']
+
+
+modeline_re = re.compile(r'''
+    (?: vi | vim | ex ) (?: [<=>]? \d* )? :
+    .* (?: ft | filetype | syn | syntax ) = ( [^:\s]+ )
+''', re.VERBOSE)
+
+
+def get_filetype_from_line(l): # noqa: E741
+    m = modeline_re.search(l)
+    if m:
+        return m.group(1)
+
+
+def get_filetype_from_buffer(buf, max_lines=5):
+    """
+    Scan the buffer for modelines and return filetype if one is found.
+    """
+    lines = buf.splitlines()
+    for line in lines[-1:-max_lines-1:-1]:
+        ret = get_filetype_from_line(line)
+        if ret:
+            return ret
+    for i in range(max_lines, -1, -1):
+        if i < len(lines):
+            ret = get_filetype_from_line(lines[i])
+            if ret:
+                return ret
+
+    return None
diff --git a/.venv/Lib/site-packages/pygments/plugin.py b/.venv/Lib/site-packages/pygments/plugin.py
new file mode 100644 (file)
index 0000000..498db42
--- /dev/null
@@ -0,0 +1,72 @@
+"""
+    pygments.plugin
+    ~~~~~~~~~~~~~~~
+
+    Pygments plugin interface.
+
+    lexer plugins::
+
+        [pygments.lexers]
+        yourlexer = yourmodule:YourLexer
+
+    formatter plugins::
+
+        [pygments.formatters]
+        yourformatter = yourformatter:YourFormatter
+        /.ext = yourformatter:YourFormatter
+
+    As you can see, you can define extensions for the formatter
+    with a leading slash.
+
+    syntax plugins::
+
+        [pygments.styles]
+        yourstyle = yourstyle:YourStyle
+
+    filter plugin::
+
+        [pygments.filter]
+        yourfilter = yourfilter:YourFilter
+
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+from importlib.metadata import entry_points
+
+LEXER_ENTRY_POINT = 'pygments.lexers'
+FORMATTER_ENTRY_POINT = 'pygments.formatters'
+STYLE_ENTRY_POINT = 'pygments.styles'
+FILTER_ENTRY_POINT = 'pygments.filters'
+
+
+def iter_entry_points(group_name):
+    groups = entry_points()
+    if hasattr(groups, 'select'):
+        # New interface in Python 3.10 and newer versions of the
+        # importlib_metadata backport.
+        return groups.select(group=group_name)
+    else:
+        # Older interface, deprecated in Python 3.10 and recent
+        # importlib_metadata, but we need it in Python 3.8 and 3.9.
+        return groups.get(group_name, [])
+
+
+def find_plugin_lexers():
+    for entrypoint in iter_entry_points(LEXER_ENTRY_POINT):
+        yield entrypoint.load()
+
+
+def find_plugin_formatters():
+    for entrypoint in iter_entry_points(FORMATTER_ENTRY_POINT):
+        yield entrypoint.name, entrypoint.load()
+
+
+def find_plugin_styles():
+    for entrypoint in iter_entry_points(STYLE_ENTRY_POINT):
+        yield entrypoint.name, entrypoint.load()
+
+
+def find_plugin_filters():
+    for entrypoint in iter_entry_points(FILTER_ENTRY_POINT):
+        yield entrypoint.name, entrypoint.load()
diff --git a/.venv/Lib/site-packages/pygments/regexopt.py b/.venv/Lib/site-packages/pygments/regexopt.py
new file mode 100644 (file)
index 0000000..cc8d2c3
--- /dev/null
@@ -0,0 +1,91 @@
+"""
+    pygments.regexopt
+    ~~~~~~~~~~~~~~~~~
+
+    An algorithm that generates optimized regexes for matching long lists of
+    literal strings.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+from re import escape
+from os.path import commonprefix
+from itertools import groupby
+from operator import itemgetter
+
+CS_ESCAPE = re.compile(r'[\[\^\\\-\]]')
+FIRST_ELEMENT = itemgetter(0)
+
+
+def make_charset(letters):
+    return '[' + CS_ESCAPE.sub(lambda m: '\\' + m.group(), ''.join(letters)) + ']'
+
+
+def regex_opt_inner(strings, open_paren):
+    """Return a regex that matches any string in the sorted list of strings."""
+    close_paren = open_paren and ')' or ''
+    # print strings, repr(open_paren)
+    if not strings:
+        # print '-> nothing left'
+        return ''
+    first = strings[0]
+    if len(strings) == 1:
+        # print '-> only 1 string'
+        return open_paren + escape(first) + close_paren
+    if not first:
+        # print '-> first string empty'
+        return open_paren + regex_opt_inner(strings[1:], '(?:') \
+            + '?' + close_paren
+    if len(first) == 1:
+        # multiple one-char strings? make a charset
+        oneletter = []
+        rest = []
+        for s in strings:
+            if len(s) == 1:
+                oneletter.append(s)
+            else:
+                rest.append(s)
+        if len(oneletter) > 1:  # do we have more than one oneletter string?
+            if rest:
+                # print '-> 1-character + rest'
+                return open_paren + regex_opt_inner(rest, '') + '|' \
+                    + make_charset(oneletter) + close_paren
+            # print '-> only 1-character'
+            return open_paren + make_charset(oneletter) + close_paren
+    prefix = commonprefix(strings)
+    if prefix:
+        plen = len(prefix)
+        # we have a prefix for all strings
+        # print '-> prefix:', prefix
+        return open_paren + escape(prefix) \
+            + regex_opt_inner([s[plen:] for s in strings], '(?:') \
+            + close_paren
+    # is there a suffix?
+    strings_rev = [s[::-1] for s in strings]
+    suffix = commonprefix(strings_rev)
+    if suffix:
+        slen = len(suffix)
+        # print '-> suffix:', suffix[::-1]
+        return open_paren \
+            + regex_opt_inner(sorted(s[:-slen] for s in strings), '(?:') \
+            + escape(suffix[::-1]) + close_paren
+    # recurse on common 1-string prefixes
+    # print '-> last resort'
+    return open_paren + \
+        '|'.join(regex_opt_inner(list(group[1]), '')
+                 for group in groupby(strings, lambda s: s[0] == first[0])) \
+        + close_paren
+
+
+def regex_opt(strings, prefix='', suffix=''):
+    """Return a compiled regex that matches any string in the given list.
+
+    The strings to match must be literal strings, not regexes.  They will be
+    regex-escaped.
+
+    *prefix* and *suffix* are pre- and appended to the final regex.
+    """
+    strings = sorted(strings)
+    return prefix + regex_opt_inner(strings, '(') + suffix
diff --git a/.venv/Lib/site-packages/pygments/scanner.py b/.venv/Lib/site-packages/pygments/scanner.py
new file mode 100644 (file)
index 0000000..3c8c848
--- /dev/null
@@ -0,0 +1,104 @@
+"""
+    pygments.scanner
+    ~~~~~~~~~~~~~~~~
+
+    This library implements a regex based scanner. Some languages
+    like Pascal are easy to parse but have some keywords that
+    depend on the context. Because of this it's impossible to lex
+    that just by using a regular expression lexer like the
+    `RegexLexer`.
+
+    Have a look at the `DelphiLexer` to get an idea of how to use
+    this scanner.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+import re
+
+
+class EndOfText(RuntimeError):
+    """
+    Raise if end of text is reached and the user
+    tried to call a match function.
+    """
+
+
+class Scanner:
+    """
+    Simple scanner
+
+    All method patterns are regular expression strings (not
+    compiled expressions!)
+    """
+
+    def __init__(self, text, flags=0):
+        """
+        :param text:    The text which should be scanned
+        :param flags:   default regular expression flags
+        """
+        self.data = text
+        self.data_length = len(text)
+        self.start_pos = 0
+        self.pos = 0
+        self.flags = flags
+        self.last = None
+        self.match = None
+        self._re_cache = {}
+
+    def eos(self):
+        """`True` if the scanner reached the end of text."""
+        return self.pos >= self.data_length
+    eos = property(eos, eos.__doc__)
+
+    def check(self, pattern):
+        """
+        Apply `pattern` on the current position and return
+        the match object. (Doesn't touch pos). Use this for
+        lookahead.
+        """
+        if self.eos:
+            raise EndOfText()
+        if pattern not in self._re_cache:
+            self._re_cache[pattern] = re.compile(pattern, self.flags)
+        return self._re_cache[pattern].match(self.data, self.pos)
+
+    def test(self, pattern):
+        """Apply a pattern on the current position and check
+        if it patches. Doesn't touch pos.
+        """
+        return self.check(pattern) is not None
+
+    def scan(self, pattern):
+        """
+        Scan the text for the given pattern and update pos/match
+        and related fields. The return value is a boolean that
+        indicates if the pattern matched. The matched value is
+        stored on the instance as ``match``, the last value is
+        stored as ``last``. ``start_pos`` is the position of the
+        pointer before the pattern was matched, ``pos`` is the
+        end position.
+        """
+        if self.eos:
+            raise EndOfText()
+        if pattern not in self._re_cache:
+            self._re_cache[pattern] = re.compile(pattern, self.flags)
+        self.last = self.match
+        m = self._re_cache[pattern].match(self.data, self.pos)
+        if m is None:
+            return False
+        self.start_pos = m.start()
+        self.pos = m.end()
+        self.match = m.group()
+        return True
+
+    def get_char(self):
+        """Scan exactly one char."""
+        self.scan('.')
+
+    def __repr__(self):
+        return '<%s %d/%d>' % (
+            self.__class__.__name__,
+            self.pos,
+            self.data_length
+        )
diff --git a/.venv/Lib/site-packages/pygments/sphinxext.py b/.venv/Lib/site-packages/pygments/sphinxext.py
new file mode 100644 (file)
index 0000000..c215399
--- /dev/null
@@ -0,0 +1,247 @@
+"""
+    pygments.sphinxext
+    ~~~~~~~~~~~~~~~~~~
+
+    Sphinx extension to generate automatic documentation of lexers,
+    formatters and filters.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import sys
+
+from docutils import nodes
+from docutils.statemachine import ViewList
+from docutils.parsers.rst import Directive
+from sphinx.util.nodes import nested_parse_with_titles
+
+
+MODULEDOC = '''
+.. module:: %s
+
+%s
+%s
+'''
+
+LEXERDOC = '''
+.. class:: %s
+
+    :Short names: %s
+    :Filenames:   %s
+    :MIME types:  %s
+
+    %s
+
+    %s
+
+'''
+
+FMTERDOC = '''
+.. class:: %s
+
+    :Short names: %s
+    :Filenames: %s
+
+    %s
+
+'''
+
+FILTERDOC = '''
+.. class:: %s
+
+    :Name: %s
+
+    %s
+
+'''
+
+
+class PygmentsDoc(Directive):
+    """
+    A directive to collect all lexers/formatters/filters and generate
+    autoclass directives for them.
+    """
+    has_content = False
+    required_arguments = 1
+    optional_arguments = 0
+    final_argument_whitespace = False
+    option_spec = {}
+
+    def run(self):
+        self.filenames = set()
+        if self.arguments[0] == 'lexers':
+            out = self.document_lexers()
+        elif self.arguments[0] == 'formatters':
+            out = self.document_formatters()
+        elif self.arguments[0] == 'filters':
+            out = self.document_filters()
+        elif self.arguments[0] == 'lexers_overview':
+            out = self.document_lexers_overview()
+        else:
+            raise Exception('invalid argument for "pygmentsdoc" directive')
+        node = nodes.compound()
+        vl = ViewList(out.split('\n'), source='')
+        nested_parse_with_titles(self.state, vl, node)
+        for fn in self.filenames:
+            self.state.document.settings.record_dependencies.add(fn)
+        return node.children
+
+    def document_lexers_overview(self):
+        """Generate a tabular overview of all lexers.
+
+        The columns are the lexer name, the extensions handled by this lexer
+        (or "None"), the aliases and a link to the lexer class."""
+        from pygments.lexers._mapping import LEXERS
+        import pygments.lexers
+        out = []
+
+        table = []
+
+        def format_link(name, url):
+            if url:
+                return f'`{name} <{url}>`_'
+            return name
+
+        for classname, data in sorted(LEXERS.items(), key=lambda x: x[1][1].lower()):
+            lexer_cls = pygments.lexers.find_lexer_class(data[1])
+            extensions = lexer_cls.filenames + lexer_cls.alias_filenames
+
+            table.append({
+                'name': format_link(data[1], lexer_cls.url),
+                'extensions': ', '.join(extensions).replace('*', '\\*').replace('_', '\\') or 'None',
+                'aliases': ', '.join(data[2]),
+                'class': f'{data[0]}.{classname}'
+            })
+
+        column_names = ['name', 'extensions', 'aliases', 'class']
+        column_lengths = [max([len(row[column]) for row in table if row[column]])
+                          for column in column_names]
+
+        def write_row(*columns):
+            """Format a table row"""
+            out = []
+            for length, col in zip(column_lengths, columns):
+                if col:
+                    out.append(col.ljust(length))
+                else:
+                    out.append(' '*length)
+
+            return ' '.join(out)
+
+        def write_seperator():
+            """Write a table separator row"""
+            sep = ['='*c for c in column_lengths]
+            return write_row(*sep)
+
+        out.append(write_seperator())
+        out.append(write_row('Name', 'Extension(s)', 'Short name(s)', 'Lexer class'))
+        out.append(write_seperator())
+        for row in table:
+            out.append(write_row(
+                row['name'],
+                row['extensions'],
+                row['aliases'],
+                f':class:`~{row["class"]}`'))
+        out.append(write_seperator())
+
+        return '\n'.join(out)
+
+    def document_lexers(self):
+        from pygments.lexers._mapping import LEXERS
+        import pygments
+        import inspect
+        import pathlib
+
+        out = []
+        modules = {}
+        moduledocstrings = {}
+        for classname, data in sorted(LEXERS.items(), key=lambda x: x[0]):
+            module = data[0]
+            mod = __import__(module, None, None, [classname])
+            self.filenames.add(mod.__file__)
+            cls = getattr(mod, classname)
+            if not cls.__doc__:
+                print(f"Warning: {classname} does not have a docstring.")
+            docstring = cls.__doc__
+            if isinstance(docstring, bytes):
+                docstring = docstring.decode('utf8')
+
+            example_file = getattr(cls, '_example', None)
+            if example_file:
+                p = pathlib.Path(inspect.getabsfile(pygments)).parent.parent /\
+                    'tests' / 'examplefiles' / example_file
+                content = p.read_text(encoding='utf-8')
+                if not content:
+                    raise Exception(
+                        f"Empty example file '{example_file}' for lexer "
+                        f"{classname}")
+
+                if data[2]:
+                    lexer_name = data[2][0]
+                    docstring += '\n\n    .. admonition:: Example\n'
+                    docstring += f'\n      .. code-block:: {lexer_name}\n\n'
+                    for line in content.splitlines():
+                        docstring += f'          {line}\n'
+
+            if cls.version_added:
+                version_line = f'.. versionadded:: {cls.version_added}'
+            else:
+                version_line = ''
+
+            modules.setdefault(module, []).append((
+                classname,
+                ', '.join(data[2]) or 'None',
+                ', '.join(data[3]).replace('*', '\\*').replace('_', '\\') or 'None',
+                ', '.join(data[4]) or 'None',
+                docstring,
+                version_line))
+            if module not in moduledocstrings:
+                moddoc = mod.__doc__
+                if isinstance(moddoc, bytes):
+                    moddoc = moddoc.decode('utf8')
+                moduledocstrings[module] = moddoc
+
+        for module, lexers in sorted(modules.items(), key=lambda x: x[0]):
+            if moduledocstrings[module] is None:
+                raise Exception(f"Missing docstring for {module}")
+            heading = moduledocstrings[module].splitlines()[4].strip().rstrip('.')
+            out.append(MODULEDOC % (module, heading, '-'*len(heading)))
+            for data in lexers:
+                out.append(LEXERDOC % data)
+
+        return ''.join(out)
+
+    def document_formatters(self):
+        from pygments.formatters import FORMATTERS
+
+        out = []
+        for classname, data in sorted(FORMATTERS.items(), key=lambda x: x[0]):
+            module = data[0]
+            mod = __import__(module, None, None, [classname])
+            self.filenames.add(mod.__file__)
+            cls = getattr(mod, classname)
+            docstring = cls.__doc__
+            if isinstance(docstring, bytes):
+                docstring = docstring.decode('utf8')
+            heading = cls.__name__
+            out.append(FMTERDOC % (heading, ', '.join(data[2]) or 'None',
+                                   ', '.join(data[3]).replace('*', '\\*') or 'None',
+                                   docstring))
+        return ''.join(out)
+
+    def document_filters(self):
+        from pygments.filters import FILTERS
+
+        out = []
+        for name, cls in FILTERS.items():
+            self.filenames.add(sys.modules[cls.__module__].__file__)
+            docstring = cls.__doc__
+            if isinstance(docstring, bytes):
+                docstring = docstring.decode('utf8')
+            out.append(FILTERDOC % (cls.__name__, name, docstring))
+        return ''.join(out)
+
+
+def setup(app):
+    app.add_directive('pygmentsdoc', PygmentsDoc)
diff --git a/.venv/Lib/site-packages/pygments/style.py b/.venv/Lib/site-packages/pygments/style.py
new file mode 100644 (file)
index 0000000..ac36cad
--- /dev/null
@@ -0,0 +1,203 @@
+"""
+    pygments.style
+    ~~~~~~~~~~~~~~
+
+    Basic style object.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.token import Token, STANDARD_TYPES
+
+# Default mapping of ansixxx to RGB colors.
+_ansimap = {
+    # dark
+    'ansiblack': '000000',
+    'ansired': '7f0000',
+    'ansigreen': '007f00',
+    'ansiyellow': '7f7fe0',
+    'ansiblue': '00007f',
+    'ansimagenta': '7f007f',
+    'ansicyan': '007f7f',
+    'ansigray': 'e5e5e5',
+    # normal
+    'ansibrightblack': '555555',
+    'ansibrightred': 'ff0000',
+    'ansibrightgreen': '00ff00',
+    'ansibrightyellow': 'ffff00',
+    'ansibrightblue': '0000ff',
+    'ansibrightmagenta': 'ff00ff',
+    'ansibrightcyan': '00ffff',
+    'ansiwhite': 'ffffff',
+}
+# mapping of deprecated #ansixxx colors to new color names
+_deprecated_ansicolors = {
+    # dark
+    '#ansiblack': 'ansiblack',
+    '#ansidarkred': 'ansired',
+    '#ansidarkgreen': 'ansigreen',
+    '#ansibrown': 'ansiyellow',
+    '#ansidarkblue': 'ansiblue',
+    '#ansipurple': 'ansimagenta',
+    '#ansiteal': 'ansicyan',
+    '#ansilightgray': 'ansigray',
+    # normal
+    '#ansidarkgray': 'ansibrightblack',
+    '#ansired': 'ansibrightred',
+    '#ansigreen': 'ansibrightgreen',
+    '#ansiyellow': 'ansibrightyellow',
+    '#ansiblue': 'ansibrightblue',
+    '#ansifuchsia': 'ansibrightmagenta',
+    '#ansiturquoise': 'ansibrightcyan',
+    '#ansiwhite': 'ansiwhite',
+}
+ansicolors = set(_ansimap)
+
+
+class StyleMeta(type):
+
+    def __new__(mcs, name, bases, dct):
+        obj = type.__new__(mcs, name, bases, dct)
+        for token in STANDARD_TYPES:
+            if token not in obj.styles:
+                obj.styles[token] = ''
+
+        def colorformat(text):
+            if text in ansicolors:
+                return text
+            if text[0:1] == '#':
+                col = text[1:]
+                if len(col) == 6:
+                    return col
+                elif len(col) == 3:
+                    return col[0] * 2 + col[1] * 2 + col[2] * 2
+            elif text == '':
+                return ''
+            elif text.startswith('var') or text.startswith('calc'):
+                return text
+            assert False, f"wrong color format {text!r}"
+
+        _styles = obj._styles = {}
+
+        for ttype in obj.styles:
+            for token in ttype.split():
+                if token in _styles:
+                    continue
+                ndef = _styles.get(token.parent, None)
+                styledefs = obj.styles.get(token, '').split()
+                if not ndef or token is None:
+                    ndef = ['', 0, 0, 0, '', '', 0, 0, 0]
+                elif 'noinherit' in styledefs and token is not Token:
+                    ndef = _styles[Token][:]
+                else:
+                    ndef = ndef[:]
+                _styles[token] = ndef
+                for styledef in obj.styles.get(token, '').split():
+                    if styledef == 'noinherit':
+                        pass
+                    elif styledef == 'bold':
+                        ndef[1] = 1
+                    elif styledef == 'nobold':
+                        ndef[1] = 0
+                    elif styledef == 'italic':
+                        ndef[2] = 1
+                    elif styledef == 'noitalic':
+                        ndef[2] = 0
+                    elif styledef == 'underline':
+                        ndef[3] = 1
+                    elif styledef == 'nounderline':
+                        ndef[3] = 0
+                    elif styledef[:3] == 'bg:':
+                        ndef[4] = colorformat(styledef[3:])
+                    elif styledef[:7] == 'border:':
+                        ndef[5] = colorformat(styledef[7:])
+                    elif styledef == 'roman':
+                        ndef[6] = 1
+                    elif styledef == 'sans':
+                        ndef[7] = 1
+                    elif styledef == 'mono':
+                        ndef[8] = 1
+                    else:
+                        ndef[0] = colorformat(styledef)
+
+        return obj
+
+    def style_for_token(cls, token):
+        t = cls._styles[token]
+        ansicolor = bgansicolor = None
+        color = t[0]
+        if color in _deprecated_ansicolors:
+            color = _deprecated_ansicolors[color]
+        if color in ansicolors:
+            ansicolor = color
+            color = _ansimap[color]
+        bgcolor = t[4]
+        if bgcolor in _deprecated_ansicolors:
+            bgcolor = _deprecated_ansicolors[bgcolor]
+        if bgcolor in ansicolors:
+            bgansicolor = bgcolor
+            bgcolor = _ansimap[bgcolor]
+
+        return {
+            'color':        color or None,
+            'bold':         bool(t[1]),
+            'italic':       bool(t[2]),
+            'underline':    bool(t[3]),
+            'bgcolor':      bgcolor or None,
+            'border':       t[5] or None,
+            'roman':        bool(t[6]) or None,
+            'sans':         bool(t[7]) or None,
+            'mono':         bool(t[8]) or None,
+            'ansicolor':    ansicolor,
+            'bgansicolor':  bgansicolor,
+        }
+
+    def list_styles(cls):
+        return list(cls)
+
+    def styles_token(cls, ttype):
+        return ttype in cls._styles
+
+    def __iter__(cls):
+        for token in cls._styles:
+            yield token, cls.style_for_token(token)
+
+    def __len__(cls):
+        return len(cls._styles)
+
+
+class Style(metaclass=StyleMeta):
+
+    #: overall background color (``None`` means transparent)
+    background_color = '#ffffff'
+
+    #: highlight background color
+    highlight_color = '#ffffcc'
+
+    #: line number font color
+    line_number_color = 'inherit'
+
+    #: line number background color
+    line_number_background_color = 'transparent'
+
+    #: special line number font color
+    line_number_special_color = '#000000'
+
+    #: special line number background color
+    line_number_special_background_color = '#ffffc0'
+
+    #: Style definitions for individual token types.
+    styles = {}
+
+    #: user-friendly style name (used when selecting the style, so this
+    # should be all-lowercase, no spaces, hyphens)
+    name = 'unnamed'
+
+    aliases = []
+
+    # Attribute for lexers defined within Pygments. If set
+    # to True, the style is not shown in the style gallery
+    # on the website. This is intended for language-specific
+    # styles.
+    web_style_gallery_exclude = False
diff --git a/.venv/Lib/site-packages/pygments/styles/__init__.py b/.venv/Lib/site-packages/pygments/styles/__init__.py
new file mode 100644 (file)
index 0000000..5d45d8b
--- /dev/null
@@ -0,0 +1,61 @@
+"""
+    pygments.styles
+    ~~~~~~~~~~~~~~~
+
+    Contains built-in styles.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.plugin import find_plugin_styles
+from pygments.util import ClassNotFound
+from pygments.styles._mapping import STYLES
+
+#: A dictionary of built-in styles, mapping style names to
+#: ``'submodule::classname'`` strings.
+#: This list is deprecated. Use `pygments.styles.STYLES` instead
+STYLE_MAP = {v[1]: v[0].split('.')[-1] + '::' + k for k, v in STYLES.items()}
+
+#: Internal reverse mapping to make `get_style_by_name` more efficient
+_STYLE_NAME_TO_MODULE_MAP = {v[1]: (v[0], k) for k, v in STYLES.items()}
+
+
+def get_style_by_name(name):
+    """
+    Return a style class by its short name. The names of the builtin styles
+    are listed in :data:`pygments.styles.STYLE_MAP`.
+
+    Will raise :exc:`pygments.util.ClassNotFound` if no style of that name is
+    found.
+    """
+    if name in _STYLE_NAME_TO_MODULE_MAP:
+        mod, cls = _STYLE_NAME_TO_MODULE_MAP[name]
+        builtin = "yes"
+    else:
+        for found_name, style in find_plugin_styles():
+            if name == found_name:
+                return style
+        # perhaps it got dropped into our styles package
+        builtin = ""
+        mod = 'pygments.styles.' + name
+        cls = name.title() + "Style"
+
+    try:
+        mod = __import__(mod, None, None, [cls])
+    except ImportError:
+        raise ClassNotFound(f"Could not find style module {mod!r}" +
+                            (builtin and ", though it should be builtin")
+                            + ".")
+    try:
+        return getattr(mod, cls)
+    except AttributeError:
+        raise ClassNotFound(f"Could not find style class {cls!r} in style module.")
+
+
+def get_all_styles():
+    """Return a generator for all styles by name, both builtin and plugin."""
+    for v in STYLES.values():
+        yield v[1]
+    for name, _ in find_plugin_styles():
+        yield name
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c0b94bf
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/_mapping.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/_mapping.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6fdc9d3
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/_mapping.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/abap.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/abap.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6f77798
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/abap.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/algol.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/algol.cpython-312.pyc
new file mode 100644 (file)
index 0000000..faec656
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/algol.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/algol_nu.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/algol_nu.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1ec0f53
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/algol_nu.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/arduino.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/arduino.cpython-312.pyc
new file mode 100644 (file)
index 0000000..23aa9c0
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/arduino.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/autumn.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/autumn.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a25d25b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/autumn.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/borland.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/borland.cpython-312.pyc
new file mode 100644 (file)
index 0000000..26ae433
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/borland.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/bw.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/bw.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7356a28
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/bw.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/coffee.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/coffee.cpython-312.pyc
new file mode 100644 (file)
index 0000000..10c75d9
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/coffee.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/colorful.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/colorful.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1c7e55f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/colorful.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/default.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/default.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9e7f5f2
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/default.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/dracula.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/dracula.cpython-312.pyc
new file mode 100644 (file)
index 0000000..bf36333
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/dracula.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/emacs.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/emacs.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b041f8b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/emacs.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/friendly.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/friendly.cpython-312.pyc
new file mode 100644 (file)
index 0000000..06bf488
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/friendly.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/friendly_grayscale.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/friendly_grayscale.cpython-312.pyc
new file mode 100644 (file)
index 0000000..60c686d
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/friendly_grayscale.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/fruity.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/fruity.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b746ccf
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/fruity.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/gh_dark.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/gh_dark.cpython-312.pyc
new file mode 100644 (file)
index 0000000..72dfd5e
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/gh_dark.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/gruvbox.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/gruvbox.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e536558
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/gruvbox.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/igor.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/igor.cpython-312.pyc
new file mode 100644 (file)
index 0000000..444f58f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/igor.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/inkpot.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/inkpot.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e4258a4
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/inkpot.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/lightbulb.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/lightbulb.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f725821
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/lightbulb.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/lilypond.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/lilypond.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e5aab28
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/lilypond.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/lovelace.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/lovelace.cpython-312.pyc
new file mode 100644 (file)
index 0000000..bf3f2bd
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/lovelace.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/manni.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/manni.cpython-312.pyc
new file mode 100644 (file)
index 0000000..723a5bb
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/manni.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/material.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/material.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5a8ea48
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/material.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/monokai.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/monokai.cpython-312.pyc
new file mode 100644 (file)
index 0000000..40225e7
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/monokai.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/murphy.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/murphy.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a97bd2a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/murphy.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/native.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/native.cpython-312.pyc
new file mode 100644 (file)
index 0000000..41d7755
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/native.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/nord.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/nord.cpython-312.pyc
new file mode 100644 (file)
index 0000000..067d845
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/nord.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/onedark.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/onedark.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5fdff95
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/onedark.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/paraiso_dark.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/paraiso_dark.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6dff691
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/paraiso_dark.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/paraiso_light.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/paraiso_light.cpython-312.pyc
new file mode 100644 (file)
index 0000000..81b93f3
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/paraiso_light.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/pastie.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/pastie.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c1af42b
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/pastie.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/perldoc.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/perldoc.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7a4d029
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/perldoc.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/rainbow_dash.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/rainbow_dash.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6f254f3
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/rainbow_dash.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/rrt.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/rrt.cpython-312.pyc
new file mode 100644 (file)
index 0000000..be09ac8
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/rrt.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/sas.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/sas.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c09198c
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/sas.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/solarized.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/solarized.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1440b07
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/solarized.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/staroffice.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/staroffice.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3ddd0e6
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/staroffice.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/stata_dark.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/stata_dark.cpython-312.pyc
new file mode 100644 (file)
index 0000000..63d078a
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/stata_dark.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/stata_light.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/stata_light.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c1c3963
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/stata_light.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/tango.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/tango.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f92fb61
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/tango.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/trac.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/trac.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b5a13e2
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/trac.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/vim.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/vim.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6dd6543
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/vim.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/vs.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/vs.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f9f575f
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/vs.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/xcode.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/xcode.cpython-312.pyc
new file mode 100644 (file)
index 0000000..fac8760
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/xcode.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/__pycache__/zenburn.cpython-312.pyc b/.venv/Lib/site-packages/pygments/styles/__pycache__/zenburn.cpython-312.pyc
new file mode 100644 (file)
index 0000000..7add4d9
Binary files /dev/null and b/.venv/Lib/site-packages/pygments/styles/__pycache__/zenburn.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/pygments/styles/_mapping.py b/.venv/Lib/site-packages/pygments/styles/_mapping.py
new file mode 100644 (file)
index 0000000..49a7fae
--- /dev/null
@@ -0,0 +1,54 @@
+# Automatically generated by scripts/gen_mapfiles.py.
+# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead.
+
+STYLES = {
+    'AbapStyle': ('pygments.styles.abap', 'abap', ()),
+    'AlgolStyle': ('pygments.styles.algol', 'algol', ()),
+    'Algol_NuStyle': ('pygments.styles.algol_nu', 'algol_nu', ()),
+    'ArduinoStyle': ('pygments.styles.arduino', 'arduino', ()),
+    'AutumnStyle': ('pygments.styles.autumn', 'autumn', ()),
+    'BlackWhiteStyle': ('pygments.styles.bw', 'bw', ()),
+    'BorlandStyle': ('pygments.styles.borland', 'borland', ()),
+    'CoffeeStyle': ('pygments.styles.coffee', 'coffee', ()),
+    'ColorfulStyle': ('pygments.styles.colorful', 'colorful', ()),
+    'DefaultStyle': ('pygments.styles.default', 'default', ()),
+    'DraculaStyle': ('pygments.styles.dracula', 'dracula', ()),
+    'EmacsStyle': ('pygments.styles.emacs', 'emacs', ()),
+    'FriendlyGrayscaleStyle': ('pygments.styles.friendly_grayscale', 'friendly_grayscale', ()),
+    'FriendlyStyle': ('pygments.styles.friendly', 'friendly', ()),
+    'FruityStyle': ('pygments.styles.fruity', 'fruity', ()),
+    'GhDarkStyle': ('pygments.styles.gh_dark', 'github-dark', ()),
+    'GruvboxDarkStyle': ('pygments.styles.gruvbox', 'gruvbox-dark', ()),
+    'GruvboxLightStyle': ('pygments.styles.gruvbox', 'gruvbox-light', ()),
+    'IgorStyle': ('pygments.styles.igor', 'igor', ()),
+    'InkPotStyle': ('pygments.styles.inkpot', 'inkpot', ()),
+    'LightbulbStyle': ('pygments.styles.lightbulb', 'lightbulb', ()),
+    'LilyPondStyle': ('pygments.styles.lilypond', 'lilypond', ()),
+    'LovelaceStyle': ('pygments.styles.lovelace', 'lovelace', ()),
+    'ManniStyle': ('pygments.styles.manni', 'manni', ()),
+    'MaterialStyle': ('pygments.styles.material', 'material', ()),
+    'MonokaiStyle': ('pygments.styles.monokai', 'monokai', ()),
+    'MurphyStyle': ('pygments.styles.murphy', 'murphy', ()),
+    'NativeStyle': ('pygments.styles.native', 'native', ()),
+    'NordDarkerStyle': ('pygments.styles.nord', 'nord-darker', ()),
+    'NordStyle': ('pygments.styles.nord', 'nord', ()),
+    'OneDarkStyle': ('pygments.styles.onedark', 'one-dark', ()),
+    'ParaisoDarkStyle': ('pygments.styles.paraiso_dark', 'paraiso-dark', ()),
+    'ParaisoLightStyle': ('pygments.styles.paraiso_light', 'paraiso-light', ()),
+    'PastieStyle': ('pygments.styles.pastie', 'pastie', ()),
+    'PerldocStyle': ('pygments.styles.perldoc', 'perldoc', ()),
+    'RainbowDashStyle': ('pygments.styles.rainbow_dash', 'rainbow_dash', ()),
+    'RrtStyle': ('pygments.styles.rrt', 'rrt', ()),
+    'SasStyle': ('pygments.styles.sas', 'sas', ()),
+    'SolarizedDarkStyle': ('pygments.styles.solarized', 'solarized-dark', ()),
+    'SolarizedLightStyle': ('pygments.styles.solarized', 'solarized-light', ()),
+    'StarofficeStyle': ('pygments.styles.staroffice', 'staroffice', ()),
+    'StataDarkStyle': ('pygments.styles.stata_dark', 'stata-dark', ()),
+    'StataLightStyle': ('pygments.styles.stata_light', 'stata-light', ()),
+    'TangoStyle': ('pygments.styles.tango', 'tango', ()),
+    'TracStyle': ('pygments.styles.trac', 'trac', ()),
+    'VimStyle': ('pygments.styles.vim', 'vim', ()),
+    'VisualStudioStyle': ('pygments.styles.vs', 'vs', ()),
+    'XcodeStyle': ('pygments.styles.xcode', 'xcode', ()),
+    'ZenburnStyle': ('pygments.styles.zenburn', 'zenburn', ()),
+}
diff --git a/.venv/Lib/site-packages/pygments/styles/abap.py b/.venv/Lib/site-packages/pygments/styles/abap.py
new file mode 100644 (file)
index 0000000..584a4e6
--- /dev/null
@@ -0,0 +1,32 @@
+"""
+    pygments.styles.abap
+    ~~~~~~~~~~~~~~~~~~~~
+
+    ABAP workbench like style.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator
+
+
+__all__ = ['AbapStyle']
+
+
+class AbapStyle(Style):
+    name = 'abap'
+
+    styles = {
+        Comment:                'italic #888',
+        Comment.Special:        '#888',
+        Keyword:                '#00f',
+        Operator.Word:          '#00f',
+        Name:                   '#000',
+        Number:                 '#3af',
+        String:                 '#5a2',
+
+        Error:                  '#F00',
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/algol.py b/.venv/Lib/site-packages/pygments/styles/algol.py
new file mode 100644 (file)
index 0000000..86cafce
--- /dev/null
@@ -0,0 +1,65 @@
+"""
+    pygments.styles.algol
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Algol publication style.
+
+    This style renders source code for publication of algorithms in
+    scientific papers and academic texts, where its format is frequently used.
+
+    It is based on the style of the revised Algol-60 language report[1].
+
+    o  No colours, only black, white and shades of grey are used.
+    o  Keywords are rendered in lowercase underline boldface.
+    o  Builtins are rendered in lowercase boldface italic.
+    o  Docstrings and pragmas are rendered in dark grey boldface.
+    o  Library identifiers are rendered in dark grey boldface italic.
+    o  Comments are rendered in grey italic.
+
+    To render keywords without underlining, refer to the `Algol_Nu` style.
+
+    For lowercase conversion of keywords and builtins in languages where
+    these are not or might not be lowercase, a supporting lexer is required.
+    The Algol and Modula-2 lexers automatically convert to lowercase whenever
+    this style is selected.
+
+    [1] `Revised Report on the Algorithmic Language Algol-60 <http://www.masswerk.at/algol60/report.htm>`
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Operator
+
+
+__all__ = ['AlgolStyle']
+
+
+class AlgolStyle(Style):
+    name = 'algol'
+
+    background_color = "#ffffff"
+
+    styles = {
+        Comment:                   "italic #888",
+        Comment.Preproc:           "bold noitalic #888",
+        Comment.Special:           "bold noitalic #888",
+
+        Keyword:                   "underline bold",
+        Keyword.Declaration:       "italic",
+
+        Name.Builtin:              "bold italic",
+        Name.Builtin.Pseudo:       "bold italic",
+        Name.Namespace:            "bold italic #666",
+        Name.Class:                "bold italic #666",
+        Name.Function:             "bold italic #666",
+        Name.Variable:             "bold italic #666",
+        Name.Constant:             "bold italic #666",
+
+        Operator.Word:             "bold",
+
+        String:                    "italic #666",
+
+        Error:                     "border:#FF0000"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/algol_nu.py b/.venv/Lib/site-packages/pygments/styles/algol_nu.py
new file mode 100644 (file)
index 0000000..d28da8f
--- /dev/null
@@ -0,0 +1,65 @@
+"""
+    pygments.styles.algol_nu
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Algol publication style without underlining of keywords.
+
+    This style renders source code for publication of algorithms in
+    scientific papers and academic texts, where its format is frequently used.
+
+    It is based on the style of the revised Algol-60 language report[1].
+
+    o  No colours, only black, white and shades of grey are used.
+    o  Keywords are rendered in lowercase boldface.
+    o  Builtins are rendered in lowercase boldface italic.
+    o  Docstrings and pragmas are rendered in dark grey boldface.
+    o  Library identifiers are rendered in dark grey boldface italic.
+    o  Comments are rendered in grey italic.
+
+    To render keywords with underlining, refer to the `Algol` style.
+
+    For lowercase conversion of keywords and builtins in languages where
+    these are not or might not be lowercase, a supporting lexer is required.
+    The Algol and Modula-2 lexers automatically convert to lowercase whenever
+    this style is selected.
+
+    [1] `Revised Report on the Algorithmic Language Algol-60 <http://www.masswerk.at/algol60/report.htm>`
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Operator
+
+
+__all__ = ['Algol_NuStyle']
+
+
+class Algol_NuStyle(Style):
+    name = 'algol_nu'
+
+    background_color = "#ffffff"
+
+    styles = {
+        Comment:                   "italic #888",
+        Comment.Preproc:           "bold noitalic #888",
+        Comment.Special:           "bold noitalic #888",
+
+        Keyword:                   "bold",
+        Keyword.Declaration:       "italic",
+
+        Name.Builtin:              "bold italic",
+        Name.Builtin.Pseudo:       "bold italic",
+        Name.Namespace:            "bold italic #666",
+        Name.Class:                "bold italic #666",
+        Name.Function:             "bold italic #666",
+        Name.Variable:             "bold italic #666",
+        Name.Constant:             "bold italic #666",
+
+        Operator.Word:             "bold",
+
+        String:                    "italic #666",
+
+        Error:                     "border:#FF0000"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/arduino.py b/.venv/Lib/site-packages/pygments/styles/arduino.py
new file mode 100644 (file)
index 0000000..dcb3252
--- /dev/null
@@ -0,0 +1,100 @@
+"""
+    pygments.styles.arduino
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Arduino® Syntax highlighting style.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator, Generic, Whitespace
+
+
+__all__ = ['ArduinoStyle']
+
+
+class ArduinoStyle(Style):
+    """
+    The Arduino® language style. This style is designed to highlight the
+    Arduino source code, so expect the best results with it.
+    """
+    name = 'arduino'
+
+    background_color = "#ffffff"
+
+    styles = {
+        Whitespace:                "",         # class: 'w'
+        Error:                     "#a61717",  # class: 'err'
+
+        Comment:                   "#95a5a6",  # class: 'c'
+        Comment.Multiline:         "",         # class: 'cm'
+        Comment.Preproc:           "#728E00",  # class: 'cp'
+        Comment.Single:            "",         # class: 'c1'
+        Comment.Special:           "",         # class: 'cs'
+
+        Keyword:                   "#728E00",  # class: 'k'
+        Keyword.Constant:          "#00979D",  # class: 'kc'
+        Keyword.Declaration:       "",         # class: 'kd'
+        Keyword.Namespace:         "",         # class: 'kn'
+        Keyword.Pseudo:            "#00979D",  # class: 'kp'
+        Keyword.Reserved:          "#00979D",  # class: 'kr'
+        Keyword.Type:              "#00979D",  # class: 'kt'
+
+        Operator:                  "#728E00",  # class: 'o'
+        Operator.Word:             "",         # class: 'ow'
+
+        Name:                      "#434f54",  # class: 'n'
+        Name.Attribute:            "",         # class: 'na'
+        Name.Builtin:              "#728E00",  # class: 'nb'
+        Name.Builtin.Pseudo:       "",         # class: 'bp'
+        Name.Class:                "",         # class: 'nc'
+        Name.Constant:             "",         # class: 'no'
+        Name.Decorator:            "",         # class: 'nd'
+        Name.Entity:               "",         # class: 'ni'
+        Name.Exception:            "",         # class: 'ne'
+        Name.Function:             "#D35400",  # class: 'nf'
+        Name.Property:             "",         # class: 'py'
+        Name.Label:                "",         # class: 'nl'
+        Name.Namespace:            "",         # class: 'nn'
+        Name.Other:                "#728E00",  # class: 'nx'
+        Name.Tag:                  "",         # class: 'nt'
+        Name.Variable:             "",         # class: 'nv'
+        Name.Variable.Class:       "",         # class: 'vc'
+        Name.Variable.Global:      "",         # class: 'vg'
+        Name.Variable.Instance:    "",         # class: 'vi'
+
+        Number:                    "#8A7B52",  # class: 'm'
+        Number.Float:              "",         # class: 'mf'
+        Number.Hex:                "",         # class: 'mh'
+        Number.Integer:            "",         # class: 'mi'
+        Number.Integer.Long:       "",         # class: 'il'
+        Number.Oct:                "",         # class: 'mo'
+
+        String:                    "#7F8C8D",  # class: 's'
+        String.Backtick:           "",         # class: 'sb'
+        String.Char:               "",         # class: 'sc'
+        String.Doc:                "",         # class: 'sd'
+        String.Double:             "",         # class: 's2'
+        String.Escape:             "",         # class: 'se'
+        String.Heredoc:            "",         # class: 'sh'
+        String.Interpol:           "",         # class: 'si'
+        String.Other:              "",         # class: 'sx'
+        String.Regex:              "",         # class: 'sr'
+        String.Single:             "",         # class: 's1'
+        String.Symbol:             "",         # class: 'ss'
+
+        Generic:                   "",         # class: 'g'
+        Generic.Deleted:           "",         # class: 'gd',
+        Generic.Emph:              "",         # class: 'ge'
+        Generic.Error:             "",         # class: 'gr'
+        Generic.Heading:           "",         # class: 'gh'
+        Generic.Inserted:          "",         # class: 'gi'
+        Generic.Output:            "",         # class: 'go'
+        Generic.Prompt:            "",         # class: 'gp'
+        Generic.Strong:            "",         # class: 'gs'
+        Generic.Subheading:        "",         # class: 'gu'
+        Generic.Traceback:         "",         # class: 'gt'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/autumn.py b/.venv/Lib/site-packages/pygments/styles/autumn.py
new file mode 100644 (file)
index 0000000..8229ad1
--- /dev/null
@@ -0,0 +1,67 @@
+"""
+    pygments.styles.autumn
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    A colorful style, inspired by the terminal highlighting style.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['AutumnStyle']
+
+
+class AutumnStyle(Style):
+    """
+    A colorful style, inspired by the terminal highlighting style.
+    """
+    name = 'autumn'
+
+    styles = {
+        Whitespace:                 '#bbbbbb',
+
+        Comment:                    'italic #aaaaaa',
+        Comment.Preproc:            'noitalic #4c8317',
+        Comment.Special:            'italic #0000aa',
+
+        Keyword:                    '#0000aa',
+        Keyword.Type:               '#00aaaa',
+
+        Operator.Word:              '#0000aa',
+
+        Name.Builtin:               '#00aaaa',
+        Name.Function:              '#00aa00',
+        Name.Class:                 'underline #00aa00',
+        Name.Namespace:             'underline #00aaaa',
+        Name.Variable:              '#aa0000',
+        Name.Constant:              '#aa0000',
+        Name.Entity:                'bold #800',
+        Name.Attribute:             '#1e90ff',
+        Name.Tag:                   'bold #1e90ff',
+        Name.Decorator:             '#888888',
+
+        String:                     '#aa5500',
+        String.Symbol:              '#0000aa',
+        String.Regex:               '#009999',
+
+        Number:                     '#009999',
+
+        Generic.Heading:            'bold #000080',
+        Generic.Subheading:         'bold #800080',
+        Generic.Deleted:            '#aa0000',
+        Generic.Inserted:           '#00aa00',
+        Generic.Error:              '#aa0000',
+        Generic.Emph:               'italic',
+        Generic.Strong:             'bold',
+        Generic.EmphStrong:         'bold italic',
+        Generic.Prompt:             '#555555',
+        Generic.Output:             '#888888',
+        Generic.Traceback:          '#aa0000',
+
+        Error:                      '#F00 bg:#FAA'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/borland.py b/.venv/Lib/site-packages/pygments/styles/borland.py
new file mode 100644 (file)
index 0000000..bfceaea
--- /dev/null
@@ -0,0 +1,53 @@
+"""
+    pygments.styles.borland
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Style similar to the style used in the Borland IDEs.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['BorlandStyle']
+
+
+class BorlandStyle(Style):
+    """
+    Style similar to the style used in the borland IDEs.
+    """
+    name = 'borland'
+
+    styles = {
+        Whitespace:             '#bbbbbb',
+
+        Comment:                'italic #008800',
+        Comment.Preproc:        'noitalic #008080',
+        Comment.Special:        'noitalic bold',
+
+        String:                 '#0000FF',
+        String.Char:            '#800080',
+        Number:                 '#0000FF',
+        Keyword:                'bold #000080',
+        Operator.Word:          'bold',
+        Name.Tag:               'bold #000080',
+        Name.Attribute:         '#FF0000',
+
+        Generic.Heading:        '#999999',
+        Generic.Subheading:     '#aaaaaa',
+        Generic.Deleted:        'bg:#ffdddd #000000',
+        Generic.Inserted:       'bg:#ddffdd #000000',
+        Generic.Error:          '#aa0000',
+        Generic.Emph:           'italic',
+        Generic.Strong:         'bold',
+        Generic.EmphStrong:     'bold italic',
+        Generic.Prompt:         '#555555',
+        Generic.Output:         '#888888',
+        Generic.Traceback:      '#aa0000',
+
+        Error:                  'bg:#e3d2d2 #a61717'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/bw.py b/.venv/Lib/site-packages/pygments/styles/bw.py
new file mode 100644 (file)
index 0000000..30cd787
--- /dev/null
@@ -0,0 +1,52 @@
+"""
+    pygments.styles.bw
+    ~~~~~~~~~~~~~~~~~~
+
+    Simple black/white only style.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Operator, Generic
+
+
+__all__ = ['BlackWhiteStyle']
+
+
+class BlackWhiteStyle(Style):
+    name = 'bw'
+
+    background_color = "#ffffff"
+
+    styles = {
+        Comment:                   "italic",
+        Comment.Preproc:           "noitalic",
+
+        Keyword:                   "bold",
+        Keyword.Pseudo:            "nobold",
+        Keyword.Type:              "nobold",
+
+        Operator.Word:             "bold",
+
+        Name.Class:                "bold",
+        Name.Namespace:            "bold",
+        Name.Exception:            "bold",
+        Name.Entity:               "bold",
+        Name.Tag:                  "bold",
+
+        String:                    "italic",
+        String.Interpol:           "bold",
+        String.Escape:             "bold",
+
+        Generic.Heading:           "bold",
+        Generic.Subheading:        "bold",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.EmphStrong:        "bold italic",
+        Generic.Prompt:            "bold",
+
+        Error:                     "border:#FF0000"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/coffee.py b/.venv/Lib/site-packages/pygments/styles/coffee.py
new file mode 100644 (file)
index 0000000..66f504d
--- /dev/null
@@ -0,0 +1,80 @@
+"""
+    pygments.styles.coffee
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    A warm and cozy theme based off gruvbox
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import (Comment, Error, Generic, Keyword, Literal, Name,
+                            Number, Operator, Punctuation, String, Token)
+
+__all__ = ["CoffeeStyle"]
+
+
+class CoffeeStyle(Style):
+    """
+    A warm and cozy theme based off gruvbox
+    """
+
+    name = "coffee"
+
+    background_color = "#262220"
+    highlight_color = "#ddd0c0"
+
+    line_number_color = "#4e4e4e"
+    line_number_special_color = "#8f9494"
+
+    styles = {
+        Comment: "#70757A",
+        Comment.Hashbang: "#8f9f9f",
+        Comment.Preproc: "#fdd0c0",
+        Comment.PreprocFile: "#c9b98f",
+        Comment.Special: "#af5f5f",
+        Error: "#af5f5f",
+        Generic.Deleted: "#bb6868",
+        Generic.Emph: "italic",
+        Generic.Error: "#af5f5f",
+        Generic.Inserted: "#849155",
+        Generic.Output: "#ddd0c0",
+        Generic.Strong: "bold",
+        Generic.Traceback: "#af5f5f",
+        Keyword: "#919191",
+        Keyword.Constant: "#875f5f",
+        Keyword.Declaration: "#875f5f",
+        Keyword.Namespace: "#875f5f",
+        Keyword.Reserved: "#b46276",
+        Keyword.Type: "#af875f",
+        Literal: "#af875f",
+        Name: "#ddd0c0",
+        Name.Attribute: "#ddd0c0",
+        Name.Builtin: "#ddd0c0",
+        Name.Builtin.Pseudo: "#87afaf",
+        Name.Class: "#875f5f",
+        Name.Constant: "#af8787",
+        Name.Decorator: "#fdd0c0",
+        Name.Entity: "#ddd0c0",
+        Name.Exception: "#877575",
+        Name.Function: "#fdd0c0",
+        Name.Function.Magic: "#fdd0c0",
+        Name.Other: "#ddd0c0",
+        Name.Property: "#dfaf87",
+        Name.Tag: "#87afaf",
+        Name.Variable: "#ddd0c0",
+        Number: "#87afaf",
+        Operator: "#878787",
+        Operator.Word: "#878787",
+        Punctuation: "#ddd0c0",
+        String: "#c9b98f",
+        String.Affix: "#dfaf87",
+        String.Doc: "#878787",
+        String.Escape: "#af5f5f",
+        String.Interpol: "#af5f5f",
+        String.Other: "#fdd0c0",
+        String.Regex: "#af5f5f",
+        String.Symbol: "#af5f5f",
+        Token: "#ddd0c0",
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/colorful.py b/.venv/Lib/site-packages/pygments/styles/colorful.py
new file mode 100644 (file)
index 0000000..012d943
--- /dev/null
@@ -0,0 +1,83 @@
+"""
+    pygments.styles.colorful
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    A colorful style, inspired by CodeRay.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['ColorfulStyle']
+
+
+class ColorfulStyle(Style):
+    """
+    A colorful style, inspired by CodeRay.
+    """
+    name = 'colorful'
+
+    styles = {
+        Whitespace:                "#bbbbbb",
+
+        Comment:                   "#888",
+        Comment.Preproc:           "#579",
+        Comment.Special:           "bold #cc0000",
+
+        Keyword:                   "bold #080",
+        Keyword.Pseudo:            "#038",
+        Keyword.Type:              "#339",
+
+        Operator:                  "#333",
+        Operator.Word:             "bold #000",
+
+        Name.Builtin:              "#007020",
+        Name.Function:             "bold #06B",
+        Name.Class:                "bold #B06",
+        Name.Namespace:            "bold #0e84b5",
+        Name.Exception:            "bold #F00",
+        Name.Variable:             "#963",
+        Name.Variable.Instance:    "#33B",
+        Name.Variable.Class:       "#369",
+        Name.Variable.Global:      "bold #d70",
+        Name.Constant:             "bold #036",
+        Name.Label:                "bold #970",
+        Name.Entity:               "bold #800",
+        Name.Attribute:            "#00C",
+        Name.Tag:                  "#070",
+        Name.Decorator:            "bold #555",
+
+        String:                    "bg:#fff0f0",
+        String.Char:               "#04D bg:",
+        String.Doc:                "#D42 bg:",
+        String.Interpol:           "bg:#eee",
+        String.Escape:             "bold #666",
+        String.Regex:              "bg:#fff0ff #000",
+        String.Symbol:             "#A60 bg:",
+        String.Other:              "#D20",
+
+        Number:                    "bold #60E",
+        Number.Integer:            "bold #00D",
+        Number.Float:              "bold #60E",
+        Number.Hex:                "bold #058",
+        Number.Oct:                "bold #40E",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#00A000",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.EmphStrong:        "bold italic",
+        Generic.Prompt:            "bold #c65d09",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "#F00 bg:#FAA"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/default.py b/.venv/Lib/site-packages/pygments/styles/default.py
new file mode 100644 (file)
index 0000000..30f882e
--- /dev/null
@@ -0,0 +1,76 @@
+"""
+    pygments.styles.default
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    The default highlighting style.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['DefaultStyle']
+
+
+class DefaultStyle(Style):
+    """
+    The default style (inspired by Emacs 22).
+    """
+    name = 'default'
+
+    background_color = "#f8f8f8"
+
+    styles = {
+        Whitespace:                "#bbbbbb",
+        Comment:                   "italic #3D7B7B",
+        Comment.Preproc:           "noitalic #9C6500",
+
+        #Keyword:                   "bold #AA22FF",
+        Keyword:                   "bold #008000",
+        Keyword.Pseudo:            "nobold",
+        Keyword.Type:              "nobold #B00040",
+
+        Operator:                  "#666666",
+        Operator.Word:             "bold #AA22FF",
+
+        Name.Builtin:              "#008000",
+        Name.Function:             "#0000FF",
+        Name.Class:                "bold #0000FF",
+        Name.Namespace:            "bold #0000FF",
+        Name.Exception:            "bold #CB3F38",
+        Name.Variable:             "#19177C",
+        Name.Constant:             "#880000",
+        Name.Label:                "#767600",
+        Name.Entity:               "bold #717171",
+        Name.Attribute:            "#687822",
+        Name.Tag:                  "bold #008000",
+        Name.Decorator:            "#AA22FF",
+
+        String:                    "#BA2121",
+        String.Doc:                "italic",
+        String.Interpol:           "bold #A45A77",
+        String.Escape:             "bold #AA5D1F",
+        String.Regex:              "#A45A77",
+        #String.Symbol:             "#B8860B",
+        String.Symbol:             "#19177C",
+        String.Other:              "#008000",
+        Number:                    "#666666",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#008400",
+        Generic.Error:             "#E40000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.EmphStrong:        "bold italic",
+        Generic.Prompt:            "bold #000080",
+        Generic.Output:            "#717171",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "border:#FF0000"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/dracula.py b/.venv/Lib/site-packages/pygments/styles/dracula.py
new file mode 100644 (file)
index 0000000..805e663
--- /dev/null
@@ -0,0 +1,90 @@
+"""
+    pygments.styles.dracula
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Pygments version of `Dracula` from https://github.com/dracula/dracula-theme.
+
+    Based on the Dracula Theme for pygments by Chris Bracco.
+    See https://github.com/dracula/pygments/tree/fee9ed5613d1086bc01b9d0a5a0e9867a009f571
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Literal, \
+    Number, Operator, Other, Punctuation, Text, Generic, Whitespace
+
+
+__all__ = ['DraculaStyle']
+
+background = "#282a36"
+foreground = "#f8f8f2"
+selection = "#44475a"
+comment = "#6272a4"
+cyan = "#8be9fd"
+green = "#50fa7b"
+orange = "#ffb86c"
+pink = "#ff79c6"
+purple = "#bd93f9"
+red = "#ff5555"
+yellow = "#f1fa8c"
+
+deletion = "#8b080b"
+
+class DraculaStyle(Style):
+    name = 'dracula'
+
+    background_color = background
+    highlight_color = selection
+    line_number_color = yellow
+    line_number_background_color = selection
+    line_number_special_color = green
+    line_number_special_background_color = comment
+
+    styles = {
+        Whitespace: foreground,
+
+        Comment: comment,
+        Comment.Preproc: pink,
+
+        Generic: foreground,
+        Generic.Deleted: deletion,
+        Generic.Emph: "underline",
+        Generic.Heading: "bold",
+        Generic.Inserted: "bold",
+        Generic.Output: selection,
+        Generic.EmphStrong: "underline",
+        Generic.Subheading: "bold",
+
+        Error: foreground,
+
+        Keyword: pink,
+        Keyword.Constant: pink,
+        Keyword.Declaration: cyan + " italic",
+        Keyword.Type: cyan,
+
+        Literal: foreground,
+
+        Name: foreground,
+        Name.Attribute: green,
+        Name.Builtin: cyan + " italic",
+        Name.Builtin.Pseudo: foreground,
+        Name.Class: green,
+        Name.Function: green,
+        Name.Label: cyan + " italic",
+        Name.Tag: pink,
+        Name.Variable: cyan + " italic",
+
+        Number: orange,
+
+        Operator: pink,
+
+        Other: foreground,
+
+        Punctuation: foreground,
+
+        String: purple,
+
+        Text: foreground,
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/emacs.py b/.venv/Lib/site-packages/pygments/styles/emacs.py
new file mode 100644 (file)
index 0000000..7294863
--- /dev/null
@@ -0,0 +1,75 @@
+"""
+    pygments.styles.emacs
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    A highlighting style for Pygments, inspired by Emacs.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['EmacsStyle']
+
+
+class EmacsStyle(Style):
+    """
+    The default style (inspired by Emacs 22).
+    """
+    name = 'emacs'
+
+    background_color = "#f8f8f8"
+
+    styles = {
+        Whitespace:                "#bbbbbb",
+        Comment:                   "italic #008800",
+        Comment.Preproc:           "noitalic",
+        Comment.Special:           "noitalic bold",
+
+        Keyword:                   "bold #AA22FF",
+        Keyword.Pseudo:            "nobold",
+        Keyword.Type:              "bold #00BB00",
+
+        Operator:                  "#666666",
+        Operator.Word:             "bold #AA22FF",
+
+        Name.Builtin:              "#AA22FF",
+        Name.Function:             "#00A000",
+        Name.Class:                "#0000FF",
+        Name.Namespace:            "bold #0000FF",
+        Name.Exception:            "bold #D2413A",
+        Name.Variable:             "#B8860B",
+        Name.Constant:             "#880000",
+        Name.Label:                "#A0A000",
+        Name.Entity:               "bold #999999",
+        Name.Attribute:            "#BB4444",
+        Name.Tag:                  "bold #008000",
+        Name.Decorator:            "#AA22FF",
+
+        String:                    "#BB4444",
+        String.Doc:                "italic",
+        String.Interpol:           "bold #BB6688",
+        String.Escape:             "bold #BB6622",
+        String.Regex:              "#BB6688",
+        String.Symbol:             "#B8860B",
+        String.Other:              "#008000",
+        Number:                    "#666666",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#00A000",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.EmphStrong:        "bold italic",
+        Generic.Prompt:            "bold #000080",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "border:#FF0000"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/friendly.py b/.venv/Lib/site-packages/pygments/styles/friendly.py
new file mode 100644 (file)
index 0000000..e1950f0
--- /dev/null
@@ -0,0 +1,76 @@
+"""
+    pygments.styles.friendly
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    A modern style based on the VIM pyte theme.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['FriendlyStyle']
+
+
+class FriendlyStyle(Style):
+    """
+    A modern style based on the VIM pyte theme.
+    """
+    name = 'friendly'
+
+    background_color = "#f0f0f0"
+    line_number_color = "#666666"
+
+    styles = {
+        Whitespace:                "#bbbbbb",
+        Comment:                   "italic #60a0b0",
+        Comment.Preproc:           "noitalic #007020",
+        Comment.Special:           "noitalic bg:#fff0f0",
+
+        Keyword:                   "bold #007020",
+        Keyword.Pseudo:            "nobold",
+        Keyword.Type:              "nobold #902000",
+
+        Operator:                  "#666666",
+        Operator.Word:             "bold #007020",
+
+        Name.Builtin:              "#007020",
+        Name.Function:             "#06287e",
+        Name.Class:                "bold #0e84b5",
+        Name.Namespace:            "bold #0e84b5",
+        Name.Exception:            "#007020",
+        Name.Variable:             "#bb60d5",
+        Name.Constant:             "#60add5",
+        Name.Label:                "bold #002070",
+        Name.Entity:               "bold #d55537",
+        Name.Attribute:            "#4070a0",
+        Name.Tag:                  "bold #062873",
+        Name.Decorator:            "bold #555555",
+
+        String:                    "#4070a0",
+        String.Doc:                "italic",
+        String.Interpol:           "italic #70a0d0",
+        String.Escape:             "bold #4070a0",
+        String.Regex:              "#235388",
+        String.Symbol:             "#517918",
+        String.Other:              "#c65d09",
+        Number:                    "#40a070",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#00A000",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.EmphStrong:        "bold italic",
+        Generic.Prompt:            "bold #c65d09",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "border:#FF0000"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/friendly_grayscale.py b/.venv/Lib/site-packages/pygments/styles/friendly_grayscale.py
new file mode 100644 (file)
index 0000000..23dfaa5
--- /dev/null
@@ -0,0 +1,80 @@
+"""
+    pygments.styles.friendly_grayscale
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    A style based on friendly style.
+    The color values of the friendly style have been converted to grayscale
+    using the luminosity value calculated by
+    http://www.workwithcolor.com/color-converter-01.htm
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['FriendlyGrayscaleStyle']
+
+
+class FriendlyGrayscaleStyle(Style):
+    """
+    A modern grayscale style based on the friendly style.
+
+    .. versionadded:: 2.11
+    """
+    name = 'friendly_grayscale'
+
+    background_color = "#f0f0f0"
+
+    styles = {
+        Whitespace:                "#bbbbbb",
+        Comment:                   "italic #959595",
+        Comment.Preproc:           "noitalic #575757",
+        Comment.Special:           "noitalic bg:#F4F4F4",
+
+        Keyword:                   "bold #575757",
+        Keyword.Pseudo:            "nobold",
+        Keyword.Type:              "nobold #4F4F4F",
+
+        Operator:                  "#666666",
+        Operator.Word:             "bold #575757",
+
+        Name.Builtin:              "#575757",
+        Name.Function:             "#3F3F3F",
+        Name.Class:                "bold #7E7E7E",
+        Name.Namespace:            "bold #7E7E7E",
+        Name.Exception:            "#575757",
+        Name.Variable:             "#9A9A9A",
+        Name.Constant:             "#A5A5A5",
+        Name.Label:                "bold #363636",
+        Name.Entity:               "bold #848484",
+        Name.Attribute:            "#707070",
+        Name.Tag:                  "bold #3B3B3B",
+        Name.Decorator:            "bold #555555",
+
+        String:                    "#717171",
+        String.Doc:                "italic",
+        String.Interpol:           "italic #9F9F9F",
+        String.Escape:             "bold #717171",
+        String.Regex:              "#575757",
+        String.Symbol:             "#676767",
+        String.Other:              "#7E7E7E",
+        Number:                    "#888888",
+
+        Generic.Heading:           "bold #373737",
+        Generic.Subheading:        "bold #5A5A5A",
+        Generic.Deleted:           "#545454",
+        Generic.Inserted:          "#7D7D7D",
+        Generic.Error:             "#898989",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.EmphStrong:        "bold italic",
+        Generic.Prompt:            "bold #7E7E7E",
+        Generic.Output:            "#888888",
+        Generic.Traceback:         "#6D6D6D",
+
+        Error:                     "border:#898989"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/fruity.py b/.venv/Lib/site-packages/pygments/styles/fruity.py
new file mode 100644 (file)
index 0000000..64c8f96
--- /dev/null
@@ -0,0 +1,47 @@
+"""
+    pygments.styles.fruity
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    pygments version of my "fruity" vim theme.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Token, Comment, Name, Keyword, \
+    Generic, Number, String, Whitespace
+
+
+__all__ = ['FruityStyle']
+
+
+class FruityStyle(Style):
+    """
+    Pygments version of the "native" vim theme.
+    """
+
+    name = 'fruity'
+
+    background_color = '#111111'
+    highlight_color = '#333333'
+
+    styles = {
+        Whitespace:         '#888888',
+        Token:              '#ffffff',
+        Generic.Output:     '#444444 bg:#222222',
+        Keyword:            '#fb660a bold',
+        Keyword.Pseudo:     'nobold',
+        Number:             '#0086f7 bold',
+        Name.Tag:           '#fb660a bold',
+        Name.Variable:      '#fb660a',
+        Comment:            '#008800 bg:#0f140f italic',
+        Name.Attribute:     '#ff0086 bold',
+        String:             '#0086d2',
+        Name.Function:      '#ff0086 bold',
+        Generic.Heading:    '#ffffff bold',
+        Keyword.Type:       '#cdcaa9 bold',
+        Generic.Subheading: '#ffffff bold',
+        Name.Constant:      '#0086d2',
+        Comment.Preproc:    '#ff0007 bold'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/gh_dark.py b/.venv/Lib/site-packages/pygments/styles/gh_dark.py
new file mode 100644 (file)
index 0000000..3bfd300
--- /dev/null
@@ -0,0 +1,113 @@
+"""
+    pygments.styles.gh_dark
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Github's Dark-Colorscheme based theme for Pygments
+    Colors extracted from https://github.com/primer/primitives
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, Error, Number, Operator, \
+    Generic, Text, Literal, String, Token
+
+
+__all__ = ['GhDarkStyle']
+
+
+# vars are defined to match the defs in
+# - [GitHub's VS Code theme](https://github.com/primer/github-vscode-theme) and
+# - [Primer styles](https://github.com/primer/primitives)
+RED_2 = "#ffa198"
+RED_3 = "#ff7b72"
+RED_9 = "#490202"
+ORANGE_2 = "#ffa657"
+ORANGE_3 = "#f0883e"
+GREEN_1 = "#7ee787"
+GREEN_2 = "#56d364"
+GREEN_7 = "#0f5323"
+BLUE_1 = "#a5d6ff"
+BLUE_2 = "#79c0ff"
+PURPLE_2 = "#d2a8ff"
+GRAY_3 = "#8b949e"
+GRAY_4 = "#6e7681"
+FG_SUBTLE = "#6e7681"
+FG_DEFAULT = "#e6edf3"
+BG_DEFAULT = "#0d1117"
+DANGER_FG = "#f85149"
+
+
+class GhDarkStyle(Style):
+    """
+    Github's Dark-Colorscheme based theme for Pygments
+    """
+    
+    name = 'github-dark'
+
+    background_color = BG_DEFAULT
+
+    # has transparency in VS Code theme as `colors.codemirror.activelineBg`
+    highlight_color = GRAY_4
+
+    line_number_special_color = FG_DEFAULT
+    line_number_special_background_color = FG_SUBTLE
+
+    line_number_color = GRAY_4
+    line_number_background_color = BG_DEFAULT
+
+    styles = {
+        Token:                      FG_DEFAULT,
+
+        Error:                      DANGER_FG,
+
+        Keyword:                    RED_3,
+        Keyword.Constant:           BLUE_2,
+        Keyword.Pseudo:             BLUE_2,
+
+        Name:                       FG_DEFAULT,
+        Name.Class:                 "bold "+ORANGE_3,
+        Name.Constant:              "bold "+BLUE_2,
+        Name.Decorator:             'bold '+PURPLE_2,
+        Name.Entity:                ORANGE_2,
+        Name.Exception:             "bold "+ORANGE_3,
+        Name.Function:              'bold '+PURPLE_2,
+        Name.Label:                 "bold "+BLUE_2,
+        Name.Namespace:             RED_3,
+        Name.Property:              BLUE_2,
+        Name.Tag:                   GREEN_1,
+        Name.Variable:              BLUE_2,
+
+        Literal:                    BLUE_1,
+        Literal.Date:               BLUE_2,
+        String:                     BLUE_1,
+        String.Affix:               BLUE_2,
+        String.Delimiter:           BLUE_2,
+        String.Escape:              BLUE_2,
+        String.Heredoc:             BLUE_2,
+        String.Regex:               BLUE_2,
+        Number:                     BLUE_1,
+
+        Comment:                    'italic '+GRAY_3,
+        Comment.Preproc:            "bold " + GRAY_3,
+        Comment.Special:            "bold italic " + GRAY_3,
+
+        Operator:                   'bold ' + RED_3,
+
+        Generic:                    FG_DEFAULT,
+        Generic.Deleted:            f"bg:{RED_9} {RED_2}",
+        Generic.Emph:               "italic",
+        Generic.Error:              RED_2,
+        Generic.Heading:            "bold "+BLUE_2,
+        Generic.Inserted:           f'bg:{GREEN_7} {GREEN_2}',
+        Generic.Output:             GRAY_3,
+        Generic.Prompt:             GRAY_3,
+        Generic.Strong:             "bold",
+        Generic.EmphStrong:         "bold italic",
+        Generic.Subheading:         BLUE_2,
+        Generic.Traceback:          RED_3,
+        Generic.Underline:          "underline",
+
+        Text.Whitespace:            FG_SUBTLE,
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/gruvbox.py b/.venv/Lib/site-packages/pygments/styles/gruvbox.py
new file mode 100644 (file)
index 0000000..2356391
--- /dev/null
@@ -0,0 +1,118 @@
+"""
+    pygments.styles.gruvbox
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    pygments version of the "gruvbox" vim theme.
+    https://github.com/morhetz/gruvbox
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Token, Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic
+
+
+__all__ = ['GruvboxDarkStyle', 'GruvboxLightStyle']
+
+
+class GruvboxDarkStyle(Style):
+    """
+    Pygments version of the "gruvbox" dark vim theme.
+    """
+    
+    name = 'gruvbox-dark'
+
+    background_color = '#282828'
+    highlight_color = '#ebdbb2'
+
+    styles = {
+        Token:              '#dddddd',
+
+        Comment:            'italic #928374',
+        Comment.PreProc:    '#8ec07c',
+        Comment.Special:    'bold italic #ebdbb2',
+
+        Keyword:            '#fb4934',
+        Operator.Word:      '#fb4934',
+
+        String:             '#b8bb26',
+        String.Escape:      '#fe8019',
+
+        Number:             '#d3869b',
+
+        Name.Builtin:       '#fe8019',
+        Name.Variable:      '#83a598',
+        Name.Constant:      '#d3869b',
+        Name.Class:         '#8ec07c',
+        Name.Function:      '#8ec07c',
+        Name.Namespace:     '#8ec07c',
+        Name.Exception:     '#fb4934',
+        Name.Tag:           '#8ec07c',
+        Name.Attribute:     '#fabd2f',
+        Name.Decorator:     '#fb4934',
+
+        Generic.Heading:    'bold #ebdbb2',
+        Generic.Subheading: 'underline #ebdbb2',
+        Generic.Deleted:    'bg:#fb4934 #282828',
+        Generic.Inserted:   'bg:#b8bb26 #282828',
+        Generic.Error:      '#fb4934',
+        Generic.Emph:       'italic',
+        Generic.Strong:     'bold',
+        Generic.EmphStrong: 'bold italic',
+        Generic.Prompt:     '#a89984',
+        Generic.Output:     '#f2e5bc',
+        Generic.Traceback:  '#fb4934',
+
+        Error:              'bg:#fb4934 #282828'
+    }
+
+
+class GruvboxLightStyle(Style):
+    """
+    Pygments version of the "gruvbox" Light vim theme.
+    """
+
+    name = 'gruvbox-light'
+
+    background_color = '#fbf1c7'
+    highlight_color = '#3c3836'
+
+    styles = {
+        Comment:            'italic #928374',
+        Comment.PreProc:    '#427b58',
+        Comment.Special:    'bold italic #3c3836',
+
+        Keyword:            '#9d0006',
+        Operator.Word:      '#9d0006',
+
+        String:             '#79740e',
+        String.Escape:      '#af3a03',
+
+        Number:             '#8f3f71',
+
+        Name.Builtin:       '#af3a03',
+        Name.Variable:      '#076678',
+        Name.Constant:      '#8f3f71',
+        Name.Class:         '#427b58',
+        Name.Function:      '#427b58',
+        Name.Namespace:     '#427b58',
+        Name.Exception:     '#9d0006',
+        Name.Tag:           '#427b58',
+        Name.Attribute:     '#b57614',
+        Name.Decorator:     '#9d0006',
+
+        Generic.Heading:    'bold #3c3836',
+        Generic.Subheading: 'underline #3c3836',
+        Generic.Deleted:    'bg:#9d0006 #fbf1c7',
+        Generic.Inserted:   'bg:#79740e #fbf1c7',
+        Generic.Error:      '#9d0006',
+        Generic.Emph:       'italic',
+        Generic.Strong:     'bold',
+        Generic.Prompt:     '#7c6f64',
+        Generic.Output:     '#32302f',
+        Generic.Traceback:  '#9d0006',
+
+        Error:              'bg:#9d0006 #fbf1c7'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/igor.py b/.venv/Lib/site-packages/pygments/styles/igor.py
new file mode 100644 (file)
index 0000000..467b281
--- /dev/null
@@ -0,0 +1,32 @@
+"""
+    pygments.styles.igor
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Igor Pro default style.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String
+
+
+__all__ = ['IgorStyle']
+
+
+class IgorStyle(Style):
+    """
+    Pygments version of the official colors for Igor Pro procedures.
+    """
+
+    name = 'igor'
+
+    styles = {
+        Comment:                'italic #FF0000',
+        Keyword:                '#0000FF',
+        Name.Function:          '#C34E00',
+        Name.Decorator:         '#CC00A3',
+        Name.Class:             '#007575',
+        String:                 '#009C00'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/inkpot.py b/.venv/Lib/site-packages/pygments/styles/inkpot.py
new file mode 100644 (file)
index 0000000..39902c2
--- /dev/null
@@ -0,0 +1,72 @@
+"""
+    pygments.styles.inkpot
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    A highlighting style for Pygments, inspired by the Inkpot theme for VIM.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Text, Other, Keyword, Name, Comment, String, \
+    Error, Number, Operator, Generic, Whitespace, Punctuation
+
+
+__all__ = ['InkPotStyle']
+
+
+class InkPotStyle(Style):
+    name = 'inkpot'
+    
+    background_color = "#1e1e27"
+
+    styles = {
+        Text:                      "#cfbfad",
+        Other:                     "#cfbfad",
+        Whitespace:                "#434357",
+        Comment:                   "#cd8b00",
+        Comment.Preproc:           "#409090",
+        Comment.PreprocFile:       "bg:#404040 #ffcd8b",
+        Comment.Special:           "#808bed",
+
+        Keyword:                   "#808bed",
+        Keyword.Pseudo:            "nobold",
+        Keyword.Type:              "#ff8bff",
+
+        Operator:                  "#666666",
+
+        Punctuation:               "#cfbfad",
+
+        Name:                      "#cfbfad",
+        Name.Attribute:            "#cfbfad",
+        Name.Builtin.Pseudo:       '#ffff00',
+        Name.Builtin:              "#808bed",
+        Name.Class:                "#ff8bff",
+        Name.Constant:             "#409090",
+        Name.Decorator:            "#409090",
+        Name.Exception:            "#ff0000",
+        Name.Function:             "#c080d0",
+        Name.Label:                "#808bed",
+        Name.Namespace:            "#ff0000",
+        Name.Variable:             "#cfbfad",
+
+        String:                    "bg:#404040 #ffcd8b",
+        String.Doc:                "#808bed",
+
+        Number:                    "#f0ad6d",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#00A000",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.EmphStrong:        "bold italic",
+        Generic.Prompt:            "bold #000080",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "bg:#6e2e2e #ffffff"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/lightbulb.py b/.venv/Lib/site-packages/pygments/styles/lightbulb.py
new file mode 100644 (file)
index 0000000..8bcd21a
--- /dev/null
@@ -0,0 +1,110 @@
+"""
+    pygments.styles.lightbulb
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    A minimal dark theme based on the Lightbulb theme for VSCode.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import (
+    Comment,
+    Error,
+    Generic,
+    Keyword,
+    Literal,
+    Name,
+    Number,
+    Operator,
+    Punctuation,
+    String,
+    Token,
+)
+
+
+__all__ = ['LightbulbStyle']
+
+
+COLORS = {
+    "bg": "#1d2331",
+    "blue_1": "#73D0FF",
+    "gray_1": "#7e8aa1",
+    "gray_2": "#3c4354",
+    "gray_3": "#6e7681",
+    "red_1": "#f88f7f",
+    "red_2": "#3d1e20",
+    "orange_1": "#FFAD66",
+    "orange_2": "#F29E74",
+    "yellow_1": "#FFD173",
+    "white": "#d4d2c8",
+    "magenta_1": "#DFBFFF",
+    "green_1": "#D5FF80",
+    "green_2": "#19362c",
+    "cyan_1": "#95E6CB",
+}
+
+
+class LightbulbStyle(Style):
+    """
+    A minimal dark theme based on the Lightbulb theme for VSCode.
+    """
+
+    name = 'lightbulb'
+
+    background_color = COLORS['bg']
+    highlight_color = COLORS['gray_3']
+
+    line_number_color = COLORS['gray_2']
+    line_number_special_color = COLORS['gray_2']
+
+    styles = {
+        Comment: COLORS["gray_1"],
+        Comment.Hashbang: "italic " + COLORS['red_1'],
+        Comment.Preproc: "bold " + COLORS['orange_1'],
+        Comment.Special: "italic " + COLORS['gray_1'],
+        Error: COLORS['red_1'],
+        Generic.Deleted: f"bg:{COLORS['red_2']} #f88f7f",
+        Generic.Emph: "italic",
+        Generic.Error: "#f88f7f",
+        Generic.Inserted: f"bg:{COLORS['green_2']} #6ad4af",
+        Generic.Output: COLORS['gray_1'],
+        Generic.Strong: "bold",
+        Generic.Traceback: COLORS['red_1'],
+        Keyword: COLORS['orange_1'],
+        Keyword.Constant: COLORS['orange_1'],
+        Keyword.Declaration: COLORS['orange_1'],
+        Keyword.Namespace: COLORS['orange_1'],
+        Keyword.Reserved: COLORS['orange_1'],
+        Keyword.Type: COLORS['blue_1'],
+        Literal: COLORS['green_1'],
+        Name: COLORS['white'],
+        Name.Attribute: COLORS['yellow_1'],
+        Name.Builtin: COLORS['yellow_1'],
+        Name.Builtin.Pseudo: "#5CCFE6",
+        Name.Class: COLORS['blue_1'],
+        Name.Constant: COLORS['yellow_1'],
+        Name.Decorator: "bold italic " + COLORS['gray_1'],
+        Name.Entity: COLORS['cyan_1'],
+        Name.Exception: COLORS['blue_1'],
+        Name.Function: COLORS['yellow_1'],
+        Name.Function.Magic: COLORS['yellow_1'],
+        Name.Other: COLORS['white'],
+        Name.Property: COLORS['yellow_1'],
+        Name.Tag: "#5CCFE6",
+        Name.Variable: COLORS['white'],
+        Number: COLORS['magenta_1'],
+        Operator: COLORS['orange_1'],
+        Operator.Word: COLORS['orange_1'],
+        Punctuation: COLORS['white'],
+        String: COLORS['green_1'],
+        String.Affix: COLORS['orange_2'],
+        String.Doc: COLORS['gray_1'],
+        String.Escape: COLORS['cyan_1'],
+        String.Interpol: COLORS['cyan_1'],
+        String.Other: COLORS['cyan_1'],
+        String.Regex: COLORS['cyan_1'],
+        String.Symbol: COLORS['magenta_1'],
+        Token: COLORS['white'],
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/lilypond.py b/.venv/Lib/site-packages/pygments/styles/lilypond.py
new file mode 100644 (file)
index 0000000..b538798
--- /dev/null
@@ -0,0 +1,62 @@
+"""
+    pygments.styles.lilypond
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    LilyPond-specific style.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Token
+
+
+__all__ = ['LilyPondStyle']
+
+
+class LilyPondStyle(Style):
+    """
+    Style for the LilyPond language.
+
+    .. versionadded:: 2.11
+    """
+
+    name = 'lilypond'
+    
+    # Don't show it in the gallery, it's intended for LilyPond
+    # input only and doesn't show good output on Python code.
+    web_style_gallery_exclude = True
+
+    styles = {
+        Token.Text: "",
+        Token.Keyword: "bold",
+        Token.Comment: "italic #A3AAB2",
+        Token.String: "#AB0909",
+        Token.String.Escape: "#C46C6C",
+        Token.String.Symbol: "noinherit",
+        Token.Pitch: "", #"#911520",
+        Token.Number: "#976806", # includes durations
+        # A bare 11 is not distinguishable from a number, so we highlight
+        # the same.
+        Token.ChordModifier: "#976806",
+        Token.Name.Lvalue: "#08547A",
+        Token.Name.BackslashReference: "#08547A",
+        Token.Name.Builtin.MusicCommand: "bold #08547A",
+        Token.Name.Builtin.PaperVariable: "bold #6C5A05",
+        Token.Name.Builtin.HeaderVariable: "bold #6C5A05",
+        Token.Name.Builtin.MusicFunction: "bold #08547A",
+        Token.Name.Builtin.Clef: "bold #08547A",
+        Token.Name.Builtin.Scale: "bold #08547A",
+        Token.Name.Builtin.RepeatType: "#08547A",
+        Token.Name.Builtin.Dynamic: "#68175A",
+        Token.Name.Builtin.Articulation: "#68175A",
+        Token.Name.Builtin.SchemeFunction: "bold #A83401",
+        Token.Name.Builtin.SchemeBuiltin: "bold",
+        Token.Name.Builtin.MarkupCommand: "bold #831E71",
+        Token.Name.Builtin.Context: "bold #038B8B",
+        Token.Name.Builtin.ContextProperty: "#038B8B",
+        Token.Name.Builtin.Grob: "bold #0C7441",
+        Token.Name.Builtin.GrobProperty: "#0C7441",
+        Token.Name.Builtin.Translator: "bold #6200A4",
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/lovelace.py b/.venv/Lib/site-packages/pygments/styles/lovelace.py
new file mode 100644 (file)
index 0000000..6e255cd
--- /dev/null
@@ -0,0 +1,100 @@
+"""
+    pygments.styles.lovelace
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lovelace by Miikka Salminen
+
+    Pygments style by Miikka Salminen (https://github.com/miikkas)
+    A desaturated, somewhat subdued style created for the Lovelace interactive
+    learning environment.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator, Punctuation, Generic, Whitespace
+
+
+__all__ = ['LovelaceStyle']
+
+
+class LovelaceStyle(Style):
+    """
+    The style used in Lovelace interactive learning environment. Tries to avoid
+    the "angry fruit salad" effect with desaturated and dim colours.
+    """
+    name = 'lovelace'
+
+    _KW_BLUE = '#2838b0'
+    _NAME_GREEN = '#388038'
+    _DOC_ORANGE = '#b85820'
+    _OW_PURPLE = '#a848a8'
+    _FUN_BROWN = '#785840'
+    _STR_RED = '#b83838'
+    _CLS_CYAN = '#287088'
+    _ESCAPE_LIME = '#709030'
+    _LABEL_CYAN = '#289870'
+    _EXCEPT_YELLOW = '#908828'
+
+    styles = {
+        Whitespace:          '#a89028',
+        Comment:             'italic #888888',
+        Comment.Hashbang:    _CLS_CYAN,
+        Comment.Multiline:   '#888888',
+        Comment.Preproc:     'noitalic '+_LABEL_CYAN,
+
+        Keyword:             _KW_BLUE,
+        Keyword.Constant:    'italic #444444',
+        Keyword.Declaration: 'italic',
+        Keyword.Type:        'italic',
+
+        Operator:            '#666666',
+        Operator.Word:       _OW_PURPLE,
+
+        Punctuation:         '#888888',
+
+        Name.Attribute:      _NAME_GREEN,
+        Name.Builtin:        _NAME_GREEN,
+        Name.Builtin.Pseudo: 'italic',
+        Name.Class:          _CLS_CYAN,
+        Name.Constant:       _DOC_ORANGE,
+        Name.Decorator:      _CLS_CYAN,
+        Name.Entity:         _ESCAPE_LIME,
+        Name.Exception:      _EXCEPT_YELLOW,
+        Name.Function:       _FUN_BROWN,
+        Name.Function.Magic: _DOC_ORANGE,
+        Name.Label:          _LABEL_CYAN,
+        Name.Namespace:      _LABEL_CYAN,
+        Name.Tag:            _KW_BLUE,
+        Name.Variable:       '#b04040',
+        Name.Variable.Global:_EXCEPT_YELLOW,
+        Name.Variable.Magic: _DOC_ORANGE,
+
+        String:              _STR_RED,
+        String.Affix:        '#444444',
+        String.Char:         _OW_PURPLE,
+        String.Delimiter:    _DOC_ORANGE,
+        String.Doc:          'italic '+_DOC_ORANGE,
+        String.Escape:       _ESCAPE_LIME,
+        String.Interpol:     'underline',
+        String.Other:        _OW_PURPLE,
+        String.Regex:        _OW_PURPLE,
+
+        Number:              '#444444',
+
+        Generic.Deleted:     '#c02828',
+        Generic.Emph:        'italic',
+        Generic.Error:       '#c02828',
+        Generic.Heading:     '#666666',
+        Generic.Subheading:  '#444444',
+        Generic.Inserted:    _NAME_GREEN,
+        Generic.Output:      '#666666',
+        Generic.Prompt:      '#444444',
+        Generic.Strong:      'bold',
+        Generic.EmphStrong:  'bold italic',
+        Generic.Traceback:   _KW_BLUE,
+
+        Error:               'bg:'+_OW_PURPLE,
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/manni.py b/.venv/Lib/site-packages/pygments/styles/manni.py
new file mode 100644 (file)
index 0000000..df1822a
--- /dev/null
@@ -0,0 +1,79 @@
+"""
+    pygments.styles.manni
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    A colorful style, inspired by the terminal highlighting style.
+
+    This is a port of the style used in the `php port`_ of pygments
+    by Manni. The style is called 'default' there.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['ManniStyle']
+
+
+class ManniStyle(Style):
+    """
+    A colorful style, inspired by the terminal highlighting style.
+    """
+    name = 'manni'
+    
+    background_color = '#f0f3f3'
+
+    styles = {
+        Whitespace:         '#bbbbbb',
+        Comment:            'italic #0099FF',
+        Comment.Preproc:    'noitalic #009999',
+        Comment.Special:    'bold',
+
+        Keyword:            'bold #006699',
+        Keyword.Pseudo:     'nobold',
+        Keyword.Type:       '#007788',
+
+        Operator:           '#555555',
+        Operator.Word:      'bold #000000',
+
+        Name.Builtin:       '#336666',
+        Name.Function:      '#CC00FF',
+        Name.Class:         'bold #00AA88',
+        Name.Namespace:     'bold #00CCFF',
+        Name.Exception:     'bold #CC0000',
+        Name.Variable:      '#003333',
+        Name.Constant:      '#336600',
+        Name.Label:         '#9999FF',
+        Name.Entity:        'bold #999999',
+        Name.Attribute:     '#330099',
+        Name.Tag:           'bold #330099',
+        Name.Decorator:     '#9999FF',
+
+        String:             '#CC3300',
+        String.Doc:         'italic',
+        String.Interpol:    '#AA0000',
+        String.Escape:      'bold #CC3300',
+        String.Regex:       '#33AAAA',
+        String.Symbol:      '#FFCC33',
+        String.Other:       '#CC3300',
+
+        Number:             '#FF6600',
+
+        Generic.Heading:    'bold #003300',
+        Generic.Subheading: 'bold #003300',
+        Generic.Deleted:    'border:#CC0000 bg:#FFCCCC',
+        Generic.Inserted:   'border:#00CC00 bg:#CCFFCC',
+        Generic.Error:      '#FF0000',
+        Generic.Emph:       'italic',
+        Generic.Strong:     'bold',
+        Generic.EmphStrong: 'bold italic',
+        Generic.Prompt:     'bold #000099',
+        Generic.Output:     '#AAAAAA',
+        Generic.Traceback:  '#99CC66',
+
+        Error:              'bg:#FFAAAA #AA0000'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/material.py b/.venv/Lib/site-packages/pygments/styles/material.py
new file mode 100644 (file)
index 0000000..633ef38
--- /dev/null
@@ -0,0 +1,124 @@
+"""
+    pygments.styles.material
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Mimic the Material theme color scheme.
+
+    https://github.com/material-theme/vsc-material-theme
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Escape, \
+    Error, Text, Number, Operator, Generic, Punctuation, Literal
+
+
+__all__ = ['MaterialStyle']
+
+
+class MaterialStyle(Style):
+    """
+    This style mimics the Material Theme color scheme.
+    """
+    name = 'material'
+    
+    dark_teal = '#263238'
+    white = '#FFFFFF'
+    black = '#000000'
+    red = '#FF5370'
+    orange = '#F78C6C'
+    yellow = '#FFCB6B'
+    green = '#C3E88D'
+    cyan = '#89DDFF'
+    blue = '#82AAFF'
+    paleblue = '#B2CCD6'
+    purple = '#C792EA'
+    brown = '#C17E70'
+    pink = '#F07178'
+    violet = '#BB80B3'
+    foreground = '#EEFFFF'
+    faded = '#546E7A'
+
+    background_color = dark_teal
+    highlight_color = '#2C3B41'
+    line_number_color = '#37474F'
+    line_number_background_color = dark_teal
+    line_number_special_color = '#607A86'
+    line_number_special_background_color = dark_teal
+
+    styles = {
+        Text:                          foreground,
+        Escape:                        cyan,
+        Error:                         red,
+
+        Keyword:                       violet,
+        Keyword.Constant:              cyan,
+        Keyword.Declaration:           violet,
+        Keyword.Namespace:             'italic ' + cyan,
+        Keyword.Pseudo:                cyan,
+        Keyword.Type:                  violet,
+
+        Name:                          foreground,
+        Name.Attribute:                violet,
+        Name.Builtin:                  blue,
+        Name.Builtin.Pseudo:           cyan,
+        Name.Class:                    yellow,
+        Name.Constant:                 foreground,
+        Name.Decorator:                blue,
+        Name.Entity:                   cyan,
+        Name.Exception:                yellow,
+        Name.Function:                 blue,
+        Name.Function.Magic:           blue,
+        Name.Label:                    blue,
+        Name.Property:                 yellow,
+        Name.Namespace:                yellow,
+        Name.Other:                    foreground,
+        Name.Tag:                      red,
+        Name.Variable:                 cyan,
+        Name.Variable.Class:           cyan,
+        Name.Variable.Global:          cyan,
+        Name.Variable.Instance:        cyan,
+        Name.Variable.Magic:           blue,
+
+        Literal:                       green,
+        Literal.Date:                  green,
+
+        String:                        green,
+        String.Affix:                  violet,
+        String.Backtick:               green,
+        String.Char:                   green,
+        String.Delimiter:              foreground,
+        String.Doc:                    'italic ' + faded,
+        String.Double:                 green,
+        String.Escape:                 foreground,
+        String.Heredoc:                green,
+        String.Interpol:               cyan,
+        String.Other:                  green,
+        String.Regex:                  cyan,
+        String.Single:                 green,
+        String.Symbol:                 cyan,
+
+        Number:                        orange,
+
+        Operator:                      cyan,
+        Operator.Word:                 'italic ' + cyan,
+
+        Punctuation:                   cyan,
+
+        Comment:                       'italic ' + faded,
+
+        Generic:                       foreground,
+        Generic.Deleted:               red,
+        Generic.Emph:                  cyan,
+        Generic.Error:                 red,
+        Generic.Heading:               green,
+        Generic.Inserted:              green,
+        Generic.Output:                faded,
+        Generic.Prompt:                yellow,
+        Generic.Strong:                red,
+        Generic.EmphStrong:            yellow,
+        Generic.Subheading:            cyan,
+        Generic.Traceback:             red,
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/monokai.py b/.venv/Lib/site-packages/pygments/styles/monokai.py
new file mode 100644 (file)
index 0000000..4a6ac0c
--- /dev/null
@@ -0,0 +1,112 @@
+"""
+    pygments.styles.monokai
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Mimic the Monokai color scheme. Based on tango.py.
+
+    http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Token, \
+     Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
+
+
+__all__ = ['MonokaiStyle']
+
+
+class MonokaiStyle(Style):
+    """
+    This style mimics the Monokai color scheme.
+    """
+    name = 'monokai'
+    
+    background_color = "#272822"
+    highlight_color = "#49483e"
+
+    styles = {
+        # No corresponding class for the following:
+        Token:                     "#f8f8f2", # class:  ''
+        Whitespace:                "",        # class: 'w'
+        Error:                     "#ed007e bg:#1e0010", # class: 'err'
+        Other:                     "",        # class 'x'
+
+        Comment:                   "#959077", # class: 'c'
+        Comment.Multiline:         "",        # class: 'cm'
+        Comment.Preproc:           "",        # class: 'cp'
+        Comment.Single:            "",        # class: 'c1'
+        Comment.Special:           "",        # class: 'cs'
+
+        Keyword:                   "#66d9ef", # class: 'k'
+        Keyword.Constant:          "",        # class: 'kc'
+        Keyword.Declaration:       "",        # class: 'kd'
+        Keyword.Namespace:         "#ff4689", # class: 'kn'
+        Keyword.Pseudo:            "",        # class: 'kp'
+        Keyword.Reserved:          "",        # class: 'kr'
+        Keyword.Type:              "",        # class: 'kt'
+
+        Operator:                  "#ff4689", # class: 'o'
+        Operator.Word:             "",        # class: 'ow' - like keywords
+
+        Punctuation:               "#f8f8f2", # class: 'p'
+
+        Name:                      "#f8f8f2", # class: 'n'
+        Name.Attribute:            "#a6e22e", # class: 'na' - to be revised
+        Name.Builtin:              "",        # class: 'nb'
+        Name.Builtin.Pseudo:       "",        # class: 'bp'
+        Name.Class:                "#a6e22e", # class: 'nc' - to be revised
+        Name.Constant:             "#66d9ef", # class: 'no' - to be revised
+        Name.Decorator:            "#a6e22e", # class: 'nd' - to be revised
+        Name.Entity:               "",        # class: 'ni'
+        Name.Exception:            "#a6e22e", # class: 'ne'
+        Name.Function:             "#a6e22e", # class: 'nf'
+        Name.Property:             "",        # class: 'py'
+        Name.Label:                "",        # class: 'nl'
+        Name.Namespace:            "",        # class: 'nn' - to be revised
+        Name.Other:                "#a6e22e", # class: 'nx'
+        Name.Tag:                  "#ff4689", # class: 'nt' - like a keyword
+        Name.Variable:             "",        # class: 'nv' - to be revised
+        Name.Variable.Class:       "",        # class: 'vc' - to be revised
+        Name.Variable.Global:      "",        # class: 'vg' - to be revised
+        Name.Variable.Instance:    "",        # class: 'vi' - to be revised
+
+        Number:                    "#ae81ff", # class: 'm'
+        Number.Float:              "",        # class: 'mf'
+        Number.Hex:                "",        # class: 'mh'
+        Number.Integer:            "",        # class: 'mi'
+        Number.Integer.Long:       "",        # class: 'il'
+        Number.Oct:                "",        # class: 'mo'
+
+        Literal:                   "#ae81ff", # class: 'l'
+        Literal.Date:              "#e6db74", # class: 'ld'
+
+        String:                    "#e6db74", # class: 's'
+        String.Backtick:           "",        # class: 'sb'
+        String.Char:               "",        # class: 'sc'
+        String.Doc:                "",        # class: 'sd' - like a comment
+        String.Double:             "",        # class: 's2'
+        String.Escape:             "#ae81ff", # class: 'se'
+        String.Heredoc:            "",        # class: 'sh'
+        String.Interpol:           "",        # class: 'si'
+        String.Other:              "",        # class: 'sx'
+        String.Regex:              "",        # class: 'sr'
+        String.Single:             "",        # class: 's1'
+        String.Symbol:             "",        # class: 'ss'
+
+
+        Generic:                   "",        # class: 'g'
+        Generic.Deleted:           "#ff4689", # class: 'gd',
+        Generic.Emph:              "italic",  # class: 'ge'
+        Generic.Error:             "",        # class: 'gr'
+        Generic.Heading:           "",        # class: 'gh'
+        Generic.Inserted:          "#a6e22e", # class: 'gi'
+        Generic.Output:            "#66d9ef", # class: 'go'
+        Generic.Prompt:            "bold #ff4689", # class: 'gp'
+        Generic.Strong:            "bold",    # class: 'gs'
+        Generic.EmphStrong:        "bold italic",  # class: 'ges'
+        Generic.Subheading:        "#959077", # class: 'gu'
+        Generic.Traceback:         "",        # class: 'gt'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/murphy.py b/.venv/Lib/site-packages/pygments/styles/murphy.py
new file mode 100644 (file)
index 0000000..1299fd5
--- /dev/null
@@ -0,0 +1,82 @@
+"""
+    pygments.styles.murphy
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Murphy's style from CodeRay.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['MurphyStyle']
+
+
+class MurphyStyle(Style):
+    """
+    Murphy's style from CodeRay.
+    """
+    name = 'murphy'
+    
+    styles = {
+        Whitespace:                "#bbbbbb",
+        Comment:                   "#666 italic",
+        Comment.Preproc:           "#579 noitalic",
+        Comment.Special:           "#c00 bold",
+
+        Keyword:                   "bold #289",
+        Keyword.Pseudo:            "#08f",
+        Keyword.Type:              "#66f",
+
+        Operator:                  "#333",
+        Operator.Word:             "bold #000",
+
+        Name.Builtin:              "#072",
+        Name.Function:             "bold #5ed",
+        Name.Class:                "bold #e9e",
+        Name.Namespace:            "bold #0e84b5",
+        Name.Exception:            "bold #F00",
+        Name.Variable:             "#036",
+        Name.Variable.Instance:    "#aaf",
+        Name.Variable.Class:       "#ccf",
+        Name.Variable.Global:      "#f84",
+        Name.Constant:             "bold #5ed",
+        Name.Label:                "bold #970",
+        Name.Entity:               "#800",
+        Name.Attribute:            "#007",
+        Name.Tag:                  "#070",
+        Name.Decorator:            "bold #555",
+
+        String:                    "bg:#e0e0ff",
+        String.Char:               "#88F bg:",
+        String.Doc:                "#D42 bg:",
+        String.Interpol:           "bg:#eee",
+        String.Escape:             "bold #666",
+        String.Regex:              "bg:#e0e0ff #000",
+        String.Symbol:             "#fc8 bg:",
+        String.Other:              "#f88",
+
+        Number:                    "bold #60E",
+        Number.Integer:            "bold #66f",
+        Number.Float:              "bold #60E",
+        Number.Hex:                "bold #058",
+        Number.Oct:                "bold #40E",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#A00000",
+        Generic.Inserted:          "#00A000",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.EmphStrong:        "bold italic",
+        Generic.Prompt:            "bold #c65d09",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "#F00 bg:#FAA"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/native.py b/.venv/Lib/site-packages/pygments/styles/native.py
new file mode 100644 (file)
index 0000000..c9f818d
--- /dev/null
@@ -0,0 +1,70 @@
+"""
+    pygments.styles.native
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    pygments version of my "native" vim theme.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Token, Whitespace
+
+
+__all__ = ['NativeStyle']
+
+
+class NativeStyle(Style):
+    """
+    Pygments version of the "native" vim theme.
+    """
+    name = 'native'
+    
+    background_color = '#202020'
+    highlight_color = '#404040'
+    line_number_color = '#aaaaaa'
+
+    styles = {
+        Token:              '#d0d0d0',
+        Whitespace:         '#666666',
+
+        Comment:            'italic #ababab',
+        Comment.Preproc:    'noitalic bold #ff3a3a',
+        Comment.Special:    'noitalic bold #e50808 bg:#520000',
+
+        Keyword:            'bold #6ebf26',
+        Keyword.Pseudo:     'nobold',
+        Operator.Word:      'bold #6ebf26',
+
+        String:             '#ed9d13',
+        String.Other:       '#ffa500',
+
+        Number:             '#51b2fd',
+
+        Name.Builtin:       '#2fbccd',
+        Name.Variable:      '#40ffff',
+        Name.Constant:      '#40ffff',
+        Name.Class:         'underline #71adff',
+        Name.Function:      '#71adff',
+        Name.Namespace:     'underline #71adff',
+        Name.Exception:     '#bbbbbb',
+        Name.Tag:           'bold #6ebf26',
+        Name.Attribute:     '#bbbbbb',
+        Name.Decorator:     '#ffa500',
+
+        Generic.Heading:    'bold #ffffff',
+        Generic.Subheading: 'underline #ffffff',
+        Generic.Deleted:    '#ff3a3a',
+        Generic.Inserted:   '#589819',
+        Generic.Error:      '#ff3a3a',
+        Generic.Emph:       'italic',
+        Generic.Strong:     'bold',
+        Generic.EmphStrong: 'bold italic',
+        Generic.Prompt:     '#aaaaaa',
+        Generic.Output:     '#cccccc',
+        Generic.Traceback:  '#ff3a3a',
+
+        Error:              'bg:#e3d2d2 #a61717'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/nord.py b/.venv/Lib/site-packages/pygments/styles/nord.py
new file mode 100644 (file)
index 0000000..5481e96
--- /dev/null
@@ -0,0 +1,156 @@
+"""
+    pygments.styles.nord
+    ~~~~~~~~~~~~~~~~~~~~
+
+    pygments version of the "nord" theme by Arctic Ice Studio
+    https://www.nordtheme.com/
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Number, \
+    Operator, Generic, Whitespace, Punctuation, Text, Token
+
+
+__all__ = ['NordStyle', 'NordDarkerStyle']
+
+
+class NordStyle(Style):
+    """
+    Pygments version of the "nord" theme by Arctic Ice Studio.
+    """
+    name = 'nord'
+    
+    line_number_color = "#D8DEE9"
+    line_number_background_color = "#242933"
+    line_number_special_color = "#242933"
+    line_number_special_background_color = "#D8DEE9"
+
+    background_color = "#2E3440"
+    highlight_color = "#3B4252"
+
+    styles = {
+        Token:                      "#d8dee9",
+
+        Whitespace:                 '#d8dee9',
+        Punctuation:                '#eceff4',
+
+        Comment:                    'italic #616e87',
+        Comment.Preproc:            '#5e81ac',
+
+        Keyword:                    'bold #81a1c1',
+        Keyword.Pseudo:             'nobold #81a1c1',
+        Keyword.Type:               'nobold #81a1c1',
+
+        Operator:                   'bold #81a1c1',
+        Operator.Word:              'bold #81a1c1',
+
+        Name:                       '#d8dee9',
+        Name.Builtin:               '#81a1c1',
+        Name.Function:              '#88c0d0',
+        Name.Class:                 '#8fbcbb',
+        Name.Namespace:             '#8fbcbb',
+        Name.Exception:             '#bf616a',
+        Name.Variable:              '#d8dee9',
+        Name.Constant:              '#8fbcbb',
+        Name.Entity:                '#d08770',
+        Name.Attribute:             '#8fbcbb',
+        Name.Tag:                   '#81a1c1',
+        Name.Decorator:             '#d08770',
+
+        String:                     '#a3be8c',
+        String.Doc:                 '#616e87',
+        String.Interpol:            '#a3be8c',
+        String.Escape:              '#ebcb8b',
+        String.Regex:               '#ebcb8b',
+        String.Symbol:              '#a3be8c',
+        String.Other:               '#a3be8c',
+
+        Number:                     '#b48ead',
+
+        Generic.Heading:            'bold #88c0d0',
+        Generic.Subheading:         'bold #88c0d0',
+        Generic.Deleted:            '#bf616a',
+        Generic.Inserted:           '#a3be8c',
+        Generic.Error:              '#bf616a',
+        Generic.Emph:               'italic',
+        Generic.Strong:             'bold',
+        Generic.EmphStrong:         'bold italic',
+        Generic.Prompt:             'bold #616e88',
+        Generic.Output:             '#d8dee9',
+        Generic.Traceback:          '#bf616a',
+
+        Error:                      '#bf616a',
+        Text:                       '#d8dee9',
+    }
+
+
+class NordDarkerStyle(Style):
+    """
+    Pygments version of a darker "nord" theme by Arctic Ice Studio
+    """
+    name = 'nord-darker'
+    
+    line_number_color = "#D8DEE9"
+    line_number_background_color = "#242933"
+    line_number_special_color = "#242933"
+    line_number_special_background_color = "#D8DEE9"
+
+    background_color = "#242933"
+    highlight_color = "#3B4252"
+
+    styles = {
+        Token:                      "#d8dee9",
+
+        Whitespace:                 '#d8dee9',
+        Punctuation:                '#eceff4',
+
+        Comment:                    'italic #616e87',
+        Comment.Preproc:            '#5e81ac',
+
+        Keyword:                    'bold #81a1c1',
+        Keyword.Pseudo:             'nobold #81a1c1',
+        Keyword.Type:               'nobold #81a1c1',
+
+        Operator:                   'bold #81a1c1',
+        Operator.Word:              'bold #81a1c1',
+
+        Name:                       '#d8dee9',
+        Name.Builtin:               '#81a1c1',
+        Name.Function:              '#88c0d0',
+        Name.Class:                 '#8fbcbb',
+        Name.Namespace:             '#8fbcbb',
+        Name.Exception:             '#bf616a',
+        Name.Variable:              '#d8dee9',
+        Name.Constant:              '#8fbcbb',
+        Name.Entity:                '#d08770',
+        Name.Attribute:             '#8fbcbb',
+        Name.Tag:                   '#81a1c1',
+        Name.Decorator:             '#d08770',
+
+        String:                     '#a3be8c',
+        String.Doc:                 '#616e87',
+        String.Interpol:            '#a3be8c',
+        String.Escape:              '#ebcb8b',
+        String.Regex:               '#ebcb8b',
+        String.Symbol:              '#a3be8c',
+        String.Other:               '#a3be8c',
+
+        Number:                     '#b48ead',
+
+        Generic.Heading:            'bold #88c0d0',
+        Generic.Subheading:         'bold #88c0d0',
+        Generic.Deleted:            '#bf616a',
+        Generic.Inserted:           '#a3be8c',
+        Generic.Error:              '#bf616a',
+        Generic.Emph:               'italic',
+        Generic.Strong:             'bold',
+        Generic.Prompt:             'bold #616e88',
+        Generic.Output:             '#d8dee9',
+        Generic.Traceback:          '#bf616a',
+
+        Error:                      '#bf616a',
+        Text:                       '#d8dee9',
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/onedark.py b/.venv/Lib/site-packages/pygments/styles/onedark.py
new file mode 100644 (file)
index 0000000..75c4b17
--- /dev/null
@@ -0,0 +1,63 @@
+"""
+    pygments.styles.onedark
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    One Dark Theme for Pygments by Tobias Zoghaib (https://github.com/TobiZog)
+
+    Inspired by one-dark-ui for the code editor Atom
+    (https://atom.io/themes/one-dark-ui).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Token
+
+
+__all__ = ['OneDarkStyle']
+
+
+class OneDarkStyle(Style):
+    """
+    Theme inspired by One Dark Pro for Atom.
+
+    .. versionadded:: 2.11
+    """
+    name = 'one-dark'
+    
+    background_color = '#282C34'
+
+    styles = {
+        Token:                  '#ABB2BF',
+
+        Punctuation:            '#ABB2BF',
+        Punctuation.Marker:     '#ABB2BF',
+
+        Keyword:                '#C678DD',
+        Keyword.Constant:       '#E5C07B',
+        Keyword.Declaration:    '#C678DD',
+        Keyword.Namespace:      '#C678DD',
+        Keyword.Reserved:       '#C678DD',
+        Keyword.Type:           '#E5C07B',
+
+        Name:                   '#E06C75',
+        Name.Attribute:         '#E06C75',
+        Name.Builtin:           '#E5C07B',
+        Name.Class:             '#E5C07B',
+        Name.Function:          'bold #61AFEF',
+        Name.Function.Magic:    'bold #56B6C2',
+        Name.Other:             '#E06C75',
+        Name.Tag:               '#E06C75',
+        Name.Decorator:         '#61AFEF',
+        Name.Variable.Class:    '',
+
+        String:                 '#98C379',
+
+        Number:                 '#D19A66',
+
+        Operator:               '#56B6C2',
+
+        Comment:                '#7F848E'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/paraiso_dark.py b/.venv/Lib/site-packages/pygments/styles/paraiso_dark.py
new file mode 100644 (file)
index 0000000..9983e60
--- /dev/null
@@ -0,0 +1,124 @@
+"""
+    pygments.styles.paraiso_dark
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Paraíso (Dark) by Jan T. Sott
+
+    Pygments template by Jan T. Sott (https://github.com/idleberg)
+    Created with Base16 Builder by Chris Kempson
+    (https://github.com/chriskempson/base16-builder).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Text, \
+    Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
+
+
+__all__ = ['ParaisoDarkStyle']
+
+
+BACKGROUND = "#2f1e2e"
+CURRENT_LINE = "#41323f"
+SELECTION = "#4f424c"
+FOREGROUND = "#e7e9db"
+COMMENT = "#776e71"
+RED = "#ef6155"
+ORANGE = "#f99b15"
+YELLOW = "#fec418"
+GREEN = "#48b685"
+AQUA = "#5bc4bf"
+BLUE = "#06b6ef"
+PURPLE = "#815ba4"
+
+
+class ParaisoDarkStyle(Style):
+    name = 'paraiso-dark'
+    
+    background_color = BACKGROUND
+    highlight_color = SELECTION
+
+    styles = {
+        # No corresponding class for the following:
+        Text:                      FOREGROUND,  # class:  ''
+        Whitespace:                "",          # class: 'w'
+        Error:                     RED,         # class: 'err'
+        Other:                     "",          # class 'x'
+
+        Comment:                   COMMENT,   # class: 'c'
+        Comment.Multiline:         "",        # class: 'cm'
+        Comment.Preproc:           "",        # class: 'cp'
+        Comment.Single:            "",        # class: 'c1'
+        Comment.Special:           "",        # class: 'cs'
+
+        Keyword:                   PURPLE,    # class: 'k'
+        Keyword.Constant:          "",        # class: 'kc'
+        Keyword.Declaration:       "",        # class: 'kd'
+        Keyword.Namespace:         AQUA,      # class: 'kn'
+        Keyword.Pseudo:            "",        # class: 'kp'
+        Keyword.Reserved:          "",        # class: 'kr'
+        Keyword.Type:              YELLOW,    # class: 'kt'
+
+        Operator:                  AQUA,      # class: 'o'
+        Operator.Word:             "",        # class: 'ow' - like keywords
+
+        Punctuation:               FOREGROUND,  # class: 'p'
+
+        Name:                      FOREGROUND,  # class: 'n'
+        Name.Attribute:            BLUE,        # class: 'na' - to be revised
+        Name.Builtin:              "",          # class: 'nb'
+        Name.Builtin.Pseudo:       "",          # class: 'bp'
+        Name.Class:                YELLOW,      # class: 'nc' - to be revised
+        Name.Constant:             RED,         # class: 'no' - to be revised
+        Name.Decorator:            AQUA,        # class: 'nd' - to be revised
+        Name.Entity:               "",          # class: 'ni'
+        Name.Exception:            RED,         # class: 'ne'
+        Name.Function:             BLUE,        # class: 'nf'
+        Name.Property:             "",          # class: 'py'
+        Name.Label:                "",          # class: 'nl'
+        Name.Namespace:            YELLOW,      # class: 'nn' - to be revised
+        Name.Other:                BLUE,        # class: 'nx'
+        Name.Tag:                  AQUA,        # class: 'nt' - like a keyword
+        Name.Variable:             RED,         # class: 'nv' - to be revised
+        Name.Variable.Class:       "",          # class: 'vc' - to be revised
+        Name.Variable.Global:      "",          # class: 'vg' - to be revised
+        Name.Variable.Instance:    "",          # class: 'vi' - to be revised
+
+        Number:                    ORANGE,    # class: 'm'
+        Number.Float:              "",        # class: 'mf'
+        Number.Hex:                "",        # class: 'mh'
+        Number.Integer:            "",        # class: 'mi'
+        Number.Integer.Long:       "",        # class: 'il'
+        Number.Oct:                "",        # class: 'mo'
+
+        Literal:                   ORANGE,    # class: 'l'
+        Literal.Date:              GREEN,     # class: 'ld'
+
+        String:                    GREEN,       # class: 's'
+        String.Backtick:           "",          # class: 'sb'
+        String.Char:               FOREGROUND,  # class: 'sc'
+        String.Doc:                COMMENT,     # class: 'sd' - like a comment
+        String.Double:             "",          # class: 's2'
+        String.Escape:             ORANGE,      # class: 'se'
+        String.Heredoc:            "",          # class: 'sh'
+        String.Interpol:           ORANGE,      # class: 'si'
+        String.Other:              "",          # class: 'sx'
+        String.Regex:              "",          # class: 'sr'
+        String.Single:             "",          # class: 's1'
+        String.Symbol:             "",          # class: 'ss'
+
+        Generic:                   "",                    # class: 'g'
+        Generic.Deleted:           RED,                   # class: 'gd',
+        Generic.Emph:              "italic",              # class: 'ge'
+        Generic.Error:             "",                    # class: 'gr'
+        Generic.Heading:           "bold " + FOREGROUND,  # class: 'gh'
+        Generic.Inserted:          GREEN,                 # class: 'gi'
+        Generic.Output:            "",                    # class: 'go'
+        Generic.Prompt:            "bold " + COMMENT,     # class: 'gp'
+        Generic.Strong:            "bold",                # class: 'gs'
+        Generic.EmphStrong:        "bold italic",         # class: 'ges'
+        Generic.Subheading:        "bold " + AQUA,        # class: 'gu'
+        Generic.Traceback:         "",                    # class: 'gt'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/paraiso_light.py b/.venv/Lib/site-packages/pygments/styles/paraiso_light.py
new file mode 100644 (file)
index 0000000..903ad88
--- /dev/null
@@ -0,0 +1,124 @@
+"""
+    pygments.styles.paraiso_light
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Paraíso (Light) by Jan T. Sott
+
+    Pygments template by Jan T. Sott (https://github.com/idleberg)
+    Created with Base16 Builder by Chris Kempson
+    (https://github.com/chriskempson/base16-builder).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, Text, \
+    Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
+
+
+__all__ = ['ParaisoLightStyle']
+
+
+BACKGROUND = "#e7e9db"
+CURRENT_LINE = "#b9b6b0"
+SELECTION = "#a39e9b"
+FOREGROUND = "#2f1e2e"
+COMMENT = "#8d8687"
+RED = "#ef6155"
+ORANGE = "#f99b15"
+YELLOW = "#fec418"
+GREEN = "#48b685"
+AQUA = "#5bc4bf"
+BLUE = "#06b6ef"
+PURPLE = "#815ba4"
+
+
+class ParaisoLightStyle(Style):
+    name = 'paraiso-light'
+    
+    background_color = BACKGROUND
+    highlight_color = SELECTION
+
+    styles = {
+        # No corresponding class for the following:
+        Text:                      FOREGROUND,  # class:  ''
+        Whitespace:                "",          # class: 'w'
+        Error:                     RED,         # class: 'err'
+        Other:                     "",          # class 'x'
+
+        Comment:                   COMMENT,   # class: 'c'
+        Comment.Multiline:         "",        # class: 'cm'
+        Comment.Preproc:           "",        # class: 'cp'
+        Comment.Single:            "",        # class: 'c1'
+        Comment.Special:           "",        # class: 'cs'
+
+        Keyword:                   PURPLE,    # class: 'k'
+        Keyword.Constant:          "",        # class: 'kc'
+        Keyword.Declaration:       "",        # class: 'kd'
+        Keyword.Namespace:         AQUA,      # class: 'kn'
+        Keyword.Pseudo:            "",        # class: 'kp'
+        Keyword.Reserved:          "",        # class: 'kr'
+        Keyword.Type:              YELLOW,    # class: 'kt'
+
+        Operator:                  AQUA,      # class: 'o'
+        Operator.Word:             "",        # class: 'ow' - like keywords
+
+        Punctuation:               FOREGROUND,  # class: 'p'
+
+        Name:                      FOREGROUND,  # class: 'n'
+        Name.Attribute:            BLUE,        # class: 'na' - to be revised
+        Name.Builtin:              "",          # class: 'nb'
+        Name.Builtin.Pseudo:       "",          # class: 'bp'
+        Name.Class:                YELLOW,      # class: 'nc' - to be revised
+        Name.Constant:             RED,         # class: 'no' - to be revised
+        Name.Decorator:            AQUA,        # class: 'nd' - to be revised
+        Name.Entity:               "",          # class: 'ni'
+        Name.Exception:            RED,         # class: 'ne'
+        Name.Function:             BLUE,        # class: 'nf'
+        Name.Property:             "",          # class: 'py'
+        Name.Label:                "",          # class: 'nl'
+        Name.Namespace:            YELLOW,      # class: 'nn' - to be revised
+        Name.Other:                BLUE,        # class: 'nx'
+        Name.Tag:                  AQUA,        # class: 'nt' - like a keyword
+        Name.Variable:             RED,         # class: 'nv' - to be revised
+        Name.Variable.Class:       "",          # class: 'vc' - to be revised
+        Name.Variable.Global:      "",          # class: 'vg' - to be revised
+        Name.Variable.Instance:    "",          # class: 'vi' - to be revised
+
+        Number:                    ORANGE,    # class: 'm'
+        Number.Float:              "",        # class: 'mf'
+        Number.Hex:                "",        # class: 'mh'
+        Number.Integer:            "",        # class: 'mi'
+        Number.Integer.Long:       "",        # class: 'il'
+        Number.Oct:                "",        # class: 'mo'
+
+        Literal:                   ORANGE,    # class: 'l'
+        Literal.Date:              GREEN,     # class: 'ld'
+
+        String:                    GREEN,       # class: 's'
+        String.Backtick:           "",          # class: 'sb'
+        String.Char:               FOREGROUND,  # class: 'sc'
+        String.Doc:                COMMENT,     # class: 'sd' - like a comment
+        String.Double:             "",          # class: 's2'
+        String.Escape:             ORANGE,      # class: 'se'
+        String.Heredoc:            "",          # class: 'sh'
+        String.Interpol:           ORANGE,      # class: 'si'
+        String.Other:              "",          # class: 'sx'
+        String.Regex:              "",          # class: 'sr'
+        String.Single:             "",          # class: 's1'
+        String.Symbol:             "",          # class: 'ss'
+
+        Generic:                   "",                    # class: 'g'
+        Generic.Deleted:           RED,                   # class: 'gd',
+        Generic.Emph:              "italic",              # class: 'ge'
+        Generic.Error:             "",                    # class: 'gr'
+        Generic.Heading:           "bold " + FOREGROUND,  # class: 'gh'
+        Generic.Inserted:          GREEN,                 # class: 'gi'
+        Generic.Output:            "",                    # class: 'go'
+        Generic.Prompt:            "bold " + COMMENT,     # class: 'gp'
+        Generic.Strong:            "bold",                # class: 'gs'
+        Generic.EmphStrong:        "bold italic",         # class: 'ges'
+        Generic.Subheading:        "bold " + AQUA,        # class: 'gu'
+        Generic.Traceback:         "",                    # class: 'gt'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/pastie.py b/.venv/Lib/site-packages/pygments/styles/pastie.py
new file mode 100644 (file)
index 0000000..819968e
--- /dev/null
@@ -0,0 +1,78 @@
+"""
+    pygments.styles.pastie
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Style similar to the `pastie`_ default style.
+
+    .. _pastie: http://pastie.caboo.se/
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['PastieStyle']
+
+
+class PastieStyle(Style):
+    """
+    Style similar to the pastie default style.
+    """
+
+    name = 'pastie'
+    
+    styles = {
+        Whitespace:             '#bbbbbb',
+        Comment:                '#888888',
+        Comment.Preproc:        'bold #cc0000',
+        Comment.Special:        'bg:#fff0f0 bold #cc0000',
+
+        String:                 'bg:#fff0f0 #dd2200',
+        String.Regex:           'bg:#fff0ff #008800',
+        String.Other:           'bg:#f0fff0 #22bb22',
+        String.Symbol:          '#aa6600',
+        String.Interpol:        '#3333bb',
+        String.Escape:          '#0044dd',
+
+        Operator.Word:          '#008800',
+
+        Keyword:                'bold #008800',
+        Keyword.Pseudo:         'nobold',
+        Keyword.Type:           '#888888',
+
+        Name.Class:             'bold #bb0066',
+        Name.Exception:         'bold #bb0066',
+        Name.Function:          'bold #0066bb',
+        Name.Property:          'bold #336699',
+        Name.Namespace:         'bold #bb0066',
+        Name.Builtin:           '#003388',
+        Name.Variable:          '#336699',
+        Name.Variable.Class:    '#336699',
+        Name.Variable.Instance: '#3333bb',
+        Name.Variable.Global:   '#dd7700',
+        Name.Constant:          'bold #003366',
+        Name.Tag:               'bold #bb0066',
+        Name.Attribute:         '#336699',
+        Name.Decorator:         '#555555',
+        Name.Label:             'italic #336699',
+
+        Number:                 'bold #0000DD',
+
+        Generic.Heading:        '#333',
+        Generic.Subheading:     '#666',
+        Generic.Deleted:        'bg:#ffdddd #000000',
+        Generic.Inserted:       'bg:#ddffdd #000000',
+        Generic.Error:          '#aa0000',
+        Generic.Emph:           'italic',
+        Generic.Strong:         'bold',
+        Generic.EmphStrong:     'bold italic',
+        Generic.Prompt:         '#555555',
+        Generic.Output:         '#888888',
+        Generic.Traceback:      '#aa0000',
+
+        Error:                  'bg:#e3d2d2 #a61717'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/perldoc.py b/.venv/Lib/site-packages/pygments/styles/perldoc.py
new file mode 100644 (file)
index 0000000..e76697a
--- /dev/null
@@ -0,0 +1,73 @@
+"""
+    pygments.styles.perldoc
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Style similar to the style used in the `perldoc`_ code blocks.
+
+    .. _perldoc: http://perldoc.perl.org/
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['PerldocStyle']
+
+
+class PerldocStyle(Style):
+    """
+    Style similar to the style used in the perldoc code blocks.
+    """
+
+    name = 'perldoc'
+    
+    background_color = '#eeeedd'
+
+    styles = {
+        Whitespace:             '#bbbbbb',
+        Comment:                '#228B22',
+        Comment.Preproc:        '#1e889b',
+        Comment.Special:        '#8B008B bold',
+
+        String:                 '#CD5555',
+        String.Heredoc:         '#1c7e71 italic',
+        String.Regex:           '#B452CD',
+        String.Other:           '#cb6c20',
+        String.Regex:           '#1c7e71',
+
+        Number:                 '#B452CD',
+
+        Operator.Word:          '#8B008B',
+
+        Keyword:                '#8B008B bold',
+        Keyword.Type:           '#00688B',
+
+        Name.Class:             '#008b45 bold',
+        Name.Exception:         '#008b45 bold',
+        Name.Function:          '#008b45',
+        Name.Namespace:         '#008b45 underline',
+        Name.Variable:          '#00688B',
+        Name.Constant:          '#00688B',
+        Name.Decorator:         '#707a7c',
+        Name.Tag:               '#8B008B bold',
+        Name.Attribute:         '#658b00',
+        Name.Builtin:           '#658b00',
+
+        Generic.Heading:        'bold #000080',
+        Generic.Subheading:     'bold #800080',
+        Generic.Deleted:        '#aa0000',
+        Generic.Inserted:       '#00aa00',
+        Generic.Error:          '#aa0000',
+        Generic.Emph:           'italic',
+        Generic.Strong:         'bold',
+        Generic.EmphStrong:     'bold italic',
+        Generic.Prompt:         '#555555',
+        Generic.Output:         '#888888',
+        Generic.Traceback:      '#aa0000',
+
+        Error:                  'bg:#e3d2d2 #a61717'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/rainbow_dash.py b/.venv/Lib/site-packages/pygments/styles/rainbow_dash.py
new file mode 100644 (file)
index 0000000..f98d5ef
--- /dev/null
@@ -0,0 +1,95 @@
+"""
+    pygments.styles.rainbow_dash
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    A bright and colorful syntax highlighting `theme`.
+
+    .. _theme: http://sanssecours.github.io/Rainbow-Dash.tmbundle
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Comment, Error, Generic, Name, Number, Operator, \
+    String, Text, Whitespace, Keyword
+
+
+__all__ = ['RainbowDashStyle']
+
+
+BLUE_LIGHT = '#0080ff'
+BLUE = '#2c5dcd'
+GREEN = '#00cc66'
+GREEN_LIGHT = '#ccffcc'
+GREEN_NEON = '#00cc00'
+GREY = '#aaaaaa'
+GREY_LIGHT = '#cbcbcb'
+GREY_DARK = '#4d4d4d'
+PURPLE = '#5918bb'
+RED = '#cc0000'
+RED_DARK = '#c5060b'
+RED_LIGHT = '#ffcccc'
+RED_BRIGHT = '#ff0000'
+WHITE = '#ffffff'
+TURQUOISE = '#318495'
+ORANGE = '#ff8000'
+
+
+class RainbowDashStyle(Style):
+    """
+    A bright and colorful syntax highlighting theme.
+    """
+
+    name = 'rainbow_dash'
+    
+    background_color = WHITE
+
+    styles = {
+        Comment: f'italic {BLUE_LIGHT}',
+        Comment.Preproc: 'noitalic',
+        Comment.Special: 'bold',
+
+        Error: f'bg:{RED} {WHITE}',
+
+        Generic.Deleted: f'border:{RED_DARK} bg:{RED_LIGHT}',
+        Generic.Emph: 'italic',
+        Generic.Error: RED_BRIGHT,
+        Generic.Heading: f'bold {BLUE}',
+        Generic.Inserted: f'border:{GREEN_NEON} bg:{GREEN_LIGHT}',
+        Generic.Output: GREY,
+        Generic.Prompt: f'bold {BLUE}',
+        Generic.Strong: 'bold',
+        Generic.EmphStrong: 'bold italic',
+        Generic.Subheading: f'bold {BLUE}',
+        Generic.Traceback: RED_DARK,
+
+        Keyword: f'bold {BLUE}',
+        Keyword.Pseudo: 'nobold',
+        Keyword.Type: PURPLE,
+
+        Name.Attribute: f'italic {BLUE}',
+        Name.Builtin: f'bold {PURPLE}',
+        Name.Class: 'underline',
+        Name.Constant: TURQUOISE,
+        Name.Decorator: f'bold {ORANGE}',
+        Name.Entity: f'bold {PURPLE}',
+        Name.Exception: f'bold {PURPLE}',
+        Name.Function: f'bold {ORANGE}',
+        Name.Tag: f'bold {BLUE}',
+
+        Number: f'bold {PURPLE}',
+
+        Operator: BLUE,
+        Operator.Word: 'bold',
+
+        String: GREEN,
+        String.Doc: 'italic',
+        String.Escape: f'bold {RED_DARK}',
+        String.Other: TURQUOISE,
+        String.Symbol: f'bold {RED_DARK}',
+
+        Text: GREY_DARK,
+
+        Whitespace: GREY_LIGHT
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/rrt.py b/.venv/Lib/site-packages/pygments/styles/rrt.py
new file mode 100644 (file)
index 0000000..1e87d26
--- /dev/null
@@ -0,0 +1,40 @@
+"""
+    pygments.styles.rrt
+    ~~~~~~~~~~~~~~~~~~~
+
+    pygments "rrt" theme, based on Zap and Emacs defaults.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Token, Comment, Name, Keyword, String, Number, Operator
+
+
+__all__ = ['RrtStyle']
+
+
+class RrtStyle(Style):
+    """
+    Minimalistic "rrt" theme, based on Zap and Emacs defaults.
+    """
+
+    name = 'rrt'
+
+    background_color = '#000000'
+    highlight_color = '#0000ff'
+
+    styles = {
+        Token:              '#dddddd',
+        Comment:            '#00ff00',
+        Name.Function:      '#ffff00',
+        Name.Variable:      '#eedd82',
+        Name.Constant:      '#7fffd4',
+        Keyword:            '#ff0000',
+       Operator.Word:      '#ff0000',
+        Comment.Preproc:    '#e5e5e5',
+        String:             '#87ceeb',
+        Keyword.Type:       '#ee82ee',
+        Number:             '#ff00ff',
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/sas.py b/.venv/Lib/site-packages/pygments/styles/sas.py
new file mode 100644 (file)
index 0000000..549a0cc
--- /dev/null
@@ -0,0 +1,46 @@
+"""
+    pygments.styles.sas
+    ~~~~~~~~~~~~~~~~~~~
+
+    Style inspired by SAS' enhanced program editor. Note This is not
+    meant to be a complete style. It's merely meant to mimic SAS'
+    program editor syntax highlighting.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Other, Whitespace, Generic
+
+
+__all__ = ['SasStyle']
+
+
+class SasStyle(Style):
+    """
+    Style inspired by SAS' enhanced program editor. Note This is not
+    meant to be a complete style. It's merely meant to mimic SAS'
+    program editor syntax highlighting.
+    """
+
+    name = 'sas'
+    
+    styles = {
+        Whitespace:            '#bbbbbb',
+        Comment:               'italic #008800',
+        String:                '#800080',
+        Number:                'bold #2c8553',
+        Other:                 'bg:#ffffe0',
+        Keyword:               '#2c2cff',
+        Keyword.Reserved:      'bold #353580',
+        Keyword.Constant:      'bold',
+        Name.Builtin:          '#2c2cff',
+        Name.Function:         'bold italic',
+        Name.Variable:         'bold #2c2cff',
+        Generic:               '#2c2cff',
+        Generic.Emph:          '#008800',
+        Generic.Error:         '#d30202',
+        Error:                 'bg:#e3d2d2 #a61717'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/solarized.py b/.venv/Lib/site-packages/pygments/styles/solarized.py
new file mode 100644 (file)
index 0000000..c051702
--- /dev/null
@@ -0,0 +1,144 @@
+"""
+    pygments.styles.solarized
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Solarized by Camil Staps
+
+    A Pygments style for the Solarized themes (licensed under MIT).
+    See: https://github.com/altercation/solarized
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Comment, Error, Generic, Keyword, Name, Number, \
+    Operator, String, Token
+
+
+__all__ = ['SolarizedLightStyle', 'SolarizedDarkStyle']
+
+
+def make_style(colors):
+    return {
+        Token:               colors['base0'],
+
+        Comment:             'italic ' + colors['base01'],
+        Comment.Hashbang:    colors['base01'],
+        Comment.Multiline:   colors['base01'],
+        Comment.Preproc:     'noitalic ' + colors['magenta'],
+        Comment.PreprocFile: 'noitalic ' + colors['base01'],
+
+        Keyword:             colors['green'],
+        Keyword.Constant:    colors['cyan'],
+        Keyword.Declaration: colors['cyan'],
+        Keyword.Namespace:   colors['orange'],
+        Keyword.Type:        colors['yellow'],
+
+        Operator:            colors['base01'],
+        Operator.Word:       colors['green'],
+
+        Name.Builtin:        colors['blue'],
+        Name.Builtin.Pseudo: colors['blue'],
+        Name.Class:          colors['blue'],
+        Name.Constant:       colors['blue'],
+        Name.Decorator:      colors['blue'],
+        Name.Entity:         colors['blue'],
+        Name.Exception:      colors['blue'],
+        Name.Function:       colors['blue'],
+        Name.Function.Magic: colors['blue'],
+        Name.Label:          colors['blue'],
+        Name.Namespace:      colors['blue'],
+        Name.Tag:            colors['blue'],
+        Name.Variable:       colors['blue'],
+        Name.Variable.Global:colors['blue'],
+        Name.Variable.Magic: colors['blue'],
+
+        String:              colors['cyan'],
+        String.Doc:          colors['base01'],
+        String.Regex:        colors['orange'],
+
+        Number:              colors['cyan'],
+
+        Generic:             colors['base0'],
+        Generic.Deleted:     colors['red'],
+        Generic.Emph:        'italic',
+        Generic.Error:       colors['red'],
+        Generic.Heading:     'bold',
+        Generic.Subheading:  'underline',
+        Generic.Inserted:    colors['green'],
+        Generic.Output:      colors['base0'],
+        Generic.Prompt:      'bold ' + colors['blue'],
+        Generic.Strong:      'bold',
+        Generic.EmphStrong:  'bold italic',
+        Generic.Traceback:   colors['blue'],
+
+        Error:               'bg:' + colors['red'],
+    }
+
+
+DARK_COLORS = {
+    'base03':  '#002b36',
+    'base02':  '#073642',
+    'base01':  '#586e75',
+    'base00':  '#657b83',
+    'base0':   '#839496',
+    'base1':   '#93a1a1',
+    'base2':   '#eee8d5',
+    'base3':   '#fdf6e3',
+    'yellow':  '#b58900',
+    'orange':  '#cb4b16',
+    'red':     '#dc322f',
+    'magenta': '#d33682',
+    'violet':  '#6c71c4',
+    'blue':    '#268bd2',
+    'cyan':    '#2aa198',
+    'green':   '#859900',
+}
+
+LIGHT_COLORS = {
+    'base3':   '#002b36',
+    'base2':   '#073642',
+    'base1':   '#586e75',
+    'base0':   '#657b83',
+    'base00':  '#839496',
+    'base01':  '#93a1a1',
+    'base02':  '#eee8d5',
+    'base03':  '#fdf6e3',
+    'yellow':  '#b58900',
+    'orange':  '#cb4b16',
+    'red':     '#dc322f',
+    'magenta': '#d33682',
+    'violet':  '#6c71c4',
+    'blue':    '#268bd2',
+    'cyan':    '#2aa198',
+    'green':   '#859900',
+}
+
+
+class SolarizedDarkStyle(Style):
+    """
+    The solarized style, dark.
+    """
+
+    name = 'solarized-dark'
+    
+    styles = make_style(DARK_COLORS)
+    background_color = DARK_COLORS['base03']
+    highlight_color = DARK_COLORS['base02']
+    line_number_color = DARK_COLORS['base01']
+    line_number_background_color = DARK_COLORS['base02']
+
+
+class SolarizedLightStyle(SolarizedDarkStyle):
+    """
+    The solarized style, light.
+    """
+
+    name = 'solarized-light'
+    
+    styles = make_style(LIGHT_COLORS)
+    background_color = LIGHT_COLORS['base03']
+    highlight_color = LIGHT_COLORS['base02']
+    line_number_color = LIGHT_COLORS['base01']
+    line_number_background_color = LIGHT_COLORS['base02']
diff --git a/.venv/Lib/site-packages/pygments/styles/staroffice.py b/.venv/Lib/site-packages/pygments/styles/staroffice.py
new file mode 100644 (file)
index 0000000..a21aa41
--- /dev/null
@@ -0,0 +1,31 @@
+"""
+    pygments.styles.staroffice
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Style similar to StarOffice style, also in OpenOffice and LibreOffice.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Comment, Error, Literal, Name, Token
+
+
+__all__ = ['StarofficeStyle']
+
+
+class StarofficeStyle(Style):
+    """
+    Style similar to StarOffice style, also in OpenOffice and LibreOffice.
+    """
+    name = 'staroffice'
+
+    
+    styles = {
+        Token:                  '#000080',   # Blue
+        Comment:                '#696969',   # DimGray
+        Error:                  '#800000',   # Maroon
+        Literal:                '#EE0000',   # Red
+        Name:                   '#008000',   # Green
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/stata_dark.py b/.venv/Lib/site-packages/pygments/styles/stata_dark.py
new file mode 100644 (file)
index 0000000..315c5c6
--- /dev/null
@@ -0,0 +1,42 @@
+"""
+    pygments.styles.stata_dark
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Dark style inspired by Stata's do-file editor. Note this is not
+    meant to be a complete style, just for Stata's file formats.
+
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Token, Keyword, Name, Comment, String, Error, \
+    Number, Operator, Whitespace, Generic
+
+
+__all__ = ['StataDarkStyle']
+
+
+class StataDarkStyle(Style):
+    name = 'stata-dark'
+    
+    background_color = "#232629"
+    highlight_color = "#49483e"
+
+    styles = {
+        Token:                 '#cccccc',
+        Whitespace:            '#bbbbbb',
+        Error:                 'bg:#e3d2d2 #a61717',
+        String:                '#51cc99',
+        Number:                '#4FB8CC',
+        Operator:              '',
+        Name.Function:         '#6a6aff',
+        Name.Other:            '#e2828e',
+        Keyword:               'bold #7686bb',
+        Keyword.Constant:      '',
+        Comment:               'italic #777777',
+        Name.Variable:         'bold #7AB4DB',
+        Name.Variable.Global:  'bold #BE646C',
+        Generic.Prompt:        '#ffffff',
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/stata_light.py b/.venv/Lib/site-packages/pygments/styles/stata_light.py
new file mode 100644 (file)
index 0000000..95d72e2
--- /dev/null
@@ -0,0 +1,42 @@
+"""
+    pygments.styles.stata_light
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Light Style inspired by Stata's do-file editor. Note this is not
+    meant to be a complete style, just for Stata's file formats.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+    Number, Operator, Whitespace, Text
+
+
+__all__ = ['StataLightStyle']
+
+
+class StataLightStyle(Style):
+    """
+    Light mode style inspired by Stata's do-file editor. This is not
+    meant to be a complete style, just for use with Stata.
+    """
+
+    name = 'stata-light'
+    
+    styles = {
+        Text:                  '#111111',
+        Whitespace:            '#bbbbbb',
+        Error:                 'bg:#e3d2d2 #a61717',
+        String:                '#7a2424',
+        Number:                '#2c2cff',
+        Operator:              '',
+        Name.Function:         '#2c2cff',
+        Name.Other:            '#be646c',
+        Keyword:               'bold #353580',
+        Keyword.Constant:      '',
+        Comment:               'italic #008800',
+        Name.Variable:         'bold #35baba',
+        Name.Variable.Global:  'bold #b5565e',
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/tango.py b/.venv/Lib/site-packages/pygments/styles/tango.py
new file mode 100644 (file)
index 0000000..986e3ff
--- /dev/null
@@ -0,0 +1,143 @@
+"""
+    pygments.styles.tango
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    The Crunchy default Style inspired from the color palette from
+    the Tango Icon Theme Guidelines.
+
+    http://tango.freedesktop.org/Tango_Icon_Theme_Guidelines
+
+    Butter:     #fce94f     #edd400     #c4a000
+    Orange:     #fcaf3e     #f57900     #ce5c00
+    Chocolate:  #e9b96e     #c17d11     #8f5902
+    Chameleon:  #8ae234     #73d216     #4e9a06
+    Sky Blue:   #729fcf     #3465a4     #204a87
+    Plum:       #ad7fa8     #75507b     #5c35cc
+    Scarlet Red:#ef2929     #cc0000     #a40000
+    Aluminium:  #eeeeec     #d3d7cf     #babdb6
+                #888a85     #555753     #2e3436
+
+    Not all of the above colors are used; other colors added:
+        very light grey: #f8f8f8  (for background)
+
+    This style can be used as a template as it includes all the known
+    Token types, unlike most (if not all) of the styles included in the
+    Pygments distribution.
+
+    However, since Crunchy is intended to be used by beginners, we have strived
+    to create a style that gloss over subtle distinctions between different
+    categories.
+
+    Taking Python for example, comments (Comment.*) and docstrings (String.Doc)
+    have been chosen to have the same style.  Similarly, keywords (Keyword.*),
+    and Operator.Word (and, or, in) have been assigned the same style.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
+
+
+__all__ = ['TangoStyle']
+
+
+class TangoStyle(Style):
+    """
+    The Crunchy default Style inspired from the color palette from
+    the Tango Icon Theme Guidelines.
+    """
+
+    name = 'tango'
+    
+    background_color = "#f8f8f8"
+
+    styles = {
+        # No corresponding class for the following:
+        #Text:                     "", # class:  ''
+        Whitespace:                "#f8f8f8",      # class: 'w'
+        Error:                     "#a40000 border:#ef2929", # class: 'err'
+        Other:                     "#000000",                # class 'x'
+
+        Comment:                   "italic #8f5902", # class: 'c'
+        Comment.Multiline:         "italic #8f5902", # class: 'cm'
+        Comment.Preproc:           "italic #8f5902", # class: 'cp'
+        Comment.Single:            "italic #8f5902", # class: 'c1'
+        Comment.Special:           "italic #8f5902", # class: 'cs'
+
+        Keyword:                   "bold #204a87",   # class: 'k'
+        Keyword.Constant:          "bold #204a87",   # class: 'kc'
+        Keyword.Declaration:       "bold #204a87",   # class: 'kd'
+        Keyword.Namespace:         "bold #204a87",   # class: 'kn'
+        Keyword.Pseudo:            "bold #204a87",   # class: 'kp'
+        Keyword.Reserved:          "bold #204a87",   # class: 'kr'
+        Keyword.Type:              "bold #204a87",   # class: 'kt'
+
+        Operator:                  "bold #ce5c00",   # class: 'o'
+        Operator.Word:             "bold #204a87",   # class: 'ow' - like keywords
+
+        Punctuation:               "bold #000000",   # class: 'p'
+
+        # because special names such as Name.Class, Name.Function, etc.
+        # are not recognized as such later in the parsing, we choose them
+        # to look the same as ordinary variables.
+        Name:                      "#000000",        # class: 'n'
+        Name.Attribute:            "#c4a000",        # class: 'na' - to be revised
+        Name.Builtin:              "#204a87",        # class: 'nb'
+        Name.Builtin.Pseudo:       "#3465a4",        # class: 'bp'
+        Name.Class:                "#000000",        # class: 'nc' - to be revised
+        Name.Constant:             "#000000",        # class: 'no' - to be revised
+        Name.Decorator:            "bold #5c35cc",   # class: 'nd' - to be revised
+        Name.Entity:               "#ce5c00",        # class: 'ni'
+        Name.Exception:            "bold #cc0000",   # class: 'ne'
+        Name.Function:             "#000000",        # class: 'nf'
+        Name.Property:             "#000000",        # class: 'py'
+        Name.Label:                "#f57900",        # class: 'nl'
+        Name.Namespace:            "#000000",        # class: 'nn' - to be revised
+        Name.Other:                "#000000",        # class: 'nx'
+        Name.Tag:                  "bold #204a87",   # class: 'nt' - like a keyword
+        Name.Variable:             "#000000",        # class: 'nv' - to be revised
+        Name.Variable.Class:       "#000000",        # class: 'vc' - to be revised
+        Name.Variable.Global:      "#000000",        # class: 'vg' - to be revised
+        Name.Variable.Instance:    "#000000",        # class: 'vi' - to be revised
+
+        # since the tango light blue does not show up well in text, we choose
+        # a pure blue instead.
+        Number:                    "bold #0000cf",   # class: 'm'
+        Number.Float:              "bold #0000cf",   # class: 'mf'
+        Number.Hex:                "bold #0000cf",   # class: 'mh'
+        Number.Integer:            "bold #0000cf",   # class: 'mi'
+        Number.Integer.Long:       "bold #0000cf",   # class: 'il'
+        Number.Oct:                "bold #0000cf",   # class: 'mo'
+
+        Literal:                   "#000000",        # class: 'l'
+        Literal.Date:              "#000000",        # class: 'ld'
+
+        String:                    "#4e9a06",        # class: 's'
+        String.Backtick:           "#4e9a06",        # class: 'sb'
+        String.Char:               "#4e9a06",        # class: 'sc'
+        String.Doc:                "italic #8f5902", # class: 'sd' - like a comment
+        String.Double:             "#4e9a06",        # class: 's2'
+        String.Escape:             "#4e9a06",        # class: 'se'
+        String.Heredoc:            "#4e9a06",        # class: 'sh'
+        String.Interpol:           "#4e9a06",        # class: 'si'
+        String.Other:              "#4e9a06",        # class: 'sx'
+        String.Regex:              "#4e9a06",        # class: 'sr'
+        String.Single:             "#4e9a06",        # class: 's1'
+        String.Symbol:             "#4e9a06",        # class: 'ss'
+
+        Generic:                   "#000000",        # class: 'g'
+        Generic.Deleted:           "#a40000",        # class: 'gd'
+        Generic.Emph:              "italic #000000", # class: 'ge'
+        Generic.Error:             "#ef2929",        # class: 'gr'
+        Generic.Heading:           "bold #000080",   # class: 'gh'
+        Generic.Inserted:          "#00A000",        # class: 'gi'
+        Generic.Output:            "italic #000000", # class: 'go'
+        Generic.Prompt:            "#8f5902",        # class: 'gp'
+        Generic.Strong:            "bold #000000",   # class: 'gs'
+        Generic.EmphStrong:        "bold italic #000000",  # class: 'ges'
+        Generic.Subheading:        "bold #800080",   # class: 'gu'
+        Generic.Traceback:         "bold #a40000",   # class: 'gt'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/trac.py b/.venv/Lib/site-packages/pygments/styles/trac.py
new file mode 100644 (file)
index 0000000..2dbffa4
--- /dev/null
@@ -0,0 +1,66 @@
+"""
+    pygments.styles.trac
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Port of the default trac highlighter design.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace
+
+
+__all__ = ['TracStyle']
+
+
+class TracStyle(Style):
+    """
+    Port of the default trac highlighter design.
+    """
+
+    name = 'trac'
+    
+    styles = {
+        Whitespace:             '#bbbbbb',
+        Comment:                'italic #999988',
+        Comment.Preproc:        'bold noitalic #999999',
+        Comment.Special:        'bold #999999',
+
+        Operator:               'bold',
+
+        String:                 '#bb8844',
+        String.Regex:           '#808000',
+
+        Number:                 '#009999',
+
+        Keyword:                'bold',
+        Keyword.Type:           '#445588',
+
+        Name.Builtin:           '#999999',
+        Name.Function:          'bold #990000',
+        Name.Class:             'bold #445588',
+        Name.Exception:         'bold #990000',
+        Name.Namespace:         '#555555',
+        Name.Variable:          '#008080',
+        Name.Constant:          '#008080',
+        Name.Tag:               '#000080',
+        Name.Attribute:         '#008080',
+        Name.Entity:            '#800080',
+
+        Generic.Heading:        '#999999',
+        Generic.Subheading:     '#aaaaaa',
+        Generic.Deleted:        'bg:#ffdddd #000000',
+        Generic.Inserted:       'bg:#ddffdd #000000',
+        Generic.Error:          '#aa0000',
+        Generic.Emph:           'italic',
+        Generic.Strong:         'bold',
+        Generic.EmphStrong:     'bold italic',
+        Generic.Prompt:         '#555555',
+        Generic.Output:         '#888888',
+        Generic.Traceback:      '#aa0000',
+
+        Error:                  'bg:#e3d2d2 #a61717'
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/vim.py b/.venv/Lib/site-packages/pygments/styles/vim.py
new file mode 100644 (file)
index 0000000..6b53d00
--- /dev/null
@@ -0,0 +1,67 @@
+"""
+    pygments.styles.vim
+    ~~~~~~~~~~~~~~~~~~~
+
+    A highlighting style for Pygments, inspired by vim.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Generic, Whitespace, Token
+
+
+__all__ = ['VimStyle']
+
+
+class VimStyle(Style):
+    """
+    Styles somewhat like vim 7.0
+    """
+
+    name = 'vim'
+    
+    background_color = "#000000"
+    highlight_color = "#222222"
+
+    styles = {
+        Token:                     "#cccccc",
+        Whitespace:                "",
+        Comment:                   "#000080",
+        Comment.Preproc:           "",
+        Comment.Special:           "bold #cd0000",
+
+        Keyword:                   "#cdcd00",
+        Keyword.Declaration:       "#00cd00",
+        Keyword.Namespace:         "#cd00cd",
+        Keyword.Pseudo:            "",
+        Keyword.Type:              "#00cd00",
+
+        Operator:                  "#3399cc",
+        Operator.Word:             "#cdcd00",
+
+        Name:                      "",
+        Name.Class:                "#00cdcd",
+        Name.Builtin:              "#cd00cd",
+        Name.Exception:            "bold #666699",
+        Name.Variable:             "#00cdcd",
+
+        String:                    "#cd0000",
+        Number:                    "#cd00cd",
+
+        Generic.Heading:           "bold #000080",
+        Generic.Subheading:        "bold #800080",
+        Generic.Deleted:           "#cd0000",
+        Generic.Inserted:          "#00cd00",
+        Generic.Error:             "#FF0000",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.EmphStrong:        "bold italic",
+        Generic.Prompt:            "bold #000080",
+        Generic.Output:            "#888",
+        Generic.Traceback:         "#04D",
+
+        Error:                     "border:#FF0000"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/vs.py b/.venv/Lib/site-packages/pygments/styles/vs.py
new file mode 100644 (file)
index 0000000..9ac18c7
--- /dev/null
@@ -0,0 +1,41 @@
+"""
+    pygments.styles.vs
+    ~~~~~~~~~~~~~~~~~~
+
+    Simple style with MS Visual Studio colors.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Operator, Generic
+
+
+__all__ = ['VisualStudioStyle']
+
+
+class VisualStudioStyle(Style):
+    name = 'vs'
+    
+    background_color = "#ffffff"
+
+    styles = {
+        Comment:                   "#008000",
+        Comment.Preproc:           "#0000ff",
+        Keyword:                   "#0000ff",
+        Operator.Word:             "#0000ff",
+        Keyword.Type:              "#2b91af",
+        Name.Class:                "#2b91af",
+        String:                    "#a31515",
+
+        Generic.Heading:           "bold",
+        Generic.Subheading:        "bold",
+        Generic.Emph:              "italic",
+        Generic.Strong:            "bold",
+        Generic.EmphStrong:        "bold italic",
+        Generic.Prompt:            "bold",
+
+        Error:                     "border:#FF0000"
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/xcode.py b/.venv/Lib/site-packages/pygments/styles/xcode.py
new file mode 100644 (file)
index 0000000..9ef7c8f
--- /dev/null
@@ -0,0 +1,53 @@
+"""
+    pygments.styles.xcode
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Style similar to the `Xcode` default theme.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+     Number, Operator, Literal
+
+
+__all__ = ['XcodeStyle']
+
+
+class XcodeStyle(Style):
+    """
+    Style similar to the Xcode default colouring theme.
+    """
+
+    name = 'xcode'
+    
+    styles = {
+        Comment:                '#177500',
+        Comment.Preproc:        '#633820',
+
+        String:                 '#C41A16',
+        String.Char:            '#2300CE',
+
+        Operator:               '#000000',
+
+        Keyword:                '#A90D91',
+
+        Name:                   '#000000',
+        Name.Attribute:         '#836C28',
+        Name.Class:             '#3F6E75',
+        Name.Function:          '#000000',
+        Name.Builtin:           '#A90D91',
+        # In Obj-C code this token is used to colour Cocoa types
+        Name.Builtin.Pseudo:    '#5B269A',
+        Name.Variable:          '#000000',
+        Name.Tag:               '#000000',
+        Name.Decorator:         '#000000',
+        # Workaround for a BUG here: lexer treats multiline method signatres as labels
+        Name.Label:             '#000000',
+
+        Literal:                '#1C01CE',
+        Number:                 '#1C01CE',
+        Error:                  '#000000',
+    }
diff --git a/.venv/Lib/site-packages/pygments/styles/zenburn.py b/.venv/Lib/site-packages/pygments/styles/zenburn.py
new file mode 100644 (file)
index 0000000..4d0e056
--- /dev/null
@@ -0,0 +1,83 @@
+"""
+    pygments.styles.zenburn
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Low contrast color scheme Zenburn.
+
+    See: https://kippura.org/zenburnpage/
+         https://github.com/jnurmine/Zenburn
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.style import Style
+from pygments.token import Token, Name, Operator, Keyword, Generic, Comment, \
+    Number, String, Literal, Punctuation, Error
+
+
+__all__ = ['ZenburnStyle']
+
+
+class ZenburnStyle(Style):
+    """
+    Low contrast Zenburn style.
+    """
+
+    name = 'zenburn'
+    
+    background_color = '#3f3f3f'
+    highlight_color = '#484848'
+    line_number_color = '#5d6262'
+    line_number_background_color = '#353535'
+    line_number_special_color = '#7a8080'
+    line_number_special_background_color = '#353535'
+
+    styles = {
+        Token: '#dcdccc',
+        Error: '#e37170 bold',
+
+        Keyword: '#efdcbc',
+        Keyword.Type: '#dfdfbf bold',
+        Keyword.Constant: '#dca3a3',
+        Keyword.Declaration: '#f0dfaf',
+        Keyword.Namespace: '#f0dfaf',
+
+        Name: '#dcdccc',
+        Name.Tag: '#e89393 bold',
+        Name.Entity: '#cfbfaf',
+        Name.Constant: '#dca3a3',
+        Name.Class: '#efef8f',
+        Name.Function: '#efef8f',
+        Name.Builtin: '#efef8f',
+        Name.Builtin.Pseudo: '#dcdccc',
+        Name.Attribute: '#efef8f',
+        Name.Exception: '#c3bf9f bold',
+
+        Literal: '#9fafaf',
+
+        String: '#cc9393',
+        String.Doc: '#7f9f7f',
+        String.Interpol: '#dca3a3 bold',
+
+        Number: '#8cd0d3',
+        Number.Float: '#c0bed1',
+
+        Operator: '#f0efd0',
+
+        Punctuation: '#f0efd0',
+
+        Comment: '#7f9f7f italic',
+        Comment.Preproc: '#dfaf8f bold',
+        Comment.PreprocFile: '#cc9393',
+        Comment.Special: '#dfdfdf bold',
+
+        Generic: '#ecbcbc bold',
+        Generic.Emph: '#ffffff bold',
+        Generic.Output: '#5b605e bold',
+        Generic.Heading: '#efefef bold',
+        Generic.Deleted: '#c3bf9f bg:#313c36',
+        Generic.Inserted: '#709080 bg:#313c36 bold',
+        Generic.Traceback: '#80d4aa bg:#2f2f2f bold',
+        Generic.Subheading: '#efefef bold',
+    }
diff --git a/.venv/Lib/site-packages/pygments/token.py b/.venv/Lib/site-packages/pygments/token.py
new file mode 100644 (file)
index 0000000..2f3b97e
--- /dev/null
@@ -0,0 +1,214 @@
+"""
+    pygments.token
+    ~~~~~~~~~~~~~~
+
+    Basic token types and the standard tokens.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+
+class _TokenType(tuple):
+    parent = None
+
+    def split(self):
+        buf = []
+        node = self
+        while node is not None:
+            buf.append(node)
+            node = node.parent
+        buf.reverse()
+        return buf
+
+    def __init__(self, *args):
+        # no need to call super.__init__
+        self.subtypes = set()
+
+    def __contains__(self, val):
+        return self is val or (
+            type(val) is self.__class__ and
+            val[:len(self)] == self
+        )
+
+    def __getattr__(self, val):
+        if not val or not val[0].isupper():
+            return tuple.__getattribute__(self, val)
+        new = _TokenType(self + (val,))
+        setattr(self, val, new)
+        self.subtypes.add(new)
+        new.parent = self
+        return new
+
+    def __repr__(self):
+        return 'Token' + (self and '.' or '') + '.'.join(self)
+
+    def __copy__(self):
+        # These instances are supposed to be singletons
+        return self
+
+    def __deepcopy__(self, memo):
+        # These instances are supposed to be singletons
+        return self
+
+
+Token = _TokenType()
+
+# Special token types
+Text = Token.Text
+Whitespace = Text.Whitespace
+Escape = Token.Escape
+Error = Token.Error
+# Text that doesn't belong to this lexer (e.g. HTML in PHP)
+Other = Token.Other
+
+# Common token types for source code
+Keyword = Token.Keyword
+Name = Token.Name
+Literal = Token.Literal
+String = Literal.String
+Number = Literal.Number
+Punctuation = Token.Punctuation
+Operator = Token.Operator
+Comment = Token.Comment
+
+# Generic types for non-source code
+Generic = Token.Generic
+
+# String and some others are not direct children of Token.
+# alias them:
+Token.Token = Token
+Token.String = String
+Token.Number = Number
+
+
+def is_token_subtype(ttype, other):
+    """
+    Return True if ``ttype`` is a subtype of ``other``.
+
+    exists for backwards compatibility. use ``ttype in other`` now.
+    """
+    return ttype in other
+
+
+def string_to_tokentype(s):
+    """
+    Convert a string into a token type::
+
+        >>> string_to_token('String.Double')
+        Token.Literal.String.Double
+        >>> string_to_token('Token.Literal.Number')
+        Token.Literal.Number
+        >>> string_to_token('')
+        Token
+
+    Tokens that are already tokens are returned unchanged:
+
+        >>> string_to_token(String)
+        Token.Literal.String
+    """
+    if isinstance(s, _TokenType):
+        return s
+    if not s:
+        return Token
+    node = Token
+    for item in s.split('.'):
+        node = getattr(node, item)
+    return node
+
+
+# Map standard token types to short names, used in CSS class naming.
+# If you add a new item, please be sure to run this file to perform
+# a consistency check for duplicate values.
+STANDARD_TYPES = {
+    Token:                         '',
+
+    Text:                          '',
+    Whitespace:                    'w',
+    Escape:                        'esc',
+    Error:                         'err',
+    Other:                         'x',
+
+    Keyword:                       'k',
+    Keyword.Constant:              'kc',
+    Keyword.Declaration:           'kd',
+    Keyword.Namespace:             'kn',
+    Keyword.Pseudo:                'kp',
+    Keyword.Reserved:              'kr',
+    Keyword.Type:                  'kt',
+
+    Name:                          'n',
+    Name.Attribute:                'na',
+    Name.Builtin:                  'nb',
+    Name.Builtin.Pseudo:           'bp',
+    Name.Class:                    'nc',
+    Name.Constant:                 'no',
+    Name.Decorator:                'nd',
+    Name.Entity:                   'ni',
+    Name.Exception:                'ne',
+    Name.Function:                 'nf',
+    Name.Function.Magic:           'fm',
+    Name.Property:                 'py',
+    Name.Label:                    'nl',
+    Name.Namespace:                'nn',
+    Name.Other:                    'nx',
+    Name.Tag:                      'nt',
+    Name.Variable:                 'nv',
+    Name.Variable.Class:           'vc',
+    Name.Variable.Global:          'vg',
+    Name.Variable.Instance:        'vi',
+    Name.Variable.Magic:           'vm',
+
+    Literal:                       'l',
+    Literal.Date:                  'ld',
+
+    String:                        's',
+    String.Affix:                  'sa',
+    String.Backtick:               'sb',
+    String.Char:                   'sc',
+    String.Delimiter:              'dl',
+    String.Doc:                    'sd',
+    String.Double:                 's2',
+    String.Escape:                 'se',
+    String.Heredoc:                'sh',
+    String.Interpol:               'si',
+    String.Other:                  'sx',
+    String.Regex:                  'sr',
+    String.Single:                 's1',
+    String.Symbol:                 'ss',
+
+    Number:                        'm',
+    Number.Bin:                    'mb',
+    Number.Float:                  'mf',
+    Number.Hex:                    'mh',
+    Number.Integer:                'mi',
+    Number.Integer.Long:           'il',
+    Number.Oct:                    'mo',
+
+    Operator:                      'o',
+    Operator.Word:                 'ow',
+
+    Punctuation:                   'p',
+    Punctuation.Marker:            'pm',
+
+    Comment:                       'c',
+    Comment.Hashbang:              'ch',
+    Comment.Multiline:             'cm',
+    Comment.Preproc:               'cp',
+    Comment.PreprocFile:           'cpf',
+    Comment.Single:                'c1',
+    Comment.Special:               'cs',
+
+    Generic:                       'g',
+    Generic.Deleted:               'gd',
+    Generic.Emph:                  'ge',
+    Generic.Error:                 'gr',
+    Generic.Heading:               'gh',
+    Generic.Inserted:              'gi',
+    Generic.Output:                'go',
+    Generic.Prompt:                'gp',
+    Generic.Strong:                'gs',
+    Generic.Subheading:            'gu',
+    Generic.EmphStrong:            'ges',
+    Generic.Traceback:             'gt',
+}
diff --git a/.venv/Lib/site-packages/pygments/unistring.py b/.venv/Lib/site-packages/pygments/unistring.py
new file mode 100644 (file)
index 0000000..e3bd2e7
--- /dev/null
@@ -0,0 +1,153 @@
+"""
+    pygments.unistring
+    ~~~~~~~~~~~~~~~~~~
+
+    Strings of all Unicode characters of a certain category.
+    Used for matching in Unicode-aware languages. Run to regenerate.
+
+    Inspired by chartypes_create.py from the MoinMoin project.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+Cc = '\x00-\x1f\x7f-\x9f'
+
+Cf = '\xad\u0600-\u0605\u061c\u06dd\u070f\u08e2\u180e\u200b-\u200f\u202a-\u202e\u2060-\u2064\u2066-\u206f\ufeff\ufff9-\ufffb\U000110bd\U000110cd\U0001bca0-\U0001bca3\U0001d173-\U0001d17a\U000e0001\U000e0020-\U000e007f'
+
+Cn = '\u0378-\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557-\u0558\u058b-\u058c\u0590\u05c8-\u05cf\u05eb-\u05ee\u05f5-\u05ff\u061d\u070e\u074b-\u074c\u07b2-\u07bf\u07fb-\u07fc\u082e-\u082f\u083f\u085c-\u085d\u085f\u086b-\u089f\u08b5\u08be-\u08d2\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09c5-\u09c6\u09c9-\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09ff-\u0a00\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a77-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0acf\u0ad1-\u0adf\u0ae4-\u0ae5\u0af2-\u0af8\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34\u0b3a-\u0b3b\u0b45-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64-\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64-\u0c65\u0c70-\u0c77\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4-\u0ce5\u0cf0\u0cf3-\u0cff\u0d04\u0d0d\u0d11\u0d45\u0d49\u0d50-\u0d53\u0d64-\u0d65\u0d80-\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe-\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce-\u10cf\u1249\u124e-\u124f\u1257\u1259\u125e-\u125f\u1289\u128e-\u128f\u12b1\u12b6-\u12b7\u12bf\u12c1\u12c6-\u12c7\u12d7\u1311\u1316-\u1317\u135b-\u135c\u137d-\u137f\u139a-\u139f\u13f6-\u13f7\u13fe-\u13ff\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de-\u17df\u17ea-\u17ef\u17fa-\u17ff\u180f\u181a-\u181f\u1879-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e-\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c-\u1a1d\u1a5f\u1a7d-\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c89-\u1c8f\u1cbb-\u1cbc\u1cc8-\u1ccf\u1cfa-\u1cff\u1dfa\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fc5\u1fd4-\u1fd5\u1fdc\u1ff0-\u1ff1\u1ff5\u1fff\u2065\u2072-\u2073\u208f\u209d-\u209f\u20c0-\u20cf\u20f1-\u20ff\u218c-\u218f\u2427-\u243f\u244b-\u245f\u2b74-\u2b75\u2b96-\u2b97\u2bc9\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e-\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e4f-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u2fff\u3040\u3097-\u3098\u3100-\u3104\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9ff0-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7ba-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c6-\ua8cd\ua8da-\ua8df\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e-\uaa4f\uaa5a-\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07-\uab08\uab0f-\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee-\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\ud7ff\ufa6e-\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90-\ufd91\ufdc8-\ufdef\ufdfe-\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\ufefe\uff00\uffbf-\uffc1\uffc8-\uffc9\uffd0-\uffd1\uffd8-\uffd9\uffdd-\uffdf\uffe7\uffef-\ufff8\ufffe-\uffff\U0001000c\U00010027\U0001003b\U0001003e\U0001004e-\U0001004f\U0001005e-\U0001007f\U000100fb-\U000100ff\U00010103-\U00010106\U00010134-\U00010136\U0001018f\U0001019c-\U0001019f\U000101a1-\U000101cf\U000101fe-\U0001027f\U0001029d-\U0001029f\U000102d1-\U000102df\U000102fc-\U000102ff\U00010324-\U0001032c\U0001034b-\U0001034f\U0001037b-\U0001037f\U0001039e\U000103c4-\U000103c7\U000103d6-\U000103ff\U0001049e-\U0001049f\U000104aa-\U000104af\U000104d4-\U000104d7\U000104fc-\U000104ff\U00010528-\U0001052f\U00010564-\U0001056e\U00010570-\U000105ff\U00010737-\U0001073f\U00010756-\U0001075f\U00010768-\U000107ff\U00010806-\U00010807\U00010809\U00010836\U00010839-\U0001083b\U0001083d-\U0001083e\U00010856\U0001089f-\U000108a6\U000108b0-\U000108df\U000108f3\U000108f6-\U000108fa\U0001091c-\U0001091e\U0001093a-\U0001093e\U00010940-\U0001097f\U000109b8-\U000109bb\U000109d0-\U000109d1\U00010a04\U00010a07-\U00010a0b\U00010a14\U00010a18\U00010a36-\U00010a37\U00010a3b-\U00010a3e\U00010a49-\U00010a4f\U00010a59-\U00010a5f\U00010aa0-\U00010abf\U00010ae7-\U00010aea\U00010af7-\U00010aff\U00010b36-\U00010b38\U00010b56-\U00010b57\U00010b73-\U00010b77\U00010b92-\U00010b98\U00010b9d-\U00010ba8\U00010bb0-\U00010bff\U00010c49-\U00010c7f\U00010cb3-\U00010cbf\U00010cf3-\U00010cf9\U00010d28-\U00010d2f\U00010d3a-\U00010e5f\U00010e7f-\U00010eff\U00010f28-\U00010f2f\U00010f5a-\U00010fff\U0001104e-\U00011051\U00011070-\U0001107e\U000110c2-\U000110cc\U000110ce-\U000110cf\U000110e9-\U000110ef\U000110fa-\U000110ff\U00011135\U00011147-\U0001114f\U00011177-\U0001117f\U000111ce-\U000111cf\U000111e0\U000111f5-\U000111ff\U00011212\U0001123f-\U0001127f\U00011287\U00011289\U0001128e\U0001129e\U000112aa-\U000112af\U000112eb-\U000112ef\U000112fa-\U000112ff\U00011304\U0001130d-\U0001130e\U00011311-\U00011312\U00011329\U00011331\U00011334\U0001133a\U00011345-\U00011346\U00011349-\U0001134a\U0001134e-\U0001134f\U00011351-\U00011356\U00011358-\U0001135c\U00011364-\U00011365\U0001136d-\U0001136f\U00011375-\U000113ff\U0001145a\U0001145c\U0001145f-\U0001147f\U000114c8-\U000114cf\U000114da-\U0001157f\U000115b6-\U000115b7\U000115de-\U000115ff\U00011645-\U0001164f\U0001165a-\U0001165f\U0001166d-\U0001167f\U000116b8-\U000116bf\U000116ca-\U000116ff\U0001171b-\U0001171c\U0001172c-\U0001172f\U00011740-\U000117ff\U0001183c-\U0001189f\U000118f3-\U000118fe\U00011900-\U000119ff\U00011a48-\U00011a4f\U00011a84-\U00011a85\U00011aa3-\U00011abf\U00011af9-\U00011bff\U00011c09\U00011c37\U00011c46-\U00011c4f\U00011c6d-\U00011c6f\U00011c90-\U00011c91\U00011ca8\U00011cb7-\U00011cff\U00011d07\U00011d0a\U00011d37-\U00011d39\U00011d3b\U00011d3e\U00011d48-\U00011d4f\U00011d5a-\U00011d5f\U00011d66\U00011d69\U00011d8f\U00011d92\U00011d99-\U00011d9f\U00011daa-\U00011edf\U00011ef9-\U00011fff\U0001239a-\U000123ff\U0001246f\U00012475-\U0001247f\U00012544-\U00012fff\U0001342f-\U000143ff\U00014647-\U000167ff\U00016a39-\U00016a3f\U00016a5f\U00016a6a-\U00016a6d\U00016a70-\U00016acf\U00016aee-\U00016aef\U00016af6-\U00016aff\U00016b46-\U00016b4f\U00016b5a\U00016b62\U00016b78-\U00016b7c\U00016b90-\U00016e3f\U00016e9b-\U00016eff\U00016f45-\U00016f4f\U00016f7f-\U00016f8e\U00016fa0-\U00016fdf\U00016fe2-\U00016fff\U000187f2-\U000187ff\U00018af3-\U0001afff\U0001b11f-\U0001b16f\U0001b2fc-\U0001bbff\U0001bc6b-\U0001bc6f\U0001bc7d-\U0001bc7f\U0001bc89-\U0001bc8f\U0001bc9a-\U0001bc9b\U0001bca4-\U0001cfff\U0001d0f6-\U0001d0ff\U0001d127-\U0001d128\U0001d1e9-\U0001d1ff\U0001d246-\U0001d2df\U0001d2f4-\U0001d2ff\U0001d357-\U0001d35f\U0001d379-\U0001d3ff\U0001d455\U0001d49d\U0001d4a0-\U0001d4a1\U0001d4a3-\U0001d4a4\U0001d4a7-\U0001d4a8\U0001d4ad\U0001d4ba\U0001d4bc\U0001d4c4\U0001d506\U0001d50b-\U0001d50c\U0001d515\U0001d51d\U0001d53a\U0001d53f\U0001d545\U0001d547-\U0001d549\U0001d551\U0001d6a6-\U0001d6a7\U0001d7cc-\U0001d7cd\U0001da8c-\U0001da9a\U0001daa0\U0001dab0-\U0001dfff\U0001e007\U0001e019-\U0001e01a\U0001e022\U0001e025\U0001e02b-\U0001e7ff\U0001e8c5-\U0001e8c6\U0001e8d7-\U0001e8ff\U0001e94b-\U0001e94f\U0001e95a-\U0001e95d\U0001e960-\U0001ec70\U0001ecb5-\U0001edff\U0001ee04\U0001ee20\U0001ee23\U0001ee25-\U0001ee26\U0001ee28\U0001ee33\U0001ee38\U0001ee3a\U0001ee3c-\U0001ee41\U0001ee43-\U0001ee46\U0001ee48\U0001ee4a\U0001ee4c\U0001ee50\U0001ee53\U0001ee55-\U0001ee56\U0001ee58\U0001ee5a\U0001ee5c\U0001ee5e\U0001ee60\U0001ee63\U0001ee65-\U0001ee66\U0001ee6b\U0001ee73\U0001ee78\U0001ee7d\U0001ee7f\U0001ee8a\U0001ee9c-\U0001eea0\U0001eea4\U0001eeaa\U0001eebc-\U0001eeef\U0001eef2-\U0001efff\U0001f02c-\U0001f02f\U0001f094-\U0001f09f\U0001f0af-\U0001f0b0\U0001f0c0\U0001f0d0\U0001f0f6-\U0001f0ff\U0001f10d-\U0001f10f\U0001f16c-\U0001f16f\U0001f1ad-\U0001f1e5\U0001f203-\U0001f20f\U0001f23c-\U0001f23f\U0001f249-\U0001f24f\U0001f252-\U0001f25f\U0001f266-\U0001f2ff\U0001f6d5-\U0001f6df\U0001f6ed-\U0001f6ef\U0001f6fa-\U0001f6ff\U0001f774-\U0001f77f\U0001f7d9-\U0001f7ff\U0001f80c-\U0001f80f\U0001f848-\U0001f84f\U0001f85a-\U0001f85f\U0001f888-\U0001f88f\U0001f8ae-\U0001f8ff\U0001f90c-\U0001f90f\U0001f93f\U0001f971-\U0001f972\U0001f977-\U0001f979\U0001f97b\U0001f9a3-\U0001f9af\U0001f9ba-\U0001f9bf\U0001f9c3-\U0001f9cf\U0001fa00-\U0001fa5f\U0001fa6e-\U0001ffff\U0002a6d7-\U0002a6ff\U0002b735-\U0002b73f\U0002b81e-\U0002b81f\U0002cea2-\U0002ceaf\U0002ebe1-\U0002f7ff\U0002fa1e-\U000e0000\U000e0002-\U000e001f\U000e0080-\U000e00ff\U000e01f0-\U000effff\U000ffffe-\U000fffff\U0010fffe-\U0010ffff'
+
+Co = '\ue000-\uf8ff\U000f0000-\U000ffffd\U00100000-\U0010fffd'
+
+Cs = '\ud800-\udbff\\\udc00\udc01-\udfff'
+
+Ll = 'a-z\xb5\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137-\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148-\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c-\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa-\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9-\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc-\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef-\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f-\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02af\u0371\u0373\u0377\u037b-\u037d\u0390\u03ac-\u03ce\u03d0-\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb-\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce-\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0560-\u0588\u10d0-\u10fa\u10fd-\u10ff\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1d2b\u1d6b-\u1d77\u1d79-\u1d9a\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6-\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fc7\u1fd0-\u1fd3\u1fd6-\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6-\u1ff7\u210a\u210e-\u210f\u2113\u212f\u2134\u2139\u213c-\u213d\u2146-\u2149\u214e\u2184\u2c30-\u2c5e\u2c61\u2c65-\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73-\u2c74\u2c76-\u2c7b\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3-\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f\ua771-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7af\ua7b5\ua7b7\ua7b9\ua7fa\uab30-\uab5a\uab60-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a\U00010428-\U0001044f\U000104d8-\U000104fb\U00010cc0-\U00010cf2\U000118c0-\U000118df\U00016e60-\U00016e7f\U0001d41a-\U0001d433\U0001d44e-\U0001d454\U0001d456-\U0001d467\U0001d482-\U0001d49b\U0001d4b6-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d4cf\U0001d4ea-\U0001d503\U0001d51e-\U0001d537\U0001d552-\U0001d56b\U0001d586-\U0001d59f\U0001d5ba-\U0001d5d3\U0001d5ee-\U0001d607\U0001d622-\U0001d63b\U0001d656-\U0001d66f\U0001d68a-\U0001d6a5\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6e1\U0001d6fc-\U0001d714\U0001d716-\U0001d71b\U0001d736-\U0001d74e\U0001d750-\U0001d755\U0001d770-\U0001d788\U0001d78a-\U0001d78f\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7c9\U0001d7cb\U0001e922-\U0001e943'
+
+Lm = '\u02b0-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0374\u037a\u0559\u0640\u06e5-\u06e6\u07f4-\u07f5\u07fa\u081a\u0824\u0828\u0971\u0e46\u0ec6\u10fc\u17d7\u1843\u1aa7\u1c78-\u1c7d\u1d2c-\u1d6a\u1d78\u1d9b-\u1dbf\u2071\u207f\u2090-\u209c\u2c7c-\u2c7d\u2d6f\u2e2f\u3005\u3031-\u3035\u303b\u309d-\u309e\u30fc-\u30fe\ua015\ua4f8-\ua4fd\ua60c\ua67f\ua69c-\ua69d\ua717-\ua71f\ua770\ua788\ua7f8-\ua7f9\ua9cf\ua9e6\uaa70\uaadd\uaaf3-\uaaf4\uab5c-\uab5f\uff70\uff9e-\uff9f\U00016b40-\U00016b43\U00016f93-\U00016f9f\U00016fe0-\U00016fe1'
+
+Lo = '\xaa\xba\u01bb\u01c0-\u01c3\u0294\u05d0-\u05ea\u05ef-\u05f2\u0620-\u063f\u0641-\u064a\u066e-\u066f\u0671-\u06d3\u06d5\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u0800-\u0815\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u09fc\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0af9\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60-\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0cf1-\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32-\u0e33\u0e40-\u0e45\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2-\u0eb3\u0ebd\u0ec0-\u0ec4\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u1100-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16f1-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17dc\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c77\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5-\u1cf6\u2135-\u2138\u2d30-\u2d67\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3006\u303c\u3041-\u3096\u309f\u30a1-\u30fa\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua014\ua016-\ua48c\ua4d0-\ua4f7\ua500-\ua60b\ua610-\ua61f\ua62a-\ua62b\ua66e\ua6a0-\ua6e5\ua78f\ua7f7\ua7fb-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd-\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9e0-\ua9e4\ua9e7-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa6f\uaa71-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadc\uaae0-\uaaea\uaaf2\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff66-\uff6f\uff71-\uff9d\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010280-\U0001029c\U000102a0-\U000102d0\U00010300-\U0001031f\U0001032d-\U00010340\U00010342-\U00010349\U00010350-\U00010375\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U00010450-\U0001049d\U00010500-\U00010527\U00010530-\U00010563\U00010600-\U00010736\U00010740-\U00010755\U00010760-\U00010767\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010860-\U00010876\U00010880-\U0001089e\U000108e0-\U000108f2\U000108f4-\U000108f5\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00\U00010a10-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a35\U00010a60-\U00010a7c\U00010a80-\U00010a9c\U00010ac0-\U00010ac7\U00010ac9-\U00010ae4\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010b80-\U00010b91\U00010c00-\U00010c48\U00010d00-\U00010d23\U00010f00-\U00010f1c\U00010f27\U00010f30-\U00010f45\U00011003-\U00011037\U00011083-\U000110af\U000110d0-\U000110e8\U00011103-\U00011126\U00011144\U00011150-\U00011172\U00011176\U00011183-\U000111b2\U000111c1-\U000111c4\U000111da\U000111dc\U00011200-\U00011211\U00011213-\U0001122b\U00011280-\U00011286\U00011288\U0001128a-\U0001128d\U0001128f-\U0001129d\U0001129f-\U000112a8\U000112b0-\U000112de\U00011305-\U0001130c\U0001130f-\U00011310\U00011313-\U00011328\U0001132a-\U00011330\U00011332-\U00011333\U00011335-\U00011339\U0001133d\U00011350\U0001135d-\U00011361\U00011400-\U00011434\U00011447-\U0001144a\U00011480-\U000114af\U000114c4-\U000114c5\U000114c7\U00011580-\U000115ae\U000115d8-\U000115db\U00011600-\U0001162f\U00011644\U00011680-\U000116aa\U00011700-\U0001171a\U00011800-\U0001182b\U000118ff\U00011a00\U00011a0b-\U00011a32\U00011a3a\U00011a50\U00011a5c-\U00011a83\U00011a86-\U00011a89\U00011a9d\U00011ac0-\U00011af8\U00011c00-\U00011c08\U00011c0a-\U00011c2e\U00011c40\U00011c72-\U00011c8f\U00011d00-\U00011d06\U00011d08-\U00011d09\U00011d0b-\U00011d30\U00011d46\U00011d60-\U00011d65\U00011d67-\U00011d68\U00011d6a-\U00011d89\U00011d98\U00011ee0-\U00011ef2\U00012000-\U00012399\U00012480-\U00012543\U00013000-\U0001342e\U00014400-\U00014646\U00016800-\U00016a38\U00016a40-\U00016a5e\U00016ad0-\U00016aed\U00016b00-\U00016b2f\U00016b63-\U00016b77\U00016b7d-\U00016b8f\U00016f00-\U00016f44\U00016f50\U00017000-\U000187f1\U00018800-\U00018af2\U0001b000-\U0001b11e\U0001b170-\U0001b2fb\U0001bc00-\U0001bc6a\U0001bc70-\U0001bc7c\U0001bc80-\U0001bc88\U0001bc90-\U0001bc99\U0001e800-\U0001e8c4\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002b820-\U0002cea1\U0002ceb0-\U0002ebe0\U0002f800-\U0002fa1d'
+
+Lt = '\u01c5\u01c8\u01cb\u01f2\u1f88-\u1f8f\u1f98-\u1f9f\u1fa8-\u1faf\u1fbc\u1fcc\u1ffc'
+
+Lu = 'A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178-\u0179\u017b\u017d\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018b\u018e-\u0191\u0193-\u0194\u0196-\u0198\u019c-\u019d\u019f-\u01a0\u01a2\u01a4\u01a6-\u01a7\u01a9\u01ac\u01ae-\u01af\u01b1-\u01b3\u01b5\u01b7-\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a-\u023b\u023d-\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e-\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9-\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0-\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1c90-\u1cba\u1cbd-\u1cbf\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e-\u213f\u2145\u2183\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d-\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\ua7b8\uff21-\uff3a\U00010400-\U00010427\U000104b0-\U000104d3\U00010c80-\U00010cb2\U000118a0-\U000118bf\U00016e40-\U00016e5f\U0001d400-\U0001d419\U0001d434-\U0001d44d\U0001d468-\U0001d481\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b5\U0001d4d0-\U0001d4e9\U0001d504-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d538-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d56c-\U0001d585\U0001d5a0-\U0001d5b9\U0001d5d4-\U0001d5ed\U0001d608-\U0001d621\U0001d63c-\U0001d655\U0001d670-\U0001d689\U0001d6a8-\U0001d6c0\U0001d6e2-\U0001d6fa\U0001d71c-\U0001d734\U0001d756-\U0001d76e\U0001d790-\U0001d7a8\U0001d7ca\U0001e900-\U0001e921'
+
+Mc = '\u0903\u093b\u093e-\u0940\u0949-\u094c\u094e-\u094f\u0982-\u0983\u09be-\u09c0\u09c7-\u09c8\u09cb-\u09cc\u09d7\u0a03\u0a3e-\u0a40\u0a83\u0abe-\u0ac0\u0ac9\u0acb-\u0acc\u0b02-\u0b03\u0b3e\u0b40\u0b47-\u0b48\u0b4b-\u0b4c\u0b57\u0bbe-\u0bbf\u0bc1-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd7\u0c01-\u0c03\u0c41-\u0c44\u0c82-\u0c83\u0cbe\u0cc0-\u0cc4\u0cc7-\u0cc8\u0cca-\u0ccb\u0cd5-\u0cd6\u0d02-\u0d03\u0d3e-\u0d40\u0d46-\u0d48\u0d4a-\u0d4c\u0d57\u0d82-\u0d83\u0dcf-\u0dd1\u0dd8-\u0ddf\u0df2-\u0df3\u0f3e-\u0f3f\u0f7f\u102b-\u102c\u1031\u1038\u103b-\u103c\u1056-\u1057\u1062-\u1064\u1067-\u106d\u1083-\u1084\u1087-\u108c\u108f\u109a-\u109c\u17b6\u17be-\u17c5\u17c7-\u17c8\u1923-\u1926\u1929-\u192b\u1930-\u1931\u1933-\u1938\u1a19-\u1a1a\u1a55\u1a57\u1a61\u1a63-\u1a64\u1a6d-\u1a72\u1b04\u1b35\u1b3b\u1b3d-\u1b41\u1b43-\u1b44\u1b82\u1ba1\u1ba6-\u1ba7\u1baa\u1be7\u1bea-\u1bec\u1bee\u1bf2-\u1bf3\u1c24-\u1c2b\u1c34-\u1c35\u1ce1\u1cf2-\u1cf3\u1cf7\u302e-\u302f\ua823-\ua824\ua827\ua880-\ua881\ua8b4-\ua8c3\ua952-\ua953\ua983\ua9b4-\ua9b5\ua9ba-\ua9bb\ua9bd-\ua9c0\uaa2f-\uaa30\uaa33-\uaa34\uaa4d\uaa7b\uaa7d\uaaeb\uaaee-\uaaef\uaaf5\uabe3-\uabe4\uabe6-\uabe7\uabe9-\uabea\uabec\U00011000\U00011002\U00011082\U000110b0-\U000110b2\U000110b7-\U000110b8\U0001112c\U00011145-\U00011146\U00011182\U000111b3-\U000111b5\U000111bf-\U000111c0\U0001122c-\U0001122e\U00011232-\U00011233\U00011235\U000112e0-\U000112e2\U00011302-\U00011303\U0001133e-\U0001133f\U00011341-\U00011344\U00011347-\U00011348\U0001134b-\U0001134d\U00011357\U00011362-\U00011363\U00011435-\U00011437\U00011440-\U00011441\U00011445\U000114b0-\U000114b2\U000114b9\U000114bb-\U000114be\U000114c1\U000115af-\U000115b1\U000115b8-\U000115bb\U000115be\U00011630-\U00011632\U0001163b-\U0001163c\U0001163e\U000116ac\U000116ae-\U000116af\U000116b6\U00011720-\U00011721\U00011726\U0001182c-\U0001182e\U00011838\U00011a39\U00011a57-\U00011a58\U00011a97\U00011c2f\U00011c3e\U00011ca9\U00011cb1\U00011cb4\U00011d8a-\U00011d8e\U00011d93-\U00011d94\U00011d96\U00011ef5-\U00011ef6\U00016f51-\U00016f7e\U0001d165-\U0001d166\U0001d16d-\U0001d172'
+
+Me = '\u0488-\u0489\u1abe\u20dd-\u20e0\u20e2-\u20e4\ua670-\ua672'
+
+Mn = '\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09c1-\u09c4\u09cd\u09e2-\u09e3\u09fe\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0afa-\u0aff\u0b01\u0b3c\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b62-\u0b63\u0b82\u0bc0\u0bcd\u0c00\u0c04\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc6\u0ccc-\u0ccd\u0ce2-\u0ce3\u0d00-\u0d01\u0d3b-\u0d3c\u0d41-\u0d44\u0d4d\u0d62-\u0d63\u0dca\u0dd2-\u0dd4\u0dd6\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u1885-\u1886\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u3099-\u309a\ua66f\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4-\ua8c5\ua8e0-\ua8f1\ua8ff\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\U000101fd\U000102e0\U00010376-\U0001037a\U00010a01-\U00010a03\U00010a05-\U00010a06\U00010a0c-\U00010a0f\U00010a38-\U00010a3a\U00010a3f\U00010ae5-\U00010ae6\U00010d24-\U00010d27\U00010f46-\U00010f50\U00011001\U00011038-\U00011046\U0001107f-\U00011081\U000110b3-\U000110b6\U000110b9-\U000110ba\U00011100-\U00011102\U00011127-\U0001112b\U0001112d-\U00011134\U00011173\U00011180-\U00011181\U000111b6-\U000111be\U000111c9-\U000111cc\U0001122f-\U00011231\U00011234\U00011236-\U00011237\U0001123e\U000112df\U000112e3-\U000112ea\U00011300-\U00011301\U0001133b-\U0001133c\U00011340\U00011366-\U0001136c\U00011370-\U00011374\U00011438-\U0001143f\U00011442-\U00011444\U00011446\U0001145e\U000114b3-\U000114b8\U000114ba\U000114bf-\U000114c0\U000114c2-\U000114c3\U000115b2-\U000115b5\U000115bc-\U000115bd\U000115bf-\U000115c0\U000115dc-\U000115dd\U00011633-\U0001163a\U0001163d\U0001163f-\U00011640\U000116ab\U000116ad\U000116b0-\U000116b5\U000116b7\U0001171d-\U0001171f\U00011722-\U00011725\U00011727-\U0001172b\U0001182f-\U00011837\U00011839-\U0001183a\U00011a01-\U00011a0a\U00011a33-\U00011a38\U00011a3b-\U00011a3e\U00011a47\U00011a51-\U00011a56\U00011a59-\U00011a5b\U00011a8a-\U00011a96\U00011a98-\U00011a99\U00011c30-\U00011c36\U00011c38-\U00011c3d\U00011c3f\U00011c92-\U00011ca7\U00011caa-\U00011cb0\U00011cb2-\U00011cb3\U00011cb5-\U00011cb6\U00011d31-\U00011d36\U00011d3a\U00011d3c-\U00011d3d\U00011d3f-\U00011d45\U00011d47\U00011d90-\U00011d91\U00011d95\U00011d97\U00011ef3-\U00011ef4\U00016af0-\U00016af4\U00016b30-\U00016b36\U00016f8f-\U00016f92\U0001bc9d-\U0001bc9e\U0001d167-\U0001d169\U0001d17b-\U0001d182\U0001d185-\U0001d18b\U0001d1aa-\U0001d1ad\U0001d242-\U0001d244\U0001da00-\U0001da36\U0001da3b-\U0001da6c\U0001da75\U0001da84\U0001da9b-\U0001da9f\U0001daa1-\U0001daaf\U0001e000-\U0001e006\U0001e008-\U0001e018\U0001e01b-\U0001e021\U0001e023-\U0001e024\U0001e026-\U0001e02a\U0001e8d0-\U0001e8d6\U0001e944-\U0001e94a\U000e0100-\U000e01ef'
+
+Nd = '0-9\u0660-\u0669\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be6-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0de6-\u0def\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29\u1040-\u1049\u1090-\u1099\u17e0-\u17e9\u1810-\u1819\u1946-\u194f\u19d0-\u19d9\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\ua620-\ua629\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\ua9f0-\ua9f9\uaa50-\uaa59\uabf0-\uabf9\uff10-\uff19\U000104a0-\U000104a9\U00010d30-\U00010d39\U00011066-\U0001106f\U000110f0-\U000110f9\U00011136-\U0001113f\U000111d0-\U000111d9\U000112f0-\U000112f9\U00011450-\U00011459\U000114d0-\U000114d9\U00011650-\U00011659\U000116c0-\U000116c9\U00011730-\U00011739\U000118e0-\U000118e9\U00011c50-\U00011c59\U00011d50-\U00011d59\U00011da0-\U00011da9\U00016a60-\U00016a69\U00016b50-\U00016b59\U0001d7ce-\U0001d7ff\U0001e950-\U0001e959'
+
+Nl = '\u16ee-\u16f0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303a\ua6e6-\ua6ef\U00010140-\U00010174\U00010341\U0001034a\U000103d1-\U000103d5\U00012400-\U0001246e'
+
+No = '\xb2-\xb3\xb9\xbc-\xbe\u09f4-\u09f9\u0b72-\u0b77\u0bf0-\u0bf2\u0c78-\u0c7e\u0d58-\u0d5e\u0d70-\u0d78\u0f2a-\u0f33\u1369-\u137c\u17f0-\u17f9\u19da\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215f\u2189\u2460-\u249b\u24ea-\u24ff\u2776-\u2793\u2cfd\u3192-\u3195\u3220-\u3229\u3248-\u324f\u3251-\u325f\u3280-\u3289\u32b1-\u32bf\ua830-\ua835\U00010107-\U00010133\U00010175-\U00010178\U0001018a-\U0001018b\U000102e1-\U000102fb\U00010320-\U00010323\U00010858-\U0001085f\U00010879-\U0001087f\U000108a7-\U000108af\U000108fb-\U000108ff\U00010916-\U0001091b\U000109bc-\U000109bd\U000109c0-\U000109cf\U000109d2-\U000109ff\U00010a40-\U00010a48\U00010a7d-\U00010a7e\U00010a9d-\U00010a9f\U00010aeb-\U00010aef\U00010b58-\U00010b5f\U00010b78-\U00010b7f\U00010ba9-\U00010baf\U00010cfa-\U00010cff\U00010e60-\U00010e7e\U00010f1d-\U00010f26\U00010f51-\U00010f54\U00011052-\U00011065\U000111e1-\U000111f4\U0001173a-\U0001173b\U000118ea-\U000118f2\U00011c5a-\U00011c6c\U00016b5b-\U00016b61\U00016e80-\U00016e96\U0001d2e0-\U0001d2f3\U0001d360-\U0001d378\U0001e8c7-\U0001e8cf\U0001ec71-\U0001ecab\U0001ecad-\U0001ecaf\U0001ecb1-\U0001ecb4\U0001f100-\U0001f10c'
+
+Pc = '_\u203f-\u2040\u2054\ufe33-\ufe34\ufe4d-\ufe4f\uff3f'
+
+Pd = '\\-\u058a\u05be\u1400\u1806\u2010-\u2015\u2e17\u2e1a\u2e3a-\u2e3b\u2e40\u301c\u3030\u30a0\ufe31-\ufe32\ufe58\ufe63\uff0d'
+
+Pe = ')\\]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u2309\u230b\u232a\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb\u27ed\u27ef\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998\u29d9\u29db\u29fd\u2e23\u2e25\u2e27\u2e29\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e-\u301f\ufd3e\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63'
+
+Pf = '\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d\u2e21'
+
+Pi = '\xab\u2018\u201b-\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c\u2e20'
+
+Po = "!-#%-'*,.-/:-;?-@\\\\\xa1\xa7\xb6-\xb7\xbf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3-\u05f4\u0609-\u060a\u060c-\u060d\u061b\u061e-\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964-\u0965\u0970\u09fd\u0a76\u0af0\u0c84\u0df4\u0e4f\u0e5a-\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9-\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d-\u166e\u16eb-\u16ed\u1735-\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944-\u1945\u1a1e-\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e-\u1c7f\u1cc0-\u1cc7\u1cd3\u2016-\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe-\u2cff\u2d70\u2e00-\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18-\u2e19\u2e1b\u2e1e-\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u2e3c-\u2e3f\u2e41\u2e43-\u2e4e\u3001-\u3003\u303d\u30fb\ua4fe-\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce-\ua8cf\ua8f8-\ua8fa\ua8fc\ua92e-\ua92f\ua95f\ua9c1-\ua9cd\ua9de-\ua9df\uaa5c-\uaa5f\uaade-\uaadf\uaaf0-\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45-\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a-\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e-\uff0f\uff1a-\uff1b\uff1f-\uff20\uff3c\uff61\uff64-\uff65\U00010100-\U00010102\U0001039f\U000103d0\U0001056f\U00010857\U0001091f\U0001093f\U00010a50-\U00010a58\U00010a7f\U00010af0-\U00010af6\U00010b39-\U00010b3f\U00010b99-\U00010b9c\U00010f55-\U00010f59\U00011047-\U0001104d\U000110bb-\U000110bc\U000110be-\U000110c1\U00011140-\U00011143\U00011174-\U00011175\U000111c5-\U000111c8\U000111cd\U000111db\U000111dd-\U000111df\U00011238-\U0001123d\U000112a9\U0001144b-\U0001144f\U0001145b\U0001145d\U000114c6\U000115c1-\U000115d7\U00011641-\U00011643\U00011660-\U0001166c\U0001173c-\U0001173e\U0001183b\U00011a3f-\U00011a46\U00011a9a-\U00011a9c\U00011a9e-\U00011aa2\U00011c41-\U00011c45\U00011c70-\U00011c71\U00011ef7-\U00011ef8\U00012470-\U00012474\U00016a6e-\U00016a6f\U00016af5\U00016b37-\U00016b3b\U00016b44\U00016e97-\U00016e9a\U0001bc9f\U0001da87-\U0001da8b\U0001e95e-\U0001e95f"
+
+Ps = '(\\[{\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2308\u230a\u2329\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u27ec\u27ee\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u2e22\u2e24\u2e26\u2e28\u2e42\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3f\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62'
+
+Sc = '$\xa2-\xa5\u058f\u060b\u07fe-\u07ff\u09f2-\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20bf\ua838\ufdfc\ufe69\uff04\uffe0-\uffe1\uffe5-\uffe6\U0001ecb0'
+
+Sk = '\\^`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384-\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd-\u1ffe\u309b-\u309c\ua700-\ua716\ua720-\ua721\ua789-\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3\U0001f3fb-\U0001f3ff'
+
+Sm = '+<->|~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a-\u219b\u21a0\u21a3\u21a6\u21ae\u21ce-\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320-\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec\U0001d6c1\U0001d6db\U0001d6fb\U0001d715\U0001d735\U0001d74f\U0001d76f\U0001d789\U0001d7a9\U0001d7c3\U0001eef0-\U0001eef1'
+
+So = '\xa6\xa9\xae\xb0\u0482\u058d-\u058e\u060e-\u060f\u06de\u06e9\u06fd-\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce-\u0fcf\u0fd5-\u0fd8\u109e-\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100-\u2101\u2103-\u2106\u2108-\u2109\u2114\u2116-\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a-\u213b\u214a\u214c-\u214d\u214f\u218a-\u218b\u2195-\u2199\u219c-\u219f\u21a1-\u21a2\u21a4-\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0-\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45-\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bc8\u2bca-\u2bfe\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012-\u3013\u3020\u3036-\u3037\u303e-\u303f\u3190-\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836-\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed-\uffee\ufffc-\ufffd\U00010137-\U0001013f\U00010179-\U00010189\U0001018c-\U0001018e\U00010190-\U0001019b\U000101a0\U000101d0-\U000101fc\U00010877-\U00010878\U00010ac8\U0001173f\U00016b3c-\U00016b3f\U00016b45\U0001bc9c\U0001d000-\U0001d0f5\U0001d100-\U0001d126\U0001d129-\U0001d164\U0001d16a-\U0001d16c\U0001d183-\U0001d184\U0001d18c-\U0001d1a9\U0001d1ae-\U0001d1e8\U0001d200-\U0001d241\U0001d245\U0001d300-\U0001d356\U0001d800-\U0001d9ff\U0001da37-\U0001da3a\U0001da6d-\U0001da74\U0001da76-\U0001da83\U0001da85-\U0001da86\U0001ecac\U0001f000-\U0001f02b\U0001f030-\U0001f093\U0001f0a0-\U0001f0ae\U0001f0b1-\U0001f0bf\U0001f0c1-\U0001f0cf\U0001f0d1-\U0001f0f5\U0001f110-\U0001f16b\U0001f170-\U0001f1ac\U0001f1e6-\U0001f202\U0001f210-\U0001f23b\U0001f240-\U0001f248\U0001f250-\U0001f251\U0001f260-\U0001f265\U0001f300-\U0001f3fa\U0001f400-\U0001f6d4\U0001f6e0-\U0001f6ec\U0001f6f0-\U0001f6f9\U0001f700-\U0001f773\U0001f780-\U0001f7d8\U0001f800-\U0001f80b\U0001f810-\U0001f847\U0001f850-\U0001f859\U0001f860-\U0001f887\U0001f890-\U0001f8ad\U0001f900-\U0001f90b\U0001f910-\U0001f93e\U0001f940-\U0001f970\U0001f973-\U0001f976\U0001f97a\U0001f97c-\U0001f9a2\U0001f9b0-\U0001f9b9\U0001f9c0-\U0001f9c2\U0001f9d0-\U0001f9ff\U0001fa60-\U0001fa6d'
+
+Zl = '\u2028'
+
+Zp = '\u2029'
+
+Zs = ' \xa0\u1680\u2000-\u200a\u202f\u205f\u3000'
+
+xid_continue = '0-9A-Z_a-z\xaa\xb5\xb7\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376-\u0377\u037b-\u037d\u037f\u0386-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u05d0-\u05ea\u05ef-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u07fd\u0800-\u082d\u0840-\u085b\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u08d3-\u08e1\u08e3-\u0963\u0966-\u096f\u0971-\u0983\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7-\u09c8\u09cb-\u09ce\u09d7\u09dc-\u09dd\u09df-\u09e3\u09e6-\u09f1\u09fc\u09fe\u0a01-\u0a03\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a3c\u0a3e-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0af9-\u0aff\u0b01-\u0b03\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47-\u0b48\u0b4b-\u0b4d\u0b56-\u0b57\u0b5c-\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82-\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c00-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5-\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1-\u0cf2\u0d00-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82-\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18-\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1369-\u1371\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772-\u1773\u1780-\u17d3\u17d7\u17dc-\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1878\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1ab0-\u1abd\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1cd0-\u1cd2\u1cd4-\u1cf9\u1d00-\u1df9\u1dfb-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u203f-\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099-\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua7b9\ua7f7-\ua827\ua840-\ua873\ua880-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua8fd-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\ua9e0-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uabec-\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufc5d\ufc64-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdf9\ufe00-\ufe0f\ufe20-\ufe2f\ufe33-\ufe34\ufe4d-\ufe4f\ufe71\ufe73\ufe77\ufe79\ufe7b\ufe7d\ufe7f-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010140-\U00010174\U000101fd\U00010280-\U0001029c\U000102a0-\U000102d0\U000102e0\U00010300-\U0001031f\U0001032d-\U0001034a\U00010350-\U0001037a\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U000103d1-\U000103d5\U00010400-\U0001049d\U000104a0-\U000104a9\U000104b0-\U000104d3\U000104d8-\U000104fb\U00010500-\U00010527\U00010530-\U00010563\U00010600-\U00010736\U00010740-\U00010755\U00010760-\U00010767\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010860-\U00010876\U00010880-\U0001089e\U000108e0-\U000108f2\U000108f4-\U000108f5\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00-\U00010a03\U00010a05-\U00010a06\U00010a0c-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a35\U00010a38-\U00010a3a\U00010a3f\U00010a60-\U00010a7c\U00010a80-\U00010a9c\U00010ac0-\U00010ac7\U00010ac9-\U00010ae6\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010b80-\U00010b91\U00010c00-\U00010c48\U00010c80-\U00010cb2\U00010cc0-\U00010cf2\U00010d00-\U00010d27\U00010d30-\U00010d39\U00010f00-\U00010f1c\U00010f27\U00010f30-\U00010f50\U00011000-\U00011046\U00011066-\U0001106f\U0001107f-\U000110ba\U000110d0-\U000110e8\U000110f0-\U000110f9\U00011100-\U00011134\U00011136-\U0001113f\U00011144-\U00011146\U00011150-\U00011173\U00011176\U00011180-\U000111c4\U000111c9-\U000111cc\U000111d0-\U000111da\U000111dc\U00011200-\U00011211\U00011213-\U00011237\U0001123e\U00011280-\U00011286\U00011288\U0001128a-\U0001128d\U0001128f-\U0001129d\U0001129f-\U000112a8\U000112b0-\U000112ea\U000112f0-\U000112f9\U00011300-\U00011303\U00011305-\U0001130c\U0001130f-\U00011310\U00011313-\U00011328\U0001132a-\U00011330\U00011332-\U00011333\U00011335-\U00011339\U0001133b-\U00011344\U00011347-\U00011348\U0001134b-\U0001134d\U00011350\U00011357\U0001135d-\U00011363\U00011366-\U0001136c\U00011370-\U00011374\U00011400-\U0001144a\U00011450-\U00011459\U0001145e\U00011480-\U000114c5\U000114c7\U000114d0-\U000114d9\U00011580-\U000115b5\U000115b8-\U000115c0\U000115d8-\U000115dd\U00011600-\U00011640\U00011644\U00011650-\U00011659\U00011680-\U000116b7\U000116c0-\U000116c9\U00011700-\U0001171a\U0001171d-\U0001172b\U00011730-\U00011739\U00011800-\U0001183a\U000118a0-\U000118e9\U000118ff\U00011a00-\U00011a3e\U00011a47\U00011a50-\U00011a83\U00011a86-\U00011a99\U00011a9d\U00011ac0-\U00011af8\U00011c00-\U00011c08\U00011c0a-\U00011c36\U00011c38-\U00011c40\U00011c50-\U00011c59\U00011c72-\U00011c8f\U00011c92-\U00011ca7\U00011ca9-\U00011cb6\U00011d00-\U00011d06\U00011d08-\U00011d09\U00011d0b-\U00011d36\U00011d3a\U00011d3c-\U00011d3d\U00011d3f-\U00011d47\U00011d50-\U00011d59\U00011d60-\U00011d65\U00011d67-\U00011d68\U00011d6a-\U00011d8e\U00011d90-\U00011d91\U00011d93-\U00011d98\U00011da0-\U00011da9\U00011ee0-\U00011ef6\U00012000-\U00012399\U00012400-\U0001246e\U00012480-\U00012543\U00013000-\U0001342e\U00014400-\U00014646\U00016800-\U00016a38\U00016a40-\U00016a5e\U00016a60-\U00016a69\U00016ad0-\U00016aed\U00016af0-\U00016af4\U00016b00-\U00016b36\U00016b40-\U00016b43\U00016b50-\U00016b59\U00016b63-\U00016b77\U00016b7d-\U00016b8f\U00016e40-\U00016e7f\U00016f00-\U00016f44\U00016f50-\U00016f7e\U00016f8f-\U00016f9f\U00016fe0-\U00016fe1\U00017000-\U000187f1\U00018800-\U00018af2\U0001b000-\U0001b11e\U0001b170-\U0001b2fb\U0001bc00-\U0001bc6a\U0001bc70-\U0001bc7c\U0001bc80-\U0001bc88\U0001bc90-\U0001bc99\U0001bc9d-\U0001bc9e\U0001d165-\U0001d169\U0001d16d-\U0001d172\U0001d17b-\U0001d182\U0001d185-\U0001d18b\U0001d1aa-\U0001d1ad\U0001d242-\U0001d244\U0001d400-\U0001d454\U0001d456-\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d51e-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d552-\U0001d6a5\U0001d6a8-\U0001d6c0\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6fa\U0001d6fc-\U0001d714\U0001d716-\U0001d734\U0001d736-\U0001d74e\U0001d750-\U0001d76e\U0001d770-\U0001d788\U0001d78a-\U0001d7a8\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7cb\U0001d7ce-\U0001d7ff\U0001da00-\U0001da36\U0001da3b-\U0001da6c\U0001da75\U0001da84\U0001da9b-\U0001da9f\U0001daa1-\U0001daaf\U0001e000-\U0001e006\U0001e008-\U0001e018\U0001e01b-\U0001e021\U0001e023-\U0001e024\U0001e026-\U0001e02a\U0001e800-\U0001e8c4\U0001e8d0-\U0001e8d6\U0001e900-\U0001e94a\U0001e950-\U0001e959\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002b820-\U0002cea1\U0002ceb0-\U0002ebe0\U0002f800-\U0002fa1d\U000e0100-\U000e01ef'
+
+xid_start = 'A-Z_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376-\u0377\u037b-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e-\u066f\u0671-\u06d3\u06d5\u06e5-\u06e6\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4-\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u09fc\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0af9\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60-\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0cf1-\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e40-\u0e46\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5-\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a-\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7b9\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd-\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufc5d\ufc64-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdf9\ufe71\ufe73\ufe77\ufe79\ufe7b\ufe7d\ufe7f-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010140-\U00010174\U00010280-\U0001029c\U000102a0-\U000102d0\U00010300-\U0001031f\U0001032d-\U0001034a\U00010350-\U00010375\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U000103d1-\U000103d5\U00010400-\U0001049d\U000104b0-\U000104d3\U000104d8-\U000104fb\U00010500-\U00010527\U00010530-\U00010563\U00010600-\U00010736\U00010740-\U00010755\U00010760-\U00010767\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010860-\U00010876\U00010880-\U0001089e\U000108e0-\U000108f2\U000108f4-\U000108f5\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00\U00010a10-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a35\U00010a60-\U00010a7c\U00010a80-\U00010a9c\U00010ac0-\U00010ac7\U00010ac9-\U00010ae4\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010b80-\U00010b91\U00010c00-\U00010c48\U00010c80-\U00010cb2\U00010cc0-\U00010cf2\U00010d00-\U00010d23\U00010f00-\U00010f1c\U00010f27\U00010f30-\U00010f45\U00011003-\U00011037\U00011083-\U000110af\U000110d0-\U000110e8\U00011103-\U00011126\U00011144\U00011150-\U00011172\U00011176\U00011183-\U000111b2\U000111c1-\U000111c4\U000111da\U000111dc\U00011200-\U00011211\U00011213-\U0001122b\U00011280-\U00011286\U00011288\U0001128a-\U0001128d\U0001128f-\U0001129d\U0001129f-\U000112a8\U000112b0-\U000112de\U00011305-\U0001130c\U0001130f-\U00011310\U00011313-\U00011328\U0001132a-\U00011330\U00011332-\U00011333\U00011335-\U00011339\U0001133d\U00011350\U0001135d-\U00011361\U00011400-\U00011434\U00011447-\U0001144a\U00011480-\U000114af\U000114c4-\U000114c5\U000114c7\U00011580-\U000115ae\U000115d8-\U000115db\U00011600-\U0001162f\U00011644\U00011680-\U000116aa\U00011700-\U0001171a\U00011800-\U0001182b\U000118a0-\U000118df\U000118ff\U00011a00\U00011a0b-\U00011a32\U00011a3a\U00011a50\U00011a5c-\U00011a83\U00011a86-\U00011a89\U00011a9d\U00011ac0-\U00011af8\U00011c00-\U00011c08\U00011c0a-\U00011c2e\U00011c40\U00011c72-\U00011c8f\U00011d00-\U00011d06\U00011d08-\U00011d09\U00011d0b-\U00011d30\U00011d46\U00011d60-\U00011d65\U00011d67-\U00011d68\U00011d6a-\U00011d89\U00011d98\U00011ee0-\U00011ef2\U00012000-\U00012399\U00012400-\U0001246e\U00012480-\U00012543\U00013000-\U0001342e\U00014400-\U00014646\U00016800-\U00016a38\U00016a40-\U00016a5e\U00016ad0-\U00016aed\U00016b00-\U00016b2f\U00016b40-\U00016b43\U00016b63-\U00016b77\U00016b7d-\U00016b8f\U00016e40-\U00016e7f\U00016f00-\U00016f44\U00016f50\U00016f93-\U00016f9f\U00016fe0-\U00016fe1\U00017000-\U000187f1\U00018800-\U00018af2\U0001b000-\U0001b11e\U0001b170-\U0001b2fb\U0001bc00-\U0001bc6a\U0001bc70-\U0001bc7c\U0001bc80-\U0001bc88\U0001bc90-\U0001bc99\U0001d400-\U0001d454\U0001d456-\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d51e-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d552-\U0001d6a5\U0001d6a8-\U0001d6c0\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6fa\U0001d6fc-\U0001d714\U0001d716-\U0001d734\U0001d736-\U0001d74e\U0001d750-\U0001d76e\U0001d770-\U0001d788\U0001d78a-\U0001d7a8\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7cb\U0001e800-\U0001e8c4\U0001e900-\U0001e943\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002b820-\U0002cea1\U0002ceb0-\U0002ebe0\U0002f800-\U0002fa1d'
+
+cats = ['Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs']
+
+# Generated from unidata 11.0.0
+
+def combine(*args):
+    return ''.join(globals()[cat] for cat in args)
+
+
+def allexcept(*args):
+    newcats = cats[:]
+    for arg in args:
+        newcats.remove(arg)
+    return ''.join(globals()[cat] for cat in newcats)
+
+
+def _handle_runs(char_list):  # pragma: no cover
+    buf = []
+    for c in char_list:
+        if len(c) == 1:
+            if buf and buf[-1][1] == chr(ord(c)-1):
+                buf[-1] = (buf[-1][0], c)
+            else:
+                buf.append((c, c))
+        else:
+            buf.append((c, c))
+    for a, b in buf:
+        if a == b:
+            yield a
+        else:
+            yield f'{a}-{b}'
+
+
+if __name__ == '__main__':  # pragma: no cover
+    import unicodedata
+
+    categories = {'xid_start': [], 'xid_continue': []}
+
+    with open(__file__, encoding='utf-8') as fp:
+        content = fp.read()
+
+    header = content[:content.find('Cc =')]
+    footer = content[content.find("def combine("):]
+
+    for code in range(0x110000):
+        c = chr(code)
+        cat = unicodedata.category(c)
+        if ord(c) == 0xdc00:
+            # Hack to avoid combining this combining with the preceding high
+            # surrogate, 0xdbff, when doing a repr.
+            c = '\\' + c
+        elif ord(c) in (0x2d, 0x5b, 0x5c, 0x5d, 0x5e):
+            # Escape regex metachars.
+            c = '\\' + c
+        categories.setdefault(cat, []).append(c)
+        # XID_START and XID_CONTINUE are special categories used for matching
+        # identifiers in Python 3.
+        if c.isidentifier():
+            categories['xid_start'].append(c)
+        if ('a' + c).isidentifier():
+            categories['xid_continue'].append(c)
+
+    with open(__file__, 'w', encoding='utf-8') as fp:
+        fp.write(header)
+
+        for cat in sorted(categories):
+            val = ''.join(_handle_runs(categories[cat]))
+            fp.write(f'{cat} = {val!a}\n\n')
+
+        cats = sorted(categories)
+        cats.remove('xid_start')
+        cats.remove('xid_continue')
+        fp.write(f'cats = {cats!r}\n\n')
+
+        fp.write(f'# Generated from unidata {unicodedata.unidata_version}\n\n')
+
+        fp.write(footer)
diff --git a/.venv/Lib/site-packages/pygments/util.py b/.venv/Lib/site-packages/pygments/util.py
new file mode 100644 (file)
index 0000000..71c5710
--- /dev/null
@@ -0,0 +1,324 @@
+"""
+    pygments.util
+    ~~~~~~~~~~~~~
+
+    Utility functions.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+from io import TextIOWrapper
+
+
+split_path_re = re.compile(r'[/\\ ]')
+doctype_lookup_re = re.compile(r'''
+    <!DOCTYPE\s+(
+     [a-zA-Z_][a-zA-Z0-9]*
+     (?: \s+      # optional in HTML5
+     [a-zA-Z_][a-zA-Z0-9]*\s+
+     "[^"]*")?
+     )
+     [^>]*>
+''', re.DOTALL | re.MULTILINE | re.VERBOSE)
+tag_re = re.compile(r'<(.+?)(\s.*?)?>.*?</.+?>',
+                    re.IGNORECASE | re.DOTALL | re.MULTILINE)
+xml_decl_re = re.compile(r'\s*<\?xml[^>]*\?>', re.I)
+
+
+class ClassNotFound(ValueError):
+    """Raised if one of the lookup functions didn't find a matching class."""
+
+
+class OptionError(Exception):
+    """
+    This exception will be raised by all option processing functions if
+    the type or value of the argument is not correct.
+    """
+
+def get_choice_opt(options, optname, allowed, default=None, normcase=False):
+    """
+    If the key `optname` from the dictionary is not in the sequence
+    `allowed`, raise an error, otherwise return it.
+    """
+    string = options.get(optname, default)
+    if normcase:
+        string = string.lower()
+    if string not in allowed:
+        raise OptionError('Value for option {} must be one of {}'.format(optname, ', '.join(map(str, allowed))))
+    return string
+
+
+def get_bool_opt(options, optname, default=None):
+    """
+    Intuitively, this is `options.get(optname, default)`, but restricted to
+    Boolean value. The Booleans can be represented as string, in order to accept
+    Boolean value from the command line arguments. If the key `optname` is
+    present in the dictionary `options` and is not associated with a Boolean,
+    raise an `OptionError`. If it is absent, `default` is returned instead.
+
+    The valid string values for ``True`` are ``1``, ``yes``, ``true`` and
+    ``on``, the ones for ``False`` are ``0``, ``no``, ``false`` and ``off``
+    (matched case-insensitively).
+    """
+    string = options.get(optname, default)
+    if isinstance(string, bool):
+        return string
+    elif isinstance(string, int):
+        return bool(string)
+    elif not isinstance(string, str):
+        raise OptionError(f'Invalid type {string!r} for option {optname}; use '
+                          '1/0, yes/no, true/false, on/off')
+    elif string.lower() in ('1', 'yes', 'true', 'on'):
+        return True
+    elif string.lower() in ('0', 'no', 'false', 'off'):
+        return False
+    else:
+        raise OptionError(f'Invalid value {string!r} for option {optname}; use '
+                          '1/0, yes/no, true/false, on/off')
+
+
+def get_int_opt(options, optname, default=None):
+    """As :func:`get_bool_opt`, but interpret the value as an integer."""
+    string = options.get(optname, default)
+    try:
+        return int(string)
+    except TypeError:
+        raise OptionError(f'Invalid type {string!r} for option {optname}; you '
+                          'must give an integer value')
+    except ValueError:
+        raise OptionError(f'Invalid value {string!r} for option {optname}; you '
+                          'must give an integer value')
+
+def get_list_opt(options, optname, default=None):
+    """
+    If the key `optname` from the dictionary `options` is a string,
+    split it at whitespace and return it. If it is already a list
+    or a tuple, it is returned as a list.
+    """
+    val = options.get(optname, default)
+    if isinstance(val, str):
+        return val.split()
+    elif isinstance(val, (list, tuple)):
+        return list(val)
+    else:
+        raise OptionError(f'Invalid type {val!r} for option {optname}; you '
+                          'must give a list value')
+
+
+def docstring_headline(obj):
+    if not obj.__doc__:
+        return ''
+    res = []
+    for line in obj.__doc__.strip().splitlines():
+        if line.strip():
+            res.append(" " + line.strip())
+        else:
+            break
+    return ''.join(res).lstrip()
+
+
+def make_analysator(f):
+    """Return a static text analyser function that returns float values."""
+    def text_analyse(text):
+        try:
+            rv = f(text)
+        except Exception:
+            return 0.0
+        if not rv:
+            return 0.0
+        try:
+            return min(1.0, max(0.0, float(rv)))
+        except (ValueError, TypeError):
+            return 0.0
+    text_analyse.__doc__ = f.__doc__
+    return staticmethod(text_analyse)
+
+
+def shebang_matches(text, regex):
+    r"""Check if the given regular expression matches the last part of the
+    shebang if one exists.
+
+        >>> from pygments.util import shebang_matches
+        >>> shebang_matches('#!/usr/bin/env python', r'python(2\.\d)?')
+        True
+        >>> shebang_matches('#!/usr/bin/python2.4', r'python(2\.\d)?')
+        True
+        >>> shebang_matches('#!/usr/bin/python-ruby', r'python(2\.\d)?')
+        False
+        >>> shebang_matches('#!/usr/bin/python/ruby', r'python(2\.\d)?')
+        False
+        >>> shebang_matches('#!/usr/bin/startsomethingwith python',
+        ...                 r'python(2\.\d)?')
+        True
+
+    It also checks for common windows executable file extensions::
+
+        >>> shebang_matches('#!C:\\Python2.4\\Python.exe', r'python(2\.\d)?')
+        True
+
+    Parameters (``'-f'`` or ``'--foo'`` are ignored so ``'perl'`` does
+    the same as ``'perl -e'``)
+
+    Note that this method automatically searches the whole string (eg:
+    the regular expression is wrapped in ``'^$'``)
+    """
+    index = text.find('\n')
+    if index >= 0:
+        first_line = text[:index].lower()
+    else:
+        first_line = text.lower()
+    if first_line.startswith('#!'):
+        try:
+            found = [x for x in split_path_re.split(first_line[2:].strip())
+                     if x and not x.startswith('-')][-1]
+        except IndexError:
+            return False
+        regex = re.compile(rf'^{regex}(\.(exe|cmd|bat|bin))?$', re.IGNORECASE)
+        if regex.search(found) is not None:
+            return True
+    return False
+
+
+def doctype_matches(text, regex):
+    """Check if the doctype matches a regular expression (if present).
+
+    Note that this method only checks the first part of a DOCTYPE.
+    eg: 'html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'
+    """
+    m = doctype_lookup_re.search(text)
+    if m is None:
+        return False
+    doctype = m.group(1)
+    return re.compile(regex, re.I).match(doctype.strip()) is not None
+
+
+def html_doctype_matches(text):
+    """Check if the file looks like it has a html doctype."""
+    return doctype_matches(text, r'html')
+
+
+_looks_like_xml_cache = {}
+
+
+def looks_like_xml(text):
+    """Check if a doctype exists or if we have some tags."""
+    if xml_decl_re.match(text):
+        return True
+    key = hash(text)
+    try:
+        return _looks_like_xml_cache[key]
+    except KeyError:
+        m = doctype_lookup_re.search(text)
+        if m is not None:
+            return True
+        rv = tag_re.search(text[:1000]) is not None
+        _looks_like_xml_cache[key] = rv
+        return rv
+
+
+def surrogatepair(c):
+    """Given a unicode character code with length greater than 16 bits,
+    return the two 16 bit surrogate pair.
+    """
+    # From example D28 of:
+    # http://www.unicode.org/book/ch03.pdf
+    return (0xd7c0 + (c >> 10), (0xdc00 + (c & 0x3ff)))
+
+
+def format_lines(var_name, seq, raw=False, indent_level=0):
+    """Formats a sequence of strings for output."""
+    lines = []
+    base_indent = ' ' * indent_level * 4
+    inner_indent = ' ' * (indent_level + 1) * 4
+    lines.append(base_indent + var_name + ' = (')
+    if raw:
+        # These should be preformatted reprs of, say, tuples.
+        for i in seq:
+            lines.append(inner_indent + i + ',')
+    else:
+        for i in seq:
+            # Force use of single quotes
+            r = repr(i + '"')
+            lines.append(inner_indent + r[:-2] + r[-1] + ',')
+    lines.append(base_indent + ')')
+    return '\n'.join(lines)
+
+
+def duplicates_removed(it, already_seen=()):
+    """
+    Returns a list with duplicates removed from the iterable `it`.
+
+    Order is preserved.
+    """
+    lst = []
+    seen = set()
+    for i in it:
+        if i in seen or i in already_seen:
+            continue
+        lst.append(i)
+        seen.add(i)
+    return lst
+
+
+class Future:
+    """Generic class to defer some work.
+
+    Handled specially in RegexLexerMeta, to support regex string construction at
+    first use.
+    """
+    def get(self):
+        raise NotImplementedError
+
+
+def guess_decode(text):
+    """Decode *text* with guessed encoding.
+
+    First try UTF-8; this should fail for non-UTF-8 encodings.
+    Then try the preferred locale encoding.
+    Fall back to latin-1, which always works.
+    """
+    try:
+        text = text.decode('utf-8')
+        return text, 'utf-8'
+    except UnicodeDecodeError:
+        try:
+            import locale
+            prefencoding = locale.getpreferredencoding()
+            text = text.decode()
+            return text, prefencoding
+        except (UnicodeDecodeError, LookupError):
+            text = text.decode('latin1')
+            return text, 'latin1'
+
+
+def guess_decode_from_terminal(text, term):
+    """Decode *text* coming from terminal *term*.
+
+    First try the terminal encoding, if given.
+    Then try UTF-8.  Then try the preferred locale encoding.
+    Fall back to latin-1, which always works.
+    """
+    if getattr(term, 'encoding', None):
+        try:
+            text = text.decode(term.encoding)
+        except UnicodeDecodeError:
+            pass
+        else:
+            return text, term.encoding
+    return guess_decode(text)
+
+
+def terminal_encoding(term):
+    """Return our best guess of encoding for the given *term*."""
+    if getattr(term, 'encoding', None):
+        return term.encoding
+    import locale
+    return locale.getpreferredencoding()
+
+
+class UnclosingTextIOWrapper(TextIOWrapper):
+    # Don't close underlying buffer on destruction.
+    def close(self):
+        self.flush()
diff --git a/.venv/Lib/site-packages/rich-14.0.0.dist-info/INSTALLER b/.venv/Lib/site-packages/rich-14.0.0.dist-info/INSTALLER
new file mode 100644 (file)
index 0000000..a1b589e
--- /dev/null
@@ -0,0 +1 @@
+pip
diff --git a/.venv/Lib/site-packages/rich-14.0.0.dist-info/LICENSE b/.venv/Lib/site-packages/rich-14.0.0.dist-info/LICENSE
new file mode 100644 (file)
index 0000000..4415505
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2020 Will McGugan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/.venv/Lib/site-packages/rich-14.0.0.dist-info/METADATA b/.venv/Lib/site-packages/rich-14.0.0.dist-info/METADATA
new file mode 100644 (file)
index 0000000..7775bd9
--- /dev/null
@@ -0,0 +1,473 @@
+Metadata-Version: 2.1
+Name: rich
+Version: 14.0.0
+Summary: Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal
+Home-page: https://github.com/Textualize/rich
+License: MIT
+Author: Will McGugan
+Author-email: willmcgugan@gmail.com
+Requires-Python: >=3.8.0
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Console
+Classifier: Framework :: IPython
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: MacOS
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Typing :: Typed
+Provides-Extra: jupyter
+Requires-Dist: ipywidgets (>=7.5.1,<9) ; extra == "jupyter"
+Requires-Dist: markdown-it-py (>=2.2.0)
+Requires-Dist: pygments (>=2.13.0,<3.0.0)
+Requires-Dist: typing-extensions (>=4.0.0,<5.0) ; python_version < "3.11"
+Project-URL: Documentation, https://rich.readthedocs.io/en/latest/
+Description-Content-Type: text/markdown
+
+[![Supported Python Versions](https://img.shields.io/pypi/pyversions/rich/13.2.0)](https://pypi.org/project/rich/) [![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich)
+
+[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich)
+[![codecov](https://img.shields.io/codecov/c/github/Textualize/rich?label=codecov&logo=codecov)](https://codecov.io/gh/Textualize/rich)
+[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/)
+[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan)
+
+![Logo](https://github.com/textualize/rich/raw/master/imgs/logo.svg)
+
+[English readme](https://github.com/textualize/rich/blob/master/README.md)
+ • [简体中文 readme](https://github.com/textualize/rich/blob/master/README.cn.md)
+ • [正體中文 readme](https://github.com/textualize/rich/blob/master/README.zh-tw.md)
+ • [Lengua española readme](https://github.com/textualize/rich/blob/master/README.es.md)
+ • [Deutsche readme](https://github.com/textualize/rich/blob/master/README.de.md)
+ • [Läs på svenska](https://github.com/textualize/rich/blob/master/README.sv.md)
+ • [日本語 readme](https://github.com/textualize/rich/blob/master/README.ja.md)
+ • [한국어 readme](https://github.com/textualize/rich/blob/master/README.kr.md)
+ • [Français readme](https://github.com/textualize/rich/blob/master/README.fr.md)
+ • [Schwizerdütsch readme](https://github.com/textualize/rich/blob/master/README.de-ch.md)
+ • [हिन्दी readme](https://github.com/textualize/rich/blob/master/README.hi.md)
+ • [Português brasileiro readme](https://github.com/textualize/rich/blob/master/README.pt-br.md)
+ • [Italian readme](https://github.com/textualize/rich/blob/master/README.it.md)
+ • [Русский readme](https://github.com/textualize/rich/blob/master/README.ru.md)
+ • [Indonesian readme](https://github.com/textualize/rich/blob/master/README.id.md)
+ • [فارسی readme](https://github.com/textualize/rich/blob/master/README.fa.md)
+ • [Türkçe readme](https://github.com/textualize/rich/blob/master/README.tr.md)
+ • [Polskie readme](https://github.com/textualize/rich/blob/master/README.pl.md)
+
+
+Rich is a Python library for _rich_ text and beautiful formatting in the terminal.
+
+The [Rich API](https://rich.readthedocs.io/en/latest/) makes it easy to add color and style to terminal output. Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, tracebacks, and more — out of the box.
+
+![Features](https://github.com/textualize/rich/raw/master/imgs/features.png)
+
+For a video introduction to Rich see [calmcode.io](https://calmcode.io/rich/introduction.html) by [@fishnets88](https://twitter.com/fishnets88).
+
+See what [people are saying about Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/).
+
+## Compatibility
+
+Rich works with Linux, macOS and Windows. True color / emoji works with new Windows Terminal, classic terminal is limited to 16 colors. Rich requires Python 3.8 or later.
+
+Rich works with [Jupyter notebooks](https://jupyter.org/) with no additional configuration required.
+
+## Installing
+
+Install with `pip` or your favorite PyPI package manager.
+
+```sh
+python -m pip install rich
+```
+
+Run the following to test Rich output on your terminal:
+
+```sh
+python -m rich
+```
+
+## Rich Print
+
+To effortlessly add rich output to your application, you can import the [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) method, which has the same signature as the builtin Python function. Try this:
+
+```python
+from rich import print
+
+print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
+```
+
+![Hello World](https://github.com/textualize/rich/raw/master/imgs/print.png)
+
+## Rich REPL
+
+Rich can be installed in the Python REPL, so that any data structures will be pretty printed and highlighted.
+
+```python
+>>> from rich import pretty
+>>> pretty.install()
+```
+
+![REPL](https://github.com/textualize/rich/raw/master/imgs/repl.png)
+
+## Using the Console
+
+For more control over rich terminal content, import and construct a [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) object.
+
+```python
+from rich.console import Console
+
+console = Console()
+```
+
+The Console object has a `print` method which has an intentionally similar interface to the builtin `print` function. Here's an example of use:
+
+```python
+console.print("Hello", "World!")
+```
+
+As you might expect, this will print `"Hello World!"` to the terminal. Note that unlike the builtin `print` function, Rich will word-wrap your text to fit within the terminal width.
+
+There are a few ways of adding color and style to your output. You can set a style for the entire output by adding a `style` keyword argument. Here's an example:
+
+```python
+console.print("Hello", "World!", style="bold red")
+```
+
+The output will be something like the following:
+
+![Hello World](https://github.com/textualize/rich/raw/master/imgs/hello_world.png)
+
+That's fine for styling a line of text at a time. For more finely grained styling, Rich renders a special markup which is similar in syntax to [bbcode](https://en.wikipedia.org/wiki/BBCode). Here's an example:
+
+```python
+console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].")
+```
+
+![Console Markup](https://github.com/textualize/rich/raw/master/imgs/where_there_is_a_will.png)
+
+You can use a Console object to generate sophisticated output with minimal effort. See the [Console API](https://rich.readthedocs.io/en/latest/console.html) docs for details.
+
+## Rich Inspect
+
+Rich has an [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) function which can produce a report on any Python object, such as class, instance, or builtin.
+
+```python
+>>> my_list = ["foo", "bar"]
+>>> from rich import inspect
+>>> inspect(my_list, methods=True)
+```
+
+![Log](https://github.com/textualize/rich/raw/master/imgs/inspect.png)
+
+See the [inspect docs](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) for details.
+
+# Rich Library
+
+Rich contains a number of builtin _renderables_ you can use to create elegant output in your CLI and help you debug your code.
+
+Click the following headings for details:
+
+<details>
+<summary>Log</summary>
+
+The Console object has a `log()` method which has a similar interface to `print()`, but also renders a column for the current time and the file and line which made the call. By default Rich will do syntax highlighting for Python structures and for repr strings. If you log a collection (i.e. a dict or a list) Rich will pretty print it so that it fits in the available space. Here's an example of some of these features.
+
+```python
+from rich.console import Console
+console = Console()
+
+test_data = [
+    {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",},
+    {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
+    {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"},
+]
+
+def test_log():
+    enabled = False
+    context = {
+        "foo": "bar",
+    }
+    movies = ["Deadpool", "Rise of the Skywalker"]
+    console.log("Hello from", console, "!")
+    console.log(test_data, log_locals=True)
+
+
+test_log()
+```
+
+The above produces the following output:
+
+![Log](https://github.com/textualize/rich/raw/master/imgs/log.png)
+
+Note the `log_locals` argument, which outputs a table containing the local variables where the log method was called.
+
+The log method could be used for logging to the terminal for long running applications such as servers, but is also a very nice debugging aid.
+
+</details>
+<details>
+<summary>Logging Handler</summary>
+
+You can also use the builtin [Handler class](https://rich.readthedocs.io/en/latest/logging.html) to format and colorize output from Python's logging module. Here's an example of the output:
+
+![Logging](https://github.com/textualize/rich/raw/master/imgs/logging.png)
+
+</details>
+
+<details>
+<summary>Emoji</summary>
+
+To insert an emoji in to console output place the name between two colons. Here's an example:
+
+```python
+>>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:")
+😃 🧛 💩 👍 🦝
+```
+
+Please use this feature wisely.
+
+</details>
+
+<details>
+<summary>Tables</summary>
+
+Rich can render flexible [tables](https://rich.readthedocs.io/en/latest/tables.html) with unicode box characters. There is a large variety of formatting options for borders, styles, cell alignment etc.
+
+![table movie](https://github.com/textualize/rich/raw/master/imgs/table_movie.gif)
+
+The animation above was generated with [table_movie.py](https://github.com/textualize/rich/blob/master/examples/table_movie.py) in the examples directory.
+
+Here's a simpler table example:
+
+```python
+from rich.console import Console
+from rich.table import Table
+
+console = Console()
+
+table = Table(show_header=True, header_style="bold magenta")
+table.add_column("Date", style="dim", width=12)
+table.add_column("Title")
+table.add_column("Production Budget", justify="right")
+table.add_column("Box Office", justify="right")
+table.add_row(
+    "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118"
+)
+table.add_row(
+    "May 25, 2018",
+    "[red]Solo[/red]: A Star Wars Story",
+    "$275,000,000",
+    "$393,151,347",
+)
+table.add_row(
+    "Dec 15, 2017",
+    "Star Wars Ep. VIII: The Last Jedi",
+    "$262,000,000",
+    "[bold]$1,332,539,889[/bold]",
+)
+
+console.print(table)
+```
+
+This produces the following output:
+
+![table](https://github.com/textualize/rich/raw/master/imgs/table.png)
+
+Note that console markup is rendered in the same way as `print()` and `log()`. In fact, anything that is renderable by Rich may be included in the headers / rows (even other tables).
+
+The `Table` class is smart enough to resize columns to fit the available width of the terminal, wrapping text as required. Here's the same example, with the terminal made smaller than the table above:
+
+![table2](https://github.com/textualize/rich/raw/master/imgs/table2.png)
+
+</details>
+
+<details>
+<summary>Progress Bars</summary>
+
+Rich can render multiple flicker-free [progress](https://rich.readthedocs.io/en/latest/progress.html) bars to track long-running tasks.
+
+For basic usage, wrap any sequence in the `track` function and iterate over the result. Here's an example:
+
+```python
+from rich.progress import track
+
+for step in track(range(100)):
+    do_step(step)
+```
+
+It's not much harder to add multiple progress bars. Here's an example taken from the docs:
+
+![progress](https://github.com/textualize/rich/raw/master/imgs/progress.gif)
+
+The columns may be configured to show any details you want. Built-in columns include percentage complete, file size, file speed, and time remaining. Here's another example showing a download in progress:
+
+![progress](https://github.com/textualize/rich/raw/master/imgs/downloader.gif)
+
+To try this out yourself, see [examples/downloader.py](https://github.com/textualize/rich/blob/master/examples/downloader.py) which can download multiple URLs simultaneously while displaying progress.
+
+</details>
+
+<details>
+<summary>Status</summary>
+
+For situations where it is hard to calculate progress, you can use the [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) method which will display a 'spinner' animation and message. The animation won't prevent you from using the console as normal. Here's an example:
+
+```python
+from time import sleep
+from rich.console import Console
+
+console = Console()
+tasks = [f"task {n}" for n in range(1, 11)]
+
+with console.status("[bold green]Working on tasks...") as status:
+    while tasks:
+        task = tasks.pop(0)
+        sleep(1)
+        console.log(f"{task} complete")
+```
+
+This generates the following output in the terminal.
+
+![status](https://github.com/textualize/rich/raw/master/imgs/status.gif)
+
+The spinner animations were borrowed from [cli-spinners](https://www.npmjs.com/package/cli-spinners). You can select a spinner by specifying the `spinner` parameter. Run the following command to see the available values:
+
+```
+python -m rich.spinner
+```
+
+The above command generates the following output in the terminal:
+
+![spinners](https://github.com/textualize/rich/raw/master/imgs/spinners.gif)
+
+</details>
+
+<details>
+<summary>Tree</summary>
+
+Rich can render a [tree](https://rich.readthedocs.io/en/latest/tree.html) with guide lines. A tree is ideal for displaying a file structure, or any other hierarchical data.
+
+The labels of the tree can be simple text or anything else Rich can render. Run the following for a demonstration:
+
+```
+python -m rich.tree
+```
+
+This generates the following output:
+
+![markdown](https://github.com/textualize/rich/raw/master/imgs/tree.png)
+
+See the [tree.py](https://github.com/textualize/rich/blob/master/examples/tree.py) example for a script that displays a tree view of any directory, similar to the linux `tree` command.
+
+</details>
+
+<details>
+<summary>Columns</summary>
+
+Rich can render content in neat [columns](https://rich.readthedocs.io/en/latest/columns.html) with equal or optimal width. Here's a very basic clone of the (MacOS / Linux) `ls` command which displays a directory listing in columns:
+
+```python
+import os
+import sys
+
+from rich import print
+from rich.columns import Columns
+
+directory = os.listdir(sys.argv[1])
+print(Columns(directory))
+```
+
+The following screenshot is the output from the [columns example](https://github.com/textualize/rich/blob/master/examples/columns.py) which displays data pulled from an API in columns:
+
+![columns](https://github.com/textualize/rich/raw/master/imgs/columns.png)
+
+</details>
+
+<details>
+<summary>Markdown</summary>
+
+Rich can render [markdown](https://rich.readthedocs.io/en/latest/markdown.html) and does a reasonable job of translating the formatting to the terminal.
+
+To render markdown import the `Markdown` class and construct it with a string containing markdown code. Then print it to the console. Here's an example:
+
+```python
+from rich.console import Console
+from rich.markdown import Markdown
+
+console = Console()
+with open("README.md") as readme:
+    markdown = Markdown(readme.read())
+console.print(markdown)
+```
+
+This will produce output something like the following:
+
+![markdown](https://github.com/textualize/rich/raw/master/imgs/markdown.png)
+
+</details>
+
+<details>
+<summary>Syntax Highlighting</summary>
+
+Rich uses the [pygments](https://pygments.org/) library to implement [syntax highlighting](https://rich.readthedocs.io/en/latest/syntax.html). Usage is similar to rendering markdown; construct a `Syntax` object and print it to the console. Here's an example:
+
+```python
+from rich.console import Console
+from rich.syntax import Syntax
+
+my_code = '''
+def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]:
+    """Iterate and generate a tuple with a flag for first and last value."""
+    iter_values = iter(values)
+    try:
+        previous_value = next(iter_values)
+    except StopIteration:
+        return
+    first = True
+    for value in iter_values:
+        yield first, False, previous_value
+        first = False
+        previous_value = value
+    yield first, True, previous_value
+'''
+syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True)
+console = Console()
+console.print(syntax)
+```
+
+This will produce the following output:
+
+![syntax](https://github.com/textualize/rich/raw/master/imgs/syntax.png)
+
+</details>
+
+<details>
+<summary>Tracebacks</summary>
+
+Rich can render [beautiful tracebacks](https://rich.readthedocs.io/en/latest/traceback.html) which are easier to read and show more code than standard Python tracebacks. You can set Rich as the default traceback handler so all uncaught exceptions will be rendered by Rich.
+
+Here's what it looks like on OSX (similar on Linux):
+
+![traceback](https://github.com/textualize/rich/raw/master/imgs/traceback.png)
+
+</details>
+
+All Rich renderables make use of the [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), which you can also use to implement your own Rich content.
+
+# Rich CLI
+
+
+See also [Rich CLI](https://github.com/textualize/rich-cli) for a command line application powered by Rich. Syntax highlight code, render markdown, display CSVs in tables, and more, directly from the command prompt.
+
+
+![Rich CLI](https://raw.githubusercontent.com/Textualize/rich-cli/main/imgs/rich-cli-splash.jpg)
+
+# Textual
+
+See also Rich's sister project, [Textual](https://github.com/Textualize/textual), which you can use to build sophisticated User Interfaces in the terminal.
+
+![Textual screenshot](https://raw.githubusercontent.com/Textualize/textual/main/imgs/textual.png)
+
diff --git a/.venv/Lib/site-packages/rich-14.0.0.dist-info/RECORD b/.venv/Lib/site-packages/rich-14.0.0.dist-info/RECORD
new file mode 100644 (file)
index 0000000..e27e6cf
--- /dev/null
@@ -0,0 +1,163 @@
+rich-14.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+rich-14.0.0.dist-info/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056
+rich-14.0.0.dist-info/METADATA,sha256=d9GYl36IYeimndEYRjoelIVrkxiBe-jvhPN0UouMqG0,18274
+rich-14.0.0.dist-info/RECORD,,
+rich-14.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+rich-14.0.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
+rich/__init__.py,sha256=lh2WcoIOJp5M5_lbAsSUMGv8oiJeumROazHH_AYMS8I,6066
+rich/__main__.py,sha256=Wvh53rmOMyWeUeyqUHpn1PXsHlBc4TVcQnqrw46nf9Y,8333
+rich/__pycache__/__init__.cpython-312.pyc,,
+rich/__pycache__/__main__.cpython-312.pyc,,
+rich/__pycache__/_cell_widths.cpython-312.pyc,,
+rich/__pycache__/_emoji_codes.cpython-312.pyc,,
+rich/__pycache__/_emoji_replace.cpython-312.pyc,,
+rich/__pycache__/_export_format.cpython-312.pyc,,
+rich/__pycache__/_extension.cpython-312.pyc,,
+rich/__pycache__/_fileno.cpython-312.pyc,,
+rich/__pycache__/_inspect.cpython-312.pyc,,
+rich/__pycache__/_log_render.cpython-312.pyc,,
+rich/__pycache__/_loop.cpython-312.pyc,,
+rich/__pycache__/_null_file.cpython-312.pyc,,
+rich/__pycache__/_palettes.cpython-312.pyc,,
+rich/__pycache__/_pick.cpython-312.pyc,,
+rich/__pycache__/_ratio.cpython-312.pyc,,
+rich/__pycache__/_spinners.cpython-312.pyc,,
+rich/__pycache__/_stack.cpython-312.pyc,,
+rich/__pycache__/_timer.cpython-312.pyc,,
+rich/__pycache__/_win32_console.cpython-312.pyc,,
+rich/__pycache__/_windows.cpython-312.pyc,,
+rich/__pycache__/_windows_renderer.cpython-312.pyc,,
+rich/__pycache__/_wrap.cpython-312.pyc,,
+rich/__pycache__/abc.cpython-312.pyc,,
+rich/__pycache__/align.cpython-312.pyc,,
+rich/__pycache__/ansi.cpython-312.pyc,,
+rich/__pycache__/bar.cpython-312.pyc,,
+rich/__pycache__/box.cpython-312.pyc,,
+rich/__pycache__/cells.cpython-312.pyc,,
+rich/__pycache__/color.cpython-312.pyc,,
+rich/__pycache__/color_triplet.cpython-312.pyc,,
+rich/__pycache__/columns.cpython-312.pyc,,
+rich/__pycache__/console.cpython-312.pyc,,
+rich/__pycache__/constrain.cpython-312.pyc,,
+rich/__pycache__/containers.cpython-312.pyc,,
+rich/__pycache__/control.cpython-312.pyc,,
+rich/__pycache__/default_styles.cpython-312.pyc,,
+rich/__pycache__/diagnose.cpython-312.pyc,,
+rich/__pycache__/emoji.cpython-312.pyc,,
+rich/__pycache__/errors.cpython-312.pyc,,
+rich/__pycache__/file_proxy.cpython-312.pyc,,
+rich/__pycache__/filesize.cpython-312.pyc,,
+rich/__pycache__/highlighter.cpython-312.pyc,,
+rich/__pycache__/json.cpython-312.pyc,,
+rich/__pycache__/jupyter.cpython-312.pyc,,
+rich/__pycache__/layout.cpython-312.pyc,,
+rich/__pycache__/live.cpython-312.pyc,,
+rich/__pycache__/live_render.cpython-312.pyc,,
+rich/__pycache__/logging.cpython-312.pyc,,
+rich/__pycache__/markdown.cpython-312.pyc,,
+rich/__pycache__/markup.cpython-312.pyc,,
+rich/__pycache__/measure.cpython-312.pyc,,
+rich/__pycache__/padding.cpython-312.pyc,,
+rich/__pycache__/pager.cpython-312.pyc,,
+rich/__pycache__/palette.cpython-312.pyc,,
+rich/__pycache__/panel.cpython-312.pyc,,
+rich/__pycache__/pretty.cpython-312.pyc,,
+rich/__pycache__/progress.cpython-312.pyc,,
+rich/__pycache__/progress_bar.cpython-312.pyc,,
+rich/__pycache__/prompt.cpython-312.pyc,,
+rich/__pycache__/protocol.cpython-312.pyc,,
+rich/__pycache__/region.cpython-312.pyc,,
+rich/__pycache__/repr.cpython-312.pyc,,
+rich/__pycache__/rule.cpython-312.pyc,,
+rich/__pycache__/scope.cpython-312.pyc,,
+rich/__pycache__/screen.cpython-312.pyc,,
+rich/__pycache__/segment.cpython-312.pyc,,
+rich/__pycache__/spinner.cpython-312.pyc,,
+rich/__pycache__/status.cpython-312.pyc,,
+rich/__pycache__/style.cpython-312.pyc,,
+rich/__pycache__/styled.cpython-312.pyc,,
+rich/__pycache__/syntax.cpython-312.pyc,,
+rich/__pycache__/table.cpython-312.pyc,,
+rich/__pycache__/terminal_theme.cpython-312.pyc,,
+rich/__pycache__/text.cpython-312.pyc,,
+rich/__pycache__/theme.cpython-312.pyc,,
+rich/__pycache__/themes.cpython-312.pyc,,
+rich/__pycache__/traceback.cpython-312.pyc,,
+rich/__pycache__/tree.cpython-312.pyc,,
+rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
+rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
+rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
+rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
+rich/_extension.py,sha256=G66PkbH_QdTJh6jD-J228O76CmAnr2hLQv72CgPPuzE,241
+rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
+rich/_inspect.py,sha256=QM05lEFnFoTaFqpnbx-zBEI6k8oIKrD3cvjEOQNhKig,9655
+rich/_log_render.py,sha256=xBKCxqiO4FZk8eG56f8crFdrmJxFrJsQE3V3F-fFekc,3213
+rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
+rich/_null_file.py,sha256=ADGKp1yt-k70FMKV6tnqCqecB-rSJzp-WQsD7LPL-kg,1394
+rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
+rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
+rich/_ratio.py,sha256=d2k38QnkJKhkHAqqSseqMQ-ZuvgbwnocRKhMQq84EdI,5459
+rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
+rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
+rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
+rich/_win32_console.py,sha256=o2QN_IRx10biGP3Ap1neaqX8FBGlUKSmWM6Kw4OSg-U,22719
+rich/_windows.py,sha256=is3WpbHMj8WaTHYB11hc6lP2t4hlvt4TViTlHSmjsi0,1901
+rich/_windows_renderer.py,sha256=d799xOnxLbCCCzGu9-U7YLmIQkxtxQIBFQQ6iu4veSc,2759
+rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
+rich/abc.py,sha256=dALMOGfKVNeAbvqq66IpTQxQUerxD7AE4FKwqd0eQKk,878
+rich/align.py,sha256=gxlfgvi4ah8ERmg8RpGFtWY1Z4WBuWm-6qSIUSFx4bQ,10421
+rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921
+rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
+rich/box.py,sha256=46rA0eBKLBcqNhCXmEKS4pN1dz36F0Vzi52hyVT-tyc,10783
+rich/cells.py,sha256=KrQkj5-LghCCpJLSNQIyAZjndc4bnEqOEmi5YuZ9UCY,5130
+rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211
+rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
+rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
+rich/console.py,sha256=Hi0WEKiqGzDJH1CaUhnDRGz5ThhwEBlNxQlSchhVJT8,100493
+rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
+rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
+rich/control.py,sha256=Ix-rO8ZhSB2q1Biazr4l72ZyAw27H9or7ElipWVVo0M,6606
+rich/default_styles.py,sha256=j9eZgSn7bqnymxYzYp8h-0OGTRy2ZOj-PfY9toqp0Rw,8221
+rich/diagnose.py,sha256=5VBWa56B0ahicEgz3F82OyGG78-vyYeYI_EkCFCbylw,950
+rich/emoji.py,sha256=1jTRHFwvQxY1ciul22MdEZcWc7brfjKT8FG6ZjXj5dM,2465
+rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
+rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
+rich/filesize.py,sha256=_iz9lIpRgvW7MNSeCZnLg-HwzbP4GETg543WqD8SFs0,2484
+rich/highlighter.py,sha256=G_sn-8DKjM1sEjLG_oc4ovkWmiUpWvj8bXi0yed2LnY,9586
+rich/json.py,sha256=omC2WHTgURxEosna1ftoSJCne2EX7MDuQtCdswS3qsk,5019
+rich/jupyter.py,sha256=G9pOJmR4ESIFYSd4MKGqmHqCtstx0oRWpyeTgv54-Xc,3228
+rich/layout.py,sha256=WR8PCSroYnteIT3zawxQ3k3ad1sQO5wGG1SZOoeBuBM,13944
+rich/live.py,sha256=DhzAPEnjTxQuq9_0Y2xh2MUwQcP_aGPkenLfKETslwM,14270
+rich/live_render.py,sha256=QaiB8dtGikCdssoXpkEmmiH55fxT-9bzLkBO9pbBvrU,3654
+rich/logging.py,sha256=aqZpsmIEE45-wbnZqWnEaNSdQ89cbGcaL26-ZV0poj0,12446
+rich/markdown.py,sha256=eDi7dMN7RQD5u21tuqCOSpNWGZdKmyGtKmaZNt257rA,25969
+rich/markup.py,sha256=btpr271BLhiCR1jNglRnv2BpIzVcNefYwSMeW9teDbc,8427
+rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
+rich/padding.py,sha256=h8XnIivLrNtlxI3vQPKHXh4hAwjOJqZx0slM0z3g1_M,4896
+rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
+rich/palette.py,sha256=Ar6ZUrYHiFt6-Rr2k-k9F8V7hxgJYHNdqjk2vVXsLgc,3288
+rich/panel.py,sha256=SUDaa3z4MU7vIjzvbi0SXuc6BslDzADwdY1AX4TbTdY,11225
+rich/pretty.py,sha256=eQs437AksYaCB2qO_d-z6e0DF_t5F1KfXfa1Hi-Ya0E,36355
+rich/progress.py,sha256=tLmBGHrAfxIQxfB2kq1IpNXTVFNuvl9bXd_QkLQUN8Q,60333
+rich/progress_bar.py,sha256=mZTPpJUwcfcdgQCTTz3kyY-fc79ddLwtx6Ghhxfo064,8162
+rich/prompt.py,sha256=k0CUIW-3I55jGk8U3O1WiEhdF6yXa2EiWeRqRhuJXWA,12435
+rich/protocol.py,sha256=Wt-2HZd67OYiopUkCTOz7lM38vyo5r3HEQZ9TOPDl5Q,1367
+rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
+rich/repr.py,sha256=HIsurPLZK9Gray75l3_vQx7S27AzTpAj4ChXSfe1Fes,4419
+rich/rule.py,sha256=umO21Wjw0FcYAeTB3UumNLCsDWhejzxnjlf2VwiXiDI,4590
+rich/scope.py,sha256=lf6Qet_e4JOY34lwhYSAG-NBXYKBcYu6t_igv_JoGog,2831
+rich/screen.py,sha256=rL_j2wX-4SeuIOI2oOlc418QP9EAvD59GInUmEAE6jQ,1579
+rich/segment.py,sha256=7gOdwSPrzu0a2gRmxBDtu3u2S8iG5s9l7wlB58dKMy0,24707
+rich/spinner.py,sha256=PT5qgXPG3ZpqRj7n3EZQ6NW56mx3ldZqZCU7gEMyZk4,4364
+rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
+rich/style.py,sha256=xpj4uMBZMtuNuNomfUiamigl3p1sDvTCZwrG1tcTVeg,27059
+rich/styled.py,sha256=wljVsVTXbABMMZvkzkO43ZEk_-irzEtvUiQ-sNnikQ8,1234
+rich/syntax.py,sha256=NY1DRIqXBkFExudqxm5K3BJXFCttN63AF_3IZAvtLMg,35655
+rich/table.py,sha256=52hmoLoHpeJEomznWvW8Ce2m1w62HuQDSGmaG6fYyqI,40025
+rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
+rich/text.py,sha256=v-vCOG8gS_D5QDhOhU19478-yEJGAXKVi8iYCCk7O_M,47540
+rich/theme.py,sha256=oNyhXhGagtDlbDye3tVu3esWOWk0vNkuxFw-_unlaK0,3771
+rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
+rich/traceback.py,sha256=oritjl2IgQ4fh6f7bu_SSKxGY-SLIRNpI0bS0Zx2yiI,35098
+rich/tree.py,sha256=QoOwg424FkdwGfR8K0tZ6Q7qtzWNAUP_m4sFaYuG6nw,9391
diff --git a/.venv/Lib/site-packages/rich-14.0.0.dist-info/REQUESTED b/.venv/Lib/site-packages/rich-14.0.0.dist-info/REQUESTED
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/.venv/Lib/site-packages/rich-14.0.0.dist-info/WHEEL b/.venv/Lib/site-packages/rich-14.0.0.dist-info/WHEEL
new file mode 100644 (file)
index 0000000..d73ccaa
--- /dev/null
@@ -0,0 +1,4 @@
+Wheel-Version: 1.0
+Generator: poetry-core 1.9.0
+Root-Is-Purelib: true
+Tag: py3-none-any
diff --git a/.venv/Lib/site-packages/rich/__init__.py b/.venv/Lib/site-packages/rich/__init__.py
new file mode 100644 (file)
index 0000000..b631d54
--- /dev/null
@@ -0,0 +1,177 @@
+"""Rich text and beautiful formatting in the terminal."""
+
+import os
+from typing import IO, TYPE_CHECKING, Any, Callable, Optional, Union
+
+from ._extension import load_ipython_extension  # noqa: F401
+
+__all__ = ["get_console", "reconfigure", "print", "inspect", "print_json"]
+
+if TYPE_CHECKING:
+    from .console import Console
+
+# Global console used by alternative print
+_console: Optional["Console"] = None
+
+try:
+    _IMPORT_CWD = os.path.abspath(os.getcwd())
+except FileNotFoundError:
+    # Can happen if the cwd has been deleted
+    _IMPORT_CWD = ""
+
+
+def get_console() -> "Console":
+    """Get a global :class:`~rich.console.Console` instance. This function is used when Rich requires a Console,
+    and hasn't been explicitly given one.
+
+    Returns:
+        Console: A console instance.
+    """
+    global _console
+    if _console is None:
+        from .console import Console
+
+        _console = Console()
+
+    return _console
+
+
+def reconfigure(*args: Any, **kwargs: Any) -> None:
+    """Reconfigures the global console by replacing it with another.
+
+    Args:
+        *args (Any): Positional arguments for the replacement :class:`~rich.console.Console`.
+        **kwargs (Any): Keyword arguments for the replacement :class:`~rich.console.Console`.
+    """
+    from rich.console import Console
+
+    new_console = Console(*args, **kwargs)
+    _console = get_console()
+    _console.__dict__ = new_console.__dict__
+
+
+def print(
+    *objects: Any,
+    sep: str = " ",
+    end: str = "\n",
+    file: Optional[IO[str]] = None,
+    flush: bool = False,
+) -> None:
+    r"""Print object(s) supplied via positional arguments.
+    This function has an identical signature to the built-in print.
+    For more advanced features, see the :class:`~rich.console.Console` class.
+
+    Args:
+        sep (str, optional): Separator between printed objects. Defaults to " ".
+        end (str, optional): Character to write at end of output. Defaults to "\\n".
+        file (IO[str], optional): File to write to, or None for stdout. Defaults to None.
+        flush (bool, optional): Has no effect as Rich always flushes output. Defaults to False.
+
+    """
+    from .console import Console
+
+    write_console = get_console() if file is None else Console(file=file)
+    return write_console.print(*objects, sep=sep, end=end)
+
+
+def print_json(
+    json: Optional[str] = None,
+    *,
+    data: Any = None,
+    indent: Union[None, int, str] = 2,
+    highlight: bool = True,
+    skip_keys: bool = False,
+    ensure_ascii: bool = False,
+    check_circular: bool = True,
+    allow_nan: bool = True,
+    default: Optional[Callable[[Any], Any]] = None,
+    sort_keys: bool = False,
+) -> None:
+    """Pretty prints JSON. Output will be valid JSON.
+
+    Args:
+        json (str): A string containing JSON.
+        data (Any): If json is not supplied, then encode this data.
+        indent (int, optional): Number of spaces to indent. Defaults to 2.
+        highlight (bool, optional): Enable highlighting of output: Defaults to True.
+        skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False.
+        ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False.
+        check_circular (bool, optional): Check for circular references. Defaults to True.
+        allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True.
+        default (Callable, optional): A callable that converts values that can not be encoded
+            in to something that can be JSON encoded. Defaults to None.
+        sort_keys (bool, optional): Sort dictionary keys. Defaults to False.
+    """
+
+    get_console().print_json(
+        json,
+        data=data,
+        indent=indent,
+        highlight=highlight,
+        skip_keys=skip_keys,
+        ensure_ascii=ensure_ascii,
+        check_circular=check_circular,
+        allow_nan=allow_nan,
+        default=default,
+        sort_keys=sort_keys,
+    )
+
+
+def inspect(
+    obj: Any,
+    *,
+    console: Optional["Console"] = None,
+    title: Optional[str] = None,
+    help: bool = False,
+    methods: bool = False,
+    docs: bool = True,
+    private: bool = False,
+    dunder: bool = False,
+    sort: bool = True,
+    all: bool = False,
+    value: bool = True,
+) -> None:
+    """Inspect any Python object.
+
+    * inspect(<OBJECT>) to see summarized info.
+    * inspect(<OBJECT>, methods=True) to see methods.
+    * inspect(<OBJECT>, help=True) to see full (non-abbreviated) help.
+    * inspect(<OBJECT>, private=True) to see private attributes (single underscore).
+    * inspect(<OBJECT>, dunder=True) to see attributes beginning with double underscore.
+    * inspect(<OBJECT>, all=True) to see all attributes.
+
+    Args:
+        obj (Any): An object to inspect.
+        title (str, optional): Title to display over inspect result, or None use type. Defaults to None.
+        help (bool, optional): Show full help text rather than just first paragraph. Defaults to False.
+        methods (bool, optional): Enable inspection of callables. Defaults to False.
+        docs (bool, optional): Also render doc strings. Defaults to True.
+        private (bool, optional): Show private attributes (beginning with underscore). Defaults to False.
+        dunder (bool, optional): Show attributes starting with double underscore. Defaults to False.
+        sort (bool, optional): Sort attributes alphabetically. Defaults to True.
+        all (bool, optional): Show all attributes. Defaults to False.
+        value (bool, optional): Pretty print value. Defaults to True.
+    """
+    _console = console or get_console()
+    from rich._inspect import Inspect
+
+    # Special case for inspect(inspect)
+    is_inspect = obj is inspect
+
+    _inspect = Inspect(
+        obj,
+        title=title,
+        help=is_inspect or help,
+        methods=is_inspect or methods,
+        docs=is_inspect or docs,
+        private=private,
+        dunder=dunder,
+        sort=sort,
+        all=all,
+        value=value,
+    )
+    _console.print(_inspect)
+
+
+if __name__ == "__main__":  # pragma: no cover
+    print("Hello, **World**")
diff --git a/.venv/Lib/site-packages/rich/__main__.py b/.venv/Lib/site-packages/rich/__main__.py
new file mode 100644 (file)
index 0000000..8b55130
--- /dev/null
@@ -0,0 +1,273 @@
+import colorsys
+import io
+from time import process_time
+
+from rich import box
+from rich.color import Color
+from rich.console import Console, ConsoleOptions, Group, RenderableType, RenderResult
+from rich.markdown import Markdown
+from rich.measure import Measurement
+from rich.pretty import Pretty
+from rich.segment import Segment
+from rich.style import Style
+from rich.syntax import Syntax
+from rich.table import Table
+from rich.text import Text
+
+
+class ColorBox:
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        for y in range(0, 5):
+            for x in range(options.max_width):
+                h = x / options.max_width
+                l = 0.1 + ((y / 5) * 0.7)
+                r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0)
+                r2, g2, b2 = colorsys.hls_to_rgb(h, l + 0.7 / 10, 1.0)
+                bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255)
+                color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255)
+                yield Segment("▄", Style(color=color, bgcolor=bgcolor))
+            yield Segment.line()
+
+    def __rich_measure__(
+        self, console: "Console", options: ConsoleOptions
+    ) -> Measurement:
+        return Measurement(1, options.max_width)
+
+
+def make_test_card() -> Table:
+    """Get a renderable that demonstrates a number of features."""
+    table = Table.grid(padding=1, pad_edge=True)
+    table.title = "Rich features"
+    table.add_column("Feature", no_wrap=True, justify="center", style="bold red")
+    table.add_column("Demonstration")
+
+    color_table = Table(
+        box=None,
+        expand=False,
+        show_header=False,
+        show_edge=False,
+        pad_edge=False,
+    )
+    color_table.add_row(
+        (
+            "✓ [bold green]4-bit color[/]\n"
+            "✓ [bold blue]8-bit color[/]\n"
+            "✓ [bold magenta]Truecolor (16.7 million)[/]\n"
+            "✓ [bold yellow]Dumb terminals[/]\n"
+            "✓ [bold cyan]Automatic color conversion"
+        ),
+        ColorBox(),
+    )
+
+    table.add_row("Colors", color_table)
+
+    table.add_row(
+        "Styles",
+        "All ansi styles: [bold]bold[/], [dim]dim[/], [italic]italic[/italic], [underline]underline[/], [strike]strikethrough[/], [reverse]reverse[/], and even [blink]blink[/].",
+    )
+
+    lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque in metus sed sapien ultricies pretium a at justo. Maecenas luctus velit et auctor maximus."
+    lorem_table = Table.grid(padding=1, collapse_padding=True)
+    lorem_table.pad_edge = False
+    lorem_table.add_row(
+        Text(lorem, justify="left", style="green"),
+        Text(lorem, justify="center", style="yellow"),
+        Text(lorem, justify="right", style="blue"),
+        Text(lorem, justify="full", style="red"),
+    )
+    table.add_row(
+        "Text",
+        Group(
+            Text.from_markup(
+                """Word wrap text. Justify [green]left[/], [yellow]center[/], [blue]right[/] or [red]full[/].\n"""
+            ),
+            lorem_table,
+        ),
+    )
+
+    def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Table:
+        table = Table(show_header=False, pad_edge=False, box=None, expand=True)
+        table.add_column("1", ratio=1)
+        table.add_column("2", ratio=1)
+        table.add_row(renderable1, renderable2)
+        return table
+
+    table.add_row(
+        "Asian\nlanguage\nsupport",
+        ":flag_for_china:  该库支持中文,日文和韩文文本!\n:flag_for_japan:  ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea:  이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다",
+    )
+
+    markup_example = (
+        "[bold magenta]Rich[/] supports a simple [i]bbcode[/i]-like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! "
+        ":+1: :apple: :ant: :bear: :baguette_bread: :bus: "
+    )
+    table.add_row("Markup", markup_example)
+
+    example_table = Table(
+        show_edge=False,
+        show_header=True,
+        expand=False,
+        row_styles=["none", "dim"],
+        box=box.SIMPLE,
+    )
+    example_table.add_column("[green]Date", style="green", no_wrap=True)
+    example_table.add_column("[blue]Title", style="blue")
+    example_table.add_column(
+        "[cyan]Production Budget",
+        style="cyan",
+        justify="right",
+        no_wrap=True,
+    )
+    example_table.add_column(
+        "[magenta]Box Office",
+        style="magenta",
+        justify="right",
+        no_wrap=True,
+    )
+    example_table.add_row(
+        "Dec 20, 2019",
+        "Star Wars: The Rise of Skywalker",
+        "$275,000,000",
+        "$375,126,118",
+    )
+    example_table.add_row(
+        "May 25, 2018",
+        "[b]Solo[/]: A Star Wars Story",
+        "$275,000,000",
+        "$393,151,347",
+    )
+    example_table.add_row(
+        "Dec 15, 2017",
+        "Star Wars Ep. VIII: The Last Jedi",
+        "$262,000,000",
+        "[bold]$1,332,539,889[/bold]",
+    )
+    example_table.add_row(
+        "May 19, 1999",
+        "Star Wars Ep. [b]I[/b]: [i]The phantom Menace",
+        "$115,000,000",
+        "$1,027,044,677",
+    )
+
+    table.add_row("Tables", example_table)
+
+    code = '''\
+def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]:
+    """Iterate and generate a tuple with a flag for last value."""
+    iter_values = iter(values)
+    try:
+        previous_value = next(iter_values)
+    except StopIteration:
+        return
+    for value in iter_values:
+        yield False, previous_value
+        previous_value = value
+    yield True, previous_value'''
+
+    pretty_data = {
+        "foo": [
+            3.1427,
+            (
+                "Paul Atreides",
+                "Vladimir Harkonnen",
+                "Thufir Hawat",
+            ),
+        ],
+        "atomic": (False, True, None),
+    }
+    table.add_row(
+        "Syntax\nhighlighting\n&\npretty\nprinting",
+        comparison(
+            Syntax(code, "python3", line_numbers=True, indent_guides=True),
+            Pretty(pretty_data, indent_guides=True),
+        ),
+    )
+
+    markdown_example = """\
+# Markdown
+
+Supports much of the *markdown* __syntax__!
+
+- Headers
+- Basic formatting: **bold**, *italic*, `code`
+- Block quotes
+- Lists, and more...
+    """
+    table.add_row(
+        "Markdown", comparison("[cyan]" + markdown_example, Markdown(markdown_example))
+    )
+
+    table.add_row(
+        "+more!",
+        """Progress bars, columns, styled logging handler, tracebacks, etc...""",
+    )
+    return table
+
+
+if __name__ == "__main__":  # pragma: no cover
+    console = Console(
+        file=io.StringIO(),
+        force_terminal=True,
+    )
+    test_card = make_test_card()
+
+    # Print once to warm cache
+    start = process_time()
+    console.print(test_card)
+    pre_cache_taken = round((process_time() - start) * 1000.0, 1)
+
+    console.file = io.StringIO()
+
+    start = process_time()
+    console.print(test_card)
+    taken = round((process_time() - start) * 1000.0, 1)
+
+    c = Console(record=True)
+    c.print(test_card)
+
+    print(f"rendered in {pre_cache_taken}ms (cold cache)")
+    print(f"rendered in {taken}ms (warm cache)")
+
+    from rich.panel import Panel
+
+    console = Console()
+
+    sponsor_message = Table.grid(padding=1)
+    sponsor_message.add_column(style="green", justify="right")
+    sponsor_message.add_column(no_wrap=True)
+
+    sponsor_message.add_row(
+        "Textualize",
+        "[u blue link=https://github.com/textualize]https://github.com/textualize",
+    )
+    sponsor_message.add_row(
+        "Twitter",
+        "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan",
+    )
+
+    intro_message = Text.from_markup(
+        """\
+We hope you enjoy using Rich!
+
+Rich is maintained with [red]:heart:[/] by [link=https://www.textualize.io]Textualize.io[/]
+
+- Will McGugan"""
+    )
+
+    message = Table.grid(padding=2)
+    message.add_column()
+    message.add_column(no_wrap=True)
+    message.add_row(intro_message, sponsor_message)
+
+    console.print(
+        Panel.fit(
+            message,
+            box=box.ROUNDED,
+            padding=(1, 2),
+            title="[b red]Thanks for trying out Rich!",
+            border_style="bright_blue",
+        ),
+        justify="center",
+    )
diff --git a/.venv/Lib/site-packages/rich/__pycache__/__init__.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/__init__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a4d20a2
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/__init__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/__main__.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/__main__.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9e7b9af
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/__main__.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_cell_widths.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_cell_widths.cpython-312.pyc
new file mode 100644 (file)
index 0000000..87b6bff
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_cell_widths.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_emoji_codes.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_emoji_codes.cpython-312.pyc
new file mode 100644 (file)
index 0000000..15b1f2b
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_emoji_codes.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_emoji_replace.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_emoji_replace.cpython-312.pyc
new file mode 100644 (file)
index 0000000..379783c
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_emoji_replace.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_export_format.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_export_format.cpython-312.pyc
new file mode 100644 (file)
index 0000000..87a5b02
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_export_format.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_extension.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_extension.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e631320
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_extension.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_fileno.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_fileno.cpython-312.pyc
new file mode 100644 (file)
index 0000000..054bd0b
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_fileno.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_inspect.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_inspect.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a76b44e
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_inspect.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_log_render.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_log_render.cpython-312.pyc
new file mode 100644 (file)
index 0000000..18e5c3e
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_log_render.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_loop.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_loop.cpython-312.pyc
new file mode 100644 (file)
index 0000000..d15bc61
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_loop.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_null_file.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_null_file.cpython-312.pyc
new file mode 100644 (file)
index 0000000..25c5f49
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_null_file.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_palettes.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_palettes.cpython-312.pyc
new file mode 100644 (file)
index 0000000..106d143
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_palettes.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_pick.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_pick.cpython-312.pyc
new file mode 100644 (file)
index 0000000..27e9b20
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_pick.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_ratio.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_ratio.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2d5d3c0
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_ratio.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_spinners.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_spinners.cpython-312.pyc
new file mode 100644 (file)
index 0000000..285a64b
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_spinners.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_stack.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_stack.cpython-312.pyc
new file mode 100644 (file)
index 0000000..016fa8d
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_stack.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_timer.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_timer.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2739927
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_timer.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_win32_console.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_win32_console.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ac89a87
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_win32_console.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_windows.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_windows.cpython-312.pyc
new file mode 100644 (file)
index 0000000..554e3b0
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_windows.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_windows_renderer.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_windows_renderer.cpython-312.pyc
new file mode 100644 (file)
index 0000000..53325bf
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_windows_renderer.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/_wrap.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/_wrap.cpython-312.pyc
new file mode 100644 (file)
index 0000000..777202c
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/_wrap.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/abc.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/abc.cpython-312.pyc
new file mode 100644 (file)
index 0000000..46b0a6b
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/abc.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/align.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/align.cpython-312.pyc
new file mode 100644 (file)
index 0000000..cc697da
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/align.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/ansi.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/ansi.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b783b1b
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/ansi.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/bar.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/bar.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3683232
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/bar.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/box.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/box.cpython-312.pyc
new file mode 100644 (file)
index 0000000..adb35da
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/box.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/cells.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/cells.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9925655
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/cells.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/color.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/color.cpython-312.pyc
new file mode 100644 (file)
index 0000000..85f1be1
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/color.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/color_triplet.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/color_triplet.cpython-312.pyc
new file mode 100644 (file)
index 0000000..74bd046
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/color_triplet.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/columns.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/columns.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f279d8b
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/columns.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/console.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/console.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ea57116
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/console.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/constrain.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/constrain.cpython-312.pyc
new file mode 100644 (file)
index 0000000..67016cb
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/constrain.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/containers.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/containers.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9b1a614
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/containers.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/control.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/control.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ef6580f
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/control.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/default_styles.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/default_styles.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f06a636
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/default_styles.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/diagnose.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/diagnose.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b333cfc
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/diagnose.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/emoji.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/emoji.cpython-312.pyc
new file mode 100644 (file)
index 0000000..27c49e8
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/emoji.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/errors.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/errors.cpython-312.pyc
new file mode 100644 (file)
index 0000000..34acc1a
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/errors.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/file_proxy.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/file_proxy.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4b13fb7
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/file_proxy.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/filesize.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/filesize.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5659073
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/filesize.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/highlighter.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/highlighter.cpython-312.pyc
new file mode 100644 (file)
index 0000000..773c51e
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/highlighter.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/json.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/json.cpython-312.pyc
new file mode 100644 (file)
index 0000000..44a6a60
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/json.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/jupyter.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/jupyter.cpython-312.pyc
new file mode 100644 (file)
index 0000000..44e872f
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/jupyter.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/layout.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/layout.cpython-312.pyc
new file mode 100644 (file)
index 0000000..80ae0d8
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/layout.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/live.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/live.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5282fff
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/live.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/live_render.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/live_render.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c06a67a
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/live_render.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/logging.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/logging.cpython-312.pyc
new file mode 100644 (file)
index 0000000..5441a0e
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/logging.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/markdown.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/markdown.cpython-312.pyc
new file mode 100644 (file)
index 0000000..15a6878
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/markdown.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/markup.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/markup.cpython-312.pyc
new file mode 100644 (file)
index 0000000..c32eb44
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/markup.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/measure.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/measure.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4a39665
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/measure.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/padding.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/padding.cpython-312.pyc
new file mode 100644 (file)
index 0000000..4c09dce
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/padding.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/pager.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/pager.cpython-312.pyc
new file mode 100644 (file)
index 0000000..b68e1a9
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/pager.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/palette.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/palette.cpython-312.pyc
new file mode 100644 (file)
index 0000000..99bfbad
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/palette.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/panel.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/panel.cpython-312.pyc
new file mode 100644 (file)
index 0000000..74edfd4
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/panel.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/pretty.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/pretty.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e9e7e78
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/pretty.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/progress.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/progress.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3eb06a4
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/progress.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/progress_bar.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/progress_bar.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6a7075e
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/progress_bar.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/prompt.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/prompt.cpython-312.pyc
new file mode 100644 (file)
index 0000000..66ea740
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/prompt.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/protocol.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/protocol.cpython-312.pyc
new file mode 100644 (file)
index 0000000..ddbc1f2
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/protocol.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/region.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/region.cpython-312.pyc
new file mode 100644 (file)
index 0000000..1e3bd6c
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/region.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/repr.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/repr.cpython-312.pyc
new file mode 100644 (file)
index 0000000..9bb0b2c
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/repr.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/rule.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/rule.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2f7a0e6
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/rule.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/scope.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/scope.cpython-312.pyc
new file mode 100644 (file)
index 0000000..6e02e31
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/scope.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/screen.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/screen.cpython-312.pyc
new file mode 100644 (file)
index 0000000..36cb0af
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/screen.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/segment.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/segment.cpython-312.pyc
new file mode 100644 (file)
index 0000000..be5e022
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/segment.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/spinner.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/spinner.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a614c57
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/spinner.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/status.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/status.cpython-312.pyc
new file mode 100644 (file)
index 0000000..eab95d0
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/status.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/style.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/style.cpython-312.pyc
new file mode 100644 (file)
index 0000000..e1d79f0
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/style.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/styled.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/styled.cpython-312.pyc
new file mode 100644 (file)
index 0000000..2cd9d04
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/styled.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/syntax.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/syntax.cpython-312.pyc
new file mode 100644 (file)
index 0000000..61e8764
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/syntax.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/table.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/table.cpython-312.pyc
new file mode 100644 (file)
index 0000000..bc3153f
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/table.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/terminal_theme.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/terminal_theme.cpython-312.pyc
new file mode 100644 (file)
index 0000000..34aff2f
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/terminal_theme.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/text.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/text.cpython-312.pyc
new file mode 100644 (file)
index 0000000..f156a03
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/text.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/theme.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/theme.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a93a0de
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/theme.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/themes.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/themes.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3a738f8
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/themes.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/traceback.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/traceback.cpython-312.pyc
new file mode 100644 (file)
index 0000000..3cdc6ca
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/traceback.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/__pycache__/tree.cpython-312.pyc b/.venv/Lib/site-packages/rich/__pycache__/tree.cpython-312.pyc
new file mode 100644 (file)
index 0000000..a96b86f
Binary files /dev/null and b/.venv/Lib/site-packages/rich/__pycache__/tree.cpython-312.pyc differ
diff --git a/.venv/Lib/site-packages/rich/_cell_widths.py b/.venv/Lib/site-packages/rich/_cell_widths.py
new file mode 100644 (file)
index 0000000..608ae3a
--- /dev/null
@@ -0,0 +1,454 @@
+# Auto generated by make_terminal_widths.py
+
+CELL_WIDTHS = [
+    (0, 0, 0),
+    (1, 31, -1),
+    (127, 159, -1),
+    (173, 173, 0),
+    (768, 879, 0),
+    (1155, 1161, 0),
+    (1425, 1469, 0),
+    (1471, 1471, 0),
+    (1473, 1474, 0),
+    (1476, 1477, 0),
+    (1479, 1479, 0),
+    (1536, 1541, 0),
+    (1552, 1562, 0),
+    (1564, 1564, 0),
+    (1611, 1631, 0),
+    (1648, 1648, 0),
+    (1750, 1757, 0),
+    (1759, 1764, 0),
+    (1767, 1768, 0),
+    (1770, 1773, 0),
+    (1807, 1807, 0),
+    (1809, 1809, 0),
+    (1840, 1866, 0),
+    (1958, 1968, 0),
+    (2027, 2035, 0),
+    (2045, 2045, 0),
+    (2070, 2073, 0),
+    (2075, 2083, 0),
+    (2085, 2087, 0),
+    (2089, 2093, 0),
+    (2137, 2139, 0),
+    (2192, 2193, 0),
+    (2200, 2207, 0),
+    (2250, 2307, 0),
+    (2362, 2364, 0),
+    (2366, 2383, 0),
+    (2385, 2391, 0),
+    (2402, 2403, 0),
+    (2433, 2435, 0),
+    (2492, 2492, 0),
+    (2494, 2500, 0),
+    (2503, 2504, 0),
+    (2507, 2509, 0),
+    (2519, 2519, 0),
+    (2530, 2531, 0),
+    (2558, 2558, 0),
+    (2561, 2563, 0),
+    (2620, 2620, 0),
+    (2622, 2626, 0),
+    (2631, 2632, 0),
+    (2635, 2637, 0),
+    (2641, 2641, 0),
+    (2672, 2673, 0),
+    (2677, 2677, 0),
+    (2689, 2691, 0),
+    (2748, 2748, 0),
+    (2750, 2757, 0),
+    (2759, 2761, 0),
+    (2763, 2765, 0),
+    (2786, 2787, 0),
+    (2810, 2815, 0),
+    (2817, 2819, 0),
+    (2876, 2876, 0),
+    (2878, 2884, 0),
+    (2887, 2888, 0),
+    (2891, 2893, 0),
+    (2901, 2903, 0),
+    (2914, 2915, 0),
+    (2946, 2946, 0),
+    (3006, 3010, 0),
+    (3014, 3016, 0),
+    (3018, 3021, 0),
+    (3031, 3031, 0),
+    (3072, 3076, 0),
+    (3132, 3132, 0),
+    (3134, 3140, 0),
+    (3142, 3144, 0),
+    (3146, 3149, 0),
+    (3157, 3158, 0),
+    (3170, 3171, 0),
+    (3201, 3203, 0),
+    (3260, 3260, 0),
+    (3262, 3268, 0),
+    (3270, 3272, 0),
+    (3274, 3277, 0),
+    (3285, 3286, 0),
+    (3298, 3299, 0),
+    (3315, 3315, 0),
+    (3328, 3331, 0),
+    (3387, 3388, 0),
+    (3390, 3396, 0),
+    (3398, 3400, 0),
+    (3402, 3405, 0),
+    (3415, 3415, 0),
+    (3426, 3427, 0),
+    (3457, 3459, 0),
+    (3530, 3530, 0),
+    (3535, 3540, 0),
+    (3542, 3542, 0),
+    (3544, 3551, 0),
+    (3570, 3571, 0),
+    (3633, 3633, 0),
+    (3636, 3642, 0),
+    (3655, 3662, 0),
+    (3761, 3761, 0),
+    (3764, 3772, 0),
+    (3784, 3790, 0),
+    (3864, 3865, 0),
+    (3893, 3893, 0),
+    (3895, 3895, 0),
+    (3897, 3897, 0),
+    (3902, 3903, 0),
+    (3953, 3972, 0),
+    (3974, 3975, 0),
+    (3981, 3991, 0),
+    (3993, 4028, 0),
+    (4038, 4038, 0),
+    (4139, 4158, 0),
+    (4182, 4185, 0),
+    (4190, 4192, 0),
+    (4194, 4196, 0),
+    (4199, 4205, 0),
+    (4209, 4212, 0),
+    (4226, 4237, 0),
+    (4239, 4239, 0),
+    (4250, 4253, 0),
+    (4352, 4447, 2),
+    (4448, 4607, 0),
+    (4957, 4959, 0),
+    (5906, 5909, 0),
+    (5938, 5940, 0),
+    (5970, 5971, 0),
+    (6002, 6003, 0),
+    (6068, 6099, 0),
+    (6109, 6109, 0),
+    (6155, 6159, 0),
+    (6277, 6278, 0),
+    (6313, 6313, 0),
+    (6432, 6443, 0),
+    (6448, 6459, 0),
+    (6679, 6683, 0),
+    (6741, 6750, 0),
+    (6752, 6780, 0),
+    (6783, 6783, 0),
+    (6832, 6862, 0),
+    (6912, 6916, 0),
+    (6964, 6980, 0),
+    (7019, 7027, 0),
+    (7040, 7042, 0),
+    (7073, 7085, 0),
+    (7142, 7155, 0),
+    (7204, 7223, 0),
+    (7376, 7378, 0),
+    (7380, 7400, 0),
+    (7405, 7405, 0),
+    (7412, 7412, 0),
+    (7415, 7417, 0),
+    (7616, 7679, 0),
+    (8203, 8207, 0),
+    (8232, 8238, 0),
+    (8288, 8292, 0),
+    (8294, 8303, 0),
+    (8400, 8432, 0),
+    (8986, 8987, 2),
+    (9001, 9002, 2),
+    (9193, 9196, 2),
+    (9200, 9200, 2),
+    (9203, 9203, 2),
+    (9725, 9726, 2),
+    (9748, 9749, 2),
+    (9800, 9811, 2),
+    (9855, 9855, 2),
+    (9875, 9875, 2),
+    (9889, 9889, 2),
+    (9898, 9899, 2),
+    (9917, 9918, 2),
+    (9924, 9925, 2),
+    (9934, 9934, 2),
+    (9940, 9940, 2),
+    (9962, 9962, 2),
+    (9970, 9971, 2),
+    (9973, 9973, 2),
+    (9978, 9978, 2),
+    (9981, 9981, 2),
+    (9989, 9989, 2),
+    (9994, 9995, 2),
+    (10024, 10024, 2),
+    (10060, 10060, 2),
+    (10062, 10062, 2),
+    (10067, 10069, 2),
+    (10071, 10071, 2),
+    (10133, 10135, 2),
+    (10160, 10160, 2),
+    (10175, 10175, 2),
+    (11035, 11036, 2),
+    (11088, 11088, 2),
+    (11093, 11093, 2),
+    (11503, 11505, 0),
+    (11647, 11647, 0),
+    (11744, 11775, 0),
+    (11904, 11929, 2),
+    (11931, 12019, 2),
+    (12032, 12245, 2),
+    (12272, 12329, 2),
+    (12330, 12335, 0),
+    (12336, 12350, 2),
+    (12353, 12438, 2),
+    (12441, 12442, 0),
+    (12443, 12543, 2),
+    (12549, 12591, 2),
+    (12593, 12686, 2),
+    (12688, 12771, 2),
+    (12783, 12830, 2),
+    (12832, 12871, 2),
+    (12880, 19903, 2),
+    (19968, 42124, 2),
+    (42128, 42182, 2),
+    (42607, 42610, 0),
+    (42612, 42621, 0),
+    (42654, 42655, 0),
+    (42736, 42737, 0),
+    (43010, 43010, 0),
+    (43014, 43014, 0),
+    (43019, 43019, 0),
+    (43043, 43047, 0),
+    (43052, 43052, 0),
+    (43136, 43137, 0),
+    (43188, 43205, 0),
+    (43232, 43249, 0),
+    (43263, 43263, 0),
+    (43302, 43309, 0),
+    (43335, 43347, 0),
+    (43360, 43388, 2),
+    (43392, 43395, 0),
+    (43443, 43456, 0),
+    (43493, 43493, 0),
+    (43561, 43574, 0),
+    (43587, 43587, 0),
+    (43596, 43597, 0),
+    (43643, 43645, 0),
+    (43696, 43696, 0),
+    (43698, 43700, 0),
+    (43703, 43704, 0),
+    (43710, 43711, 0),
+    (43713, 43713, 0),
+    (43755, 43759, 0),
+    (43765, 43766, 0),
+    (44003, 44010, 0),
+    (44012, 44013, 0),
+    (44032, 55203, 2),
+    (55216, 55295, 0),
+    (63744, 64255, 2),
+    (64286, 64286, 0),
+    (65024, 65039, 0),
+    (65040, 65049, 2),
+    (65056, 65071, 0),
+    (65072, 65106, 2),
+    (65108, 65126, 2),
+    (65128, 65131, 2),
+    (65279, 65279, 0),
+    (65281, 65376, 2),
+    (65504, 65510, 2),
+    (65529, 65531, 0),
+    (66045, 66045, 0),
+    (66272, 66272, 0),
+    (66422, 66426, 0),
+    (68097, 68099, 0),
+    (68101, 68102, 0),
+    (68108, 68111, 0),
+    (68152, 68154, 0),
+    (68159, 68159, 0),
+    (68325, 68326, 0),
+    (68900, 68903, 0),
+    (69291, 69292, 0),
+    (69373, 69375, 0),
+    (69446, 69456, 0),
+    (69506, 69509, 0),
+    (69632, 69634, 0),
+    (69688, 69702, 0),
+    (69744, 69744, 0),
+    (69747, 69748, 0),
+    (69759, 69762, 0),
+    (69808, 69818, 0),
+    (69821, 69821, 0),
+    (69826, 69826, 0),
+    (69837, 69837, 0),
+    (69888, 69890, 0),
+    (69927, 69940, 0),
+    (69957, 69958, 0),
+    (70003, 70003, 0),
+    (70016, 70018, 0),
+    (70067, 70080, 0),
+    (70089, 70092, 0),
+    (70094, 70095, 0),
+    (70188, 70199, 0),
+    (70206, 70206, 0),
+    (70209, 70209, 0),
+    (70367, 70378, 0),
+    (70400, 70403, 0),
+    (70459, 70460, 0),
+    (70462, 70468, 0),
+    (70471, 70472, 0),
+    (70475, 70477, 0),
+    (70487, 70487, 0),
+    (70498, 70499, 0),
+    (70502, 70508, 0),
+    (70512, 70516, 0),
+    (70709, 70726, 0),
+    (70750, 70750, 0),
+    (70832, 70851, 0),
+    (71087, 71093, 0),
+    (71096, 71104, 0),
+    (71132, 71133, 0),
+    (71216, 71232, 0),
+    (71339, 71351, 0),
+    (71453, 71467, 0),
+    (71724, 71738, 0),
+    (71984, 71989, 0),
+    (71991, 71992, 0),
+    (71995, 71998, 0),
+    (72000, 72000, 0),
+    (72002, 72003, 0),
+    (72145, 72151, 0),
+    (72154, 72160, 0),
+    (72164, 72164, 0),
+    (72193, 72202, 0),
+    (72243, 72249, 0),
+    (72251, 72254, 0),
+    (72263, 72263, 0),
+    (72273, 72283, 0),
+    (72330, 72345, 0),
+    (72751, 72758, 0),
+    (72760, 72767, 0),
+    (72850, 72871, 0),
+    (72873, 72886, 0),
+    (73009, 73014, 0),
+    (73018, 73018, 0),
+    (73020, 73021, 0),
+    (73023, 73029, 0),
+    (73031, 73031, 0),
+    (73098, 73102, 0),
+    (73104, 73105, 0),
+    (73107, 73111, 0),
+    (73459, 73462, 0),
+    (73472, 73473, 0),
+    (73475, 73475, 0),
+    (73524, 73530, 0),
+    (73534, 73538, 0),
+    (78896, 78912, 0),
+    (78919, 78933, 0),
+    (92912, 92916, 0),
+    (92976, 92982, 0),
+    (94031, 94031, 0),
+    (94033, 94087, 0),
+    (94095, 94098, 0),
+    (94176, 94179, 2),
+    (94180, 94180, 0),
+    (94192, 94193, 0),
+    (94208, 100343, 2),
+    (100352, 101589, 2),
+    (101632, 101640, 2),
+    (110576, 110579, 2),
+    (110581, 110587, 2),
+    (110589, 110590, 2),
+    (110592, 110882, 2),
+    (110898, 110898, 2),
+    (110928, 110930, 2),
+    (110933, 110933, 2),
+    (110948, 110951, 2),
+    (110960, 111355, 2),
+    (113821, 113822, 0),
+    (113824, 113827, 0),
+    (118528, 118573, 0),
+    (118576, 118598, 0),
+    (119141, 119145, 0),
+    (119149, 119170, 0),
+    (119173, 119179, 0),
+    (119210, 119213, 0),
+    (119362, 119364, 0),
+    (121344, 121398, 0),
+    (121403, 121452, 0),
+    (121461, 121461, 0),
+    (121476, 121476, 0),
+    (121499, 121503, 0),
+    (121505, 121519, 0),
+    (122880, 122886, 0),
+    (122888, 122904, 0),
+    (122907, 122913, 0),
+    (122915, 122916, 0),
+    (122918, 122922, 0),
+    (123023, 123023, 0),
+    (123184, 123190, 0),
+    (123566, 123566, 0),
+    (123628, 123631, 0),
+    (124140, 124143, 0),
+    (125136, 125142, 0),
+    (125252, 125258, 0),
+    (126980, 126980, 2),
+    (127183, 127183, 2),
+    (127374, 127374, 2),
+    (127377, 127386, 2),
+    (127488, 127490, 2),
+    (127504, 127547, 2),
+    (127552, 127560, 2),
+    (127568, 127569, 2),
+    (127584, 127589, 2),
+    (127744, 127776, 2),
+    (127789, 127797, 2),
+    (127799, 127868, 2),
+    (127870, 127891, 2),
+    (127904, 127946, 2),
+    (127951, 127955, 2),
+    (127968, 127984, 2),
+    (127988, 127988, 2),
+    (127992, 127994, 2),
+    (127995, 127999, 0),
+    (128000, 128062, 2),
+    (128064, 128064, 2),
+    (128066, 128252, 2),
+    (128255, 128317, 2),
+    (128331, 128334, 2),
+    (128336, 128359, 2),
+    (128378, 128378, 2),
+    (128405, 128406, 2),
+    (128420, 128420, 2),
+    (128507, 128591, 2),
+    (128640, 128709, 2),
+    (128716, 128716, 2),
+    (128720, 128722, 2),
+    (128725, 128727, 2),
+    (128732, 128735, 2),
+    (128747, 128748, 2),
+    (128756, 128764, 2),
+    (128992, 129003, 2),
+    (129008, 129008, 2),
+    (129292, 129338, 2),
+    (129340, 129349, 2),
+    (129351, 129535, 2),
+    (129648, 129660, 2),
+    (129664, 129672, 2),
+    (129680, 129725, 2),
+    (129727, 129733, 2),
+    (129742, 129755, 2),
+    (129760, 129768, 2),
+    (129776, 129784, 2),
+    (131072, 196605, 2),
+    (196608, 262141, 2),
+    (917505, 917505, 0),
+    (917536, 917631, 0),
+    (917760, 917999, 0),
+]
diff --git a/.venv/Lib/site-packages/rich/_emoji_codes.py b/.venv/Lib/site-packages/rich/_emoji_codes.py
new file mode 100644 (file)
index 0000000..1f2877b
--- /dev/null
@@ -0,0 +1,3610 @@
+EMOJI = {
+    "1st_place_medal": "🥇",
+    "2nd_place_medal": "🥈",
+    "3rd_place_medal": "🥉",
+    "ab_button_(blood_type)": "🆎",
+    "atm_sign": "🏧",
+    "a_button_(blood_type)": "🅰",
+    "afghanistan": "🇦🇫",
+    "albania": "🇦🇱",
+    "algeria": "🇩🇿",
+    "american_samoa": "🇦🇸",
+    "andorra": "🇦🇩",
+    "angola": "🇦🇴",
+    "anguilla": "🇦🇮",
+    "antarctica": "🇦🇶",
+    "antigua_&_barbuda": "🇦🇬",
+    "aquarius": "♒",
+    "argentina": "🇦🇷",
+    "aries": "♈",
+    "armenia": "🇦🇲",
+    "aruba": "🇦🇼",
+    "ascension_island": "🇦🇨",
+    "australia": "🇦🇺",
+    "austria": "🇦🇹",
+    "azerbaijan": "🇦🇿",
+    "back_arrow": "🔙",
+    "b_button_(blood_type)": "🅱",
+    "bahamas": "🇧🇸",
+    "bahrain": "🇧🇭",
+    "bangladesh": "🇧🇩",
+    "barbados": "🇧🇧",
+    "belarus": "🇧🇾",
+    "belgium": "🇧🇪",
+    "belize": "🇧🇿",
+    "benin": "🇧🇯",
+    "bermuda": "🇧🇲",
+    "bhutan": "🇧🇹",
+    "bolivia": "🇧🇴",
+    "bosnia_&_herzegovina": "🇧🇦",
+    "botswana": "🇧🇼",
+    "bouvet_island": "🇧🇻",
+    "brazil": "🇧🇷",
+    "british_indian_ocean_territory": "🇮🇴",
+    "british_virgin_islands": "🇻🇬",
+    "brunei": "🇧🇳",
+    "bulgaria": "🇧🇬",
+    "burkina_faso": "🇧🇫",
+    "burundi": "🇧🇮",
+    "cl_button": "🆑",
+    "cool_button": "🆒",
+    "cambodia": "🇰🇭",
+    "cameroon": "🇨🇲",
+    "canada": "🇨🇦",
+    "canary_islands": "🇮🇨",
+    "cancer": "♋",
+    "cape_verde": "🇨🇻",
+    "capricorn": "♑",
+    "caribbean_netherlands": "🇧🇶",
+    "cayman_islands": "🇰🇾",
+    "central_african_republic": "🇨🇫",
+    "ceuta_&_melilla": "🇪🇦",
+    "chad": "🇹🇩",
+    "chile": "🇨🇱",
+    "china": "🇨🇳",
+    "christmas_island": "🇨🇽",
+    "christmas_tree": "🎄",
+    "clipperton_island": "🇨🇵",
+    "cocos_(keeling)_islands": "🇨🇨",
+    "colombia": "🇨🇴",
+    "comoros": "🇰🇲",
+    "congo_-_brazzaville": "🇨🇬",
+    "congo_-_kinshasa": "🇨🇩",
+    "cook_islands": "🇨🇰",
+    "costa_rica": "🇨🇷",
+    "croatia": "🇭🇷",
+    "cuba": "🇨🇺",
+    "curaçao": "🇨🇼",
+    "cyprus": "🇨🇾",
+    "czechia": "🇨🇿",
+    "côte_d’ivoire": "🇨🇮",
+    "denmark": "🇩🇰",
+    "diego_garcia": "🇩🇬",
+    "djibouti": "🇩🇯",
+    "dominica": "🇩🇲",
+    "dominican_republic": "🇩🇴",
+    "end_arrow": "🔚",
+    "ecuador": "🇪🇨",
+    "egypt": "🇪🇬",
+    "el_salvador": "🇸🇻",
+    "england": "🏴\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f",
+    "equatorial_guinea": "🇬🇶",
+    "eritrea": "🇪🇷",
+    "estonia": "🇪🇪",
+    "ethiopia": "🇪🇹",
+    "european_union": "🇪🇺",
+    "free_button": "🆓",
+    "falkland_islands": "🇫🇰",
+    "faroe_islands": "🇫🇴",
+    "fiji": "🇫🇯",
+    "finland": "🇫🇮",
+    "france": "🇫🇷",
+    "french_guiana": "🇬🇫",
+    "french_polynesia": "🇵🇫",
+    "french_southern_territories": "🇹🇫",
+    "gabon": "🇬🇦",
+    "gambia": "🇬🇲",
+    "gemini": "♊",
+    "georgia": "🇬🇪",
+    "germany": "🇩🇪",
+    "ghana": "🇬🇭",
+    "gibraltar": "🇬🇮",
+    "greece": "🇬🇷",
+    "greenland": "🇬🇱",
+    "grenada": "🇬🇩",
+    "guadeloupe": "🇬🇵",
+    "guam": "🇬🇺",
+    "guatemala": "🇬🇹",
+    "guernsey": "🇬🇬",
+    "guinea": "🇬🇳",
+    "guinea-bissau": "🇬🇼",
+    "guyana": "🇬🇾",
+    "haiti": "🇭🇹",
+    "heard_&_mcdonald_islands": "🇭🇲",
+    "honduras": "🇭🇳",
+    "hong_kong_sar_china": "🇭🇰",
+    "hungary": "🇭🇺",
+    "id_button": "🆔",
+    "iceland": "🇮🇸",
+    "india": "🇮🇳",
+    "indonesia": "🇮🇩",
+    "iran": "🇮🇷",
+    "iraq": "🇮🇶",
+    "ireland": "🇮🇪",
+    "isle_of_man": "🇮🇲",
+    "israel": "🇮🇱",
+    "italy": "🇮🇹",
+    "jamaica": "🇯🇲",
+    "japan": "🗾",
+    "japanese_acceptable_button": "🉑",
+    "japanese_application_button": "🈸",
+    "japanese_bargain_button": "🉐",
+    "japanese_castle": "🏯",
+    "japanese_congratulations_button": "㊗",
+    "japanese_discount_button": "🈹",
+    "japanese_dolls": "🎎",
+    "japanese_free_of_charge_button": "🈚",
+    "japanese_here_button": "🈁",
+    "japanese_monthly_amount_button": "🈷",
+    "japanese_no_vacancy_button": "🈵",
+    "japanese_not_free_of_charge_button": "🈶",
+    "japanese_open_for_business_button": "🈺",
+    "japanese_passing_grade_button": "🈴",
+    "japanese_post_office": "🏣",
+    "japanese_prohibited_button": "🈲",
+    "japanese_reserved_button": "🈯",
+    "japanese_secret_button": "㊙",
+    "japanese_service_charge_button": "🈂",
+    "japanese_symbol_for_beginner": "🔰",
+    "japanese_vacancy_button": "🈳",
+    "jersey": "🇯🇪",
+    "jordan": "🇯🇴",
+    "kazakhstan": "🇰🇿",
+    "kenya": "🇰🇪",
+    "kiribati": "🇰🇮",
+    "kosovo": "🇽🇰",
+    "kuwait": "🇰🇼",
+    "kyrgyzstan": "🇰🇬",
+    "laos": "🇱🇦",
+    "latvia": "🇱🇻",
+    "lebanon": "🇱🇧",
+    "leo": "♌",
+    "lesotho": "🇱🇸",
+    "liberia": "🇱🇷",
+    "libra": "♎",
+    "libya": "🇱🇾",
+    "liechtenstein": "🇱🇮",
+    "lithuania": "🇱🇹",
+    "luxembourg": "🇱🇺",
+    "macau_sar_china": "🇲🇴",
+    "macedonia": "🇲🇰",
+    "madagascar": "🇲🇬",
+    "malawi": "🇲🇼",
+    "malaysia": "🇲🇾",
+    "maldives": "🇲🇻",
+    "mali": "🇲🇱",
+    "malta": "🇲🇹",
+    "marshall_islands": "🇲🇭",
+    "martinique": "🇲🇶",
+    "mauritania": "🇲🇷",
+    "mauritius": "🇲🇺",
+    "mayotte": "🇾🇹",
+    "mexico": "🇲🇽",
+    "micronesia": "🇫🇲",
+    "moldova": "🇲🇩",
+    "monaco": "🇲🇨",
+    "mongolia": "🇲🇳",
+    "montenegro": "🇲🇪",
+    "montserrat": "🇲🇸",
+    "morocco": "🇲🇦",
+    "mozambique": "🇲🇿",
+    "mrs._claus": "🤶",
+    "mrs._claus_dark_skin_tone": "🤶🏿",
+    "mrs._claus_light_skin_tone": "🤶🏻",
+    "mrs._claus_medium-dark_skin_tone": "🤶🏾",
+    "mrs._claus_medium-light_skin_tone": "🤶🏼",
+    "mrs._claus_medium_skin_tone": "🤶🏽",
+    "myanmar_(burma)": "🇲🇲",
+    "new_button": "🆕",
+    "ng_button": "🆖",
+    "namibia": "🇳🇦",
+    "nauru": "🇳🇷",
+    "nepal": "🇳🇵",
+    "netherlands": "🇳🇱",
+    "new_caledonia": "🇳🇨",
+    "new_zealand": "🇳🇿",
+    "nicaragua": "🇳🇮",
+    "niger": "🇳🇪",
+    "nigeria": "🇳🇬",
+    "niue": "🇳🇺",
+    "norfolk_island": "🇳🇫",
+    "north_korea": "🇰🇵",
+    "northern_mariana_islands": "🇲🇵",
+    "norway": "🇳🇴",
+    "ok_button": "🆗",
+    "ok_hand": "👌",
+    "ok_hand_dark_skin_tone": "👌🏿",
+    "ok_hand_light_skin_tone": "👌🏻",
+    "ok_hand_medium-dark_skin_tone": "👌🏾",
+    "ok_hand_medium-light_skin_tone": "👌🏼",
+    "ok_hand_medium_skin_tone": "👌🏽",
+    "on!_arrow": "🔛",
+    "o_button_(blood_type)": "🅾",
+    "oman": "🇴🇲",
+    "ophiuchus": "⛎",
+    "p_button": "🅿",
+    "pakistan": "🇵🇰",
+    "palau": "🇵🇼",
+    "palestinian_territories": "🇵🇸",
+    "panama": "🇵🇦",
+    "papua_new_guinea": "🇵🇬",
+    "paraguay": "🇵🇾",
+    "peru": "🇵🇪",
+    "philippines": "🇵🇭",
+    "pisces": "♓",
+    "pitcairn_islands": "🇵🇳",
+    "poland": "🇵🇱",
+    "portugal": "🇵🇹",
+    "puerto_rico": "🇵🇷",
+    "qatar": "🇶🇦",
+    "romania": "🇷🇴",
+    "russia": "🇷🇺",
+    "rwanda": "🇷🇼",
+    "réunion": "🇷🇪",
+    "soon_arrow": "🔜",
+    "sos_button": "🆘",
+    "sagittarius": "♐",
+    "samoa": "🇼🇸",
+    "san_marino": "🇸🇲",
+    "santa_claus": "🎅",
+    "santa_claus_dark_skin_tone": "🎅🏿",
+    "santa_claus_light_skin_tone": "🎅🏻",
+    "santa_claus_medium-dark_skin_tone": "🎅🏾",
+    "santa_claus_medium-light_skin_tone": "🎅🏼",
+    "santa_claus_medium_skin_tone": "🎅🏽",
+    "saudi_arabia": "🇸🇦",
+    "scorpio": "♏",
+    "scotland": "🏴\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f",
+    "senegal": "🇸🇳",
+    "serbia": "🇷🇸",
+    "seychelles": "🇸🇨",
+    "sierra_leone": "🇸🇱",
+    "singapore": "🇸🇬",
+    "sint_maarten": "🇸🇽",
+    "slovakia": "🇸🇰",
+    "slovenia": "🇸🇮",
+    "solomon_islands": "🇸🇧",
+    "somalia": "🇸🇴",
+    "south_africa": "🇿🇦",
+    "south_georgia_&_south_sandwich_islands": "🇬🇸",
+    "south_korea": "🇰🇷",
+    "south_sudan": "🇸🇸",
+    "spain": "🇪🇸",
+    "sri_lanka": "🇱🇰",
+    "st._barthélemy": "🇧🇱",
+    "st._helena": "🇸🇭",
+    "st._kitts_&_nevis": "🇰🇳",
+    "st._lucia": "🇱🇨",
+    "st._martin": "🇲🇫",
+    "st._pierre_&_miquelon": "🇵🇲",
+    "st._vincent_&_grenadines": "🇻🇨",
+    "statue_of_liberty": "🗽",
+    "sudan": "🇸🇩",
+    "suriname": "🇸🇷",
+    "svalbard_&_jan_mayen": "🇸🇯",
+    "swaziland": "🇸🇿",
+    "sweden": "🇸🇪",
+    "switzerland": "🇨🇭",
+    "syria": "🇸🇾",
+    "são_tomé_&_príncipe": "🇸🇹",
+    "t-rex": "🦖",
+    "top_arrow": "🔝",
+    "taiwan": "🇹🇼",
+    "tajikistan": "🇹🇯",
+    "tanzania": "🇹🇿",
+    "taurus": "♉",
+    "thailand": "🇹🇭",
+    "timor-leste": "🇹🇱",
+    "togo": "🇹🇬",
+    "tokelau": "🇹🇰",
+    "tokyo_tower": "🗼",
+    "tonga": "🇹🇴",
+    "trinidad_&_tobago": "🇹🇹",
+    "tristan_da_cunha": "🇹🇦",
+    "tunisia": "🇹🇳",
+    "turkey": "🦃",
+    "turkmenistan": "🇹🇲",
+    "turks_&_caicos_islands": "🇹🇨",
+    "tuvalu": "🇹🇻",
+    "u.s._outlying_islands": "🇺🇲",
+    "u.s._virgin_islands": "🇻🇮",
+    "up!_button": "🆙",
+    "uganda": "🇺🇬",
+    "ukraine": "🇺🇦",
+    "united_arab_emirates": "🇦🇪",
+    "united_kingdom": "🇬🇧",
+    "united_nations": "🇺🇳",
+    "united_states": "🇺🇸",
+    "uruguay": "🇺🇾",
+    "uzbekistan": "🇺🇿",
+    "vs_button": "🆚",
+    "vanuatu": "🇻🇺",
+    "vatican_city": "🇻🇦",
+    "venezuela": "🇻🇪",
+    "vietnam": "🇻🇳",
+    "virgo": "♍",
+    "wales": "🏴\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f",
+    "wallis_&_futuna": "🇼🇫",
+    "western_sahara": "🇪🇭",
+    "yemen": "🇾🇪",
+    "zambia": "🇿🇲",
+    "zimbabwe": "🇿🇼",
+    "abacus": "🧮",
+    "adhesive_bandage": "🩹",
+    "admission_tickets": "🎟",
+    "adult": "🧑",
+    "adult_dark_skin_tone": "🧑🏿",
+    "adult_light_skin_tone": "🧑🏻",
+    "adult_medium-dark_skin_tone": "🧑🏾",
+    "adult_medium-light_skin_tone": "🧑🏼",
+    "adult_medium_skin_tone": "🧑🏽",
+    "aerial_tramway": "🚡",
+    "airplane": "✈",
+    "airplane_arrival": "🛬",
+    "airplane_departure": "🛫",
+    "alarm_clock": "⏰",
+    "alembic": "⚗",
+    "alien": "👽",
+    "alien_monster": "👾",
+    "ambulance": "🚑",
+    "american_football": "🏈",
+    "amphora": "🏺",
+    "anchor": "⚓",
+    "anger_symbol": "💢",
+    "angry_face": "😠",
+    "angry_face_with_horns": "👿",
+    "anguished_face": "😧",
+    "ant": "🐜",
+    "antenna_bars": "📶",
+    "anxious_face_with_sweat": "😰",
+    "articulated_lorry": "🚛",
+    "artist_palette": "🎨",
+    "astonished_face": "😲",
+    "atom_symbol": "⚛",
+    "auto_rickshaw": "🛺",
+    "automobile": "🚗",
+    "avocado": "🥑",
+    "axe": "🪓",
+    "baby": "👶",
+    "baby_angel": "👼",
+    "baby_angel_dark_skin_tone": "👼🏿",
+    "baby_angel_light_skin_tone": "👼🏻",
+    "baby_angel_medium-dark_skin_tone": "👼🏾",
+    "baby_angel_medium-light_skin_tone": "👼🏼",
+    "baby_angel_medium_skin_tone": "👼🏽",
+    "baby_bottle": "🍼",
+    "baby_chick": "🐤",
+    "baby_dark_skin_tone": "👶🏿",
+    "baby_light_skin_tone": "👶🏻",
+    "baby_medium-dark_skin_tone": "👶🏾",
+    "baby_medium-light_skin_tone": "👶🏼",
+    "baby_medium_skin_tone": "👶🏽",
+    "baby_symbol": "🚼",
+    "backhand_index_pointing_down": "👇",
+    "backhand_index_pointing_down_dark_skin_tone": "👇🏿",
+    "backhand_index_pointing_down_light_skin_tone": "👇🏻",
+    "backhand_index_pointing_down_medium-dark_skin_tone": "👇🏾",
+    "backhand_index_pointing_down_medium-light_skin_tone": "👇🏼",
+    "backhand_index_pointing_down_medium_skin_tone": "👇🏽",
+    "backhand_index_pointing_left": "👈",
+    "backhand_index_pointing_left_dark_skin_tone": "👈🏿",
+    "backhand_index_pointing_left_light_skin_tone": "👈🏻",
+    "backhand_index_pointing_left_medium-dark_skin_tone": "👈🏾",
+    "backhand_index_pointing_left_medium-light_skin_tone": "👈🏼",
+    "backhand_index_pointing_left_medium_skin_tone": "👈🏽",
+    "backhand_index_pointing_right": "👉",
+    "backhand_index_pointing_right_dark_skin_tone": "👉🏿",
+    "backhand_index_pointing_right_light_skin_tone": "👉🏻",
+    "backhand_index_pointing_right_medium-dark_skin_tone": "👉🏾",
+    "backhand_index_pointing_right_medium-light_skin_tone": "👉🏼",
+    "backhand_index_pointing_right_medium_skin_tone": "👉🏽",
+    "backhand_index_pointing_up": "👆",
+    "backhand_index_pointing_up_dark_skin_tone": "👆🏿",
+    "backhand_index_pointing_up_light_skin_tone": "👆🏻",
+    "backhand_index_pointing_up_medium-dark_skin_tone": "👆🏾",
+    "backhand_index_pointing_up_medium-light_skin_tone": "👆🏼",
+    "backhand_index_pointing_up_medium_skin_tone": "👆🏽",
+    "bacon": "🥓",
+    "badger": "🦡",
+    "badminton": "🏸",
+    "bagel": "🥯",
+    "baggage_claim": "🛄",
+    "baguette_bread": "🥖",
+    "balance_scale": "⚖",
+    "bald": "🦲",
+    "bald_man": "👨\u200d🦲",
+    "bald_woman": "👩\u200d🦲",
+    "ballet_shoes": "🩰",
+    "balloon": "🎈",
+    "ballot_box_with_ballot": "🗳",
+    "ballot_box_with_check": "☑",
+    "banana": "🍌",
+    "banjo": "🪕",
+    "bank": "🏦",
+    "bar_chart": "📊",
+    "barber_pole": "💈",
+    "baseball": "⚾",
+    "basket": "🧺",
+    "basketball": "🏀",
+    "bat": "🦇",
+    "bathtub": "🛁",
+    "battery": "🔋",
+    "beach_with_umbrella": "🏖",
+    "beaming_face_with_smiling_eyes": "😁",
+    "bear_face": "🐻",
+    "bearded_person": "🧔",
+    "bearded_person_dark_skin_tone": "🧔🏿",
+    "bearded_person_light_skin_tone": "🧔🏻",
+    "bearded_person_medium-dark_skin_tone": "🧔🏾",
+    "bearded_person_medium-light_skin_tone": "🧔🏼",
+    "bearded_person_medium_skin_tone": "🧔🏽",
+    "beating_heart": "💓",
+    "bed": "🛏",
+    "beer_mug": "🍺",
+    "bell": "🔔",
+    "bell_with_slash": "🔕",
+    "bellhop_bell": "🛎",
+    "bento_box": "🍱",
+    "beverage_box": "🧃",
+    "bicycle": "🚲",
+    "bikini": "👙",
+    "billed_cap": "🧢",
+    "biohazard": "☣",
+    "bird": "🐦",
+    "birthday_cake": "🎂",
+    "black_circle": "⚫",
+    "black_flag": "🏴",
+    "black_heart": "🖤",
+    "black_large_square": "⬛",
+    "black_medium-small_square": "◾",
+    "black_medium_square": "◼",
+    "black_nib": "✒",
+    "black_small_square": "▪",
+    "black_square_button": "🔲",
+    "blond-haired_man": "👱\u200d♂️",
+    "blond-haired_man_dark_skin_tone": "👱🏿\u200d♂️",
+    "blond-haired_man_light_skin_tone": "👱🏻\u200d♂️",
+    "blond-haired_man_medium-dark_skin_tone": "👱🏾\u200d♂️",
+    "blond-haired_man_medium-light_skin_tone": "👱🏼\u200d♂️",
+    "blond-haired_man_medium_skin_tone": "👱🏽\u200d♂️",
+    "blond-haired_person": "👱",
+    "blond-haired_person_dark_skin_tone": "👱🏿",
+    "blond-haired_person_light_skin_tone": "👱🏻",
+    "blond-haired_person_medium-dark_skin_tone": "👱🏾",
+    "blond-haired_person_medium-light_skin_tone": "👱🏼",
+    "blond-haired_person_medium_skin_tone": "👱🏽",
+    "blond-haired_woman": "👱\u200d♀️",
+    "blond-haired_woman_dark_skin_tone": "👱🏿\u200d♀️",
+    "blond-haired_woman_light_skin_tone": "👱🏻\u200d♀️",
+    "blond-haired_woman_medium-dark_skin_tone": "👱🏾\u200d♀️",
+    "blond-haired_woman_medium-light_skin_tone": "👱🏼\u200d♀️",
+    "blond-haired_woman_medium_skin_tone": "👱🏽\u200d♀️",
+    "blossom": "🌼",
+    "blowfish": "🐡",
+    "blue_book": "📘",
+    "blue_circle": "🔵",
+    "blue_heart": "💙",
+    "blue_square": "🟦",
+    "boar": "🐗",
+    "bomb": "💣",
+    "bone": "🦴",
+    "bookmark": "🔖",
+    "bookmark_tabs": "📑",
+    "books": "📚",
+    "bottle_with_popping_cork": "🍾",
+    "bouquet": "💐",
+    "bow_and_arrow": "🏹",
+    "bowl_with_spoon": "🥣",
+    "bowling": "🎳",
+    "boxing_glove": "🥊",
+    "boy": "👦",
+    "boy_dark_skin_tone": "👦🏿",
+    "boy_light_skin_tone": "👦🏻",
+    "boy_medium-dark_skin_tone": "👦🏾",
+    "boy_medium-light_skin_tone": "👦🏼",
+    "boy_medium_skin_tone": "👦🏽",
+    "brain": "🧠",
+    "bread": "🍞",
+    "breast-feeding": "🤱",
+    "breast-feeding_dark_skin_tone": "🤱🏿",
+    "breast-feeding_light_skin_tone": "🤱🏻",
+    "breast-feeding_medium-dark_skin_tone": "🤱🏾",
+    "breast-feeding_medium-light_skin_tone": "🤱🏼",
+    "breast-feeding_medium_skin_tone": "🤱🏽",
+    "brick": "🧱",
+    "bride_with_veil": "👰",
+    "bride_with_veil_dark_skin_tone": "👰🏿",
+    "bride_with_veil_light_skin_tone": "👰🏻",
+    "bride_with_veil_medium-dark_skin_tone": "👰🏾",
+    "bride_with_veil_medium-light_skin_tone": "👰🏼",
+    "bride_with_veil_medium_skin_tone": "👰🏽",
+    "bridge_at_night": "🌉",
+    "briefcase": "💼",
+    "briefs": "🩲",
+    "bright_button": "🔆",
+    "broccoli": "🥦",
+    "broken_heart": "💔",
+    "broom": "🧹",
+    "brown_circle": "🟤",
+    "brown_heart": "🤎",
+    "brown_square": "🟫",
+    "bug": "🐛",
+    "building_construction": "🏗",
+    "bullet_train": "🚅",
+    "burrito": "🌯",
+    "bus": "🚌",
+    "bus_stop": "🚏",
+    "bust_in_silhouette": "👤",
+    "busts_in_silhouette": "👥",
+    "butter": "🧈",
+    "butterfly": "🦋",
+    "cactus": "🌵",
+    "calendar": "📆",
+    "call_me_hand": "🤙",
+    "call_me_hand_dark_skin_tone": "🤙🏿",
+    "call_me_hand_light_skin_tone": "🤙🏻",
+    "call_me_hand_medium-dark_skin_tone": "🤙🏾",
+    "call_me_hand_medium-light_skin_tone": "🤙🏼",
+    "call_me_hand_medium_skin_tone": "🤙🏽",
+    "camel": "🐫",
+    "camera": "📷",
+    "camera_with_flash": "📸",
+    "camping": "🏕",
+    "candle": "🕯",
+    "candy": "🍬",
+    "canned_food": "🥫",
+    "canoe": "🛶",
+    "card_file_box": "🗃",
+    "card_index": "📇",
+    "card_index_dividers": "🗂",
+    "carousel_horse": "🎠",
+    "carp_streamer": "🎏",
+    "carrot": "🥕",
+    "castle": "🏰",
+    "cat": "🐱",
+    "cat_face": "🐱",
+    "cat_face_with_tears_of_joy": "😹",
+    "cat_face_with_wry_smile": "😼",
+    "chains": "⛓",
+    "chair": "🪑",
+    "chart_decreasing": "📉",
+    "chart_increasing": "📈",
+    "chart_increasing_with_yen": "💹",
+    "cheese_wedge": "🧀",
+    "chequered_flag": "🏁",
+    "cherries": "🍒",
+    "cherry_blossom": "🌸",
+    "chess_pawn": "♟",
+    "chestnut": "🌰",
+    "chicken": "🐔",
+    "child": "🧒",
+    "child_dark_skin_tone": "🧒🏿",
+    "child_light_skin_tone": "🧒🏻",
+    "child_medium-dark_skin_tone": "🧒🏾",
+    "child_medium-light_skin_tone": "🧒🏼",
+    "child_medium_skin_tone": "🧒🏽",
+    "children_crossing": "🚸",
+    "chipmunk": "🐿",
+    "chocolate_bar": "🍫",
+    "chopsticks": "🥢",
+    "church": "⛪",
+    "cigarette": "🚬",
+    "cinema": "🎦",
+    "circled_m": "Ⓜ",
+    "circus_tent": "🎪",
+    "cityscape": "🏙",
+    "cityscape_at_dusk": "🌆",
+    "clamp": "🗜",
+    "clapper_board": "🎬",
+    "clapping_hands": "👏",
+    "clapping_hands_dark_skin_tone": "👏🏿",
+    "clapping_hands_light_skin_tone": "👏🏻",
+    "clapping_hands_medium-dark_skin_tone": "👏🏾",
+    "clapping_hands_medium-light_skin_tone": "👏🏼",
+    "clapping_hands_medium_skin_tone": "👏🏽",
+    "classical_building": "🏛",
+    "clinking_beer_mugs": "🍻",
+    "clinking_glasses": "🥂",
+    "clipboard": "📋",
+    "clockwise_vertical_arrows": "🔃",
+    "closed_book": "📕",
+    "closed_mailbox_with_lowered_flag": "📪",
+    "closed_mailbox_with_raised_flag": "📫",
+    "closed_umbrella": "🌂",
+    "cloud": "☁",
+    "cloud_with_lightning": "🌩",
+    "cloud_with_lightning_and_rain": "⛈",
+    "cloud_with_rain": "🌧",
+    "cloud_with_snow": "🌨",
+    "clown_face": "🤡",
+    "club_suit": "♣",
+    "clutch_bag": "👝",
+    "coat": "🧥",
+    "cocktail_glass": "🍸",
+    "coconut": "🥥",
+    "coffin": "⚰",
+    "cold_face": "🥶",
+    "collision": "💥",
+    "comet": "☄",
+    "compass": "🧭",
+    "computer_disk": "💽",
+    "computer_mouse": "🖱",
+    "confetti_ball": "🎊",
+    "confounded_face": "😖",
+    "confused_face": "😕",
+    "construction": "🚧",
+    "construction_worker": "👷",
+    "construction_worker_dark_skin_tone": "👷🏿",
+    "construction_worker_light_skin_tone": "👷🏻",
+    "construction_worker_medium-dark_skin_tone": "👷🏾",
+    "construction_worker_medium-light_skin_tone": "👷🏼",
+    "construction_worker_medium_skin_tone": "👷🏽",
+    "control_knobs": "🎛",
+    "convenience_store": "🏪",
+    "cooked_rice": "🍚",
+    "cookie": "🍪",
+    "cooking": "🍳",
+    "copyright": "©",
+    "couch_and_lamp": "🛋",
+    "counterclockwise_arrows_button": "🔄",
+    "couple_with_heart": "💑",
+    "couple_with_heart_man_man": "👨\u200d❤️\u200d👨",
+    "couple_with_heart_woman_man": "👩\u200d❤️\u200d👨",
+    "couple_with_heart_woman_woman": "👩\u200d❤️\u200d👩",
+    "cow": "🐮",
+    "cow_face": "🐮",
+    "cowboy_hat_face": "🤠",
+    "crab": "🦀",
+    "crayon": "🖍",
+    "credit_card": "💳",
+    "crescent_moon": "🌙",
+    "cricket": "🦗",
+    "cricket_game": "🏏",
+    "crocodile": "🐊",
+    "croissant": "🥐",
+    "cross_mark": "❌",
+    "cross_mark_button": "❎",
+    "crossed_fingers": "🤞",
+    "crossed_fingers_dark_skin_tone": "🤞🏿",
+    "crossed_fingers_light_skin_tone": "🤞🏻",
+    "crossed_fingers_medium-dark_skin_tone": "🤞🏾",
+    "crossed_fingers_medium-light_skin_tone": "🤞🏼",
+    "crossed_fingers_medium_skin_tone": "🤞🏽",
+    "crossed_flags": "🎌",
+    "crossed_swords": "⚔",
+    "crown": "👑",
+    "crying_cat_face": "😿",
+    "crying_face": "😢",
+    "crystal_ball": "🔮",
+    "cucumber": "🥒",
+    "cupcake": "🧁",
+    "cup_with_straw": "🥤",
+    "curling_stone": "🥌",
+    "curly_hair": "🦱",
+    "curly-haired_man": "👨\u200d🦱",
+    "curly-haired_woman": "👩\u200d🦱",
+    "curly_loop": "➰",
+    "currency_exchange": "💱",
+    "curry_rice": "🍛",
+    "custard": "🍮",
+    "customs": "🛃",
+    "cut_of_meat": "🥩",
+    "cyclone": "🌀",
+    "dagger": "🗡",
+    "dango": "🍡",
+    "dashing_away": "💨",
+    "deaf_person": "🧏",
+    "deciduous_tree": "🌳",
+    "deer": "🦌",
+    "delivery_truck": "🚚",
+    "department_store": "🏬",
+    "derelict_house": "🏚",
+    "desert": "🏜",
+    "desert_island": "🏝",
+    "desktop_computer": "🖥",
+    "detective": "🕵",
+    "detective_dark_skin_tone": "🕵🏿",
+    "detective_light_skin_tone": "🕵🏻",
+    "detective_medium-dark_skin_tone": "🕵🏾",
+    "detective_medium-light_skin_tone": "🕵🏼",
+    "detective_medium_skin_tone": "🕵🏽",
+    "diamond_suit": "♦",
+    "diamond_with_a_dot": "💠",
+    "dim_button": "🔅",
+    "direct_hit": "🎯",
+    "disappointed_face": "😞",
+    "diving_mask": "🤿",
+    "diya_lamp": "🪔",
+    "dizzy": "💫",
+    "dizzy_face": "😵",
+    "dna": "🧬",
+    "dog": "🐶",
+    "dog_face": "🐶",
+    "dollar_banknote": "💵",
+    "dolphin": "🐬",
+    "door": "🚪",
+    "dotted_six-pointed_star": "🔯",
+    "double_curly_loop": "➿",
+    "double_exclamation_mark": "‼",
+    "doughnut": "🍩",
+    "dove": "🕊",
+    "down-left_arrow": "↙",
+    "down-right_arrow": "↘",
+    "down_arrow": "⬇",
+    "downcast_face_with_sweat": "😓",
+    "downwards_button": "🔽",
+    "dragon": "🐉",
+    "dragon_face": "🐲",
+    "dress": "👗",
+    "drooling_face": "🤤",
+    "drop_of_blood": "🩸",
+    "droplet": "💧",
+    "drum": "🥁",
+    "duck": "🦆",
+    "dumpling": "🥟",
+    "dvd": "📀",
+    "e-mail": "📧",
+    "eagle": "🦅",
+    "ear": "👂",
+    "ear_dark_skin_tone": "👂🏿",
+    "ear_light_skin_tone": "👂🏻",
+    "ear_medium-dark_skin_tone": "👂🏾",
+    "ear_medium-light_skin_tone": "👂🏼",
+    "ear_medium_skin_tone": "👂🏽",
+    "ear_of_corn": "🌽",
+    "ear_with_hearing_aid": "🦻",
+    "egg": "🍳",
+    "eggplant": "🍆",
+    "eight-pointed_star": "✴",
+    "eight-spoked_asterisk": "✳",
+    "eight-thirty": "🕣",
+    "eight_o’clock": "🕗",
+    "eject_button": "⏏",
+    "electric_plug": "🔌",
+    "elephant": "🐘",
+    "eleven-thirty": "🕦",
+    "eleven_o’clock": "🕚",
+    "elf": "🧝",
+    "elf_dark_skin_tone": "🧝🏿",
+    "elf_light_skin_tone": "🧝🏻",
+    "elf_medium-dark_skin_tone": "🧝🏾",
+    "elf_medium-light_skin_tone": "🧝🏼",
+    "elf_medium_skin_tone": "🧝🏽",
+    "envelope": "✉",
+    "envelope_with_arrow": "📩",
+    "euro_banknote": "💶",
+    "evergreen_tree": "🌲",
+    "ewe": "🐑",
+    "exclamation_mark": "❗",
+    "exclamation_question_mark": "⁉",
+    "exploding_head": "🤯",
+    "expressionless_face": "😑",
+    "eye": "👁",
+    "eye_in_speech_bubble": "👁️\u200d🗨️",
+    "eyes": "👀",
+    "face_blowing_a_kiss": "😘",
+    "face_savoring_food": "😋",
+    "face_screaming_in_fear": "😱",
+    "face_vomiting": "🤮",
+    "face_with_hand_over_mouth": "🤭",
+    "face_with_head-bandage": "🤕",
+    "face_with_medical_mask": "😷",
+    "face_with_monocle": "🧐",
+    "face_with_open_mouth": "😮",
+    "face_with_raised_eyebrow": "🤨",
+    "face_with_rolling_eyes": "🙄",
+    "face_with_steam_from_nose": "😤",
+    "face_with_symbols_on_mouth": "🤬",
+    "face_with_tears_of_joy": "😂",
+    "face_with_thermometer": "🤒",
+    "face_with_tongue": "😛",
+    "face_without_mouth": "😶",
+    "factory": "🏭",
+    "fairy": "🧚",
+    "fairy_dark_skin_tone": "🧚🏿",
+    "fairy_light_skin_tone": "🧚🏻",
+    "fairy_medium-dark_skin_tone": "🧚🏾",
+    "fairy_medium-light_skin_tone": "🧚🏼",
+    "fairy_medium_skin_tone": "🧚🏽",
+    "falafel": "🧆",
+    "fallen_leaf": "🍂",
+    "family": "👪",
+    "family_man_boy": "👨\u200d👦",
+    "family_man_boy_boy": "👨\u200d👦\u200d👦",
+    "family_man_girl": "👨\u200d👧",
+    "family_man_girl_boy": "👨\u200d👧\u200d👦",
+    "family_man_girl_girl": "👨\u200d👧\u200d👧",
+    "family_man_man_boy": "👨\u200d👨\u200d👦",
+    "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦",
+    "family_man_man_girl": "👨\u200d👨\u200d👧",
+    "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦",
+    "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧",
+    "family_man_woman_boy": "👨\u200d👩\u200d👦",
+    "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦",
+    "family_man_woman_girl": "👨\u200d👩\u200d👧",
+    "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦",
+    "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧",
+    "family_woman_boy": "👩\u200d👦",
+    "family_woman_boy_boy": "👩\u200d👦\u200d👦",
+    "family_woman_girl": "👩\u200d👧",
+    "family_woman_girl_boy": "👩\u200d👧\u200d👦",
+    "family_woman_girl_girl": "👩\u200d👧\u200d👧",
+    "family_woman_woman_boy": "👩\u200d👩\u200d👦",
+    "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦",
+    "family_woman_woman_girl": "👩\u200d👩\u200d👧",
+    "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦",
+    "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧",
+    "fast-forward_button": "⏩",
+    "fast_down_button": "⏬",
+    "fast_reverse_button": "⏪",
+    "fast_up_button": "⏫",
+    "fax_machine": "📠",
+    "fearful_face": "😨",
+    "female_sign": "♀",
+    "ferris_wheel": "🎡",
+    "ferry": "⛴",
+    "field_hockey": "🏑",
+    "file_cabinet": "🗄",
+    "file_folder": "📁",
+    "film_frames": "🎞",
+    "film_projector": "📽",
+    "fire": "🔥",
+    "fire_extinguisher": "🧯",
+    "firecracker": "🧨",
+    "fire_engine": "🚒",
+    "fireworks": "🎆",
+    "first_quarter_moon": "🌓",
+    "first_quarter_moon_face": "🌛",
+    "fish": "🐟",
+    "fish_cake_with_swirl": "🍥",
+    "fishing_pole": "🎣",
+    "five-thirty": "🕠",
+    "five_o’clock": "🕔",
+    "flag_in_hole": "⛳",
+    "flamingo": "🦩",
+    "flashlight": "🔦",
+    "flat_shoe": "🥿",
+    "fleur-de-lis": "⚜",
+    "flexed_biceps": "💪",
+    "flexed_biceps_dark_skin_tone": "💪🏿",
+    "flexed_biceps_light_skin_tone": "💪🏻",
+    "flexed_biceps_medium-dark_skin_tone": "💪🏾",
+    "flexed_biceps_medium-light_skin_tone": "💪🏼",
+    "flexed_biceps_medium_skin_tone": "💪🏽",
+    "floppy_disk": "💾",
+    "flower_playing_cards": "🎴",
+    "flushed_face": "😳",
+    "flying_disc": "🥏",
+    "flying_saucer": "🛸",
+    "fog": "🌫",
+    "foggy": "🌁",
+    "folded_hands": "🙏",
+    "folded_hands_dark_skin_tone": "🙏🏿",
+    "folded_hands_light_skin_tone": "🙏🏻",
+    "folded_hands_medium-dark_skin_tone": "🙏🏾",
+    "folded_hands_medium-light_skin_tone": "🙏🏼",
+    "folded_hands_medium_skin_tone": "🙏🏽",
+    "foot": "🦶",
+    "footprints": "👣",
+    "fork_and_knife": "🍴",
+    "fork_and_knife_with_plate": "🍽",
+    "fortune_cookie": "🥠",
+    "fountain": "⛲",
+    "fountain_pen": "🖋",
+    "four-thirty": "🕟",
+    "four_leaf_clover": "🍀",
+    "four_o’clock": "🕓",
+    "fox_face": "🦊",
+    "framed_picture": "🖼",
+    "french_fries": "🍟",
+    "fried_shrimp": "🍤",
+    "frog_face": "🐸",
+    "front-facing_baby_chick": "🐥",
+    "frowning_face": "☹",
+    "frowning_face_with_open_mouth": "😦",
+    "fuel_pump": "⛽",
+    "full_moon": "🌕",
+    "full_moon_face": "🌝",
+    "funeral_urn": "⚱",
+    "game_die": "🎲",
+    "garlic": "🧄",
+    "gear": "⚙",
+    "gem_stone": "💎",
+    "genie": "🧞",
+    "ghost": "👻",
+    "giraffe": "🦒",
+    "girl": "👧",
+    "girl_dark_skin_tone": "👧🏿",
+    "girl_light_skin_tone": "👧🏻",
+    "girl_medium-dark_skin_tone": "👧🏾",
+    "girl_medium-light_skin_tone": "👧🏼",
+    "girl_medium_skin_tone": "👧🏽",
+    "glass_of_milk": "🥛",
+    "glasses": "👓",
+    "globe_showing_americas": "🌎",
+    "globe_showing_asia-australia": "🌏",
+    "globe_showing_europe-africa": "🌍",
+    "globe_with_meridians": "🌐",
+    "gloves": "🧤",
+    "glowing_star": "🌟",
+    "goal_net": "🥅",
+    "goat": "🐐",
+    "goblin": "👺",
+    "goggles": "🥽",
+    "gorilla": "🦍",
+    "graduation_cap": "🎓",
+    "grapes": "🍇",
+    "green_apple": "🍏",
+    "green_book": "📗",
+    "green_circle": "🟢",
+    "green_heart": "💚",
+    "green_salad": "🥗",
+    "green_square": "🟩",
+    "grimacing_face": "😬",
+    "grinning_cat_face": "😺",
+    "grinning_cat_face_with_smiling_eyes": "😸",
+    "grinning_face": "😀",
+    "grinning_face_with_big_eyes": "😃",
+    "grinning_face_with_smiling_eyes": "😄",
+    "grinning_face_with_sweat": "😅",
+    "grinning_squinting_face": "😆",
+    "growing_heart": "💗",
+    "guard": "💂",
+    "guard_dark_skin_tone": "💂🏿",
+    "guard_light_skin_tone": "💂🏻",
+    "guard_medium-dark_skin_tone": "💂🏾",
+    "guard_medium-light_skin_tone": "💂🏼",
+    "guard_medium_skin_tone": "💂🏽",
+    "guide_dog": "🦮",
+    "guitar": "🎸",
+    "hamburger": "🍔",
+    "hammer": "🔨",
+    "hammer_and_pick": "⚒",
+    "hammer_and_wrench": "🛠",
+    "hamster_face": "🐹",
+    "hand_with_fingers_splayed": "🖐",
+    "hand_with_fingers_splayed_dark_skin_tone": "🖐🏿",
+    "hand_with_fingers_splayed_light_skin_tone": "🖐🏻",
+    "hand_with_fingers_splayed_medium-dark_skin_tone": "🖐🏾",
+    "hand_with_fingers_splayed_medium-light_skin_tone": "🖐🏼",
+    "hand_with_fingers_splayed_medium_skin_tone": "🖐🏽",
+    "handbag": "👜",
+    "handshake": "🤝",
+    "hatching_chick": "🐣",
+    "headphone": "🎧",
+    "hear-no-evil_monkey": "🙉",
+    "heart_decoration": "💟",
+    "heart_suit": "♥",
+    "heart_with_arrow": "💘",
+    "heart_with_ribbon": "💝",
+    "heavy_check_mark": "✔",
+    "heavy_division_sign": "➗",
+    "heavy_dollar_sign": "💲",
+    "heavy_heart_exclamation": "❣",
+    "heavy_large_circle": "⭕",
+    "heavy_minus_sign": "➖",
+    "heavy_multiplication_x": "✖",
+    "heavy_plus_sign": "➕",
+    "hedgehog": "🦔",
+    "helicopter": "🚁",
+    "herb": "🌿",
+    "hibiscus": "🌺",
+    "high-heeled_shoe": "👠",
+    "high-speed_train": "🚄",
+    "high_voltage": "⚡",
+    "hiking_boot": "🥾",
+    "hindu_temple": "🛕",
+    "hippopotamus": "🦛",
+    "hole": "🕳",
+    "honey_pot": "🍯",
+    "honeybee": "🐝",
+    "horizontal_traffic_light": "🚥",
+    "horse": "🐴",
+    "horse_face": "🐴",
+    "horse_racing": "🏇",
+    "horse_racing_dark_skin_tone": "🏇🏿",
+    "horse_racing_light_skin_tone": "🏇🏻",
+    "horse_racing_medium-dark_skin_tone": "🏇🏾",
+    "horse_racing_medium-light_skin_tone": "🏇🏼",
+    "horse_racing_medium_skin_tone": "🏇🏽",
+    "hospital": "🏥",
+    "hot_beverage": "☕",
+    "hot_dog": "🌭",
+    "hot_face": "🥵",
+    "hot_pepper": "🌶",
+    "hot_springs": "♨",
+    "hotel": "🏨",
+    "hourglass_done": "⌛",
+    "hourglass_not_done": "⏳",
+    "house": "🏠",
+    "house_with_garden": "🏡",
+    "houses": "🏘",
+    "hugging_face": "🤗",
+    "hundred_points": "💯",
+    "hushed_face": "😯",
+    "ice": "🧊",
+    "ice_cream": "🍨",
+    "ice_hockey": "🏒",
+    "ice_skate": "⛸",
+    "inbox_tray": "📥",
+    "incoming_envelope": "📨",
+    "index_pointing_up": "☝",
+    "index_pointing_up_dark_skin_tone": "☝🏿",
+    "index_pointing_up_light_skin_tone": "☝🏻",
+    "index_pointing_up_medium-dark_skin_tone": "☝🏾",
+    "index_pointing_up_medium-light_skin_tone": "☝🏼",
+    "index_pointing_up_medium_skin_tone": "☝🏽",
+    "infinity": "♾",
+    "information": "ℹ",
+    "input_latin_letters": "🔤",
+    "input_latin_lowercase": "🔡",
+    "input_latin_uppercase": "🔠",
+    "input_numbers": "🔢",
+    "input_symbols": "🔣",
+    "jack-o-lantern": "🎃",
+    "jeans": "👖",
+    "jigsaw": "🧩",
+    "joker": "🃏",
+    "joystick": "🕹",
+    "kaaba": "🕋",
+    "kangaroo": "🦘",
+    "key": "🔑",
+    "keyboard": "⌨",
+    "keycap_#": "#️⃣",
+    "keycap_*": "*️⃣",
+    "keycap_0": "0️⃣",
+    "keycap_1": "1️⃣",
+    "keycap_10": "🔟",
+    "keycap_2": "2️⃣",
+    "keycap_3": "3️⃣",
+    "keycap_4": "4️⃣",
+    "keycap_5": "5️⃣",
+    "keycap_6": "6️⃣",
+    "keycap_7": "7️⃣",
+    "keycap_8": "8️⃣",
+    "keycap_9": "9️⃣",
+    "kick_scooter": "🛴",
+    "kimono": "👘",
+    "kiss": "💋",
+    "kiss_man_man": "👨\u200d❤️\u200d💋\u200d👨",
+    "kiss_mark": "💋",
+    "kiss_woman_man": "👩\u200d❤️\u200d💋\u200d👨",
+    "kiss_woman_woman": "👩\u200d❤️\u200d💋\u200d👩",
+    "kissing_cat_face": "😽",
+    "kissing_face": "😗",
+    "kissing_face_with_closed_eyes": "😚",
+    "kissing_face_with_smiling_eyes": "😙",
+    "kitchen_knife": "🔪",
+    "kite": "🪁",
+    "kiwi_fruit": "🥝",
+    "koala": "🐨",
+    "lab_coat": "🥼",
+    "label": "🏷",
+    "lacrosse": "🥍",
+    "lady_beetle": "🐞",
+    "laptop_computer": "💻",
+    "large_blue_diamond": "🔷",
+    "large_orange_diamond": "🔶",
+    "last_quarter_moon": "🌗",
+    "last_quarter_moon_face": "🌜",
+    "last_track_button": "⏮",
+    "latin_cross": "✝",
+    "leaf_fluttering_in_wind": "🍃",
+    "leafy_green": "🥬",
+    "ledger": "📒",
+    "left-facing_fist": "🤛",
+    "left-facing_fist_dark_skin_tone": "🤛🏿",
+    "left-facing_fist_light_skin_tone": "🤛🏻",
+    "left-facing_fist_medium-dark_skin_tone": "🤛🏾",
+    "left-facing_fist_medium-light_skin_tone": "🤛🏼",
+    "left-facing_fist_medium_skin_tone": "🤛🏽",
+    "left-right_arrow": "↔",
+    "left_arrow": "⬅",
+    "left_arrow_curving_right": "↪",
+    "left_luggage": "🛅",
+    "left_speech_bubble": "🗨",
+    "leg": "🦵",
+    "lemon": "🍋",
+    "leopard": "🐆",
+    "level_slider": "🎚",
+    "light_bulb": "💡",
+    "light_rail": "🚈",
+    "link": "🔗",
+    "linked_paperclips": "🖇",
+    "lion_face": "🦁",
+    "lipstick": "💄",
+    "litter_in_bin_sign": "🚮",
+    "lizard": "🦎",
+    "llama": "🦙",
+    "lobster": "🦞",
+    "locked": "🔒",
+    "locked_with_key": "🔐",
+    "locked_with_pen": "🔏",
+    "locomotive": "🚂",
+    "lollipop": "🍭",
+    "lotion_bottle": "🧴",
+    "loudly_crying_face": "😭",
+    "loudspeaker": "📢",
+    "love-you_gesture": "🤟",
+    "love-you_gesture_dark_skin_tone": "🤟🏿",
+    "love-you_gesture_light_skin_tone": "🤟🏻",
+    "love-you_gesture_medium-dark_skin_tone": "🤟🏾",
+    "love-you_gesture_medium-light_skin_tone": "🤟🏼",
+    "love-you_gesture_medium_skin_tone": "🤟🏽",
+    "love_hotel": "🏩",
+    "love_letter": "💌",
+    "luggage": "🧳",
+    "lying_face": "🤥",
+    "mage": "🧙",
+    "mage_dark_skin_tone": "🧙🏿",
+    "mage_light_skin_tone": "🧙🏻",
+    "mage_medium-dark_skin_tone": "🧙🏾",
+    "mage_medium-light_skin_tone": "🧙🏼",
+    "mage_medium_skin_tone": "🧙🏽",
+    "magnet": "🧲",
+    "magnifying_glass_tilted_left": "🔍",
+    "magnifying_glass_tilted_right": "🔎",
+    "mahjong_red_dragon": "🀄",
+    "male_sign": "♂",
+    "man": "👨",
+    "man_and_woman_holding_hands": "👫",
+    "man_artist": "👨\u200d🎨",
+    "man_artist_dark_skin_tone": "👨🏿\u200d🎨",
+    "man_artist_light_skin_tone": "👨🏻\u200d🎨",
+    "man_artist_medium-dark_skin_tone": "👨🏾\u200d🎨",
+    "man_artist_medium-light_skin_tone": "👨🏼\u200d🎨",
+    "man_artist_medium_skin_tone": "👨🏽\u200d🎨",
+    "man_astronaut": "👨\u200d🚀",
+    "man_astronaut_dark_skin_tone": "👨🏿\u200d🚀",
+    "man_astronaut_light_skin_tone": "👨🏻\u200d🚀",
+    "man_astronaut_medium-dark_skin_tone": "👨🏾\u200d🚀",
+    "man_astronaut_medium-light_skin_tone": "👨🏼\u200d🚀",
+    "man_astronaut_medium_skin_tone": "👨🏽\u200d🚀",
+    "man_biking": "🚴\u200d♂️",
+    "man_biking_dark_skin_tone": "🚴🏿\u200d♂️",
+    "man_biking_light_skin_tone": "🚴🏻\u200d♂️",
+    "man_biking_medium-dark_skin_tone": "🚴🏾\u200d♂️",
+    "man_biking_medium-light_skin_tone": "🚴🏼\u200d♂️",
+    "man_biking_medium_skin_tone": "🚴🏽\u200d♂️",
+    "man_bouncing_ball": "⛹️\u200d♂️",
+    "man_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♂️",
+    "man_bouncing_ball_light_skin_tone": "⛹🏻\u200d♂️",
+    "man_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♂️",
+    "man_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♂️",
+    "man_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♂️",
+    "man_bowing": "🙇\u200d♂️",
+    "man_bowing_dark_skin_tone": "🙇🏿\u200d♂️",
+    "man_bowing_light_skin_tone": "🙇🏻\u200d♂️",
+    "man_bowing_medium-dark_skin_tone": "🙇🏾\u200d♂️",
+    "man_bowing_medium-light_skin_tone": "🙇🏼\u200d♂️",
+    "man_bowing_medium_skin_tone": "🙇🏽\u200d♂️",
+    "man_cartwheeling": "🤸\u200d♂️",
+    "man_cartwheeling_dark_skin_tone": "🤸🏿\u200d♂️",
+    "man_cartwheeling_light_skin_tone": "🤸🏻\u200d♂️",
+    "man_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♂️",
+    "man_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♂️",
+    "man_cartwheeling_medium_skin_tone": "🤸🏽\u200d♂️",
+    "man_climbing": "🧗\u200d♂️",
+    "man_climbing_dark_skin_tone": "🧗🏿\u200d♂️",
+    "man_climbing_light_skin_tone": "🧗🏻\u200d♂️",
+    "man_climbing_medium-dark_skin_tone": "🧗🏾\u200d♂️",
+    "man_climbing_medium-light_skin_tone": "🧗🏼\u200d♂️",
+    "man_climbing_medium_skin_tone": "🧗🏽\u200d♂️",
+    "man_construction_worker": "👷\u200d♂️",
+    "man_construction_worker_dark_skin_tone": "👷🏿\u200d♂️",
+    "man_construction_worker_light_skin_tone": "👷🏻\u200d♂️",
+    "man_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♂️",
+    "man_construction_worker_medium-light_skin_tone": "👷🏼\u200d♂️",
+    "man_construction_worker_medium_skin_tone": "👷🏽\u200d♂️",
+    "man_cook": "👨\u200d🍳",
+    "man_cook_dark_skin_tone": "👨🏿\u200d🍳",
+    "man_cook_light_skin_tone": "👨🏻\u200d🍳",
+    "man_cook_medium-dark_skin_tone": "👨🏾\u200d🍳",
+    "man_cook_medium-light_skin_tone": "👨🏼\u200d🍳",
+    "man_cook_medium_skin_tone": "👨🏽\u200d🍳",
+    "man_dancing": "🕺",
+    "man_dancing_dark_skin_tone": "🕺🏿",
+    "man_dancing_light_skin_tone": "🕺🏻",
+    "man_dancing_medium-dark_skin_tone": "🕺🏾",
+    "man_dancing_medium-light_skin_tone": "🕺🏼",
+    "man_dancing_medium_skin_tone": "🕺🏽",
+    "man_dark_skin_tone": "👨🏿",
+    "man_detective": "🕵️\u200d♂️",
+    "man_detective_dark_skin_tone": "🕵🏿\u200d♂️",
+    "man_detective_light_skin_tone": "🕵🏻\u200d♂️",
+    "man_detective_medium-dark_skin_tone": "🕵🏾\u200d♂️",
+    "man_detective_medium-light_skin_tone": "🕵🏼\u200d♂️",
+    "man_detective_medium_skin_tone": "🕵🏽\u200d♂️",
+    "man_elf": "🧝\u200d♂️",
+    "man_elf_dark_skin_tone": "🧝🏿\u200d♂️",
+    "man_elf_light_skin_tone": "🧝🏻\u200d♂️",
+    "man_elf_medium-dark_skin_tone": "🧝🏾\u200d♂️",
+    "man_elf_medium-light_skin_tone": "🧝🏼\u200d♂️",
+    "man_elf_medium_skin_tone": "🧝🏽\u200d♂️",
+    "man_facepalming": "🤦\u200d♂️",
+    "man_facepalming_dark_skin_tone": "🤦🏿\u200d♂️",
+    "man_facepalming_light_skin_tone": "🤦🏻\u200d♂️",
+    "man_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♂️",
+    "man_facepalming_medium-light_skin_tone": "🤦🏼\u200d♂️",
+    "man_facepalming_medium_skin_tone": "🤦🏽\u200d♂️",
+    "man_factory_worker": "👨\u200d🏭",
+    "man_factory_worker_dark_skin_tone": "👨🏿\u200d🏭",
+    "man_factory_worker_light_skin_tone": "👨🏻\u200d🏭",
+    "man_factory_worker_medium-dark_skin_tone": "👨🏾\u200d🏭",
+    "man_factory_worker_medium-light_skin_tone": "👨🏼\u200d🏭",
+    "man_factory_worker_medium_skin_tone": "👨🏽\u200d🏭",
+    "man_fairy": "🧚\u200d♂️",
+    "man_fairy_dark_skin_tone": "🧚🏿\u200d♂️",
+    "man_fairy_light_skin_tone": "🧚🏻\u200d♂️",
+    "man_fairy_medium-dark_skin_tone": "🧚🏾\u200d♂️",
+    "man_fairy_medium-light_skin_tone": "🧚🏼\u200d♂️",
+    "man_fairy_medium_skin_tone": "🧚🏽\u200d♂️",
+    "man_farmer": "👨\u200d🌾",
+    "man_farmer_dark_skin_tone": "👨🏿\u200d🌾",
+    "man_farmer_light_skin_tone": "👨🏻\u200d🌾",
+    "man_farmer_medium-dark_skin_tone": "👨🏾\u200d🌾",
+    "man_farmer_medium-light_skin_tone": "👨🏼\u200d🌾",
+    "man_farmer_medium_skin_tone": "👨🏽\u200d🌾",
+    "man_firefighter": "👨\u200d🚒",
+    "man_firefighter_dark_skin_tone": "👨🏿\u200d🚒",
+    "man_firefighter_light_skin_tone": "👨🏻\u200d🚒",
+    "man_firefighter_medium-dark_skin_tone": "👨🏾\u200d🚒",
+    "man_firefighter_medium-light_skin_tone": "👨🏼\u200d🚒",
+    "man_firefighter_medium_skin_tone": "👨🏽\u200d🚒",
+    "man_frowning": "🙍\u200d♂️",
+    "man_frowning_dark_skin_tone": "🙍🏿\u200d♂️",
+    "man_frowning_light_skin_tone": "🙍🏻\u200d♂️",
+    "man_frowning_medium-dark_skin_tone": "🙍🏾\u200d♂️",
+    "man_frowning_medium-light_skin_tone": "🙍🏼\u200d♂️",
+    "man_frowning_medium_skin_tone": "🙍🏽\u200d♂️",
+    "man_genie": "🧞\u200d♂️",
+    "man_gesturing_no": "🙅\u200d♂️",
+    "man_gesturing_no_dark_skin_tone": "🙅🏿\u200d♂️",
+    "man_gesturing_no_light_skin_tone": "🙅🏻\u200d♂️",
+    "man_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♂️",
+    "man_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♂️",
+    "man_gesturing_no_medium_skin_tone": "🙅🏽\u200d♂️",
+    "man_gesturing_ok": "🙆\u200d♂️",
+    "man_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♂️",
+    "man_gesturing_ok_light_skin_tone": "🙆🏻\u200d♂️",
+    "man_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♂️",
+    "man_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♂️",
+    "man_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♂️",
+    "man_getting_haircut": "💇\u200d♂️",
+    "man_getting_haircut_dark_skin_tone": "💇🏿\u200d♂️",
+    "man_getting_haircut_light_skin_tone": "💇🏻\u200d♂️",
+    "man_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♂️",
+    "man_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♂️",
+    "man_getting_haircut_medium_skin_tone": "💇🏽\u200d♂️",
+    "man_getting_massage": "💆\u200d♂️",
+    "man_getting_massage_dark_skin_tone": "💆🏿\u200d♂️",
+    "man_getting_massage_light_skin_tone": "💆🏻\u200d♂️",
+    "man_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♂️",
+    "man_getting_massage_medium-light_skin_tone": "💆🏼\u200d♂️",
+    "man_getting_massage_medium_skin_tone": "💆🏽\u200d♂️",
+    "man_golfing": "🏌️\u200d♂️",
+    "man_golfing_dark_skin_tone": "🏌🏿\u200d♂️",
+    "man_golfing_light_skin_tone": "🏌🏻\u200d♂️",
+    "man_golfing_medium-dark_skin_tone": "🏌🏾\u200d♂️",
+    "man_golfing_medium-light_skin_tone": "🏌🏼\u200d♂️",
+    "man_golfing_medium_skin_tone": "🏌🏽\u200d♂️",
+    "man_guard": "💂\u200d♂️",
+    "man_guard_dark_skin_tone": "💂🏿\u200d♂️",
+    "man_guard_light_skin_tone": "💂🏻\u200d♂️",
+    "man_guard_medium-dark_skin_tone": "💂🏾\u200d♂️",
+    "man_guard_medium-light_skin_tone": "💂🏼\u200d♂️",
+    "man_guard_medium_skin_tone": "💂🏽\u200d♂️",
+    "man_health_worker": "👨\u200d⚕️",
+    "man_health_worker_dark_skin_tone": "👨🏿\u200d⚕️",
+    "man_health_worker_light_skin_tone": "👨🏻\u200d⚕️",
+    "man_health_worker_medium-dark_skin_tone": "👨🏾\u200d⚕️",
+    "man_health_worker_medium-light_skin_tone": "👨🏼\u200d⚕️",
+    "man_health_worker_medium_skin_tone": "👨🏽\u200d⚕️",
+    "man_in_lotus_position": "🧘\u200d♂️",
+    "man_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♂️",
+    "man_in_lotus_position_light_skin_tone": "🧘🏻\u200d♂️",
+    "man_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♂️",
+    "man_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♂️",
+    "man_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♂️",
+    "man_in_manual_wheelchair": "👨\u200d🦽",
+    "man_in_motorized_wheelchair": "👨\u200d🦼",
+    "man_in_steamy_room": "🧖\u200d♂️",
+    "man_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♂️",
+    "man_in_steamy_room_light_skin_tone": "🧖🏻\u200d♂️",
+    "man_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♂️",
+    "man_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♂️",
+    "man_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♂️",
+    "man_in_suit_levitating": "🕴",
+    "man_in_suit_levitating_dark_skin_tone": "🕴🏿",
+    "man_in_suit_levitating_light_skin_tone": "🕴🏻",
+    "man_in_suit_levitating_medium-dark_skin_tone": "🕴🏾",
+    "man_in_suit_levitating_medium-light_skin_tone": "🕴🏼",
+    "man_in_suit_levitating_medium_skin_tone": "🕴🏽",
+    "man_in_tuxedo": "🤵",
+    "man_in_tuxedo_dark_skin_tone": "🤵🏿",
+    "man_in_tuxedo_light_skin_tone": "🤵🏻",
+    "man_in_tuxedo_medium-dark_skin_tone": "🤵🏾",
+    "man_in_tuxedo_medium-light_skin_tone": "🤵🏼",
+    "man_in_tuxedo_medium_skin_tone": "🤵🏽",
+    "man_judge": "👨\u200d⚖️",
+    "man_judge_dark_skin_tone": "👨🏿\u200d⚖️",
+    "man_judge_light_skin_tone": "👨🏻\u200d⚖️",
+    "man_judge_medium-dark_skin_tone": "👨🏾\u200d⚖️",
+    "man_judge_medium-light_skin_tone": "👨🏼\u200d⚖️",
+    "man_judge_medium_skin_tone": "👨🏽\u200d⚖️",
+    "man_juggling": "🤹\u200d♂️",
+    "man_juggling_dark_skin_tone": "🤹🏿\u200d♂️",
+    "man_juggling_light_skin_tone": "🤹🏻\u200d♂️",
+    "man_juggling_medium-dark_skin_tone": "🤹🏾\u200d♂️",
+    "man_juggling_medium-light_skin_tone": "🤹🏼\u200d♂️",
+    "man_juggling_medium_skin_tone": "🤹🏽\u200d♂️",
+    "man_lifting_weights": "🏋️\u200d♂️",
+    "man_lifting_weights_dark_skin_tone": "🏋🏿\u200d♂️",
+    "man_lifting_weights_light_skin_tone": "🏋🏻\u200d♂️",
+    "man_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♂️",
+    "man_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♂️",
+    "man_lifting_weights_medium_skin_tone": "🏋🏽\u200d♂️",
+    "man_light_skin_tone": "👨🏻",
+    "man_mage": "🧙\u200d♂️",
+    "man_mage_dark_skin_tone": "🧙🏿\u200d♂️",
+    "man_mage_light_skin_tone": "🧙🏻\u200d♂️",
+    "man_mage_medium-dark_skin_tone": "🧙🏾\u200d♂️",
+    "man_mage_medium-light_skin_tone": "🧙🏼\u200d♂️",
+    "man_mage_medium_skin_tone": "🧙🏽\u200d♂️",
+    "man_mechanic": "👨\u200d🔧",
+    "man_mechanic_dark_skin_tone": "👨🏿\u200d🔧",
+    "man_mechanic_light_skin_tone": "👨🏻\u200d🔧",
+    "man_mechanic_medium-dark_skin_tone": "👨🏾\u200d🔧",
+    "man_mechanic_medium-light_skin_tone": "👨🏼\u200d🔧",
+    "man_mechanic_medium_skin_tone": "👨🏽\u200d🔧",
+    "man_medium-dark_skin_tone": "👨🏾",
+    "man_medium-light_skin_tone": "👨🏼",
+    "man_medium_skin_tone": "👨🏽",
+    "man_mountain_biking": "🚵\u200d♂️",
+    "man_mountain_biking_dark_skin_tone": "🚵🏿\u200d♂️",
+    "man_mountain_biking_light_skin_tone": "🚵🏻\u200d♂️",
+    "man_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♂️",
+    "man_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♂️",
+    "man_mountain_biking_medium_skin_tone": "🚵🏽\u200d♂️",
+    "man_office_worker": "👨\u200d💼",
+    "man_office_worker_dark_skin_tone": "👨🏿\u200d💼",
+    "man_office_worker_light_skin_tone": "👨🏻\u200d💼",
+    "man_office_worker_medium-dark_skin_tone": "👨🏾\u200d💼",
+    "man_office_worker_medium-light_skin_tone": "👨🏼\u200d💼",
+    "man_office_worker_medium_skin_tone": "👨🏽\u200d💼",
+    "man_pilot": "👨\u200d✈️",
+    "man_pilot_dark_skin_tone": "👨🏿\u200d✈️",
+    "man_pilot_light_skin_tone": "👨🏻\u200d✈️",
+    "man_pilot_medium-dark_skin_tone": "👨🏾\u200d✈️",
+    "man_pilot_medium-light_skin_tone": "👨🏼\u200d✈️",
+    "man_pilot_medium_skin_tone": "👨🏽\u200d✈️",
+    "man_playing_handball": "🤾\u200d♂️",
+    "man_playing_handball_dark_skin_tone": "🤾🏿\u200d♂️",
+    "man_playing_handball_light_skin_tone": "🤾🏻\u200d♂️",
+    "man_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♂️",
+    "man_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♂️",
+    "man_playing_handball_medium_skin_tone": "🤾🏽\u200d♂️",
+    "man_playing_water_polo": "🤽\u200d♂️",
+    "man_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♂️",
+    "man_playing_water_polo_light_skin_tone": "🤽🏻\u200d♂️",
+    "man_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♂️",
+    "man_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♂️",
+    "man_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♂️",
+    "man_police_officer": "👮\u200d♂️",
+    "man_police_officer_dark_skin_tone": "👮🏿\u200d♂️",
+    "man_police_officer_light_skin_tone": "👮🏻\u200d♂️",
+    "man_police_officer_medium-dark_skin_tone": "👮🏾\u200d♂️",
+    "man_police_officer_medium-light_skin_tone": "👮🏼\u200d♂️",
+    "man_police_officer_medium_skin_tone": "👮🏽\u200d♂️",
+    "man_pouting": "🙎\u200d♂️",
+    "man_pouting_dark_skin_tone": "🙎🏿\u200d♂️",
+    "man_pouting_light_skin_tone": "🙎🏻\u200d♂️",
+    "man_pouting_medium-dark_skin_tone": "🙎🏾\u200d♂️",
+    "man_pouting_medium-light_skin_tone": "🙎🏼\u200d♂️",
+    "man_pouting_medium_skin_tone": "🙎🏽\u200d♂️",
+    "man_raising_hand": "🙋\u200d♂️",
+    "man_raising_hand_dark_skin_tone": "🙋🏿\u200d♂️",
+    "man_raising_hand_light_skin_tone": "🙋🏻\u200d♂️",
+    "man_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♂️",
+    "man_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♂️",
+    "man_raising_hand_medium_skin_tone": "🙋🏽\u200d♂️",
+    "man_rowing_boat": "🚣\u200d♂️",
+    "man_rowing_boat_dark_skin_tone": "🚣🏿\u200d♂️",
+    "man_rowing_boat_light_skin_tone": "🚣🏻\u200d♂️",
+    "man_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♂️",
+    "man_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♂️",
+    "man_rowing_boat_medium_skin_tone": "🚣🏽\u200d♂️",
+    "man_running": "🏃\u200d♂️",
+    "man_running_dark_skin_tone": "🏃🏿\u200d♂️",
+    "man_running_light_skin_tone": "🏃🏻\u200d♂️",
+    "man_running_medium-dark_skin_tone": "🏃🏾\u200d♂️",
+    "man_running_medium-light_skin_tone": "🏃🏼\u200d♂️",
+    "man_running_medium_skin_tone": "🏃🏽\u200d♂️",
+    "man_scientist": "👨\u200d🔬",
+    "man_scientist_dark_skin_tone": "👨🏿\u200d🔬",
+    "man_scientist_light_skin_tone": "👨🏻\u200d🔬",
+    "man_scientist_medium-dark_skin_tone": "👨🏾\u200d🔬",
+    "man_scientist_medium-light_skin_tone": "👨🏼\u200d🔬",
+    "man_scientist_medium_skin_tone": "👨🏽\u200d🔬",
+    "man_shrugging": "🤷\u200d♂️",
+    "man_shrugging_dark_skin_tone": "🤷🏿\u200d♂️",
+    "man_shrugging_light_skin_tone": "🤷🏻\u200d♂️",
+    "man_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♂️",
+    "man_shrugging_medium-light_skin_tone": "🤷🏼\u200d♂️",
+    "man_shrugging_medium_skin_tone": "🤷🏽\u200d♂️",
+    "man_singer": "👨\u200d🎤",
+    "man_singer_dark_skin_tone": "👨🏿\u200d🎤",
+    "man_singer_light_skin_tone": "👨🏻\u200d🎤",
+    "man_singer_medium-dark_skin_tone": "👨🏾\u200d🎤",
+    "man_singer_medium-light_skin_tone": "👨🏼\u200d🎤",
+    "man_singer_medium_skin_tone": "👨🏽\u200d🎤",
+    "man_student": "👨\u200d🎓",
+    "man_student_dark_skin_tone": "👨🏿\u200d🎓",
+    "man_student_light_skin_tone": "👨🏻\u200d🎓",
+    "man_student_medium-dark_skin_tone": "👨🏾\u200d🎓",
+    "man_student_medium-light_skin_tone": "👨🏼\u200d🎓",
+    "man_student_medium_skin_tone": "👨🏽\u200d🎓",
+    "man_surfing": "🏄\u200d♂️",
+    "man_surfing_dark_skin_tone": "🏄🏿\u200d♂️",
+    "man_surfing_light_skin_tone": "🏄🏻\u200d♂️",
+    "man_surfing_medium-dark_skin_tone": "🏄🏾\u200d♂️",
+    "man_surfing_medium-light_skin_tone": "🏄🏼\u200d♂️",
+    "man_surfing_medium_skin_tone": "🏄🏽\u200d♂️",
+    "man_swimming": "🏊\u200d♂️",
+    "man_swimming_dark_skin_tone": "🏊🏿\u200d♂️",
+    "man_swimming_light_skin_tone": "🏊🏻\u200d♂️",
+    "man_swimming_medium-dark_skin_tone": "🏊🏾\u200d♂️",
+    "man_swimming_medium-light_skin_tone": "🏊🏼\u200d♂️",
+    "man_swimming_medium_skin_tone": "🏊🏽\u200d♂️",
+    "man_teacher": "👨\u200d🏫",
+    "man_teacher_dark_skin_tone": "👨🏿\u200d🏫",
+    "man_teacher_light_skin_tone": "👨🏻\u200d🏫",
+    "man_teacher_medium-dark_skin_tone": "👨🏾\u200d🏫",
+    "man_teacher_medium-light_skin_tone": "👨🏼\u200d🏫",
+    "man_teacher_medium_skin_tone": "👨🏽\u200d🏫",
+    "man_technologist": "👨\u200d💻",
+    "man_technologist_dark_skin_tone": "👨🏿\u200d💻",
+    "man_technologist_light_skin_tone": "👨🏻\u200d💻",
+    "man_technologist_medium-dark_skin_tone": "👨🏾\u200d💻",
+    "man_technologist_medium-light_skin_tone": "👨🏼\u200d💻",
+    "man_technologist_medium_skin_tone": "👨🏽\u200d💻",
+    "man_tipping_hand": "💁\u200d♂️",
+    "man_tipping_hand_dark_skin_tone": "💁🏿\u200d♂️",
+    "man_tipping_hand_light_skin_tone": "💁🏻\u200d♂️",
+    "man_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♂️",
+    "man_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♂️",
+    "man_tipping_hand_medium_skin_tone": "💁🏽\u200d♂️",
+    "man_vampire": "🧛\u200d♂️",
+    "man_vampire_dark_skin_tone": "🧛🏿\u200d♂️",
+    "man_vampire_light_skin_tone": "🧛🏻\u200d♂️",
+    "man_vampire_medium-dark_skin_tone": "🧛🏾\u200d♂️",
+    "man_vampire_medium-light_skin_tone": "🧛🏼\u200d♂️",
+    "man_vampire_medium_skin_tone": "🧛🏽\u200d♂️",
+    "man_walking": "🚶\u200d♂️",
+    "man_walking_dark_skin_tone": "🚶🏿\u200d♂️",
+    "man_walking_light_skin_tone": "🚶🏻\u200d♂️",
+    "man_walking_medium-dark_skin_tone": "🚶🏾\u200d♂️",
+    "man_walking_medium-light_skin_tone": "🚶🏼\u200d♂️",
+    "man_walking_medium_skin_tone": "🚶🏽\u200d♂️",
+    "man_wearing_turban": "👳\u200d♂️",
+    "man_wearing_turban_dark_skin_tone": "👳🏿\u200d♂️",
+    "man_wearing_turban_light_skin_tone": "👳🏻\u200d♂️",
+    "man_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♂️",
+    "man_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♂️",
+    "man_wearing_turban_medium_skin_tone": "👳🏽\u200d♂️",
+    "man_with_probing_cane": "👨\u200d🦯",
+    "man_with_chinese_cap": "👲",
+    "man_with_chinese_cap_dark_skin_tone": "👲🏿",
+    "man_with_chinese_cap_light_skin_tone": "👲🏻",
+    "man_with_chinese_cap_medium-dark_skin_tone": "👲🏾",
+    "man_with_chinese_cap_medium-light_skin_tone": "👲🏼",
+    "man_with_chinese_cap_medium_skin_tone": "👲🏽",
+    "man_zombie": "🧟\u200d♂️",
+    "mango": "🥭",
+    "mantelpiece_clock": "🕰",
+    "manual_wheelchair": "🦽",
+    "man’s_shoe": "👞",
+    "map_of_japan": "🗾",
+    "maple_leaf": "🍁",
+    "martial_arts_uniform": "🥋",
+    "mate": "🧉",
+    "meat_on_bone": "🍖",
+    "mechanical_arm": "🦾",
+    "mechanical_leg": "🦿",
+    "medical_symbol": "⚕",
+    "megaphone": "📣",
+    "melon": "🍈",
+    "memo": "📝",
+    "men_with_bunny_ears": "👯\u200d♂️",
+    "men_wrestling": "🤼\u200d♂️",
+    "menorah": "🕎",
+    "men’s_room": "🚹",
+    "mermaid": "🧜\u200d♀️",
+    "mermaid_dark_skin_tone": "🧜🏿\u200d♀️",
+    "mermaid_light_skin_tone": "🧜🏻\u200d♀️",
+    "mermaid_medium-dark_skin_tone": "🧜🏾\u200d♀️",
+    "mermaid_medium-light_skin_tone": "🧜🏼\u200d♀️",
+    "mermaid_medium_skin_tone": "🧜🏽\u200d♀️",
+    "merman": "🧜\u200d♂️",
+    "merman_dark_skin_tone": "🧜🏿\u200d♂️",
+    "merman_light_skin_tone": "🧜🏻\u200d♂️",
+    "merman_medium-dark_skin_tone": "🧜🏾\u200d♂️",
+    "merman_medium-light_skin_tone": "🧜🏼\u200d♂️",
+    "merman_medium_skin_tone": "🧜🏽\u200d♂️",
+    "merperson": "🧜",
+    "merperson_dark_skin_tone": "🧜🏿",
+    "merperson_light_skin_tone": "🧜🏻",
+    "merperson_medium-dark_skin_tone": "🧜🏾",
+    "merperson_medium-light_skin_tone": "🧜🏼",
+    "merperson_medium_skin_tone": "🧜🏽",
+    "metro": "🚇",
+    "microbe": "🦠",
+    "microphone": "🎤",
+    "microscope": "🔬",
+    "middle_finger": "🖕",
+    "middle_finger_dark_skin_tone": "🖕🏿",
+    "middle_finger_light_skin_tone": "🖕🏻",
+    "middle_finger_medium-dark_skin_tone": "🖕🏾",
+    "middle_finger_medium-light_skin_tone": "🖕🏼",
+    "middle_finger_medium_skin_tone": "🖕🏽",
+    "military_medal": "🎖",
+    "milky_way": "🌌",
+    "minibus": "🚐",
+    "moai": "🗿",
+    "mobile_phone": "📱",
+    "mobile_phone_off": "📴",
+    "mobile_phone_with_arrow": "📲",
+    "money-mouth_face": "🤑",
+    "money_bag": "💰",
+    "money_with_wings": "💸",
+    "monkey": "🐒",
+    "monkey_face": "🐵",
+    "monorail": "🚝",
+    "moon_cake": "🥮",
+    "moon_viewing_ceremony": "🎑",
+    "mosque": "🕌",
+    "mosquito": "🦟",
+    "motor_boat": "🛥",
+    "motor_scooter": "🛵",
+    "motorcycle": "🏍",
+    "motorized_wheelchair": "🦼",
+    "motorway": "🛣",
+    "mount_fuji": "🗻",
+    "mountain": "⛰",
+    "mountain_cableway": "🚠",
+    "mountain_railway": "🚞",
+    "mouse": "🐭",
+    "mouse_face": "🐭",
+    "mouth": "👄",
+    "movie_camera": "🎥",
+    "mushroom": "🍄",
+    "musical_keyboard": "🎹",
+    "musical_note": "🎵",
+    "musical_notes": "🎶",
+    "musical_score": "🎼",
+    "muted_speaker": "🔇",
+    "nail_polish": "💅",
+    "nail_polish_dark_skin_tone": "💅🏿",
+    "nail_polish_light_skin_tone": "💅🏻",
+    "nail_polish_medium-dark_skin_tone": "💅🏾",
+    "nail_polish_medium-light_skin_tone": "💅🏼",
+    "nail_polish_medium_skin_tone": "💅🏽",
+    "name_badge": "📛",
+    "national_park": "🏞",
+    "nauseated_face": "🤢",
+    "nazar_amulet": "🧿",
+    "necktie": "👔",
+    "nerd_face": "🤓",
+    "neutral_face": "😐",
+    "new_moon": "🌑",
+    "new_moon_face": "🌚",
+    "newspaper": "📰",
+    "next_track_button": "⏭",
+    "night_with_stars": "🌃",
+    "nine-thirty": "🕤",
+    "nine_o’clock": "🕘",
+    "no_bicycles": "🚳",
+    "no_entry": "⛔",
+    "no_littering": "🚯",
+    "no_mobile_phones": "📵",
+    "no_one_under_eighteen": "🔞",
+    "no_pedestrians": "🚷",
+    "no_smoking": "🚭",
+    "non-potable_water": "🚱",
+    "nose": "👃",
+    "nose_dark_skin_tone": "👃🏿",
+    "nose_light_skin_tone": "👃🏻",
+    "nose_medium-dark_skin_tone": "👃🏾",
+    "nose_medium-light_skin_tone": "👃🏼",
+    "nose_medium_skin_tone": "👃🏽",
+    "notebook": "📓",
+    "notebook_with_decorative_cover": "📔",
+    "nut_and_bolt": "🔩",
+    "octopus": "🐙",
+    "oden": "🍢",
+    "office_building": "🏢",
+    "ogre": "👹",
+    "oil_drum": "🛢",
+    "old_key": "🗝",
+    "old_man": "👴",
+    "old_man_dark_skin_tone": "👴🏿",
+    "old_man_light_skin_tone": "👴🏻",
+    "old_man_medium-dark_skin_tone": "👴🏾",
+    "old_man_medium-light_skin_tone": "👴🏼",
+    "old_man_medium_skin_tone": "👴🏽",
+    "old_woman": "👵",
+    "old_woman_dark_skin_tone": "👵🏿",
+    "old_woman_light_skin_tone": "👵🏻",
+    "old_woman_medium-dark_skin_tone": "👵🏾",
+    "old_woman_medium-light_skin_tone": "👵🏼",
+    "old_woman_medium_skin_tone": "👵🏽",
+    "older_adult": "🧓",
+    "older_adult_dark_skin_tone": "🧓🏿",
+    "older_adult_light_skin_tone": "🧓🏻",
+    "older_adult_medium-dark_skin_tone": "🧓🏾",
+    "older_adult_medium-light_skin_tone": "🧓🏼",
+    "older_adult_medium_skin_tone": "🧓🏽",
+    "om": "🕉",
+    "oncoming_automobile": "🚘",
+    "oncoming_bus": "🚍",
+    "oncoming_fist": "👊",
+    "oncoming_fist_dark_skin_tone": "👊🏿",
+    "oncoming_fist_light_skin_tone": "👊🏻",
+    "oncoming_fist_medium-dark_skin_tone": "👊🏾",
+    "oncoming_fist_medium-light_skin_tone": "👊🏼",
+    "oncoming_fist_medium_skin_tone": "👊🏽",
+    "oncoming_police_car": "🚔",
+    "oncoming_taxi": "🚖",
+    "one-piece_swimsuit": "🩱",
+    "one-thirty": "🕜",
+    "one_o’clock": "🕐",
+    "onion": "🧅",
+    "open_book": "📖",
+    "open_file_folder": "📂",
+    "open_hands": "👐",
+    "open_hands_dark_skin_tone": "👐🏿",
+    "open_hands_light_skin_tone": "👐🏻",
+    "open_hands_medium-dark_skin_tone": "👐🏾",
+    "open_hands_medium-light_skin_tone": "👐🏼",
+    "open_hands_medium_skin_tone": "👐🏽",
+    "open_mailbox_with_lowered_flag": "📭",
+    "open_mailbox_with_raised_flag": "📬",
+    "optical_disk": "💿",
+    "orange_book": "📙",
+    "orange_circle": "🟠",
+    "orange_heart": "🧡",
+    "orange_square": "🟧",
+    "orangutan": "🦧",
+    "orthodox_cross": "☦",
+    "otter": "🦦",
+    "outbox_tray": "📤",
+    "owl": "🦉",
+    "ox": "🐂",
+    "oyster": "🦪",
+    "package": "📦",
+    "page_facing_up": "📄",
+    "page_with_curl": "📃",
+    "pager": "📟",
+    "paintbrush": "🖌",
+    "palm_tree": "🌴",
+    "palms_up_together": "🤲",
+    "palms_up_together_dark_skin_tone": "🤲🏿",
+    "palms_up_together_light_skin_tone": "🤲🏻",
+    "palms_up_together_medium-dark_skin_tone": "🤲🏾",
+    "palms_up_together_medium-light_skin_tone": "🤲🏼",
+    "palms_up_together_medium_skin_tone": "🤲🏽",
+    "pancakes": "🥞",
+    "panda_face": "🐼",
+    "paperclip": "📎",
+    "parrot": "🦜",
+    "part_alternation_mark": "〽",
+    "party_popper": "🎉",
+    "partying_face": "🥳",
+    "passenger_ship": "🛳",
+    "passport_control": "🛂",
+    "pause_button": "⏸",
+    "paw_prints": "🐾",
+    "peace_symbol": "☮",
+    "peach": "🍑",
+    "peacock": "🦚",
+    "peanuts": "🥜",
+    "pear": "🍐",
+    "pen": "🖊",
+    "pencil": "📝",
+    "penguin": "🐧",
+    "pensive_face": "😔",
+    "people_holding_hands": "🧑\u200d🤝\u200d🧑",
+    "people_with_bunny_ears": "👯",
+    "people_wrestling": "🤼",
+    "performing_arts": "🎭",
+    "persevering_face": "😣",
+    "person_biking": "🚴",
+    "person_biking_dark_skin_tone": "🚴🏿",
+    "person_biking_light_skin_tone": "🚴🏻",
+    "person_biking_medium-dark_skin_tone": "🚴🏾",
+    "person_biking_medium-light_skin_tone": "🚴🏼",
+    "person_biking_medium_skin_tone": "🚴🏽",
+    "person_bouncing_ball": "⛹",
+    "person_bouncing_ball_dark_skin_tone": "⛹🏿",
+    "person_bouncing_ball_light_skin_tone": "⛹🏻",
+    "person_bouncing_ball_medium-dark_skin_tone": "⛹🏾",
+    "person_bouncing_ball_medium-light_skin_tone": "⛹🏼",
+    "person_bouncing_ball_medium_skin_tone": "⛹🏽",
+    "person_bowing": "🙇",
+    "person_bowing_dark_skin_tone": "🙇🏿",
+    "person_bowing_light_skin_tone": "🙇🏻",
+    "person_bowing_medium-dark_skin_tone": "🙇🏾",
+    "person_bowing_medium-light_skin_tone": "🙇🏼",
+    "person_bowing_medium_skin_tone": "🙇🏽",
+    "person_cartwheeling": "🤸",
+    "person_cartwheeling_dark_skin_tone": "🤸🏿",
+    "person_cartwheeling_light_skin_tone": "🤸🏻",
+    "person_cartwheeling_medium-dark_skin_tone": "🤸🏾",
+    "person_cartwheeling_medium-light_skin_tone": "🤸🏼",
+    "person_cartwheeling_medium_skin_tone": "🤸🏽",
+    "person_climbing": "🧗",
+    "person_climbing_dark_skin_tone": "🧗🏿",
+    "person_climbing_light_skin_tone": "🧗🏻",
+    "person_climbing_medium-dark_skin_tone": "🧗🏾",
+    "person_climbing_medium-light_skin_tone": "🧗🏼",
+    "person_climbing_medium_skin_tone": "🧗🏽",
+    "person_facepalming": "🤦",
+    "person_facepalming_dark_skin_tone": "🤦🏿",
+    "person_facepalming_light_skin_tone": "🤦🏻",
+    "person_facepalming_medium-dark_skin_tone": "🤦🏾",
+    "person_facepalming_medium-light_skin_tone": "🤦🏼",
+    "person_facepalming_medium_skin_tone": "🤦🏽",
+    "person_fencing": "🤺",
+    "person_frowning": "🙍",
+    "person_frowning_dark_skin_tone": "🙍🏿",
+    "person_frowning_light_skin_tone": "🙍🏻",
+    "person_frowning_medium-dark_skin_tone": "🙍🏾",
+    "person_frowning_medium-light_skin_tone": "🙍🏼",
+    "person_frowning_medium_skin_tone": "🙍🏽",
+    "person_gesturing_no": "🙅",
+    "person_gesturing_no_dark_skin_tone": "🙅🏿",
+    "person_gesturing_no_light_skin_tone": "🙅🏻",
+    "person_gesturing_no_medium-dark_skin_tone": "🙅🏾",
+    "person_gesturing_no_medium-light_skin_tone": "🙅🏼",
+    "person_gesturing_no_medium_skin_tone": "🙅🏽",
+    "person_gesturing_ok": "🙆",
+    "person_gesturing_ok_dark_skin_tone": "🙆🏿",
+    "person_gesturing_ok_light_skin_tone": "🙆🏻",
+    "person_gesturing_ok_medium-dark_skin_tone": "🙆🏾",
+    "person_gesturing_ok_medium-light_skin_tone": "🙆🏼",
+    "person_gesturing_ok_medium_skin_tone": "🙆🏽",
+    "person_getting_haircut": "💇",
+    "person_getting_haircut_dark_skin_tone": "💇🏿",
+    "person_getting_haircut_light_skin_tone": "💇🏻",
+    "person_getting_haircut_medium-dark_skin_tone": "💇🏾",
+    "person_getting_haircut_medium-light_skin_tone": "💇🏼",
+    "person_getting_haircut_medium_skin_tone": "💇🏽",
+    "person_getting_massage": "💆",
+    "person_getting_massage_dark_skin_tone": "💆🏿",
+    "person_getting_massage_light_skin_tone": "💆🏻",
+    "person_getting_massage_medium-dark_skin_tone": "💆🏾",
+    "person_getting_massage_medium-light_skin_tone": "💆🏼",
+    "person_getting_massage_medium_skin_tone": "💆🏽",
+    "person_golfing": "🏌",
+    "person_golfing_dark_skin_tone": "🏌🏿",
+    "person_golfing_light_skin_tone": "🏌🏻",
+    "person_golfing_medium-dark_skin_tone": "🏌🏾",
+    "person_golfing_medium-light_skin_tone": "🏌🏼",
+    "person_golfing_medium_skin_tone": "🏌🏽",
+    "person_in_bed": "🛌",
+    "person_in_bed_dark_skin_tone": "🛌🏿",
+    "person_in_bed_light_skin_tone": "🛌🏻",
+    "person_in_bed_medium-dark_skin_tone": "🛌🏾",
+    "person_in_bed_medium-light_skin_tone": "🛌🏼",
+    "person_in_bed_medium_skin_tone": "🛌🏽",
+    "person_in_lotus_position": "🧘",
+    "person_in_lotus_position_dark_skin_tone": "🧘🏿",
+    "person_in_lotus_position_light_skin_tone": "🧘🏻",
+    "person_in_lotus_position_medium-dark_skin_tone": "🧘🏾",
+    "person_in_lotus_position_medium-light_skin_tone": "🧘🏼",
+    "person_in_lotus_position_medium_skin_tone": "🧘🏽",
+    "person_in_steamy_room": "🧖",
+    "person_in_steamy_room_dark_skin_tone": "🧖🏿",
+    "person_in_steamy_room_light_skin_tone": "🧖🏻",
+    "person_in_steamy_room_medium-dark_skin_tone": "🧖🏾",
+    "person_in_steamy_room_medium-light_skin_tone": "🧖🏼",
+    "person_in_steamy_room_medium_skin_tone": "🧖🏽",
+    "person_juggling": "🤹",
+    "person_juggling_dark_skin_tone": "🤹🏿",
+    "person_juggling_light_skin_tone": "🤹🏻",
+    "person_juggling_medium-dark_skin_tone": "🤹🏾",
+    "person_juggling_medium-light_skin_tone": "🤹🏼",
+    "person_juggling_medium_skin_tone": "🤹🏽",
+    "person_kneeling": "🧎",
+    "person_lifting_weights": "🏋",
+    "person_lifting_weights_dark_skin_tone": "🏋🏿",
+    "person_lifting_weights_light_skin_tone": "🏋🏻",
+    "person_lifting_weights_medium-dark_skin_tone": "🏋🏾",
+    "person_lifting_weights_medium-light_skin_tone": "🏋🏼",
+    "person_lifting_weights_medium_skin_tone": "🏋🏽",
+    "person_mountain_biking": "🚵",
+    "person_mountain_biking_dark_skin_tone": "🚵🏿",
+    "person_mountain_biking_light_skin_tone": "🚵🏻",
+    "person_mountain_biking_medium-dark_skin_tone": "🚵🏾",
+    "person_mountain_biking_medium-light_skin_tone": "🚵🏼",
+    "person_mountain_biking_medium_skin_tone": "🚵🏽",
+    "person_playing_handball": "🤾",
+    "person_playing_handball_dark_skin_tone": "🤾🏿",
+    "person_playing_handball_light_skin_tone": "🤾🏻",
+    "person_playing_handball_medium-dark_skin_tone": "🤾🏾",
+    "person_playing_handball_medium-light_skin_tone": "🤾🏼",
+    "person_playing_handball_medium_skin_tone": "🤾🏽",
+    "person_playing_water_polo": "🤽",
+    "person_playing_water_polo_dark_skin_tone": "🤽🏿",
+    "person_playing_water_polo_light_skin_tone": "🤽🏻",
+    "person_playing_water_polo_medium-dark_skin_tone": "🤽🏾",
+    "person_playing_water_polo_medium-light_skin_tone": "🤽🏼",
+    "person_playing_water_polo_medium_skin_tone": "🤽🏽",
+    "person_pouting": "🙎",
+    "person_pouting_dark_skin_tone": "🙎🏿",
+    "person_pouting_light_skin_tone": "🙎🏻",
+    "person_pouting_medium-dark_skin_tone": "🙎🏾",
+    "person_pouting_medium-light_skin_tone": "🙎🏼",
+    "person_pouting_medium_skin_tone": "🙎🏽",
+    "person_raising_hand": "🙋",
+    "person_raising_hand_dark_skin_tone": "🙋🏿",
+    "person_raising_hand_light_skin_tone": "🙋🏻",
+    "person_raising_hand_medium-dark_skin_tone": "🙋🏾",
+    "person_raising_hand_medium-light_skin_tone": "🙋🏼",
+    "person_raising_hand_medium_skin_tone": "🙋🏽",
+    "person_rowing_boat": "🚣",
+    "person_rowing_boat_dark_skin_tone": "🚣🏿",
+    "person_rowing_boat_light_skin_tone": "🚣🏻",
+    "person_rowing_boat_medium-dark_skin_tone": "🚣🏾",
+    "person_rowing_boat_medium-light_skin_tone": "🚣🏼",
+    "person_rowing_boat_medium_skin_tone": "🚣🏽",
+    "person_running": "🏃",
+    "person_running_dark_skin_tone": "🏃🏿",
+    "person_running_light_skin_tone": "🏃🏻",
+    "person_running_medium-dark_skin_tone": "🏃🏾",
+    "person_running_medium-light_skin_tone": "🏃🏼",
+    "person_running_medium_skin_tone": "🏃🏽",
+    "person_shrugging": "🤷",
+    "person_shrugging_dark_skin_tone": "🤷🏿",
+    "person_shrugging_light_skin_tone": "🤷🏻",
+    "person_shrugging_medium-dark_skin_tone": "🤷🏾",
+    "person_shrugging_medium-light_skin_tone": "🤷🏼",
+    "person_shrugging_medium_skin_tone": "🤷🏽",
+    "person_standing": "🧍",
+    "person_surfing": "🏄",
+    "person_surfing_dark_skin_tone": "🏄🏿",
+    "person_surfing_light_skin_tone": "🏄🏻",
+    "person_surfing_medium-dark_skin_tone": "🏄🏾",
+    "person_surfing_medium-light_skin_tone": "🏄🏼",
+    "person_surfing_medium_skin_tone": "🏄🏽",
+    "person_swimming": "🏊",
+    "person_swimming_dark_skin_tone": "🏊🏿",
+    "person_swimming_light_skin_tone": "🏊🏻",
+    "person_swimming_medium-dark_skin_tone": "🏊🏾",
+    "person_swimming_medium-light_skin_tone": "🏊🏼",
+    "person_swimming_medium_skin_tone": "🏊🏽",
+    "person_taking_bath": "🛀",
+    "person_taking_bath_dark_skin_tone": "🛀🏿",
+    "person_taking_bath_light_skin_tone": "🛀🏻",
+    "person_taking_bath_medium-dark_skin_tone": "🛀🏾",
+    "person_taking_bath_medium-light_skin_tone": "🛀🏼",
+    "person_taking_bath_medium_skin_tone": "🛀🏽",
+    "person_tipping_hand": "💁",
+    "person_tipping_hand_dark_skin_tone": "💁🏿",
+    "person_tipping_hand_light_skin_tone": "💁🏻",
+    "person_tipping_hand_medium-dark_skin_tone": "💁🏾",
+    "person_tipping_hand_medium-light_skin_tone": "💁🏼",
+    "person_tipping_hand_medium_skin_tone": "💁🏽",
+    "person_walking": "🚶",
+    "person_walking_dark_skin_tone": "🚶🏿",
+    "person_walking_light_skin_tone": "🚶🏻",
+    "person_walking_medium-dark_skin_tone": "🚶🏾",
+    "person_walking_medium-light_skin_tone": "🚶🏼",
+    "person_walking_medium_skin_tone": "🚶🏽",
+    "person_wearing_turban": "👳",
+    "person_wearing_turban_dark_skin_tone": "👳🏿",
+    "person_wearing_turban_light_skin_tone": "👳🏻",
+    "person_wearing_turban_medium-dark_skin_tone": "👳🏾",
+    "person_wearing_turban_medium-light_skin_tone": "👳🏼",
+    "person_wearing_turban_medium_skin_tone": "👳🏽",
+    "petri_dish": "🧫",
+    "pick": "⛏",
+    "pie": "🥧",
+    "pig": "🐷",
+    "pig_face": "🐷",
+    "pig_nose": "🐽",
+    "pile_of_poo": "💩",
+    "pill": "💊",
+    "pinching_hand": "🤏",
+    "pine_decoration": "🎍",
+    "pineapple": "🍍",
+    "ping_pong": "🏓",
+    "pirate_flag": "🏴\u200d☠️",
+    "pistol": "🔫",
+    "pizza": "🍕",
+    "place_of_worship": "🛐",
+    "play_button": "▶",
+    "play_or_pause_button": "⏯",
+    "pleading_face": "🥺",
+    "police_car": "🚓",
+    "police_car_light": "🚨",
+    "police_officer": "👮",
+    "police_officer_dark_skin_tone": "👮🏿",
+    "police_officer_light_skin_tone": "👮🏻",
+    "police_officer_medium-dark_skin_tone": "👮🏾",
+    "police_officer_medium-light_skin_tone": "👮🏼",
+    "police_officer_medium_skin_tone": "👮🏽",
+    "poodle": "🐩",
+    "pool_8_ball": "🎱",
+    "popcorn": "🍿",
+    "post_office": "🏣",
+    "postal_horn": "📯",
+    "postbox": "📮",
+    "pot_of_food": "🍲",
+    "potable_water": "🚰",
+    "potato": "🥔",
+    "poultry_leg": "🍗",
+    "pound_banknote": "💷",
+    "pouting_cat_face": "😾",
+    "pouting_face": "😡",
+    "prayer_beads": "📿",
+    "pregnant_woman": "🤰",
+    "pregnant_woman_dark_skin_tone": "🤰🏿",
+    "pregnant_woman_light_skin_tone": "🤰🏻",
+    "pregnant_woman_medium-dark_skin_tone": "🤰🏾",
+    "pregnant_woman_medium-light_skin_tone": "🤰🏼",
+    "pregnant_woman_medium_skin_tone": "🤰🏽",
+    "pretzel": "🥨",
+    "probing_cane": "🦯",
+    "prince": "🤴",
+    "prince_dark_skin_tone": "🤴🏿",
+    "prince_light_skin_tone": "🤴🏻",
+    "prince_medium-dark_skin_tone": "🤴🏾",
+    "prince_medium-light_skin_tone": "🤴🏼",
+    "prince_medium_skin_tone": "🤴🏽",
+    "princess": "👸",
+    "princess_dark_skin_tone": "👸🏿",
+    "princess_light_skin_tone": "👸🏻",
+    "princess_medium-dark_skin_tone": "👸🏾",
+    "princess_medium-light_skin_tone": "👸🏼",
+    "princess_medium_skin_tone": "👸🏽",
+    "printer": "🖨",
+    "prohibited": "🚫",
+    "purple_circle": "🟣",
+    "purple_heart": "💜",
+    "purple_square": "🟪",
+    "purse": "👛",
+    "pushpin": "📌",
+    "question_mark": "❓",
+    "rabbit": "🐰",
+    "rabbit_face": "🐰",
+    "raccoon": "🦝",
+    "racing_car": "🏎",
+    "radio": "📻",
+    "radio_button": "🔘",
+    "radioactive": "☢",
+    "railway_car": "🚃",
+    "railway_track": "🛤",
+    "rainbow": "🌈",
+    "rainbow_flag": "🏳️\u200d🌈",
+    "raised_back_of_hand": "🤚",
+    "raised_back_of_hand_dark_skin_tone": "🤚🏿",
+    "raised_back_of_hand_light_skin_tone": "🤚🏻",
+    "raised_back_of_hand_medium-dark_skin_tone": "🤚🏾",
+    "raised_back_of_hand_medium-light_skin_tone": "🤚🏼",
+    "raised_back_of_hand_medium_skin_tone": "🤚🏽",
+    "raised_fist": "✊",
+    "raised_fist_dark_skin_tone": "✊🏿",
+    "raised_fist_light_skin_tone": "✊🏻",
+    "raised_fist_medium-dark_skin_tone": "✊🏾",
+    "raised_fist_medium-light_skin_tone": "✊🏼",
+    "raised_fist_medium_skin_tone": "✊🏽",
+    "raised_hand": "✋",
+    "raised_hand_dark_skin_tone": "✋🏿",
+    "raised_hand_light_skin_tone": "✋🏻",
+    "raised_hand_medium-dark_skin_tone": "✋🏾",
+    "raised_hand_medium-light_skin_tone": "✋🏼",
+    "raised_hand_medium_skin_tone": "✋🏽",
+    "raising_hands": "🙌",
+    "raising_hands_dark_skin_tone": "🙌🏿",
+    "raising_hands_light_skin_tone": "🙌🏻",
+    "raising_hands_medium-dark_skin_tone": "🙌🏾",
+    "raising_hands_medium-light_skin_tone": "🙌🏼",
+    "raising_hands_medium_skin_tone": "🙌🏽",
+    "ram": "🐏",
+    "rat": "🐀",
+    "razor": "🪒",
+    "ringed_planet": "🪐",
+    "receipt": "🧾",
+    "record_button": "⏺",
+    "recycling_symbol": "♻",
+    "red_apple": "🍎",
+    "red_circle": "🔴",
+    "red_envelope": "🧧",
+    "red_hair": "🦰",
+    "red-haired_man": "👨\u200d🦰",
+    "red-haired_woman": "👩\u200d🦰",
+    "red_heart": "❤",
+    "red_paper_lantern": "🏮",
+    "red_square": "🟥",
+    "red_triangle_pointed_down": "🔻",
+    "red_triangle_pointed_up": "🔺",
+    "registered": "®",
+    "relieved_face": "😌",
+    "reminder_ribbon": "🎗",
+    "repeat_button": "🔁",
+    "repeat_single_button": "🔂",
+    "rescue_worker’s_helmet": "⛑",
+    "restroom": "🚻",
+    "reverse_button": "◀",
+    "revolving_hearts": "💞",
+    "rhinoceros": "🦏",
+    "ribbon": "🎀",
+    "rice_ball": "🍙",
+    "rice_cracker": "🍘",
+    "right-facing_fist": "🤜",
+    "right-facing_fist_dark_skin_tone": "🤜🏿",
+    "right-facing_fist_light_skin_tone": "🤜🏻",
+    "right-facing_fist_medium-dark_skin_tone": "🤜🏾",
+    "right-facing_fist_medium-light_skin_tone": "🤜🏼",
+    "right-facing_fist_medium_skin_tone": "🤜🏽",
+    "right_anger_bubble": "🗯",
+    "right_arrow": "➡",
+    "right_arrow_curving_down": "⤵",
+    "right_arrow_curving_left": "↩",
+    "right_arrow_curving_up": "⤴",
+    "ring": "💍",
+    "roasted_sweet_potato": "🍠",
+    "robot_face": "🤖",
+    "rocket": "🚀",
+    "roll_of_paper": "🧻",
+    "rolled-up_newspaper": "🗞",
+    "roller_coaster": "🎢",
+    "rolling_on_the_floor_laughing": "🤣",
+    "rooster": "🐓",
+    "rose": "🌹",
+    "rosette": "🏵",
+    "round_pushpin": "📍",
+    "rugby_football": "🏉",
+    "running_shirt": "🎽",
+    "running_shoe": "👟",
+    "sad_but_relieved_face": "😥",
+    "safety_pin": "🧷",
+    "safety_vest": "🦺",
+    "salt": "🧂",
+    "sailboat": "⛵",
+    "sake": "🍶",
+    "sandwich": "🥪",
+    "sari": "🥻",
+    "satellite": "📡",
+    "satellite_antenna": "📡",
+    "sauropod": "🦕",
+    "saxophone": "🎷",
+    "scarf": "🧣",
+    "school": "🏫",
+    "school_backpack": "🎒",
+    "scissors": "✂",
+    "scorpion": "🦂",
+    "scroll": "📜",
+    "seat": "💺",
+    "see-no-evil_monkey": "🙈",
+    "seedling": "🌱",
+    "selfie": "🤳",
+    "selfie_dark_skin_tone": "🤳🏿",
+    "selfie_light_skin_tone": "🤳🏻",
+    "selfie_medium-dark_skin_tone": "🤳🏾",
+    "selfie_medium-light_skin_tone": "🤳🏼",
+    "selfie_medium_skin_tone": "🤳🏽",
+    "service_dog": "🐕\u200d🦺",
+    "seven-thirty": "🕢",
+    "seven_o’clock": "🕖",
+    "shallow_pan_of_food": "🥘",
+    "shamrock": "☘",
+    "shark": "🦈",
+    "shaved_ice": "🍧",
+    "sheaf_of_rice": "🌾",
+    "shield": "🛡",
+    "shinto_shrine": "⛩",
+    "ship": "🚢",
+    "shooting_star": "🌠",
+    "shopping_bags": "🛍",
+    "shopping_cart": "🛒",
+    "shortcake": "🍰",
+    "shorts": "🩳",
+    "shower": "🚿",
+    "shrimp": "🦐",
+    "shuffle_tracks_button": "🔀",
+    "shushing_face": "🤫",
+    "sign_of_the_horns": "🤘",
+    "sign_of_the_horns_dark_skin_tone": "🤘🏿",
+    "sign_of_the_horns_light_skin_tone": "🤘🏻",
+    "sign_of_the_horns_medium-dark_skin_tone": "🤘🏾",
+    "sign_of_the_horns_medium-light_skin_tone": "🤘🏼",
+    "sign_of_the_horns_medium_skin_tone": "🤘🏽",
+    "six-thirty": "🕡",
+    "six_o’clock": "🕕",
+    "skateboard": "🛹",
+    "skier": "⛷",
+    "skis": "🎿",
+    "skull": "💀",
+    "skull_and_crossbones": "☠",
+    "skunk": "🦨",
+    "sled": "🛷",
+    "sleeping_face": "😴",
+    "sleepy_face": "😪",
+    "slightly_frowning_face": "🙁",
+    "slightly_smiling_face": "🙂",
+    "slot_machine": "🎰",
+    "sloth": "🦥",
+    "small_airplane": "🛩",
+    "small_blue_diamond": "🔹",
+    "small_orange_diamond": "🔸",
+    "smiling_cat_face_with_heart-eyes": "😻",
+    "smiling_face": "☺",
+    "smiling_face_with_halo": "😇",
+    "smiling_face_with_3_hearts": "🥰",
+    "smiling_face_with_heart-eyes": "😍",
+    "smiling_face_with_horns": "😈",
+    "smiling_face_with_smiling_eyes": "😊",
+    "smiling_face_with_sunglasses": "😎",
+    "smirking_face": "😏",
+    "snail": "🐌",
+    "snake": "🐍",
+    "sneezing_face": "🤧",
+    "snow-capped_mountain": "🏔",
+    "snowboarder": "🏂",
+    "snowboarder_dark_skin_tone": "🏂🏿",
+    "snowboarder_light_skin_tone": "🏂🏻",
+    "snowboarder_medium-dark_skin_tone": "🏂🏾",
+    "snowboarder_medium-light_skin_tone": "🏂🏼",
+    "snowboarder_medium_skin_tone": "🏂🏽",
+    "snowflake": "❄",
+    "snowman": "☃",
+    "snowman_without_snow": "⛄",
+    "soap": "🧼",
+    "soccer_ball": "⚽",
+    "socks": "🧦",
+    "softball": "🥎",
+    "soft_ice_cream": "🍦",
+    "spade_suit": "♠",
+    "spaghetti": "🍝",
+    "sparkle": "❇",
+    "sparkler": "🎇",
+    "sparkles": "✨",
+    "sparkling_heart": "💖",
+    "speak-no-evil_monkey": "🙊",
+    "speaker_high_volume": "🔊",
+    "speaker_low_volume": "🔈",
+    "speaker_medium_volume": "🔉",
+    "speaking_head": "🗣",
+    "speech_balloon": "💬",
+    "speedboat": "🚤",
+    "spider": "🕷",
+    "spider_web": "🕸",
+    "spiral_calendar": "🗓",
+    "spiral_notepad": "🗒",
+    "spiral_shell": "🐚",
+    "spoon": "🥄",
+    "sponge": "🧽",
+    "sport_utility_vehicle": "🚙",
+    "sports_medal": "🏅",
+    "spouting_whale": "🐳",
+    "squid": "🦑",
+    "squinting_face_with_tongue": "😝",
+    "stadium": "🏟",
+    "star-struck": "🤩",
+    "star_and_crescent": "☪",
+    "star_of_david": "✡",
+    "station": "🚉",
+    "steaming_bowl": "🍜",
+    "stethoscope": "🩺",
+    "stop_button": "⏹",
+    "stop_sign": "🛑",
+    "stopwatch": "⏱",
+    "straight_ruler": "📏",
+    "strawberry": "🍓",
+    "studio_microphone": "🎙",
+    "stuffed_flatbread": "🥙",
+    "sun": "☀",
+    "sun_behind_cloud": "⛅",
+    "sun_behind_large_cloud": "🌥",
+    "sun_behind_rain_cloud": "🌦",
+    "sun_behind_small_cloud": "🌤",
+    "sun_with_face": "🌞",
+    "sunflower": "🌻",
+    "sunglasses": "😎",
+    "sunrise": "🌅",
+    "sunrise_over_mountains": "🌄",
+    "sunset": "🌇",
+    "superhero": "🦸",
+    "supervillain": "🦹",
+    "sushi": "🍣",
+    "suspension_railway": "🚟",
+    "swan": "🦢",
+    "sweat_droplets": "💦",
+    "synagogue": "🕍",
+    "syringe": "💉",
+    "t-shirt": "👕",
+    "taco": "🌮",
+    "takeout_box": "🥡",
+    "tanabata_tree": "🎋",
+    "tangerine": "🍊",
+    "taxi": "🚕",
+    "teacup_without_handle": "🍵",
+    "tear-off_calendar": "📆",
+    "teddy_bear": "🧸",
+    "telephone": "☎",
+    "telephone_receiver": "📞",
+    "telescope": "🔭",
+    "television": "📺",
+    "ten-thirty": "🕥",
+    "ten_o’clock": "🕙",
+    "tennis": "🎾",
+    "tent": "⛺",
+    "test_tube": "🧪",
+    "thermometer": "🌡",
+    "thinking_face": "🤔",
+    "thought_balloon": "💭",
+    "thread": "🧵",
+    "three-thirty": "🕞",
+    "three_o’clock": "🕒",
+    "thumbs_down": "👎",
+    "thumbs_down_dark_skin_tone": "👎🏿",
+    "thumbs_down_light_skin_tone": "👎🏻",
+    "thumbs_down_medium-dark_skin_tone": "👎🏾",
+    "thumbs_down_medium-light_skin_tone": "👎🏼",
+    "thumbs_down_medium_skin_tone": "👎🏽",
+    "thumbs_up": "👍",
+    "thumbs_up_dark_skin_tone": "👍🏿",
+    "thumbs_up_light_skin_tone": "👍🏻",
+    "thumbs_up_medium-dark_skin_tone": "👍🏾",
+    "thumbs_up_medium-light_skin_tone": "👍🏼",
+    "thumbs_up_medium_skin_tone": "👍🏽",
+    "ticket": "🎫",
+    "tiger": "🐯",
+    "tiger_face": "🐯",
+    "timer_clock": "⏲",
+    "tired_face": "😫",
+    "toolbox": "🧰",
+    "toilet": "🚽",
+    "tomato": "🍅",
+    "tongue": "👅",
+    "tooth": "🦷",
+    "top_hat": "🎩",
+    "tornado": "🌪",
+    "trackball": "🖲",
+    "tractor": "🚜",
+    "trade_mark": "™",
+    "train": "🚋",
+    "tram": "🚊",
+    "tram_car": "🚋",
+    "triangular_flag": "🚩",
+    "triangular_ruler": "📐",
+    "trident_emblem": "🔱",
+    "trolleybus": "🚎",
+    "trophy": "🏆",
+    "tropical_drink": "🍹",
+    "tropical_fish": "🐠",
+    "trumpet": "🎺",
+    "tulip": "🌷",
+    "tumbler_glass": "🥃",
+    "turtle": "🐢",
+    "twelve-thirty": "🕧",
+    "twelve_o’clock": "🕛",
+    "two-hump_camel": "🐫",
+    "two-thirty": "🕝",
+    "two_hearts": "💕",
+    "two_men_holding_hands": "👬",
+    "two_o’clock": "🕑",
+    "two_women_holding_hands": "👭",
+    "umbrella": "☂",
+    "umbrella_on_ground": "⛱",
+    "umbrella_with_rain_drops": "☔",
+    "unamused_face": "😒",
+    "unicorn_face": "🦄",
+    "unlocked": "🔓",
+    "up-down_arrow": "↕",
+    "up-left_arrow": "↖",
+    "up-right_arrow": "↗",
+    "up_arrow": "⬆",
+    "upside-down_face": "🙃",
+    "upwards_button": "🔼",
+    "vampire": "🧛",
+    "vampire_dark_skin_tone": "🧛🏿",
+    "vampire_light_skin_tone": "🧛🏻",
+    "vampire_medium-dark_skin_tone": "🧛🏾",
+    "vampire_medium-light_skin_tone": "🧛🏼",
+    "vampire_medium_skin_tone": "🧛🏽",
+    "vertical_traffic_light": "🚦",
+    "vibration_mode": "📳",
+    "victory_hand": "✌",
+    "victory_hand_dark_skin_tone": "✌🏿",
+    "victory_hand_light_skin_tone": "✌🏻",
+    "victory_hand_medium-dark_skin_tone": "✌🏾",
+    "victory_hand_medium-light_skin_tone": "✌🏼",
+    "victory_hand_medium_skin_tone": "✌🏽",
+    "video_camera": "📹",
+    "video_game": "🎮",
+    "videocassette": "📼",
+    "violin": "🎻",
+    "volcano": "🌋",
+    "volleyball": "🏐",
+    "vulcan_salute": "🖖",
+    "vulcan_salute_dark_skin_tone": "🖖🏿",
+    "vulcan_salute_light_skin_tone": "🖖🏻",
+    "vulcan_salute_medium-dark_skin_tone": "🖖🏾",
+    "vulcan_salute_medium-light_skin_tone": "🖖🏼",
+    "vulcan_salute_medium_skin_tone": "🖖🏽",
+    "waffle": "🧇",
+    "waning_crescent_moon": "🌘",
+    "waning_gibbous_moon": "🌖",
+    "warning": "⚠",
+    "wastebasket": "🗑",
+    "watch": "⌚",
+    "water_buffalo": "🐃",
+    "water_closet": "🚾",
+    "water_wave": "🌊",
+    "watermelon": "🍉",
+    "waving_hand": "👋",
+    "waving_hand_dark_skin_tone": "👋🏿",
+    "waving_hand_light_skin_tone": "👋🏻",
+    "waving_hand_medium-dark_skin_tone": "👋🏾",
+    "waving_hand_medium-light_skin_tone": "👋🏼",
+    "waving_hand_medium_skin_tone": "👋🏽",
+    "wavy_dash": "〰",
+    "waxing_crescent_moon": "🌒",
+    "waxing_gibbous_moon": "🌔",
+    "weary_cat_face": "🙀",
+    "weary_face": "😩",
+    "wedding": "💒",
+    "whale": "🐳",
+    "wheel_of_dharma": "☸",
+    "wheelchair_symbol": "♿",
+    "white_circle": "⚪",
+    "white_exclamation_mark": "❕",
+    "white_flag": "🏳",
+    "white_flower": "💮",
+    "white_hair": "🦳",
+    "white-haired_man": "👨\u200d🦳",
+    "white-haired_woman": "👩\u200d🦳",
+    "white_heart": "🤍",
+    "white_heavy_check_mark": "✅",
+    "white_large_square": "⬜",
+    "white_medium-small_square": "◽",
+    "white_medium_square": "◻",
+    "white_medium_star": "⭐",
+    "white_question_mark": "❔",
+    "white_small_square": "▫",
+    "white_square_button": "🔳",
+    "wilted_flower": "🥀",
+    "wind_chime": "🎐",
+    "wind_face": "🌬",
+    "wine_glass": "🍷",
+    "winking_face": "😉",
+    "winking_face_with_tongue": "😜",
+    "wolf_face": "🐺",
+    "woman": "👩",
+    "woman_artist": "👩\u200d🎨",
+    "woman_artist_dark_skin_tone": "👩🏿\u200d🎨",
+    "woman_artist_light_skin_tone": "👩🏻\u200d🎨",
+    "woman_artist_medium-dark_skin_tone": "👩🏾\u200d🎨",
+    "woman_artist_medium-light_skin_tone": "👩🏼\u200d🎨",
+    "woman_artist_medium_skin_tone": "👩🏽\u200d🎨",
+    "woman_astronaut": "👩\u200d🚀",
+    "woman_astronaut_dark_skin_tone": "👩🏿\u200d🚀",
+    "woman_astronaut_light_skin_tone": "👩🏻\u200d🚀",
+    "woman_astronaut_medium-dark_skin_tone": "👩🏾\u200d🚀",
+    "woman_astronaut_medium-light_skin_tone": "👩🏼\u200d🚀",
+    "woman_astronaut_medium_skin_tone": "👩🏽\u200d🚀",
+    "woman_biking": "🚴\u200d♀️",
+    "woman_biking_dark_skin_tone": "🚴🏿\u200d♀️",
+    "woman_biking_light_skin_tone": "🚴🏻\u200d♀️",
+    "woman_biking_medium-dark_skin_tone": "🚴🏾\u200d♀️",
+    "woman_biking_medium-light_skin_tone": "🚴🏼\u200d♀️",
+    "woman_biking_medium_skin_tone": "🚴🏽\u200d♀️",
+    "woman_bouncing_ball": "⛹️\u200d♀️",
+    "woman_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♀️",
+    "woman_bouncing_ball_light_skin_tone": "⛹🏻\u200d♀️",
+    "woman_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♀️",
+    "woman_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♀️",
+    "woman_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♀️",
+    "woman_bowing": "🙇\u200d♀️",
+    "woman_bowing_dark_skin_tone": "🙇🏿\u200d♀️",
+    "woman_bowing_light_skin_tone": "🙇🏻\u200d♀️",
+    "woman_bowing_medium-dark_skin_tone": "🙇🏾\u200d♀️",
+    "woman_bowing_medium-light_skin_tone": "🙇🏼\u200d♀️",
+    "woman_bowing_medium_skin_tone": "🙇🏽\u200d♀️",
+    "woman_cartwheeling": "🤸\u200d♀️",
+    "woman_cartwheeling_dark_skin_tone": "🤸🏿\u200d♀️",
+    "woman_cartwheeling_light_skin_tone": "🤸🏻\u200d♀️",
+    "woman_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♀️",
+    "woman_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♀️",
+    "woman_cartwheeling_medium_skin_tone": "🤸🏽\u200d♀️",
+    "woman_climbing": "🧗\u200d♀️",
+    "woman_climbing_dark_skin_tone": "🧗🏿\u200d♀️",
+    "woman_climbing_light_skin_tone": "🧗🏻\u200d♀️",
+    "woman_climbing_medium-dark_skin_tone": "🧗🏾\u200d♀️",
+    "woman_climbing_medium-light_skin_tone": "🧗🏼\u200d♀️",
+    "woman_climbing_medium_skin_tone": "🧗🏽\u200d♀️",
+    "woman_construction_worker": "👷\u200d♀️",
+    "woman_construction_worker_dark_skin_tone": "👷🏿\u200d♀️",
+    "woman_construction_worker_light_skin_tone": "👷🏻\u200d♀️",
+    "woman_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♀️",
+    "woman_construction_worker_medium-light_skin_tone": "👷🏼\u200d♀️",
+    "woman_construction_worker_medium_skin_tone": "👷🏽\u200d♀️",
+    "woman_cook": "👩\u200d🍳",
+    "woman_cook_dark_skin_tone": "👩🏿\u200d🍳",
+    "woman_cook_light_skin_tone": "👩🏻\u200d🍳",
+    "woman_cook_medium-dark_skin_tone": "👩🏾\u200d🍳",
+    "woman_cook_medium-light_skin_tone": "👩🏼\u200d🍳",
+    "woman_cook_medium_skin_tone": "👩🏽\u200d🍳",
+    "woman_dancing": "💃",
+    "woman_dancing_dark_skin_tone": "💃🏿",
+    "woman_dancing_light_skin_tone": "💃🏻",
+    "woman_dancing_medium-dark_skin_tone": "💃🏾",
+    "woman_dancing_medium-light_skin_tone": "💃🏼",
+    "woman_dancing_medium_skin_tone": "💃🏽",
+    "woman_dark_skin_tone": "👩🏿",
+    "woman_detective": "🕵️\u200d♀️",
+    "woman_detective_dark_skin_tone": "🕵🏿\u200d♀️",
+    "woman_detective_light_skin_tone": "🕵🏻\u200d♀️",
+    "woman_detective_medium-dark_skin_tone": "🕵🏾\u200d♀️",
+    "woman_detective_medium-light_skin_tone": "🕵🏼\u200d♀️",
+    "woman_detective_medium_skin_tone": "🕵🏽\u200d♀️",
+    "woman_elf": "🧝\u200d♀️",
+    "woman_elf_dark_skin_tone": "🧝🏿\u200d♀️",
+    "woman_elf_light_skin_tone": "🧝🏻\u200d♀️",
+    "woman_elf_medium-dark_skin_tone": "🧝🏾\u200d♀️",
+    "woman_elf_medium-light_skin_tone": "🧝🏼\u200d♀️",
+    "woman_elf_medium_skin_tone": "🧝🏽\u200d♀️",
+    "woman_facepalming": "🤦\u200d♀️",
+    "woman_facepalming_dark_skin_tone": "🤦🏿\u200d♀️",
+    "woman_facepalming_light_skin_tone": "🤦🏻\u200d♀️",
+    "woman_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♀️",
+    "woman_facepalming_medium-light_skin_tone": "🤦🏼\u200d♀️",
+    "woman_facepalming_medium_skin_tone": "🤦🏽\u200d♀️",
+    "woman_factory_worker": "👩\u200d🏭",
+    "woman_factory_worker_dark_skin_tone": "👩🏿\u200d🏭",
+    "woman_factory_worker_light_skin_tone": "👩🏻\u200d🏭",
+    "woman_factory_worker_medium-dark_skin_tone": "👩🏾\u200d🏭",
+    "woman_factory_worker_medium-light_skin_tone": "👩🏼\u200d🏭",
+    "woman_factory_worker_medium_skin_tone": "👩🏽\u200d🏭",
+    "woman_fairy": "🧚\u200d♀️",
+    "woman_fairy_dark_skin_tone": "🧚🏿\u200d♀️",
+    "woman_fairy_light_skin_tone": "🧚🏻\u200d♀️",
+    "woman_fairy_medium-dark_skin_tone": "🧚🏾\u200d♀️",
+    "woman_fairy_medium-light_skin_tone": "🧚🏼\u200d♀️",
+    "woman_fairy_medium_skin_tone": "🧚🏽\u200d♀️",
+    "woman_farmer": "👩\u200d🌾",
+    "woman_farmer_dark_skin_tone": "👩🏿\u200d🌾",
+    "woman_farmer_light_skin_tone": "👩🏻\u200d🌾",
+    "woman_farmer_medium-dark_skin_tone": "👩🏾\u200d🌾",
+    "woman_farmer_medium-light_skin_tone": "👩🏼\u200d🌾",
+    "woman_farmer_medium_skin_tone": "👩🏽\u200d🌾",
+    "woman_firefighter": "👩\u200d🚒",
+    "woman_firefighter_dark_skin_tone": "👩🏿\u200d🚒",
+    "woman_firefighter_light_skin_tone": "👩🏻\u200d🚒",
+    "woman_firefighter_medium-dark_skin_tone": "👩🏾\u200d🚒",
+    "woman_firefighter_medium-light_skin_tone": "👩🏼\u200d🚒",
+    "woman_firefighter_medium_skin_tone": "👩🏽\u200d🚒",
+    "woman_frowning": "🙍\u200d♀️",
+    "woman_frowning_dark_skin_tone": "🙍🏿\u200d♀️",
+    "woman_frowning_light_skin_tone": "🙍🏻\u200d♀️",
+    "woman_frowning_medium-dark_skin_tone": "🙍🏾\u200d♀️",
+    "woman_frowning_medium-light_skin_tone": "🙍🏼\u200d♀️",
+    "woman_frowning_medium_skin_tone": "🙍🏽\u200d♀️",
+    "woman_genie": "🧞\u200d♀️",
+    "woman_gesturing_no": "🙅\u200d♀️",
+    "woman_gesturing_no_dark_skin_tone": "🙅🏿\u200d♀️",
+    "woman_gesturing_no_light_skin_tone": "🙅🏻\u200d♀️",
+    "woman_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♀️",
+    "woman_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♀️",
+    "woman_gesturing_no_medium_skin_tone": "🙅🏽\u200d♀️",
+    "woman_gesturing_ok": "🙆\u200d♀️",
+    "woman_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♀️",
+    "woman_gesturing_ok_light_skin_tone": "🙆🏻\u200d♀️",
+    "woman_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♀️",
+    "woman_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♀️",
+    "woman_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♀️",
+    "woman_getting_haircut": "💇\u200d♀️",
+    "woman_getting_haircut_dark_skin_tone": "💇🏿\u200d♀️",
+    "woman_getting_haircut_light_skin_tone": "💇🏻\u200d♀️",
+    "woman_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♀️",
+    "woman_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♀️",
+    "woman_getting_haircut_medium_skin_tone": "💇🏽\u200d♀️",
+    "woman_getting_massage": "💆\u200d♀️",
+    "woman_getting_massage_dark_skin_tone": "💆🏿\u200d♀️",
+    "woman_getting_massage_light_skin_tone": "💆🏻\u200d♀️",
+    "woman_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♀️",
+    "woman_getting_massage_medium-light_skin_tone": "💆🏼\u200d♀️",
+    "woman_getting_massage_medium_skin_tone": "💆🏽\u200d♀️",
+    "woman_golfing": "🏌️\u200d♀️",
+    "woman_golfing_dark_skin_tone": "🏌🏿\u200d♀️",
+    "woman_golfing_light_skin_tone": "🏌🏻\u200d♀️",
+    "woman_golfing_medium-dark_skin_tone": "🏌🏾\u200d♀️",
+    "woman_golfing_medium-light_skin_tone": "🏌🏼\u200d♀️",
+    "woman_golfing_medium_skin_tone": "🏌🏽\u200d♀️",
+    "woman_guard": "💂\u200d♀️",
+    "woman_guard_dark_skin_tone": "💂🏿\u200d♀️",
+    "woman_guard_light_skin_tone": "💂🏻\u200d♀️",
+    "woman_guard_medium-dark_skin_tone": "💂🏾\u200d♀️",
+    "woman_guard_medium-light_skin_tone": "💂🏼\u200d♀️",
+    "woman_guard_medium_skin_tone": "💂🏽\u200d♀️",
+    "woman_health_worker": "👩\u200d⚕️",
+    "woman_health_worker_dark_skin_tone": "👩🏿\u200d⚕️",
+    "woman_health_worker_light_skin_tone": "👩🏻\u200d⚕️",
+    "woman_health_worker_medium-dark_skin_tone": "👩🏾\u200d⚕️",
+    "woman_health_worker_medium-light_skin_tone": "👩🏼\u200d⚕️",
+    "woman_health_worker_medium_skin_tone": "👩🏽\u200d⚕️",
+    "woman_in_lotus_position": "🧘\u200d♀️",
+    "woman_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♀️",
+    "woman_in_lotus_position_light_skin_tone": "🧘🏻\u200d♀️",
+    "woman_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♀️",
+    "woman_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♀️",
+    "woman_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♀️",
+    "woman_in_manual_wheelchair": "👩\u200d🦽",
+    "woman_in_motorized_wheelchair": "👩\u200d🦼",
+    "woman_in_steamy_room": "🧖\u200d♀️",
+    "woman_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♀️",
+    "woman_in_steamy_room_light_skin_tone": "🧖🏻\u200d♀️",
+    "woman_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♀️",
+    "woman_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♀️",
+    "woman_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♀️",
+    "woman_judge": "👩\u200d⚖️",
+    "woman_judge_dark_skin_tone": "👩🏿\u200d⚖️",
+    "woman_judge_light_skin_tone": "👩🏻\u200d⚖️",
+    "woman_judge_medium-dark_skin_tone": "👩🏾\u200d⚖️",
+    "woman_judge_medium-light_skin_tone": "👩🏼\u200d⚖️",
+    "woman_judge_medium_skin_tone": "👩🏽\u200d⚖️",
+    "woman_juggling": "🤹\u200d♀️",
+    "woman_juggling_dark_skin_tone": "🤹🏿\u200d♀️",
+    "woman_juggling_light_skin_tone": "🤹🏻\u200d♀️",
+    "woman_juggling_medium-dark_skin_tone": "🤹🏾\u200d♀️",
+    "woman_juggling_medium-light_skin_tone": "🤹🏼\u200d♀️",
+    "woman_juggling_medium_skin_tone": "🤹🏽\u200d♀️",
+    "woman_lifting_weights": "🏋️\u200d♀️",
+    "woman_lifting_weights_dark_skin_tone": "🏋🏿\u200d♀️",
+    "woman_lifting_weights_light_skin_tone": "🏋🏻\u200d♀️",
+    "woman_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♀️",
+    "woman_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♀️",
+    "woman_lifting_weights_medium_skin_tone": "🏋🏽\u200d♀️",
+    "woman_light_skin_tone": "👩🏻",
+    "woman_mage": "🧙\u200d♀️",
+    "woman_mage_dark_skin_tone": "🧙🏿\u200d♀️",
+    "woman_mage_light_skin_tone": "🧙🏻\u200d♀️",
+    "woman_mage_medium-dark_skin_tone": "🧙🏾\u200d♀️",
+    "woman_mage_medium-light_skin_tone": "🧙🏼\u200d♀️",
+    "woman_mage_medium_skin_tone": "🧙🏽\u200d♀️",
+    "woman_mechanic": "👩\u200d🔧",
+    "woman_mechanic_dark_skin_tone": "👩🏿\u200d🔧",
+    "woman_mechanic_light_skin_tone": "👩🏻\u200d🔧",
+    "woman_mechanic_medium-dark_skin_tone": "👩🏾\u200d🔧",
+    "woman_mechanic_medium-light_skin_tone": "👩🏼\u200d🔧",
+    "woman_mechanic_medium_skin_tone": "👩🏽\u200d🔧",
+    "woman_medium-dark_skin_tone": "👩🏾",
+    "woman_medium-light_skin_tone": "👩🏼",
+    "woman_medium_skin_tone": "👩🏽",
+    "woman_mountain_biking": "🚵\u200d♀️",
+    "woman_mountain_biking_dark_skin_tone": "🚵🏿\u200d♀️",
+    "woman_mountain_biking_light_skin_tone": "🚵🏻\u200d♀️",
+    "woman_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♀️",
+    "woman_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♀️",
+    "woman_mountain_biking_medium_skin_tone": "🚵🏽\u200d♀️",
+    "woman_office_worker": "👩\u200d💼",
+    "woman_office_worker_dark_skin_tone": "👩🏿\u200d💼",
+    "woman_office_worker_light_skin_tone": "👩🏻\u200d💼",
+    "woman_office_worker_medium-dark_skin_tone": "👩🏾\u200d💼",
+    "woman_office_worker_medium-light_skin_tone": "👩🏼\u200d💼",
+    "woman_office_worker_medium_skin_tone": "👩🏽\u200d💼",
+    "woman_pilot": "👩\u200d✈️",
+    "woman_pilot_dark_skin_tone": "👩🏿\u200d✈️",
+    "woman_pilot_light_skin_tone": "👩🏻\u200d✈️",
+    "woman_pilot_medium-dark_skin_tone": "👩🏾\u200d✈️",
+    "woman_pilot_medium-light_skin_tone": "👩🏼\u200d✈️",
+    "woman_pilot_medium_skin_tone": "👩🏽\u200d✈️",
+    "woman_playing_handball": "🤾\u200d♀️",
+    "woman_playing_handball_dark_skin_tone": "🤾🏿\u200d♀️",
+    "woman_playing_handball_light_skin_tone": "🤾🏻\u200d♀️",
+    "woman_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♀️",
+    "woman_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♀️",
+    "woman_playing_handball_medium_skin_tone": "🤾🏽\u200d♀️",
+    "woman_playing_water_polo": "🤽\u200d♀️",
+    "woman_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♀️",
+    "woman_playing_water_polo_light_skin_tone": "🤽🏻\u200d♀️",
+    "woman_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♀️",
+    "woman_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♀️",
+    "woman_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♀️",
+    "woman_police_officer": "👮\u200d♀️",
+    "woman_police_officer_dark_skin_tone": "👮🏿\u200d♀️",
+    "woman_police_officer_light_skin_tone": "👮🏻\u200d♀️",
+    "woman_police_officer_medium-dark_skin_tone": "👮🏾\u200d♀️",
+    "woman_police_officer_medium-light_skin_tone": "👮🏼\u200d♀️",
+    "woman_police_officer_medium_skin_tone": "👮🏽\u200d♀️",
+    "woman_pouting": "🙎\u200d♀️",
+    "woman_pouting_dark_skin_tone": "🙎🏿\u200d♀️",
+    "woman_pouting_light_skin_tone": "🙎🏻\u200d♀️",
+    "woman_pouting_medium-dark_skin_tone": "🙎🏾\u200d♀️",
+    "woman_pouting_medium-light_skin_tone": "🙎🏼\u200d♀️",
+    "woman_pouting_medium_skin_tone": "🙎🏽\u200d♀️",
+    "woman_raising_hand": "🙋\u200d♀️",
+    "woman_raising_hand_dark_skin_tone": "🙋🏿\u200d♀️",
+    "woman_raising_hand_light_skin_tone": "🙋🏻\u200d♀️",
+    "woman_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♀️",
+    "woman_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♀️",
+    "woman_raising_hand_medium_skin_tone": "🙋🏽\u200d♀️",
+    "woman_rowing_boat": "🚣\u200d♀️",
+    "woman_rowing_boat_dark_skin_tone": "🚣🏿\u200d♀️",
+    "woman_rowing_boat_light_skin_tone": "🚣🏻\u200d♀️",
+    "woman_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♀️",
+    "woman_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♀️",
+    "woman_rowing_boat_medium_skin_tone": "🚣🏽\u200d♀️",
+    "woman_running": "🏃\u200d♀️",
+    "woman_running_dark_skin_tone": "🏃🏿\u200d♀️",
+    "woman_running_light_skin_tone": "🏃🏻\u200d♀️",
+    "woman_running_medium-dark_skin_tone": "🏃🏾\u200d♀️",
+    "woman_running_medium-light_skin_tone": "🏃🏼\u200d♀️",
+    "woman_running_medium_skin_tone": "🏃🏽\u200d♀️",
+    "woman_scientist": "👩\u200d🔬",
+    "woman_scientist_dark_skin_tone": "👩🏿\u200d🔬",
+    "woman_scientist_light_skin_tone": "👩🏻\u200d🔬",
+    "woman_scientist_medium-dark_skin_tone": "👩🏾\u200d🔬",
+    "woman_scientist_medium-light_skin_tone": "👩🏼\u200d🔬",
+    "woman_scientist_medium_skin_tone": "👩🏽\u200d🔬",
+    "woman_shrugging": "🤷\u200d♀️",
+    "woman_shrugging_dark_skin_tone": "🤷🏿\u200d♀️",
+    "woman_shrugging_light_skin_tone": "🤷🏻\u200d♀️",
+    "woman_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♀️",
+    "woman_shrugging_medium-light_skin_tone": "🤷🏼\u200d♀️",
+    "woman_shrugging_medium_skin_tone": "🤷🏽\u200d♀️",
+    "woman_singer": "👩\u200d🎤",
+    "woman_singer_dark_skin_tone": "👩🏿\u200d🎤",
+    "woman_singer_light_skin_tone": "👩🏻\u200d🎤",
+    "woman_singer_medium-dark_skin_tone": "👩🏾\u200d🎤",
+    "woman_singer_medium-light_skin_tone": "👩🏼\u200d🎤",
+    "woman_singer_medium_skin_tone": "👩🏽\u200d🎤",
+    "woman_student": "👩\u200d🎓",
+    "woman_student_dark_skin_tone": "👩🏿\u200d🎓",
+    "woman_student_light_skin_tone": "👩🏻\u200d🎓",
+    "woman_student_medium-dark_skin_tone": "👩🏾\u200d🎓",
+    "woman_student_medium-light_skin_tone": "👩🏼\u200d🎓",
+    "woman_student_medium_skin_tone": "👩🏽\u200d🎓",
+    "woman_surfing": "🏄\u200d♀️",
+    "woman_surfing_dark_skin_tone": "🏄🏿\u200d♀️",
+    "woman_surfing_light_skin_tone": "🏄🏻\u200d♀️",
+    "woman_surfing_medium-dark_skin_tone": "🏄🏾\u200d♀️",
+    "woman_surfing_medium-light_skin_tone": "🏄🏼\u200d♀️",
+    "woman_surfing_medium_skin_tone": "🏄🏽\u200d♀️",
+    "woman_swimming": "🏊\u200d♀️",
+    "woman_swimming_dark_skin_tone": "🏊🏿\u200d♀️",
+    "woman_swimming_light_skin_tone": "🏊🏻\u200d♀️",
+    "woman_swimming_medium-dark_skin_tone": "🏊🏾\u200d♀️",
+    "woman_swimming_medium-light_skin_tone": "🏊🏼\u200d♀️",
+    "woman_swimming_medium_skin_tone": "🏊🏽\u200d♀️",
+    "woman_teacher": "👩\u200d🏫",
+    "woman_teacher_dark_skin_tone": "👩🏿\u200d🏫",
+    "woman_teacher_light_skin_tone": "👩🏻\u200d🏫",
+    "woman_teacher_medium-dark_skin_tone": "👩🏾\u200d🏫",
+    "woman_teacher_medium-light_skin_tone": "👩🏼\u200d🏫",
+    "woman_teacher_medium_skin_tone": "👩🏽\u200d🏫",
+    "woman_technologist": "👩\u200d💻",
+    "woman_technologist_dark_skin_tone": "👩🏿\u200d💻",
+    "woman_technologist_light_skin_tone": "👩🏻\u200d💻",
+    "woman_technologist_medium-dark_skin_tone": "👩🏾\u200d💻",
+    "woman_technologist_medium-light_skin_tone": "👩🏼\u200d💻",
+    "woman_technologist_medium_skin_tone": "👩🏽\u200d💻",
+    "woman_tipping_hand": "💁\u200d♀️",
+    "woman_tipping_hand_dark_skin_tone": "💁🏿\u200d♀️",
+    "woman_tipping_hand_light_skin_tone": "💁🏻\u200d♀️",
+    "woman_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♀️",
+    "woman_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♀️",
+    "woman_tipping_hand_medium_skin_tone": "💁🏽\u200d♀️",
+    "woman_vampire": "🧛\u200d♀️",
+    "woman_vampire_dark_skin_tone": "🧛🏿\u200d♀️",
+    "woman_vampire_light_skin_tone": "🧛🏻\u200d♀️",
+    "woman_vampire_medium-dark_skin_tone": "🧛🏾\u200d♀️",
+    "woman_vampire_medium-light_skin_tone": "🧛🏼\u200d♀️",
+    "woman_vampire_medium_skin_tone": "🧛🏽\u200d♀️",
+    "woman_walking": "🚶\u200d♀️",
+    "woman_walking_dark_skin_tone": "🚶🏿\u200d♀️",
+    "woman_walking_light_skin_tone": "🚶🏻\u200d♀️",
+    "woman_walking_medium-dark_skin_tone": "🚶🏾\u200d♀️",
+    "woman_walking_medium-light_skin_tone": "🚶🏼\u200d♀️",
+    "woman_walking_medium_skin_tone": "🚶🏽\u200d♀️",
+    "woman_wearing_turban": "👳\u200d♀️",
+    "woman_wearing_turban_dark_skin_tone": "👳🏿\u200d♀️",
+    "woman_wearing_turban_light_skin_tone": "👳🏻\u200d♀️",
+    "woman_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♀️",
+    "woman_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♀️",
+    "woman_wearing_turban_medium_skin_tone": "👳🏽\u200d♀️",
+    "woman_with_headscarf": "🧕",
+    "woman_with_headscarf_dark_skin_tone": "🧕🏿",
+    "woman_with_headscarf_light_skin_tone": "🧕🏻",
+    "woman_with_headscarf_medium-dark_skin_tone": "🧕🏾",
+    "woman_with_headscarf_medium-light_skin_tone": "🧕🏼",
+    "woman_with_headscarf_medium_skin_tone": "🧕🏽",
+    "woman_with_probing_cane": "👩\u200d🦯",
+    "woman_zombie": "🧟\u200d♀️",
+    "woman’s_boot": "👢",
+    "woman’s_clothes": "👚",
+    "woman’s_hat": "👒",
+    "woman’s_sandal": "👡",
+    "women_with_bunny_ears": "👯\u200d♀️",
+    "women_wrestling": "🤼\u200d♀️",
+    "women’s_room": "🚺",
+    "woozy_face": "🥴",
+    "world_map": "🗺",
+    "worried_face": "😟",
+    "wrapped_gift": "🎁",
+    "wrench": "🔧",
+    "writing_hand": "✍",
+    "writing_hand_dark_skin_tone": "✍🏿",
+    "writing_hand_light_skin_tone": "✍🏻",
+    "writing_hand_medium-dark_skin_tone": "✍🏾",
+    "writing_hand_medium-light_skin_tone": "✍🏼",
+    "writing_hand_medium_skin_tone": "✍🏽",
+    "yarn": "🧶",
+    "yawning_face": "🥱",
+    "yellow_circle": "🟡",
+    "yellow_heart": "💛",
+    "yellow_square": "🟨",
+    "yen_banknote": "💴",
+    "yo-yo": "🪀",
+    "yin_yang": "☯",
+    "zany_face": "🤪",
+    "zebra": "🦓",
+    "zipper-mouth_face": "🤐",
+    "zombie": "🧟",
+    "zzz": "💤",
+    "åland_islands": "🇦🇽",
+    "keycap_asterisk": "*⃣",
+    "keycap_digit_eight": "8⃣",
+    "keycap_digit_five": "5⃣",
+    "keycap_digit_four": "4⃣",
+    "keycap_digit_nine": "9⃣",
+    "keycap_digit_one": "1⃣",
+    "keycap_digit_seven": "7⃣",
+    "keycap_digit_six": "6⃣",
+    "keycap_digit_three": "3⃣",
+    "keycap_digit_two": "2⃣",
+    "keycap_digit_zero": "0⃣",
+    "keycap_number_sign": "#⃣",
+    "light_skin_tone": "🏻",
+    "medium_light_skin_tone": "🏼",
+    "medium_skin_tone": "🏽",
+    "medium_dark_skin_tone": "🏾",
+    "dark_skin_tone": "🏿",
+    "regional_indicator_symbol_letter_a": "🇦",
+    "regional_indicator_symbol_letter_b": "🇧",
+    "regional_indicator_symbol_letter_c": "🇨",
+    "regional_indicator_symbol_letter_d": "🇩",
+    "regional_indicator_symbol_letter_e": "🇪",
+    "regional_indicator_symbol_letter_f": "🇫",
+    "regional_indicator_symbol_letter_g": "🇬",
+    "regional_indicator_symbol_letter_h": "🇭",
+    "regional_indicator_symbol_letter_i": "🇮",
+    "regional_indicator_symbol_letter_j": "🇯",
+    "regional_indicator_symbol_letter_k": "🇰",
+    "regional_indicator_symbol_letter_l": "🇱",
+    "regional_indicator_symbol_letter_m": "🇲",
+    "regional_indicator_symbol_letter_n": "🇳",
+    "regional_indicator_symbol_letter_o": "🇴",
+    "regional_indicator_symbol_letter_p": "🇵",
+    "regional_indicator_symbol_letter_q": "🇶",
+    "regional_indicator_symbol_letter_r": "🇷",
+    "regional_indicator_symbol_letter_s": "🇸",
+    "regional_indicator_symbol_letter_t": "🇹",
+    "regional_indicator_symbol_letter_u": "🇺",
+    "regional_indicator_symbol_letter_v": "🇻",
+    "regional_indicator_symbol_letter_w": "🇼",
+    "regional_indicator_symbol_letter_x": "🇽",
+    "regional_indicator_symbol_letter_y": "🇾",
+    "regional_indicator_symbol_letter_z": "🇿",
+    "airplane_arriving": "🛬",
+    "space_invader": "👾",
+    "football": "🏈",
+    "anger": "💢",
+    "angry": "😠",
+    "anguished": "😧",
+    "signal_strength": "📶",
+    "arrows_counterclockwise": "🔄",
+    "arrow_heading_down": "⤵",
+    "arrow_heading_up": "⤴",
+    "art": "🎨",
+    "astonished": "😲",
+    "athletic_shoe": "👟",
+    "atm": "🏧",
+    "car": "🚗",
+    "red_car": "🚗",
+    "angel": "👼",
+    "back": "🔙",
+    "badminton_racquet_and_shuttlecock": "🏸",
+    "dollar": "💵",
+    "euro": "💶",
+    "pound": "💷",
+    "yen": "💴",
+    "barber": "💈",
+    "bath": "🛀",
+    "bear": "🐻",
+    "heartbeat": "💓",
+    "beer": "🍺",
+    "no_bell": "🔕",
+    "bento": "🍱",
+    "bike": "🚲",
+    "bicyclist": "🚴",
+    "8ball": "🎱",
+    "biohazard_sign": "☣",
+    "birthday": "🎂",
+    "black_circle_for_record": "⏺",
+    "clubs": "♣",
+    "diamonds": "♦",
+    "arrow_double_down": "⏬",
+    "hearts": "♥",
+    "rewind": "⏪",
+    "black_left__pointing_double_triangle_with_vertical_bar": "⏮",
+    "arrow_backward": "◀",
+    "black_medium_small_square": "◾",
+    "question": "❓",
+    "fast_forward": "⏩",
+    "black_right__pointing_double_triangle_with_vertical_bar": "⏭",
+    "arrow_forward": "▶",
+    "black_right__pointing_triangle_with_double_vertical_bar": "⏯",
+    "arrow_right": "➡",
+    "spades": "♠",
+    "black_square_for_stop": "⏹",
+    "sunny": "☀",
+    "phone": "☎",
+    "recycle": "♻",
+    "arrow_double_up": "⏫",
+    "busstop": "🚏",
+    "date": "📅",
+    "flags": "🎏",
+    "cat2": "🐈",
+    "joy_cat": "😹",
+    "smirk_cat": "😼",
+    "chart_with_downwards_trend": "📉",
+    "chart_with_upwards_trend": "📈",
+    "chart": "💹",
+    "mega": "📣",
+    "checkered_flag": "🏁",
+    "accept": "🉑",
+    "ideograph_advantage": "🉐",
+    "congratulations": "㊗",
+    "secret": "㊙",
+    "m": "Ⓜ",
+    "city_sunset": "🌆",
+    "clapper": "🎬",
+    "clap": "👏",
+    "beers": "🍻",
+    "clock830": "🕣",
+    "clock8": "🕗",
+    "clock1130": "🕦",
+    "clock11": "🕚",
+    "clock530": "🕠",
+    "clock5": "🕔",
+    "clock430": "🕟",
+    "clock4": "🕓",
+    "clock930": "🕤",
+    "clock9": "🕘",
+    "clock130": "🕜",
+    "clock1": "🕐",
+    "clock730": "🕢",
+    "clock7": "🕖",
+    "clock630": "🕡",
+    "clock6": "🕕",
+    "clock1030": "🕥",
+    "clock10": "🕙",
+    "clock330": "🕞",
+    "clock3": "🕒",
+    "clock1230": "🕧",
+    "clock12": "🕛",
+    "clock230": "🕝",
+    "clock2": "🕑",
+    "arrows_clockwise": "🔃",
+    "repeat": "🔁",
+    "repeat_one": "🔂",
+    "closed_lock_with_key": "🔐",
+    "mailbox_closed": "📪",
+    "mailbox": "📫",
+    "cloud_with_tornado": "🌪",
+    "cocktail": "🍸",
+    "boom": "💥",
+    "compression": "🗜",
+    "confounded": "😖",
+    "confused": "😕",
+    "rice": "🍚",
+    "cow2": "🐄",
+    "cricket_bat_and_ball": "🏏",
+    "x": "❌",
+    "cry": "😢",
+    "curry": "🍛",
+    "dagger_knife": "🗡",
+    "dancer": "💃",
+    "dark_sunglasses": "🕶",
+    "dash": "💨",
+    "truck": "🚚",
+    "derelict_house_building": "🏚",
+    "diamond_shape_with_a_dot_inside": "💠",
+    "dart": "🎯",
+    "disappointed_relieved": "😥",
+    "disappointed": "😞",
+    "do_not_litter": "🚯",
+    "dog2": "🐕",
+    "flipper": "🐬",
+    "loop": "➿",
+    "bangbang": "‼",
+    "double_vertical_bar": "⏸",
+    "dove_of_peace": "🕊",
+    "small_red_triangle_down": "🔻",
+    "arrow_down_small": "🔽",
+    "arrow_down": "⬇",
+    "dromedary_camel": "🐪",
+    "e__mail": "📧",
+    "corn": "🌽",
+    "ear_of_rice": "🌾",
+    "earth_americas": "🌎",
+    "earth_asia": "🌏",
+    "earth_africa": "🌍",
+    "eight_pointed_black_star": "✴",
+    "eight_spoked_asterisk": "✳",
+    "eject_symbol": "⏏",
+    "bulb": "💡",
+    "emoji_modifier_fitzpatrick_type__1__2": "🏻",
+    "emoji_modifier_fitzpatrick_type__3": "🏼",
+    "emoji_modifier_fitzpatrick_type__4": "🏽",
+    "emoji_modifier_fitzpatrick_type__5": "🏾",
+    "emoji_modifier_fitzpatrick_type__6": "🏿",
+    "end": "🔚",
+    "email": "✉",
+    "european_castle": "🏰",
+    "european_post_office": "🏤",
+    "interrobang": "⁉",
+    "expressionless": "😑",
+    "eyeglasses": "👓",
+    "massage": "💆",
+    "yum": "😋",
+    "scream": "😱",
+    "kissing_heart": "😘",
+    "sweat": "😓",
+    "face_with_head__bandage": "🤕",
+    "triumph": "😤",
+    "mask": "😷",
+    "no_good": "🙅",
+    "ok_woman": "🙆",
+    "open_mouth": "😮",
+    "cold_sweat": "😰",
+    "stuck_out_tongue": "😛",
+    "stuck_out_tongue_closed_eyes": "😝",
+    "stuck_out_tongue_winking_eye": "😜",
+    "joy": "😂",
+    "no_mouth": "😶",
+    "santa": "🎅",
+    "fax": "📠",
+    "fearful": "😨",
+    "field_hockey_stick_and_ball": "🏑",
+    "first_quarter_moon_with_face": "🌛",
+    "fish_cake": "🍥",
+    "fishing_pole_and_fish": "🎣",
+    "facepunch": "👊",
+    "punch": "👊",
+    "flag_for_afghanistan": "🇦🇫",
+    "flag_for_albania": "🇦🇱",
+    "flag_for_algeria": "🇩🇿",
+    "flag_for_american_samoa": "🇦🇸",
+    "flag_for_andorra": "🇦🇩",
+    "flag_for_angola": "🇦🇴",
+    "flag_for_anguilla": "🇦🇮",
+    "flag_for_antarctica": "🇦🇶",
+    "flag_for_antigua_&_barbuda": "🇦🇬",
+    "flag_for_argentina": "🇦🇷",
+    "flag_for_armenia": "🇦🇲",
+    "flag_for_aruba": "🇦🇼",
+    "flag_for_ascension_island": "🇦🇨",
+    "flag_for_australia": "🇦🇺",
+    "flag_for_austria": "🇦🇹",
+    "flag_for_azerbaijan": "🇦🇿",
+    "flag_for_bahamas": "🇧🇸",
+    "flag_for_bahrain": "🇧🇭",
+    "flag_for_bangladesh": "🇧🇩",
+    "flag_for_barbados": "🇧🇧",
+    "flag_for_belarus": "🇧🇾",
+    "flag_for_belgium": "🇧🇪",
+    "flag_for_belize": "🇧🇿",
+    "flag_for_benin": "🇧🇯",
+    "flag_for_bermuda": "🇧🇲",
+    "flag_for_bhutan": "🇧🇹",
+    "flag_for_bolivia": "🇧🇴",
+    "flag_for_bosnia_&_herzegovina": "🇧🇦",
+    "flag_for_botswana": "🇧🇼",
+    "flag_for_bouvet_island": "🇧🇻",
+    "flag_for_brazil": "🇧🇷",
+    "flag_for_british_indian_ocean_territory": "🇮🇴",
+    "flag_for_british_virgin_islands": "🇻🇬",
+    "flag_for_brunei": "🇧🇳",
+    "flag_for_bulgaria": "🇧🇬",
+    "flag_for_burkina_faso": "🇧🇫",
+    "flag_for_burundi": "🇧🇮",
+    "flag_for_cambodia": "🇰🇭",
+    "flag_for_cameroon": "🇨🇲",
+    "flag_for_canada": "🇨🇦",
+    "flag_for_canary_islands": "🇮🇨",
+    "flag_for_cape_verde": "🇨🇻",
+    "flag_for_caribbean_netherlands": "🇧🇶",
+    "flag_for_cayman_islands": "🇰🇾",
+    "flag_for_central_african_republic": "🇨🇫",
+    "flag_for_ceuta_&_melilla": "🇪🇦",
+    "flag_for_chad": "🇹🇩",
+    "flag_for_chile": "🇨🇱",
+    "flag_for_china": "🇨🇳",
+    "flag_for_christmas_island": "🇨🇽",
+    "flag_for_clipperton_island": "🇨🇵",
+    "flag_for_cocos__islands": "🇨🇨",
+    "flag_for_colombia": "🇨🇴",
+    "flag_for_comoros": "🇰🇲",
+    "flag_for_congo____brazzaville": "🇨🇬",
+    "flag_for_congo____kinshasa": "🇨🇩",
+    "flag_for_cook_islands": "🇨🇰",
+    "flag_for_costa_rica": "🇨🇷",
+    "flag_for_croatia": "🇭🇷",
+    "flag_for_cuba": "🇨🇺",
+    "flag_for_curaçao": "🇨🇼",
+    "flag_for_cyprus": "🇨🇾",
+    "flag_for_czech_republic": "🇨🇿",
+    "flag_for_côte_d’ivoire": "🇨🇮",
+    "flag_for_denmark": "🇩🇰",
+    "flag_for_diego_garcia": "🇩🇬",
+    "flag_for_djibouti": "🇩🇯",
+    "flag_for_dominica": "🇩🇲",
+    "flag_for_dominican_republic": "🇩🇴",
+    "flag_for_ecuador": "🇪🇨",
+    "flag_for_egypt": "🇪🇬",
+    "flag_for_el_salvador": "🇸🇻",
+    "flag_for_equatorial_guinea": "🇬🇶",
+    "flag_for_eritrea": "🇪🇷",
+    "flag_for_estonia": "🇪🇪",
+    "flag_for_ethiopia": "🇪🇹",
+    "flag_for_european_union": "🇪🇺",
+    "flag_for_falkland_islands": "🇫🇰",
+    "flag_for_faroe_islands": "🇫🇴",
+    "flag_for_fiji": "🇫🇯",
+    "flag_for_finland": "🇫🇮",
+    "flag_for_france": "🇫🇷",
+    "flag_for_french_guiana": "🇬🇫",
+    "flag_for_french_polynesia": "🇵🇫",
+    "flag_for_french_southern_territories": "🇹🇫",
+    "flag_for_gabon": "🇬🇦",
+    "flag_for_gambia": "🇬🇲",
+    "flag_for_georgia": "🇬🇪",
+    "flag_for_germany": "🇩🇪",
+    "flag_for_ghana": "🇬🇭",
+    "flag_for_gibraltar": "🇬🇮",
+    "flag_for_greece": "🇬🇷",
+    "flag_for_greenland": "🇬🇱",
+    "flag_for_grenada": "🇬🇩",
+    "flag_for_guadeloupe": "🇬🇵",
+    "flag_for_guam": "🇬🇺",
+    "flag_for_guatemala": "🇬🇹",
+    "flag_for_guernsey": "🇬🇬",
+    "flag_for_guinea": "🇬🇳",
+    "flag_for_guinea__bissau": "🇬🇼",
+    "flag_for_guyana": "🇬🇾",
+    "flag_for_haiti": "🇭🇹",
+    "flag_for_heard_&_mcdonald_islands": "🇭🇲",
+    "flag_for_honduras": "🇭🇳",
+    "flag_for_hong_kong": "🇭🇰",
+    "flag_for_hungary": "🇭🇺",
+    "flag_for_iceland": "🇮🇸",
+    "flag_for_india": "🇮🇳",
+    "flag_for_indonesia": "🇮🇩",
+    "flag_for_iran": "🇮🇷",
+    "flag_for_iraq": "🇮🇶",
+    "flag_for_ireland": "🇮🇪",
+    "flag_for_isle_of_man": "🇮🇲",
+    "flag_for_israel": "🇮🇱",
+    "flag_for_italy": "🇮🇹",
+    "flag_for_jamaica": "🇯🇲",
+    "flag_for_japan": "🇯🇵",
+    "flag_for_jersey": "🇯🇪",
+    "flag_for_jordan": "🇯🇴",
+    "flag_for_kazakhstan": "🇰🇿",
+    "flag_for_kenya": "🇰🇪",
+    "flag_for_kiribati": "🇰🇮",
+    "flag_for_kosovo": "🇽🇰",
+    "flag_for_kuwait": "🇰🇼",
+    "flag_for_kyrgyzstan": "🇰🇬",
+    "flag_for_laos": "🇱🇦",
+    "flag_for_latvia": "🇱🇻",
+    "flag_for_lebanon": "🇱🇧",
+    "flag_for_lesotho": "🇱🇸",
+    "flag_for_liberia": "🇱🇷",
+    "flag_for_libya": "🇱🇾",
+    "flag_for_liechtenstein": "🇱🇮",
+    "flag_for_lithuania": "🇱🇹",
+    "flag_for_luxembourg": "🇱🇺",
+    "flag_for_macau": "🇲🇴",
+    "flag_for_macedonia": "🇲🇰",
+    "flag_for_madagascar": "🇲🇬",
+    "flag_for_malawi": "🇲🇼",
+    "flag_for_malaysia": "🇲🇾",
+    "flag_for_maldives": "🇲🇻",
+    "flag_for_mali": "🇲🇱",
+    "flag_for_malta": "🇲🇹",
+    "flag_for_marshall_islands": "🇲🇭",
+    "flag_for_martinique": "🇲🇶",
+    "flag_for_mauritania": "🇲🇷",
+    "flag_for_mauritius": "🇲🇺",
+    "flag_for_mayotte": "🇾🇹",
+    "flag_for_mexico": "🇲🇽",
+    "flag_for_micronesia": "🇫🇲",
+    "flag_for_moldova": "🇲🇩",
+    "flag_for_monaco": "🇲🇨",
+    "flag_for_mongolia": "🇲🇳",
+    "flag_for_montenegro": "🇲🇪",
+    "flag_for_montserrat": "🇲🇸",
+    "flag_for_morocco": "🇲🇦",
+    "flag_for_mozambique": "🇲🇿",
+    "flag_for_myanmar": "🇲🇲",
+    "flag_for_namibia": "🇳🇦",
+    "flag_for_nauru": "🇳🇷",
+    "flag_for_nepal": "🇳🇵",
+    "flag_for_netherlands": "🇳🇱",
+    "flag_for_new_caledonia": "🇳🇨",
+    "flag_for_new_zealand": "🇳🇿",
+    "flag_for_nicaragua": "🇳🇮",
+    "flag_for_niger": "🇳🇪",
+    "flag_for_nigeria": "🇳🇬",
+    "flag_for_niue": "🇳🇺",
+    "flag_for_norfolk_island": "🇳🇫",
+    "flag_for_north_korea": "🇰🇵",
+    "flag_for_northern_mariana_islands": "🇲🇵",
+    "flag_for_norway": "🇳🇴",
+    "flag_for_oman": "🇴🇲",
+    "flag_for_pakistan": "🇵🇰",
+    "flag_for_palau": "🇵🇼",
+    "flag_for_palestinian_territories": "🇵🇸",
+    "flag_for_panama": "🇵🇦",
+    "flag_for_papua_new_guinea": "🇵🇬",
+    "flag_for_paraguay": "🇵🇾",
+    "flag_for_peru": "🇵🇪",
+    "flag_for_philippines": "🇵🇭",
+    "flag_for_pitcairn_islands": "🇵🇳",
+    "flag_for_poland": "🇵🇱",
+    "flag_for_portugal": "🇵🇹",
+    "flag_for_puerto_rico": "🇵🇷",
+    "flag_for_qatar": "🇶🇦",
+    "flag_for_romania": "🇷🇴",
+    "flag_for_russia": "🇷🇺",
+    "flag_for_rwanda": "🇷🇼",
+    "flag_for_réunion": "🇷🇪",
+    "flag_for_samoa": "🇼🇸",
+    "flag_for_san_marino": "🇸🇲",
+    "flag_for_saudi_arabia": "🇸🇦",
+    "flag_for_senegal": "🇸🇳",
+    "flag_for_serbia": "🇷🇸",
+    "flag_for_seychelles": "🇸🇨",
+    "flag_for_sierra_leone": "🇸🇱",
+    "flag_for_singapore": "🇸🇬",
+    "flag_for_sint_maarten": "🇸🇽",
+    "flag_for_slovakia": "🇸🇰",
+    "flag_for_slovenia": "🇸🇮",
+    "flag_for_solomon_islands": "🇸🇧",
+    "flag_for_somalia": "🇸🇴",
+    "flag_for_south_africa": "🇿🇦",
+    "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸",
+    "flag_for_south_korea": "🇰🇷",
+    "flag_for_south_sudan": "🇸🇸",
+    "flag_for_spain": "🇪🇸",
+    "flag_for_sri_lanka": "🇱🇰",
+    "flag_for_st._barthélemy": "🇧🇱",
+    "flag_for_st._helena": "🇸🇭",
+    "flag_for_st._kitts_&_nevis": "🇰🇳",
+    "flag_for_st._lucia": "🇱🇨",
+    "flag_for_st._martin": "🇲🇫",
+    "flag_for_st._pierre_&_miquelon": "🇵🇲",
+    "flag_for_st._vincent_&_grenadines": "🇻🇨",
+    "flag_for_sudan": "🇸🇩",
+    "flag_for_suriname": "🇸🇷",
+    "flag_for_svalbard_&_jan_mayen": "🇸🇯",
+    "flag_for_swaziland": "🇸🇿",
+    "flag_for_sweden": "🇸🇪",
+    "flag_for_switzerland": "🇨🇭",
+    "flag_for_syria": "🇸🇾",
+    "flag_for_são_tomé_&_príncipe": "🇸🇹",
+    "flag_for_taiwan": "🇹🇼",
+    "flag_for_tajikistan": "🇹🇯",
+    "flag_for_tanzania": "🇹🇿",
+    "flag_for_thailand": "🇹🇭",
+    "flag_for_timor__leste": "🇹🇱",
+    "flag_for_togo": "🇹🇬",
+    "flag_for_tokelau": "🇹🇰",
+    "flag_for_tonga": "🇹🇴",
+    "flag_for_trinidad_&_tobago": "🇹🇹",
+    "flag_for_tristan_da_cunha": "🇹🇦",
+    "flag_for_tunisia": "🇹🇳",
+    "flag_for_turkey": "🇹🇷",
+    "flag_for_turkmenistan": "🇹🇲",
+    "flag_for_turks_&_caicos_islands": "🇹🇨",
+    "flag_for_tuvalu": "🇹🇻",
+    "flag_for_u.s._outlying_islands": "🇺🇲",
+    "flag_for_u.s._virgin_islands": "🇻🇮",
+    "flag_for_uganda": "🇺🇬",
+    "flag_for_ukraine": "🇺🇦",
+    "flag_for_united_arab_emirates": "🇦🇪",
+    "flag_for_united_kingdom": "🇬🇧",
+    "flag_for_united_states": "🇺🇸",
+    "flag_for_uruguay": "🇺🇾",
+    "flag_for_uzbekistan": "🇺🇿",
+    "flag_for_vanuatu": "🇻🇺",
+    "flag_for_vatican_city": "🇻🇦",
+    "flag_for_venezuela": "🇻🇪",
+    "flag_for_vietnam": "🇻🇳",
+    "flag_for_wallis_&_futuna": "🇼🇫",
+    "flag_for_western_sahara": "🇪🇭",
+    "flag_for_yemen": "🇾🇪",
+    "flag_for_zambia": "🇿🇲",
+    "flag_for_zimbabwe": "🇿🇼",
+    "flag_for_åland_islands": "🇦🇽",
+    "golf": "⛳",
+    "fleur__de__lis": "⚜",
+    "muscle": "💪",
+    "flushed": "😳",
+    "frame_with_picture": "🖼",
+    "fries": "🍟",
+    "frog": "🐸",
+    "hatched_chick": "🐥",
+    "frowning": "😦",
+    "fuelpump": "⛽",
+    "full_moon_with_face": "🌝",
+    "gem": "💎",
+    "star2": "🌟",
+    "golfer": "🏌",
+    "mortar_board": "🎓",
+    "grimacing": "😬",
+    "smile_cat": "😸",
+    "grinning": "😀",
+    "grin": "😁",
+    "heartpulse": "💗",
+    "guardsman": "💂",
+    "haircut": "💇",
+    "hamster": "🐹",
+    "raising_hand": "🙋",
+    "headphones": "🎧",
+    "hear_no_evil": "🙉",
+    "cupid": "💘",
+    "gift_heart": "💝",
+    "heart": "❤",
+    "exclamation": "❗",
+    "heavy_exclamation_mark": "❗",
+    "heavy_heart_exclamation_mark_ornament": "❣",
+    "o": "⭕",
+    "helm_symbol": "⎈",
+    "helmet_with_white_cross": "⛑",
+    "high_heel": "👠",
+    "bullettrain_side": "🚄",
+    "bullettrain_front": "🚅",
+    "high_brightness": "🔆",
+    "zap": "⚡",
+    "hocho": "🔪",
+    "knife": "🔪",
+    "bee": "🐝",
+    "traffic_light": "🚥",
+    "racehorse": "🐎",
+    "coffee": "☕",
+    "hotsprings": "♨",
+    "hourglass": "⌛",
+    "hourglass_flowing_sand": "⏳",
+    "house_buildings": "🏘",
+    "100": "💯",
+    "hushed": "😯",
+    "ice_hockey_stick_and_puck": "🏒",
+    "imp": "👿",
+    "information_desk_person": "💁",
+    "information_source": "ℹ",
+    "capital_abcd": "🔠",
+    "abc": "🔤",
+    "abcd": "🔡",
+    "1234": "🔢",
+    "symbols": "🔣",
+    "izakaya_lantern": "🏮",
+    "lantern": "🏮",
+    "jack_o_lantern": "🎃",
+    "dolls": "🎎",
+    "japanese_goblin": "👺",
+    "japanese_ogre": "👹",
+    "beginner": "🔰",
+    "zero": "0️⃣",
+    "one": "1️⃣",
+    "ten": "🔟",
+    "two": "2️⃣",
+    "three": "3️⃣",
+    "four": "4️⃣",
+    "five": "5️⃣",
+    "six": "6️⃣",
+    "seven": "7️⃣",
+    "eight": "8️⃣",
+    "nine": "9️⃣",
+    "couplekiss": "💏",
+    "kissing_cat": "😽",
+    "kissing": "😗",
+    "kissing_closed_eyes": "😚",
+    "kissing_smiling_eyes": "😙",
+    "beetle": "🐞",
+    "large_blue_circle": "🔵",
+    "last_quarter_moon_with_face": "🌜",
+    "leaves": "🍃",
+    "mag": "🔍",
+    "left_right_arrow": "↔",
+    "leftwards_arrow_with_hook": "↩",
+    "arrow_left": "⬅",
+    "lock": "🔒",
+    "lock_with_ink_pen": "🔏",
+    "sob": "😭",
+    "low_brightness": "🔅",
+    "lower_left_ballpoint_pen": "🖊",
+    "lower_left_crayon": "🖍",
+    "lower_left_fountain_pen": "🖋",
+    "lower_left_paintbrush": "🖌",
+    "mahjong": "🀄",
+    "couple": "👫",
+    "man_in_business_suit_levitating": "🕴",
+    "man_with_gua_pi_mao": "👲",
+    "man_with_turban": "👳",
+    "mans_shoe": "👞",
+    "shoe": "👞",
+    "menorah_with_nine_branches": "🕎",
+    "mens": "🚹",
+    "minidisc": "💽",
+    "iphone": "📱",
+    "calling": "📲",
+    "money__mouth_face": "🤑",
+    "moneybag": "💰",
+    "rice_scene": "🎑",
+    "mountain_bicyclist": "🚵",
+    "mouse2": "🐁",
+    "lips": "👄",
+    "moyai": "🗿",
+    "notes": "🎶",
+    "nail_care": "💅",
+    "ab": "🆎",
+    "negative_squared_cross_mark": "❎",
+    "a": "🅰",
+    "b": "🅱",
+    "o2": "🅾",
+    "parking": "🅿",
+    "new_moon_with_face": "🌚",
+    "no_entry_sign": "🚫",
+    "underage": "🔞",
+    "non__potable_water": "🚱",
+    "arrow_upper_right": "↗",
+    "arrow_upper_left": "↖",
+    "office": "🏢",
+    "older_man": "👴",
+    "older_woman": "👵",
+    "om_symbol": "🕉",
+    "on": "🔛",
+    "book": "📖",
+    "unlock": "🔓",
+    "mailbox_with_no_mail": "📭",
+    "mailbox_with_mail": "📬",
+    "cd": "💿",
+    "tada": "🎉",
+    "feet": "🐾",
+    "walking": "🚶",
+    "pencil2": "✏",
+    "pensive": "😔",
+    "persevere": "😣",
+    "bow": "🙇",
+    "raised_hands": "🙌",
+    "person_with_ball": "⛹",
+    "person_with_blond_hair": "👱",
+    "pray": "🙏",
+    "person_with_pouting_face": "🙎",
+    "computer": "💻",
+    "pig2": "🐖",
+    "hankey": "💩",
+    "poop": "💩",
+    "shit": "💩",
+    "bamboo": "🎍",
+    "gun": "🔫",
+    "black_joker": "🃏",
+    "rotating_light": "🚨",
+    "cop": "👮",
+    "stew": "🍲",
+    "pouch": "👝",
+    "pouting_cat": "😾",
+    "rage": "😡",
+    "put_litter_in_its_place": "🚮",
+    "rabbit2": "🐇",
+    "racing_motorcycle": "🏍",
+    "radioactive_sign": "☢",
+    "fist": "✊",
+    "hand": "✋",
+    "raised_hand_with_fingers_splayed": "🖐",
+    "raised_hand_with_part_between_middle_and_ring_fingers": "🖖",
+    "blue_car": "🚙",
+    "apple": "🍎",
+    "relieved": "😌",
+    "reversed_hand_with_middle_finger_extended": "🖕",
+    "mag_right": "🔎",
+    "arrow_right_hook": "↪",
+    "sweet_potato": "🍠",
+    "robot": "🤖",
+    "rolled__up_newspaper": "🗞",
+    "rowboat": "🚣",
+    "runner": "🏃",
+    "running": "🏃",
+    "running_shirt_with_sash": "🎽",
+    "boat": "⛵",
+    "scales": "⚖",
+    "school_satchel": "🎒",
+    "scorpius": "♏",
+    "see_no_evil": "🙈",
+    "sheep": "🐑",
+    "stars": "🌠",
+    "cake": "🍰",
+    "six_pointed_star": "🔯",
+    "ski": "🎿",
+    "sleeping_accommodation": "🛌",
+    "sleeping": "😴",
+    "sleepy": "😪",
+    "sleuth_or_spy": "🕵",
+    "heart_eyes_cat": "😻",
+    "smiley_cat": "😺",
+    "innocent": "😇",
+    "heart_eyes": "😍",
+    "smiling_imp": "😈",
+    "smiley": "😃",
+    "sweat_smile": "😅",
+    "smile": "😄",
+    "laughing": "😆",
+    "satisfied": "😆",
+    "blush": "😊",
+    "smirk": "😏",
+    "smoking": "🚬",
+    "snow_capped_mountain": "🏔",
+    "soccer": "⚽",
+    "icecream": "🍦",
+    "soon": "🔜",
+    "arrow_lower_right": "↘",
+    "arrow_lower_left": "↙",
+    "speak_no_evil": "🙊",
+    "speaker": "🔈",
+    "mute": "🔇",
+    "sound": "🔉",
+    "loud_sound": "🔊",
+    "speaking_head_in_silhouette": "🗣",
+    "spiral_calendar_pad": "🗓",
+    "spiral_note_pad": "🗒",
+    "shell": "🐚",
+    "sweat_drops": "💦",
+    "u5272": "🈹",
+    "u5408": "🈴",
+    "u55b6": "🈺",
+    "u6307": "🈯",
+    "u6708": "🈷",
+    "u6709": "🈶",
+    "u6e80": "🈵",
+    "u7121": "🈚",
+    "u7533": "🈸",
+    "u7981": "🈲",
+    "u7a7a": "🈳",
+    "cl": "🆑",
+    "cool": "🆒",
+    "free": "🆓",
+    "id": "🆔",
+    "koko": "🈁",
+    "sa": "🈂",
+    "new": "🆕",
+    "ng": "🆖",
+    "ok": "🆗",
+    "sos": "🆘",
+    "up": "🆙",
+    "vs": "🆚",
+    "steam_locomotive": "🚂",
+    "ramen": "🍜",
+    "partly_sunny": "⛅",
+    "city_sunrise": "🌇",
+    "surfer": "🏄",
+    "swimmer": "🏊",
+    "shirt": "👕",
+    "tshirt": "👕",
+    "table_tennis_paddle_and_ball": "🏓",
+    "tea": "🍵",
+    "tv": "📺",
+    "three_button_mouse": "🖱",
+    "+1": "👍",
+    "thumbsup": "👍",
+    "__1": "👎",
+    "-1": "👎",
+    "thumbsdown": "👎",
+    "thunder_cloud_and_rain": "⛈",
+    "tiger2": "🐅",
+    "tophat": "🎩",
+    "top": "🔝",
+    "tm": "™",
+    "train2": "🚆",
+    "triangular_flag_on_post": "🚩",
+    "trident": "🔱",
+    "twisted_rightwards_arrows": "🔀",
+    "unamused": "😒",
+    "small_red_triangle": "🔺",
+    "arrow_up_small": "🔼",
+    "arrow_up_down": "↕",
+    "upside__down_face": "🙃",
+    "arrow_up": "⬆",
+    "v": "✌",
+    "vhs": "📼",
+    "wc": "🚾",
+    "ocean": "🌊",
+    "waving_black_flag": "🏴",
+    "wave": "👋",
+    "waving_white_flag": "🏳",
+    "moon": "🌔",
+    "scream_cat": "🙀",
+    "weary": "😩",
+    "weight_lifter": "🏋",
+    "whale2": "🐋",
+    "wheelchair": "♿",
+    "point_down": "👇",
+    "grey_exclamation": "❕",
+    "white_frowning_face": "☹",
+    "white_check_mark": "✅",
+    "point_left": "👈",
+    "white_medium_small_square": "◽",
+    "star": "⭐",
+    "grey_question": "❔",
+    "point_right": "👉",
+    "relaxed": "☺",
+    "white_sun_behind_cloud": "🌥",
+    "white_sun_behind_cloud_with_rain": "🌦",
+    "white_sun_with_small_cloud": "🌤",
+    "point_up_2": "👆",
+    "point_up": "☝",
+    "wind_blowing_face": "🌬",
+    "wink": "😉",
+    "wolf": "🐺",
+    "dancers": "👯",
+    "boot": "👢",
+    "womans_clothes": "👚",
+    "womans_hat": "👒",
+    "sandal": "👡",
+    "womens": "🚺",
+    "worried": "😟",
+    "gift": "🎁",
+    "zipper__mouth_face": "🤐",
+    "regional_indicator_a": "🇦",
+    "regional_indicator_b": "🇧",
+    "regional_indicator_c": "🇨",
+    "regional_indicator_d": "🇩",
+    "regional_indicator_e": "🇪",
+    "regional_indicator_f": "🇫",
+    "regional_indicator_g": "🇬",
+    "regional_indicator_h": "🇭",
+    "regional_indicator_i": "🇮",
+    "regional_indicator_j": "🇯",
+    "regional_indicator_k": "🇰",
+    "regional_indicator_l": "🇱",
+    "regional_indicator_m": "🇲",
+    "regional_indicator_n": "🇳",
+    "regional_indicator_o": "🇴",
+    "regional_indicator_p": "🇵",
+    "regional_indicator_q": "🇶",
+    "regional_indicator_r": "🇷",
+    "regional_indicator_s": "🇸",
+    "regional_indicator_t": "🇹",
+    "regional_indicator_u": "🇺",
+    "regional_indicator_v": "🇻",
+    "regional_indicator_w": "🇼",
+    "regional_indicator_x": "🇽",
+    "regional_indicator_y": "🇾",
+    "regional_indicator_z": "🇿",
+}
diff --git a/.venv/Lib/site-packages/rich/_emoji_replace.py b/.venv/Lib/site-packages/rich/_emoji_replace.py
new file mode 100644 (file)
index 0000000..bb2cafa
--- /dev/null
@@ -0,0 +1,32 @@
+from typing import Callable, Match, Optional
+import re
+
+from ._emoji_codes import EMOJI
+
+
+_ReStringMatch = Match[str]  # regex match object
+_ReSubCallable = Callable[[_ReStringMatch], str]  # Callable invoked by re.sub
+_EmojiSubMethod = Callable[[_ReSubCallable, str], str]  # Sub method of a compiled re
+
+
+def _emoji_replace(
+    text: str,
+    default_variant: Optional[str] = None,
+    _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub,
+) -> str:
+    """Replace emoji code in text."""
+    get_emoji = EMOJI.__getitem__
+    variants = {"text": "\uFE0E", "emoji": "\uFE0F"}
+    get_variant = variants.get
+    default_variant_code = variants.get(default_variant, "") if default_variant else ""
+
+    def do_replace(match: Match[str]) -> str:
+        emoji_code, emoji_name, variant = match.groups()
+        try:
+            return get_emoji(emoji_name.lower()) + get_variant(
+                variant, default_variant_code
+            )
+        except KeyError:
+            return emoji_code
+
+    return _emoji_sub(do_replace, text)
diff --git a/.venv/Lib/site-packages/rich/_export_format.py b/.venv/Lib/site-packages/rich/_export_format.py
new file mode 100644 (file)
index 0000000..e7527e5
--- /dev/null
@@ -0,0 +1,76 @@
+CONSOLE_HTML_FORMAT = """\
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<style>
+{stylesheet}
+body {{
+    color: {foreground};
+    background-color: {background};
+}}
+</style>
+</head>
+<body>
+    <pre style="font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace"><code style="font-family:inherit">{code}</code></pre>
+</body>
+</html>
+"""
+
+CONSOLE_SVG_FORMAT = """\
+<svg class="rich-terminal" viewBox="0 0 {width} {height}" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generated with Rich https://www.textualize.io -->
+    <style>
+
+    @font-face {{
+        font-family: "Fira Code";
+        src: local("FiraCode-Regular"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+        font-style: normal;
+        font-weight: 400;
+    }}
+    @font-face {{
+        font-family: "Fira Code";
+        src: local("FiraCode-Bold"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+        font-style: bold;
+        font-weight: 700;
+    }}
+
+    .{unique_id}-matrix {{
+        font-family: Fira Code, monospace;
+        font-size: {char_height}px;
+        line-height: {line_height}px;
+        font-variant-east-asian: full-width;
+    }}
+
+    .{unique_id}-title {{
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }}
+
+    {styles}
+    </style>
+
+    <defs>
+    <clipPath id="{unique_id}-clip-terminal">
+      <rect x="0" y="0" width="{terminal_width}" height="{terminal_height}" />
+    </clipPath>
+    {lines}
+    </defs>
+
+    {chrome}
+    <g transform="translate({terminal_x}, {terminal_y})" clip-path="url(#{unique_id}-clip-terminal)">
+    {backgrounds}
+    <g class="{unique_id}-matrix">
+    {matrix}
+    </g>
+    </g>
+</svg>
+"""
+
+_SVG_FONT_FAMILY = "Rich Fira Code"
+_SVG_CLASSES_PREFIX = "rich-svg"
diff --git a/.venv/Lib/site-packages/rich/_extension.py b/.venv/Lib/site-packages/rich/_extension.py
new file mode 100644 (file)
index 0000000..3865886
--- /dev/null
@@ -0,0 +1,10 @@
+from typing import Any
+
+
+def load_ipython_extension(ip: Any) -> None:  # pragma: no cover
+    # prevent circular import
+    from rich.pretty import install
+    from rich.traceback import install as tr_install
+
+    install()
+    tr_install()
diff --git a/.venv/Lib/site-packages/rich/_fileno.py b/.venv/Lib/site-packages/rich/_fileno.py
new file mode 100644 (file)
index 0000000..b17ee65
--- /dev/null
@@ -0,0 +1,24 @@
+from __future__ import annotations
+
+from typing import IO, Callable
+
+
+def get_fileno(file_like: IO[str]) -> int | None:
+    """Get fileno() from a file, accounting for poorly implemented file-like objects.
+
+    Args:
+        file_like (IO): A file-like object.
+
+    Returns:
+        int | None: The result of fileno if available, or None if operation failed.
+    """
+    fileno: Callable[[], int] | None = getattr(file_like, "fileno", None)
+    if fileno is not None:
+        try:
+            return fileno()
+        except Exception:
+            # `fileno` is documented as potentially raising a OSError
+            # Alas, from the issues, there are so many poorly implemented file-like objects,
+            # that `fileno()` can raise just about anything.
+            return None
+    return None
diff --git a/.venv/Lib/site-packages/rich/_inspect.py b/.venv/Lib/site-packages/rich/_inspect.py
new file mode 100644 (file)
index 0000000..e87698d
--- /dev/null
@@ -0,0 +1,268 @@
+import inspect
+from inspect import cleandoc, getdoc, getfile, isclass, ismodule, signature
+from typing import Any, Collection, Iterable, Optional, Tuple, Type, Union
+
+from .console import Group, RenderableType
+from .control import escape_control_codes
+from .highlighter import ReprHighlighter
+from .jupyter import JupyterMixin
+from .panel import Panel
+from .pretty import Pretty
+from .table import Table
+from .text import Text, TextType
+
+
+def _first_paragraph(doc: str) -> str:
+    """Get the first paragraph from a docstring."""
+    paragraph, _, _ = doc.partition("\n\n")
+    return paragraph
+
+
+class Inspect(JupyterMixin):
+    """A renderable to inspect any Python Object.
+
+    Args:
+        obj (Any): An object to inspect.
+        title (str, optional): Title to display over inspect result, or None use type. Defaults to None.
+        help (bool, optional): Show full help text rather than just first paragraph. Defaults to False.
+        methods (bool, optional): Enable inspection of callables. Defaults to False.
+        docs (bool, optional): Also render doc strings. Defaults to True.
+        private (bool, optional): Show private attributes (beginning with underscore). Defaults to False.
+        dunder (bool, optional): Show attributes starting with double underscore. Defaults to False.
+        sort (bool, optional): Sort attributes alphabetically. Defaults to True.
+        all (bool, optional): Show all attributes. Defaults to False.
+        value (bool, optional): Pretty print value of object. Defaults to True.
+    """
+
+    def __init__(
+        self,
+        obj: Any,
+        *,
+        title: Optional[TextType] = None,
+        help: bool = False,
+        methods: bool = False,
+        docs: bool = True,
+        private: bool = False,
+        dunder: bool = False,
+        sort: bool = True,
+        all: bool = True,
+        value: bool = True,
+    ) -> None:
+        self.highlighter = ReprHighlighter()
+        self.obj = obj
+        self.title = title or self._make_title(obj)
+        if all:
+            methods = private = dunder = True
+        self.help = help
+        self.methods = methods
+        self.docs = docs or help
+        self.private = private or dunder
+        self.dunder = dunder
+        self.sort = sort
+        self.value = value
+
+    def _make_title(self, obj: Any) -> Text:
+        """Make a default title."""
+        title_str = (
+            str(obj)
+            if (isclass(obj) or callable(obj) or ismodule(obj))
+            else str(type(obj))
+        )
+        title_text = self.highlighter(title_str)
+        return title_text
+
+    def __rich__(self) -> Panel:
+        return Panel.fit(
+            Group(*self._render()),
+            title=self.title,
+            border_style="scope.border",
+            padding=(0, 1),
+        )
+
+    def _get_signature(self, name: str, obj: Any) -> Optional[Text]:
+        """Get a signature for a callable."""
+        try:
+            _signature = str(signature(obj)) + ":"
+        except ValueError:
+            _signature = "(...)"
+        except TypeError:
+            return None
+
+        source_filename: Optional[str] = None
+        try:
+            source_filename = getfile(obj)
+        except (OSError, TypeError):
+            # OSError is raised if obj has no source file, e.g. when defined in REPL.
+            pass
+
+        callable_name = Text(name, style="inspect.callable")
+        if source_filename:
+            callable_name.stylize(f"link file://{source_filename}")
+        signature_text = self.highlighter(_signature)
+
+        qualname = name or getattr(obj, "__qualname__", name)
+
+        # If obj is a module, there may be classes (which are callable) to display
+        if inspect.isclass(obj):
+            prefix = "class"
+        elif inspect.iscoroutinefunction(obj):
+            prefix = "async def"
+        else:
+            prefix = "def"
+
+        qual_signature = Text.assemble(
+            (f"{prefix} ", f"inspect.{prefix.replace(' ', '_')}"),
+            (qualname, "inspect.callable"),
+            signature_text,
+        )
+
+        return qual_signature
+
+    def _render(self) -> Iterable[RenderableType]:
+        """Render object."""
+
+        def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]:
+            key, (_error, value) = item
+            return (callable(value), key.strip("_").lower())
+
+        def safe_getattr(attr_name: str) -> Tuple[Any, Any]:
+            """Get attribute or any exception."""
+            try:
+                return (None, getattr(obj, attr_name))
+            except Exception as error:
+                return (error, None)
+
+        obj = self.obj
+        keys = dir(obj)
+        total_items = len(keys)
+        if not self.dunder:
+            keys = [key for key in keys if not key.startswith("__")]
+        if not self.private:
+            keys = [key for key in keys if not key.startswith("_")]
+        not_shown_count = total_items - len(keys)
+        items = [(key, safe_getattr(key)) for key in keys]
+        if self.sort:
+            items.sort(key=sort_items)
+
+        items_table = Table.grid(padding=(0, 1), expand=False)
+        items_table.add_column(justify="right")
+        add_row = items_table.add_row
+        highlighter = self.highlighter
+
+        if callable(obj):
+            signature = self._get_signature("", obj)
+            if signature is not None:
+                yield signature
+                yield ""
+
+        if self.docs:
+            _doc = self._get_formatted_doc(obj)
+            if _doc is not None:
+                doc_text = Text(_doc, style="inspect.help")
+                doc_text = highlighter(doc_text)
+                yield doc_text
+                yield ""
+
+        if self.value and not (isclass(obj) or callable(obj) or ismodule(obj)):
+            yield Panel(
+                Pretty(obj, indent_guides=True, max_length=10, max_string=60),
+                border_style="inspect.value.border",
+            )
+            yield ""
+
+        for key, (error, value) in items:
+            key_text = Text.assemble(
+                (
+                    key,
+                    "inspect.attr.dunder" if key.startswith("__") else "inspect.attr",
+                ),
+                (" =", "inspect.equals"),
+            )
+            if error is not None:
+                warning = key_text.copy()
+                warning.stylize("inspect.error")
+                add_row(warning, highlighter(repr(error)))
+                continue
+
+            if callable(value):
+                if not self.methods:
+                    continue
+
+                _signature_text = self._get_signature(key, value)
+                if _signature_text is None:
+                    add_row(key_text, Pretty(value, highlighter=highlighter))
+                else:
+                    if self.docs:
+                        docs = self._get_formatted_doc(value)
+                        if docs is not None:
+                            _signature_text.append("\n" if "\n" in docs else " ")
+                            doc = highlighter(docs)
+                            doc.stylize("inspect.doc")
+                            _signature_text.append(doc)
+
+                    add_row(key_text, _signature_text)
+            else:
+                add_row(key_text, Pretty(value, highlighter=highlighter))
+        if items_table.row_count:
+            yield items_table
+        elif not_shown_count:
+            yield Text.from_markup(
+                f"[b cyan]{not_shown_count}[/][i] attribute(s) not shown.[/i] "
+                f"Run [b][magenta]inspect[/]([not b]inspect[/])[/b] for options."
+            )
+
+    def _get_formatted_doc(self, object_: Any) -> Optional[str]:
+        """
+        Extract the docstring of an object, process it and returns it.
+        The processing consists in cleaning up the doctring's indentation,
+        taking only its 1st paragraph if `self.help` is not True,
+        and escape its control codes.
+
+        Args:
+            object_ (Any): the object to get the docstring from.
+
+        Returns:
+            Optional[str]: the processed docstring, or None if no docstring was found.
+        """
+        docs = getdoc(object_)
+        if docs is None:
+            return None
+        docs = cleandoc(docs).strip()
+        if not self.help:
+            docs = _first_paragraph(docs)
+        return escape_control_codes(docs)
+
+
+def get_object_types_mro(obj: Union[object, Type[Any]]) -> Tuple[type, ...]:
+    """Returns the MRO of an object's class, or of the object itself if it's a class."""
+    if not hasattr(obj, "__mro__"):
+        # N.B. we cannot use `if type(obj) is type` here because it doesn't work with
+        # some types of classes, such as the ones that use abc.ABCMeta.
+        obj = type(obj)
+    return getattr(obj, "__mro__", ())
+
+
+def get_object_types_mro_as_strings(obj: object) -> Collection[str]:
+    """
+    Returns the MRO of an object's class as full qualified names, or of the object itself if it's a class.
+
+    Examples:
+        `object_types_mro_as_strings(JSONDecoder)` will return `['json.decoder.JSONDecoder', 'builtins.object']`
+    """
+    return [
+        f'{getattr(type_, "__module__", "")}.{getattr(type_, "__qualname__", "")}'
+        for type_ in get_object_types_mro(obj)
+    ]
+
+
+def is_object_one_of_types(
+    obj: object, fully_qualified_types_names: Collection[str]
+) -> bool:
+    """
+    Returns `True` if the given object's class (or the object itself, if it's a class) has one of the
+    fully qualified names in its MRO.
+    """
+    for type_name in get_object_types_mro_as_strings(obj):
+        if type_name in fully_qualified_types_names:
+            return True
+    return False
diff --git a/.venv/Lib/site-packages/rich/_log_render.py b/.venv/Lib/site-packages/rich/_log_render.py
new file mode 100644 (file)
index 0000000..e881010
--- /dev/null
@@ -0,0 +1,94 @@
+from datetime import datetime
+from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable
+
+
+from .text import Text, TextType
+
+if TYPE_CHECKING:
+    from .console import Console, ConsoleRenderable, RenderableType
+    from .table import Table
+
+FormatTimeCallable = Callable[[datetime], Text]
+
+
+class LogRender:
+    def __init__(
+        self,
+        show_time: bool = True,
+        show_level: bool = False,
+        show_path: bool = True,
+        time_format: Union[str, FormatTimeCallable] = "[%x %X]",
+        omit_repeated_times: bool = True,
+        level_width: Optional[int] = 8,
+    ) -> None:
+        self.show_time = show_time
+        self.show_level = show_level
+        self.show_path = show_path
+        self.time_format = time_format
+        self.omit_repeated_times = omit_repeated_times
+        self.level_width = level_width
+        self._last_time: Optional[Text] = None
+
+    def __call__(
+        self,
+        console: "Console",
+        renderables: Iterable["ConsoleRenderable"],
+        log_time: Optional[datetime] = None,
+        time_format: Optional[Union[str, FormatTimeCallable]] = None,
+        level: TextType = "",
+        path: Optional[str] = None,
+        line_no: Optional[int] = None,
+        link_path: Optional[str] = None,
+    ) -> "Table":
+        from .containers import Renderables
+        from .table import Table
+
+        output = Table.grid(padding=(0, 1))
+        output.expand = True
+        if self.show_time:
+            output.add_column(style="log.time")
+        if self.show_level:
+            output.add_column(style="log.level", width=self.level_width)
+        output.add_column(ratio=1, style="log.message", overflow="fold")
+        if self.show_path and path:
+            output.add_column(style="log.path")
+        row: List["RenderableType"] = []
+        if self.show_time:
+            log_time = log_time or console.get_datetime()
+            time_format = time_format or self.time_format
+            if callable(time_format):
+                log_time_display = time_format(log_time)
+            else:
+                log_time_display = Text(log_time.strftime(time_format))
+            if log_time_display == self._last_time and self.omit_repeated_times:
+                row.append(Text(" " * len(log_time_display)))
+            else:
+                row.append(log_time_display)
+                self._last_time = log_time_display
+        if self.show_level:
+            row.append(level)
+
+        row.append(Renderables(renderables))
+        if self.show_path and path:
+            path_text = Text()
+            path_text.append(
+                path, style=f"link file://{link_path}" if link_path else ""
+            )
+            if line_no:
+                path_text.append(":")
+                path_text.append(
+                    f"{line_no}",
+                    style=f"link file://{link_path}#{line_no}" if link_path else "",
+                )
+            row.append(path_text)
+
+        output.add_row(*row)
+        return output
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich.console import Console
+
+    c = Console()
+    c.print("[on blue]Hello", justify="right")
+    c.log("[on blue]hello", justify="right")
diff --git a/.venv/Lib/site-packages/rich/_loop.py b/.venv/Lib/site-packages/rich/_loop.py
new file mode 100644 (file)
index 0000000..01c6caf
--- /dev/null
@@ -0,0 +1,43 @@
+from typing import Iterable, Tuple, TypeVar
+
+T = TypeVar("T")
+
+
+def loop_first(values: Iterable[T]) -> Iterable[Tuple[bool, T]]:
+    """Iterate and generate a tuple with a flag for first value."""
+    iter_values = iter(values)
+    try:
+        value = next(iter_values)
+    except StopIteration:
+        return
+    yield True, value
+    for value in iter_values:
+        yield False, value
+
+
+def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]:
+    """Iterate and generate a tuple with a flag for last value."""
+    iter_values = iter(values)
+    try:
+        previous_value = next(iter_values)
+    except StopIteration:
+        return
+    for value in iter_values:
+        yield False, previous_value
+        previous_value = value
+    yield True, previous_value
+
+
+def loop_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]:
+    """Iterate and generate a tuple with a flag for first and last value."""
+    iter_values = iter(values)
+    try:
+        previous_value = next(iter_values)
+    except StopIteration:
+        return
+    first = True
+    for value in iter_values:
+        yield first, False, previous_value
+        first = False
+        previous_value = value
+    yield first, True, previous_value
diff --git a/.venv/Lib/site-packages/rich/_null_file.py b/.venv/Lib/site-packages/rich/_null_file.py
new file mode 100644 (file)
index 0000000..6ae05d3
--- /dev/null
@@ -0,0 +1,69 @@
+from types import TracebackType
+from typing import IO, Iterable, Iterator, List, Optional, Type
+
+
+class NullFile(IO[str]):
+    def close(self) -> None:
+        pass
+
+    def isatty(self) -> bool:
+        return False
+
+    def read(self, __n: int = 1) -> str:
+        return ""
+
+    def readable(self) -> bool:
+        return False
+
+    def readline(self, __limit: int = 1) -> str:
+        return ""
+
+    def readlines(self, __hint: int = 1) -> List[str]:
+        return []
+
+    def seek(self, __offset: int, __whence: int = 1) -> int:
+        return 0
+
+    def seekable(self) -> bool:
+        return False
+
+    def tell(self) -> int:
+        return 0
+
+    def truncate(self, __size: Optional[int] = 1) -> int:
+        return 0
+
+    def writable(self) -> bool:
+        return False
+
+    def writelines(self, __lines: Iterable[str]) -> None:
+        pass
+
+    def __next__(self) -> str:
+        return ""
+
+    def __iter__(self) -> Iterator[str]:
+        return iter([""])
+
+    def __enter__(self) -> IO[str]:
+        return self
+
+    def __exit__(
+        self,
+        __t: Optional[Type[BaseException]],
+        __value: Optional[BaseException],
+        __traceback: Optional[TracebackType],
+    ) -> None:
+        pass
+
+    def write(self, text: str) -> int:
+        return 0
+
+    def flush(self) -> None:
+        pass
+
+    def fileno(self) -> int:
+        return -1
+
+
+NULL_FILE = NullFile()
diff --git a/.venv/Lib/site-packages/rich/_palettes.py b/.venv/Lib/site-packages/rich/_palettes.py
new file mode 100644 (file)
index 0000000..3c748d3
--- /dev/null
@@ -0,0 +1,309 @@
+from .palette import Palette
+
+
+# Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column)
+WINDOWS_PALETTE = Palette(
+    [
+        (12, 12, 12),
+        (197, 15, 31),
+        (19, 161, 14),
+        (193, 156, 0),
+        (0, 55, 218),
+        (136, 23, 152),
+        (58, 150, 221),
+        (204, 204, 204),
+        (118, 118, 118),
+        (231, 72, 86),
+        (22, 198, 12),
+        (249, 241, 165),
+        (59, 120, 255),
+        (180, 0, 158),
+        (97, 214, 214),
+        (242, 242, 242),
+    ]
+)
+
+# # The standard ansi colors (including bright variants)
+STANDARD_PALETTE = Palette(
+    [
+        (0, 0, 0),
+        (170, 0, 0),
+        (0, 170, 0),
+        (170, 85, 0),
+        (0, 0, 170),
+        (170, 0, 170),
+        (0, 170, 170),
+        (170, 170, 170),
+        (85, 85, 85),
+        (255, 85, 85),
+        (85, 255, 85),
+        (255, 255, 85),
+        (85, 85, 255),
+        (255, 85, 255),
+        (85, 255, 255),
+        (255, 255, 255),
+    ]
+)
+
+
+# The 256 color palette
+EIGHT_BIT_PALETTE = Palette(
+    [
+        (0, 0, 0),
+        (128, 0, 0),
+        (0, 128, 0),
+        (128, 128, 0),
+        (0, 0, 128),
+        (128, 0, 128),
+        (0, 128, 128),
+        (192, 192, 192),
+        (128, 128, 128),
+        (255, 0, 0),
+        (0, 255, 0),
+        (255, 255, 0),
+        (0, 0, 255),
+        (255, 0, 255),
+        (0, 255, 255),
+        (255, 255, 255),
+        (0, 0, 0),
+        (0, 0, 95),
+        (0, 0, 135),
+        (0, 0, 175),
+        (0, 0, 215),
+        (0, 0, 255),
+        (0, 95, 0),
+        (0, 95, 95),
+        (0, 95, 135),
+        (0, 95, 175),
+        (0, 95, 215),
+        (0, 95, 255),
+        (0, 135, 0),
+        (0, 135, 95),
+        (0, 135, 135),
+        (0, 135, 175),
+        (0, 135, 215),
+        (0, 135, 255),
+        (0, 175, 0),
+        (0, 175, 95),
+        (0, 175, 135),
+        (0, 175, 175),
+        (0, 175, 215),
+        (0, 175, 255),
+        (0, 215, 0),
+        (0, 215, 95),
+        (0, 215, 135),
+        (0, 215, 175),
+        (0, 215, 215),
+        (0, 215, 255),
+        (0, 255, 0),
+        (0, 255, 95),
+        (0, 255, 135),
+        (0, 255, 175),
+        (0, 255, 215),
+        (0, 255, 255),
+        (95, 0, 0),
+        (95, 0, 95),
+        (95, 0, 135),
+        (95, 0, 175),
+        (95, 0, 215),
+        (95, 0, 255),
+        (95, 95, 0),
+        (95, 95, 95),
+        (95, 95, 135),
+        (95, 95, 175),
+        (95, 95, 215),
+        (95, 95, 255),
+        (95, 135, 0),
+        (95, 135, 95),
+        (95, 135, 135),
+        (95, 135, 175),
+        (95, 135, 215),
+        (95, 135, 255),
+        (95, 175, 0),
+        (95, 175, 95),
+        (95, 175, 135),
+        (95, 175, 175),
+        (95, 175, 215),
+        (95, 175, 255),
+        (95, 215, 0),
+        (95, 215, 95),
+        (95, 215, 135),
+        (95, 215, 175),
+        (95, 215, 215),
+        (95, 215, 255),
+        (95, 255, 0),
+        (95, 255, 95),
+        (95, 255, 135),
+        (95, 255, 175),
+        (95, 255, 215),
+        (95, 255, 255),
+        (135, 0, 0),
+        (135, 0, 95),
+        (135, 0, 135),
+        (135, 0, 175),
+        (135, 0, 215),
+        (135, 0, 255),
+        (135, 95, 0),
+        (135, 95, 95),
+        (135, 95, 135),
+        (135, 95, 175),
+        (135, 95, 215),
+        (135, 95, 255),
+        (135, 135, 0),
+        (135, 135, 95),
+        (135, 135, 135),
+        (135, 135, 175),
+        (135, 135, 215),
+        (135, 135, 255),
+        (135, 175, 0),
+        (135, 175, 95),
+        (135, 175, 135),
+        (135, 175, 175),
+        (135, 175, 215),
+        (135, 175, 255),
+        (135, 215, 0),
+        (135, 215, 95),
+        (135, 215, 135),
+        (135, 215, 175),
+        (135, 215, 215),
+        (135, 215, 255),
+        (135, 255, 0),
+        (135, 255, 95),
+        (135, 255, 135),
+        (135, 255, 175),
+        (135, 255, 215),
+        (135, 255, 255),
+        (175, 0, 0),
+        (175, 0, 95),
+        (175, 0, 135),
+        (175, 0, 175),
+        (175, 0, 215),
+        (175, 0, 255),
+        (175, 95, 0),
+        (175, 95, 95),
+        (175, 95, 135),
+        (175, 95, 175),
+        (175, 95, 215),
+        (175, 95, 255),
+        (175, 135, 0),
+        (175, 135, 95),
+        (175, 135, 135),
+        (175, 135, 175),
+        (175, 135, 215),
+        (175, 135, 255),
+        (175, 175, 0),
+        (175, 175, 95),
+        (175, 175, 135),
+        (175, 175, 175),
+        (175, 175, 215),
+        (175, 175, 255),
+        (175, 215, 0),
+        (175, 215, 95),
+        (175, 215, 135),
+        (175, 215, 175),
+        (175, 215, 215),
+        (175, 215, 255),
+        (175, 255, 0),
+        (175, 255, 95),
+        (175, 255, 135),
+        (175, 255, 175),
+        (175, 255, 215),
+        (175, 255, 255),
+        (215, 0, 0),
+        (215, 0, 95),
+        (215, 0, 135),
+        (215, 0, 175),
+        (215, 0, 215),
+        (215, 0, 255),
+        (215, 95, 0),
+        (215, 95, 95),
+        (215, 95, 135),
+        (215, 95, 175),
+        (215, 95, 215),
+        (215, 95, 255),
+        (215, 135, 0),
+        (215, 135, 95),
+        (215, 135, 135),
+        (215, 135, 175),
+        (215, 135, 215),
+        (215, 135, 255),
+        (215, 175, 0),
+        (215, 175, 95),
+        (215, 175, 135),
+        (215, 175, 175),
+        (215, 175, 215),
+        (215, 175, 255),
+        (215, 215, 0),
+        (215, 215, 95),
+        (215, 215, 135),
+        (215, 215, 175),
+        (215, 215, 215),
+        (215, 215, 255),
+        (215, 255, 0),
+        (215, 255, 95),
+        (215, 255, 135),
+        (215, 255, 175),
+        (215, 255, 215),
+        (215, 255, 255),
+        (255, 0, 0),
+        (255, 0, 95),
+        (255, 0, 135),
+        (255, 0, 175),
+        (255, 0, 215),
+        (255, 0, 255),
+        (255, 95, 0),
+        (255, 95, 95),
+        (255, 95, 135),
+        (255, 95, 175),
+        (255, 95, 215),
+        (255, 95, 255),
+        (255, 135, 0),
+        (255, 135, 95),
+        (255, 135, 135),
+        (255, 135, 175),
+        (255, 135, 215),
+        (255, 135, 255),
+        (255, 175, 0),
+        (255, 175, 95),
+        (255, 175, 135),
+        (255, 175, 175),
+        (255, 175, 215),
+        (255, 175, 255),
+        (255, 215, 0),
+        (255, 215, 95),
+        (255, 215, 135),
+        (255, 215, 175),
+        (255, 215, 215),
+        (255, 215, 255),
+        (255, 255, 0),
+        (255, 255, 95),
+        (255, 255, 135),
+        (255, 255, 175),
+        (255, 255, 215),
+        (255, 255, 255),
+        (8, 8, 8),
+        (18, 18, 18),
+        (28, 28, 28),
+        (38, 38, 38),
+        (48, 48, 48),
+        (58, 58, 58),
+        (68, 68, 68),
+        (78, 78, 78),
+        (88, 88, 88),
+        (98, 98, 98),
+        (108, 108, 108),
+        (118, 118, 118),
+        (128, 128, 128),
+        (138, 138, 138),
+        (148, 148, 148),
+        (158, 158, 158),
+        (168, 168, 168),
+        (178, 178, 178),
+        (188, 188, 188),
+        (198, 198, 198),
+        (208, 208, 208),
+        (218, 218, 218),
+        (228, 228, 228),
+        (238, 238, 238),
+    ]
+)
diff --git a/.venv/Lib/site-packages/rich/_pick.py b/.venv/Lib/site-packages/rich/_pick.py
new file mode 100644 (file)
index 0000000..4f6d8b2
--- /dev/null
@@ -0,0 +1,17 @@
+from typing import Optional
+
+
+def pick_bool(*values: Optional[bool]) -> bool:
+    """Pick the first non-none bool or return the last value.
+
+    Args:
+        *values (bool): Any number of boolean or None values.
+
+    Returns:
+        bool: First non-none boolean.
+    """
+    assert values, "1 or more values required"
+    for value in values:
+        if value is not None:
+            return value
+    return bool(value)
diff --git a/.venv/Lib/site-packages/rich/_ratio.py b/.venv/Lib/site-packages/rich/_ratio.py
new file mode 100644 (file)
index 0000000..e12397a
--- /dev/null
@@ -0,0 +1,159 @@
+import sys
+from fractions import Fraction
+from math import ceil
+from typing import cast, List, Optional, Sequence
+
+if sys.version_info >= (3, 8):
+    from typing import Protocol
+else:
+    from typing_extensions import Protocol  # pragma: no cover
+
+
+class Edge(Protocol):
+    """Any object that defines an edge (such as Layout)."""
+
+    size: Optional[int] = None
+    ratio: int = 1
+    minimum_size: int = 1
+
+
+def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]:
+    """Divide total space to satisfy size, ratio, and minimum_size, constraints.
+
+    The returned list of integers should add up to total in most cases, unless it is
+    impossible to satisfy all the constraints. For instance, if there are two edges
+    with a minimum size of 20 each and `total` is 30 then the returned list will be
+    greater than total. In practice, this would mean that a Layout object would
+    clip the rows that would overflow the screen height.
+
+    Args:
+        total (int): Total number of characters.
+        edges (List[Edge]): Edges within total space.
+
+    Returns:
+        List[int]: Number of characters for each edge.
+    """
+    # Size of edge or None for yet to be determined
+    sizes = [(edge.size or None) for edge in edges]
+
+    _Fraction = Fraction
+
+    # While any edges haven't been calculated
+    while None in sizes:
+        # Get flexible edges and index to map these back on to sizes list
+        flexible_edges = [
+            (index, edge)
+            for index, (size, edge) in enumerate(zip(sizes, edges))
+            if size is None
+        ]
+        # Remaining space in total
+        remaining = total - sum(size or 0 for size in sizes)
+        if remaining <= 0:
+            # No room for flexible edges
+            return [
+                ((edge.minimum_size or 1) if size is None else size)
+                for size, edge in zip(sizes, edges)
+            ]
+        # Calculate number of characters in a ratio portion
+        portion = _Fraction(
+            remaining, sum((edge.ratio or 1) for _, edge in flexible_edges)
+        )
+
+        # If any edges will be less than their minimum, replace size with the minimum
+        for index, edge in flexible_edges:
+            if portion * edge.ratio <= edge.minimum_size:
+                sizes[index] = edge.minimum_size
+                # New fixed size will invalidate calculations, so we need to repeat the process
+                break
+        else:
+            # Distribute flexible space and compensate for rounding error
+            # Since edge sizes can only be integers we need to add the remainder
+            # to the following line
+            remainder = _Fraction(0)
+            for index, edge in flexible_edges:
+                size, remainder = divmod(portion * edge.ratio + remainder, 1)
+                sizes[index] = size
+            break
+    # Sizes now contains integers only
+    return cast(List[int], sizes)
+
+
+def ratio_reduce(
+    total: int, ratios: List[int], maximums: List[int], values: List[int]
+) -> List[int]:
+    """Divide an integer total in to parts based on ratios.
+
+    Args:
+        total (int): The total to divide.
+        ratios (List[int]): A list of integer ratios.
+        maximums (List[int]): List of maximums values for each slot.
+        values (List[int]): List of values
+
+    Returns:
+        List[int]: A list of integers guaranteed to sum to total.
+    """
+    ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)]
+    total_ratio = sum(ratios)
+    if not total_ratio:
+        return values[:]
+    total_remaining = total
+    result: List[int] = []
+    append = result.append
+    for ratio, maximum, value in zip(ratios, maximums, values):
+        if ratio and total_ratio > 0:
+            distributed = min(maximum, round(ratio * total_remaining / total_ratio))
+            append(value - distributed)
+            total_remaining -= distributed
+            total_ratio -= ratio
+        else:
+            append(value)
+    return result
+
+
+def ratio_distribute(
+    total: int, ratios: List[int], minimums: Optional[List[int]] = None
+) -> List[int]:
+    """Distribute an integer total in to parts based on ratios.
+
+    Args:
+        total (int): The total to divide.
+        ratios (List[int]): A list of integer ratios.
+        minimums (List[int]): List of minimum values for each slot.
+
+    Returns:
+        List[int]: A list of integers guaranteed to sum to total.
+    """
+    if minimums:
+        ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)]
+    total_ratio = sum(ratios)
+    assert total_ratio > 0, "Sum of ratios must be > 0"
+
+    total_remaining = total
+    distributed_total: List[int] = []
+    append = distributed_total.append
+    if minimums is None:
+        _minimums = [0] * len(ratios)
+    else:
+        _minimums = minimums
+    for ratio, minimum in zip(ratios, _minimums):
+        if total_ratio > 0:
+            distributed = max(minimum, ceil(ratio * total_remaining / total_ratio))
+        else:
+            distributed = total_remaining
+        append(distributed)
+        total_ratio -= ratio
+        total_remaining -= distributed
+    return distributed_total
+
+
+if __name__ == "__main__":
+    from dataclasses import dataclass
+
+    @dataclass
+    class E:
+        size: Optional[int] = None
+        ratio: int = 1
+        minimum_size: int = 1
+
+    resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)])
+    print(sum(resolved))
diff --git a/.venv/Lib/site-packages/rich/_spinners.py b/.venv/Lib/site-packages/rich/_spinners.py
new file mode 100644 (file)
index 0000000..d0bb1fe
--- /dev/null
@@ -0,0 +1,482 @@
+"""
+Spinners are from:
+* cli-spinners:
+    MIT License
+    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to deal
+    in the Software without restriction, including without limitation the rights to
+    use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+    the Software, and to permit persons to whom the Software is furnished to do so,
+    subject to the following conditions:
+    The above copyright notice and this permission notice shall be included
+    in all copies or substantial portions of the Software.
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+    FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+    ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+    IN THE SOFTWARE.
+"""
+
+SPINNERS = {
+    "dots": {
+        "interval": 80,
+        "frames": "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏",
+    },
+    "dots2": {"interval": 80, "frames": "⣾⣽⣻⢿⡿⣟⣯⣷"},
+    "dots3": {
+        "interval": 80,
+        "frames": "⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓",
+    },
+    "dots4": {
+        "interval": 80,
+        "frames": "⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆",
+    },
+    "dots5": {
+        "interval": 80,
+        "frames": "⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋",
+    },
+    "dots6": {
+        "interval": 80,
+        "frames": "⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁",
+    },
+    "dots7": {
+        "interval": 80,
+        "frames": "⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈",
+    },
+    "dots8": {
+        "interval": 80,
+        "frames": "⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈",
+    },
+    "dots9": {"interval": 80, "frames": "⢹⢺⢼⣸⣇⡧⡗⡏"},
+    "dots10": {"interval": 80, "frames": "⢄⢂⢁⡁⡈⡐⡠"},
+    "dots11": {"interval": 100, "frames": "⠁⠂⠄⡀⢀⠠⠐⠈"},
+    "dots12": {
+        "interval": 80,
+        "frames": [
+            "⢀⠀",
+            "⡀⠀",
+            "⠄⠀",
+            "⢂⠀",
+            "⡂⠀",
+            "⠅⠀",
+            "⢃⠀",
+            "⡃⠀",
+            "⠍⠀",
+            "⢋⠀",
+            "⡋⠀",
+            "⠍⠁",
+            "⢋⠁",
+            "⡋⠁",
+            "⠍⠉",
+            "⠋⠉",
+            "⠋⠉",
+            "⠉⠙",
+            "⠉⠙",
+            "⠉⠩",
+            "⠈⢙",
+            "⠈⡙",
+            "⢈⠩",
+            "⡀⢙",
+            "⠄⡙",
+            "⢂⠩",
+            "⡂⢘",
+            "⠅⡘",
+            "⢃⠨",
+            "⡃⢐",
+            "⠍⡐",
+            "⢋⠠",
+            "⡋⢀",
+            "⠍⡁",
+            "⢋⠁",
+            "⡋⠁",
+            "⠍⠉",
+            "⠋⠉",
+            "⠋⠉",
+            "⠉⠙",
+            "⠉⠙",
+            "⠉⠩",
+            "⠈⢙",
+            "⠈⡙",
+            "⠈⠩",
+            "⠀⢙",
+            "⠀⡙",
+            "⠀⠩",
+            "⠀⢘",
+            "⠀⡘",
+            "⠀⠨",
+            "⠀⢐",
+            "⠀⡐",
+            "⠀⠠",
+            "⠀⢀",
+            "⠀⡀",
+        ],
+    },
+    "dots8Bit": {
+        "interval": 80,
+        "frames": "⠀⠁⠂⠃⠄⠅⠆⠇⡀⡁⡂⡃⡄⡅⡆⡇⠈⠉⠊⠋⠌⠍⠎⠏⡈⡉⡊⡋⡌⡍⡎⡏⠐⠑⠒⠓⠔⠕⠖⠗⡐⡑⡒⡓⡔⡕⡖⡗⠘⠙⠚⠛⠜⠝⠞⠟⡘⡙"
+        "⡚⡛⡜⡝⡞⡟⠠⠡⠢⠣⠤⠥⠦⠧⡠⡡⡢⡣⡤⡥⡦⡧⠨⠩⠪⠫⠬⠭⠮⠯⡨⡩⡪⡫⡬⡭⡮⡯⠰⠱⠲⠳⠴⠵⠶⠷⡰⡱⡲⡳⡴⡵⡶⡷⠸⠹⠺⠻"
+        "⠼⠽⠾⠿⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⣀⣁⣂⣃⣄⣅⣆⣇⢈⢉⢊⢋⢌⢍⢎⢏⣈⣉⣊⣋⣌⣍⣎⣏⢐⢑⢒⢓⢔⢕⢖⢗⣐⣑⣒⣓⣔⣕"
+        "⣖⣗⢘⢙⢚⢛⢜⢝⢞⢟⣘⣙⣚⣛⣜⣝⣞⣟⢠⢡⢢⢣⢤⢥⢦⢧⣠⣡⣢⣣⣤⣥⣦⣧⢨⢩⢪⢫⢬⢭⢮⢯⣨⣩⣪⣫⣬⣭⣮⣯⢰⢱⢲⢳⢴⢵⢶⢷"
+        "⣰⣱⣲⣳⣴⣵⣶⣷⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿",
+    },
+    "line": {"interval": 130, "frames": ["-", "\\", "|", "/"]},
+    "line2": {"interval": 100, "frames": "⠂-–—–-"},
+    "pipe": {"interval": 100, "frames": "┤┘┴└├┌┬┐"},
+    "simpleDots": {"interval": 400, "frames": [".  ", ".. ", "...", "   "]},
+    "simpleDotsScrolling": {
+        "interval": 200,
+        "frames": [".  ", ".. ", "...", " ..", "  .", "   "],
+    },
+    "star": {"interval": 70, "frames": "✶✸✹✺✹✷"},
+    "star2": {"interval": 80, "frames": "+x*"},
+    "flip": {
+        "interval": 70,
+        "frames": "___-``'´-___",
+    },
+    "hamburger": {"interval": 100, "frames": "☱☲☴"},
+    "growVertical": {
+        "interval": 120,
+        "frames": "▁▃▄▅▆▇▆▅▄▃",
+    },
+    "growHorizontal": {
+        "interval": 120,
+        "frames": "▏▎▍▌▋▊▉▊▋▌▍▎",
+    },
+    "balloon": {"interval": 140, "frames": " .oO@* "},
+    "balloon2": {"interval": 120, "frames": ".oO°Oo."},
+    "noise": {"interval": 100, "frames": "▓▒░"},
+    "bounce": {"interval": 120, "frames": "⠁⠂⠄⠂"},
+    "boxBounce": {"interval": 120, "frames": "▖▘▝▗"},
+    "boxBounce2": {"interval": 100, "frames": "▌▀▐▄"},
+    "triangle": {"interval": 50, "frames": "◢◣◤◥"},
+    "arc": {"interval": 100, "frames": "◜◠◝◞◡◟"},
+    "circle": {"interval": 120, "frames": "◡⊙◠"},
+    "squareCorners": {"interval": 180, "frames": "◰◳◲◱"},
+    "circleQuarters": {"interval": 120, "frames": "◴◷◶◵"},
+    "circleHalves": {"interval": 50, "frames": "◐◓◑◒"},
+    "squish": {"interval": 100, "frames": "╫╪"},
+    "toggle": {"interval": 250, "frames": "⊶⊷"},
+    "toggle2": {"interval": 80, "frames": "▫▪"},
+    "toggle3": {"interval": 120, "frames": "□■"},
+    "toggle4": {"interval": 100, "frames": "■□▪▫"},
+    "toggle5": {"interval": 100, "frames": "▮▯"},
+    "toggle6": {"interval": 300, "frames": "ဝ၀"},
+    "toggle7": {"interval": 80, "frames": "⦾⦿"},
+    "toggle8": {"interval": 100, "frames": "◍◌"},
+    "toggle9": {"interval": 100, "frames": "◉◎"},
+    "toggle10": {"interval": 100, "frames": "㊂㊀㊁"},
+    "toggle11": {"interval": 50, "frames": "⧇⧆"},
+    "toggle12": {"interval": 120, "frames": "☗☖"},
+    "toggle13": {"interval": 80, "frames": "=*-"},
+    "arrow": {"interval": 100, "frames": "←↖↑↗→↘↓↙"},
+    "arrow2": {
+        "interval": 80,
+        "frames": ["⬆️ ", "↗️ ", "➡️ ", "↘️ ", "⬇️ ", "↙️ ", "⬅️ ", "↖️ "],
+    },
+    "arrow3": {
+        "interval": 120,
+        "frames": ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"],
+    },
+    "bouncingBar": {
+        "interval": 80,
+        "frames": [
+            "[    ]",
+            "[=   ]",
+            "[==  ]",
+            "[=== ]",
+            "[ ===]",
+            "[  ==]",
+            "[   =]",
+            "[    ]",
+            "[   =]",
+            "[  ==]",
+            "[ ===]",
+            "[====]",
+            "[=== ]",
+            "[==  ]",
+            "[=   ]",
+        ],
+    },
+    "bouncingBall": {
+        "interval": 80,
+        "frames": [
+            "( ●    )",
+            "(  ●   )",
+            "(   ●  )",
+            "(    ● )",
+            "(     ●)",
+            "(    ● )",
+            "(   ●  )",
+            "(  ●   )",
+            "( ●    )",
+            "(●     )",
+        ],
+    },
+    "smiley": {"interval": 200, "frames": ["😄 ", "😝 "]},
+    "monkey": {"interval": 300, "frames": ["🙈 ", "🙈 ", "🙉 ", "🙊 "]},
+    "hearts": {"interval": 100, "frames": ["💛 ", "💙 ", "💜 ", "💚 ", "❤️ "]},
+    "clock": {
+        "interval": 100,
+        "frames": [
+            "🕛 ",
+            "🕐 ",
+            "🕑 ",
+            "🕒 ",
+            "🕓 ",
+            "🕔 ",
+            "🕕 ",
+            "🕖 ",
+            "🕗 ",
+            "🕘 ",
+            "🕙 ",
+            "🕚 ",
+        ],
+    },
+    "earth": {"interval": 180, "frames": ["🌍 ", "🌎 ", "🌏 "]},
+    "material": {
+        "interval": 17,
+        "frames": [
+            "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
+            "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
+            "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
+            "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
+            "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
+            "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
+            "███████▁▁▁▁▁▁▁▁▁▁▁▁▁",
+            "████████▁▁▁▁▁▁▁▁▁▁▁▁",
+            "█████████▁▁▁▁▁▁▁▁▁▁▁",
+            "█████████▁▁▁▁▁▁▁▁▁▁▁",
+            "██████████▁▁▁▁▁▁▁▁▁▁",
+            "███████████▁▁▁▁▁▁▁▁▁",
+            "█████████████▁▁▁▁▁▁▁",
+            "██████████████▁▁▁▁▁▁",
+            "██████████████▁▁▁▁▁▁",
+            "▁██████████████▁▁▁▁▁",
+            "▁██████████████▁▁▁▁▁",
+            "▁██████████████▁▁▁▁▁",
+            "▁▁██████████████▁▁▁▁",
+            "▁▁▁██████████████▁▁▁",
+            "▁▁▁▁█████████████▁▁▁",
+            "▁▁▁▁██████████████▁▁",
+            "▁▁▁▁██████████████▁▁",
+            "▁▁▁▁▁██████████████▁",
+            "▁▁▁▁▁██████████████▁",
+            "▁▁▁▁▁██████████████▁",
+            "▁▁▁▁▁▁██████████████",
+            "▁▁▁▁▁▁██████████████",
+            "▁▁▁▁▁▁▁█████████████",
+            "▁▁▁▁▁▁▁█████████████",
+            "▁▁▁▁▁▁▁▁████████████",
+            "▁▁▁▁▁▁▁▁████████████",
+            "▁▁▁▁▁▁▁▁▁███████████",
+            "▁▁▁▁▁▁▁▁▁███████████",
+            "▁▁▁▁▁▁▁▁▁▁██████████",
+            "▁▁▁▁▁▁▁▁▁▁██████████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁████████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁███████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████",
+            "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
+            "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
+            "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
+            "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
+            "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██",
+            "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
+            "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
+            "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█",
+            "████████▁▁▁▁▁▁▁▁▁▁▁▁",
+            "█████████▁▁▁▁▁▁▁▁▁▁▁",
+            "█████████▁▁▁▁▁▁▁▁▁▁▁",
+            "█████████▁▁▁▁▁▁▁▁▁▁▁",
+            "█████████▁▁▁▁▁▁▁▁▁▁▁",
+            "███████████▁▁▁▁▁▁▁▁▁",
+            "████████████▁▁▁▁▁▁▁▁",
+            "████████████▁▁▁▁▁▁▁▁",
+            "██████████████▁▁▁▁▁▁",
+            "██████████████▁▁▁▁▁▁",
+            "▁██████████████▁▁▁▁▁",
+            "▁██████████████▁▁▁▁▁",
+            "▁▁▁█████████████▁▁▁▁",
+            "▁▁▁▁▁████████████▁▁▁",
+            "▁▁▁▁▁████████████▁▁▁",
+            "▁▁▁▁▁▁███████████▁▁▁",
+            "▁▁▁▁▁▁▁▁█████████▁▁▁",
+            "▁▁▁▁▁▁▁▁█████████▁▁▁",
+            "▁▁▁▁▁▁▁▁▁█████████▁▁",
+            "▁▁▁▁▁▁▁▁▁█████████▁▁",
+            "▁▁▁▁▁▁▁▁▁▁█████████▁",
+            "▁▁▁▁▁▁▁▁▁▁▁████████▁",
+            "▁▁▁▁▁▁▁▁▁▁▁████████▁",
+            "▁▁▁▁▁▁▁▁▁▁▁▁███████▁",
+            "▁▁▁▁▁▁▁▁▁▁▁▁███████▁",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁███████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁███████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
+            "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
+        ],
+    },
+    "moon": {
+        "interval": 80,
+        "frames": ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "],
+    },
+    "runner": {"interval": 140, "frames": ["🚶 ", "🏃 "]},
+    "pong": {
+        "interval": 80,
+        "frames": [
+            "▐⠂       ▌",
+            "▐⠈       ▌",
+            "▐ ⠂      ▌",
+            "▐ ⠠      ▌",
+            "▐  ⡀     ▌",
+            "▐  ⠠     ▌",
+            "▐   ⠂    ▌",
+            "▐   ⠈    ▌",
+            "▐    ⠂   ▌",
+            "▐    ⠠   ▌",
+            "▐     ⡀  ▌",
+            "▐     ⠠  ▌",
+            "▐      ⠂ ▌",
+            "▐      ⠈ ▌",
+            "▐       ⠂▌",
+            "▐       ⠠▌",
+            "▐       ⡀▌",
+            "▐      ⠠ ▌",
+            "▐      ⠂ ▌",
+            "▐     ⠈  ▌",
+            "▐     ⠂  ▌",
+            "▐    ⠠   ▌",
+            "▐    ⡀   ▌",
+            "▐   ⠠    ▌",
+            "▐   ⠂    ▌",
+            "▐  ⠈     ▌",
+            "▐  ⠂     ▌",
+            "▐ ⠠      ▌",
+            "▐ ⡀      ▌",
+            "▐⠠       ▌",
+        ],
+    },
+    "shark": {
+        "interval": 120,
+        "frames": [
+            "▐|\\____________▌",
+            "▐_|\\___________▌",
+            "▐__|\\__________▌",
+            "▐___|\\_________▌",
+            "▐____|\\________▌",
+            "▐_____|\\_______▌",
+            "▐______|\\______▌",
+            "▐_______|\\_____▌",
+            "▐________|\\____▌",
+            "▐_________|\\___▌",
+            "▐__________|\\__▌",
+            "▐___________|\\_▌",
+            "▐____________|\\▌",
+            "▐____________/|▌",
+            "▐___________/|_▌",
+            "▐__________/|__▌",
+            "▐_________/|___▌",
+            "▐________/|____▌",
+            "▐_______/|_____▌",
+            "▐______/|______▌",
+            "▐_____/|_______▌",
+            "▐____/|________▌",
+            "▐___/|_________▌",
+            "▐__/|__________▌",
+            "▐_/|___________▌",
+            "▐/|____________▌",
+        ],
+    },
+    "dqpb": {"interval": 100, "frames": "dqpb"},
+    "weather": {
+        "interval": 100,
+        "frames": [
+            "☀️ ",
+            "☀️ ",
+            "☀️ ",
+            "🌤 ",
+            "⛅️ ",
+            "🌥 ",
+            "☁️ ",
+            "🌧 ",
+            "🌨 ",
+            "🌧 ",
+            "🌨 ",
+            "🌧 ",
+            "🌨 ",
+            "⛈ ",
+            "🌨 ",
+            "🌧 ",
+            "🌨 ",
+            "☁️ ",
+            "🌥 ",
+            "⛅️ ",
+            "🌤 ",
+            "☀️ ",
+            "☀️ ",
+        ],
+    },
+    "christmas": {"interval": 400, "frames": "🌲🎄"},
+    "grenade": {
+        "interval": 80,
+        "frames": [
+            "،   ",
+            "′   ",
+            " ´ ",
+            " ‾ ",
+            "  ⸌",
+            "  ⸊",
+            "  |",
+            "  ⁎",
+            "  ⁕",
+            " ෴ ",
+            "  ⁓",
+            "   ",
+            "   ",
+            "   ",
+        ],
+    },
+    "point": {"interval": 125, "frames": ["∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"]},
+    "layer": {"interval": 150, "frames": "-=≡"},
+    "betaWave": {
+        "interval": 80,
+        "frames": [
+            "ρββββββ",
+            "βρβββββ",
+            "ββρββββ",
+            "βββρβββ",
+            "ββββρββ",
+            "βββββρβ",
+            "ββββββρ",
+        ],
+    },
+    "aesthetic": {
+        "interval": 80,
+        "frames": [
+            "▰▱▱▱▱▱▱",
+            "▰▰▱▱▱▱▱",
+            "▰▰▰▱▱▱▱",
+            "▰▰▰▰▱▱▱",
+            "▰▰▰▰▰▱▱",
+            "▰▰▰▰▰▰▱",
+            "▰▰▰▰▰▰▰",
+            "▰▱▱▱▱▱▱",
+        ],
+    },
+}
diff --git a/.venv/Lib/site-packages/rich/_stack.py b/.venv/Lib/site-packages/rich/_stack.py
new file mode 100644 (file)
index 0000000..194564e
--- /dev/null
@@ -0,0 +1,16 @@
+from typing import List, TypeVar
+
+T = TypeVar("T")
+
+
+class Stack(List[T]):
+    """A small shim over builtin list."""
+
+    @property
+    def top(self) -> T:
+        """Get top of stack."""
+        return self[-1]
+
+    def push(self, item: T) -> None:
+        """Push an item on to the stack (append in stack nomenclature)."""
+        self.append(item)
diff --git a/.venv/Lib/site-packages/rich/_timer.py b/.venv/Lib/site-packages/rich/_timer.py
new file mode 100644 (file)
index 0000000..a2ca6be
--- /dev/null
@@ -0,0 +1,19 @@
+"""
+Timer context manager, only used in debug.
+
+"""
+
+from time import time
+
+import contextlib
+from typing import Generator
+
+
+@contextlib.contextmanager
+def timer(subject: str = "time") -> Generator[None, None, None]:
+    """print the elapsed time. (only used in debugging)"""
+    start = time()
+    yield
+    elapsed = time() - start
+    elapsed_ms = elapsed * 1000
+    print(f"{subject} elapsed {elapsed_ms:.1f}ms")
diff --git a/.venv/Lib/site-packages/rich/_win32_console.py b/.venv/Lib/site-packages/rich/_win32_console.py
new file mode 100644 (file)
index 0000000..371ec09
--- /dev/null
@@ -0,0 +1,661 @@
+"""Light wrapper around the Win32 Console API - this module should only be imported on Windows
+
+The API that this module wraps is documented at https://docs.microsoft.com/en-us/windows/console/console-functions
+"""
+
+import ctypes
+import sys
+from typing import Any
+
+windll: Any = None
+if sys.platform == "win32":
+    windll = ctypes.LibraryLoader(ctypes.WinDLL)
+else:
+    raise ImportError(f"{__name__} can only be imported on Windows")
+
+import time
+from ctypes import Structure, byref, wintypes
+from typing import IO, NamedTuple, Type, cast
+
+from rich.color import ColorSystem
+from rich.style import Style
+
+STDOUT = -11
+ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4
+
+COORD = wintypes._COORD
+
+
+class LegacyWindowsError(Exception):
+    pass
+
+
+class WindowsCoordinates(NamedTuple):
+    """Coordinates in the Windows Console API are (y, x), not (x, y).
+    This class is intended to prevent that confusion.
+    Rows and columns are indexed from 0.
+    This class can be used in place of wintypes._COORD in arguments and argtypes.
+    """
+
+    row: int
+    col: int
+
+    @classmethod
+    def from_param(cls, value: "WindowsCoordinates") -> COORD:
+        """Converts a WindowsCoordinates into a wintypes _COORD structure.
+        This classmethod is internally called by ctypes to perform the conversion.
+
+        Args:
+            value (WindowsCoordinates): The input coordinates to convert.
+
+        Returns:
+            wintypes._COORD: The converted coordinates struct.
+        """
+        return COORD(value.col, value.row)
+
+
+class CONSOLE_SCREEN_BUFFER_INFO(Structure):
+    _fields_ = [
+        ("dwSize", COORD),
+        ("dwCursorPosition", COORD),
+        ("wAttributes", wintypes.WORD),
+        ("srWindow", wintypes.SMALL_RECT),
+        ("dwMaximumWindowSize", COORD),
+    ]
+
+
+class CONSOLE_CURSOR_INFO(ctypes.Structure):
+    _fields_ = [("dwSize", wintypes.DWORD), ("bVisible", wintypes.BOOL)]
+
+
+_GetStdHandle = windll.kernel32.GetStdHandle
+_GetStdHandle.argtypes = [
+    wintypes.DWORD,
+]
+_GetStdHandle.restype = wintypes.HANDLE
+
+
+def GetStdHandle(handle: int = STDOUT) -> wintypes.HANDLE:
+    """Retrieves a handle to the specified standard device (standard input, standard output, or standard error).
+
+    Args:
+        handle (int): Integer identifier for the handle. Defaults to -11 (stdout).
+
+    Returns:
+        wintypes.HANDLE: The handle
+    """
+    return cast(wintypes.HANDLE, _GetStdHandle(handle))
+
+
+_GetConsoleMode = windll.kernel32.GetConsoleMode
+_GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD]
+_GetConsoleMode.restype = wintypes.BOOL
+
+
+def GetConsoleMode(std_handle: wintypes.HANDLE) -> int:
+    """Retrieves the current input mode of a console's input buffer
+    or the current output mode of a console screen buffer.
+
+    Args:
+        std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer.
+
+    Raises:
+        LegacyWindowsError: If any error occurs while calling the Windows console API.
+
+    Returns:
+        int: Value representing the current console mode as documented at
+            https://docs.microsoft.com/en-us/windows/console/getconsolemode#parameters
+    """
+
+    console_mode = wintypes.DWORD()
+    success = bool(_GetConsoleMode(std_handle, console_mode))
+    if not success:
+        raise LegacyWindowsError("Unable to get legacy Windows Console Mode")
+    return console_mode.value
+
+
+_FillConsoleOutputCharacterW = windll.kernel32.FillConsoleOutputCharacterW
+_FillConsoleOutputCharacterW.argtypes = [
+    wintypes.HANDLE,
+    ctypes.c_char,
+    wintypes.DWORD,
+    cast(Type[COORD], WindowsCoordinates),
+    ctypes.POINTER(wintypes.DWORD),
+]
+_FillConsoleOutputCharacterW.restype = wintypes.BOOL
+
+
+def FillConsoleOutputCharacter(
+    std_handle: wintypes.HANDLE,
+    char: str,
+    length: int,
+    start: WindowsCoordinates,
+) -> int:
+    """Writes a character to the console screen buffer a specified number of times, beginning at the specified coordinates.
+
+    Args:
+        std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer.
+        char (str): The character to write. Must be a string of length 1.
+        length (int): The number of times to write the character.
+        start (WindowsCoordinates): The coordinates to start writing at.
+
+    Returns:
+        int: The number of characters written.
+    """
+    character = ctypes.c_char(char.encode())
+    num_characters = wintypes.DWORD(length)
+    num_written = wintypes.DWORD(0)
+    _FillConsoleOutputCharacterW(
+        std_handle,
+        character,
+        num_characters,
+        start,
+        byref(num_written),
+    )
+    return num_written.value
+
+
+_FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute
+_FillConsoleOutputAttribute.argtypes = [
+    wintypes.HANDLE,
+    wintypes.WORD,
+    wintypes.DWORD,
+    cast(Type[COORD], WindowsCoordinates),
+    ctypes.POINTER(wintypes.DWORD),
+]
+_FillConsoleOutputAttribute.restype = wintypes.BOOL
+
+
+def FillConsoleOutputAttribute(
+    std_handle: wintypes.HANDLE,
+    attributes: int,
+    length: int,
+    start: WindowsCoordinates,
+) -> int:
+    """Sets the character attributes for a specified number of character cells,
+    beginning at the specified coordinates in a screen buffer.
+
+    Args:
+        std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer.
+        attributes (int): Integer value representing the foreground and background colours of the cells.
+        length (int): The number of cells to set the output attribute of.
+        start (WindowsCoordinates): The coordinates of the first cell whose attributes are to be set.
+
+    Returns:
+        int: The number of cells whose attributes were actually set.
+    """
+    num_cells = wintypes.DWORD(length)
+    style_attrs = wintypes.WORD(attributes)
+    num_written = wintypes.DWORD(0)
+    _FillConsoleOutputAttribute(
+        std_handle, style_attrs, num_cells, start, byref(num_written)
+    )
+    return num_written.value
+
+
+_SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute
+_SetConsoleTextAttribute.argtypes = [
+    wintypes.HANDLE,
+    wintypes.WORD,
+]
+_SetConsoleTextAttribute.restype = wintypes.BOOL
+
+
+def SetConsoleTextAttribute(
+    std_handle: wintypes.HANDLE, attributes: wintypes.WORD
+) -> bool:
+    """Set the colour attributes for all text written after this function is called.
+
+    Args:
+        std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer.
+        attributes (int): Integer value representing the foreground and background colours.
+
+
+    Returns:
+        bool: True if the attribute was set successfully, otherwise False.
+    """
+    return bool(_SetConsoleTextAttribute(std_handle, attributes))
+
+
+_GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo
+_GetConsoleScreenBufferInfo.argtypes = [
+    wintypes.HANDLE,
+    ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO),
+]
+_GetConsoleScreenBufferInfo.restype = wintypes.BOOL
+
+
+def GetConsoleScreenBufferInfo(
+    std_handle: wintypes.HANDLE,
+) -> CONSOLE_SCREEN_BUFFER_INFO:
+    """Retrieves information about the specified console screen buffer.
+
+    Args:
+        std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer.
+
+    Returns:
+        CONSOLE_SCREEN_BUFFER_INFO: A CONSOLE_SCREEN_BUFFER_INFO ctype struct contain information about
+            screen size, cursor position, colour attributes, and more."""
+    console_screen_buffer_info = CONSOLE_SCREEN_BUFFER_INFO()
+    _GetConsoleScreenBufferInfo(std_handle, byref(console_screen_buffer_info))
+    return console_screen_buffer_info
+
+
+_SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition
+_SetConsoleCursorPosition.argtypes = [
+    wintypes.HANDLE,
+    cast(Type[COORD], WindowsCoordinates),
+]
+_SetConsoleCursorPosition.restype = wintypes.BOOL
+
+
+def SetConsoleCursorPosition(
+    std_handle: wintypes.HANDLE, coords: WindowsCoordinates
+) -> bool:
+    """Set the position of the cursor in the console screen
+
+    Args:
+        std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer.
+        coords (WindowsCoordinates): The coordinates to move the cursor to.
+
+    Returns:
+        bool: True if the function succeeds, otherwise False.
+    """
+    return bool(_SetConsoleCursorPosition(std_handle, coords))
+
+
+_GetConsoleCursorInfo = windll.kernel32.GetConsoleCursorInfo
+_GetConsoleCursorInfo.argtypes = [
+    wintypes.HANDLE,
+    ctypes.POINTER(CONSOLE_CURSOR_INFO),
+]
+_GetConsoleCursorInfo.restype = wintypes.BOOL
+
+
+def GetConsoleCursorInfo(
+    std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO
+) -> bool:
+    """Get the cursor info - used to get cursor visibility and width
+
+    Args:
+        std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer.
+        cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct that receives information
+            about the console's cursor.
+
+    Returns:
+          bool: True if the function succeeds, otherwise False.
+    """
+    return bool(_GetConsoleCursorInfo(std_handle, byref(cursor_info)))
+
+
+_SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo
+_SetConsoleCursorInfo.argtypes = [
+    wintypes.HANDLE,
+    ctypes.POINTER(CONSOLE_CURSOR_INFO),
+]
+_SetConsoleCursorInfo.restype = wintypes.BOOL
+
+
+def SetConsoleCursorInfo(
+    std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO
+) -> bool:
+    """Set the cursor info - used for adjusting cursor visibility and width
+
+    Args:
+        std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer.
+        cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct containing the new cursor info.
+
+    Returns:
+          bool: True if the function succeeds, otherwise False.
+    """
+    return bool(_SetConsoleCursorInfo(std_handle, byref(cursor_info)))
+
+
+_SetConsoleTitle = windll.kernel32.SetConsoleTitleW
+_SetConsoleTitle.argtypes = [wintypes.LPCWSTR]
+_SetConsoleTitle.restype = wintypes.BOOL
+
+
+def SetConsoleTitle(title: str) -> bool:
+    """Sets the title of the current console window
+
+    Args:
+        title (str): The new title of the console window.
+
+    Returns:
+        bool: True if the function succeeds, otherwise False.
+    """
+    return bool(_SetConsoleTitle(title))
+
+
+class LegacyWindowsTerm:
+    """This class allows interaction with the legacy Windows Console API. It should only be used in the context
+    of environments where virtual terminal processing is not available. However, if it is used in a Windows environment,
+    the entire API should work.
+
+    Args:
+        file (IO[str]): The file which the Windows Console API HANDLE is retrieved from, defaults to sys.stdout.
+    """
+
+    BRIGHT_BIT = 8
+
+    # Indices are ANSI color numbers, values are the corresponding Windows Console API color numbers
+    ANSI_TO_WINDOWS = [
+        0,  # black                      The Windows colours are defined in wincon.h as follows:
+        4,  # red                         define FOREGROUND_BLUE            0x0001 -- 0000 0001
+        2,  # green                       define FOREGROUND_GREEN           0x0002 -- 0000 0010
+        6,  # yellow                      define FOREGROUND_RED             0x0004 -- 0000 0100
+        1,  # blue                        define FOREGROUND_INTENSITY       0x0008 -- 0000 1000
+        5,  # magenta                     define BACKGROUND_BLUE            0x0010 -- 0001 0000
+        3,  # cyan                        define BACKGROUND_GREEN           0x0020 -- 0010 0000
+        7,  # white                       define BACKGROUND_RED             0x0040 -- 0100 0000
+        8,  # bright black (grey)         define BACKGROUND_INTENSITY       0x0080 -- 1000 0000
+        12,  # bright red
+        10,  # bright green
+        14,  # bright yellow
+        9,  # bright blue
+        13,  # bright magenta
+        11,  # bright cyan
+        15,  # bright white
+    ]
+
+    def __init__(self, file: "IO[str]") -> None:
+        handle = GetStdHandle(STDOUT)
+        self._handle = handle
+        default_text = GetConsoleScreenBufferInfo(handle).wAttributes
+        self._default_text = default_text
+
+        self._default_fore = default_text & 7
+        self._default_back = (default_text >> 4) & 7
+        self._default_attrs = self._default_fore | (self._default_back << 4)
+
+        self._file = file
+        self.write = file.write
+        self.flush = file.flush
+
+    @property
+    def cursor_position(self) -> WindowsCoordinates:
+        """Returns the current position of the cursor (0-based)
+
+        Returns:
+            WindowsCoordinates: The current cursor position.
+        """
+        coord: COORD = GetConsoleScreenBufferInfo(self._handle).dwCursorPosition
+        return WindowsCoordinates(row=coord.Y, col=coord.X)
+
+    @property
+    def screen_size(self) -> WindowsCoordinates:
+        """Returns the current size of the console screen buffer, in character columns and rows
+
+        Returns:
+            WindowsCoordinates: The width and height of the screen as WindowsCoordinates.
+        """
+        screen_size: COORD = GetConsoleScreenBufferInfo(self._handle).dwSize
+        return WindowsCoordinates(row=screen_size.Y, col=screen_size.X)
+
+    def write_text(self, text: str) -> None:
+        """Write text directly to the terminal without any modification of styles
+
+        Args:
+            text (str): The text to write to the console
+        """
+        self.write(text)
+        self.flush()
+
+    def write_styled(self, text: str, style: Style) -> None:
+        """Write styled text to the terminal.
+
+        Args:
+            text (str): The text to write
+            style (Style): The style of the text
+        """
+        color = style.color
+        bgcolor = style.bgcolor
+        if style.reverse:
+            color, bgcolor = bgcolor, color
+
+        if color:
+            fore = color.downgrade(ColorSystem.WINDOWS).number
+            fore = fore if fore is not None else 7  # Default to ANSI 7: White
+            if style.bold:
+                fore = fore | self.BRIGHT_BIT
+            if style.dim:
+                fore = fore & ~self.BRIGHT_BIT
+            fore = self.ANSI_TO_WINDOWS[fore]
+        else:
+            fore = self._default_fore
+
+        if bgcolor:
+            back = bgcolor.downgrade(ColorSystem.WINDOWS).number
+            back = back if back is not None else 0  # Default to ANSI 0: Black
+            back = self.ANSI_TO_WINDOWS[back]
+        else:
+            back = self._default_back
+
+        assert fore is not None
+        assert back is not None
+
+        SetConsoleTextAttribute(
+            self._handle, attributes=ctypes.c_ushort(fore | (back << 4))
+        )
+        self.write_text(text)
+        SetConsoleTextAttribute(self._handle, attributes=self._default_text)
+
+    def move_cursor_to(self, new_position: WindowsCoordinates) -> None:
+        """Set the position of the cursor
+
+        Args:
+            new_position (WindowsCoordinates): The WindowsCoordinates representing the new position of the cursor.
+        """
+        if new_position.col < 0 or new_position.row < 0:
+            return
+        SetConsoleCursorPosition(self._handle, coords=new_position)
+
+    def erase_line(self) -> None:
+        """Erase all content on the line the cursor is currently located at"""
+        screen_size = self.screen_size
+        cursor_position = self.cursor_position
+        cells_to_erase = screen_size.col
+        start_coordinates = WindowsCoordinates(row=cursor_position.row, col=0)
+        FillConsoleOutputCharacter(
+            self._handle, " ", length=cells_to_erase, start=start_coordinates
+        )
+        FillConsoleOutputAttribute(
+            self._handle,
+            self._default_attrs,
+            length=cells_to_erase,
+            start=start_coordinates,
+        )
+
+    def erase_end_of_line(self) -> None:
+        """Erase all content from the cursor position to the end of that line"""
+        cursor_position = self.cursor_position
+        cells_to_erase = self.screen_size.col - cursor_position.col
+        FillConsoleOutputCharacter(
+            self._handle, " ", length=cells_to_erase, start=cursor_position
+        )
+        FillConsoleOutputAttribute(
+            self._handle,
+            self._default_attrs,
+            length=cells_to_erase,
+            start=cursor_position,
+        )
+
+    def erase_start_of_line(self) -> None:
+        """Erase all content from the cursor position to the start of that line"""
+        row, col = self.cursor_position
+        start = WindowsCoordinates(row, 0)
+        FillConsoleOutputCharacter(self._handle, " ", length=col, start=start)
+        FillConsoleOutputAttribute(
+            self._handle, self._default_attrs, length=col, start=start
+        )
+
+    def move_cursor_up(self) -> None:
+        """Move the cursor up a single cell"""
+        cursor_position = self.cursor_position
+        SetConsoleCursorPosition(
+            self._handle,
+            coords=WindowsCoordinates(
+                row=cursor_position.row - 1, col=cursor_position.col
+            ),
+        )
+
+    def move_cursor_down(self) -> None:
+        """Move the cursor down a single cell"""
+        cursor_position = self.cursor_position
+        SetConsoleCursorPosition(
+            self._handle,
+            coords=WindowsCoordinates(
+                row=cursor_position.row + 1,
+                col=cursor_position.col,
+            ),
+        )
+
+    def move_cursor_forward(self) -> None:
+        """Move the cursor forward a single cell. Wrap to the next line if required."""
+        row, col = self.cursor_position
+        if col == self.screen_size.col - 1:
+            row += 1
+            col = 0
+        else:
+            col += 1
+        SetConsoleCursorPosition(
+            self._handle, coords=WindowsCoordinates(row=row, col=col)
+        )
+
+    def move_cursor_to_column(self, column: int) -> None:
+        """Move cursor to the column specified by the zero-based column index, staying on the same row
+
+        Args:
+            column (int): The zero-based column index to move the cursor to.
+        """
+        row, _ = self.cursor_position
+        SetConsoleCursorPosition(self._handle, coords=WindowsCoordinates(row, column))
+
+    def move_cursor_backward(self) -> None:
+        """Move the cursor backward a single cell. Wrap to the previous line if required."""
+        row, col = self.cursor_position
+        if col == 0:
+            row -= 1
+            col = self.screen_size.col - 1
+        else:
+            col -= 1
+        SetConsoleCursorPosition(
+            self._handle, coords=WindowsCoordinates(row=row, col=col)
+        )
+
+    def hide_cursor(self) -> None:
+        """Hide the cursor"""
+        current_cursor_size = self._get_cursor_size()
+        invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=0)
+        SetConsoleCursorInfo(self._handle, cursor_info=invisible_cursor)
+
+    def show_cursor(self) -> None:
+        """Show the cursor"""
+        current_cursor_size = self._get_cursor_size()
+        visible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=1)
+        SetConsoleCursorInfo(self._handle, cursor_info=visible_cursor)
+
+    def set_title(self, title: str) -> None:
+        """Set the title of the terminal window
+
+        Args:
+            title (str): The new title of the console window
+        """
+        assert len(title) < 255, "Console title must be less than 255 characters"
+        SetConsoleTitle(title)
+
+    def _get_cursor_size(self) -> int:
+        """Get the percentage of the character cell that is filled by the cursor"""
+        cursor_info = CONSOLE_CURSOR_INFO()
+        GetConsoleCursorInfo(self._handle, cursor_info=cursor_info)
+        return int(cursor_info.dwSize)
+
+
+if __name__ == "__main__":
+    handle = GetStdHandle()
+
+    from rich.console import Console
+
+    console = Console()
+
+    term = LegacyWindowsTerm(sys.stdout)
+    term.set_title("Win32 Console Examples")
+
+    style = Style(color="black", bgcolor="red")
+
+    heading = Style.parse("black on green")
+
+    # Check colour output
+    console.rule("Checking colour output")
+    console.print("[on red]on red!")
+    console.print("[blue]blue!")
+    console.print("[yellow]yellow!")
+    console.print("[bold yellow]bold yellow!")
+    console.print("[bright_yellow]bright_yellow!")
+    console.print("[dim bright_yellow]dim bright_yellow!")
+    console.print("[italic cyan]italic cyan!")
+    console.print("[bold white on blue]bold white on blue!")
+    console.print("[reverse bold white on blue]reverse bold white on blue!")
+    console.print("[bold black on cyan]bold black on cyan!")
+    console.print("[black on green]black on green!")
+    console.print("[blue on green]blue on green!")
+    console.print("[white on black]white on black!")
+    console.print("[black on white]black on white!")
+    console.print("[#1BB152 on #DA812D]#1BB152 on #DA812D!")
+
+    # Check cursor movement
+    console.rule("Checking cursor movement")
+    console.print()
+    term.move_cursor_backward()
+    term.move_cursor_backward()
+    term.write_text("went back and wrapped to prev line")
+    time.sleep(1)
+    term.move_cursor_up()
+    term.write_text("we go up")
+    time.sleep(1)
+    term.move_cursor_down()
+    term.write_text("and down")
+    time.sleep(1)
+    term.move_cursor_up()
+    term.move_cursor_backward()
+    term.move_cursor_backward()
+    term.write_text("we went up and back 2")
+    time.sleep(1)
+    term.move_cursor_down()
+    term.move_cursor_backward()
+    term.move_cursor_backward()
+    term.write_text("we went down and back 2")
+    time.sleep(1)
+
+    # Check erasing of lines
+    term.hide_cursor()
+    console.print()
+    console.rule("Checking line erasing")
+    console.print("\n...Deleting to the start of the line...")
+    term.write_text("The red arrow shows the cursor location, and direction of erase")
+    time.sleep(1)
+    term.move_cursor_to_column(16)
+    term.write_styled("<", Style.parse("black on red"))
+    term.move_cursor_backward()
+    time.sleep(1)
+    term.erase_start_of_line()
+    time.sleep(1)
+
+    console.print("\n\n...And to the end of the line...")
+    term.write_text("The red arrow shows the cursor location, and direction of erase")
+    time.sleep(1)
+
+    term.move_cursor_to_column(16)
+    term.write_styled(">", Style.parse("black on red"))
+    time.sleep(1)
+    term.erase_end_of_line()
+    time.sleep(1)
+
+    console.print("\n\n...Now the whole line will be erased...")
+    term.write_styled("I'm going to disappear!", style=Style.parse("black on cyan"))
+    time.sleep(1)
+    term.erase_line()
+
+    term.show_cursor()
+    print("\n")
diff --git a/.venv/Lib/site-packages/rich/_windows.py b/.venv/Lib/site-packages/rich/_windows.py
new file mode 100644 (file)
index 0000000..e17c5c0
--- /dev/null
@@ -0,0 +1,71 @@
+import sys
+from dataclasses import dataclass
+
+
+@dataclass
+class WindowsConsoleFeatures:
+    """Windows features available."""
+
+    vt: bool = False
+    """The console supports VT codes."""
+    truecolor: bool = False
+    """The console supports truecolor."""
+
+
+try:
+    import ctypes
+    from ctypes import LibraryLoader
+
+    if sys.platform == "win32":
+        windll = LibraryLoader(ctypes.WinDLL)
+    else:
+        windll = None
+        raise ImportError("Not windows")
+
+    from rich._win32_console import (
+        ENABLE_VIRTUAL_TERMINAL_PROCESSING,
+        GetConsoleMode,
+        GetStdHandle,
+        LegacyWindowsError,
+    )
+
+except (AttributeError, ImportError, ValueError):
+    # Fallback if we can't load the Windows DLL
+    def get_windows_console_features() -> WindowsConsoleFeatures:
+        features = WindowsConsoleFeatures()
+        return features
+
+else:
+
+    def get_windows_console_features() -> WindowsConsoleFeatures:
+        """Get windows console features.
+
+        Returns:
+            WindowsConsoleFeatures: An instance of WindowsConsoleFeatures.
+        """
+        handle = GetStdHandle()
+        try:
+            console_mode = GetConsoleMode(handle)
+            success = True
+        except LegacyWindowsError:
+            console_mode = 0
+            success = False
+        vt = bool(success and console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING)
+        truecolor = False
+        if vt:
+            win_version = sys.getwindowsversion()
+            truecolor = win_version.major > 10 or (
+                win_version.major == 10 and win_version.build >= 15063
+            )
+        features = WindowsConsoleFeatures(vt=vt, truecolor=truecolor)
+        return features
+
+
+if __name__ == "__main__":
+    import platform
+
+    features = get_windows_console_features()
+    from rich import print
+
+    print(f'platform="{platform.system()}"')
+    print(repr(features))
diff --git a/.venv/Lib/site-packages/rich/_windows_renderer.py b/.venv/Lib/site-packages/rich/_windows_renderer.py
new file mode 100644 (file)
index 0000000..0fc2ba8
--- /dev/null
@@ -0,0 +1,56 @@
+from typing import Iterable, Sequence, Tuple, cast
+
+from rich._win32_console import LegacyWindowsTerm, WindowsCoordinates
+from rich.segment import ControlCode, ControlType, Segment
+
+
+def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None:
+    """Makes appropriate Windows Console API calls based on the segments in the buffer.
+
+    Args:
+        buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls.
+        term (LegacyWindowsTerm): Used to call the Windows Console API.
+    """
+    for text, style, control in buffer:
+        if not control:
+            if style:
+                term.write_styled(text, style)
+            else:
+                term.write_text(text)
+        else:
+            control_codes: Sequence[ControlCode] = control
+            for control_code in control_codes:
+                control_type = control_code[0]
+                if control_type == ControlType.CURSOR_MOVE_TO:
+                    _, x, y = cast(Tuple[ControlType, int, int], control_code)
+                    term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1))
+                elif control_type == ControlType.CARRIAGE_RETURN:
+                    term.write_text("\r")
+                elif control_type == ControlType.HOME:
+                    term.move_cursor_to(WindowsCoordinates(0, 0))
+                elif control_type == ControlType.CURSOR_UP:
+                    term.move_cursor_up()
+                elif control_type == ControlType.CURSOR_DOWN:
+                    term.move_cursor_down()
+                elif control_type == ControlType.CURSOR_FORWARD:
+                    term.move_cursor_forward()
+                elif control_type == ControlType.CURSOR_BACKWARD:
+                    term.move_cursor_backward()
+                elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN:
+                    _, column = cast(Tuple[ControlType, int], control_code)
+                    term.move_cursor_to_column(column - 1)
+                elif control_type == ControlType.HIDE_CURSOR:
+                    term.hide_cursor()
+                elif control_type == ControlType.SHOW_CURSOR:
+                    term.show_cursor()
+                elif control_type == ControlType.ERASE_IN_LINE:
+                    _, mode = cast(Tuple[ControlType, int], control_code)
+                    if mode == 0:
+                        term.erase_end_of_line()
+                    elif mode == 1:
+                        term.erase_start_of_line()
+                    elif mode == 2:
+                        term.erase_line()
+                elif control_type == ControlType.SET_WINDOW_TITLE:
+                    _, title = cast(Tuple[ControlType, str], control_code)
+                    term.set_title(title)
diff --git a/.venv/Lib/site-packages/rich/_wrap.py b/.venv/Lib/site-packages/rich/_wrap.py
new file mode 100644 (file)
index 0000000..2e94ff6
--- /dev/null
@@ -0,0 +1,93 @@
+from __future__ import annotations
+
+import re
+from typing import Iterable
+
+from ._loop import loop_last
+from .cells import cell_len, chop_cells
+
+re_word = re.compile(r"\s*\S+\s*")
+
+
+def words(text: str) -> Iterable[tuple[int, int, str]]:
+    """Yields each word from the text as a tuple
+    containing (start_index, end_index, word). A "word" in this context may
+    include the actual word and any whitespace to the right.
+    """
+    position = 0
+    word_match = re_word.match(text, position)
+    while word_match is not None:
+        start, end = word_match.span()
+        word = word_match.group(0)
+        yield start, end, word
+        word_match = re_word.match(text, end)
+
+
+def divide_line(text: str, width: int, fold: bool = True) -> list[int]:
+    """Given a string of text, and a width (measured in cells), return a list
+    of cell offsets which the string should be split at in order for it to fit
+    within the given width.
+
+    Args:
+        text: The text to examine.
+        width: The available cell width.
+        fold: If True, words longer than `width` will be folded onto a new line.
+
+    Returns:
+        A list of indices to break the line at.
+    """
+    break_positions: list[int] = []  # offsets to insert the breaks at
+    append = break_positions.append
+    cell_offset = 0
+    _cell_len = cell_len
+
+    for start, _end, word in words(text):
+        word_length = _cell_len(word.rstrip())
+        remaining_space = width - cell_offset
+        word_fits_remaining_space = remaining_space >= word_length
+
+        if word_fits_remaining_space:
+            # Simplest case - the word fits within the remaining width for this line.
+            cell_offset += _cell_len(word)
+        else:
+            # Not enough space remaining for this word on the current line.
+            if word_length > width:
+                # The word doesn't fit on any line, so we can't simply
+                # place it on the next line...
+                if fold:
+                    # Fold the word across multiple lines.
+                    folded_word = chop_cells(word, width=width)
+                    for last, line in loop_last(folded_word):
+                        if start:
+                            append(start)
+                        if last:
+                            cell_offset = _cell_len(line)
+                        else:
+                            start += len(line)
+                else:
+                    # Folding isn't allowed, so crop the word.
+                    if start:
+                        append(start)
+                    cell_offset = _cell_len(word)
+            elif cell_offset and start:
+                # The word doesn't fit within the remaining space on the current
+                # line, but it *can* fit on to the next (empty) line.
+                append(start)
+                cell_offset = _cell_len(word)
+
+    return break_positions
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from .console import Console
+
+    console = Console(width=10)
+    console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345")
+    print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10))
+
+    console = Console(width=20)
+    console.rule()
+    console.print("TextualはPythonの高速アプリケーション開発フレームワークです")
+
+    console.rule()
+    console.print("アプリケーションは1670万色を使用でき")
diff --git a/.venv/Lib/site-packages/rich/abc.py b/.venv/Lib/site-packages/rich/abc.py
new file mode 100644 (file)
index 0000000..42db7c0
--- /dev/null
@@ -0,0 +1,33 @@
+from abc import ABC
+
+
+class RichRenderable(ABC):
+    """An abstract base class for Rich renderables.
+
+    Note that there is no need to extend this class, the intended use is to check if an
+    object supports the Rich renderable protocol. For example::
+
+        if isinstance(my_object, RichRenderable):
+            console.print(my_object)
+
+    """
+
+    @classmethod
+    def __subclasshook__(cls, other: type) -> bool:
+        """Check if this class supports the rich render protocol."""
+        return hasattr(other, "__rich_console__") or hasattr(other, "__rich__")
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich.text import Text
+
+    t = Text()
+    print(isinstance(Text, RichRenderable))
+    print(isinstance(t, RichRenderable))
+
+    class Foo:
+        pass
+
+    f = Foo()
+    print(isinstance(f, RichRenderable))
+    print(isinstance("", RichRenderable))
diff --git a/.venv/Lib/site-packages/rich/align.py b/.venv/Lib/site-packages/rich/align.py
new file mode 100644 (file)
index 0000000..fac50b1
--- /dev/null
@@ -0,0 +1,312 @@
+import sys
+from itertools import chain
+from typing import TYPE_CHECKING, Iterable, Optional
+
+if sys.version_info >= (3, 8):
+    from typing import Literal
+else:
+    from typing_extensions import Literal  # pragma: no cover
+
+from .constrain import Constrain
+from .jupyter import JupyterMixin
+from .measure import Measurement
+from .segment import Segment
+from .style import StyleType
+
+if TYPE_CHECKING:
+    from .console import Console, ConsoleOptions, RenderableType, RenderResult
+
+AlignMethod = Literal["left", "center", "right"]
+VerticalAlignMethod = Literal["top", "middle", "bottom"]
+
+
+class Align(JupyterMixin):
+    """Align a renderable by adding spaces if necessary.
+
+    Args:
+        renderable (RenderableType): A console renderable.
+        align (AlignMethod): One of "left", "center", or "right""
+        style (StyleType, optional): An optional style to apply to the background.
+        vertical (Optional[VerticalAlignMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None.
+        pad (bool, optional): Pad the right with spaces. Defaults to True.
+        width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None.
+        height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None.
+
+    Raises:
+        ValueError: if ``align`` is not one of the expected values.
+    """
+
+    def __init__(
+        self,
+        renderable: "RenderableType",
+        align: AlignMethod = "left",
+        style: Optional[StyleType] = None,
+        *,
+        vertical: Optional[VerticalAlignMethod] = None,
+        pad: bool = True,
+        width: Optional[int] = None,
+        height: Optional[int] = None,
+    ) -> None:
+        if align not in ("left", "center", "right"):
+            raise ValueError(
+                f'invalid value for align, expected "left", "center", or "right" (not {align!r})'
+            )
+        if vertical is not None and vertical not in ("top", "middle", "bottom"):
+            raise ValueError(
+                f'invalid value for vertical, expected "top", "middle", or "bottom" (not {vertical!r})'
+            )
+        self.renderable = renderable
+        self.align = align
+        self.style = style
+        self.vertical = vertical
+        self.pad = pad
+        self.width = width
+        self.height = height
+
+    def __repr__(self) -> str:
+        return f"Align({self.renderable!r}, {self.align!r})"
+
+    @classmethod
+    def left(
+        cls,
+        renderable: "RenderableType",
+        style: Optional[StyleType] = None,
+        *,
+        vertical: Optional[VerticalAlignMethod] = None,
+        pad: bool = True,
+        width: Optional[int] = None,
+        height: Optional[int] = None,
+    ) -> "Align":
+        """Align a renderable to the left."""
+        return cls(
+            renderable,
+            "left",
+            style=style,
+            vertical=vertical,
+            pad=pad,
+            width=width,
+            height=height,
+        )
+
+    @classmethod
+    def center(
+        cls,
+        renderable: "RenderableType",
+        style: Optional[StyleType] = None,
+        *,
+        vertical: Optional[VerticalAlignMethod] = None,
+        pad: bool = True,
+        width: Optional[int] = None,
+        height: Optional[int] = None,
+    ) -> "Align":
+        """Align a renderable to the center."""
+        return cls(
+            renderable,
+            "center",
+            style=style,
+            vertical=vertical,
+            pad=pad,
+            width=width,
+            height=height,
+        )
+
+    @classmethod
+    def right(
+        cls,
+        renderable: "RenderableType",
+        style: Optional[StyleType] = None,
+        *,
+        vertical: Optional[VerticalAlignMethod] = None,
+        pad: bool = True,
+        width: Optional[int] = None,
+        height: Optional[int] = None,
+    ) -> "Align":
+        """Align a renderable to the right."""
+        return cls(
+            renderable,
+            "right",
+            style=style,
+            vertical=vertical,
+            pad=pad,
+            width=width,
+            height=height,
+        )
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        align = self.align
+        width = console.measure(self.renderable, options=options).maximum
+        rendered = console.render(
+            Constrain(
+                self.renderable, width if self.width is None else min(width, self.width)
+            ),
+            options.update(height=None),
+        )
+        lines = list(Segment.split_lines(rendered))
+        width, height = Segment.get_shape(lines)
+        lines = Segment.set_shape(lines, width, height)
+        new_line = Segment.line()
+        excess_space = options.max_width - width
+        style = console.get_style(self.style) if self.style is not None else None
+
+        def generate_segments() -> Iterable[Segment]:
+            if excess_space <= 0:
+                # Exact fit
+                for line in lines:
+                    yield from line
+                    yield new_line
+
+            elif align == "left":
+                # Pad on the right
+                pad = Segment(" " * excess_space, style) if self.pad else None
+                for line in lines:
+                    yield from line
+                    if pad:
+                        yield pad
+                    yield new_line
+
+            elif align == "center":
+                # Pad left and right
+                left = excess_space // 2
+                pad = Segment(" " * left, style)
+                pad_right = (
+                    Segment(" " * (excess_space - left), style) if self.pad else None
+                )
+                for line in lines:
+                    if left:
+                        yield pad
+                    yield from line
+                    if pad_right:
+                        yield pad_right
+                    yield new_line
+
+            elif align == "right":
+                # Padding on left
+                pad = Segment(" " * excess_space, style)
+                for line in lines:
+                    yield pad
+                    yield from line
+                    yield new_line
+
+        blank_line = (
+            Segment(f"{' ' * (self.width or options.max_width)}\n", style)
+            if self.pad
+            else Segment("\n")
+        )
+
+        def blank_lines(count: int) -> Iterable[Segment]:
+            if count > 0:
+                for _ in range(count):
+                    yield blank_line
+
+        vertical_height = self.height or options.height
+        iter_segments: Iterable[Segment]
+        if self.vertical and vertical_height is not None:
+            if self.vertical == "top":
+                bottom_space = vertical_height - height
+                iter_segments = chain(generate_segments(), blank_lines(bottom_space))
+            elif self.vertical == "middle":
+                top_space = (vertical_height - height) // 2
+                bottom_space = vertical_height - top_space - height
+                iter_segments = chain(
+                    blank_lines(top_space),
+                    generate_segments(),
+                    blank_lines(bottom_space),
+                )
+            else:  #  self.vertical == "bottom":
+                top_space = vertical_height - height
+                iter_segments = chain(blank_lines(top_space), generate_segments())
+        else:
+            iter_segments = generate_segments()
+        if self.style:
+            style = console.get_style(self.style)
+            iter_segments = Segment.apply_style(iter_segments, style)
+        yield from iter_segments
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> Measurement:
+        measurement = Measurement.get(console, options, self.renderable)
+        return measurement
+
+
+class VerticalCenter(JupyterMixin):
+    """Vertically aligns a renderable.
+
+    Warn:
+        This class is deprecated and may be removed in a future version. Use Align class with
+        `vertical="middle"`.
+
+    Args:
+        renderable (RenderableType): A renderable object.
+        style (StyleType, optional): An optional style to apply to the background. Defaults to None.
+    """
+
+    def __init__(
+        self,
+        renderable: "RenderableType",
+        style: Optional[StyleType] = None,
+    ) -> None:
+        self.renderable = renderable
+        self.style = style
+
+    def __repr__(self) -> str:
+        return f"VerticalCenter({self.renderable!r})"
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        style = console.get_style(self.style) if self.style is not None else None
+        lines = console.render_lines(
+            self.renderable, options.update(height=None), pad=False
+        )
+        width, _height = Segment.get_shape(lines)
+        new_line = Segment.line()
+        height = options.height or options.size.height
+        top_space = (height - len(lines)) // 2
+        bottom_space = height - top_space - len(lines)
+        blank_line = Segment(f"{' ' * width}", style)
+
+        def blank_lines(count: int) -> Iterable[Segment]:
+            for _ in range(count):
+                yield blank_line
+                yield new_line
+
+        if top_space > 0:
+            yield from blank_lines(top_space)
+        for line in lines:
+            yield from line
+            yield new_line
+        if bottom_space > 0:
+            yield from blank_lines(bottom_space)
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> Measurement:
+        measurement = Measurement.get(console, options, self.renderable)
+        return measurement
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich.console import Console, Group
+    from rich.highlighter import ReprHighlighter
+    from rich.panel import Panel
+
+    highlighter = ReprHighlighter()
+    console = Console()
+
+    panel = Panel(
+        Group(
+            Align.left(highlighter("align='left'")),
+            Align.center(highlighter("align='center'")),
+            Align.right(highlighter("align='right'")),
+        ),
+        width=60,
+        style="on dark_blue",
+        title="Align",
+    )
+
+    console.print(
+        Align.center(panel, vertical="middle", style="on red", height=console.height)
+    )
diff --git a/.venv/Lib/site-packages/rich/ansi.py b/.venv/Lib/site-packages/rich/ansi.py
new file mode 100644 (file)
index 0000000..7de86ce
--- /dev/null
@@ -0,0 +1,241 @@
+import re
+import sys
+from contextlib import suppress
+from typing import Iterable, NamedTuple, Optional
+
+from .color import Color
+from .style import Style
+from .text import Text
+
+re_ansi = re.compile(
+    r"""
+(?:\x1b[0-?])|
+(?:\x1b\](.*?)\x1b\\)|
+(?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~]))
+""",
+    re.VERBOSE,
+)
+
+
+class _AnsiToken(NamedTuple):
+    """Result of ansi tokenized string."""
+
+    plain: str = ""
+    sgr: Optional[str] = ""
+    osc: Optional[str] = ""
+
+
+def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]:
+    """Tokenize a string in to plain text and ANSI codes.
+
+    Args:
+        ansi_text (str): A String containing ANSI codes.
+
+    Yields:
+        AnsiToken: A named tuple of (plain, sgr, osc)
+    """
+
+    position = 0
+    sgr: Optional[str]
+    osc: Optional[str]
+    for match in re_ansi.finditer(ansi_text):
+        start, end = match.span(0)
+        osc, sgr = match.groups()
+        if start > position:
+            yield _AnsiToken(ansi_text[position:start])
+        if sgr:
+            if sgr == "(":
+                position = end + 1
+                continue
+            if sgr.endswith("m"):
+                yield _AnsiToken("", sgr[1:-1], osc)
+        else:
+            yield _AnsiToken("", sgr, osc)
+        position = end
+    if position < len(ansi_text):
+        yield _AnsiToken(ansi_text[position:])
+
+
+SGR_STYLE_MAP = {
+    1: "bold",
+    2: "dim",
+    3: "italic",
+    4: "underline",
+    5: "blink",
+    6: "blink2",
+    7: "reverse",
+    8: "conceal",
+    9: "strike",
+    21: "underline2",
+    22: "not dim not bold",
+    23: "not italic",
+    24: "not underline",
+    25: "not blink",
+    26: "not blink2",
+    27: "not reverse",
+    28: "not conceal",
+    29: "not strike",
+    30: "color(0)",
+    31: "color(1)",
+    32: "color(2)",
+    33: "color(3)",
+    34: "color(4)",
+    35: "color(5)",
+    36: "color(6)",
+    37: "color(7)",
+    39: "default",
+    40: "on color(0)",
+    41: "on color(1)",
+    42: "on color(2)",
+    43: "on color(3)",
+    44: "on color(4)",
+    45: "on color(5)",
+    46: "on color(6)",
+    47: "on color(7)",
+    49: "on default",
+    51: "frame",
+    52: "encircle",
+    53: "overline",
+    54: "not frame not encircle",
+    55: "not overline",
+    90: "color(8)",
+    91: "color(9)",
+    92: "color(10)",
+    93: "color(11)",
+    94: "color(12)",
+    95: "color(13)",
+    96: "color(14)",
+    97: "color(15)",
+    100: "on color(8)",
+    101: "on color(9)",
+    102: "on color(10)",
+    103: "on color(11)",
+    104: "on color(12)",
+    105: "on color(13)",
+    106: "on color(14)",
+    107: "on color(15)",
+}
+
+
+class AnsiDecoder:
+    """Translate ANSI code in to styled Text."""
+
+    def __init__(self) -> None:
+        self.style = Style.null()
+
+    def decode(self, terminal_text: str) -> Iterable[Text]:
+        """Decode ANSI codes in an iterable of lines.
+
+        Args:
+            lines (Iterable[str]): An iterable of lines of terminal output.
+
+        Yields:
+            Text: Marked up Text.
+        """
+        for line in terminal_text.splitlines():
+            yield self.decode_line(line)
+
+    def decode_line(self, line: str) -> Text:
+        """Decode a line containing ansi codes.
+
+        Args:
+            line (str): A line of terminal output.
+
+        Returns:
+            Text: A Text instance marked up according to ansi codes.
+        """
+        from_ansi = Color.from_ansi
+        from_rgb = Color.from_rgb
+        _Style = Style
+        text = Text()
+        append = text.append
+        line = line.rsplit("\r", 1)[-1]
+        for plain_text, sgr, osc in _ansi_tokenize(line):
+            if plain_text:
+                append(plain_text, self.style or None)
+            elif osc is not None:
+                if osc.startswith("8;"):
+                    _params, semicolon, link = osc[2:].partition(";")
+                    if semicolon:
+                        self.style = self.style.update_link(link or None)
+            elif sgr is not None:
+                # Translate in to semi-colon separated codes
+                # Ignore invalid codes, because we want to be lenient
+                codes = [
+                    min(255, int(_code) if _code else 0)
+                    for _code in sgr.split(";")
+                    if _code.isdigit() or _code == ""
+                ]
+                iter_codes = iter(codes)
+                for code in iter_codes:
+                    if code == 0:
+                        # reset
+                        self.style = _Style.null()
+                    elif code in SGR_STYLE_MAP:
+                        # styles
+                        self.style += _Style.parse(SGR_STYLE_MAP[code])
+                    elif code == 38:
+                        #  Foreground
+                        with suppress(StopIteration):
+                            color_type = next(iter_codes)
+                            if color_type == 5:
+                                self.style += _Style.from_color(
+                                    from_ansi(next(iter_codes))
+                                )
+                            elif color_type == 2:
+                                self.style += _Style.from_color(
+                                    from_rgb(
+                                        next(iter_codes),
+                                        next(iter_codes),
+                                        next(iter_codes),
+                                    )
+                                )
+                    elif code == 48:
+                        # Background
+                        with suppress(StopIteration):
+                            color_type = next(iter_codes)
+                            if color_type == 5:
+                                self.style += _Style.from_color(
+                                    None, from_ansi(next(iter_codes))
+                                )
+                            elif color_type == 2:
+                                self.style += _Style.from_color(
+                                    None,
+                                    from_rgb(
+                                        next(iter_codes),
+                                        next(iter_codes),
+                                        next(iter_codes),
+                                    ),
+                                )
+
+        return text
+
+
+if sys.platform != "win32" and __name__ == "__main__":  # pragma: no cover
+    import io
+    import os
+    import pty
+    import sys
+
+    decoder = AnsiDecoder()
+
+    stdout = io.BytesIO()
+
+    def read(fd: int) -> bytes:
+        data = os.read(fd, 1024)
+        stdout.write(data)
+        return data
+
+    pty.spawn(sys.argv[1:], read)
+
+    from .console import Console
+
+    console = Console(record=True)
+
+    stdout_result = stdout.getvalue().decode("utf-8")
+    print(stdout_result)
+
+    for line in decoder.decode(stdout_result):
+        console.print(line)
+
+    console.save_html("stdout.html")
diff --git a/.venv/Lib/site-packages/rich/bar.py b/.venv/Lib/site-packages/rich/bar.py
new file mode 100644 (file)
index 0000000..022284b
--- /dev/null
@@ -0,0 +1,93 @@
+from typing import Optional, Union
+
+from .color import Color
+from .console import Console, ConsoleOptions, RenderResult
+from .jupyter import JupyterMixin
+from .measure import Measurement
+from .segment import Segment
+from .style import Style
+
+# There are left-aligned characters for 1/8 to 7/8, but
+# the right-aligned characters exist only for 1/8 and 4/8.
+BEGIN_BLOCK_ELEMENTS = ["█", "█", "█", "▐", "▐", "▐", "▕", "▕"]
+END_BLOCK_ELEMENTS = [" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉"]
+FULL_BLOCK = "█"
+
+
+class Bar(JupyterMixin):
+    """Renders a solid block bar.
+
+    Args:
+        size (float): Value for the end of the bar.
+        begin (float): Begin point (between 0 and size, inclusive).
+        end (float): End point (between 0 and size, inclusive).
+        width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None.
+        color (Union[Color, str], optional): Color of the bar. Defaults to "default".
+        bgcolor (Union[Color, str], optional): Color of bar background. Defaults to "default".
+    """
+
+    def __init__(
+        self,
+        size: float,
+        begin: float,
+        end: float,
+        *,
+        width: Optional[int] = None,
+        color: Union[Color, str] = "default",
+        bgcolor: Union[Color, str] = "default",
+    ):
+        self.size = size
+        self.begin = max(begin, 0)
+        self.end = min(end, size)
+        self.width = width
+        self.style = Style(color=color, bgcolor=bgcolor)
+
+    def __repr__(self) -> str:
+        return f"Bar({self.size}, {self.begin}, {self.end})"
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        width = min(
+            self.width if self.width is not None else options.max_width,
+            options.max_width,
+        )
+
+        if self.begin >= self.end:
+            yield Segment(" " * width, self.style)
+            yield Segment.line()
+            return
+
+        prefix_complete_eights = int(width * 8 * self.begin / self.size)
+        prefix_bar_count = prefix_complete_eights // 8
+        prefix_eights_count = prefix_complete_eights % 8
+
+        body_complete_eights = int(width * 8 * self.end / self.size)
+        body_bar_count = body_complete_eights // 8
+        body_eights_count = body_complete_eights % 8
+
+        # When start and end fall into the same cell, we ideally should render
+        # a symbol that's "center-aligned", but there is no good symbol in Unicode.
+        # In this case, we fall back to right-aligned block symbol for simplicity.
+
+        prefix = " " * prefix_bar_count
+        if prefix_eights_count:
+            prefix += BEGIN_BLOCK_ELEMENTS[prefix_eights_count]
+
+        body = FULL_BLOCK * body_bar_count
+        if body_eights_count:
+            body += END_BLOCK_ELEMENTS[body_eights_count]
+
+        suffix = " " * (width - len(body))
+
+        yield Segment(prefix + body[len(prefix) :] + suffix, self.style)
+        yield Segment.line()
+
+    def __rich_measure__(
+        self, console: Console, options: ConsoleOptions
+    ) -> Measurement:
+        return (
+            Measurement(self.width, self.width)
+            if self.width is not None
+            else Measurement(4, options.max_width)
+        )
diff --git a/.venv/Lib/site-packages/rich/box.py b/.venv/Lib/site-packages/rich/box.py
new file mode 100644 (file)
index 0000000..aa4ada3
--- /dev/null
@@ -0,0 +1,480 @@
+import sys
+from typing import TYPE_CHECKING, Iterable, List
+
+if sys.version_info >= (3, 8):
+    from typing import Literal
+else:
+    from typing_extensions import Literal  # pragma: no cover
+
+
+from ._loop import loop_last
+
+if TYPE_CHECKING:
+    from rich.console import ConsoleOptions
+
+
+class Box:
+    """Defines characters to render boxes.
+
+    ┌─┬┐ top
+    │ ││ head
+    ├─┼┤ head_row
+    │ ││ mid
+    ├─┼┤ row
+    ├─┼┤ foot_row
+    │ ││ foot
+    └─┴┘ bottom
+
+    Args:
+        box (str): Characters making up box.
+        ascii (bool, optional): True if this box uses ascii characters only. Default is False.
+    """
+
+    def __init__(self, box: str, *, ascii: bool = False) -> None:
+        self._box = box
+        self.ascii = ascii
+        line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines()
+        # top
+        self.top_left, self.top, self.top_divider, self.top_right = iter(line1)
+        # head
+        self.head_left, _, self.head_vertical, self.head_right = iter(line2)
+        # head_row
+        (
+            self.head_row_left,
+            self.head_row_horizontal,
+            self.head_row_cross,
+            self.head_row_right,
+        ) = iter(line3)
+
+        # mid
+        self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4)
+        # row
+        self.row_left, self.row_horizontal, self.row_cross, self.row_right = iter(line5)
+        # foot_row
+        (
+            self.foot_row_left,
+            self.foot_row_horizontal,
+            self.foot_row_cross,
+            self.foot_row_right,
+        ) = iter(line6)
+        # foot
+        self.foot_left, _, self.foot_vertical, self.foot_right = iter(line7)
+        # bottom
+        self.bottom_left, self.bottom, self.bottom_divider, self.bottom_right = iter(
+            line8
+        )
+
+    def __repr__(self) -> str:
+        return "Box(...)"
+
+    def __str__(self) -> str:
+        return self._box
+
+    def substitute(self, options: "ConsoleOptions", safe: bool = True) -> "Box":
+        """Substitute this box for another if it won't render due to platform issues.
+
+        Args:
+            options (ConsoleOptions): Console options used in rendering.
+            safe (bool, optional): Substitute this for another Box if there are known problems
+                displaying on the platform (currently only relevant on Windows). Default is True.
+
+        Returns:
+            Box: A different Box or the same Box.
+        """
+        box = self
+        if options.legacy_windows and safe:
+            box = LEGACY_WINDOWS_SUBSTITUTIONS.get(box, box)
+        if options.ascii_only and not box.ascii:
+            box = ASCII
+        return box
+
+    def get_plain_headed_box(self) -> "Box":
+        """If this box uses special characters for the borders of the header, then
+        return the equivalent box that does not.
+
+        Returns:
+            Box: The most similar Box that doesn't use header-specific box characters.
+                If the current Box already satisfies this criterion, then it's returned.
+        """
+        return PLAIN_HEADED_SUBSTITUTIONS.get(self, self)
+
+    def get_top(self, widths: Iterable[int]) -> str:
+        """Get the top of a simple box.
+
+        Args:
+            widths (List[int]): Widths of columns.
+
+        Returns:
+            str: A string of box characters.
+        """
+
+        parts: List[str] = []
+        append = parts.append
+        append(self.top_left)
+        for last, width in loop_last(widths):
+            append(self.top * width)
+            if not last:
+                append(self.top_divider)
+        append(self.top_right)
+        return "".join(parts)
+
+    def get_row(
+        self,
+        widths: Iterable[int],
+        level: Literal["head", "row", "foot", "mid"] = "row",
+        edge: bool = True,
+    ) -> str:
+        """Get the top of a simple box.
+
+        Args:
+            width (List[int]): Widths of columns.
+
+        Returns:
+            str: A string of box characters.
+        """
+        if level == "head":
+            left = self.head_row_left
+            horizontal = self.head_row_horizontal
+            cross = self.head_row_cross
+            right = self.head_row_right
+        elif level == "row":
+            left = self.row_left
+            horizontal = self.row_horizontal
+            cross = self.row_cross
+            right = self.row_right
+        elif level == "mid":
+            left = self.mid_left
+            horizontal = " "
+            cross = self.mid_vertical
+            right = self.mid_right
+        elif level == "foot":
+            left = self.foot_row_left
+            horizontal = self.foot_row_horizontal
+            cross = self.foot_row_cross
+            right = self.foot_row_right
+        else:
+            raise ValueError("level must be 'head', 'row' or 'foot'")
+
+        parts: List[str] = []
+        append = parts.append
+        if edge:
+            append(left)
+        for last, width in loop_last(widths):
+            append(horizontal * width)
+            if not last:
+                append(cross)
+        if edge:
+            append(right)
+        return "".join(parts)
+
+    def get_bottom(self, widths: Iterable[int]) -> str:
+        """Get the bottom of a simple box.
+
+        Args:
+            widths (List[int]): Widths of columns.
+
+        Returns:
+            str: A string of box characters.
+        """
+
+        parts: List[str] = []
+        append = parts.append
+        append(self.bottom_left)
+        for last, width in loop_last(widths):
+            append(self.bottom * width)
+            if not last:
+                append(self.bottom_divider)
+        append(self.bottom_right)
+        return "".join(parts)
+
+
+# fmt: off
+ASCII: Box = Box(
+    "+--+\n"
+    "| ||\n"
+    "|-+|\n"
+    "| ||\n"
+    "|-+|\n"
+    "|-+|\n"
+    "| ||\n"
+    "+--+\n",
+    ascii=True,
+)
+
+ASCII2: Box = Box(
+    "+-++\n"
+    "| ||\n"
+    "+-++\n"
+    "| ||\n"
+    "+-++\n"
+    "+-++\n"
+    "| ||\n"
+    "+-++\n",
+    ascii=True,
+)
+
+ASCII_DOUBLE_HEAD: Box = Box(
+    "+-++\n"
+    "| ||\n"
+    "+=++\n"
+    "| ||\n"
+    "+-++\n"
+    "+-++\n"
+    "| ||\n"
+    "+-++\n",
+    ascii=True,
+)
+
+SQUARE: Box = Box(
+    "┌─┬┐\n"
+    "│ ││\n"
+    "├─┼┤\n"
+    "│ ││\n"
+    "├─┼┤\n"
+    "├─┼┤\n"
+    "│ ││\n"
+    "└─┴┘\n"
+)
+
+SQUARE_DOUBLE_HEAD: Box = Box(
+    "┌─┬┐\n"
+    "│ ││\n"
+    "╞═╪╡\n"
+    "│ ││\n"
+    "├─┼┤\n"
+    "├─┼┤\n"
+    "│ ││\n"
+    "└─┴┘\n"
+)
+
+MINIMAL: Box = Box(
+    "  ╷ \n"
+    "  │ \n"
+    "╶─┼╴\n"
+    "  │ \n"
+    "╶─┼╴\n"
+    "╶─┼╴\n"
+    "  │ \n"
+    "  ╵ \n"
+)
+
+
+MINIMAL_HEAVY_HEAD: Box = Box(
+    "  ╷ \n"
+    "  │ \n"
+    "╺━┿╸\n"
+    "  │ \n"
+    "╶─┼╴\n"
+    "╶─┼╴\n"
+    "  │ \n"
+    "  ╵ \n"
+)
+
+MINIMAL_DOUBLE_HEAD: Box = Box(
+    "  ╷ \n"
+    "  │ \n"
+    " ═╪ \n"
+    "  │ \n"
+    " ─┼ \n"
+    " ─┼ \n"
+    "  │ \n"
+    "  ╵ \n"
+)
+
+
+SIMPLE: Box = Box(
+    "    \n"
+    "    \n"
+    " ── \n"
+    "    \n"
+    "    \n"
+    " ── \n"
+    "    \n"
+    "    \n"
+)
+
+SIMPLE_HEAD: Box = Box(
+    "    \n"
+    "    \n"
+    " ── \n"
+    "    \n"
+    "    \n"
+    "    \n"
+    "    \n"
+    "    \n"
+)
+
+
+SIMPLE_HEAVY: Box = Box(
+    "    \n"
+    "    \n"
+    " ━━ \n"
+    "    \n"
+    "    \n"
+    " ━━ \n"
+    "    \n"
+    "    \n"
+)
+
+
+HORIZONTALS: Box = Box(
+    " ── \n"
+    "    \n"
+    " ── \n"
+    "    \n"
+    " ── \n"
+    " ── \n"
+    "    \n"
+    " ── \n"
+)
+
+ROUNDED: Box = Box(
+    "╭─┬╮\n"
+    "│ ││\n"
+    "├─┼┤\n"
+    "│ ││\n"
+    "├─┼┤\n"
+    "├─┼┤\n"
+    "│ ││\n"
+    "╰─┴╯\n"
+)
+
+HEAVY: Box = Box(
+    "┏━┳┓\n"
+    "┃ ┃┃\n"
+    "┣━╋┫\n"
+    "┃ ┃┃\n"
+    "┣━╋┫\n"
+    "┣━╋┫\n"
+    "┃ ┃┃\n"
+    "┗━┻┛\n"
+)
+
+HEAVY_EDGE: Box = Box(
+    "┏━┯┓\n"
+    "┃ │┃\n"
+    "┠─┼┨\n"
+    "┃ │┃\n"
+    "┠─┼┨\n"
+    "┠─┼┨\n"
+    "┃ │┃\n"
+    "┗━┷┛\n"
+)
+
+HEAVY_HEAD: Box = Box(
+    "┏━┳┓\n"
+    "┃ ┃┃\n"
+    "┡━╇┩\n"
+    "│ ││\n"
+    "├─┼┤\n"
+    "├─┼┤\n"
+    "│ ││\n"
+    "└─┴┘\n"
+)
+
+DOUBLE: Box = Box(
+    "╔═╦╗\n"
+    "║ ║║\n"
+    "╠═╬╣\n"
+    "║ ║║\n"
+    "╠═╬╣\n"
+    "╠═╬╣\n"
+    "║ ║║\n"
+    "╚═╩╝\n"
+)
+
+DOUBLE_EDGE: Box = Box(
+    "╔═╤╗\n"
+    "║ │║\n"
+    "╟─┼╢\n"
+    "║ │║\n"
+    "╟─┼╢\n"
+    "╟─┼╢\n"
+    "║ │║\n"
+    "╚═╧╝\n"
+)
+
+MARKDOWN: Box = Box(
+    "    \n"
+    "| ||\n"
+    "|-||\n"
+    "| ||\n"
+    "|-||\n"
+    "|-||\n"
+    "| ||\n"
+    "    \n",
+    ascii=True,
+)
+# fmt: on
+
+# Map Boxes that don't render with raster fonts on to equivalent that do
+LEGACY_WINDOWS_SUBSTITUTIONS = {
+    ROUNDED: SQUARE,
+    MINIMAL_HEAVY_HEAD: MINIMAL,
+    SIMPLE_HEAVY: SIMPLE,
+    HEAVY: SQUARE,
+    HEAVY_EDGE: SQUARE,
+    HEAVY_HEAD: SQUARE,
+}
+
+# Map headed boxes to their headerless equivalents
+PLAIN_HEADED_SUBSTITUTIONS = {
+    HEAVY_HEAD: SQUARE,
+    SQUARE_DOUBLE_HEAD: SQUARE,
+    MINIMAL_DOUBLE_HEAD: MINIMAL,
+    MINIMAL_HEAVY_HEAD: MINIMAL,
+    ASCII_DOUBLE_HEAD: ASCII2,
+}
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich.columns import Columns
+    from rich.panel import Panel
+
+    from . import box as box
+    from .console import Console
+    from .table import Table
+    from .text import Text
+
+    console = Console(record=True)
+
+    BOXES = [
+        "ASCII",
+        "ASCII2",
+        "ASCII_DOUBLE_HEAD",
+        "SQUARE",
+        "SQUARE_DOUBLE_HEAD",
+        "MINIMAL",
+        "MINIMAL_HEAVY_HEAD",
+        "MINIMAL_DOUBLE_HEAD",
+        "SIMPLE",
+        "SIMPLE_HEAD",
+        "SIMPLE_HEAVY",
+        "HORIZONTALS",
+        "ROUNDED",
+        "HEAVY",
+        "HEAVY_EDGE",
+        "HEAVY_HEAD",
+        "DOUBLE",
+        "DOUBLE_EDGE",
+        "MARKDOWN",
+    ]
+
+    console.print(Panel("[bold green]Box Constants", style="green"), justify="center")
+    console.print()
+
+    columns = Columns(expand=True, padding=2)
+    for box_name in sorted(BOXES):
+        table = Table(
+            show_footer=True, style="dim", border_style="not dim", expand=True
+        )
+        table.add_column("Header 1", "Footer 1")
+        table.add_column("Header 2", "Footer 2")
+        table.add_row("Cell", "Cell")
+        table.add_row("Cell", "Cell")
+        table.box = getattr(box, box_name)
+        table.title = Text(f"box.{box_name}", style="magenta")
+        columns.add_renderable(table)
+    console.print(columns)
+
+    # console.save_svg("box.svg")
diff --git a/.venv/Lib/site-packages/rich/cells.py b/.venv/Lib/site-packages/rich/cells.py
new file mode 100644 (file)
index 0000000..a854622
--- /dev/null
@@ -0,0 +1,174 @@
+from __future__ import annotations
+
+from functools import lru_cache
+from typing import Callable
+
+from ._cell_widths import CELL_WIDTHS
+
+# Ranges of unicode ordinals that produce a 1-cell wide character
+# This is non-exhaustive, but covers most common Western characters
+_SINGLE_CELL_UNICODE_RANGES: list[tuple[int, int]] = [
+    (0x20, 0x7E),  # Latin (excluding non-printable)
+    (0xA0, 0xAC),
+    (0xAE, 0x002FF),
+    (0x00370, 0x00482),  # Greek / Cyrillic
+    (0x02500, 0x025FC),  # Box drawing, box elements, geometric shapes
+    (0x02800, 0x028FF),  # Braille
+]
+
+# A set of characters that are a single cell wide
+_SINGLE_CELLS = frozenset(
+    [
+        character
+        for _start, _end in _SINGLE_CELL_UNICODE_RANGES
+        for character in map(chr, range(_start, _end + 1))
+    ]
+)
+
+# When called with a string this will return True if all
+# characters are single-cell, otherwise False
+_is_single_cell_widths: Callable[[str], bool] = _SINGLE_CELLS.issuperset
+
+
+@lru_cache(4096)
+def cached_cell_len(text: str) -> int:
+    """Get the number of cells required to display text.
+
+    This method always caches, which may use up a lot of memory. It is recommended to use
+    `cell_len` over this method.
+
+    Args:
+        text (str): Text to display.
+
+    Returns:
+        int: Get the number of cells required to display text.
+    """
+    if _is_single_cell_widths(text):
+        return len(text)
+    return sum(map(get_character_cell_size, text))
+
+
+def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> int:
+    """Get the number of cells required to display text.
+
+    Args:
+        text (str): Text to display.
+
+    Returns:
+        int: Get the number of cells required to display text.
+    """
+    if len(text) < 512:
+        return _cell_len(text)
+    if _is_single_cell_widths(text):
+        return len(text)
+    return sum(map(get_character_cell_size, text))
+
+
+@lru_cache(maxsize=4096)
+def get_character_cell_size(character: str) -> int:
+    """Get the cell size of a character.
+
+    Args:
+        character (str): A single character.
+
+    Returns:
+        int: Number of cells (0, 1 or 2) occupied by that character.
+    """
+    codepoint = ord(character)
+    _table = CELL_WIDTHS
+    lower_bound = 0
+    upper_bound = len(_table) - 1
+    index = (lower_bound + upper_bound) // 2
+    while True:
+        start, end, width = _table[index]
+        if codepoint < start:
+            upper_bound = index - 1
+        elif codepoint > end:
+            lower_bound = index + 1
+        else:
+            return 0 if width == -1 else width
+        if upper_bound < lower_bound:
+            break
+        index = (lower_bound + upper_bound) // 2
+    return 1
+
+
+def set_cell_size(text: str, total: int) -> str:
+    """Set the length of a string to fit within given number of cells."""
+
+    if _is_single_cell_widths(text):
+        size = len(text)
+        if size < total:
+            return text + " " * (total - size)
+        return text[:total]
+
+    if total <= 0:
+        return ""
+    cell_size = cell_len(text)
+    if cell_size == total:
+        return text
+    if cell_size < total:
+        return text + " " * (total - cell_size)
+
+    start = 0
+    end = len(text)
+
+    # Binary search until we find the right size
+    while True:
+        pos = (start + end) // 2
+        before = text[: pos + 1]
+        before_len = cell_len(before)
+        if before_len == total + 1 and cell_len(before[-1]) == 2:
+            return before[:-1] + " "
+        if before_len == total:
+            return before
+        if before_len > total:
+            end = pos
+        else:
+            start = pos
+
+
+def chop_cells(
+    text: str,
+    width: int,
+) -> list[str]:
+    """Split text into lines such that each line fits within the available (cell) width.
+
+    Args:
+        text: The text to fold such that it fits in the given width.
+        width: The width available (number of cells).
+
+    Returns:
+        A list of strings such that each string in the list has cell width
+        less than or equal to the available width.
+    """
+    _get_character_cell_size = get_character_cell_size
+    lines: list[list[str]] = [[]]
+
+    append_new_line = lines.append
+    append_to_last_line = lines[-1].append
+
+    total_width = 0
+
+    for character in text:
+        cell_width = _get_character_cell_size(character)
+        char_doesnt_fit = total_width + cell_width > width
+
+        if char_doesnt_fit:
+            append_new_line([character])
+            append_to_last_line = lines[-1].append
+            total_width = cell_width
+        else:
+            append_to_last_line(character)
+            total_width += cell_width
+
+    return ["".join(line) for line in lines]
+
+
+if __name__ == "__main__":  # pragma: no cover
+    print(get_character_cell_size("😽"))
+    for line in chop_cells("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", 8):
+        print(line)
+    for n in range(80, 1, -1):
+        print(set_cell_size("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", n) + "|")
+        print("x" * n)
diff --git a/.venv/Lib/site-packages/rich/color.py b/.venv/Lib/site-packages/rich/color.py
new file mode 100644 (file)
index 0000000..e2c23a6
--- /dev/null
@@ -0,0 +1,621 @@
+import re
+import sys
+from colorsys import rgb_to_hls
+from enum import IntEnum
+from functools import lru_cache
+from typing import TYPE_CHECKING, NamedTuple, Optional, Tuple
+
+from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE
+from .color_triplet import ColorTriplet
+from .repr import Result, rich_repr
+from .terminal_theme import DEFAULT_TERMINAL_THEME
+
+if TYPE_CHECKING:  # pragma: no cover
+    from .terminal_theme import TerminalTheme
+    from .text import Text
+
+
+WINDOWS = sys.platform == "win32"
+
+
+class ColorSystem(IntEnum):
+    """One of the 3 color system supported by terminals."""
+
+    STANDARD = 1
+    EIGHT_BIT = 2
+    TRUECOLOR = 3
+    WINDOWS = 4
+
+    def __repr__(self) -> str:
+        return f"ColorSystem.{self.name}"
+
+    def __str__(self) -> str:
+        return repr(self)
+
+
+class ColorType(IntEnum):
+    """Type of color stored in Color class."""
+
+    DEFAULT = 0
+    STANDARD = 1
+    EIGHT_BIT = 2
+    TRUECOLOR = 3
+    WINDOWS = 4
+
+    def __repr__(self) -> str:
+        return f"ColorType.{self.name}"
+
+
+ANSI_COLOR_NAMES = {
+    "black": 0,
+    "red": 1,
+    "green": 2,
+    "yellow": 3,
+    "blue": 4,
+    "magenta": 5,
+    "cyan": 6,
+    "white": 7,
+    "bright_black": 8,
+    "bright_red": 9,
+    "bright_green": 10,
+    "bright_yellow": 11,
+    "bright_blue": 12,
+    "bright_magenta": 13,
+    "bright_cyan": 14,
+    "bright_white": 15,
+    "grey0": 16,
+    "gray0": 16,
+    "navy_blue": 17,
+    "dark_blue": 18,
+    "blue3": 20,
+    "blue1": 21,
+    "dark_green": 22,
+    "deep_sky_blue4": 25,
+    "dodger_blue3": 26,
+    "dodger_blue2": 27,
+    "green4": 28,
+    "spring_green4": 29,
+    "turquoise4": 30,
+    "deep_sky_blue3": 32,
+    "dodger_blue1": 33,
+    "green3": 40,
+    "spring_green3": 41,
+    "dark_cyan": 36,
+    "light_sea_green": 37,
+    "deep_sky_blue2": 38,
+    "deep_sky_blue1": 39,
+    "spring_green2": 47,
+    "cyan3": 43,
+    "dark_turquoise": 44,
+    "turquoise2": 45,
+    "green1": 46,
+    "spring_green1": 48,
+    "medium_spring_green": 49,
+    "cyan2": 50,
+    "cyan1": 51,
+    "dark_red": 88,
+    "deep_pink4": 125,
+    "purple4": 55,
+    "purple3": 56,
+    "blue_violet": 57,
+    "orange4": 94,
+    "grey37": 59,
+    "gray37": 59,
+    "medium_purple4": 60,
+    "slate_blue3": 62,
+    "royal_blue1": 63,
+    "chartreuse4": 64,
+    "dark_sea_green4": 71,
+    "pale_turquoise4": 66,
+    "steel_blue": 67,
+    "steel_blue3": 68,
+    "cornflower_blue": 69,
+    "chartreuse3": 76,
+    "cadet_blue": 73,
+    "sky_blue3": 74,
+    "steel_blue1": 81,
+    "pale_green3": 114,
+    "sea_green3": 78,
+    "aquamarine3": 79,
+    "medium_turquoise": 80,
+    "chartreuse2": 112,
+    "sea_green2": 83,
+    "sea_green1": 85,
+    "aquamarine1": 122,
+    "dark_slate_gray2": 87,
+    "dark_magenta": 91,
+    "dark_violet": 128,
+    "purple": 129,
+    "light_pink4": 95,
+    "plum4": 96,
+    "medium_purple3": 98,
+    "slate_blue1": 99,
+    "yellow4": 106,
+    "wheat4": 101,
+    "grey53": 102,
+    "gray53": 102,
+    "light_slate_grey": 103,
+    "light_slate_gray": 103,
+    "medium_purple": 104,
+    "light_slate_blue": 105,
+    "dark_olive_green3": 149,
+    "dark_sea_green": 108,
+    "light_sky_blue3": 110,
+    "sky_blue2": 111,
+    "dark_sea_green3": 150,
+    "dark_slate_gray3": 116,
+    "sky_blue1": 117,
+    "chartreuse1": 118,
+    "light_green": 120,
+    "pale_green1": 156,
+    "dark_slate_gray1": 123,
+    "red3": 160,
+    "medium_violet_red": 126,
+    "magenta3": 164,
+    "dark_orange3": 166,
+    "indian_red": 167,
+    "hot_pink3": 168,
+    "medium_orchid3": 133,
+    "medium_orchid": 134,
+    "medium_purple2": 140,
+    "dark_goldenrod": 136,
+    "light_salmon3": 173,
+    "rosy_brown": 138,
+    "grey63": 139,
+    "gray63": 139,
+    "medium_purple1": 141,
+    "gold3": 178,
+    "dark_khaki": 143,
+    "navajo_white3": 144,
+    "grey69": 145,
+    "gray69": 145,
+    "light_steel_blue3": 146,
+    "light_steel_blue": 147,
+    "yellow3": 184,
+    "dark_sea_green2": 157,
+    "light_cyan3": 152,
+    "light_sky_blue1": 153,
+    "green_yellow": 154,
+    "dark_olive_green2": 155,
+    "dark_sea_green1": 193,
+    "pale_turquoise1": 159,
+    "deep_pink3": 162,
+    "magenta2": 200,
+    "hot_pink2": 169,
+    "orchid": 170,
+    "medium_orchid1": 207,
+    "orange3": 172,
+    "light_pink3": 174,
+    "pink3": 175,
+    "plum3": 176,
+    "violet": 177,
+    "light_goldenrod3": 179,
+    "tan": 180,
+    "misty_rose3": 181,
+    "thistle3": 182,
+    "plum2": 183,
+    "khaki3": 185,
+    "light_goldenrod2": 222,
+    "light_yellow3": 187,
+    "grey84": 188,
+    "gray84": 188,
+    "light_steel_blue1": 189,
+    "yellow2": 190,
+    "dark_olive_green1": 192,
+    "honeydew2": 194,
+    "light_cyan1": 195,
+    "red1": 196,
+    "deep_pink2": 197,
+    "deep_pink1": 199,
+    "magenta1": 201,
+    "orange_red1": 202,
+    "indian_red1": 204,
+    "hot_pink": 206,
+    "dark_orange": 208,
+    "salmon1": 209,
+    "light_coral": 210,
+    "pale_violet_red1": 211,
+    "orchid2": 212,
+    "orchid1": 213,
+    "orange1": 214,
+    "sandy_brown": 215,
+    "light_salmon1": 216,
+    "light_pink1": 217,
+    "pink1": 218,
+    "plum1": 219,
+    "gold1": 220,
+    "navajo_white1": 223,
+    "misty_rose1": 224,
+    "thistle1": 225,
+    "yellow1": 226,
+    "light_goldenrod1": 227,
+    "khaki1": 228,
+    "wheat1": 229,
+    "cornsilk1": 230,
+    "grey100": 231,
+    "gray100": 231,
+    "grey3": 232,
+    "gray3": 232,
+    "grey7": 233,
+    "gray7": 233,
+    "grey11": 234,
+    "gray11": 234,
+    "grey15": 235,
+    "gray15": 235,
+    "grey19": 236,
+    "gray19": 236,
+    "grey23": 237,
+    "gray23": 237,
+    "grey27": 238,
+    "gray27": 238,
+    "grey30": 239,
+    "gray30": 239,
+    "grey35": 240,
+    "gray35": 240,
+    "grey39": 241,
+    "gray39": 241,
+    "grey42": 242,
+    "gray42": 242,
+    "grey46": 243,
+    "gray46": 243,
+    "grey50": 244,
+    "gray50": 244,
+    "grey54": 245,
+    "gray54": 245,
+    "grey58": 246,
+    "gray58": 246,
+    "grey62": 247,
+    "gray62": 247,
+    "grey66": 248,
+    "gray66": 248,
+    "grey70": 249,
+    "gray70": 249,
+    "grey74": 250,
+    "gray74": 250,
+    "grey78": 251,
+    "gray78": 251,
+    "grey82": 252,
+    "gray82": 252,
+    "grey85": 253,
+    "gray85": 253,
+    "grey89": 254,
+    "gray89": 254,
+    "grey93": 255,
+    "gray93": 255,
+}
+
+
+class ColorParseError(Exception):
+    """The color could not be parsed."""
+
+
+RE_COLOR = re.compile(
+    r"""^
+\#([0-9a-f]{6})$|
+color\(([0-9]{1,3})\)$|
+rgb\(([\d\s,]+)\)$
+""",
+    re.VERBOSE,
+)
+
+
+@rich_repr
+class Color(NamedTuple):
+    """Terminal color definition."""
+
+    name: str
+    """The name of the color (typically the input to Color.parse)."""
+    type: ColorType
+    """The type of the color."""
+    number: Optional[int] = None
+    """The color number, if a standard color, or None."""
+    triplet: Optional[ColorTriplet] = None
+    """A triplet of color components, if an RGB color."""
+
+    def __rich__(self) -> "Text":
+        """Displays the actual color if Rich printed."""
+        from .style import Style
+        from .text import Text
+
+        return Text.assemble(
+            f"<color {self.name!r} ({self.type.name.lower()})",
+            ("⬤", Style(color=self)),
+            " >",
+        )
+
+    def __rich_repr__(self) -> Result:
+        yield self.name
+        yield self.type
+        yield "number", self.number, None
+        yield "triplet", self.triplet, None
+
+    @property
+    def system(self) -> ColorSystem:
+        """Get the native color system for this color."""
+        if self.type == ColorType.DEFAULT:
+            return ColorSystem.STANDARD
+        return ColorSystem(int(self.type))
+
+    @property
+    def is_system_defined(self) -> bool:
+        """Check if the color is ultimately defined by the system."""
+        return self.system not in (ColorSystem.EIGHT_BIT, ColorSystem.TRUECOLOR)
+
+    @property
+    def is_default(self) -> bool:
+        """Check if the color is a default color."""
+        return self.type == ColorType.DEFAULT
+
+    def get_truecolor(
+        self, theme: Optional["TerminalTheme"] = None, foreground: bool = True
+    ) -> ColorTriplet:
+        """Get an equivalent color triplet for this color.
+
+        Args:
+            theme (TerminalTheme, optional): Optional terminal theme, or None to use default. Defaults to None.
+            foreground (bool, optional): True for a foreground color, or False for background. Defaults to True.
+
+        Returns:
+            ColorTriplet: A color triplet containing RGB components.
+        """
+
+        if theme is None:
+            theme = DEFAULT_TERMINAL_THEME
+        if self.type == ColorType.TRUECOLOR:
+            assert self.triplet is not None
+            return self.triplet
+        elif self.type == ColorType.EIGHT_BIT:
+            assert self.number is not None
+            return EIGHT_BIT_PALETTE[self.number]
+        elif self.type == ColorType.STANDARD:
+            assert self.number is not None
+            return theme.ansi_colors[self.number]
+        elif self.type == ColorType.WINDOWS:
+            assert self.number is not None
+            return WINDOWS_PALETTE[self.number]
+        else:  # self.type == ColorType.DEFAULT:
+            assert self.number is None
+            return theme.foreground_color if foreground else theme.background_color
+
+    @classmethod
+    def from_ansi(cls, number: int) -> "Color":
+        """Create a Color number from it's 8-bit ansi number.
+
+        Args:
+            number (int): A number between 0-255 inclusive.
+
+        Returns:
+            Color: A new Color instance.
+        """
+        return cls(
+            name=f"color({number})",
+            type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT),
+            number=number,
+        )
+
+    @classmethod
+    def from_triplet(cls, triplet: "ColorTriplet") -> "Color":
+        """Create a truecolor RGB color from a triplet of values.
+
+        Args:
+            triplet (ColorTriplet): A color triplet containing red, green and blue components.
+
+        Returns:
+            Color: A new color object.
+        """
+        return cls(name=triplet.hex, type=ColorType.TRUECOLOR, triplet=triplet)
+
+    @classmethod
+    def from_rgb(cls, red: float, green: float, blue: float) -> "Color":
+        """Create a truecolor from three color components in the range(0->255).
+
+        Args:
+            red (float): Red component in range 0-255.
+            green (float): Green component in range 0-255.
+            blue (float): Blue component in range 0-255.
+
+        Returns:
+            Color: A new color object.
+        """
+        return cls.from_triplet(ColorTriplet(int(red), int(green), int(blue)))
+
+    @classmethod
+    def default(cls) -> "Color":
+        """Get a Color instance representing the default color.
+
+        Returns:
+            Color: Default color.
+        """
+        return cls(name="default", type=ColorType.DEFAULT)
+
+    @classmethod
+    @lru_cache(maxsize=1024)
+    def parse(cls, color: str) -> "Color":
+        """Parse a color definition."""
+        original_color = color
+        color = color.lower().strip()
+
+        if color == "default":
+            return cls(color, type=ColorType.DEFAULT)
+
+        color_number = ANSI_COLOR_NAMES.get(color)
+        if color_number is not None:
+            return cls(
+                color,
+                type=(ColorType.STANDARD if color_number < 16 else ColorType.EIGHT_BIT),
+                number=color_number,
+            )
+
+        color_match = RE_COLOR.match(color)
+        if color_match is None:
+            raise ColorParseError(f"{original_color!r} is not a valid color")
+
+        color_24, color_8, color_rgb = color_match.groups()
+        if color_24:
+            triplet = ColorTriplet(
+                int(color_24[0:2], 16), int(color_24[2:4], 16), int(color_24[4:6], 16)
+            )
+            return cls(color, ColorType.TRUECOLOR, triplet=triplet)
+
+        elif color_8:
+            number = int(color_8)
+            if number > 255:
+                raise ColorParseError(f"color number must be <= 255 in {color!r}")
+            return cls(
+                color,
+                type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT),
+                number=number,
+            )
+
+        else:  #  color_rgb:
+            components = color_rgb.split(",")
+            if len(components) != 3:
+                raise ColorParseError(
+                    f"expected three components in {original_color!r}"
+                )
+            red, green, blue = components
+            triplet = ColorTriplet(int(red), int(green), int(blue))
+            if not all(component <= 255 for component in triplet):
+                raise ColorParseError(
+                    f"color components must be <= 255 in {original_color!r}"
+                )
+            return cls(color, ColorType.TRUECOLOR, triplet=triplet)
+
+    @lru_cache(maxsize=1024)
+    def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]:
+        """Get the ANSI escape codes for this color."""
+        _type = self.type
+        if _type == ColorType.DEFAULT:
+            return ("39" if foreground else "49",)
+
+        elif _type == ColorType.WINDOWS:
+            number = self.number
+            assert number is not None
+            fore, back = (30, 40) if number < 8 else (82, 92)
+            return (str(fore + number if foreground else back + number),)
+
+        elif _type == ColorType.STANDARD:
+            number = self.number
+            assert number is not None
+            fore, back = (30, 40) if number < 8 else (82, 92)
+            return (str(fore + number if foreground else back + number),)
+
+        elif _type == ColorType.EIGHT_BIT:
+            assert self.number is not None
+            return ("38" if foreground else "48", "5", str(self.number))
+
+        else:  # self.standard == ColorStandard.TRUECOLOR:
+            assert self.triplet is not None
+            red, green, blue = self.triplet
+            return ("38" if foreground else "48", "2", str(red), str(green), str(blue))
+
+    @lru_cache(maxsize=1024)
+    def downgrade(self, system: ColorSystem) -> "Color":
+        """Downgrade a color system to a system with fewer colors."""
+
+        if self.type in (ColorType.DEFAULT, system):
+            return self
+        # Convert to 8-bit color from truecolor color
+        if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR:
+            assert self.triplet is not None
+            _h, l, s = rgb_to_hls(*self.triplet.normalized)
+            # If saturation is under 15% assume it is grayscale
+            if s < 0.15:
+                gray = round(l * 25.0)
+                if gray == 0:
+                    color_number = 16
+                elif gray == 25:
+                    color_number = 231
+                else:
+                    color_number = 231 + gray
+                return Color(self.name, ColorType.EIGHT_BIT, number=color_number)
+
+            red, green, blue = self.triplet
+            six_red = red / 95 if red < 95 else 1 + (red - 95) / 40
+            six_green = green / 95 if green < 95 else 1 + (green - 95) / 40
+            six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40
+
+            color_number = (
+                16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue)
+            )
+            return Color(self.name, ColorType.EIGHT_BIT, number=color_number)
+
+        # Convert to standard from truecolor or 8-bit
+        elif system == ColorSystem.STANDARD:
+            if self.system == ColorSystem.TRUECOLOR:
+                assert self.triplet is not None
+                triplet = self.triplet
+            else:  # self.system == ColorSystem.EIGHT_BIT
+                assert self.number is not None
+                triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number])
+
+            color_number = STANDARD_PALETTE.match(triplet)
+            return Color(self.name, ColorType.STANDARD, number=color_number)
+
+        elif system == ColorSystem.WINDOWS:
+            if self.system == ColorSystem.TRUECOLOR:
+                assert self.triplet is not None
+                triplet = self.triplet
+            else:  # self.system == ColorSystem.EIGHT_BIT
+                assert self.number is not None
+                if self.number < 16:
+                    return Color(self.name, ColorType.WINDOWS, number=self.number)
+                triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number])
+
+            color_number = WINDOWS_PALETTE.match(triplet)
+            return Color(self.name, ColorType.WINDOWS, number=color_number)
+
+        return self
+
+
+def parse_rgb_hex(hex_color: str) -> ColorTriplet:
+    """Parse six hex characters in to RGB triplet."""
+    assert len(hex_color) == 6, "must be 6 characters"
+    color = ColorTriplet(
+        int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16)
+    )
+    return color
+
+
+def blend_rgb(
+    color1: ColorTriplet, color2: ColorTriplet, cross_fade: float = 0.5
+) -> ColorTriplet:
+    """Blend one RGB color in to another."""
+    r1, g1, b1 = color1
+    r2, g2, b2 = color2
+    new_color = ColorTriplet(
+        int(r1 + (r2 - r1) * cross_fade),
+        int(g1 + (g2 - g1) * cross_fade),
+        int(b1 + (b2 - b1) * cross_fade),
+    )
+    return new_color
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from .console import Console
+    from .table import Table
+    from .text import Text
+
+    console = Console()
+
+    table = Table(show_footer=False, show_edge=True)
+    table.add_column("Color", width=10, overflow="ellipsis")
+    table.add_column("Number", justify="right", style="yellow")
+    table.add_column("Name", style="green")
+    table.add_column("Hex", style="blue")
+    table.add_column("RGB", style="magenta")
+
+    colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items())
+    for color_number, name in colors:
+        if "grey" in name:
+            continue
+        color_cell = Text(" " * 10, style=f"on {name}")
+        if color_number < 16:
+            table.add_row(color_cell, f"{color_number}", Text(f'"{name}"'))
+        else:
+            color = EIGHT_BIT_PALETTE[color_number]  # type: ignore[has-type]
+            table.add_row(
+                color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb
+            )
+
+    console.print(table)
diff --git a/.venv/Lib/site-packages/rich/color_triplet.py b/.venv/Lib/site-packages/rich/color_triplet.py
new file mode 100644 (file)
index 0000000..02cab32
--- /dev/null
@@ -0,0 +1,38 @@
+from typing import NamedTuple, Tuple
+
+
+class ColorTriplet(NamedTuple):
+    """The red, green, and blue components of a color."""
+
+    red: int
+    """Red component in 0 to 255 range."""
+    green: int
+    """Green component in 0 to 255 range."""
+    blue: int
+    """Blue component in 0 to 255 range."""
+
+    @property
+    def hex(self) -> str:
+        """get the color triplet in CSS style."""
+        red, green, blue = self
+        return f"#{red:02x}{green:02x}{blue:02x}"
+
+    @property
+    def rgb(self) -> str:
+        """The color in RGB format.
+
+        Returns:
+            str: An rgb color, e.g. ``"rgb(100,23,255)"``.
+        """
+        red, green, blue = self
+        return f"rgb({red},{green},{blue})"
+
+    @property
+    def normalized(self) -> Tuple[float, float, float]:
+        """Convert components into floats between 0 and 1.
+
+        Returns:
+            Tuple[float, float, float]: A tuple of three normalized colour components.
+        """
+        red, green, blue = self
+        return red / 255.0, green / 255.0, blue / 255.0
diff --git a/.venv/Lib/site-packages/rich/columns.py b/.venv/Lib/site-packages/rich/columns.py
new file mode 100644 (file)
index 0000000..669a3a7
--- /dev/null
@@ -0,0 +1,187 @@
+from collections import defaultdict
+from itertools import chain
+from operator import itemgetter
+from typing import Dict, Iterable, List, Optional, Tuple
+
+from .align import Align, AlignMethod
+from .console import Console, ConsoleOptions, RenderableType, RenderResult
+from .constrain import Constrain
+from .measure import Measurement
+from .padding import Padding, PaddingDimensions
+from .table import Table
+from .text import TextType
+from .jupyter import JupyterMixin
+
+
+class Columns(JupyterMixin):
+    """Display renderables in neat columns.
+
+    Args:
+        renderables (Iterable[RenderableType]): Any number of Rich renderables (including str).
+        width (int, optional): The desired width of the columns, or None to auto detect. Defaults to None.
+        padding (PaddingDimensions, optional): Optional padding around cells. Defaults to (0, 1).
+        expand (bool, optional): Expand columns to full width. Defaults to False.
+        equal (bool, optional): Arrange in to equal sized columns. Defaults to False.
+        column_first (bool, optional): Align items from top to bottom (rather than left to right). Defaults to False.
+        right_to_left (bool, optional): Start column from right hand side. Defaults to False.
+        align (str, optional): Align value ("left", "right", or "center") or None for default. Defaults to None.
+        title (TextType, optional): Optional title for Columns.
+    """
+
+    def __init__(
+        self,
+        renderables: Optional[Iterable[RenderableType]] = None,
+        padding: PaddingDimensions = (0, 1),
+        *,
+        width: Optional[int] = None,
+        expand: bool = False,
+        equal: bool = False,
+        column_first: bool = False,
+        right_to_left: bool = False,
+        align: Optional[AlignMethod] = None,
+        title: Optional[TextType] = None,
+    ) -> None:
+        self.renderables = list(renderables or [])
+        self.width = width
+        self.padding = padding
+        self.expand = expand
+        self.equal = equal
+        self.column_first = column_first
+        self.right_to_left = right_to_left
+        self.align: Optional[AlignMethod] = align
+        self.title = title
+
+    def add_renderable(self, renderable: RenderableType) -> None:
+        """Add a renderable to the columns.
+
+        Args:
+            renderable (RenderableType): Any renderable object.
+        """
+        self.renderables.append(renderable)
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        render_str = console.render_str
+        renderables = [
+            render_str(renderable) if isinstance(renderable, str) else renderable
+            for renderable in self.renderables
+        ]
+        if not renderables:
+            return
+        _top, right, _bottom, left = Padding.unpack(self.padding)
+        width_padding = max(left, right)
+        max_width = options.max_width
+        widths: Dict[int, int] = defaultdict(int)
+        column_count = len(renderables)
+
+        get_measurement = Measurement.get
+        renderable_widths = [
+            get_measurement(console, options, renderable).maximum
+            for renderable in renderables
+        ]
+        if self.equal:
+            renderable_widths = [max(renderable_widths)] * len(renderable_widths)
+
+        def iter_renderables(
+            column_count: int,
+        ) -> Iterable[Tuple[int, Optional[RenderableType]]]:
+            item_count = len(renderables)
+            if self.column_first:
+                width_renderables = list(zip(renderable_widths, renderables))
+
+                column_lengths: List[int] = [item_count // column_count] * column_count
+                for col_no in range(item_count % column_count):
+                    column_lengths[col_no] += 1
+
+                row_count = (item_count + column_count - 1) // column_count
+                cells = [[-1] * column_count for _ in range(row_count)]
+                row = col = 0
+                for index in range(item_count):
+                    cells[row][col] = index
+                    column_lengths[col] -= 1
+                    if column_lengths[col]:
+                        row += 1
+                    else:
+                        col += 1
+                        row = 0
+                for index in chain.from_iterable(cells):
+                    if index == -1:
+                        break
+                    yield width_renderables[index]
+            else:
+                yield from zip(renderable_widths, renderables)
+            # Pad odd elements with spaces
+            if item_count % column_count:
+                for _ in range(column_count - (item_count % column_count)):
+                    yield 0, None
+
+        table = Table.grid(padding=self.padding, collapse_padding=True, pad_edge=False)
+        table.expand = self.expand
+        table.title = self.title
+
+        if self.width is not None:
+            column_count = (max_width) // (self.width + width_padding)
+            for _ in range(column_count):
+                table.add_column(width=self.width)
+        else:
+            while column_count > 1:
+                widths.clear()
+                column_no = 0
+                for renderable_width, _ in iter_renderables(column_count):
+                    widths[column_no] = max(widths[column_no], renderable_width)
+                    total_width = sum(widths.values()) + width_padding * (
+                        len(widths) - 1
+                    )
+                    if total_width > max_width:
+                        column_count = len(widths) - 1
+                        break
+                    else:
+                        column_no = (column_no + 1) % column_count
+                else:
+                    break
+
+        get_renderable = itemgetter(1)
+        _renderables = [
+            get_renderable(_renderable)
+            for _renderable in iter_renderables(column_count)
+        ]
+        if self.equal:
+            _renderables = [
+                None
+                if renderable is None
+                else Constrain(renderable, renderable_widths[0])
+                for renderable in _renderables
+            ]
+        if self.align:
+            align = self.align
+            _Align = Align
+            _renderables = [
+                None if renderable is None else _Align(renderable, align)
+                for renderable in _renderables
+            ]
+
+        right_to_left = self.right_to_left
+        add_row = table.add_row
+        for start in range(0, len(_renderables), column_count):
+            row = _renderables[start : start + column_count]
+            if right_to_left:
+                row = row[::-1]
+            add_row(*row)
+        yield table
+
+
+if __name__ == "__main__":  # pragma: no cover
+    import os
+
+    console = Console()
+
+    files = [f"{i} {s}" for i, s in enumerate(sorted(os.listdir()))]
+    columns = Columns(files, padding=(0, 1), expand=False, equal=False)
+    console.print(columns)
+    console.rule()
+    columns.column_first = True
+    console.print(columns)
+    columns.right_to_left = True
+    console.rule()
+    console.print(columns)
diff --git a/.venv/Lib/site-packages/rich/console.py b/.venv/Lib/site-packages/rich/console.py
new file mode 100644 (file)
index 0000000..6725e40
--- /dev/null
@@ -0,0 +1,2675 @@
+import inspect
+import os
+import sys
+import threading
+import zlib
+from abc import ABC, abstractmethod
+from dataclasses import dataclass, field
+from datetime import datetime
+from functools import wraps
+from getpass import getpass
+from html import escape
+from inspect import isclass
+from itertools import islice
+from math import ceil
+from time import monotonic
+from types import FrameType, ModuleType, TracebackType
+from typing import (
+    IO,
+    TYPE_CHECKING,
+    Any,
+    Callable,
+    Dict,
+    Iterable,
+    List,
+    Mapping,
+    NamedTuple,
+    Optional,
+    TextIO,
+    Tuple,
+    Type,
+    Union,
+    cast,
+)
+
+from rich._null_file import NULL_FILE
+
+if sys.version_info >= (3, 8):
+    from typing import Literal, Protocol, runtime_checkable
+else:
+    from typing_extensions import (
+        Literal,
+        Protocol,
+        runtime_checkable,
+    )  # pragma: no cover
+
+from . import errors, themes
+from ._emoji_replace import _emoji_replace
+from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT
+from ._fileno import get_fileno
+from ._log_render import FormatTimeCallable, LogRender
+from .align import Align, AlignMethod
+from .color import ColorSystem, blend_rgb
+from .control import Control
+from .emoji import EmojiVariant
+from .highlighter import NullHighlighter, ReprHighlighter
+from .markup import render as render_markup
+from .measure import Measurement, measure_renderables
+from .pager import Pager, SystemPager
+from .pretty import Pretty, is_expandable
+from .protocol import rich_cast
+from .region import Region
+from .scope import render_scope
+from .screen import Screen
+from .segment import Segment
+from .style import Style, StyleType
+from .styled import Styled
+from .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme
+from .text import Text, TextType
+from .theme import Theme, ThemeStack
+
+if TYPE_CHECKING:
+    from ._windows import WindowsConsoleFeatures
+    from .live import Live
+    from .status import Status
+
+JUPYTER_DEFAULT_COLUMNS = 115
+JUPYTER_DEFAULT_LINES = 100
+WINDOWS = sys.platform == "win32"
+
+HighlighterType = Callable[[Union[str, "Text"]], "Text"]
+JustifyMethod = Literal["default", "left", "center", "right", "full"]
+OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"]
+
+
+class NoChange:
+    pass
+
+
+NO_CHANGE = NoChange()
+
+try:
+    _STDIN_FILENO = sys.__stdin__.fileno()  # type: ignore[union-attr]
+except Exception:
+    _STDIN_FILENO = 0
+try:
+    _STDOUT_FILENO = sys.__stdout__.fileno()  # type: ignore[union-attr]
+except Exception:
+    _STDOUT_FILENO = 1
+try:
+    _STDERR_FILENO = sys.__stderr__.fileno()  # type: ignore[union-attr]
+except Exception:
+    _STDERR_FILENO = 2
+
+_STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO)
+_STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO)
+
+
+_TERM_COLORS = {
+    "kitty": ColorSystem.EIGHT_BIT,
+    "256color": ColorSystem.EIGHT_BIT,
+    "16color": ColorSystem.STANDARD,
+}
+
+
+class ConsoleDimensions(NamedTuple):
+    """Size of the terminal."""
+
+    width: int
+    """The width of the console in 'cells'."""
+    height: int
+    """The height of the console in lines."""
+
+
+@dataclass
+class ConsoleOptions:
+    """Options for __rich_console__ method."""
+
+    size: ConsoleDimensions
+    """Size of console."""
+    legacy_windows: bool
+    """legacy_windows: flag for legacy windows."""
+    min_width: int
+    """Minimum width of renderable."""
+    max_width: int
+    """Maximum width of renderable."""
+    is_terminal: bool
+    """True if the target is a terminal, otherwise False."""
+    encoding: str
+    """Encoding of terminal."""
+    max_height: int
+    """Height of container (starts as terminal)"""
+    justify: Optional[JustifyMethod] = None
+    """Justify value override for renderable."""
+    overflow: Optional[OverflowMethod] = None
+    """Overflow value override for renderable."""
+    no_wrap: Optional[bool] = False
+    """Disable wrapping for text."""
+    highlight: Optional[bool] = None
+    """Highlight override for render_str."""
+    markup: Optional[bool] = None
+    """Enable markup when rendering strings."""
+    height: Optional[int] = None
+
+    @property
+    def ascii_only(self) -> bool:
+        """Check if renderables should use ascii only."""
+        return not self.encoding.startswith("utf")
+
+    def copy(self) -> "ConsoleOptions":
+        """Return a copy of the options.
+
+        Returns:
+            ConsoleOptions: a copy of self.
+        """
+        options: ConsoleOptions = ConsoleOptions.__new__(ConsoleOptions)
+        options.__dict__ = self.__dict__.copy()
+        return options
+
+    def update(
+        self,
+        *,
+        width: Union[int, NoChange] = NO_CHANGE,
+        min_width: Union[int, NoChange] = NO_CHANGE,
+        max_width: Union[int, NoChange] = NO_CHANGE,
+        justify: Union[Optional[JustifyMethod], NoChange] = NO_CHANGE,
+        overflow: Union[Optional[OverflowMethod], NoChange] = NO_CHANGE,
+        no_wrap: Union[Optional[bool], NoChange] = NO_CHANGE,
+        highlight: Union[Optional[bool], NoChange] = NO_CHANGE,
+        markup: Union[Optional[bool], NoChange] = NO_CHANGE,
+        height: Union[Optional[int], NoChange] = NO_CHANGE,
+    ) -> "ConsoleOptions":
+        """Update values, return a copy."""
+        options = self.copy()
+        if not isinstance(width, NoChange):
+            options.min_width = options.max_width = max(0, width)
+        if not isinstance(min_width, NoChange):
+            options.min_width = min_width
+        if not isinstance(max_width, NoChange):
+            options.max_width = max_width
+        if not isinstance(justify, NoChange):
+            options.justify = justify
+        if not isinstance(overflow, NoChange):
+            options.overflow = overflow
+        if not isinstance(no_wrap, NoChange):
+            options.no_wrap = no_wrap
+        if not isinstance(highlight, NoChange):
+            options.highlight = highlight
+        if not isinstance(markup, NoChange):
+            options.markup = markup
+        if not isinstance(height, NoChange):
+            if height is not None:
+                options.max_height = height
+            options.height = None if height is None else max(0, height)
+        return options
+
+    def update_width(self, width: int) -> "ConsoleOptions":
+        """Update just the width, return a copy.
+
+        Args:
+            width (int): New width (sets both min_width and max_width)
+
+        Returns:
+            ~ConsoleOptions: New console options instance.
+        """
+        options = self.copy()
+        options.min_width = options.max_width = max(0, width)
+        return options
+
+    def update_height(self, height: int) -> "ConsoleOptions":
+        """Update the height, and return a copy.
+
+        Args:
+            height (int): New height
+
+        Returns:
+            ~ConsoleOptions: New Console options instance.
+        """
+        options = self.copy()
+        options.max_height = options.height = height
+        return options
+
+    def reset_height(self) -> "ConsoleOptions":
+        """Return a copy of the options with height set to ``None``.
+
+        Returns:
+            ~ConsoleOptions: New console options instance.
+        """
+        options = self.copy()
+        options.height = None
+        return options
+
+    def update_dimensions(self, width: int, height: int) -> "ConsoleOptions":
+        """Update the width and height, and return a copy.
+
+        Args:
+            width (int): New width (sets both min_width and max_width).
+            height (int): New height.
+
+        Returns:
+            ~ConsoleOptions: New console options instance.
+        """
+        options = self.copy()
+        options.min_width = options.max_width = max(0, width)
+        options.height = options.max_height = height
+        return options
+
+
+@runtime_checkable
+class RichCast(Protocol):
+    """An object that may be 'cast' to a console renderable."""
+
+    def __rich__(
+        self,
+    ) -> Union["ConsoleRenderable", "RichCast", str]:  # pragma: no cover
+        ...
+
+
+@runtime_checkable
+class ConsoleRenderable(Protocol):
+    """An object that supports the console protocol."""
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":  # pragma: no cover
+        ...
+
+
+# A type that may be rendered by Console.
+RenderableType = Union[ConsoleRenderable, RichCast, str]
+"""A string or any object that may be rendered by Rich."""
+
+# The result of calling a __rich_console__ method.
+RenderResult = Iterable[Union[RenderableType, Segment]]
+
+_null_highlighter = NullHighlighter()
+
+
+class CaptureError(Exception):
+    """An error in the Capture context manager."""
+
+
+class NewLine:
+    """A renderable to generate new line(s)"""
+
+    def __init__(self, count: int = 1) -> None:
+        self.count = count
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> Iterable[Segment]:
+        yield Segment("\n" * self.count)
+
+
+class ScreenUpdate:
+    """Render a list of lines at a given offset."""
+
+    def __init__(self, lines: List[List[Segment]], x: int, y: int) -> None:
+        self._lines = lines
+        self.x = x
+        self.y = y
+
+    def __rich_console__(
+        self, console: "Console", options: ConsoleOptions
+    ) -> RenderResult:
+        x = self.x
+        move_to = Control.move_to
+        for offset, line in enumerate(self._lines, self.y):
+            yield move_to(x, offset)
+            yield from line
+
+
+class Capture:
+    """Context manager to capture the result of printing to the console.
+    See :meth:`~rich.console.Console.capture` for how to use.
+
+    Args:
+        console (Console): A console instance to capture output.
+    """
+
+    def __init__(self, console: "Console") -> None:
+        self._console = console
+        self._result: Optional[str] = None
+
+    def __enter__(self) -> "Capture":
+        self._console.begin_capture()
+        return self
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc_val: Optional[BaseException],
+        exc_tb: Optional[TracebackType],
+    ) -> None:
+        self._result = self._console.end_capture()
+
+    def get(self) -> str:
+        """Get the result of the capture."""
+        if self._result is None:
+            raise CaptureError(
+                "Capture result is not available until context manager exits."
+            )
+        return self._result
+
+
+class ThemeContext:
+    """A context manager to use a temporary theme. See :meth:`~rich.console.Console.use_theme` for usage."""
+
+    def __init__(self, console: "Console", theme: Theme, inherit: bool = True) -> None:
+        self.console = console
+        self.theme = theme
+        self.inherit = inherit
+
+    def __enter__(self) -> "ThemeContext":
+        self.console.push_theme(self.theme)
+        return self
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc_val: Optional[BaseException],
+        exc_tb: Optional[TracebackType],
+    ) -> None:
+        self.console.pop_theme()
+
+
+class PagerContext:
+    """A context manager that 'pages' content. See :meth:`~rich.console.Console.pager` for usage."""
+
+    def __init__(
+        self,
+        console: "Console",
+        pager: Optional[Pager] = None,
+        styles: bool = False,
+        links: bool = False,
+    ) -> None:
+        self._console = console
+        self.pager = SystemPager() if pager is None else pager
+        self.styles = styles
+        self.links = links
+
+    def __enter__(self) -> "PagerContext":
+        self._console._enter_buffer()
+        return self
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc_val: Optional[BaseException],
+        exc_tb: Optional[TracebackType],
+    ) -> None:
+        if exc_type is None:
+            with self._console._lock:
+                buffer: List[Segment] = self._console._buffer[:]
+                del self._console._buffer[:]
+                segments: Iterable[Segment] = buffer
+                if not self.styles:
+                    segments = Segment.strip_styles(segments)
+                elif not self.links:
+                    segments = Segment.strip_links(segments)
+                content = self._console._render_buffer(segments)
+            self.pager.show(content)
+        self._console._exit_buffer()
+
+
+class ScreenContext:
+    """A context manager that enables an alternative screen. See :meth:`~rich.console.Console.screen` for usage."""
+
+    def __init__(
+        self, console: "Console", hide_cursor: bool, style: StyleType = ""
+    ) -> None:
+        self.console = console
+        self.hide_cursor = hide_cursor
+        self.screen = Screen(style=style)
+        self._changed = False
+
+    def update(
+        self, *renderables: RenderableType, style: Optional[StyleType] = None
+    ) -> None:
+        """Update the screen.
+
+        Args:
+            renderable (RenderableType, optional): Optional renderable to replace current renderable,
+                or None for no change. Defaults to None.
+            style: (Style, optional): Replacement style, or None for no change. Defaults to None.
+        """
+        if renderables:
+            self.screen.renderable = (
+                Group(*renderables) if len(renderables) > 1 else renderables[0]
+            )
+        if style is not None:
+            self.screen.style = style
+        self.console.print(self.screen, end="")
+
+    def __enter__(self) -> "ScreenContext":
+        self._changed = self.console.set_alt_screen(True)
+        if self._changed and self.hide_cursor:
+            self.console.show_cursor(False)
+        return self
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc_val: Optional[BaseException],
+        exc_tb: Optional[TracebackType],
+    ) -> None:
+        if self._changed:
+            self.console.set_alt_screen(False)
+            if self.hide_cursor:
+                self.console.show_cursor(True)
+
+
+class Group:
+    """Takes a group of renderables and returns a renderable object that renders the group.
+
+    Args:
+        renderables (Iterable[RenderableType]): An iterable of renderable objects.
+        fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True.
+    """
+
+    def __init__(self, *renderables: "RenderableType", fit: bool = True) -> None:
+        self._renderables = renderables
+        self.fit = fit
+        self._render: Optional[List[RenderableType]] = None
+
+    @property
+    def renderables(self) -> List["RenderableType"]:
+        if self._render is None:
+            self._render = list(self._renderables)
+        return self._render
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "Measurement":
+        if self.fit:
+            return measure_renderables(console, options, self.renderables)
+        else:
+            return Measurement(options.max_width, options.max_width)
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> RenderResult:
+        yield from self.renderables
+
+
+def group(fit: bool = True) -> Callable[..., Callable[..., Group]]:
+    """A decorator that turns an iterable of renderables in to a group.
+
+    Args:
+        fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True.
+    """
+
+    def decorator(
+        method: Callable[..., Iterable[RenderableType]],
+    ) -> Callable[..., Group]:
+        """Convert a method that returns an iterable of renderables in to a Group."""
+
+        @wraps(method)
+        def _replace(*args: Any, **kwargs: Any) -> Group:
+            renderables = method(*args, **kwargs)
+            return Group(*renderables, fit=fit)
+
+        return _replace
+
+    return decorator
+
+
+def _is_jupyter() -> bool:  # pragma: no cover
+    """Check if we're running in a Jupyter notebook."""
+    try:
+        get_ipython  # type: ignore[name-defined]
+    except NameError:
+        return False
+    ipython = get_ipython()  # type: ignore[name-defined]
+    shell = ipython.__class__.__name__
+    if (
+        "google.colab" in str(ipython.__class__)
+        or os.getenv("DATABRICKS_RUNTIME_VERSION")
+        or shell == "ZMQInteractiveShell"
+    ):
+        return True  # Jupyter notebook or qtconsole
+    elif shell == "TerminalInteractiveShell":
+        return False  # Terminal running IPython
+    else:
+        return False  # Other type (?)
+
+
+COLOR_SYSTEMS = {
+    "standard": ColorSystem.STANDARD,
+    "256": ColorSystem.EIGHT_BIT,
+    "truecolor": ColorSystem.TRUECOLOR,
+    "windows": ColorSystem.WINDOWS,
+}
+
+_COLOR_SYSTEMS_NAMES = {system: name for name, system in COLOR_SYSTEMS.items()}
+
+
+@dataclass
+class ConsoleThreadLocals(threading.local):
+    """Thread local values for Console context."""
+
+    theme_stack: ThemeStack
+    buffer: List[Segment] = field(default_factory=list)
+    buffer_index: int = 0
+
+
+class RenderHook(ABC):
+    """Provides hooks in to the render process."""
+
+    @abstractmethod
+    def process_renderables(
+        self, renderables: List[ConsoleRenderable]
+    ) -> List[ConsoleRenderable]:
+        """Called with a list of objects to render.
+
+        This method can return a new list of renderables, or modify and return the same list.
+
+        Args:
+            renderables (List[ConsoleRenderable]): A number of renderable objects.
+
+        Returns:
+            List[ConsoleRenderable]: A replacement list of renderables.
+        """
+
+
+_windows_console_features: Optional["WindowsConsoleFeatures"] = None
+
+
+def get_windows_console_features() -> "WindowsConsoleFeatures":  # pragma: no cover
+    global _windows_console_features
+    if _windows_console_features is not None:
+        return _windows_console_features
+    from ._windows import get_windows_console_features
+
+    _windows_console_features = get_windows_console_features()
+    return _windows_console_features
+
+
+def detect_legacy_windows() -> bool:
+    """Detect legacy Windows."""
+    return WINDOWS and not get_windows_console_features().vt
+
+
+class Console:
+    """A high level console interface.
+
+    Args:
+        color_system (str, optional): The color system supported by your terminal,
+            either ``"standard"``, ``"256"`` or ``"truecolor"``. Leave as ``"auto"`` to autodetect.
+        force_terminal (Optional[bool], optional): Enable/disable terminal control codes, or None to auto-detect terminal. Defaults to None.
+        force_jupyter (Optional[bool], optional): Enable/disable Jupyter rendering, or None to auto-detect Jupyter. Defaults to None.
+        force_interactive (Optional[bool], optional): Enable/disable interactive mode, or None to auto detect. Defaults to None.
+        soft_wrap (Optional[bool], optional): Set soft wrap default on print method. Defaults to False.
+        theme (Theme, optional): An optional style theme object, or ``None`` for default theme.
+        stderr (bool, optional): Use stderr rather than stdout if ``file`` is not specified. Defaults to False.
+        file (IO, optional): A file object where the console should write to. Defaults to stdout.
+        quiet (bool, Optional): Boolean to suppress all output. Defaults to False.
+        width (int, optional): The width of the terminal. Leave as default to auto-detect width.
+        height (int, optional): The height of the terminal. Leave as default to auto-detect height.
+        style (StyleType, optional): Style to apply to all output, or None for no style. Defaults to None.
+        no_color (Optional[bool], optional): Enabled no color mode, or None to auto detect. Defaults to None.
+        tab_size (int, optional): Number of spaces used to replace a tab character. Defaults to 8.
+        record (bool, optional): Boolean to enable recording of terminal output,
+            required to call :meth:`export_html`, :meth:`export_svg`, and :meth:`export_text`. Defaults to False.
+        markup (bool, optional): Boolean to enable :ref:`console_markup`. Defaults to True.
+        emoji (bool, optional): Enable emoji code. Defaults to True.
+        emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None.
+        highlight (bool, optional): Enable automatic highlighting. Defaults to True.
+        log_time (bool, optional): Boolean to enable logging of time by :meth:`log` methods. Defaults to True.
+        log_path (bool, optional): Boolean to enable the logging of the caller by :meth:`log`. Defaults to True.
+        log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%X] ".
+        highlighter (HighlighterType, optional): Default highlighter.
+        legacy_windows (bool, optional): Enable legacy Windows mode, or ``None`` to auto detect. Defaults to ``None``.
+        safe_box (bool, optional): Restrict box options that don't render on legacy Windows.
+        get_datetime (Callable[[], datetime], optional): Callable that gets the current time as a datetime.datetime object (used by Console.log),
+            or None for datetime.now.
+        get_time (Callable[[], time], optional): Callable that gets the current time in seconds, default uses time.monotonic.
+    """
+
+    _environ: Mapping[str, str] = os.environ
+
+    def __init__(
+        self,
+        *,
+        color_system: Optional[
+            Literal["auto", "standard", "256", "truecolor", "windows"]
+        ] = "auto",
+        force_terminal: Optional[bool] = None,
+        force_jupyter: Optional[bool] = None,
+        force_interactive: Optional[bool] = None,
+        soft_wrap: bool = False,
+        theme: Optional[Theme] = None,
+        stderr: bool = False,
+        file: Optional[IO[str]] = None,
+        quiet: bool = False,
+        width: Optional[int] = None,
+        height: Optional[int] = None,
+        style: Optional[StyleType] = None,
+        no_color: Optional[bool] = None,
+        tab_size: int = 8,
+        record: bool = False,
+        markup: bool = True,
+        emoji: bool = True,
+        emoji_variant: Optional[EmojiVariant] = None,
+        highlight: bool = True,
+        log_time: bool = True,
+        log_path: bool = True,
+        log_time_format: Union[str, FormatTimeCallable] = "[%X]",
+        highlighter: Optional["HighlighterType"] = ReprHighlighter(),
+        legacy_windows: Optional[bool] = None,
+        safe_box: bool = True,
+        get_datetime: Optional[Callable[[], datetime]] = None,
+        get_time: Optional[Callable[[], float]] = None,
+        _environ: Optional[Mapping[str, str]] = None,
+    ):
+        # Copy of os.environ allows us to replace it for testing
+        if _environ is not None:
+            self._environ = _environ
+
+        self.is_jupyter = _is_jupyter() if force_jupyter is None else force_jupyter
+        if self.is_jupyter:
+            if width is None:
+                jupyter_columns = self._environ.get("JUPYTER_COLUMNS")
+                if jupyter_columns is not None and jupyter_columns.isdigit():
+                    width = int(jupyter_columns)
+                else:
+                    width = JUPYTER_DEFAULT_COLUMNS
+            if height is None:
+                jupyter_lines = self._environ.get("JUPYTER_LINES")
+                if jupyter_lines is not None and jupyter_lines.isdigit():
+                    height = int(jupyter_lines)
+                else:
+                    height = JUPYTER_DEFAULT_LINES
+
+        self.tab_size = tab_size
+        self.record = record
+        self._markup = markup
+        self._emoji = emoji
+        self._emoji_variant: Optional[EmojiVariant] = emoji_variant
+        self._highlight = highlight
+        self.legacy_windows: bool = (
+            (detect_legacy_windows() and not self.is_jupyter)
+            if legacy_windows is None
+            else legacy_windows
+        )
+
+        if width is None:
+            columns = self._environ.get("COLUMNS")
+            if columns is not None and columns.isdigit():
+                width = int(columns) - self.legacy_windows
+        if height is None:
+            lines = self._environ.get("LINES")
+            if lines is not None and lines.isdigit():
+                height = int(lines)
+
+        self.soft_wrap = soft_wrap
+        self._width = width
+        self._height = height
+
+        self._color_system: Optional[ColorSystem]
+
+        self._force_terminal = None
+        if force_terminal is not None:
+            self._force_terminal = force_terminal
+
+        self._file = file
+        self.quiet = quiet
+        self.stderr = stderr
+
+        if color_system is None:
+            self._color_system = None
+        elif color_system == "auto":
+            self._color_system = self._detect_color_system()
+        else:
+            self._color_system = COLOR_SYSTEMS[color_system]
+
+        self._lock = threading.RLock()
+        self._log_render = LogRender(
+            show_time=log_time,
+            show_path=log_path,
+            time_format=log_time_format,
+        )
+        self.highlighter: HighlighterType = highlighter or _null_highlighter
+        self.safe_box = safe_box
+        self.get_datetime = get_datetime or datetime.now
+        self.get_time = get_time or monotonic
+        self.style = style
+        self.no_color = (
+            no_color
+            if no_color is not None
+            else self._environ.get("NO_COLOR", "") != ""
+        )
+        self.is_interactive = (
+            (self.is_terminal and not self.is_dumb_terminal)
+            if force_interactive is None
+            else force_interactive
+        )
+
+        self._record_buffer_lock = threading.RLock()
+        self._thread_locals = ConsoleThreadLocals(
+            theme_stack=ThemeStack(themes.DEFAULT if theme is None else theme)
+        )
+        self._record_buffer: List[Segment] = []
+        self._render_hooks: List[RenderHook] = []
+        self._live: Optional["Live"] = None
+        self._is_alt_screen = False
+
+    def __repr__(self) -> str:
+        return f"<console width={self.width} {self._color_system!s}>"
+
+    @property
+    def file(self) -> IO[str]:
+        """Get the file object to write to."""
+        file = self._file or (sys.stderr if self.stderr else sys.stdout)
+        file = getattr(file, "rich_proxied_file", file)
+        if file is None:
+            file = NULL_FILE
+        return file
+
+    @file.setter
+    def file(self, new_file: IO[str]) -> None:
+        """Set a new file object."""
+        self._file = new_file
+
+    @property
+    def _buffer(self) -> List[Segment]:
+        """Get a thread local buffer."""
+        return self._thread_locals.buffer
+
+    @property
+    def _buffer_index(self) -> int:
+        """Get a thread local buffer."""
+        return self._thread_locals.buffer_index
+
+    @_buffer_index.setter
+    def _buffer_index(self, value: int) -> None:
+        self._thread_locals.buffer_index = value
+
+    @property
+    def _theme_stack(self) -> ThemeStack:
+        """Get the thread local theme stack."""
+        return self._thread_locals.theme_stack
+
+    def _detect_color_system(self) -> Optional[ColorSystem]:
+        """Detect color system from env vars."""
+        if self.is_jupyter:
+            return ColorSystem.TRUECOLOR
+        if not self.is_terminal or self.is_dumb_terminal:
+            return None
+        if WINDOWS:  # pragma: no cover
+            if self.legacy_windows:  # pragma: no cover
+                return ColorSystem.WINDOWS
+            windows_console_features = get_windows_console_features()
+            return (
+                ColorSystem.TRUECOLOR
+                if windows_console_features.truecolor
+                else ColorSystem.EIGHT_BIT
+            )
+        else:
+            color_term = self._environ.get("COLORTERM", "").strip().lower()
+            if color_term in ("truecolor", "24bit"):
+                return ColorSystem.TRUECOLOR
+            term = self._environ.get("TERM", "").strip().lower()
+            _term_name, _hyphen, colors = term.rpartition("-")
+            color_system = _TERM_COLORS.get(colors, ColorSystem.STANDARD)
+            return color_system
+
+    def _enter_buffer(self) -> None:
+        """Enter in to a buffer context, and buffer all output."""
+        self._buffer_index += 1
+
+    def _exit_buffer(self) -> None:
+        """Leave buffer context, and render content if required."""
+        self._buffer_index -= 1
+        self._check_buffer()
+
+    def set_live(self, live: "Live") -> None:
+        """Set Live instance. Used by Live context manager.
+
+        Args:
+            live (Live): Live instance using this Console.
+
+        Raises:
+            errors.LiveError: If this Console has a Live context currently active.
+        """
+        with self._lock:
+            if self._live is not None:
+                raise errors.LiveError("Only one live display may be active at once")
+            self._live = live
+
+    def clear_live(self) -> None:
+        """Clear the Live instance."""
+        with self._lock:
+            self._live = None
+
+    def push_render_hook(self, hook: RenderHook) -> None:
+        """Add a new render hook to the stack.
+
+        Args:
+            hook (RenderHook): Render hook instance.
+        """
+        with self._lock:
+            self._render_hooks.append(hook)
+
+    def pop_render_hook(self) -> None:
+        """Pop the last renderhook from the stack."""
+        with self._lock:
+            self._render_hooks.pop()
+
+    def __enter__(self) -> "Console":
+        """Own context manager to enter buffer context."""
+        self._enter_buffer()
+        return self
+
+    def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
+        """Exit buffer context."""
+        self._exit_buffer()
+
+    def begin_capture(self) -> None:
+        """Begin capturing console output. Call :meth:`end_capture` to exit capture mode and return output."""
+        self._enter_buffer()
+
+    def end_capture(self) -> str:
+        """End capture mode and return captured string.
+
+        Returns:
+            str: Console output.
+        """
+        render_result = self._render_buffer(self._buffer)
+        del self._buffer[:]
+        self._exit_buffer()
+        return render_result
+
+    def push_theme(self, theme: Theme, *, inherit: bool = True) -> None:
+        """Push a new theme on to the top of the stack, replacing the styles from the previous theme.
+        Generally speaking, you should call :meth:`~rich.console.Console.use_theme` to get a context manager, rather
+        than calling this method directly.
+
+        Args:
+            theme (Theme): A theme instance.
+            inherit (bool, optional): Inherit existing styles. Defaults to True.
+        """
+        self._theme_stack.push_theme(theme, inherit=inherit)
+
+    def pop_theme(self) -> None:
+        """Remove theme from top of stack, restoring previous theme."""
+        self._theme_stack.pop_theme()
+
+    def use_theme(self, theme: Theme, *, inherit: bool = True) -> ThemeContext:
+        """Use a different theme for the duration of the context manager.
+
+        Args:
+            theme (Theme): Theme instance to user.
+            inherit (bool, optional): Inherit existing console styles. Defaults to True.
+
+        Returns:
+            ThemeContext: [description]
+        """
+        return ThemeContext(self, theme, inherit)
+
+    @property
+    def color_system(self) -> Optional[str]:
+        """Get color system string.
+
+        Returns:
+            Optional[str]: "standard", "256" or "truecolor".
+        """
+
+        if self._color_system is not None:
+            return _COLOR_SYSTEMS_NAMES[self._color_system]
+        else:
+            return None
+
+    @property
+    def encoding(self) -> str:
+        """Get the encoding of the console file, e.g. ``"utf-8"``.
+
+        Returns:
+            str: A standard encoding string.
+        """
+        return (getattr(self.file, "encoding", "utf-8") or "utf-8").lower()
+
+    @property
+    def is_terminal(self) -> bool:
+        """Check if the console is writing to a terminal.
+
+        Returns:
+            bool: True if the console writing to a device capable of
+                understanding escape sequences, otherwise False.
+        """
+        # If dev has explicitly set this value, return it
+        if self._force_terminal is not None:
+            return self._force_terminal
+
+        # Fudge for Idle
+        if hasattr(sys.stdin, "__module__") and sys.stdin.__module__.startswith(
+            "idlelib"
+        ):
+            # Return False for Idle which claims to be a tty but can't handle ansi codes
+            return False
+
+        if self.is_jupyter:
+            # return False for Jupyter, which may have FORCE_COLOR set
+            return False
+
+        environ = self._environ
+
+        tty_compatible = environ.get("TTY_COMPATIBLE", "")
+        # 0 indicates device is not tty compatible
+        if tty_compatible == "0":
+            return False
+        # 1 indicates device is tty compatible
+        if tty_compatible == "1":
+            return True
+
+        # https://force-color.org/
+        force_color = environ.get("FORCE_COLOR")
+        if force_color is not None:
+            return force_color != ""
+
+        # Any other value defaults to auto detect
+        isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None)
+        try:
+            return False if isatty is None else isatty()
+        except ValueError:
+            # in some situation (at the end of a pytest run for example) isatty() can raise
+            # ValueError: I/O operation on closed file
+            # return False because we aren't in a terminal anymore
+            return False
+
+    @property
+    def is_dumb_terminal(self) -> bool:
+        """Detect dumb terminal.
+
+        Returns:
+            bool: True if writing to a dumb terminal, otherwise False.
+
+        """
+        _term = self._environ.get("TERM", "")
+        is_dumb = _term.lower() in ("dumb", "unknown")
+        return self.is_terminal and is_dumb
+
+    @property
+    def options(self) -> ConsoleOptions:
+        """Get default console options."""
+        return ConsoleOptions(
+            max_height=self.size.height,
+            size=self.size,
+            legacy_windows=self.legacy_windows,
+            min_width=1,
+            max_width=self.width,
+            encoding=self.encoding,
+            is_terminal=self.is_terminal,
+        )
+
+    @property
+    def size(self) -> ConsoleDimensions:
+        """Get the size of the console.
+
+        Returns:
+            ConsoleDimensions: A named tuple containing the dimensions.
+        """
+
+        if self._width is not None and self._height is not None:
+            return ConsoleDimensions(self._width - self.legacy_windows, self._height)
+
+        if self.is_dumb_terminal:
+            return ConsoleDimensions(80, 25)
+
+        width: Optional[int] = None
+        height: Optional[int] = None
+
+        streams = _STD_STREAMS_OUTPUT if WINDOWS else _STD_STREAMS
+        for file_descriptor in streams:
+            try:
+                width, height = os.get_terminal_size(file_descriptor)
+            except (AttributeError, ValueError, OSError):  # Probably not a terminal
+                pass
+            else:
+                break
+
+        columns = self._environ.get("COLUMNS")
+        if columns is not None and columns.isdigit():
+            width = int(columns)
+        lines = self._environ.get("LINES")
+        if lines is not None and lines.isdigit():
+            height = int(lines)
+
+        # get_terminal_size can report 0, 0 if run from pseudo-terminal
+        width = width or 80
+        height = height or 25
+        return ConsoleDimensions(
+            width - self.legacy_windows if self._width is None else self._width,
+            height if self._height is None else self._height,
+        )
+
+    @size.setter
+    def size(self, new_size: Tuple[int, int]) -> None:
+        """Set a new size for the terminal.
+
+        Args:
+            new_size (Tuple[int, int]): New width and height.
+        """
+        width, height = new_size
+        self._width = width
+        self._height = height
+
+    @property
+    def width(self) -> int:
+        """Get the width of the console.
+
+        Returns:
+            int: The width (in characters) of the console.
+        """
+        return self.size.width
+
+    @width.setter
+    def width(self, width: int) -> None:
+        """Set width.
+
+        Args:
+            width (int): New width.
+        """
+        self._width = width
+
+    @property
+    def height(self) -> int:
+        """Get the height of the console.
+
+        Returns:
+            int: The height (in lines) of the console.
+        """
+        return self.size.height
+
+    @height.setter
+    def height(self, height: int) -> None:
+        """Set height.
+
+        Args:
+            height (int): new height.
+        """
+        self._height = height
+
+    def bell(self) -> None:
+        """Play a 'bell' sound (if supported by the terminal)."""
+        self.control(Control.bell())
+
+    def capture(self) -> Capture:
+        """A context manager to *capture* the result of print() or log() in a string,
+        rather than writing it to the console.
+
+        Example:
+            >>> from rich.console import Console
+            >>> console = Console()
+            >>> with console.capture() as capture:
+            ...     console.print("[bold magenta]Hello World[/]")
+            >>> print(capture.get())
+
+        Returns:
+            Capture: Context manager with disables writing to the terminal.
+        """
+        capture = Capture(self)
+        return capture
+
+    def pager(
+        self, pager: Optional[Pager] = None, styles: bool = False, links: bool = False
+    ) -> PagerContext:
+        """A context manager to display anything printed within a "pager". The pager application
+        is defined by the system and will typically support at least pressing a key to scroll.
+
+        Args:
+            pager (Pager, optional): A pager object, or None to use :class:`~rich.pager.SystemPager`. Defaults to None.
+            styles (bool, optional): Show styles in pager. Defaults to False.
+            links (bool, optional): Show links in pager. Defaults to False.
+
+        Example:
+            >>> from rich.console import Console
+            >>> from rich.__main__ import make_test_card
+            >>> console = Console()
+            >>> with console.pager():
+                    console.print(make_test_card())
+
+        Returns:
+            PagerContext: A context manager.
+        """
+        return PagerContext(self, pager=pager, styles=styles, links=links)
+
+    def line(self, count: int = 1) -> None:
+        """Write new line(s).
+
+        Args:
+            count (int, optional): Number of new lines. Defaults to 1.
+        """
+
+        assert count >= 0, "count must be >= 0"
+        self.print(NewLine(count))
+
+    def clear(self, home: bool = True) -> None:
+        """Clear the screen.
+
+        Args:
+            home (bool, optional): Also move the cursor to 'home' position. Defaults to True.
+        """
+        if home:
+            self.control(Control.clear(), Control.home())
+        else:
+            self.control(Control.clear())
+
+    def status(
+        self,
+        status: RenderableType,
+        *,
+        spinner: str = "dots",
+        spinner_style: StyleType = "status.spinner",
+        speed: float = 1.0,
+        refresh_per_second: float = 12.5,
+    ) -> "Status":
+        """Display a status and spinner.
+
+        Args:
+            status (RenderableType): A status renderable (str or Text typically).
+            spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots".
+            spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner".
+            speed (float, optional): Speed factor for spinner animation. Defaults to 1.0.
+            refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5.
+
+        Returns:
+            Status: A Status object that may be used as a context manager.
+        """
+        from .status import Status
+
+        status_renderable = Status(
+            status,
+            console=self,
+            spinner=spinner,
+            spinner_style=spinner_style,
+            speed=speed,
+            refresh_per_second=refresh_per_second,
+        )
+        return status_renderable
+
+    def show_cursor(self, show: bool = True) -> bool:
+        """Show or hide the cursor.
+
+        Args:
+            show (bool, optional): Set visibility of the cursor.
+        """
+        if self.is_terminal:
+            self.control(Control.show_cursor(show))
+            return True
+        return False
+
+    def set_alt_screen(self, enable: bool = True) -> bool:
+        """Enables alternative screen mode.
+
+        Note, if you enable this mode, you should ensure that is disabled before
+        the application exits. See :meth:`~rich.Console.screen` for a context manager
+        that handles this for you.
+
+        Args:
+            enable (bool, optional): Enable (True) or disable (False) alternate screen. Defaults to True.
+
+        Returns:
+            bool: True if the control codes were written.
+
+        """
+        changed = False
+        if self.is_terminal and not self.legacy_windows:
+            self.control(Control.alt_screen(enable))
+            changed = True
+            self._is_alt_screen = enable
+        return changed
+
+    @property
+    def is_alt_screen(self) -> bool:
+        """Check if the alt screen was enabled.
+
+        Returns:
+            bool: True if the alt screen was enabled, otherwise False.
+        """
+        return self._is_alt_screen
+
+    def set_window_title(self, title: str) -> bool:
+        """Set the title of the console terminal window.
+
+        Warning: There is no means within Rich of "resetting" the window title to its
+        previous value, meaning the title you set will persist even after your application
+        exits.
+
+        ``fish`` shell resets the window title before and after each command by default,
+        negating this issue. Windows Terminal and command prompt will also reset the title for you.
+        Most other shells and terminals, however, do not do this.
+
+        Some terminals may require configuration changes before you can set the title.
+        Some terminals may not support setting the title at all.
+
+        Other software (including the terminal itself, the shell, custom prompts, plugins, etc.)
+        may also set the terminal window title. This could result in whatever value you write
+        using this method being overwritten.
+
+        Args:
+            title (str): The new title of the terminal window.
+
+        Returns:
+            bool: True if the control code to change the terminal title was
+                written, otherwise False. Note that a return value of True
+                does not guarantee that the window title has actually changed,
+                since the feature may be unsupported/disabled in some terminals.
+        """
+        if self.is_terminal:
+            self.control(Control.title(title))
+            return True
+        return False
+
+    def screen(
+        self, hide_cursor: bool = True, style: Optional[StyleType] = None
+    ) -> "ScreenContext":
+        """Context manager to enable and disable 'alternative screen' mode.
+
+        Args:
+            hide_cursor (bool, optional): Also hide the cursor. Defaults to False.
+            style (Style, optional): Optional style for screen. Defaults to None.
+
+        Returns:
+            ~ScreenContext: Context which enables alternate screen on enter, and disables it on exit.
+        """
+        return ScreenContext(self, hide_cursor=hide_cursor, style=style or "")
+
+    def measure(
+        self, renderable: RenderableType, *, options: Optional[ConsoleOptions] = None
+    ) -> Measurement:
+        """Measure a renderable. Returns a :class:`~rich.measure.Measurement` object which contains
+        information regarding the number of characters required to print the renderable.
+
+        Args:
+            renderable (RenderableType): Any renderable or string.
+            options (Optional[ConsoleOptions], optional): Options to use when measuring, or None
+                to use default options. Defaults to None.
+
+        Returns:
+            Measurement: A measurement of the renderable.
+        """
+        measurement = Measurement.get(self, options or self.options, renderable)
+        return measurement
+
+    def render(
+        self, renderable: RenderableType, options: Optional[ConsoleOptions] = None
+    ) -> Iterable[Segment]:
+        """Render an object in to an iterable of `Segment` instances.
+
+        This method contains the logic for rendering objects with the console protocol.
+        You are unlikely to need to use it directly, unless you are extending the library.
+
+        Args:
+            renderable (RenderableType): An object supporting the console protocol, or
+                an object that may be converted to a string.
+            options (ConsoleOptions, optional): An options object, or None to use self.options. Defaults to None.
+
+        Returns:
+            Iterable[Segment]: An iterable of segments that may be rendered.
+        """
+
+        _options = options or self.options
+        if _options.max_width < 1:
+            # No space to render anything. This prevents potential recursion errors.
+            return
+        render_iterable: RenderResult
+
+        renderable = rich_cast(renderable)
+        if hasattr(renderable, "__rich_console__") and not isclass(renderable):
+            render_iterable = renderable.__rich_console__(self, _options)
+        elif isinstance(renderable, str):
+            text_renderable = self.render_str(
+                renderable, highlight=_options.highlight, markup=_options.markup
+            )
+            render_iterable = text_renderable.__rich_console__(self, _options)
+        else:
+            raise errors.NotRenderableError(
+                f"Unable to render {renderable!r}; "
+                "A str, Segment or object with __rich_console__ method is required"
+            )
+
+        try:
+            iter_render = iter(render_iterable)
+        except TypeError:
+            raise errors.NotRenderableError(
+                f"object {render_iterable!r} is not renderable"
+            )
+        _Segment = Segment
+        _options = _options.reset_height()
+        for render_output in iter_render:
+            if isinstance(render_output, _Segment):
+                yield render_output
+            else:
+                yield from self.render(render_output, _options)
+
+    def render_lines(
+        self,
+        renderable: RenderableType,
+        options: Optional[ConsoleOptions] = None,
+        *,
+        style: Optional[Style] = None,
+        pad: bool = True,
+        new_lines: bool = False,
+    ) -> List[List[Segment]]:
+        """Render objects in to a list of lines.
+
+        The output of render_lines is useful when further formatting of rendered console text
+        is required, such as the Panel class which draws a border around any renderable object.
+
+        Args:
+            renderable (RenderableType): Any object renderable in the console.
+            options (Optional[ConsoleOptions], optional): Console options, or None to use self.options. Default to ``None``.
+            style (Style, optional): Optional style to apply to renderables. Defaults to ``None``.
+            pad (bool, optional): Pad lines shorter than render width. Defaults to ``True``.
+            new_lines (bool, optional): Include "\n" characters at end of lines.
+
+        Returns:
+            List[List[Segment]]: A list of lines, where a line is a list of Segment objects.
+        """
+        with self._lock:
+            render_options = options or self.options
+            _rendered = self.render(renderable, render_options)
+            if style:
+                _rendered = Segment.apply_style(_rendered, style)
+
+            render_height = render_options.height
+            if render_height is not None:
+                render_height = max(0, render_height)
+
+            lines = list(
+                islice(
+                    Segment.split_and_crop_lines(
+                        _rendered,
+                        render_options.max_width,
+                        include_new_lines=new_lines,
+                        pad=pad,
+                        style=style,
+                    ),
+                    None,
+                    render_height,
+                )
+            )
+            if render_options.height is not None:
+                extra_lines = render_options.height - len(lines)
+                if extra_lines > 0:
+                    pad_line = [
+                        (
+                            [
+                                Segment(" " * render_options.max_width, style),
+                                Segment("\n"),
+                            ]
+                            if new_lines
+                            else [Segment(" " * render_options.max_width, style)]
+                        )
+                    ]
+                    lines.extend(pad_line * extra_lines)
+
+            return lines
+
+    def render_str(
+        self,
+        text: str,
+        *,
+        style: Union[str, Style] = "",
+        justify: Optional[JustifyMethod] = None,
+        overflow: Optional[OverflowMethod] = None,
+        emoji: Optional[bool] = None,
+        markup: Optional[bool] = None,
+        highlight: Optional[bool] = None,
+        highlighter: Optional[HighlighterType] = None,
+    ) -> "Text":
+        """Convert a string to a Text instance. This is called automatically if
+        you print or log a string.
+
+        Args:
+            text (str): Text to render.
+            style (Union[str, Style], optional): Style to apply to rendered text.
+            justify (str, optional): Justify method: "default", "left", "center", "full", or "right". Defaults to ``None``.
+            overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``.
+            emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default.
+            markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default.
+            highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default.
+            highlighter (HighlighterType, optional): Optional highlighter to apply.
+        Returns:
+            ConsoleRenderable: Renderable object.
+
+        """
+        emoji_enabled = emoji or (emoji is None and self._emoji)
+        markup_enabled = markup or (markup is None and self._markup)
+        highlight_enabled = highlight or (highlight is None and self._highlight)
+
+        if markup_enabled:
+            rich_text = render_markup(
+                text,
+                style=style,
+                emoji=emoji_enabled,
+                emoji_variant=self._emoji_variant,
+            )
+            rich_text.justify = justify
+            rich_text.overflow = overflow
+        else:
+            rich_text = Text(
+                (
+                    _emoji_replace(text, default_variant=self._emoji_variant)
+                    if emoji_enabled
+                    else text
+                ),
+                justify=justify,
+                overflow=overflow,
+                style=style,
+            )
+
+        _highlighter = (highlighter or self.highlighter) if highlight_enabled else None
+        if _highlighter is not None:
+            highlight_text = _highlighter(str(rich_text))
+            highlight_text.copy_styles(rich_text)
+            return highlight_text
+
+        return rich_text
+
+    def get_style(
+        self, name: Union[str, Style], *, default: Optional[Union[Style, str]] = None
+    ) -> Style:
+        """Get a Style instance by its theme name or parse a definition.
+
+        Args:
+            name (str): The name of a style or a style definition.
+
+        Returns:
+            Style: A Style object.
+
+        Raises:
+            MissingStyle: If no style could be parsed from name.
+
+        """
+        if isinstance(name, Style):
+            return name
+
+        try:
+            style = self._theme_stack.get(name)
+            if style is None:
+                style = Style.parse(name)
+            return style.copy() if style.link else style
+        except errors.StyleSyntaxError as error:
+            if default is not None:
+                return self.get_style(default)
+            raise errors.MissingStyle(
+                f"Failed to get style {name!r}; {error}"
+            ) from None
+
+    def _collect_renderables(
+        self,
+        objects: Iterable[Any],
+        sep: str,
+        end: str,
+        *,
+        justify: Optional[JustifyMethod] = None,
+        emoji: Optional[bool] = None,
+        markup: Optional[bool] = None,
+        highlight: Optional[bool] = None,
+    ) -> List[ConsoleRenderable]:
+        """Combine a number of renderables and text into one renderable.
+
+        Args:
+            objects (Iterable[Any]): Anything that Rich can render.
+            sep (str): String to write between print data.
+            end (str): String to write at end of print data.
+            justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``.
+            emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default.
+            markup (Optional[bool], optional): Enable markup, or ``None`` to use console default.
+            highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default.
+
+        Returns:
+            List[ConsoleRenderable]: A list of things to render.
+        """
+        renderables: List[ConsoleRenderable] = []
+        _append = renderables.append
+        text: List[Text] = []
+        append_text = text.append
+
+        append = _append
+        if justify in ("left", "center", "right"):
+
+            def align_append(renderable: RenderableType) -> None:
+                _append(Align(renderable, cast(AlignMethod, justify)))
+
+            append = align_append
+
+        _highlighter: HighlighterType = _null_highlighter
+        if highlight or (highlight is None and self._highlight):
+            _highlighter = self.highlighter
+
+        def check_text() -> None:
+            if text:
+                sep_text = Text(sep, justify=justify, end=end)
+                append(sep_text.join(text))
+                text.clear()
+
+        for renderable in objects:
+            renderable = rich_cast(renderable)
+            if isinstance(renderable, str):
+                append_text(
+                    self.render_str(
+                        renderable,
+                        emoji=emoji,
+                        markup=markup,
+                        highlight=highlight,
+                        highlighter=_highlighter,
+                    )
+                )
+            elif isinstance(renderable, Text):
+                append_text(renderable)
+            elif isinstance(renderable, ConsoleRenderable):
+                check_text()
+                append(renderable)
+            elif is_expandable(renderable):
+                check_text()
+                append(Pretty(renderable, highlighter=_highlighter))
+            else:
+                append_text(_highlighter(str(renderable)))
+
+        check_text()
+
+        if self.style is not None:
+            style = self.get_style(self.style)
+            renderables = [Styled(renderable, style) for renderable in renderables]
+
+        return renderables
+
+    def rule(
+        self,
+        title: TextType = "",
+        *,
+        characters: str = "─",
+        style: Union[str, Style] = "rule.line",
+        align: AlignMethod = "center",
+    ) -> None:
+        """Draw a line with optional centered title.
+
+        Args:
+            title (str, optional): Text to render over the rule. Defaults to "".
+            characters (str, optional): Character(s) to form the line. Defaults to "─".
+            style (str, optional): Style of line. Defaults to "rule.line".
+            align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center".
+        """
+        from .rule import Rule
+
+        rule = Rule(title=title, characters=characters, style=style, align=align)
+        self.print(rule)
+
+    def control(self, *control: Control) -> None:
+        """Insert non-printing control codes.
+
+        Args:
+            control_codes (str): Control codes, such as those that may move the cursor.
+        """
+        if not self.is_dumb_terminal:
+            with self:
+                self._buffer.extend(_control.segment for _control in control)
+
+    def out(
+        self,
+        *objects: Any,
+        sep: str = " ",
+        end: str = "\n",
+        style: Optional[Union[str, Style]] = None,
+        highlight: Optional[bool] = None,
+    ) -> None:
+        """Output to the terminal. This is a low-level way of writing to the terminal which unlike
+        :meth:`~rich.console.Console.print` won't pretty print, wrap text, or apply markup, but will
+        optionally apply highlighting and a basic style.
+
+        Args:
+            sep (str, optional): String to write between print data. Defaults to " ".
+            end (str, optional): String to write at end of print data. Defaults to "\\\\n".
+            style (Union[str, Style], optional): A style to apply to output. Defaults to None.
+            highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use
+                console default. Defaults to ``None``.
+        """
+        raw_output: str = sep.join(str(_object) for _object in objects)
+        self.print(
+            raw_output,
+            style=style,
+            highlight=highlight,
+            emoji=False,
+            markup=False,
+            no_wrap=True,
+            overflow="ignore",
+            crop=False,
+            end=end,
+        )
+
+    def print(
+        self,
+        *objects: Any,
+        sep: str = " ",
+        end: str = "\n",
+        style: Optional[Union[str, Style]] = None,
+        justify: Optional[JustifyMethod] = None,
+        overflow: Optional[OverflowMethod] = None,
+        no_wrap: Optional[bool] = None,
+        emoji: Optional[bool] = None,
+        markup: Optional[bool] = None,
+        highlight: Optional[bool] = None,
+        width: Optional[int] = None,
+        height: Optional[int] = None,
+        crop: bool = True,
+        soft_wrap: Optional[bool] = None,
+        new_line_start: bool = False,
+    ) -> None:
+        """Print to the console.
+
+        Args:
+            objects (positional args): Objects to log to the terminal.
+            sep (str, optional): String to write between print data. Defaults to " ".
+            end (str, optional): String to write at end of print data. Defaults to "\\\\n".
+            style (Union[str, Style], optional): A style to apply to output. Defaults to None.
+            justify (str, optional): Justify method: "default", "left", "right", "center", or "full". Defaults to ``None``.
+            overflow (str, optional): Overflow method: "ignore", "crop", "fold", or "ellipsis". Defaults to None.
+            no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to None.
+            emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to ``None``.
+            markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to ``None``.
+            highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``.
+            width (Optional[int], optional): Width of output, or ``None`` to auto-detect. Defaults to ``None``.
+            crop (Optional[bool], optional): Crop output to width of terminal. Defaults to True.
+            soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping of text or ``None`` for
+                Console default. Defaults to ``None``.
+            new_line_start (bool, False): Insert a new line at the start if the output contains more than one line. Defaults to ``False``.
+        """
+        if not objects:
+            objects = (NewLine(),)
+
+        if soft_wrap is None:
+            soft_wrap = self.soft_wrap
+        if soft_wrap:
+            if no_wrap is None:
+                no_wrap = True
+            if overflow is None:
+                overflow = "ignore"
+            crop = False
+        render_hooks = self._render_hooks[:]
+        with self:
+            renderables = self._collect_renderables(
+                objects,
+                sep,
+                end,
+                justify=justify,
+                emoji=emoji,
+                markup=markup,
+                highlight=highlight,
+            )
+            for hook in render_hooks:
+                renderables = hook.process_renderables(renderables)
+            render_options = self.options.update(
+                justify=justify,
+                overflow=overflow,
+                width=min(width, self.width) if width is not None else NO_CHANGE,
+                height=height,
+                no_wrap=no_wrap,
+                markup=markup,
+                highlight=highlight,
+            )
+
+            new_segments: List[Segment] = []
+            extend = new_segments.extend
+            render = self.render
+            if style is None:
+                for renderable in renderables:
+                    extend(render(renderable, render_options))
+            else:
+                for renderable in renderables:
+                    extend(
+                        Segment.apply_style(
+                            render(renderable, render_options), self.get_style(style)
+                        )
+                    )
+            if new_line_start:
+                if (
+                    len("".join(segment.text for segment in new_segments).splitlines())
+                    > 1
+                ):
+                    new_segments.insert(0, Segment.line())
+            if crop:
+                buffer_extend = self._buffer.extend
+                for line in Segment.split_and_crop_lines(
+                    new_segments, self.width, pad=False
+                ):
+                    buffer_extend(line)
+            else:
+                self._buffer.extend(new_segments)
+
+    def print_json(
+        self,
+        json: Optional[str] = None,
+        *,
+        data: Any = None,
+        indent: Union[None, int, str] = 2,
+        highlight: bool = True,
+        skip_keys: bool = False,
+        ensure_ascii: bool = False,
+        check_circular: bool = True,
+        allow_nan: bool = True,
+        default: Optional[Callable[[Any], Any]] = None,
+        sort_keys: bool = False,
+    ) -> None:
+        """Pretty prints JSON. Output will be valid JSON.
+
+        Args:
+            json (Optional[str]): A string containing JSON.
+            data (Any): If json is not supplied, then encode this data.
+            indent (Union[None, int, str], optional): Number of spaces to indent. Defaults to 2.
+            highlight (bool, optional): Enable highlighting of output: Defaults to True.
+            skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False.
+            ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False.
+            check_circular (bool, optional): Check for circular references. Defaults to True.
+            allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True.
+            default (Callable, optional): A callable that converts values that can not be encoded
+                in to something that can be JSON encoded. Defaults to None.
+            sort_keys (bool, optional): Sort dictionary keys. Defaults to False.
+        """
+        from rich.json import JSON
+
+        if json is None:
+            json_renderable = JSON.from_data(
+                data,
+                indent=indent,
+                highlight=highlight,
+                skip_keys=skip_keys,
+                ensure_ascii=ensure_ascii,
+                check_circular=check_circular,
+                allow_nan=allow_nan,
+                default=default,
+                sort_keys=sort_keys,
+            )
+        else:
+            if not isinstance(json, str):
+                raise TypeError(
+                    f"json must be str. Did you mean print_json(data={json!r}) ?"
+                )
+            json_renderable = JSON(
+                json,
+                indent=indent,
+                highlight=highlight,
+                skip_keys=skip_keys,
+                ensure_ascii=ensure_ascii,
+                check_circular=check_circular,
+                allow_nan=allow_nan,
+                default=default,
+                sort_keys=sort_keys,
+            )
+        self.print(json_renderable, soft_wrap=True)
+
+    def update_screen(
+        self,
+        renderable: RenderableType,
+        *,
+        region: Optional[Region] = None,
+        options: Optional[ConsoleOptions] = None,
+    ) -> None:
+        """Update the screen at a given offset.
+
+        Args:
+            renderable (RenderableType): A Rich renderable.
+            region (Region, optional): Region of screen to update, or None for entire screen. Defaults to None.
+            x (int, optional): x offset. Defaults to 0.
+            y (int, optional): y offset. Defaults to 0.
+
+        Raises:
+            errors.NoAltScreen: If the Console isn't in alt screen mode.
+
+        """
+        if not self.is_alt_screen:
+            raise errors.NoAltScreen("Alt screen must be enabled to call update_screen")
+        render_options = options or self.options
+        if region is None:
+            x = y = 0
+            render_options = render_options.update_dimensions(
+                render_options.max_width, render_options.height or self.height
+            )
+        else:
+            x, y, width, height = region
+            render_options = render_options.update_dimensions(width, height)
+
+        lines = self.render_lines(renderable, options=render_options)
+        self.update_screen_lines(lines, x, y)
+
+    def update_screen_lines(
+        self, lines: List[List[Segment]], x: int = 0, y: int = 0
+    ) -> None:
+        """Update lines of the screen at a given offset.
+
+        Args:
+            lines (List[List[Segment]]): Rendered lines (as produced by :meth:`~rich.Console.render_lines`).
+            x (int, optional): x offset (column no). Defaults to 0.
+            y (int, optional): y offset (column no). Defaults to 0.
+
+        Raises:
+            errors.NoAltScreen: If the Console isn't in alt screen mode.
+        """
+        if not self.is_alt_screen:
+            raise errors.NoAltScreen("Alt screen must be enabled to call update_screen")
+        screen_update = ScreenUpdate(lines, x, y)
+        segments = self.render(screen_update)
+        self._buffer.extend(segments)
+        self._check_buffer()
+
+    def print_exception(
+        self,
+        *,
+        width: Optional[int] = 100,
+        extra_lines: int = 3,
+        theme: Optional[str] = None,
+        word_wrap: bool = False,
+        show_locals: bool = False,
+        suppress: Iterable[Union[str, ModuleType]] = (),
+        max_frames: int = 100,
+    ) -> None:
+        """Prints a rich render of the last exception and traceback.
+
+        Args:
+            width (Optional[int], optional): Number of characters used to render code. Defaults to 100.
+            extra_lines (int, optional): Additional lines of code to render. Defaults to 3.
+            theme (str, optional): Override pygments theme used in traceback
+            word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False.
+            show_locals (bool, optional): Enable display of local variables. Defaults to False.
+            suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.
+            max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100.
+        """
+        from .traceback import Traceback
+
+        traceback = Traceback(
+            width=width,
+            extra_lines=extra_lines,
+            theme=theme,
+            word_wrap=word_wrap,
+            show_locals=show_locals,
+            suppress=suppress,
+            max_frames=max_frames,
+        )
+        self.print(traceback)
+
+    @staticmethod
+    def _caller_frame_info(
+        offset: int,
+        currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe,
+    ) -> Tuple[str, int, Dict[str, Any]]:
+        """Get caller frame information.
+
+        Args:
+            offset (int): the caller offset within the current frame stack.
+            currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to
+                retrieve the current frame. Defaults to ``inspect.currentframe``.
+
+        Returns:
+            Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and
+                the dictionary of local variables associated with the caller frame.
+
+        Raises:
+            RuntimeError: If the stack offset is invalid.
+        """
+        # Ignore the frame of this local helper
+        offset += 1
+
+        frame = currentframe()
+        if frame is not None:
+            # Use the faster currentframe where implemented
+            while offset and frame is not None:
+                frame = frame.f_back
+                offset -= 1
+            assert frame is not None
+            return frame.f_code.co_filename, frame.f_lineno, frame.f_locals
+        else:
+            # Fallback to the slower stack
+            frame_info = inspect.stack()[offset]
+            return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals
+
+    def log(
+        self,
+        *objects: Any,
+        sep: str = " ",
+        end: str = "\n",
+        style: Optional[Union[str, Style]] = None,
+        justify: Optional[JustifyMethod] = None,
+        emoji: Optional[bool] = None,
+        markup: Optional[bool] = None,
+        highlight: Optional[bool] = None,
+        log_locals: bool = False,
+        _stack_offset: int = 1,
+    ) -> None:
+        """Log rich content to the terminal.
+
+        Args:
+            objects (positional args): Objects to log to the terminal.
+            sep (str, optional): String to write between print data. Defaults to " ".
+            end (str, optional): String to write at end of print data. Defaults to "\\\\n".
+            style (Union[str, Style], optional): A style to apply to output. Defaults to None.
+            justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``.
+            emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None.
+            markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None.
+            highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None.
+            log_locals (bool, optional): Boolean to enable logging of locals where ``log()``
+                was called. Defaults to False.
+            _stack_offset (int, optional): Offset of caller from end of call stack. Defaults to 1.
+        """
+        if not objects:
+            objects = (NewLine(),)
+
+        render_hooks = self._render_hooks[:]
+
+        with self:
+            renderables = self._collect_renderables(
+                objects,
+                sep,
+                end,
+                justify=justify,
+                emoji=emoji,
+                markup=markup,
+                highlight=highlight,
+            )
+            if style is not None:
+                renderables = [Styled(renderable, style) for renderable in renderables]
+
+            filename, line_no, locals = self._caller_frame_info(_stack_offset)
+            link_path = None if filename.startswith("<") else os.path.abspath(filename)
+            path = filename.rpartition(os.sep)[-1]
+            if log_locals:
+                locals_map = {
+                    key: value
+                    for key, value in locals.items()
+                    if not key.startswith("__")
+                }
+                renderables.append(render_scope(locals_map, title="[i]locals"))
+
+            renderables = [
+                self._log_render(
+                    self,
+                    renderables,
+                    log_time=self.get_datetime(),
+                    path=path,
+                    line_no=line_no,
+                    link_path=link_path,
+                )
+            ]
+            for hook in render_hooks:
+                renderables = hook.process_renderables(renderables)
+            new_segments: List[Segment] = []
+            extend = new_segments.extend
+            render = self.render
+            render_options = self.options
+            for renderable in renderables:
+                extend(render(renderable, render_options))
+            buffer_extend = self._buffer.extend
+            for line in Segment.split_and_crop_lines(
+                new_segments, self.width, pad=False
+            ):
+                buffer_extend(line)
+
+    def on_broken_pipe(self) -> None:
+        """This function is called when a `BrokenPipeError` is raised.
+
+        This can occur when piping Textual output in Linux and macOS.
+        The default implementation is to exit the app, but you could implement
+        this method in a subclass to change the behavior.
+
+        See https://docs.python.org/3/library/signal.html#note-on-sigpipe for details.
+        """
+        self.quiet = True
+        devnull = os.open(os.devnull, os.O_WRONLY)
+        os.dup2(devnull, sys.stdout.fileno())
+        raise SystemExit(1)
+
+    def _check_buffer(self) -> None:
+        """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False)
+        Rendering is supported on Windows, Unix and Jupyter environments. For
+        legacy Windows consoles, the win32 API is called directly.
+        This method will also record what it renders if recording is enabled via Console.record.
+        """
+        if self.quiet:
+            del self._buffer[:]
+            return
+
+        try:
+            self._write_buffer()
+        except BrokenPipeError:
+            self.on_broken_pipe()
+
+    def _write_buffer(self) -> None:
+        """Write the buffer to the output file."""
+
+        with self._lock:
+            if self.record and not self._buffer_index:
+                with self._record_buffer_lock:
+                    self._record_buffer.extend(self._buffer[:])
+
+            if self._buffer_index == 0:
+                if self.is_jupyter:  # pragma: no cover
+                    from .jupyter import display
+
+                    display(self._buffer, self._render_buffer(self._buffer[:]))
+                    del self._buffer[:]
+                else:
+                    if WINDOWS:
+                        use_legacy_windows_render = False
+                        if self.legacy_windows:
+                            fileno = get_fileno(self.file)
+                            if fileno is not None:
+                                use_legacy_windows_render = (
+                                    fileno in _STD_STREAMS_OUTPUT
+                                )
+
+                        if use_legacy_windows_render:
+                            from rich._win32_console import LegacyWindowsTerm
+                            from rich._windows_renderer import legacy_windows_render
+
+                            buffer = self._buffer[:]
+                            if self.no_color and self._color_system:
+                                buffer = list(Segment.remove_color(buffer))
+
+                            legacy_windows_render(buffer, LegacyWindowsTerm(self.file))
+                        else:
+                            # Either a non-std stream on legacy Windows, or modern Windows.
+                            text = self._render_buffer(self._buffer[:])
+                            # https://bugs.python.org/issue37871
+                            # https://github.com/python/cpython/issues/82052
+                            # We need to avoid writing more than 32Kb in a single write, due to the above bug
+                            write = self.file.write
+                            # Worse case scenario, every character is 4 bytes of utf-8
+                            MAX_WRITE = 32 * 1024 // 4
+                            try:
+                                if len(text) <= MAX_WRITE:
+                                    write(text)
+                                else:
+                                    batch: List[str] = []
+                                    batch_append = batch.append
+                                    size = 0
+                                    for line in text.splitlines(True):
+                                        if size + len(line) > MAX_WRITE and batch:
+                                            write("".join(batch))
+                                            batch.clear()
+                                            size = 0
+                                        batch_append(line)
+                                        size += len(line)
+                                    if batch:
+                                        write("".join(batch))
+                                        batch.clear()
+                            except UnicodeEncodeError as error:
+                                error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***"
+                                raise
+                    else:
+                        text = self._render_buffer(self._buffer[:])
+                        try:
+                            self.file.write(text)
+                        except UnicodeEncodeError as error:
+                            error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***"
+                            raise
+
+                    self.file.flush()
+                    del self._buffer[:]
+
+    def _render_buffer(self, buffer: Iterable[Segment]) -> str:
+        """Render buffered output, and clear buffer."""
+        output: List[str] = []
+        append = output.append
+        color_system = self._color_system
+        legacy_windows = self.legacy_windows
+        not_terminal = not self.is_terminal
+        if self.no_color and color_system:
+            buffer = Segment.remove_color(buffer)
+        for text, style, control in buffer:
+            if style:
+                append(
+                    style.render(
+                        text,
+                        color_system=color_system,
+                        legacy_windows=legacy_windows,
+                    )
+                )
+            elif not (not_terminal and control):
+                append(text)
+
+        rendered = "".join(output)
+        return rendered
+
+    def input(
+        self,
+        prompt: TextType = "",
+        *,
+        markup: bool = True,
+        emoji: bool = True,
+        password: bool = False,
+        stream: Optional[TextIO] = None,
+    ) -> str:
+        """Displays a prompt and waits for input from the user. The prompt may contain color / style.
+
+        It works in the same way as Python's builtin :func:`input` function and provides elaborate line editing and history features if Python's builtin :mod:`readline` module is previously loaded.
+
+        Args:
+            prompt (Union[str, Text]): Text to render in the prompt.
+            markup (bool, optional): Enable console markup (requires a str prompt). Defaults to True.
+            emoji (bool, optional): Enable emoji (requires a str prompt). Defaults to True.
+            password: (bool, optional): Hide typed text. Defaults to False.
+            stream: (TextIO, optional): Optional file to read input from (rather than stdin). Defaults to None.
+
+        Returns:
+            str: Text read from stdin.
+        """
+        if prompt:
+            self.print(prompt, markup=markup, emoji=emoji, end="")
+        if password:
+            result = getpass("", stream=stream)
+        else:
+            if stream:
+                result = stream.readline()
+            else:
+                result = input()
+        return result
+
+    def export_text(self, *, clear: bool = True, styles: bool = False) -> str:
+        """Generate text from console contents (requires record=True argument in constructor).
+
+        Args:
+            clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``.
+            styles (bool, optional): If ``True``, ansi escape codes will be included. ``False`` for plain text.
+                Defaults to ``False``.
+
+        Returns:
+            str: String containing console contents.
+
+        """
+        assert (
+            self.record
+        ), "To export console contents set record=True in the constructor or instance"
+
+        with self._record_buffer_lock:
+            if styles:
+                text = "".join(
+                    (style.render(text) if style else text)
+                    for text, style, _ in self._record_buffer
+                )
+            else:
+                text = "".join(
+                    segment.text
+                    for segment in self._record_buffer
+                    if not segment.control
+                )
+            if clear:
+                del self._record_buffer[:]
+        return text
+
+    def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> None:
+        """Generate text from console and save to a given location (requires record=True argument in constructor).
+
+        Args:
+            path (str): Path to write text files.
+            clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``.
+            styles (bool, optional): If ``True``, ansi style codes will be included. ``False`` for plain text.
+                Defaults to ``False``.
+
+        """
+        text = self.export_text(clear=clear, styles=styles)
+        with open(path, "w", encoding="utf-8") as write_file:
+            write_file.write(text)
+
+    def export_html(
+        self,
+        *,
+        theme: Optional[TerminalTheme] = None,
+        clear: bool = True,
+        code_format: Optional[str] = None,
+        inline_styles: bool = False,
+    ) -> str:
+        """Generate HTML from console contents (requires record=True argument in constructor).
+
+        Args:
+            theme (TerminalTheme, optional): TerminalTheme object containing console colors.
+            clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``.
+            code_format (str, optional): Format string to render HTML. In addition to '{foreground}',
+                '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``.
+            inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files
+                larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag.
+                Defaults to False.
+
+        Returns:
+            str: String containing console contents as HTML.
+        """
+        assert (
+            self.record
+        ), "To export console contents set record=True in the constructor or instance"
+        fragments: List[str] = []
+        append = fragments.append
+        _theme = theme or DEFAULT_TERMINAL_THEME
+        stylesheet = ""
+
+        render_code_format = CONSOLE_HTML_FORMAT if code_format is None else code_format
+
+        with self._record_buffer_lock:
+            if inline_styles:
+                for text, style, _ in Segment.filter_control(
+                    Segment.simplify(self._record_buffer)
+                ):
+                    text = escape(text)
+                    if style:
+                        rule = style.get_html_style(_theme)
+                        if style.link:
+                            text = f'<a href="{style.link}">{text}</a>'
+                        text = f'<span style="{rule}">{text}</span>' if rule else text
+                    append(text)
+            else:
+                styles: Dict[str, int] = {}
+                for text, style, _ in Segment.filter_control(
+                    Segment.simplify(self._record_buffer)
+                ):
+                    text = escape(text)
+                    if style:
+                        rule = style.get_html_style(_theme)
+                        style_number = styles.setdefault(rule, len(styles) + 1)
+                        if style.link:
+                            text = f'<a class="r{style_number}" href="{style.link}">{text}</a>'
+                        else:
+                            text = f'<span class="r{style_number}">{text}</span>'
+                    append(text)
+                stylesheet_rules: List[str] = []
+                stylesheet_append = stylesheet_rules.append
+                for style_rule, style_number in styles.items():
+                    if style_rule:
+                        stylesheet_append(f".r{style_number} {{{style_rule}}}")
+                stylesheet = "\n".join(stylesheet_rules)
+
+            rendered_code = render_code_format.format(
+                code="".join(fragments),
+                stylesheet=stylesheet,
+                foreground=_theme.foreground_color.hex,
+                background=_theme.background_color.hex,
+            )
+            if clear:
+                del self._record_buffer[:]
+        return rendered_code
+
+    def save_html(
+        self,
+        path: str,
+        *,
+        theme: Optional[TerminalTheme] = None,
+        clear: bool = True,
+        code_format: str = CONSOLE_HTML_FORMAT,
+        inline_styles: bool = False,
+    ) -> None:
+        """Generate HTML from console contents and write to a file (requires record=True argument in constructor).
+
+        Args:
+            path (str): Path to write html file.
+            theme (TerminalTheme, optional): TerminalTheme object containing console colors.
+            clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``.
+            code_format (str, optional): Format string to render HTML. In addition to '{foreground}',
+                '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``.
+            inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files
+                larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag.
+                Defaults to False.
+
+        """
+        html = self.export_html(
+            theme=theme,
+            clear=clear,
+            code_format=code_format,
+            inline_styles=inline_styles,
+        )
+        with open(path, "w", encoding="utf-8") as write_file:
+            write_file.write(html)
+
+    def export_svg(
+        self,
+        *,
+        title: str = "Rich",
+        theme: Optional[TerminalTheme] = None,
+        clear: bool = True,
+        code_format: str = CONSOLE_SVG_FORMAT,
+        font_aspect_ratio: float = 0.61,
+        unique_id: Optional[str] = None,
+    ) -> str:
+        """
+        Generate an SVG from the console contents (requires record=True in Console constructor).
+
+        Args:
+            title (str, optional): The title of the tab in the output image
+            theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal
+            clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``
+            code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables
+                into the string in order to form the final SVG output. The default template used and the variables
+                injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable.
+            font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format``
+                string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font).
+                If you aren't specifying a different font inside ``code_format``, you probably don't need this.
+            unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node
+                ids). If not set, this defaults to a computed value based on the recorded content.
+        """
+
+        from rich.cells import cell_len
+
+        style_cache: Dict[Style, str] = {}
+
+        def get_svg_style(style: Style) -> str:
+            """Convert a Style to CSS rules for SVG."""
+            if style in style_cache:
+                return style_cache[style]
+            css_rules = []
+            color = (
+                _theme.foreground_color
+                if (style.color is None or style.color.is_default)
+                else style.color.get_truecolor(_theme)
+            )
+            bgcolor = (
+                _theme.background_color
+                if (style.bgcolor is None or style.bgcolor.is_default)
+                else style.bgcolor.get_truecolor(_theme)
+            )
+            if style.reverse:
+                color, bgcolor = bgcolor, color
+            if style.dim:
+                color = blend_rgb(color, bgcolor, 0.4)
+            css_rules.append(f"fill: {color.hex}")
+            if style.bold:
+                css_rules.append("font-weight: bold")
+            if style.italic:
+                css_rules.append("font-style: italic;")
+            if style.underline:
+                css_rules.append("text-decoration: underline;")
+            if style.strike:
+                css_rules.append("text-decoration: line-through;")
+
+            css = ";".join(css_rules)
+            style_cache[style] = css
+            return css
+
+        _theme = theme or SVG_EXPORT_THEME
+
+        width = self.width
+        char_height = 20
+        char_width = char_height * font_aspect_ratio
+        line_height = char_height * 1.22
+
+        margin_top = 1
+        margin_right = 1
+        margin_bottom = 1
+        margin_left = 1
+
+        padding_top = 40
+        padding_right = 8
+        padding_bottom = 8
+        padding_left = 8
+
+        padding_width = padding_left + padding_right
+        padding_height = padding_top + padding_bottom
+        margin_width = margin_left + margin_right
+        margin_height = margin_top + margin_bottom
+
+        text_backgrounds: List[str] = []
+        text_group: List[str] = []
+        classes: Dict[str, int] = {}
+        style_no = 1
+
+        def escape_text(text: str) -> str:
+            """HTML escape text and replace spaces with nbsp."""
+            return escape(text).replace(" ", "&#160;")
+
+        def make_tag(
+            name: str, content: Optional[str] = None, **attribs: object
+        ) -> str:
+            """Make a tag from name, content, and attributes."""
+
+            def stringify(value: object) -> str:
+                if isinstance(value, (float)):
+                    return format(value, "g")
+                return str(value)
+
+            tag_attribs = " ".join(
+                f'{k.lstrip("_").replace("_", "-")}="{stringify(v)}"'
+                for k, v in attribs.items()
+            )
+            return (
+                f"<{name} {tag_attribs}>{content}</{name}>"
+                if content
+                else f"<{name} {tag_attribs}/>"
+            )
+
+        with self._record_buffer_lock:
+            segments = list(Segment.filter_control(self._record_buffer))
+            if clear:
+                self._record_buffer.clear()
+
+        if unique_id is None:
+            unique_id = "terminal-" + str(
+                zlib.adler32(
+                    ("".join(repr(segment) for segment in segments)).encode(
+                        "utf-8",
+                        "ignore",
+                    )
+                    + title.encode("utf-8", "ignore")
+                )
+            )
+        y = 0
+        for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)):
+            x = 0
+            for text, style, _control in line:
+                style = style or Style()
+                rules = get_svg_style(style)
+                if rules not in classes:
+                    classes[rules] = style_no
+                    style_no += 1
+                class_name = f"r{classes[rules]}"
+
+                if style.reverse:
+                    has_background = True
+                    background = (
+                        _theme.foreground_color.hex
+                        if style.color is None
+                        else style.color.get_truecolor(_theme).hex
+                    )
+                else:
+                    bgcolor = style.bgcolor
+                    has_background = bgcolor is not None and not bgcolor.is_default
+                    background = (
+                        _theme.background_color.hex
+                        if style.bgcolor is None
+                        else style.bgcolor.get_truecolor(_theme).hex
+                    )
+
+                text_length = cell_len(text)
+                if has_background:
+                    text_backgrounds.append(
+                        make_tag(
+                            "rect",
+                            fill=background,
+                            x=x * char_width,
+                            y=y * line_height + 1.5,
+                            width=char_width * text_length,
+                            height=line_height + 0.25,
+                            shape_rendering="crispEdges",
+                        )
+                    )
+
+                if text != " " * len(text):
+                    text_group.append(
+                        make_tag(
+                            "text",
+                            escape_text(text),
+                            _class=f"{unique_id}-{class_name}",
+                            x=x * char_width,
+                            y=y * line_height + char_height,
+                            textLength=char_width * len(text),
+                            clip_path=f"url(#{unique_id}-line-{y})",
+                        )
+                    )
+                x += cell_len(text)
+
+        line_offsets = [line_no * line_height + 1.5 for line_no in range(y)]
+        lines = "\n".join(
+            f"""<clipPath id="{unique_id}-line-{line_no}">
+    {make_tag("rect", x=0, y=offset, width=char_width * width, height=line_height + 0.25)}
+            </clipPath>"""
+            for line_no, offset in enumerate(line_offsets)
+        )
+
+        styles = "\n".join(
+            f".{unique_id}-r{rule_no} {{ {css} }}" for css, rule_no in classes.items()
+        )
+        backgrounds = "".join(text_backgrounds)
+        matrix = "".join(text_group)
+
+        terminal_width = ceil(width * char_width + padding_width)
+        terminal_height = (y + 1) * line_height + padding_height
+        chrome = make_tag(
+            "rect",
+            fill=_theme.background_color.hex,
+            stroke="rgba(255,255,255,0.35)",
+            stroke_width="1",
+            x=margin_left,
+            y=margin_top,
+            width=terminal_width,
+            height=terminal_height,
+            rx=8,
+        )
+
+        title_color = _theme.foreground_color.hex
+        if title:
+            chrome += make_tag(
+                "text",
+                escape_text(title),
+                _class=f"{unique_id}-title",
+                fill=title_color,
+                text_anchor="middle",
+                x=terminal_width // 2,
+                y=margin_top + char_height + 6,
+            )
+        chrome += f"""
+            <g transform="translate(26,22)">
+            <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+            <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+            <circle cx="44" cy="0" r="7" fill="#28c840"/>
+            </g>
+        """
+
+        svg = code_format.format(
+            unique_id=unique_id,
+            char_width=char_width,
+            char_height=char_height,
+            line_height=line_height,
+            terminal_width=char_width * width - 1,
+            terminal_height=(y + 1) * line_height - 1,
+            width=terminal_width + margin_width,
+            height=terminal_height + margin_height,
+            terminal_x=margin_left + padding_left,
+            terminal_y=margin_top + padding_top,
+            styles=styles,
+            chrome=chrome,
+            backgrounds=backgrounds,
+            matrix=matrix,
+            lines=lines,
+        )
+        return svg
+
+    def save_svg(
+        self,
+        path: str,
+        *,
+        title: str = "Rich",
+        theme: Optional[TerminalTheme] = None,
+        clear: bool = True,
+        code_format: str = CONSOLE_SVG_FORMAT,
+        font_aspect_ratio: float = 0.61,
+        unique_id: Optional[str] = None,
+    ) -> None:
+        """Generate an SVG file from the console contents (requires record=True in Console constructor).
+
+        Args:
+            path (str): The path to write the SVG to.
+            title (str, optional): The title of the tab in the output image
+            theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal
+            clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``
+            code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables
+                into the string in order to form the final SVG output. The default template used and the variables
+                injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable.
+            font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format``
+                string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font).
+                If you aren't specifying a different font inside ``code_format``, you probably don't need this.
+            unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node
+                ids). If not set, this defaults to a computed value based on the recorded content.
+        """
+        svg = self.export_svg(
+            title=title,
+            theme=theme,
+            clear=clear,
+            code_format=code_format,
+            font_aspect_ratio=font_aspect_ratio,
+            unique_id=unique_id,
+        )
+        with open(path, "w", encoding="utf-8") as write_file:
+            write_file.write(svg)
+
+
+def _svg_hash(svg_main_code: str) -> str:
+    """Returns a unique hash for the given SVG main code.
+
+    Args:
+        svg_main_code (str): The content we're going to inject in the SVG envelope.
+
+    Returns:
+        str: a hash of the given content
+    """
+    return str(zlib.adler32(svg_main_code.encode()))
+
+
+if __name__ == "__main__":  # pragma: no cover
+    console = Console(record=True)
+
+    console.log(
+        "JSONRPC [i]request[/i]",
+        5,
+        1.3,
+        True,
+        False,
+        None,
+        {
+            "jsonrpc": "2.0",
+            "method": "subtract",
+            "params": {"minuend": 42, "subtrahend": 23},
+            "id": 3,
+        },
+    )
+
+    console.log("Hello, World!", "{'a': 1}", repr(console))
+
+    console.print(
+        {
+            "name": None,
+            "empty": [],
+            "quiz": {
+                "sport": {
+                    "answered": True,
+                    "q1": {
+                        "question": "Which one is correct team name in NBA?",
+                        "options": [
+                            "New York Bulls",
+                            "Los Angeles Kings",
+                            "Golden State Warriors",
+                            "Huston Rocket",
+                        ],
+                        "answer": "Huston Rocket",
+                    },
+                },
+                "maths": {
+                    "answered": False,
+                    "q1": {
+                        "question": "5 + 7 = ?",
+                        "options": [10, 11, 12, 13],
+                        "answer": 12,
+                    },
+                    "q2": {
+                        "question": "12 - 8 = ?",
+                        "options": [1, 2, 3, 4],
+                        "answer": 4,
+                    },
+                },
+            },
+        }
+    )
diff --git a/.venv/Lib/site-packages/rich/constrain.py b/.venv/Lib/site-packages/rich/constrain.py
new file mode 100644 (file)
index 0000000..65fdf56
--- /dev/null
@@ -0,0 +1,37 @@
+from typing import Optional, TYPE_CHECKING
+
+from .jupyter import JupyterMixin
+from .measure import Measurement
+
+if TYPE_CHECKING:
+    from .console import Console, ConsoleOptions, RenderableType, RenderResult
+
+
+class Constrain(JupyterMixin):
+    """Constrain the width of a renderable to a given number of characters.
+
+    Args:
+        renderable (RenderableType): A renderable object.
+        width (int, optional): The maximum width (in characters) to render. Defaults to 80.
+    """
+
+    def __init__(self, renderable: "RenderableType", width: Optional[int] = 80) -> None:
+        self.renderable = renderable
+        self.width = width
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        if self.width is None:
+            yield self.renderable
+        else:
+            child_options = options.update_width(min(self.width, options.max_width))
+            yield from console.render(self.renderable, child_options)
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "Measurement":
+        if self.width is not None:
+            options = options.update_width(self.width)
+        measurement = Measurement.get(console, options, self.renderable)
+        return measurement
diff --git a/.venv/Lib/site-packages/rich/containers.py b/.venv/Lib/site-packages/rich/containers.py
new file mode 100644 (file)
index 0000000..901ff8b
--- /dev/null
@@ -0,0 +1,167 @@
+from itertools import zip_longest
+from typing import (
+    TYPE_CHECKING,
+    Iterable,
+    Iterator,
+    List,
+    Optional,
+    TypeVar,
+    Union,
+    overload,
+)
+
+if TYPE_CHECKING:
+    from .console import (
+        Console,
+        ConsoleOptions,
+        JustifyMethod,
+        OverflowMethod,
+        RenderResult,
+        RenderableType,
+    )
+    from .text import Text
+
+from .cells import cell_len
+from .measure import Measurement
+
+T = TypeVar("T")
+
+
+class Renderables:
+    """A list subclass which renders its contents to the console."""
+
+    def __init__(
+        self, renderables: Optional[Iterable["RenderableType"]] = None
+    ) -> None:
+        self._renderables: List["RenderableType"] = (
+            list(renderables) if renderables is not None else []
+        )
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        """Console render method to insert line-breaks."""
+        yield from self._renderables
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "Measurement":
+        dimensions = [
+            Measurement.get(console, options, renderable)
+            for renderable in self._renderables
+        ]
+        if not dimensions:
+            return Measurement(1, 1)
+        _min = max(dimension.minimum for dimension in dimensions)
+        _max = max(dimension.maximum for dimension in dimensions)
+        return Measurement(_min, _max)
+
+    def append(self, renderable: "RenderableType") -> None:
+        self._renderables.append(renderable)
+
+    def __iter__(self) -> Iterable["RenderableType"]:
+        return iter(self._renderables)
+
+
+class Lines:
+    """A list subclass which can render to the console."""
+
+    def __init__(self, lines: Iterable["Text"] = ()) -> None:
+        self._lines: List["Text"] = list(lines)
+
+    def __repr__(self) -> str:
+        return f"Lines({self._lines!r})"
+
+    def __iter__(self) -> Iterator["Text"]:
+        return iter(self._lines)
+
+    @overload
+    def __getitem__(self, index: int) -> "Text":
+        ...
+
+    @overload
+    def __getitem__(self, index: slice) -> List["Text"]:
+        ...
+
+    def __getitem__(self, index: Union[slice, int]) -> Union["Text", List["Text"]]:
+        return self._lines[index]
+
+    def __setitem__(self, index: int, value: "Text") -> "Lines":
+        self._lines[index] = value
+        return self
+
+    def __len__(self) -> int:
+        return self._lines.__len__()
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        """Console render method to insert line-breaks."""
+        yield from self._lines
+
+    def append(self, line: "Text") -> None:
+        self._lines.append(line)
+
+    def extend(self, lines: Iterable["Text"]) -> None:
+        self._lines.extend(lines)
+
+    def pop(self, index: int = -1) -> "Text":
+        return self._lines.pop(index)
+
+    def justify(
+        self,
+        console: "Console",
+        width: int,
+        justify: "JustifyMethod" = "left",
+        overflow: "OverflowMethod" = "fold",
+    ) -> None:
+        """Justify and overflow text to a given width.
+
+        Args:
+            console (Console): Console instance.
+            width (int): Number of cells available per line.
+            justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left".
+            overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold".
+
+        """
+        from .text import Text
+
+        if justify == "left":
+            for line in self._lines:
+                line.truncate(width, overflow=overflow, pad=True)
+        elif justify == "center":
+            for line in self._lines:
+                line.rstrip()
+                line.truncate(width, overflow=overflow)
+                line.pad_left((width - cell_len(line.plain)) // 2)
+                line.pad_right(width - cell_len(line.plain))
+        elif justify == "right":
+            for line in self._lines:
+                line.rstrip()
+                line.truncate(width, overflow=overflow)
+                line.pad_left(width - cell_len(line.plain))
+        elif justify == "full":
+            for line_index, line in enumerate(self._lines):
+                if line_index == len(self._lines) - 1:
+                    break
+                words = line.split(" ")
+                words_size = sum(cell_len(word.plain) for word in words)
+                num_spaces = len(words) - 1
+                spaces = [1 for _ in range(num_spaces)]
+                index = 0
+                if spaces:
+                    while words_size + num_spaces < width:
+                        spaces[len(spaces) - index - 1] += 1
+                        num_spaces += 1
+                        index = (index + 1) % len(spaces)
+                tokens: List[Text] = []
+                for index, (word, next_word) in enumerate(
+                    zip_longest(words, words[1:])
+                ):
+                    tokens.append(word)
+                    if index < len(spaces):
+                        style = word.get_style_at_offset(console, -1)
+                        next_style = next_word.get_style_at_offset(console, 0)
+                        space_style = style if style == next_style else line.style
+                        tokens.append(Text(" " * spaces[index], style=space_style))
+                self[line_index] = Text("").join(tokens)
diff --git a/.venv/Lib/site-packages/rich/control.py b/.venv/Lib/site-packages/rich/control.py
new file mode 100644 (file)
index 0000000..a8a9125
--- /dev/null
@@ -0,0 +1,225 @@
+import sys
+import time
+from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union
+
+if sys.version_info >= (3, 8):
+    from typing import Final
+else:
+    from typing_extensions import Final  # pragma: no cover
+
+from .segment import ControlCode, ControlType, Segment
+
+if TYPE_CHECKING:
+    from .console import Console, ConsoleOptions, RenderResult
+
+STRIP_CONTROL_CODES: Final = [
+    7,  # Bell
+    8,  # Backspace
+    11,  # Vertical tab
+    12,  # Form feed
+    13,  # Carriage return
+]
+_CONTROL_STRIP_TRANSLATE: Final = {
+    _codepoint: None for _codepoint in STRIP_CONTROL_CODES
+}
+
+CONTROL_ESCAPE: Final = {
+    7: "\\a",
+    8: "\\b",
+    11: "\\v",
+    12: "\\f",
+    13: "\\r",
+}
+
+CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = {
+    ControlType.BELL: lambda: "\x07",
+    ControlType.CARRIAGE_RETURN: lambda: "\r",
+    ControlType.HOME: lambda: "\x1b[H",
+    ControlType.CLEAR: lambda: "\x1b[2J",
+    ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h",
+    ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l",
+    ControlType.SHOW_CURSOR: lambda: "\x1b[?25h",
+    ControlType.HIDE_CURSOR: lambda: "\x1b[?25l",
+    ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A",
+    ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B",
+    ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C",
+    ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D",
+    ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G",
+    ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K",
+    ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H",
+    ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07",
+}
+
+
+class Control:
+    """A renderable that inserts a control code (non printable but may move cursor).
+
+    Args:
+        *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a
+            tuple of ControlType and an integer parameter
+    """
+
+    __slots__ = ["segment"]
+
+    def __init__(self, *codes: Union[ControlType, ControlCode]) -> None:
+        control_codes: List[ControlCode] = [
+            (code,) if isinstance(code, ControlType) else code for code in codes
+        ]
+        _format_map = CONTROL_CODES_FORMAT
+        rendered_codes = "".join(
+            _format_map[code](*parameters) for code, *parameters in control_codes
+        )
+        self.segment = Segment(rendered_codes, None, control_codes)
+
+    @classmethod
+    def bell(cls) -> "Control":
+        """Ring the 'bell'."""
+        return cls(ControlType.BELL)
+
+    @classmethod
+    def home(cls) -> "Control":
+        """Move cursor to 'home' position."""
+        return cls(ControlType.HOME)
+
+    @classmethod
+    def move(cls, x: int = 0, y: int = 0) -> "Control":
+        """Move cursor relative to current position.
+
+        Args:
+            x (int): X offset.
+            y (int): Y offset.
+
+        Returns:
+            ~Control: Control object.
+
+        """
+
+        def get_codes() -> Iterable[ControlCode]:
+            control = ControlType
+            if x:
+                yield (
+                    control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD,
+                    abs(x),
+                )
+            if y:
+                yield (
+                    control.CURSOR_DOWN if y > 0 else control.CURSOR_UP,
+                    abs(y),
+                )
+
+        control = cls(*get_codes())
+        return control
+
+    @classmethod
+    def move_to_column(cls, x: int, y: int = 0) -> "Control":
+        """Move to the given column, optionally add offset to row.
+
+        Returns:
+            x (int): absolute x (column)
+            y (int): optional y offset (row)
+
+        Returns:
+            ~Control: Control object.
+        """
+
+        return (
+            cls(
+                (ControlType.CURSOR_MOVE_TO_COLUMN, x),
+                (
+                    ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP,
+                    abs(y),
+                ),
+            )
+            if y
+            else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x))
+        )
+
+    @classmethod
+    def move_to(cls, x: int, y: int) -> "Control":
+        """Move cursor to absolute position.
+
+        Args:
+            x (int): x offset (column)
+            y (int): y offset (row)
+
+        Returns:
+            ~Control: Control object.
+        """
+        return cls((ControlType.CURSOR_MOVE_TO, x, y))
+
+    @classmethod
+    def clear(cls) -> "Control":
+        """Clear the screen."""
+        return cls(ControlType.CLEAR)
+
+    @classmethod
+    def show_cursor(cls, show: bool) -> "Control":
+        """Show or hide the cursor."""
+        return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR)
+
+    @classmethod
+    def alt_screen(cls, enable: bool) -> "Control":
+        """Enable or disable alt screen."""
+        if enable:
+            return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME)
+        else:
+            return cls(ControlType.DISABLE_ALT_SCREEN)
+
+    @classmethod
+    def title(cls, title: str) -> "Control":
+        """Set the terminal window title
+
+        Args:
+            title (str): The new terminal window title
+        """
+        return cls((ControlType.SET_WINDOW_TITLE, title))
+
+    def __str__(self) -> str:
+        return self.segment.text
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        if self.segment.text:
+            yield self.segment
+
+
+def strip_control_codes(
+    text: str, _translate_table: Dict[int, None] = _CONTROL_STRIP_TRANSLATE
+) -> str:
+    """Remove control codes from text.
+
+    Args:
+        text (str): A string possibly contain control codes.
+
+    Returns:
+        str: String with control codes removed.
+    """
+    return text.translate(_translate_table)
+
+
+def escape_control_codes(
+    text: str,
+    _translate_table: Dict[int, str] = CONTROL_ESCAPE,
+) -> str:
+    """Replace control codes with their "escaped" equivalent in the given text.
+    (e.g. "\b" becomes "\\b")
+
+    Args:
+        text (str): A string possibly containing control codes.
+
+    Returns:
+        str: String with control codes replaced with their escaped version.
+    """
+    return text.translate(_translate_table)
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich.console import Console
+
+    console = Console()
+    console.print("Look at the title of your terminal window ^")
+    # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!")))
+    for i in range(10):
+        console.set_window_title("🚀 Loading" + "." * i)
+        time.sleep(0.5)
diff --git a/.venv/Lib/site-packages/rich/default_styles.py b/.venv/Lib/site-packages/rich/default_styles.py
new file mode 100644 (file)
index 0000000..3a0ad83
--- /dev/null
@@ -0,0 +1,193 @@
+from typing import Dict
+
+from .style import Style
+
+DEFAULT_STYLES: Dict[str, Style] = {
+    "none": Style.null(),
+    "reset": Style(
+        color="default",
+        bgcolor="default",
+        dim=False,
+        bold=False,
+        italic=False,
+        underline=False,
+        blink=False,
+        blink2=False,
+        reverse=False,
+        conceal=False,
+        strike=False,
+    ),
+    "dim": Style(dim=True),
+    "bright": Style(dim=False),
+    "bold": Style(bold=True),
+    "strong": Style(bold=True),
+    "code": Style(reverse=True, bold=True),
+    "italic": Style(italic=True),
+    "emphasize": Style(italic=True),
+    "underline": Style(underline=True),
+    "blink": Style(blink=True),
+    "blink2": Style(blink2=True),
+    "reverse": Style(reverse=True),
+    "strike": Style(strike=True),
+    "black": Style(color="black"),
+    "red": Style(color="red"),
+    "green": Style(color="green"),
+    "yellow": Style(color="yellow"),
+    "magenta": Style(color="magenta"),
+    "cyan": Style(color="cyan"),
+    "white": Style(color="white"),
+    "inspect.attr": Style(color="yellow", italic=True),
+    "inspect.attr.dunder": Style(color="yellow", italic=True, dim=True),
+    "inspect.callable": Style(bold=True, color="red"),
+    "inspect.async_def": Style(italic=True, color="bright_cyan"),
+    "inspect.def": Style(italic=True, color="bright_cyan"),
+    "inspect.class": Style(italic=True, color="bright_cyan"),
+    "inspect.error": Style(bold=True, color="red"),
+    "inspect.equals": Style(),
+    "inspect.help": Style(color="cyan"),
+    "inspect.doc": Style(dim=True),
+    "inspect.value.border": Style(color="green"),
+    "live.ellipsis": Style(bold=True, color="red"),
+    "layout.tree.row": Style(dim=False, color="red"),
+    "layout.tree.column": Style(dim=False, color="blue"),
+    "logging.keyword": Style(bold=True, color="yellow"),
+    "logging.level.notset": Style(dim=True),
+    "logging.level.debug": Style(color="green"),
+    "logging.level.info": Style(color="blue"),
+    "logging.level.warning": Style(color="yellow"),
+    "logging.level.error": Style(color="red", bold=True),
+    "logging.level.critical": Style(color="red", bold=True, reverse=True),
+    "log.level": Style.null(),
+    "log.time": Style(color="cyan", dim=True),
+    "log.message": Style.null(),
+    "log.path": Style(dim=True),
+    "repr.ellipsis": Style(color="yellow"),
+    "repr.indent": Style(color="green", dim=True),
+    "repr.error": Style(color="red", bold=True),
+    "repr.str": Style(color="green", italic=False, bold=False),
+    "repr.brace": Style(bold=True),
+    "repr.comma": Style(bold=True),
+    "repr.ipv4": Style(bold=True, color="bright_green"),
+    "repr.ipv6": Style(bold=True, color="bright_green"),
+    "repr.eui48": Style(bold=True, color="bright_green"),
+    "repr.eui64": Style(bold=True, color="bright_green"),
+    "repr.tag_start": Style(bold=True),
+    "repr.tag_name": Style(color="bright_magenta", bold=True),
+    "repr.tag_contents": Style(color="default"),
+    "repr.tag_end": Style(bold=True),
+    "repr.attrib_name": Style(color="yellow", italic=False),
+    "repr.attrib_equal": Style(bold=True),
+    "repr.attrib_value": Style(color="magenta", italic=False),
+    "repr.number": Style(color="cyan", bold=True, italic=False),
+    "repr.number_complex": Style(color="cyan", bold=True, italic=False),  # same
+    "repr.bool_true": Style(color="bright_green", italic=True),
+    "repr.bool_false": Style(color="bright_red", italic=True),
+    "repr.none": Style(color="magenta", italic=True),
+    "repr.url": Style(underline=True, color="bright_blue", italic=False, bold=False),
+    "repr.uuid": Style(color="bright_yellow", bold=False),
+    "repr.call": Style(color="magenta", bold=True),
+    "repr.path": Style(color="magenta"),
+    "repr.filename": Style(color="bright_magenta"),
+    "rule.line": Style(color="bright_green"),
+    "rule.text": Style.null(),
+    "json.brace": Style(bold=True),
+    "json.bool_true": Style(color="bright_green", italic=True),
+    "json.bool_false": Style(color="bright_red", italic=True),
+    "json.null": Style(color="magenta", italic=True),
+    "json.number": Style(color="cyan", bold=True, italic=False),
+    "json.str": Style(color="green", italic=False, bold=False),
+    "json.key": Style(color="blue", bold=True),
+    "prompt": Style.null(),
+    "prompt.choices": Style(color="magenta", bold=True),
+    "prompt.default": Style(color="cyan", bold=True),
+    "prompt.invalid": Style(color="red"),
+    "prompt.invalid.choice": Style(color="red"),
+    "pretty": Style.null(),
+    "scope.border": Style(color="blue"),
+    "scope.key": Style(color="yellow", italic=True),
+    "scope.key.special": Style(color="yellow", italic=True, dim=True),
+    "scope.equals": Style(color="red"),
+    "table.header": Style(bold=True),
+    "table.footer": Style(bold=True),
+    "table.cell": Style.null(),
+    "table.title": Style(italic=True),
+    "table.caption": Style(italic=True, dim=True),
+    "traceback.error": Style(color="red", italic=True),
+    "traceback.border.syntax_error": Style(color="bright_red"),
+    "traceback.border": Style(color="red"),
+    "traceback.text": Style.null(),
+    "traceback.title": Style(color="red", bold=True),
+    "traceback.exc_type": Style(color="bright_red", bold=True),
+    "traceback.exc_value": Style.null(),
+    "traceback.offset": Style(color="bright_red", bold=True),
+    "traceback.error_range": Style(underline=True, bold=True),
+    "traceback.note": Style(color="green", bold=True),
+    "traceback.group.border": Style(color="magenta"),
+    "bar.back": Style(color="grey23"),
+    "bar.complete": Style(color="rgb(249,38,114)"),
+    "bar.finished": Style(color="rgb(114,156,31)"),
+    "bar.pulse": Style(color="rgb(249,38,114)"),
+    "progress.description": Style.null(),
+    "progress.filesize": Style(color="green"),
+    "progress.filesize.total": Style(color="green"),
+    "progress.download": Style(color="green"),
+    "progress.elapsed": Style(color="yellow"),
+    "progress.percentage": Style(color="magenta"),
+    "progress.remaining": Style(color="cyan"),
+    "progress.data.speed": Style(color="red"),
+    "progress.spinner": Style(color="green"),
+    "status.spinner": Style(color="green"),
+    "tree": Style(),
+    "tree.line": Style(),
+    "markdown.paragraph": Style(),
+    "markdown.text": Style(),
+    "markdown.em": Style(italic=True),
+    "markdown.emph": Style(italic=True),  # For commonmark backwards compatibility
+    "markdown.strong": Style(bold=True),
+    "markdown.code": Style(bold=True, color="cyan", bgcolor="black"),
+    "markdown.code_block": Style(color="cyan", bgcolor="black"),
+    "markdown.block_quote": Style(color="magenta"),
+    "markdown.list": Style(color="cyan"),
+    "markdown.item": Style(),
+    "markdown.item.bullet": Style(color="yellow", bold=True),
+    "markdown.item.number": Style(color="yellow", bold=True),
+    "markdown.hr": Style(color="yellow"),
+    "markdown.h1.border": Style(),
+    "markdown.h1": Style(bold=True),
+    "markdown.h2": Style(bold=True, underline=True),
+    "markdown.h3": Style(bold=True),
+    "markdown.h4": Style(bold=True, dim=True),
+    "markdown.h5": Style(underline=True),
+    "markdown.h6": Style(italic=True),
+    "markdown.h7": Style(italic=True, dim=True),
+    "markdown.link": Style(color="bright_blue"),
+    "markdown.link_url": Style(color="blue", underline=True),
+    "markdown.s": Style(strike=True),
+    "iso8601.date": Style(color="blue"),
+    "iso8601.time": Style(color="magenta"),
+    "iso8601.timezone": Style(color="yellow"),
+}
+
+
+if __name__ == "__main__":  # pragma: no cover
+    import argparse
+    import io
+
+    from rich.console import Console
+    from rich.table import Table
+    from rich.text import Text
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--html", action="store_true", help="Export as HTML table")
+    args = parser.parse_args()
+    html: bool = args.html
+    console = Console(record=True, width=70, file=io.StringIO()) if html else Console()
+
+    table = Table("Name", "Styling")
+
+    for style_name, style in DEFAULT_STYLES.items():
+        table.add_row(Text(style_name, style=style), str(style))
+
+    console.print(table)
+    if html:
+        print(console.export_html(inline_styles=True))
diff --git a/.venv/Lib/site-packages/rich/diagnose.py b/.venv/Lib/site-packages/rich/diagnose.py
new file mode 100644 (file)
index 0000000..5d16387
--- /dev/null
@@ -0,0 +1,38 @@
+import os
+import platform
+
+from rich import inspect
+from rich.console import Console, get_windows_console_features
+from rich.panel import Panel
+from rich.pretty import Pretty
+
+
+def report() -> None:  # pragma: no cover
+    """Print a report to the terminal with debugging information"""
+    console = Console()
+    inspect(console)
+    features = get_windows_console_features()
+    inspect(features)
+
+    env_names = (
+        "CLICOLOR",
+        "COLORTERM",
+        "COLUMNS",
+        "JPY_PARENT_PID",
+        "JUPYTER_COLUMNS",
+        "JUPYTER_LINES",
+        "LINES",
+        "NO_COLOR",
+        "TERM_PROGRAM",
+        "TERM",
+        "TTY_COMPATIBLE",
+        "VSCODE_VERBOSE_LOGGING",
+    )
+    env = {name: os.getenv(name) for name in env_names}
+    console.print(Panel.fit((Pretty(env)), title="[b]Environment Variables"))
+
+    console.print(f'platform="{platform.system()}"')
+
+
+if __name__ == "__main__":  # pragma: no cover
+    report()
diff --git a/.venv/Lib/site-packages/rich/emoji.py b/.venv/Lib/site-packages/rich/emoji.py
new file mode 100644 (file)
index 0000000..d5a1062
--- /dev/null
@@ -0,0 +1,96 @@
+import sys
+from typing import TYPE_CHECKING, Optional, Union
+
+from .jupyter import JupyterMixin
+from .segment import Segment
+from .style import Style
+from ._emoji_codes import EMOJI
+from ._emoji_replace import _emoji_replace
+
+if sys.version_info >= (3, 8):
+    from typing import Literal
+else:
+    from typing_extensions import Literal  # pragma: no cover
+
+
+if TYPE_CHECKING:
+    from .console import Console, ConsoleOptions, RenderResult
+
+
+EmojiVariant = Literal["emoji", "text"]
+
+
+class NoEmoji(Exception):
+    """No emoji by that name."""
+
+
+class Emoji(JupyterMixin):
+    __slots__ = ["name", "style", "_char", "variant"]
+
+    VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"}
+
+    def __init__(
+        self,
+        name: str,
+        style: Union[str, Style] = "none",
+        variant: Optional[EmojiVariant] = None,
+    ) -> None:
+        """A single emoji character.
+
+        Args:
+            name (str): Name of emoji.
+            style (Union[str, Style], optional): Optional style. Defaults to None.
+
+        Raises:
+            NoEmoji: If the emoji doesn't exist.
+        """
+        self.name = name
+        self.style = style
+        self.variant = variant
+        try:
+            self._char = EMOJI[name]
+        except KeyError:
+            raise NoEmoji(f"No emoji called {name!r}")
+        if variant is not None:
+            self._char += self.VARIANTS.get(variant, "")
+
+    @classmethod
+    def replace(cls, text: str) -> str:
+        """Replace emoji markup with corresponding unicode characters.
+
+        Args:
+            text (str): A string with emojis codes, e.g. "Hello :smiley:!"
+
+        Returns:
+            str: A string with emoji codes replaces with actual emoji.
+        """
+        return _emoji_replace(text)
+
+    def __repr__(self) -> str:
+        return f"<emoji {self.name!r}>"
+
+    def __str__(self) -> str:
+        return self._char
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        yield Segment(self._char, console.get_style(self.style))
+
+
+if __name__ == "__main__":  # pragma: no cover
+    import sys
+
+    from rich.columns import Columns
+    from rich.console import Console
+
+    console = Console(record=True)
+
+    columns = Columns(
+        (f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name),
+        column_first=True,
+    )
+
+    console.print(columns)
+    if len(sys.argv) > 1:
+        console.save_html(sys.argv[1])
diff --git a/.venv/Lib/site-packages/rich/errors.py b/.venv/Lib/site-packages/rich/errors.py
new file mode 100644 (file)
index 0000000..0bcbe53
--- /dev/null
@@ -0,0 +1,34 @@
+class ConsoleError(Exception):
+    """An error in console operation."""
+
+
+class StyleError(Exception):
+    """An error in styles."""
+
+
+class StyleSyntaxError(ConsoleError):
+    """Style was badly formatted."""
+
+
+class MissingStyle(StyleError):
+    """No such style."""
+
+
+class StyleStackError(ConsoleError):
+    """Style stack is invalid."""
+
+
+class NotRenderableError(ConsoleError):
+    """Object is not renderable."""
+
+
+class MarkupError(ConsoleError):
+    """Markup was badly formatted."""
+
+
+class LiveError(ConsoleError):
+    """Error related to Live display."""
+
+
+class NoAltScreen(ConsoleError):
+    """Alt screen mode was required."""
diff --git a/.venv/Lib/site-packages/rich/file_proxy.py b/.venv/Lib/site-packages/rich/file_proxy.py
new file mode 100644 (file)
index 0000000..4b0b0da
--- /dev/null
@@ -0,0 +1,57 @@
+import io
+from typing import IO, TYPE_CHECKING, Any, List
+
+from .ansi import AnsiDecoder
+from .text import Text
+
+if TYPE_CHECKING:
+    from .console import Console
+
+
+class FileProxy(io.TextIOBase):
+    """Wraps a file (e.g. sys.stdout) and redirects writes to a console."""
+
+    def __init__(self, console: "Console", file: IO[str]) -> None:
+        self.__console = console
+        self.__file = file
+        self.__buffer: List[str] = []
+        self.__ansi_decoder = AnsiDecoder()
+
+    @property
+    def rich_proxied_file(self) -> IO[str]:
+        """Get proxied file."""
+        return self.__file
+
+    def __getattr__(self, name: str) -> Any:
+        return getattr(self.__file, name)
+
+    def write(self, text: str) -> int:
+        if not isinstance(text, str):
+            raise TypeError(f"write() argument must be str, not {type(text).__name__}")
+        buffer = self.__buffer
+        lines: List[str] = []
+        while text:
+            line, new_line, text = text.partition("\n")
+            if new_line:
+                lines.append("".join(buffer) + line)
+                buffer.clear()
+            else:
+                buffer.append(line)
+                break
+        if lines:
+            console = self.__console
+            with console:
+                output = Text("\n").join(
+                    self.__ansi_decoder.decode_line(line) for line in lines
+                )
+                console.print(output)
+        return len(text)
+
+    def flush(self) -> None:
+        output = "".join(self.__buffer)
+        if output:
+            self.__console.print(output)
+        del self.__buffer[:]
+
+    def fileno(self) -> int:
+        return self.__file.fileno()
diff --git a/.venv/Lib/site-packages/rich/filesize.py b/.venv/Lib/site-packages/rich/filesize.py
new file mode 100644 (file)
index 0000000..83bc911
--- /dev/null
@@ -0,0 +1,88 @@
+"""Functions for reporting filesizes. Borrowed from https://github.com/PyFilesystem/pyfilesystem2
+
+The functions declared in this module should cover the different
+use cases needed to generate a string representation of a file size
+using several different units. Since there are many standards regarding
+file size units, three different functions have been implemented.
+
+See Also:
+    * `Wikipedia: Binary prefix <https://en.wikipedia.org/wiki/Binary_prefix>`_
+
+"""
+
+__all__ = ["decimal"]
+
+from typing import Iterable, List, Optional, Tuple
+
+
+def _to_str(
+    size: int,
+    suffixes: Iterable[str],
+    base: int,
+    *,
+    precision: Optional[int] = 1,
+    separator: Optional[str] = " ",
+) -> str:
+    if size == 1:
+        return "1 byte"
+    elif size < base:
+        return f"{size:,} bytes"
+
+    for i, suffix in enumerate(suffixes, 2):  # noqa: B007
+        unit = base**i
+        if size < unit:
+            break
+    return "{:,.{precision}f}{separator}{}".format(
+        (base * size / unit),
+        suffix,
+        precision=precision,
+        separator=separator,
+    )
+
+
+def pick_unit_and_suffix(size: int, suffixes: List[str], base: int) -> Tuple[int, str]:
+    """Pick a suffix and base for the given size."""
+    for i, suffix in enumerate(suffixes):
+        unit = base**i
+        if size < unit * base:
+            break
+    return unit, suffix
+
+
+def decimal(
+    size: int,
+    *,
+    precision: Optional[int] = 1,
+    separator: Optional[str] = " ",
+) -> str:
+    """Convert a filesize in to a string (powers of 1000, SI prefixes).
+
+    In this convention, ``1000 B = 1 kB``.
+
+    This is typically the format used to advertise the storage
+    capacity of USB flash drives and the like (*256 MB* meaning
+    actually a storage capacity of more than *256 000 000 B*),
+    or used by **Mac OS X** since v10.6 to report file sizes.
+
+    Arguments:
+        int (size): A file size.
+        int (precision): The number of decimal places to include (default = 1).
+        str (separator): The string to separate the value from the units (default = " ").
+
+    Returns:
+        `str`: A string containing a abbreviated file size and units.
+
+    Example:
+        >>> filesize.decimal(30000)
+        '30.0 kB'
+        >>> filesize.decimal(30000, precision=2, separator="")
+        '30.00kB'
+
+    """
+    return _to_str(
+        size,
+        ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"),
+        1000,
+        precision=precision,
+        separator=separator,
+    )
diff --git a/.venv/Lib/site-packages/rich/highlighter.py b/.venv/Lib/site-packages/rich/highlighter.py
new file mode 100644 (file)
index 0000000..e4c462e
--- /dev/null
@@ -0,0 +1,232 @@
+import re
+from abc import ABC, abstractmethod
+from typing import List, Union
+
+from .text import Span, Text
+
+
+def _combine_regex(*regexes: str) -> str:
+    """Combine a number of regexes in to a single regex.
+
+    Returns:
+        str: New regex with all regexes ORed together.
+    """
+    return "|".join(regexes)
+
+
+class Highlighter(ABC):
+    """Abstract base class for highlighters."""
+
+    def __call__(self, text: Union[str, Text]) -> Text:
+        """Highlight a str or Text instance.
+
+        Args:
+            text (Union[str, ~Text]): Text to highlight.
+
+        Raises:
+            TypeError: If not called with text or str.
+
+        Returns:
+            Text: A test instance with highlighting applied.
+        """
+        if isinstance(text, str):
+            highlight_text = Text(text)
+        elif isinstance(text, Text):
+            highlight_text = text.copy()
+        else:
+            raise TypeError(f"str or Text instance required, not {text!r}")
+        self.highlight(highlight_text)
+        return highlight_text
+
+    @abstractmethod
+    def highlight(self, text: Text) -> None:
+        """Apply highlighting in place to text.
+
+        Args:
+            text (~Text): A text object highlight.
+        """
+
+
+class NullHighlighter(Highlighter):
+    """A highlighter object that doesn't highlight.
+
+    May be used to disable highlighting entirely.
+
+    """
+
+    def highlight(self, text: Text) -> None:
+        """Nothing to do"""
+
+
+class RegexHighlighter(Highlighter):
+    """Applies highlighting from a list of regular expressions."""
+
+    highlights: List[str] = []
+    base_style: str = ""
+
+    def highlight(self, text: Text) -> None:
+        """Highlight :class:`rich.text.Text` using regular expressions.
+
+        Args:
+            text (~Text): Text to highlighted.
+
+        """
+
+        highlight_regex = text.highlight_regex
+        for re_highlight in self.highlights:
+            highlight_regex(re_highlight, style_prefix=self.base_style)
+
+
+class ReprHighlighter(RegexHighlighter):
+    """Highlights the text typically produced from ``__repr__`` methods."""
+
+    base_style = "repr."
+    highlights = [
+        r"(?P<tag_start><)(?P<tag_name>[-\w.:|]*)(?P<tag_contents>[\w\W]*)(?P<tag_end>>)",
+        r'(?P<attrib_name>[\w_]{1,50})=(?P<attrib_value>"?[\w_]+"?)?',
+        r"(?P<brace>[][{}()])",
+        _combine_regex(
+            r"(?P<ipv4>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})",
+            r"(?P<ipv6>([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})",
+            r"(?P<eui64>(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})",
+            r"(?P<eui48>(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})",
+            r"(?P<uuid>[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})",
+            r"(?P<call>[\w.]*?)\(",
+            r"\b(?P<bool_true>True)\b|\b(?P<bool_false>False)\b|\b(?P<none>None)\b",
+            r"(?P<ellipsis>\.\.\.)",
+            r"(?P<number_complex>(?<!\w)(?:\-?[0-9]+\.?[0-9]*(?:e[-+]?\d+?)?)(?:[-+](?:[0-9]+\.?[0-9]*(?:e[-+]?\d+)?))?j)",
+            r"(?P<number>(?<!\w)\-?[0-9]+\.?[0-9]*(e[-+]?\d+?)?\b|0x[0-9a-fA-F]*)",
+            r"(?P<path>\B(/[-\w._+]+)*\/)(?P<filename>[-\w._+]*)?",
+            r"(?<![\\\w])(?P<str>b?'''.*?(?<!\\)'''|b?'.*?(?<!\\)'|b?\"\"\".*?(?<!\\)\"\"\"|b?\".*?(?<!\\)\")",
+            r"(?P<url>(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#~@]*)",
+        ),
+    ]
+
+
+class JSONHighlighter(RegexHighlighter):
+    """Highlights JSON"""
+
+    # Captures the start and end of JSON strings, handling escaped quotes
+    JSON_STR = r"(?<![\\\w])(?P<str>b?\".*?(?<!\\)\")"
+    JSON_WHITESPACE = {" ", "\n", "\r", "\t"}
+
+    base_style = "json."
+    highlights = [
+        _combine_regex(
+            r"(?P<brace>[\{\[\(\)\]\}])",
+            r"\b(?P<bool_true>true)\b|\b(?P<bool_false>false)\b|\b(?P<null>null)\b",
+            r"(?P<number>(?<!\w)\-?[0-9]+\.?[0-9]*(e[\-\+]?\d+?)?\b|0x[0-9a-fA-F]*)",
+            JSON_STR,
+        ),
+    ]
+
+    def highlight(self, text: Text) -> None:
+        super().highlight(text)
+
+        # Additional work to handle highlighting JSON keys
+        plain = text.plain
+        append = text.spans.append
+        whitespace = self.JSON_WHITESPACE
+        for match in re.finditer(self.JSON_STR, plain):
+            start, end = match.span()
+            cursor = end
+            while cursor < len(plain):
+                char = plain[cursor]
+                cursor += 1
+                if char == ":":
+                    append(Span(start, end, "json.key"))
+                elif char in whitespace:
+                    continue
+                break
+
+
+class ISO8601Highlighter(RegexHighlighter):
+    """Highlights the ISO8601 date time strings.
+    Regex reference: https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html
+    """
+
+    base_style = "iso8601."
+    highlights = [
+        #
+        # Dates
+        #
+        # Calendar month (e.g. 2008-08). The hyphen is required
+        r"^(?P<year>[0-9]{4})-(?P<month>1[0-2]|0[1-9])$",
+        # Calendar date w/o hyphens (e.g. 20080830)
+        r"^(?P<date>(?P<year>[0-9]{4})(?P<month>1[0-2]|0[1-9])(?P<day>3[01]|0[1-9]|[12][0-9]))$",
+        # Ordinal date (e.g. 2008-243). The hyphen is optional
+        r"^(?P<date>(?P<year>[0-9]{4})-?(?P<day>36[0-6]|3[0-5][0-9]|[12][0-9]{2}|0[1-9][0-9]|00[1-9]))$",
+        #
+        # Weeks
+        #
+        # Week of the year (e.g., 2008-W35). The hyphen is optional
+        r"^(?P<date>(?P<year>[0-9]{4})-?W(?P<week>5[0-3]|[1-4][0-9]|0[1-9]))$",
+        # Week date (e.g., 2008-W35-6). The hyphens are optional
+        r"^(?P<date>(?P<year>[0-9]{4})-?W(?P<week>5[0-3]|[1-4][0-9]|0[1-9])-?(?P<day>[1-7]))$",
+        #
+        # Times
+        #
+        # Hours and minutes (e.g., 17:21). The colon is optional
+        r"^(?P<time>(?P<hour>2[0-3]|[01][0-9]):?(?P<minute>[0-5][0-9]))$",
+        # Hours, minutes, and seconds w/o colons (e.g., 172159)
+        r"^(?P<time>(?P<hour>2[0-3]|[01][0-9])(?P<minute>[0-5][0-9])(?P<second>[0-5][0-9]))$",
+        # Time zone designator (e.g., Z, +07 or +07:00). The colons and the minutes are optional
+        r"^(?P<timezone>(Z|[+-](?:2[0-3]|[01][0-9])(?::?(?:[0-5][0-9]))?))$",
+        # Hours, minutes, and seconds with time zone designator (e.g., 17:21:59+07:00).
+        # All the colons are optional. The minutes in the time zone designator are also optional
+        r"^(?P<time>(?P<hour>2[0-3]|[01][0-9])(?P<minute>[0-5][0-9])(?P<second>[0-5][0-9]))(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9])(?::?(?:[0-5][0-9]))?)$",
+        #
+        # Date and Time
+        #
+        # Calendar date with hours, minutes, and seconds (e.g., 2008-08-30 17:21:59 or 20080830 172159).
+        # A space is required between the date and the time. The hyphens and colons are optional.
+        # This regex matches dates and times that specify some hyphens or colons but omit others.
+        # This does not follow ISO 8601
+        r"^(?P<date>(?P<year>[0-9]{4})(?P<hyphen>-)?(?P<month>1[0-2]|0[1-9])(?(hyphen)-)(?P<day>3[01]|0[1-9]|[12][0-9])) (?P<time>(?P<hour>2[0-3]|[01][0-9])(?(hyphen):)(?P<minute>[0-5][0-9])(?(hyphen):)(?P<second>[0-5][0-9]))$",
+        #
+        # XML Schema dates and times
+        #
+        # Date, with optional time zone (e.g., 2008-08-30 or 2008-08-30+07:00).
+        # Hyphens are required. This is the XML Schema 'date' type
+        r"^(?P<date>(?P<year>-?(?:[1-9][0-9]*)?[0-9]{4})-(?P<month>1[0-2]|0[1-9])-(?P<day>3[01]|0[1-9]|[12][0-9]))(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$",
+        # Time, with optional fractional seconds and time zone (e.g., 01:45:36 or 01:45:36.123+07:00).
+        # There is no limit on the number of digits for the fractional seconds. This is the XML Schema 'time' type
+        r"^(?P<time>(?P<hour>2[0-3]|[01][0-9]):(?P<minute>[0-5][0-9]):(?P<second>[0-5][0-9])(?P<frac>\.[0-9]+)?)(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$",
+        # Date and time, with optional fractional seconds and time zone (e.g., 2008-08-30T01:45:36 or 2008-08-30T01:45:36.123Z).
+        # This is the XML Schema 'dateTime' type
+        r"^(?P<date>(?P<year>-?(?:[1-9][0-9]*)?[0-9]{4})-(?P<month>1[0-2]|0[1-9])-(?P<day>3[01]|0[1-9]|[12][0-9]))T(?P<time>(?P<hour>2[0-3]|[01][0-9]):(?P<minute>[0-5][0-9]):(?P<second>[0-5][0-9])(?P<ms>\.[0-9]+)?)(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$",
+    ]
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from .console import Console
+
+    console = Console()
+    console.print("[bold green]hello world![/bold green]")
+    console.print("'[bold green]hello world![/bold green]'")
+
+    console.print(" /foo")
+    console.print("/foo/")
+    console.print("/foo/bar")
+    console.print("foo/bar/baz")
+
+    console.print("/foo/bar/baz?foo=bar+egg&egg=baz")
+    console.print("/foo/bar/baz/")
+    console.print("/foo/bar/baz/egg")
+    console.print("/foo/bar/baz/egg.py")
+    console.print("/foo/bar/baz/egg.py word")
+    console.print(" /foo/bar/baz/egg.py word")
+    console.print("foo /foo/bar/baz/egg.py word")
+    console.print("foo /foo/bar/ba._++z/egg+.py word")
+    console.print("https://example.org?foo=bar#header")
+
+    console.print(1234567.34)
+    console.print(1 / 2)
+    console.print(-1 / 123123123123)
+
+    console.print(
+        "127.0.1.1 bar 192.168.1.4 2001:0db8:85a3:0000:0000:8a2e:0370:7334 foo"
+    )
+    import json
+
+    console.print_json(json.dumps(obj={"name": "apple", "count": 1}), indent=None)
diff --git a/.venv/Lib/site-packages/rich/json.py b/.venv/Lib/site-packages/rich/json.py
new file mode 100644 (file)
index 0000000..f048902
--- /dev/null
@@ -0,0 +1,139 @@
+from pathlib import Path
+from json import loads, dumps
+from typing import Any, Callable, Optional, Union
+
+from .text import Text
+from .highlighter import JSONHighlighter, NullHighlighter
+
+
+class JSON:
+    """A renderable which pretty prints JSON.
+
+    Args:
+        json (str): JSON encoded data.
+        indent (Union[None, int, str], optional): Number of characters to indent by. Defaults to 2.
+        highlight (bool, optional): Enable highlighting. Defaults to True.
+        skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False.
+        ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False.
+        check_circular (bool, optional): Check for circular references. Defaults to True.
+        allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True.
+        default (Callable, optional): A callable that converts values that can not be encoded
+            in to something that can be JSON encoded. Defaults to None.
+        sort_keys (bool, optional): Sort dictionary keys. Defaults to False.
+    """
+
+    def __init__(
+        self,
+        json: str,
+        indent: Union[None, int, str] = 2,
+        highlight: bool = True,
+        skip_keys: bool = False,
+        ensure_ascii: bool = False,
+        check_circular: bool = True,
+        allow_nan: bool = True,
+        default: Optional[Callable[[Any], Any]] = None,
+        sort_keys: bool = False,
+    ) -> None:
+        data = loads(json)
+        json = dumps(
+            data,
+            indent=indent,
+            skipkeys=skip_keys,
+            ensure_ascii=ensure_ascii,
+            check_circular=check_circular,
+            allow_nan=allow_nan,
+            default=default,
+            sort_keys=sort_keys,
+        )
+        highlighter = JSONHighlighter() if highlight else NullHighlighter()
+        self.text = highlighter(json)
+        self.text.no_wrap = True
+        self.text.overflow = None
+
+    @classmethod
+    def from_data(
+        cls,
+        data: Any,
+        indent: Union[None, int, str] = 2,
+        highlight: bool = True,
+        skip_keys: bool = False,
+        ensure_ascii: bool = False,
+        check_circular: bool = True,
+        allow_nan: bool = True,
+        default: Optional[Callable[[Any], Any]] = None,
+        sort_keys: bool = False,
+    ) -> "JSON":
+        """Encodes a JSON object from arbitrary data.
+
+        Args:
+            data (Any): An object that may be encoded in to JSON
+            indent (Union[None, int, str], optional): Number of characters to indent by. Defaults to 2.
+            highlight (bool, optional): Enable highlighting. Defaults to True.
+            default (Callable, optional): Optional callable which will be called for objects that cannot be serialized. Defaults to None.
+            skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False.
+            ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False.
+            check_circular (bool, optional): Check for circular references. Defaults to True.
+            allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True.
+            default (Callable, optional): A callable that converts values that can not be encoded
+                in to something that can be JSON encoded. Defaults to None.
+            sort_keys (bool, optional): Sort dictionary keys. Defaults to False.
+
+        Returns:
+            JSON: New JSON object from the given data.
+        """
+        json_instance: "JSON" = cls.__new__(cls)
+        json = dumps(
+            data,
+            indent=indent,
+            skipkeys=skip_keys,
+            ensure_ascii=ensure_ascii,
+            check_circular=check_circular,
+            allow_nan=allow_nan,
+            default=default,
+            sort_keys=sort_keys,
+        )
+        highlighter = JSONHighlighter() if highlight else NullHighlighter()
+        json_instance.text = highlighter(json)
+        json_instance.text.no_wrap = True
+        json_instance.text.overflow = None
+        return json_instance
+
+    def __rich__(self) -> Text:
+        return self.text
+
+
+if __name__ == "__main__":
+    import argparse
+    import sys
+
+    parser = argparse.ArgumentParser(description="Pretty print json")
+    parser.add_argument(
+        "path",
+        metavar="PATH",
+        help="path to file, or - for stdin",
+    )
+    parser.add_argument(
+        "-i",
+        "--indent",
+        metavar="SPACES",
+        type=int,
+        help="Number of spaces in an indent",
+        default=2,
+    )
+    args = parser.parse_args()
+
+    from rich.console import Console
+
+    console = Console()
+    error_console = Console(stderr=True)
+
+    try:
+        if args.path == "-":
+            json_data = sys.stdin.read()
+        else:
+            json_data = Path(args.path).read_text()
+    except Exception as error:
+        error_console.print(f"Unable to read {args.path!r}; {error}")
+        sys.exit(-1)
+
+    console.print(JSON(json_data, indent=args.indent), soft_wrap=True)
diff --git a/.venv/Lib/site-packages/rich/jupyter.py b/.venv/Lib/site-packages/rich/jupyter.py
new file mode 100644 (file)
index 0000000..24135a9
--- /dev/null
@@ -0,0 +1,101 @@
+from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Sequence
+
+if TYPE_CHECKING:
+    from rich.console import ConsoleRenderable
+
+from . import get_console
+from .segment import Segment
+from .terminal_theme import DEFAULT_TERMINAL_THEME
+
+if TYPE_CHECKING:
+    from rich.console import ConsoleRenderable
+
+JUPYTER_HTML_FORMAT = """\
+<pre style="white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace">{code}</pre>
+"""
+
+
+class JupyterRenderable:
+    """A shim to write html to Jupyter notebook."""
+
+    def __init__(self, html: str, text: str) -> None:
+        self.html = html
+        self.text = text
+
+    def _repr_mimebundle_(
+        self, include: Sequence[str], exclude: Sequence[str], **kwargs: Any
+    ) -> Dict[str, str]:
+        data = {"text/plain": self.text, "text/html": self.html}
+        if include:
+            data = {k: v for (k, v) in data.items() if k in include}
+        if exclude:
+            data = {k: v for (k, v) in data.items() if k not in exclude}
+        return data
+
+
+class JupyterMixin:
+    """Add to an Rich renderable to make it render in Jupyter notebook."""
+
+    __slots__ = ()
+
+    def _repr_mimebundle_(
+        self: "ConsoleRenderable",
+        include: Sequence[str],
+        exclude: Sequence[str],
+        **kwargs: Any,
+    ) -> Dict[str, str]:
+        console = get_console()
+        segments = list(console.render(self, console.options))
+        html = _render_segments(segments)
+        text = console._render_buffer(segments)
+        data = {"text/plain": text, "text/html": html}
+        if include:
+            data = {k: v for (k, v) in data.items() if k in include}
+        if exclude:
+            data = {k: v for (k, v) in data.items() if k not in exclude}
+        return data
+
+
+def _render_segments(segments: Iterable[Segment]) -> str:
+    def escape(text: str) -> str:
+        """Escape html."""
+        return text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
+
+    fragments: List[str] = []
+    append_fragment = fragments.append
+    theme = DEFAULT_TERMINAL_THEME
+    for text, style, control in Segment.simplify(segments):
+        if control:
+            continue
+        text = escape(text)
+        if style:
+            rule = style.get_html_style(theme)
+            text = f'<span style="{rule}">{text}</span>' if rule else text
+            if style.link:
+                text = f'<a href="{style.link}" target="_blank">{text}</a>'
+        append_fragment(text)
+
+    code = "".join(fragments)
+    html = JUPYTER_HTML_FORMAT.format(code=code)
+
+    return html
+
+
+def display(segments: Iterable[Segment], text: str) -> None:
+    """Render segments to Jupyter."""
+    html = _render_segments(segments)
+    jupyter_renderable = JupyterRenderable(html, text)
+    try:
+        from IPython.display import display as ipython_display
+
+        ipython_display(jupyter_renderable)
+    except ModuleNotFoundError:
+        # Handle the case where the Console has force_jupyter=True,
+        # but IPython is not installed.
+        pass
+
+
+def print(*args: Any, **kwargs: Any) -> None:
+    """Proxy for Console print."""
+    console = get_console()
+    return console.print(*args, **kwargs)
diff --git a/.venv/Lib/site-packages/rich/layout.py b/.venv/Lib/site-packages/rich/layout.py
new file mode 100644 (file)
index 0000000..7fa2852
--- /dev/null
@@ -0,0 +1,442 @@
+from abc import ABC, abstractmethod
+from itertools import islice
+from operator import itemgetter
+from threading import RLock
+from typing import (
+    TYPE_CHECKING,
+    Dict,
+    Iterable,
+    List,
+    NamedTuple,
+    Optional,
+    Sequence,
+    Tuple,
+    Union,
+)
+
+from ._ratio import ratio_resolve
+from .align import Align
+from .console import Console, ConsoleOptions, RenderableType, RenderResult
+from .highlighter import ReprHighlighter
+from .panel import Panel
+from .pretty import Pretty
+from .region import Region
+from .repr import Result, rich_repr
+from .segment import Segment
+from .style import StyleType
+
+if TYPE_CHECKING:
+    from rich.tree import Tree
+
+
+class LayoutRender(NamedTuple):
+    """An individual layout render."""
+
+    region: Region
+    render: List[List[Segment]]
+
+
+RegionMap = Dict["Layout", Region]
+RenderMap = Dict["Layout", LayoutRender]
+
+
+class LayoutError(Exception):
+    """Layout related error."""
+
+
+class NoSplitter(LayoutError):
+    """Requested splitter does not exist."""
+
+
+class _Placeholder:
+    """An internal renderable used as a Layout placeholder."""
+
+    highlighter = ReprHighlighter()
+
+    def __init__(self, layout: "Layout", style: StyleType = "") -> None:
+        self.layout = layout
+        self.style = style
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        width = options.max_width
+        height = options.height or options.size.height
+        layout = self.layout
+        title = (
+            f"{layout.name!r} ({width} x {height})"
+            if layout.name
+            else f"({width} x {height})"
+        )
+        yield Panel(
+            Align.center(Pretty(layout), vertical="middle"),
+            style=self.style,
+            title=self.highlighter(title),
+            border_style="blue",
+            height=height,
+        )
+
+
+class Splitter(ABC):
+    """Base class for a splitter."""
+
+    name: str = ""
+
+    @abstractmethod
+    def get_tree_icon(self) -> str:
+        """Get the icon (emoji) used in layout.tree"""
+
+    @abstractmethod
+    def divide(
+        self, children: Sequence["Layout"], region: Region
+    ) -> Iterable[Tuple["Layout", Region]]:
+        """Divide a region amongst several child layouts.
+
+        Args:
+            children (Sequence(Layout)): A number of child layouts.
+            region (Region): A rectangular region to divide.
+        """
+
+
+class RowSplitter(Splitter):
+    """Split a layout region in to rows."""
+
+    name = "row"
+
+    def get_tree_icon(self) -> str:
+        return "[layout.tree.row]⬌"
+
+    def divide(
+        self, children: Sequence["Layout"], region: Region
+    ) -> Iterable[Tuple["Layout", Region]]:
+        x, y, width, height = region
+        render_widths = ratio_resolve(width, children)
+        offset = 0
+        _Region = Region
+        for child, child_width in zip(children, render_widths):
+            yield child, _Region(x + offset, y, child_width, height)
+            offset += child_width
+
+
+class ColumnSplitter(Splitter):
+    """Split a layout region in to columns."""
+
+    name = "column"
+
+    def get_tree_icon(self) -> str:
+        return "[layout.tree.column]⬍"
+
+    def divide(
+        self, children: Sequence["Layout"], region: Region
+    ) -> Iterable[Tuple["Layout", Region]]:
+        x, y, width, height = region
+        render_heights = ratio_resolve(height, children)
+        offset = 0
+        _Region = Region
+        for child, child_height in zip(children, render_heights):
+            yield child, _Region(x, y + offset, width, child_height)
+            offset += child_height
+
+
+@rich_repr
+class Layout:
+    """A renderable to divide a fixed height in to rows or columns.
+
+    Args:
+        renderable (RenderableType, optional): Renderable content, or None for placeholder. Defaults to None.
+        name (str, optional): Optional identifier for Layout. Defaults to None.
+        size (int, optional): Optional fixed size of layout. Defaults to None.
+        minimum_size (int, optional): Minimum size of layout. Defaults to 1.
+        ratio (int, optional): Optional ratio for flexible layout. Defaults to 1.
+        visible (bool, optional): Visibility of layout. Defaults to True.
+    """
+
+    splitters = {"row": RowSplitter, "column": ColumnSplitter}
+
+    def __init__(
+        self,
+        renderable: Optional[RenderableType] = None,
+        *,
+        name: Optional[str] = None,
+        size: Optional[int] = None,
+        minimum_size: int = 1,
+        ratio: int = 1,
+        visible: bool = True,
+    ) -> None:
+        self._renderable = renderable or _Placeholder(self)
+        self.size = size
+        self.minimum_size = minimum_size
+        self.ratio = ratio
+        self.name = name
+        self.visible = visible
+        self.splitter: Splitter = self.splitters["column"]()
+        self._children: List[Layout] = []
+        self._render_map: RenderMap = {}
+        self._lock = RLock()
+
+    def __rich_repr__(self) -> Result:
+        yield "name", self.name, None
+        yield "size", self.size, None
+        yield "minimum_size", self.minimum_size, 1
+        yield "ratio", self.ratio, 1
+
+    @property
+    def renderable(self) -> RenderableType:
+        """Layout renderable."""
+        return self if self._children else self._renderable
+
+    @property
+    def children(self) -> List["Layout"]:
+        """Gets (visible) layout children."""
+        return [child for child in self._children if child.visible]
+
+    @property
+    def map(self) -> RenderMap:
+        """Get a map of the last render."""
+        return self._render_map
+
+    def get(self, name: str) -> Optional["Layout"]:
+        """Get a named layout, or None if it doesn't exist.
+
+        Args:
+            name (str): Name of layout.
+
+        Returns:
+            Optional[Layout]: Layout instance or None if no layout was found.
+        """
+        if self.name == name:
+            return self
+        else:
+            for child in self._children:
+                named_layout = child.get(name)
+                if named_layout is not None:
+                    return named_layout
+        return None
+
+    def __getitem__(self, name: str) -> "Layout":
+        layout = self.get(name)
+        if layout is None:
+            raise KeyError(f"No layout with name {name!r}")
+        return layout
+
+    @property
+    def tree(self) -> "Tree":
+        """Get a tree renderable to show layout structure."""
+        from rich.styled import Styled
+        from rich.table import Table
+        from rich.tree import Tree
+
+        def summary(layout: "Layout") -> Table:
+            icon = layout.splitter.get_tree_icon()
+
+            table = Table.grid(padding=(0, 1, 0, 0))
+
+            text: RenderableType = (
+                Pretty(layout) if layout.visible else Styled(Pretty(layout), "dim")
+            )
+            table.add_row(icon, text)
+            _summary = table
+            return _summary
+
+        layout = self
+        tree = Tree(
+            summary(layout),
+            guide_style=f"layout.tree.{layout.splitter.name}",
+            highlight=True,
+        )
+
+        def recurse(tree: "Tree", layout: "Layout") -> None:
+            for child in layout._children:
+                recurse(
+                    tree.add(
+                        summary(child),
+                        guide_style=f"layout.tree.{child.splitter.name}",
+                    ),
+                    child,
+                )
+
+        recurse(tree, self)
+        return tree
+
+    def split(
+        self,
+        *layouts: Union["Layout", RenderableType],
+        splitter: Union[Splitter, str] = "column",
+    ) -> None:
+        """Split the layout in to multiple sub-layouts.
+
+        Args:
+            *layouts (Layout): Positional arguments should be (sub) Layout instances.
+            splitter (Union[Splitter, str]): Splitter instance or name of splitter.
+        """
+        _layouts = [
+            layout if isinstance(layout, Layout) else Layout(layout)
+            for layout in layouts
+        ]
+        try:
+            self.splitter = (
+                splitter
+                if isinstance(splitter, Splitter)
+                else self.splitters[splitter]()
+            )
+        except KeyError:
+            raise NoSplitter(f"No splitter called {splitter!r}")
+        self._children[:] = _layouts
+
+    def add_split(self, *layouts: Union["Layout", RenderableType]) -> None:
+        """Add a new layout(s) to existing split.
+
+        Args:
+            *layouts (Union[Layout, RenderableType]): Positional arguments should be renderables or (sub) Layout instances.
+
+        """
+        _layouts = (
+            layout if isinstance(layout, Layout) else Layout(layout)
+            for layout in layouts
+        )
+        self._children.extend(_layouts)
+
+    def split_row(self, *layouts: Union["Layout", RenderableType]) -> None:
+        """Split the layout in to a row (layouts side by side).
+
+        Args:
+            *layouts (Layout): Positional arguments should be (sub) Layout instances.
+        """
+        self.split(*layouts, splitter="row")
+
+    def split_column(self, *layouts: Union["Layout", RenderableType]) -> None:
+        """Split the layout in to a column (layouts stacked on top of each other).
+
+        Args:
+            *layouts (Layout): Positional arguments should be (sub) Layout instances.
+        """
+        self.split(*layouts, splitter="column")
+
+    def unsplit(self) -> None:
+        """Reset splits to initial state."""
+        del self._children[:]
+
+    def update(self, renderable: RenderableType) -> None:
+        """Update renderable.
+
+        Args:
+            renderable (RenderableType): New renderable object.
+        """
+        with self._lock:
+            self._renderable = renderable
+
+    def refresh_screen(self, console: "Console", layout_name: str) -> None:
+        """Refresh a sub-layout.
+
+        Args:
+            console (Console): Console instance where Layout is to be rendered.
+            layout_name (str): Name of layout.
+        """
+        with self._lock:
+            layout = self[layout_name]
+            region, _lines = self._render_map[layout]
+            (x, y, width, height) = region
+            lines = console.render_lines(
+                layout, console.options.update_dimensions(width, height)
+            )
+            self._render_map[layout] = LayoutRender(region, lines)
+            console.update_screen_lines(lines, x, y)
+
+    def _make_region_map(self, width: int, height: int) -> RegionMap:
+        """Create a dict that maps layout on to Region."""
+        stack: List[Tuple[Layout, Region]] = [(self, Region(0, 0, width, height))]
+        push = stack.append
+        pop = stack.pop
+        layout_regions: List[Tuple[Layout, Region]] = []
+        append_layout_region = layout_regions.append
+        while stack:
+            append_layout_region(pop())
+            layout, region = layout_regions[-1]
+            children = layout.children
+            if children:
+                for child_and_region in layout.splitter.divide(children, region):
+                    push(child_and_region)
+
+        region_map = {
+            layout: region
+            for layout, region in sorted(layout_regions, key=itemgetter(1))
+        }
+        return region_map
+
+    def render(self, console: Console, options: ConsoleOptions) -> RenderMap:
+        """Render the sub_layouts.
+
+        Args:
+            console (Console): Console instance.
+            options (ConsoleOptions): Console options.
+
+        Returns:
+            RenderMap: A dict that maps Layout on to a tuple of Region, lines
+        """
+        render_width = options.max_width
+        render_height = options.height or console.height
+        region_map = self._make_region_map(render_width, render_height)
+        layout_regions = [
+            (layout, region)
+            for layout, region in region_map.items()
+            if not layout.children
+        ]
+        render_map: Dict["Layout", "LayoutRender"] = {}
+        render_lines = console.render_lines
+        update_dimensions = options.update_dimensions
+
+        for layout, region in layout_regions:
+            lines = render_lines(
+                layout.renderable, update_dimensions(region.width, region.height)
+            )
+            render_map[layout] = LayoutRender(region, lines)
+        return render_map
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        with self._lock:
+            width = options.max_width or console.width
+            height = options.height or console.height
+            render_map = self.render(console, options.update_dimensions(width, height))
+            self._render_map = render_map
+            layout_lines: List[List[Segment]] = [[] for _ in range(height)]
+            _islice = islice
+            for region, lines in render_map.values():
+                _x, y, _layout_width, layout_height = region
+                for row, line in zip(
+                    _islice(layout_lines, y, y + layout_height), lines
+                ):
+                    row.extend(line)
+
+            new_line = Segment.line()
+            for layout_row in layout_lines:
+                yield from layout_row
+                yield new_line
+
+
+if __name__ == "__main__":
+    from rich.console import Console
+
+    console = Console()
+    layout = Layout()
+
+    layout.split_column(
+        Layout(name="header", size=3),
+        Layout(ratio=1, name="main"),
+        Layout(size=10, name="footer"),
+    )
+
+    layout["main"].split_row(Layout(name="side"), Layout(name="body", ratio=2))
+
+    layout["body"].split_row(Layout(name="content", ratio=2), Layout(name="s2"))
+
+    layout["s2"].split_column(
+        Layout(name="top"), Layout(name="middle"), Layout(name="bottom")
+    )
+
+    layout["side"].split_column(Layout(layout.tree, name="left1"), Layout(name="left2"))
+
+    layout["content"].update("foo")
+
+    console.print(layout)
diff --git a/.venv/Lib/site-packages/rich/live.py b/.venv/Lib/site-packages/rich/live.py
new file mode 100644 (file)
index 0000000..8738cf0
--- /dev/null
@@ -0,0 +1,375 @@
+import sys
+from threading import Event, RLock, Thread
+from types import TracebackType
+from typing import IO, Any, Callable, List, Optional, TextIO, Type, cast
+
+from . import get_console
+from .console import Console, ConsoleRenderable, RenderableType, RenderHook
+from .control import Control
+from .file_proxy import FileProxy
+from .jupyter import JupyterMixin
+from .live_render import LiveRender, VerticalOverflowMethod
+from .screen import Screen
+from .text import Text
+
+
+class _RefreshThread(Thread):
+    """A thread that calls refresh() at regular intervals."""
+
+    def __init__(self, live: "Live", refresh_per_second: float) -> None:
+        self.live = live
+        self.refresh_per_second = refresh_per_second
+        self.done = Event()
+        super().__init__(daemon=True)
+
+    def stop(self) -> None:
+        self.done.set()
+
+    def run(self) -> None:
+        while not self.done.wait(1 / self.refresh_per_second):
+            with self.live._lock:
+                if not self.done.is_set():
+                    self.live.refresh()
+
+
+class Live(JupyterMixin, RenderHook):
+    """Renders an auto-updating live display of any given renderable.
+
+    Args:
+        renderable (RenderableType, optional): The renderable to live display. Defaults to displaying nothing.
+        console (Console, optional): Optional Console instance. Defaults to an internal Console instance writing to stdout.
+        screen (bool, optional): Enable alternate screen mode. Defaults to False.
+        auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()` or `update()` with refresh flag. Defaults to True
+        refresh_per_second (float, optional): Number of times per second to refresh the live display. Defaults to 4.
+        transient (bool, optional): Clear the renderable on exit (has no effect when screen=True). Defaults to False.
+        redirect_stdout (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True.
+        redirect_stderr (bool, optional): Enable redirection of stderr. Defaults to True.
+        vertical_overflow (VerticalOverflowMethod, optional): How to handle renderable when it is too tall for the console. Defaults to "ellipsis".
+        get_renderable (Callable[[], RenderableType], optional): Optional callable to get renderable. Defaults to None.
+    """
+
+    def __init__(
+        self,
+        renderable: Optional[RenderableType] = None,
+        *,
+        console: Optional[Console] = None,
+        screen: bool = False,
+        auto_refresh: bool = True,
+        refresh_per_second: float = 4,
+        transient: bool = False,
+        redirect_stdout: bool = True,
+        redirect_stderr: bool = True,
+        vertical_overflow: VerticalOverflowMethod = "ellipsis",
+        get_renderable: Optional[Callable[[], RenderableType]] = None,
+    ) -> None:
+        assert refresh_per_second > 0, "refresh_per_second must be > 0"
+        self._renderable = renderable
+        self.console = console if console is not None else get_console()
+        self._screen = screen
+        self._alt_screen = False
+
+        self._redirect_stdout = redirect_stdout
+        self._redirect_stderr = redirect_stderr
+        self._restore_stdout: Optional[IO[str]] = None
+        self._restore_stderr: Optional[IO[str]] = None
+
+        self._lock = RLock()
+        self.ipy_widget: Optional[Any] = None
+        self.auto_refresh = auto_refresh
+        self._started: bool = False
+        self.transient = True if screen else transient
+
+        self._refresh_thread: Optional[_RefreshThread] = None
+        self.refresh_per_second = refresh_per_second
+
+        self.vertical_overflow = vertical_overflow
+        self._get_renderable = get_renderable
+        self._live_render = LiveRender(
+            self.get_renderable(), vertical_overflow=vertical_overflow
+        )
+
+    @property
+    def is_started(self) -> bool:
+        """Check if live display has been started."""
+        return self._started
+
+    def get_renderable(self) -> RenderableType:
+        renderable = (
+            self._get_renderable()
+            if self._get_renderable is not None
+            else self._renderable
+        )
+        return renderable or ""
+
+    def start(self, refresh: bool = False) -> None:
+        """Start live rendering display.
+
+        Args:
+            refresh (bool, optional): Also refresh. Defaults to False.
+        """
+        with self._lock:
+            if self._started:
+                return
+            self.console.set_live(self)
+            self._started = True
+            if self._screen:
+                self._alt_screen = self.console.set_alt_screen(True)
+            self.console.show_cursor(False)
+            self._enable_redirect_io()
+            self.console.push_render_hook(self)
+            if refresh:
+                try:
+                    self.refresh()
+                except Exception:
+                    # If refresh fails, we want to stop the redirection of sys.stderr,
+                    # so the error stacktrace is properly displayed in the terminal.
+                    # (or, if the code that calls Rich captures the exception and wants to display something,
+                    # let this be displayed in the terminal).
+                    self.stop()
+                    raise
+            if self.auto_refresh:
+                self._refresh_thread = _RefreshThread(self, self.refresh_per_second)
+                self._refresh_thread.start()
+
+    def stop(self) -> None:
+        """Stop live rendering display."""
+        with self._lock:
+            if not self._started:
+                return
+            self.console.clear_live()
+            self._started = False
+
+            if self.auto_refresh and self._refresh_thread is not None:
+                self._refresh_thread.stop()
+                self._refresh_thread = None
+            # allow it to fully render on the last even if overflow
+            self.vertical_overflow = "visible"
+            with self.console:
+                try:
+                    if not self._alt_screen and not self.console.is_jupyter:
+                        self.refresh()
+                finally:
+                    self._disable_redirect_io()
+                    self.console.pop_render_hook()
+                    if not self._alt_screen and self.console.is_terminal:
+                        self.console.line()
+                    self.console.show_cursor(True)
+                    if self._alt_screen:
+                        self.console.set_alt_screen(False)
+
+                    if self.transient and not self._alt_screen:
+                        self.console.control(self._live_render.restore_cursor())
+                    if self.ipy_widget is not None and self.transient:
+                        self.ipy_widget.close()  # pragma: no cover
+
+    def __enter__(self) -> "Live":
+        self.start(refresh=self._renderable is not None)
+        return self
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc_val: Optional[BaseException],
+        exc_tb: Optional[TracebackType],
+    ) -> None:
+        self.stop()
+
+    def _enable_redirect_io(self) -> None:
+        """Enable redirecting of stdout / stderr."""
+        if self.console.is_terminal or self.console.is_jupyter:
+            if self._redirect_stdout and not isinstance(sys.stdout, FileProxy):
+                self._restore_stdout = sys.stdout
+                sys.stdout = cast("TextIO", FileProxy(self.console, sys.stdout))
+            if self._redirect_stderr and not isinstance(sys.stderr, FileProxy):
+                self._restore_stderr = sys.stderr
+                sys.stderr = cast("TextIO", FileProxy(self.console, sys.stderr))
+
+    def _disable_redirect_io(self) -> None:
+        """Disable redirecting of stdout / stderr."""
+        if self._restore_stdout:
+            sys.stdout = cast("TextIO", self._restore_stdout)
+            self._restore_stdout = None
+        if self._restore_stderr:
+            sys.stderr = cast("TextIO", self._restore_stderr)
+            self._restore_stderr = None
+
+    @property
+    def renderable(self) -> RenderableType:
+        """Get the renderable that is being displayed
+
+        Returns:
+            RenderableType: Displayed renderable.
+        """
+        renderable = self.get_renderable()
+        return Screen(renderable) if self._alt_screen else renderable
+
+    def update(self, renderable: RenderableType, *, refresh: bool = False) -> None:
+        """Update the renderable that is being displayed
+
+        Args:
+            renderable (RenderableType): New renderable to use.
+            refresh (bool, optional): Refresh the display. Defaults to False.
+        """
+        if isinstance(renderable, str):
+            renderable = self.console.render_str(renderable)
+        with self._lock:
+            self._renderable = renderable
+            if refresh:
+                self.refresh()
+
+    def refresh(self) -> None:
+        """Update the display of the Live Render."""
+        with self._lock:
+            self._live_render.set_renderable(self.renderable)
+            if self.console.is_jupyter:  # pragma: no cover
+                try:
+                    from IPython.display import display
+                    from ipywidgets import Output
+                except ImportError:
+                    import warnings
+
+                    warnings.warn('install "ipywidgets" for Jupyter support')
+                else:
+                    if self.ipy_widget is None:
+                        self.ipy_widget = Output()
+                        display(self.ipy_widget)
+
+                    with self.ipy_widget:
+                        self.ipy_widget.clear_output(wait=True)
+                        self.console.print(self._live_render.renderable)
+            elif self.console.is_terminal and not self.console.is_dumb_terminal:
+                with self.console:
+                    self.console.print(Control())
+            elif (
+                not self._started and not self.transient
+            ):  # if it is finished allow files or dumb-terminals to see final result
+                with self.console:
+                    self.console.print(Control())
+
+    def process_renderables(
+        self, renderables: List[ConsoleRenderable]
+    ) -> List[ConsoleRenderable]:
+        """Process renderables to restore cursor and display progress."""
+        self._live_render.vertical_overflow = self.vertical_overflow
+        if self.console.is_interactive:
+            # lock needs acquiring as user can modify live_render renderable at any time unlike in Progress.
+            with self._lock:
+                reset = (
+                    Control.home()
+                    if self._alt_screen
+                    else self._live_render.position_cursor()
+                )
+                renderables = [reset, *renderables, self._live_render]
+        elif (
+            not self._started and not self.transient
+        ):  # if it is finished render the final output for files or dumb_terminals
+            renderables = [*renderables, self._live_render]
+
+        return renderables
+
+
+if __name__ == "__main__":  # pragma: no cover
+    import random
+    import time
+    from itertools import cycle
+    from typing import Dict, List, Tuple
+
+    from .align import Align
+    from .console import Console
+    from .live import Live as Live
+    from .panel import Panel
+    from .rule import Rule
+    from .syntax import Syntax
+    from .table import Table
+
+    console = Console()
+
+    syntax = Syntax(
+        '''def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]:
+    """Iterate and generate a tuple with a flag for last value."""
+    iter_values = iter(values)
+    try:
+        previous_value = next(iter_values)
+    except StopIteration:
+        return
+    for value in iter_values:
+        yield False, previous_value
+        previous_value = value
+    yield True, previous_value''',
+        "python",
+        line_numbers=True,
+    )
+
+    table = Table("foo", "bar", "baz")
+    table.add_row("1", "2", "3")
+
+    progress_renderables = [
+        "You can make the terminal shorter and taller to see the live table hide"
+        "Text may be printed while the progress bars are rendering.",
+        Panel("In fact, [i]any[/i] renderable will work"),
+        "Such as [magenta]tables[/]...",
+        table,
+        "Pretty printed structures...",
+        {"type": "example", "text": "Pretty printed"},
+        "Syntax...",
+        syntax,
+        Rule("Give it a try!"),
+    ]
+
+    examples = cycle(progress_renderables)
+
+    exchanges = [
+        "SGD",
+        "MYR",
+        "EUR",
+        "USD",
+        "AUD",
+        "JPY",
+        "CNH",
+        "HKD",
+        "CAD",
+        "INR",
+        "DKK",
+        "GBP",
+        "RUB",
+        "NZD",
+        "MXN",
+        "IDR",
+        "TWD",
+        "THB",
+        "VND",
+    ]
+    with Live(console=console) as live_table:
+        exchange_rate_dict: Dict[Tuple[str, str], float] = {}
+
+        for index in range(100):
+            select_exchange = exchanges[index % len(exchanges)]
+
+            for exchange in exchanges:
+                if exchange == select_exchange:
+                    continue
+                time.sleep(0.4)
+                if random.randint(0, 10) < 1:
+                    console.log(next(examples))
+                exchange_rate_dict[(select_exchange, exchange)] = 200 / (
+                    (random.random() * 320) + 1
+                )
+                if len(exchange_rate_dict) > len(exchanges) - 1:
+                    exchange_rate_dict.pop(list(exchange_rate_dict.keys())[0])
+                table = Table(title="Exchange Rates")
+
+                table.add_column("Source Currency")
+                table.add_column("Destination Currency")
+                table.add_column("Exchange Rate")
+
+                for (source, dest), exchange_rate in exchange_rate_dict.items():
+                    table.add_row(
+                        source,
+                        dest,
+                        Text(
+                            f"{exchange_rate:.4f}",
+                            style="red" if exchange_rate < 1.0 else "green",
+                        ),
+                    )
+
+                live_table.update(Align.center(table))
diff --git a/.venv/Lib/site-packages/rich/live_render.py b/.venv/Lib/site-packages/rich/live_render.py
new file mode 100644 (file)
index 0000000..4284ccc
--- /dev/null
@@ -0,0 +1,112 @@
+import sys
+from typing import Optional, Tuple
+
+if sys.version_info >= (3, 8):
+    from typing import Literal
+else:
+    from typing_extensions import Literal  # pragma: no cover
+
+
+from ._loop import loop_last
+from .console import Console, ConsoleOptions, RenderableType, RenderResult
+from .control import Control
+from .segment import ControlType, Segment
+from .style import StyleType
+from .text import Text
+
+VerticalOverflowMethod = Literal["crop", "ellipsis", "visible"]
+
+
+class LiveRender:
+    """Creates a renderable that may be updated.
+
+    Args:
+        renderable (RenderableType): Any renderable object.
+        style (StyleType, optional): An optional style to apply to the renderable. Defaults to "".
+    """
+
+    def __init__(
+        self,
+        renderable: RenderableType,
+        style: StyleType = "",
+        vertical_overflow: VerticalOverflowMethod = "ellipsis",
+    ) -> None:
+        self.renderable = renderable
+        self.style = style
+        self.vertical_overflow = vertical_overflow
+        self._shape: Optional[Tuple[int, int]] = None
+
+    def set_renderable(self, renderable: RenderableType) -> None:
+        """Set a new renderable.
+
+        Args:
+            renderable (RenderableType): Any renderable object, including str.
+        """
+        self.renderable = renderable
+
+    def position_cursor(self) -> Control:
+        """Get control codes to move cursor to beginning of live render.
+
+        Returns:
+            Control: A control instance that may be printed.
+        """
+        if self._shape is not None:
+            _, height = self._shape
+            return Control(
+                ControlType.CARRIAGE_RETURN,
+                (ControlType.ERASE_IN_LINE, 2),
+                *(
+                    (
+                        (ControlType.CURSOR_UP, 1),
+                        (ControlType.ERASE_IN_LINE, 2),
+                    )
+                    * (height - 1)
+                )
+            )
+        return Control()
+
+    def restore_cursor(self) -> Control:
+        """Get control codes to clear the render and restore the cursor to its previous position.
+
+        Returns:
+            Control: A Control instance that may be printed.
+        """
+        if self._shape is not None:
+            _, height = self._shape
+            return Control(
+                ControlType.CARRIAGE_RETURN,
+                *((ControlType.CURSOR_UP, 1), (ControlType.ERASE_IN_LINE, 2)) * height
+            )
+        return Control()
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        renderable = self.renderable
+        style = console.get_style(self.style)
+        lines = console.render_lines(renderable, options, style=style, pad=False)
+        shape = Segment.get_shape(lines)
+
+        _, height = shape
+        if height > options.size.height:
+            if self.vertical_overflow == "crop":
+                lines = lines[: options.size.height]
+                shape = Segment.get_shape(lines)
+            elif self.vertical_overflow == "ellipsis":
+                lines = lines[: (options.size.height - 1)]
+                overflow_text = Text(
+                    "...",
+                    overflow="crop",
+                    justify="center",
+                    end="",
+                    style="live.ellipsis",
+                )
+                lines.append(list(console.render(overflow_text)))
+                shape = Segment.get_shape(lines)
+        self._shape = shape
+
+        new_line = Segment.line()
+        for last, line in loop_last(lines):
+            yield from line
+            if not last:
+                yield new_line
diff --git a/.venv/Lib/site-packages/rich/logging.py b/.venv/Lib/site-packages/rich/logging.py
new file mode 100644 (file)
index 0000000..b2624cd
--- /dev/null
@@ -0,0 +1,297 @@
+import logging
+from datetime import datetime
+from logging import Handler, LogRecord
+from pathlib import Path
+from types import ModuleType
+from typing import ClassVar, Iterable, List, Optional, Type, Union
+
+from rich._null_file import NullFile
+
+from . import get_console
+from ._log_render import FormatTimeCallable, LogRender
+from .console import Console, ConsoleRenderable
+from .highlighter import Highlighter, ReprHighlighter
+from .text import Text
+from .traceback import Traceback
+
+
+class RichHandler(Handler):
+    """A logging handler that renders output with Rich. The time / level / message and file are displayed in columns.
+    The level is color coded, and the message is syntax highlighted.
+
+    Note:
+        Be careful when enabling console markup in log messages if you have configured logging for libraries not
+        under your control. If a dependency writes messages containing square brackets, it may not produce the intended output.
+
+    Args:
+        level (Union[int, str], optional): Log level. Defaults to logging.NOTSET.
+        console (:class:`~rich.console.Console`, optional): Optional console instance to write logs.
+            Default will use a global console instance writing to stdout.
+        show_time (bool, optional): Show a column for the time. Defaults to True.
+        omit_repeated_times (bool, optional): Omit repetition of the same time. Defaults to True.
+        show_level (bool, optional): Show a column for the level. Defaults to True.
+        show_path (bool, optional): Show the path to the original log call. Defaults to True.
+        enable_link_path (bool, optional): Enable terminal link of path column to file. Defaults to True.
+        highlighter (Highlighter, optional): Highlighter to style log messages, or None to use ReprHighlighter. Defaults to None.
+        markup (bool, optional): Enable console markup in log messages. Defaults to False.
+        rich_tracebacks (bool, optional): Enable rich tracebacks with syntax highlighting and formatting. Defaults to False.
+        tracebacks_width (Optional[int], optional): Number of characters used to render tracebacks, or None for full width. Defaults to None.
+        tracebacks_code_width (int, optional): Number of code characters used to render tracebacks, or None for full width. Defaults to 88.
+        tracebacks_extra_lines (int, optional): Additional lines of code to render tracebacks, or None for full width. Defaults to None.
+        tracebacks_theme (str, optional): Override pygments theme used in traceback.
+        tracebacks_word_wrap (bool, optional): Enable word wrapping of long tracebacks lines. Defaults to True.
+        tracebacks_show_locals (bool, optional): Enable display of locals in tracebacks. Defaults to False.
+        tracebacks_suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.
+        tracebacks_max_frames (int, optional): Optional maximum number of frames returned by traceback.
+        locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+            Defaults to 10.
+        locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
+        log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%x %X] ".
+        keywords (List[str], optional): List of words to highlight instead of ``RichHandler.KEYWORDS``.
+    """
+
+    KEYWORDS: ClassVar[Optional[List[str]]] = [
+        "GET",
+        "POST",
+        "HEAD",
+        "PUT",
+        "DELETE",
+        "OPTIONS",
+        "TRACE",
+        "PATCH",
+    ]
+    HIGHLIGHTER_CLASS: ClassVar[Type[Highlighter]] = ReprHighlighter
+
+    def __init__(
+        self,
+        level: Union[int, str] = logging.NOTSET,
+        console: Optional[Console] = None,
+        *,
+        show_time: bool = True,
+        omit_repeated_times: bool = True,
+        show_level: bool = True,
+        show_path: bool = True,
+        enable_link_path: bool = True,
+        highlighter: Optional[Highlighter] = None,
+        markup: bool = False,
+        rich_tracebacks: bool = False,
+        tracebacks_width: Optional[int] = None,
+        tracebacks_code_width: int = 88,
+        tracebacks_extra_lines: int = 3,
+        tracebacks_theme: Optional[str] = None,
+        tracebacks_word_wrap: bool = True,
+        tracebacks_show_locals: bool = False,
+        tracebacks_suppress: Iterable[Union[str, ModuleType]] = (),
+        tracebacks_max_frames: int = 100,
+        locals_max_length: int = 10,
+        locals_max_string: int = 80,
+        log_time_format: Union[str, FormatTimeCallable] = "[%x %X]",
+        keywords: Optional[List[str]] = None,
+    ) -> None:
+        super().__init__(level=level)
+        self.console = console or get_console()
+        self.highlighter = highlighter or self.HIGHLIGHTER_CLASS()
+        self._log_render = LogRender(
+            show_time=show_time,
+            show_level=show_level,
+            show_path=show_path,
+            time_format=log_time_format,
+            omit_repeated_times=omit_repeated_times,
+            level_width=None,
+        )
+        self.enable_link_path = enable_link_path
+        self.markup = markup
+        self.rich_tracebacks = rich_tracebacks
+        self.tracebacks_width = tracebacks_width
+        self.tracebacks_extra_lines = tracebacks_extra_lines
+        self.tracebacks_theme = tracebacks_theme
+        self.tracebacks_word_wrap = tracebacks_word_wrap
+        self.tracebacks_show_locals = tracebacks_show_locals
+        self.tracebacks_suppress = tracebacks_suppress
+        self.tracebacks_max_frames = tracebacks_max_frames
+        self.tracebacks_code_width = tracebacks_code_width
+        self.locals_max_length = locals_max_length
+        self.locals_max_string = locals_max_string
+        self.keywords = keywords
+
+    def get_level_text(self, record: LogRecord) -> Text:
+        """Get the level name from the record.
+
+        Args:
+            record (LogRecord): LogRecord instance.
+
+        Returns:
+            Text: A tuple of the style and level name.
+        """
+        level_name = record.levelname
+        level_text = Text.styled(
+            level_name.ljust(8), f"logging.level.{level_name.lower()}"
+        )
+        return level_text
+
+    def emit(self, record: LogRecord) -> None:
+        """Invoked by logging."""
+        message = self.format(record)
+        traceback = None
+        if (
+            self.rich_tracebacks
+            and record.exc_info
+            and record.exc_info != (None, None, None)
+        ):
+            exc_type, exc_value, exc_traceback = record.exc_info
+            assert exc_type is not None
+            assert exc_value is not None
+            traceback = Traceback.from_exception(
+                exc_type,
+                exc_value,
+                exc_traceback,
+                width=self.tracebacks_width,
+                code_width=self.tracebacks_code_width,
+                extra_lines=self.tracebacks_extra_lines,
+                theme=self.tracebacks_theme,
+                word_wrap=self.tracebacks_word_wrap,
+                show_locals=self.tracebacks_show_locals,
+                locals_max_length=self.locals_max_length,
+                locals_max_string=self.locals_max_string,
+                suppress=self.tracebacks_suppress,
+                max_frames=self.tracebacks_max_frames,
+            )
+            message = record.getMessage()
+            if self.formatter:
+                record.message = record.getMessage()
+                formatter = self.formatter
+                if hasattr(formatter, "usesTime") and formatter.usesTime():
+                    record.asctime = formatter.formatTime(record, formatter.datefmt)
+                message = formatter.formatMessage(record)
+
+        message_renderable = self.render_message(record, message)
+        log_renderable = self.render(
+            record=record, traceback=traceback, message_renderable=message_renderable
+        )
+        if isinstance(self.console.file, NullFile):
+            # Handles pythonw, where stdout/stderr are null, and we return NullFile
+            # instance from Console.file. In this case, we still want to make a log record
+            # even though we won't be writing anything to a file.
+            self.handleError(record)
+        else:
+            try:
+                self.console.print(log_renderable)
+            except Exception:
+                self.handleError(record)
+
+    def render_message(self, record: LogRecord, message: str) -> "ConsoleRenderable":
+        """Render message text in to Text.
+
+        Args:
+            record (LogRecord): logging Record.
+            message (str): String containing log message.
+
+        Returns:
+            ConsoleRenderable: Renderable to display log message.
+        """
+        use_markup = getattr(record, "markup", self.markup)
+        message_text = Text.from_markup(message) if use_markup else Text(message)
+
+        highlighter = getattr(record, "highlighter", self.highlighter)
+        if highlighter:
+            message_text = highlighter(message_text)
+
+        if self.keywords is None:
+            self.keywords = self.KEYWORDS
+
+        if self.keywords:
+            message_text.highlight_words(self.keywords, "logging.keyword")
+
+        return message_text
+
+    def render(
+        self,
+        *,
+        record: LogRecord,
+        traceback: Optional[Traceback],
+        message_renderable: "ConsoleRenderable",
+    ) -> "ConsoleRenderable":
+        """Render log for display.
+
+        Args:
+            record (LogRecord): logging Record.
+            traceback (Optional[Traceback]): Traceback instance or None for no Traceback.
+            message_renderable (ConsoleRenderable): Renderable (typically Text) containing log message contents.
+
+        Returns:
+            ConsoleRenderable: Renderable to display log.
+        """
+        path = Path(record.pathname).name
+        level = self.get_level_text(record)
+        time_format = None if self.formatter is None else self.formatter.datefmt
+        log_time = datetime.fromtimestamp(record.created)
+
+        log_renderable = self._log_render(
+            self.console,
+            [message_renderable] if not traceback else [message_renderable, traceback],
+            log_time=log_time,
+            time_format=time_format,
+            level=level,
+            path=path,
+            line_no=record.lineno,
+            link_path=record.pathname if self.enable_link_path else None,
+        )
+        return log_renderable
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from time import sleep
+
+    FORMAT = "%(message)s"
+    # FORMAT = "%(asctime)-15s - %(levelname)s - %(message)s"
+    logging.basicConfig(
+        level="NOTSET",
+        format=FORMAT,
+        datefmt="[%X]",
+        handlers=[RichHandler(rich_tracebacks=True, tracebacks_show_locals=True)],
+    )
+    log = logging.getLogger("rich")
+
+    log.info("Server starting...")
+    log.info("Listening on http://127.0.0.1:8080")
+    sleep(1)
+
+    log.info("GET /index.html 200 1298")
+    log.info("GET /imgs/backgrounds/back1.jpg 200 54386")
+    log.info("GET /css/styles.css 200 54386")
+    log.warning("GET /favicon.ico 404 242")
+    sleep(1)
+
+    log.debug(
+        "JSONRPC request\n--> %r\n<-- %r",
+        {
+            "version": "1.1",
+            "method": "confirmFruitPurchase",
+            "params": [["apple", "orange", "mangoes", "pomelo"], 1.123],
+            "id": "194521489",
+        },
+        {"version": "1.1", "result": True, "error": None, "id": "194521489"},
+    )
+    log.debug(
+        "Loading configuration file /adasd/asdasd/qeqwe/qwrqwrqwr/sdgsdgsdg/werwerwer/dfgerert/ertertert/ertetert/werwerwer"
+    )
+    log.error("Unable to find 'pomelo' in database!")
+    log.info("POST /jsonrpc/ 200 65532")
+    log.info("POST /admin/ 401 42234")
+    log.warning("password was rejected for admin site.")
+
+    def divide() -> None:
+        number = 1
+        divisor = 0
+        foos = ["foo"] * 100
+        log.debug("in divide")
+        try:
+            number / divisor
+        except:
+            log.exception("An error of some kind occurred!")
+
+    divide()
+    sleep(1)
+    log.critical("Out of memory!")
+    log.info("Server exited with code=-1")
+    log.info("[bold]EXITING...[/bold]", extra=dict(markup=True))
diff --git a/.venv/Lib/site-packages/rich/markdown.py b/.venv/Lib/site-packages/rich/markdown.py
new file mode 100644 (file)
index 0000000..26c58d1
--- /dev/null
@@ -0,0 +1,784 @@
+from __future__ import annotations
+
+import sys
+from typing import ClassVar, Iterable
+
+from markdown_it import MarkdownIt
+from markdown_it.token import Token
+
+if sys.version_info >= (3, 8):
+    from typing import get_args
+else:
+    from typing_extensions import get_args  # pragma: no cover
+
+from rich.table import Table
+
+from . import box
+from ._loop import loop_first
+from ._stack import Stack
+from .console import Console, ConsoleOptions, JustifyMethod, RenderResult
+from .containers import Renderables
+from .jupyter import JupyterMixin
+from .panel import Panel
+from .rule import Rule
+from .segment import Segment
+from .style import Style, StyleStack
+from .syntax import Syntax
+from .text import Text, TextType
+
+
+class MarkdownElement:
+    new_line: ClassVar[bool] = True
+
+    @classmethod
+    def create(cls, markdown: Markdown, token: Token) -> MarkdownElement:
+        """Factory to create markdown element,
+
+        Args:
+            markdown (Markdown): The parent Markdown object.
+            token (Token): A node from markdown-it.
+
+        Returns:
+            MarkdownElement: A new markdown element
+        """
+        return cls()
+
+    def on_enter(self, context: MarkdownContext) -> None:
+        """Called when the node is entered.
+
+        Args:
+            context (MarkdownContext): The markdown context.
+        """
+
+    def on_text(self, context: MarkdownContext, text: TextType) -> None:
+        """Called when text is parsed.
+
+        Args:
+            context (MarkdownContext): The markdown context.
+        """
+
+    def on_leave(self, context: MarkdownContext) -> None:
+        """Called when the parser leaves the element.
+
+        Args:
+            context (MarkdownContext): [description]
+        """
+
+    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+        """Called when a child element is closed.
+
+        This method allows a parent element to take over rendering of its children.
+
+        Args:
+            context (MarkdownContext): The markdown context.
+            child (MarkdownElement): The child markdown element.
+
+        Returns:
+            bool: Return True to render the element, or False to not render the element.
+        """
+        return True
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        return ()
+
+
+class UnknownElement(MarkdownElement):
+    """An unknown element.
+
+    Hopefully there will be no unknown elements, and we will have a MarkdownElement for
+    everything in the document.
+
+    """
+
+
+class TextElement(MarkdownElement):
+    """Base class for elements that render text."""
+
+    style_name = "none"
+
+    def on_enter(self, context: MarkdownContext) -> None:
+        self.style = context.enter_style(self.style_name)
+        self.text = Text(justify="left")
+
+    def on_text(self, context: MarkdownContext, text: TextType) -> None:
+        self.text.append(text, context.current_style if isinstance(text, str) else None)
+
+    def on_leave(self, context: MarkdownContext) -> None:
+        context.leave_style()
+
+
+class Paragraph(TextElement):
+    """A Paragraph."""
+
+    style_name = "markdown.paragraph"
+    justify: JustifyMethod
+
+    @classmethod
+    def create(cls, markdown: Markdown, token: Token) -> Paragraph:
+        return cls(justify=markdown.justify or "left")
+
+    def __init__(self, justify: JustifyMethod) -> None:
+        self.justify = justify
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        self.text.justify = self.justify
+        yield self.text
+
+
+class Heading(TextElement):
+    """A heading."""
+
+    @classmethod
+    def create(cls, markdown: Markdown, token: Token) -> Heading:
+        return cls(token.tag)
+
+    def on_enter(self, context: MarkdownContext) -> None:
+        self.text = Text()
+        context.enter_style(self.style_name)
+
+    def __init__(self, tag: str) -> None:
+        self.tag = tag
+        self.style_name = f"markdown.{tag}"
+        super().__init__()
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        text = self.text
+        text.justify = "center"
+        if self.tag == "h1":
+            # Draw a border around h1s
+            yield Panel(
+                text,
+                box=box.HEAVY,
+                style="markdown.h1.border",
+            )
+        else:
+            # Styled text for h2 and beyond
+            if self.tag == "h2":
+                yield Text("")
+            yield text
+
+
+class CodeBlock(TextElement):
+    """A code block with syntax highlighting."""
+
+    style_name = "markdown.code_block"
+
+    @classmethod
+    def create(cls, markdown: Markdown, token: Token) -> CodeBlock:
+        node_info = token.info or ""
+        lexer_name = node_info.partition(" ")[0]
+        return cls(lexer_name or "text", markdown.code_theme)
+
+    def __init__(self, lexer_name: str, theme: str) -> None:
+        self.lexer_name = lexer_name
+        self.theme = theme
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        code = str(self.text).rstrip()
+        syntax = Syntax(
+            code, self.lexer_name, theme=self.theme, word_wrap=True, padding=1
+        )
+        yield syntax
+
+
+class BlockQuote(TextElement):
+    """A block quote."""
+
+    style_name = "markdown.block_quote"
+
+    def __init__(self) -> None:
+        self.elements: Renderables = Renderables()
+
+    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+        self.elements.append(child)
+        return False
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        render_options = options.update(width=options.max_width - 4)
+        lines = console.render_lines(self.elements, render_options, style=self.style)
+        style = self.style
+        new_line = Segment("\n")
+        padding = Segment("▌ ", style)
+        for line in lines:
+            yield padding
+            yield from line
+            yield new_line
+
+
+class HorizontalRule(MarkdownElement):
+    """A horizontal rule to divide sections."""
+
+    new_line = False
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        style = console.get_style("markdown.hr", default="none")
+        yield Rule(style=style)
+
+
+class TableElement(MarkdownElement):
+    """MarkdownElement corresponding to `table_open`."""
+
+    def __init__(self) -> None:
+        self.header: TableHeaderElement | None = None
+        self.body: TableBodyElement | None = None
+
+    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+        if isinstance(child, TableHeaderElement):
+            self.header = child
+        elif isinstance(child, TableBodyElement):
+            self.body = child
+        else:
+            raise RuntimeError("Couldn't process markdown table.")
+        return False
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        table = Table(box=box.SIMPLE_HEAVY)
+
+        if self.header is not None and self.header.row is not None:
+            for column in self.header.row.cells:
+                table.add_column(column.content)
+
+        if self.body is not None:
+            for row in self.body.rows:
+                row_content = [element.content for element in row.cells]
+                table.add_row(*row_content)
+
+        yield table
+
+
+class TableHeaderElement(MarkdownElement):
+    """MarkdownElement corresponding to `thead_open` and `thead_close`."""
+
+    def __init__(self) -> None:
+        self.row: TableRowElement | None = None
+
+    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+        assert isinstance(child, TableRowElement)
+        self.row = child
+        return False
+
+
+class TableBodyElement(MarkdownElement):
+    """MarkdownElement corresponding to `tbody_open` and `tbody_close`."""
+
+    def __init__(self) -> None:
+        self.rows: list[TableRowElement] = []
+
+    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+        assert isinstance(child, TableRowElement)
+        self.rows.append(child)
+        return False
+
+
+class TableRowElement(MarkdownElement):
+    """MarkdownElement corresponding to `tr_open` and `tr_close`."""
+
+    def __init__(self) -> None:
+        self.cells: list[TableDataElement] = []
+
+    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+        assert isinstance(child, TableDataElement)
+        self.cells.append(child)
+        return False
+
+
+class TableDataElement(MarkdownElement):
+    """MarkdownElement corresponding to `td_open` and `td_close`
+    and `th_open` and `th_close`."""
+
+    @classmethod
+    def create(cls, markdown: Markdown, token: Token) -> MarkdownElement:
+        style = str(token.attrs.get("style")) or ""
+
+        justify: JustifyMethod
+        if "text-align:right" in style:
+            justify = "right"
+        elif "text-align:center" in style:
+            justify = "center"
+        elif "text-align:left" in style:
+            justify = "left"
+        else:
+            justify = "default"
+
+        assert justify in get_args(JustifyMethod)
+        return cls(justify=justify)
+
+    def __init__(self, justify: JustifyMethod) -> None:
+        self.content: Text = Text("", justify=justify)
+        self.justify = justify
+
+    def on_text(self, context: MarkdownContext, text: TextType) -> None:
+        text = Text(text) if isinstance(text, str) else text
+        text.stylize(context.current_style)
+        self.content.append_text(text)
+
+
+class ListElement(MarkdownElement):
+    """A list element."""
+
+    @classmethod
+    def create(cls, markdown: Markdown, token: Token) -> ListElement:
+        return cls(token.type, int(token.attrs.get("start", 1)))
+
+    def __init__(self, list_type: str, list_start: int | None) -> None:
+        self.items: list[ListItem] = []
+        self.list_type = list_type
+        self.list_start = list_start
+
+    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+        assert isinstance(child, ListItem)
+        self.items.append(child)
+        return False
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        if self.list_type == "bullet_list_open":
+            for item in self.items:
+                yield from item.render_bullet(console, options)
+        else:
+            number = 1 if self.list_start is None else self.list_start
+            last_number = number + len(self.items)
+            for index, item in enumerate(self.items):
+                yield from item.render_number(
+                    console, options, number + index, last_number
+                )
+
+
+class ListItem(TextElement):
+    """An item in a list."""
+
+    style_name = "markdown.item"
+
+    def __init__(self) -> None:
+        self.elements: Renderables = Renderables()
+
+    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+        self.elements.append(child)
+        return False
+
+    def render_bullet(self, console: Console, options: ConsoleOptions) -> RenderResult:
+        render_options = options.update(width=options.max_width - 3)
+        lines = console.render_lines(self.elements, render_options, style=self.style)
+        bullet_style = console.get_style("markdown.item.bullet", default="none")
+
+        bullet = Segment(" • ", bullet_style)
+        padding = Segment(" " * 3, bullet_style)
+        new_line = Segment("\n")
+        for first, line in loop_first(lines):
+            yield bullet if first else padding
+            yield from line
+            yield new_line
+
+    def render_number(
+        self, console: Console, options: ConsoleOptions, number: int, last_number: int
+    ) -> RenderResult:
+        number_width = len(str(last_number)) + 2
+        render_options = options.update(width=options.max_width - number_width)
+        lines = console.render_lines(self.elements, render_options, style=self.style)
+        number_style = console.get_style("markdown.item.number", default="none")
+
+        new_line = Segment("\n")
+        padding = Segment(" " * number_width, number_style)
+        numeral = Segment(f"{number}".rjust(number_width - 1) + " ", number_style)
+        for first, line in loop_first(lines):
+            yield numeral if first else padding
+            yield from line
+            yield new_line
+
+
+class Link(TextElement):
+    @classmethod
+    def create(cls, markdown: Markdown, token: Token) -> MarkdownElement:
+        url = token.attrs.get("href", "#")
+        return cls(token.content, str(url))
+
+    def __init__(self, text: str, href: str):
+        self.text = Text(text)
+        self.href = href
+
+
+class ImageItem(TextElement):
+    """Renders a placeholder for an image."""
+
+    new_line = False
+
+    @classmethod
+    def create(cls, markdown: Markdown, token: Token) -> MarkdownElement:
+        """Factory to create markdown element,
+
+        Args:
+            markdown (Markdown): The parent Markdown object.
+            token (Any): A token from markdown-it.
+
+        Returns:
+            MarkdownElement: A new markdown element
+        """
+        return cls(str(token.attrs.get("src", "")), markdown.hyperlinks)
+
+    def __init__(self, destination: str, hyperlinks: bool) -> None:
+        self.destination = destination
+        self.hyperlinks = hyperlinks
+        self.link: str | None = None
+        super().__init__()
+
+    def on_enter(self, context: MarkdownContext) -> None:
+        self.link = context.current_style.link
+        self.text = Text(justify="left")
+        super().on_enter(context)
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        link_style = Style(link=self.link or self.destination or None)
+        title = self.text or Text(self.destination.strip("/").rsplit("/", 1)[-1])
+        if self.hyperlinks:
+            title.stylize(link_style)
+        text = Text.assemble("🌆 ", title, " ", end="")
+        yield text
+
+
+class MarkdownContext:
+    """Manages the console render state."""
+
+    def __init__(
+        self,
+        console: Console,
+        options: ConsoleOptions,
+        style: Style,
+        inline_code_lexer: str | None = None,
+        inline_code_theme: str = "monokai",
+    ) -> None:
+        self.console = console
+        self.options = options
+        self.style_stack: StyleStack = StyleStack(style)
+        self.stack: Stack[MarkdownElement] = Stack()
+
+        self._syntax: Syntax | None = None
+        if inline_code_lexer is not None:
+            self._syntax = Syntax("", inline_code_lexer, theme=inline_code_theme)
+
+    @property
+    def current_style(self) -> Style:
+        """Current style which is the product of all styles on the stack."""
+        return self.style_stack.current
+
+    def on_text(self, text: str, node_type: str) -> None:
+        """Called when the parser visits text."""
+        if node_type in {"fence", "code_inline"} and self._syntax is not None:
+            highlight_text = self._syntax.highlight(text)
+            highlight_text.rstrip()
+            self.stack.top.on_text(
+                self, Text.assemble(highlight_text, style=self.style_stack.current)
+            )
+        else:
+            self.stack.top.on_text(self, text)
+
+    def enter_style(self, style_name: str | Style) -> Style:
+        """Enter a style context."""
+        style = self.console.get_style(style_name, default="none")
+        self.style_stack.push(style)
+        return self.current_style
+
+    def leave_style(self) -> Style:
+        """Leave a style context."""
+        style = self.style_stack.pop()
+        return style
+
+
+class Markdown(JupyterMixin):
+    """A Markdown renderable.
+
+    Args:
+        markup (str): A string containing markdown.
+        code_theme (str, optional): Pygments theme for code blocks. Defaults to "monokai". See https://pygments.org/styles/ for code themes.
+        justify (JustifyMethod, optional): Justify value for paragraphs. Defaults to None.
+        style (Union[str, Style], optional): Optional style to apply to markdown.
+        hyperlinks (bool, optional): Enable hyperlinks. Defaults to ``True``.
+        inline_code_lexer: (str, optional): Lexer to use if inline code highlighting is
+            enabled. Defaults to None.
+        inline_code_theme: (Optional[str], optional): Pygments theme for inline code
+            highlighting, or None for no highlighting. Defaults to None.
+    """
+
+    elements: ClassVar[dict[str, type[MarkdownElement]]] = {
+        "paragraph_open": Paragraph,
+        "heading_open": Heading,
+        "fence": CodeBlock,
+        "code_block": CodeBlock,
+        "blockquote_open": BlockQuote,
+        "hr": HorizontalRule,
+        "bullet_list_open": ListElement,
+        "ordered_list_open": ListElement,
+        "list_item_open": ListItem,
+        "image": ImageItem,
+        "table_open": TableElement,
+        "tbody_open": TableBodyElement,
+        "thead_open": TableHeaderElement,
+        "tr_open": TableRowElement,
+        "td_open": TableDataElement,
+        "th_open": TableDataElement,
+    }
+
+    inlines = {"em", "strong", "code", "s"}
+
+    def __init__(
+        self,
+        markup: str,
+        code_theme: str = "monokai",
+        justify: JustifyMethod | None = None,
+        style: str | Style = "none",
+        hyperlinks: bool = True,
+        inline_code_lexer: str | None = None,
+        inline_code_theme: str | None = None,
+    ) -> None:
+        parser = MarkdownIt().enable("strikethrough").enable("table")
+        self.markup = markup
+        self.parsed = parser.parse(markup)
+        self.code_theme = code_theme
+        self.justify: JustifyMethod | None = justify
+        self.style = style
+        self.hyperlinks = hyperlinks
+        self.inline_code_lexer = inline_code_lexer
+        self.inline_code_theme = inline_code_theme or code_theme
+
+    def _flatten_tokens(self, tokens: Iterable[Token]) -> Iterable[Token]:
+        """Flattens the token stream."""
+        for token in tokens:
+            is_fence = token.type == "fence"
+            is_image = token.tag == "img"
+            if token.children and not (is_image or is_fence):
+                yield from self._flatten_tokens(token.children)
+            else:
+                yield token
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        """Render markdown to the console."""
+        style = console.get_style(self.style, default="none")
+        options = options.update(height=None)
+        context = MarkdownContext(
+            console,
+            options,
+            style,
+            inline_code_lexer=self.inline_code_lexer,
+            inline_code_theme=self.inline_code_theme,
+        )
+        tokens = self.parsed
+        inline_style_tags = self.inlines
+        new_line = False
+        _new_line_segment = Segment.line()
+
+        for token in self._flatten_tokens(tokens):
+            node_type = token.type
+            tag = token.tag
+
+            entering = token.nesting == 1
+            exiting = token.nesting == -1
+            self_closing = token.nesting == 0
+
+            if node_type == "text":
+                context.on_text(token.content, node_type)
+            elif node_type == "hardbreak":
+                context.on_text("\n", node_type)
+            elif node_type == "softbreak":
+                context.on_text(" ", node_type)
+            elif node_type == "link_open":
+                href = str(token.attrs.get("href", ""))
+                if self.hyperlinks:
+                    link_style = console.get_style("markdown.link_url", default="none")
+                    link_style += Style(link=href)
+                    context.enter_style(link_style)
+                else:
+                    context.stack.push(Link.create(self, token))
+            elif node_type == "link_close":
+                if self.hyperlinks:
+                    context.leave_style()
+                else:
+                    element = context.stack.pop()
+                    assert isinstance(element, Link)
+                    link_style = console.get_style("markdown.link", default="none")
+                    context.enter_style(link_style)
+                    context.on_text(element.text.plain, node_type)
+                    context.leave_style()
+                    context.on_text(" (", node_type)
+                    link_url_style = console.get_style(
+                        "markdown.link_url", default="none"
+                    )
+                    context.enter_style(link_url_style)
+                    context.on_text(element.href, node_type)
+                    context.leave_style()
+                    context.on_text(")", node_type)
+            elif (
+                tag in inline_style_tags
+                and node_type != "fence"
+                and node_type != "code_block"
+            ):
+                if entering:
+                    # If it's an opening inline token e.g. strong, em, etc.
+                    # Then we move into a style context i.e. push to stack.
+                    context.enter_style(f"markdown.{tag}")
+                elif exiting:
+                    # If it's a closing inline style, then we pop the style
+                    # off of the stack, to move out of the context of it...
+                    context.leave_style()
+                else:
+                    # If it's a self-closing inline style e.g. `code_inline`
+                    context.enter_style(f"markdown.{tag}")
+                    if token.content:
+                        context.on_text(token.content, node_type)
+                    context.leave_style()
+            else:
+                # Map the markdown tag -> MarkdownElement renderable
+                element_class = self.elements.get(token.type) or UnknownElement
+                element = element_class.create(self, token)
+
+                if entering or self_closing:
+                    context.stack.push(element)
+                    element.on_enter(context)
+
+                if exiting:  # CLOSING tag
+                    element = context.stack.pop()
+
+                    should_render = not context.stack or (
+                        context.stack
+                        and context.stack.top.on_child_close(context, element)
+                    )
+
+                    if should_render:
+                        if new_line:
+                            yield _new_line_segment
+
+                        yield from console.render(element, context.options)
+                elif self_closing:  # SELF-CLOSING tags (e.g. text, code, image)
+                    context.stack.pop()
+                    text = token.content
+                    if text is not None:
+                        element.on_text(context, text)
+
+                    should_render = (
+                        not context.stack
+                        or context.stack
+                        and context.stack.top.on_child_close(context, element)
+                    )
+                    if should_render:
+                        if new_line and node_type != "inline":
+                            yield _new_line_segment
+                        yield from console.render(element, context.options)
+
+                if exiting or self_closing:
+                    element.on_leave(context)
+                    new_line = element.new_line
+
+
+if __name__ == "__main__":  # pragma: no cover
+    import argparse
+    import sys
+
+    parser = argparse.ArgumentParser(
+        description="Render Markdown to the console with Rich"
+    )
+    parser.add_argument(
+        "path",
+        metavar="PATH",
+        help="path to markdown file, or - for stdin",
+    )
+    parser.add_argument(
+        "-c",
+        "--force-color",
+        dest="force_color",
+        action="store_true",
+        default=None,
+        help="force color for non-terminals",
+    )
+    parser.add_argument(
+        "-t",
+        "--code-theme",
+        dest="code_theme",
+        default="monokai",
+        help="pygments code theme",
+    )
+    parser.add_argument(
+        "-i",
+        "--inline-code-lexer",
+        dest="inline_code_lexer",
+        default=None,
+        help="inline_code_lexer",
+    )
+    parser.add_argument(
+        "-y",
+        "--hyperlinks",
+        dest="hyperlinks",
+        action="store_true",
+        help="enable hyperlinks",
+    )
+    parser.add_argument(
+        "-w",
+        "--width",
+        type=int,
+        dest="width",
+        default=None,
+        help="width of output (default will auto-detect)",
+    )
+    parser.add_argument(
+        "-j",
+        "--justify",
+        dest="justify",
+        action="store_true",
+        help="enable full text justify",
+    )
+    parser.add_argument(
+        "-p",
+        "--page",
+        dest="page",
+        action="store_true",
+        help="use pager to scroll output",
+    )
+    args = parser.parse_args()
+
+    from rich.console import Console
+
+    if args.path == "-":
+        markdown_body = sys.stdin.read()
+    else:
+        with open(args.path, encoding="utf-8") as markdown_file:
+            markdown_body = markdown_file.read()
+
+    markdown = Markdown(
+        markdown_body,
+        justify="full" if args.justify else "left",
+        code_theme=args.code_theme,
+        hyperlinks=args.hyperlinks,
+        inline_code_lexer=args.inline_code_lexer,
+    )
+    if args.page:
+        import io
+        import pydoc
+
+        fileio = io.StringIO()
+        console = Console(
+            file=fileio, force_terminal=args.force_color, width=args.width
+        )
+        console.print(markdown)
+        pydoc.pager(fileio.getvalue())
+
+    else:
+        console = Console(
+            force_terminal=args.force_color, width=args.width, record=True
+        )
+        console.print(markdown)
diff --git a/.venv/Lib/site-packages/rich/markup.py b/.venv/Lib/site-packages/rich/markup.py
new file mode 100644 (file)
index 0000000..bd9c05a
--- /dev/null
@@ -0,0 +1,251 @@
+import re
+from ast import literal_eval
+from operator import attrgetter
+from typing import Callable, Iterable, List, Match, NamedTuple, Optional, Tuple, Union
+
+from ._emoji_replace import _emoji_replace
+from .emoji import EmojiVariant
+from .errors import MarkupError
+from .style import Style
+from .text import Span, Text
+
+RE_TAGS = re.compile(
+    r"""((\\*)\[([a-z#/@][^[]*?)])""",
+    re.VERBOSE,
+)
+
+RE_HANDLER = re.compile(r"^([\w.]*?)(\(.*?\))?$")
+
+
+class Tag(NamedTuple):
+    """A tag in console markup."""
+
+    name: str
+    """The tag name. e.g. 'bold'."""
+    parameters: Optional[str]
+    """Any additional parameters after the name."""
+
+    def __str__(self) -> str:
+        return (
+            self.name if self.parameters is None else f"{self.name} {self.parameters}"
+        )
+
+    @property
+    def markup(self) -> str:
+        """Get the string representation of this tag."""
+        return (
+            f"[{self.name}]"
+            if self.parameters is None
+            else f"[{self.name}={self.parameters}]"
+        )
+
+
+_ReStringMatch = Match[str]  # regex match object
+_ReSubCallable = Callable[[_ReStringMatch], str]  # Callable invoked by re.sub
+_EscapeSubMethod = Callable[[_ReSubCallable, str], str]  # Sub method of a compiled re
+
+
+def escape(
+    markup: str,
+    _escape: _EscapeSubMethod = re.compile(r"(\\*)(\[[a-z#/@][^[]*?])").sub,
+) -> str:
+    """Escapes text so that it won't be interpreted as markup.
+
+    Args:
+        markup (str): Content to be inserted in to markup.
+
+    Returns:
+        str: Markup with square brackets escaped.
+    """
+
+    def escape_backslashes(match: Match[str]) -> str:
+        """Called by re.sub replace matches."""
+        backslashes, text = match.groups()
+        return f"{backslashes}{backslashes}\\{text}"
+
+    markup = _escape(escape_backslashes, markup)
+    if markup.endswith("\\") and not markup.endswith("\\\\"):
+        return markup + "\\"
+
+    return markup
+
+
+def _parse(markup: str) -> Iterable[Tuple[int, Optional[str], Optional[Tag]]]:
+    """Parse markup in to an iterable of tuples of (position, text, tag).
+
+    Args:
+        markup (str): A string containing console markup
+
+    """
+    position = 0
+    _divmod = divmod
+    _Tag = Tag
+    for match in RE_TAGS.finditer(markup):
+        full_text, escapes, tag_text = match.groups()
+        start, end = match.span()
+        if start > position:
+            yield start, markup[position:start], None
+        if escapes:
+            backslashes, escaped = _divmod(len(escapes), 2)
+            if backslashes:
+                # Literal backslashes
+                yield start, "\\" * backslashes, None
+                start += backslashes * 2
+            if escaped:
+                # Escape of tag
+                yield start, full_text[len(escapes) :], None
+                position = end
+                continue
+        text, equals, parameters = tag_text.partition("=")
+        yield start, None, _Tag(text, parameters if equals else None)
+        position = end
+    if position < len(markup):
+        yield position, markup[position:], None
+
+
+def render(
+    markup: str,
+    style: Union[str, Style] = "",
+    emoji: bool = True,
+    emoji_variant: Optional[EmojiVariant] = None,
+) -> Text:
+    """Render console markup in to a Text instance.
+
+    Args:
+        markup (str): A string containing console markup.
+        style: (Union[str, Style]): The style to use.
+        emoji (bool, optional): Also render emoji code. Defaults to True.
+        emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None.
+
+
+    Raises:
+        MarkupError: If there is a syntax error in the markup.
+
+    Returns:
+        Text: A test instance.
+    """
+    emoji_replace = _emoji_replace
+    if "[" not in markup:
+        return Text(
+            emoji_replace(markup, default_variant=emoji_variant) if emoji else markup,
+            style=style,
+        )
+    text = Text(style=style)
+    append = text.append
+    normalize = Style.normalize
+
+    style_stack: List[Tuple[int, Tag]] = []
+    pop = style_stack.pop
+
+    spans: List[Span] = []
+    append_span = spans.append
+
+    _Span = Span
+    _Tag = Tag
+
+    def pop_style(style_name: str) -> Tuple[int, Tag]:
+        """Pop tag matching given style name."""
+        for index, (_, tag) in enumerate(reversed(style_stack), 1):
+            if tag.name == style_name:
+                return pop(-index)
+        raise KeyError(style_name)
+
+    for position, plain_text, tag in _parse(markup):
+        if plain_text is not None:
+            # Handle open brace escapes, where the brace is not part of a tag.
+            plain_text = plain_text.replace("\\[", "[")
+            append(emoji_replace(plain_text) if emoji else plain_text)
+        elif tag is not None:
+            if tag.name.startswith("/"):  # Closing tag
+                style_name = tag.name[1:].strip()
+
+                if style_name:  # explicit close
+                    style_name = normalize(style_name)
+                    try:
+                        start, open_tag = pop_style(style_name)
+                    except KeyError:
+                        raise MarkupError(
+                            f"closing tag '{tag.markup}' at position {position} doesn't match any open tag"
+                        ) from None
+                else:  # implicit close
+                    try:
+                        start, open_tag = pop()
+                    except IndexError:
+                        raise MarkupError(
+                            f"closing tag '[/]' at position {position} has nothing to close"
+                        ) from None
+
+                if open_tag.name.startswith("@"):
+                    if open_tag.parameters:
+                        handler_name = ""
+                        parameters = open_tag.parameters.strip()
+                        handler_match = RE_HANDLER.match(parameters)
+                        if handler_match is not None:
+                            handler_name, match_parameters = handler_match.groups()
+                            parameters = (
+                                "()" if match_parameters is None else match_parameters
+                            )
+
+                        try:
+                            meta_params = literal_eval(parameters)
+                        except SyntaxError as error:
+                            raise MarkupError(
+                                f"error parsing {parameters!r} in {open_tag.parameters!r}; {error.msg}"
+                            )
+                        except Exception as error:
+                            raise MarkupError(
+                                f"error parsing {open_tag.parameters!r}; {error}"
+                            ) from None
+
+                        if handler_name:
+                            meta_params = (
+                                handler_name,
+                                meta_params
+                                if isinstance(meta_params, tuple)
+                                else (meta_params,),
+                            )
+
+                    else:
+                        meta_params = ()
+
+                    append_span(
+                        _Span(
+                            start, len(text), Style(meta={open_tag.name: meta_params})
+                        )
+                    )
+                else:
+                    append_span(_Span(start, len(text), str(open_tag)))
+
+            else:  # Opening tag
+                normalized_tag = _Tag(normalize(tag.name), tag.parameters)
+                style_stack.append((len(text), normalized_tag))
+
+    text_length = len(text)
+    while style_stack:
+        start, tag = style_stack.pop()
+        style = str(tag)
+        if style:
+            append_span(_Span(start, text_length, style))
+
+    text.spans = sorted(spans[::-1], key=attrgetter("start"))
+    return text
+
+
+if __name__ == "__main__":  # pragma: no cover
+    MARKUP = [
+        "[red]Hello World[/red]",
+        "[magenta]Hello [b]World[/b]",
+        "[bold]Bold[italic] bold and italic [/bold]italic[/italic]",
+        "Click [link=https://www.willmcgugan.com]here[/link] to visit my Blog",
+        ":warning-emoji: [bold red blink] DANGER![/]",
+    ]
+
+    from rich import print
+    from rich.table import Table
+
+    grid = Table("Markup", "Result", padding=(0, 1))
+
+    for markup in MARKUP:
+        grid.add_row(Text(markup), markup)
+
+    print(grid)
diff --git a/.venv/Lib/site-packages/rich/measure.py b/.venv/Lib/site-packages/rich/measure.py
new file mode 100644 (file)
index 0000000..a508ffa
--- /dev/null
@@ -0,0 +1,151 @@
+from operator import itemgetter
+from typing import TYPE_CHECKING, Callable, NamedTuple, Optional, Sequence
+
+from . import errors
+from .protocol import is_renderable, rich_cast
+
+if TYPE_CHECKING:
+    from .console import Console, ConsoleOptions, RenderableType
+
+
+class Measurement(NamedTuple):
+    """Stores the minimum and maximum widths (in characters) required to render an object."""
+
+    minimum: int
+    """Minimum number of cells required to render."""
+    maximum: int
+    """Maximum number of cells required to render."""
+
+    @property
+    def span(self) -> int:
+        """Get difference between maximum and minimum."""
+        return self.maximum - self.minimum
+
+    def normalize(self) -> "Measurement":
+        """Get measurement that ensures that minimum <= maximum and minimum >= 0
+
+        Returns:
+            Measurement: A normalized measurement.
+        """
+        minimum, maximum = self
+        minimum = min(max(0, minimum), maximum)
+        return Measurement(max(0, minimum), max(0, max(minimum, maximum)))
+
+    def with_maximum(self, width: int) -> "Measurement":
+        """Get a RenderableWith where the widths are <= width.
+
+        Args:
+            width (int): Maximum desired width.
+
+        Returns:
+            Measurement: New Measurement object.
+        """
+        minimum, maximum = self
+        return Measurement(min(minimum, width), min(maximum, width))
+
+    def with_minimum(self, width: int) -> "Measurement":
+        """Get a RenderableWith where the widths are >= width.
+
+        Args:
+            width (int): Minimum desired width.
+
+        Returns:
+            Measurement: New Measurement object.
+        """
+        minimum, maximum = self
+        width = max(0, width)
+        return Measurement(max(minimum, width), max(maximum, width))
+
+    def clamp(
+        self, min_width: Optional[int] = None, max_width: Optional[int] = None
+    ) -> "Measurement":
+        """Clamp a measurement within the specified range.
+
+        Args:
+            min_width (int): Minimum desired width, or ``None`` for no minimum. Defaults to None.
+            max_width (int): Maximum desired width, or ``None`` for no maximum. Defaults to None.
+
+        Returns:
+            Measurement: New Measurement object.
+        """
+        measurement = self
+        if min_width is not None:
+            measurement = measurement.with_minimum(min_width)
+        if max_width is not None:
+            measurement = measurement.with_maximum(max_width)
+        return measurement
+
+    @classmethod
+    def get(
+        cls, console: "Console", options: "ConsoleOptions", renderable: "RenderableType"
+    ) -> "Measurement":
+        """Get a measurement for a renderable.
+
+        Args:
+            console (~rich.console.Console): Console instance.
+            options (~rich.console.ConsoleOptions): Console options.
+            renderable (RenderableType): An object that may be rendered with Rich.
+
+        Raises:
+            errors.NotRenderableError: If the object is not renderable.
+
+        Returns:
+            Measurement: Measurement object containing range of character widths required to render the object.
+        """
+        _max_width = options.max_width
+        if _max_width < 1:
+            return Measurement(0, 0)
+        if isinstance(renderable, str):
+            renderable = console.render_str(
+                renderable, markup=options.markup, highlight=False
+            )
+        renderable = rich_cast(renderable)
+        if is_renderable(renderable):
+            get_console_width: Optional[
+                Callable[["Console", "ConsoleOptions"], "Measurement"]
+            ] = getattr(renderable, "__rich_measure__", None)
+            if get_console_width is not None:
+                render_width = (
+                    get_console_width(console, options)
+                    .normalize()
+                    .with_maximum(_max_width)
+                )
+                if render_width.maximum < 1:
+                    return Measurement(0, 0)
+                return render_width.normalize()
+            else:
+                return Measurement(0, _max_width)
+        else:
+            raise errors.NotRenderableError(
+                f"Unable to get render width for {renderable!r}; "
+                "a str, Segment, or object with __rich_console__ method is required"
+            )
+
+
+def measure_renderables(
+    console: "Console",
+    options: "ConsoleOptions",
+    renderables: Sequence["RenderableType"],
+) -> "Measurement":
+    """Get a measurement that would fit a number of renderables.
+
+    Args:
+        console (~rich.console.Console): Console instance.
+        options (~rich.console.ConsoleOptions): Console options.
+        renderables (Iterable[RenderableType]): One or more renderable objects.
+
+    Returns:
+        Measurement: Measurement object containing range of character widths required to
+            contain all given renderables.
+    """
+    if not renderables:
+        return Measurement(0, 0)
+    get_measurement = Measurement.get
+    measurements = [
+        get_measurement(console, options, renderable) for renderable in renderables
+    ]
+    measured_width = Measurement(
+        max(measurements, key=itemgetter(0)).minimum,
+        max(measurements, key=itemgetter(1)).maximum,
+    )
+    return measured_width
diff --git a/.venv/Lib/site-packages/rich/padding.py b/.venv/Lib/site-packages/rich/padding.py
new file mode 100644 (file)
index 0000000..d1aa01b
--- /dev/null
@@ -0,0 +1,141 @@
+from typing import TYPE_CHECKING, List, Optional, Tuple, Union
+
+if TYPE_CHECKING:
+    from .console import (
+        Console,
+        ConsoleOptions,
+        RenderableType,
+        RenderResult,
+    )
+
+from .jupyter import JupyterMixin
+from .measure import Measurement
+from .segment import Segment
+from .style import Style
+
+PaddingDimensions = Union[int, Tuple[int], Tuple[int, int], Tuple[int, int, int, int]]
+
+
+class Padding(JupyterMixin):
+    """Draw space around content.
+
+    Example:
+        >>> print(Padding("Hello", (2, 4), style="on blue"))
+
+    Args:
+        renderable (RenderableType): String or other renderable.
+        pad (Union[int, Tuple[int]]): Padding for top, right, bottom, and left borders.
+            May be specified with 1, 2, or 4 integers (CSS style).
+        style (Union[str, Style], optional): Style for padding characters. Defaults to "none".
+        expand (bool, optional): Expand padding to fit available width. Defaults to True.
+    """
+
+    def __init__(
+        self,
+        renderable: "RenderableType",
+        pad: "PaddingDimensions" = (0, 0, 0, 0),
+        *,
+        style: Union[str, Style] = "none",
+        expand: bool = True,
+    ):
+        self.renderable = renderable
+        self.top, self.right, self.bottom, self.left = self.unpack(pad)
+        self.style = style
+        self.expand = expand
+
+    @classmethod
+    def indent(cls, renderable: "RenderableType", level: int) -> "Padding":
+        """Make padding instance to render an indent.
+
+        Args:
+            renderable (RenderableType): String or other renderable.
+            level (int): Number of characters to indent.
+
+        Returns:
+            Padding: A Padding instance.
+        """
+
+        return Padding(renderable, pad=(0, 0, 0, level), expand=False)
+
+    @staticmethod
+    def unpack(pad: "PaddingDimensions") -> Tuple[int, int, int, int]:
+        """Unpack padding specified in CSS style."""
+        if isinstance(pad, int):
+            return (pad, pad, pad, pad)
+        if len(pad) == 1:
+            _pad = pad[0]
+            return (_pad, _pad, _pad, _pad)
+        if len(pad) == 2:
+            pad_top, pad_right = pad
+            return (pad_top, pad_right, pad_top, pad_right)
+        if len(pad) == 4:
+            top, right, bottom, left = pad
+            return (top, right, bottom, left)
+        raise ValueError(f"1, 2 or 4 integers required for padding; {len(pad)} given")
+
+    def __repr__(self) -> str:
+        return f"Padding({self.renderable!r}, ({self.top},{self.right},{self.bottom},{self.left}))"
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        style = console.get_style(self.style)
+        if self.expand:
+            width = options.max_width
+        else:
+            width = min(
+                Measurement.get(console, options, self.renderable).maximum
+                + self.left
+                + self.right,
+                options.max_width,
+            )
+        render_options = options.update_width(width - self.left - self.right)
+        if render_options.height is not None:
+            render_options = render_options.update_height(
+                height=render_options.height - self.top - self.bottom
+            )
+        lines = console.render_lines(
+            self.renderable, render_options, style=style, pad=True
+        )
+        _Segment = Segment
+
+        left = _Segment(" " * self.left, style) if self.left else None
+        right = (
+            [_Segment(f'{" " * self.right}', style), _Segment.line()]
+            if self.right
+            else [_Segment.line()]
+        )
+        blank_line: Optional[List[Segment]] = None
+        if self.top:
+            blank_line = [_Segment(f'{" " * width}\n', style)]
+            yield from blank_line * self.top
+        if left:
+            for line in lines:
+                yield left
+                yield from line
+                yield from right
+        else:
+            for line in lines:
+                yield from line
+                yield from right
+        if self.bottom:
+            blank_line = blank_line or [_Segment(f'{" " * width}\n', style)]
+            yield from blank_line * self.bottom
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "Measurement":
+        max_width = options.max_width
+        extra_width = self.left + self.right
+        if max_width - extra_width < 1:
+            return Measurement(max_width, max_width)
+        measure_min, measure_max = Measurement.get(console, options, self.renderable)
+        measurement = Measurement(measure_min + extra_width, measure_max + extra_width)
+        measurement = measurement.with_maximum(max_width)
+        return measurement
+
+
+if __name__ == "__main__":  #  pragma: no cover
+    from rich import print
+
+    print(Padding("Hello, World", (2, 4), style="on blue"))
diff --git a/.venv/Lib/site-packages/rich/pager.py b/.venv/Lib/site-packages/rich/pager.py
new file mode 100644 (file)
index 0000000..a3f7aa6
--- /dev/null
@@ -0,0 +1,34 @@
+from abc import ABC, abstractmethod
+from typing import Any
+
+
+class Pager(ABC):
+    """Base class for a pager."""
+
+    @abstractmethod
+    def show(self, content: str) -> None:
+        """Show content in pager.
+
+        Args:
+            content (str): Content to be displayed.
+        """
+
+
+class SystemPager(Pager):
+    """Uses the pager installed on the system."""
+
+    def _pager(self, content: str) -> Any:  #  pragma: no cover
+        return __import__("pydoc").pager(content)
+
+    def show(self, content: str) -> None:
+        """Use the same pager used by pydoc."""
+        self._pager(content)
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from .__main__ import make_test_card
+    from .console import Console
+
+    console = Console()
+    with console.pager(styles=True):
+        console.print(make_test_card())
diff --git a/.venv/Lib/site-packages/rich/palette.py b/.venv/Lib/site-packages/rich/palette.py
new file mode 100644 (file)
index 0000000..f295879
--- /dev/null
@@ -0,0 +1,100 @@
+from math import sqrt
+from functools import lru_cache
+from typing import Sequence, Tuple, TYPE_CHECKING
+
+from .color_triplet import ColorTriplet
+
+if TYPE_CHECKING:
+    from rich.table import Table
+
+
+class Palette:
+    """A palette of available colors."""
+
+    def __init__(self, colors: Sequence[Tuple[int, int, int]]):
+        self._colors = colors
+
+    def __getitem__(self, number: int) -> ColorTriplet:
+        return ColorTriplet(*self._colors[number])
+
+    def __rich__(self) -> "Table":
+        from rich.color import Color
+        from rich.style import Style
+        from rich.text import Text
+        from rich.table import Table
+
+        table = Table(
+            "index",
+            "RGB",
+            "Color",
+            title="Palette",
+            caption=f"{len(self._colors)} colors",
+            highlight=True,
+            caption_justify="right",
+        )
+        for index, color in enumerate(self._colors):
+            table.add_row(
+                str(index),
+                repr(color),
+                Text(" " * 16, style=Style(bgcolor=Color.from_rgb(*color))),
+            )
+        return table
+
+    # This is somewhat inefficient and needs caching
+    @lru_cache(maxsize=1024)
+    def match(self, color: Tuple[int, int, int]) -> int:
+        """Find a color from a palette that most closely matches a given color.
+
+        Args:
+            color (Tuple[int, int, int]): RGB components in range 0 > 255.
+
+        Returns:
+            int: Index of closes matching color.
+        """
+        red1, green1, blue1 = color
+        _sqrt = sqrt
+        get_color = self._colors.__getitem__
+
+        def get_color_distance(index: int) -> float:
+            """Get the distance to a color."""
+            red2, green2, blue2 = get_color(index)
+            red_mean = (red1 + red2) // 2
+            red = red1 - red2
+            green = green1 - green2
+            blue = blue1 - blue2
+            return _sqrt(
+                (((512 + red_mean) * red * red) >> 8)
+                + 4 * green * green
+                + (((767 - red_mean) * blue * blue) >> 8)
+            )
+
+        min_index = min(range(len(self._colors)), key=get_color_distance)
+        return min_index
+
+
+if __name__ == "__main__":  # pragma: no cover
+    import colorsys
+    from typing import Iterable
+    from rich.color import Color
+    from rich.console import Console, ConsoleOptions
+    from rich.segment import Segment
+    from rich.style import Style
+
+    class ColorBox:
+        def __rich_console__(
+            self, console: Console, options: ConsoleOptions
+        ) -> Iterable[Segment]:
+            height = console.size.height - 3
+            for y in range(0, height):
+                for x in range(options.max_width):
+                    h = x / options.max_width
+                    l = y / (height + 1)
+                    r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0)
+                    r2, g2, b2 = colorsys.hls_to_rgb(h, l + (1 / height / 2), 1.0)
+                    bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255)
+                    color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255)
+                    yield Segment("▄", Style(color=color, bgcolor=bgcolor))
+                yield Segment.line()
+
+    console = Console()
+    console.print(ColorBox())
diff --git a/.venv/Lib/site-packages/rich/panel.py b/.venv/Lib/site-packages/rich/panel.py
new file mode 100644 (file)
index 0000000..d411e29
--- /dev/null
@@ -0,0 +1,318 @@
+from typing import TYPE_CHECKING, Optional
+
+from .align import AlignMethod
+from .box import ROUNDED, Box
+from .cells import cell_len
+from .jupyter import JupyterMixin
+from .measure import Measurement, measure_renderables
+from .padding import Padding, PaddingDimensions
+from .segment import Segment
+from .style import Style, StyleType
+from .text import Text, TextType
+
+if TYPE_CHECKING:
+    from .console import Console, ConsoleOptions, RenderableType, RenderResult
+
+
+class Panel(JupyterMixin):
+    """A console renderable that draws a border around its contents.
+
+    Example:
+        >>> console.print(Panel("Hello, World!"))
+
+    Args:
+        renderable (RenderableType): A console renderable object.
+        box (Box): A Box instance that defines the look of the border (see :ref:`appendix_box`. Defaults to box.ROUNDED.
+        title (Optional[TextType], optional): Optional title displayed in panel header. Defaults to None.
+        title_align (AlignMethod, optional): Alignment of title. Defaults to "center".
+        subtitle (Optional[TextType], optional): Optional subtitle displayed in panel footer. Defaults to None.
+        subtitle_align (AlignMethod, optional): Alignment of subtitle. Defaults to "center".
+        safe_box (bool, optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True.
+        expand (bool, optional): If True the panel will stretch to fill the console width, otherwise it will be sized to fit the contents. Defaults to True.
+        style (str, optional): The style of the panel (border and contents). Defaults to "none".
+        border_style (str, optional): The style of the border. Defaults to "none".
+        width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect.
+        height (Optional[int], optional): Optional height of panel. Defaults to None to auto-detect.
+        padding (Optional[PaddingDimensions]): Optional padding around renderable. Defaults to 0.
+        highlight (bool, optional): Enable automatic highlighting of panel title (if str). Defaults to False.
+    """
+
+    def __init__(
+        self,
+        renderable: "RenderableType",
+        box: Box = ROUNDED,
+        *,
+        title: Optional[TextType] = None,
+        title_align: AlignMethod = "center",
+        subtitle: Optional[TextType] = None,
+        subtitle_align: AlignMethod = "center",
+        safe_box: Optional[bool] = None,
+        expand: bool = True,
+        style: StyleType = "none",
+        border_style: StyleType = "none",
+        width: Optional[int] = None,
+        height: Optional[int] = None,
+        padding: PaddingDimensions = (0, 1),
+        highlight: bool = False,
+    ) -> None:
+        self.renderable = renderable
+        self.box = box
+        self.title = title
+        self.title_align: AlignMethod = title_align
+        self.subtitle = subtitle
+        self.subtitle_align = subtitle_align
+        self.safe_box = safe_box
+        self.expand = expand
+        self.style = style
+        self.border_style = border_style
+        self.width = width
+        self.height = height
+        self.padding = padding
+        self.highlight = highlight
+
+    @classmethod
+    def fit(
+        cls,
+        renderable: "RenderableType",
+        box: Box = ROUNDED,
+        *,
+        title: Optional[TextType] = None,
+        title_align: AlignMethod = "center",
+        subtitle: Optional[TextType] = None,
+        subtitle_align: AlignMethod = "center",
+        safe_box: Optional[bool] = None,
+        style: StyleType = "none",
+        border_style: StyleType = "none",
+        width: Optional[int] = None,
+        height: Optional[int] = None,
+        padding: PaddingDimensions = (0, 1),
+        highlight: bool = False,
+    ) -> "Panel":
+        """An alternative constructor that sets expand=False."""
+        return cls(
+            renderable,
+            box,
+            title=title,
+            title_align=title_align,
+            subtitle=subtitle,
+            subtitle_align=subtitle_align,
+            safe_box=safe_box,
+            style=style,
+            border_style=border_style,
+            width=width,
+            height=height,
+            padding=padding,
+            highlight=highlight,
+            expand=False,
+        )
+
+    @property
+    def _title(self) -> Optional[Text]:
+        if self.title:
+            title_text = (
+                Text.from_markup(self.title)
+                if isinstance(self.title, str)
+                else self.title.copy()
+            )
+            title_text.end = ""
+            title_text.plain = title_text.plain.replace("\n", " ")
+            title_text.no_wrap = True
+            title_text.expand_tabs()
+            title_text.pad(1)
+            return title_text
+        return None
+
+    @property
+    def _subtitle(self) -> Optional[Text]:
+        if self.subtitle:
+            subtitle_text = (
+                Text.from_markup(self.subtitle)
+                if isinstance(self.subtitle, str)
+                else self.subtitle.copy()
+            )
+            subtitle_text.end = ""
+            subtitle_text.plain = subtitle_text.plain.replace("\n", " ")
+            subtitle_text.no_wrap = True
+            subtitle_text.expand_tabs()
+            subtitle_text.pad(1)
+            return subtitle_text
+        return None
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        _padding = Padding.unpack(self.padding)
+        renderable = (
+            Padding(self.renderable, _padding) if any(_padding) else self.renderable
+        )
+        style = console.get_style(self.style)
+        partial_border_style = console.get_style(self.border_style)
+        border_style = style + partial_border_style
+        width = (
+            options.max_width
+            if self.width is None
+            else min(options.max_width, self.width)
+        )
+
+        safe_box: bool = console.safe_box if self.safe_box is None else self.safe_box
+        box = self.box.substitute(options, safe=safe_box)
+
+        def align_text(
+            text: Text, width: int, align: str, character: str, style: Style
+        ) -> Text:
+            """Gets new aligned text.
+
+            Args:
+                text (Text): Title or subtitle text.
+                width (int): Desired width.
+                align (str): Alignment.
+                character (str): Character for alignment.
+                style (Style): Border style
+
+            Returns:
+                Text: New text instance
+            """
+            text = text.copy()
+            text.truncate(width)
+            excess_space = width - cell_len(text.plain)
+            if text.style:
+                text.stylize(console.get_style(text.style))
+
+            if excess_space:
+                if align == "left":
+                    return Text.assemble(
+                        text,
+                        (character * excess_space, style),
+                        no_wrap=True,
+                        end="",
+                    )
+                elif align == "center":
+                    left = excess_space // 2
+                    return Text.assemble(
+                        (character * left, style),
+                        text,
+                        (character * (excess_space - left), style),
+                        no_wrap=True,
+                        end="",
+                    )
+                else:
+                    return Text.assemble(
+                        (character * excess_space, style),
+                        text,
+                        no_wrap=True,
+                        end="",
+                    )
+            return text
+
+        title_text = self._title
+        if title_text is not None:
+            title_text.stylize_before(partial_border_style)
+
+        child_width = (
+            width - 2
+            if self.expand
+            else console.measure(
+                renderable, options=options.update_width(width - 2)
+            ).maximum
+        )
+        child_height = self.height or options.height or None
+        if child_height:
+            child_height -= 2
+        if title_text is not None:
+            child_width = min(
+                options.max_width - 2, max(child_width, title_text.cell_len + 2)
+            )
+
+        width = child_width + 2
+        child_options = options.update(
+            width=child_width, height=child_height, highlight=self.highlight
+        )
+        lines = console.render_lines(renderable, child_options, style=style)
+
+        line_start = Segment(box.mid_left, border_style)
+        line_end = Segment(f"{box.mid_right}", border_style)
+        new_line = Segment.line()
+        if title_text is None or width <= 4:
+            yield Segment(box.get_top([width - 2]), border_style)
+        else:
+            title_text = align_text(
+                title_text,
+                width - 4,
+                self.title_align,
+                box.top,
+                border_style,
+            )
+            yield Segment(box.top_left + box.top, border_style)
+            yield from console.render(title_text, child_options.update_width(width - 4))
+            yield Segment(box.top + box.top_right, border_style)
+
+        yield new_line
+        for line in lines:
+            yield line_start
+            yield from line
+            yield line_end
+            yield new_line
+
+        subtitle_text = self._subtitle
+        if subtitle_text is not None:
+            subtitle_text.stylize_before(partial_border_style)
+
+        if subtitle_text is None or width <= 4:
+            yield Segment(box.get_bottom([width - 2]), border_style)
+        else:
+            subtitle_text = align_text(
+                subtitle_text,
+                width - 4,
+                self.subtitle_align,
+                box.bottom,
+                border_style,
+            )
+            yield Segment(box.bottom_left + box.bottom, border_style)
+            yield from console.render(
+                subtitle_text, child_options.update_width(width - 4)
+            )
+            yield Segment(box.bottom + box.bottom_right, border_style)
+
+        yield new_line
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "Measurement":
+        _title = self._title
+        _, right, _, left = Padding.unpack(self.padding)
+        padding = left + right
+        renderables = [self.renderable, _title] if _title else [self.renderable]
+
+        if self.width is None:
+            width = (
+                measure_renderables(
+                    console,
+                    options.update_width(options.max_width - padding - 2),
+                    renderables,
+                ).maximum
+                + padding
+                + 2
+            )
+        else:
+            width = self.width
+        return Measurement(width, width)
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from .console import Console
+
+    c = Console()
+
+    from .box import DOUBLE, ROUNDED
+    from .padding import Padding
+
+    p = Panel(
+        "Hello, World!",
+        title="rich.Panel",
+        style="white on blue",
+        box=DOUBLE,
+        padding=1,
+    )
+
+    c.print()
+    c.print(p)
diff --git a/.venv/Lib/site-packages/rich/pretty.py b/.venv/Lib/site-packages/rich/pretty.py
new file mode 100644 (file)
index 0000000..5c725c0
--- /dev/null
@@ -0,0 +1,1016 @@
+import builtins
+import collections
+import dataclasses
+import inspect
+import os
+import reprlib
+import sys
+from array import array
+from collections import Counter, UserDict, UserList, defaultdict, deque
+from dataclasses import dataclass, fields, is_dataclass
+from inspect import isclass
+from itertools import islice
+from types import MappingProxyType
+from typing import (
+    TYPE_CHECKING,
+    Any,
+    Callable,
+    DefaultDict,
+    Deque,
+    Dict,
+    Iterable,
+    List,
+    Optional,
+    Sequence,
+    Set,
+    Tuple,
+    Union,
+)
+
+from rich.repr import RichReprResult
+
+try:
+    import attr as _attr_module
+
+    _has_attrs = hasattr(_attr_module, "ib")
+except ImportError:  # pragma: no cover
+    _has_attrs = False
+
+from . import get_console
+from ._loop import loop_last
+from ._pick import pick_bool
+from .abc import RichRenderable
+from .cells import cell_len
+from .highlighter import ReprHighlighter
+from .jupyter import JupyterMixin, JupyterRenderable
+from .measure import Measurement
+from .text import Text
+
+if TYPE_CHECKING:
+    from .console import (
+        Console,
+        ConsoleOptions,
+        HighlighterType,
+        JustifyMethod,
+        OverflowMethod,
+        RenderResult,
+    )
+
+
+def _is_attr_object(obj: Any) -> bool:
+    """Check if an object was created with attrs module."""
+    return _has_attrs and _attr_module.has(type(obj))
+
+
+def _get_attr_fields(obj: Any) -> Sequence["_attr_module.Attribute[Any]"]:
+    """Get fields for an attrs object."""
+    return _attr_module.fields(type(obj)) if _has_attrs else []
+
+
+def _is_dataclass_repr(obj: object) -> bool:
+    """Check if an instance of a dataclass contains the default repr.
+
+    Args:
+        obj (object): A dataclass instance.
+
+    Returns:
+        bool: True if the default repr is used, False if there is a custom repr.
+    """
+    # Digging in to a lot of internals here
+    # Catching all exceptions in case something is missing on a non CPython implementation
+    try:
+        return obj.__repr__.__code__.co_filename in (
+            dataclasses.__file__,
+            reprlib.__file__,
+        )
+    except Exception:  # pragma: no coverage
+        return False
+
+
+_dummy_namedtuple = collections.namedtuple("_dummy_namedtuple", [])
+
+
+def _has_default_namedtuple_repr(obj: object) -> bool:
+    """Check if an instance of namedtuple contains the default repr
+
+    Args:
+        obj (object): A namedtuple
+
+    Returns:
+        bool: True if the default repr is used, False if there's a custom repr.
+    """
+    obj_file = None
+    try:
+        obj_file = inspect.getfile(obj.__repr__)
+    except (OSError, TypeError):
+        # OSError handles case where object is defined in __main__ scope, e.g. REPL - no filename available.
+        # TypeError trapped defensively, in case of object without filename slips through.
+        pass
+    default_repr_file = inspect.getfile(_dummy_namedtuple.__repr__)
+    return obj_file == default_repr_file
+
+
+def _ipy_display_hook(
+    value: Any,
+    console: Optional["Console"] = None,
+    overflow: "OverflowMethod" = "ignore",
+    crop: bool = False,
+    indent_guides: bool = False,
+    max_length: Optional[int] = None,
+    max_string: Optional[int] = None,
+    max_depth: Optional[int] = None,
+    expand_all: bool = False,
+) -> Union[str, None]:
+    # needed here to prevent circular import:
+    from .console import ConsoleRenderable
+
+    # always skip rich generated jupyter renderables or None values
+    if _safe_isinstance(value, JupyterRenderable) or value is None:
+        return None
+
+    console = console or get_console()
+
+    with console.capture() as capture:
+        # certain renderables should start on a new line
+        if _safe_isinstance(value, ConsoleRenderable):
+            console.line()
+        console.print(
+            (
+                value
+                if _safe_isinstance(value, RichRenderable)
+                else Pretty(
+                    value,
+                    overflow=overflow,
+                    indent_guides=indent_guides,
+                    max_length=max_length,
+                    max_string=max_string,
+                    max_depth=max_depth,
+                    expand_all=expand_all,
+                    margin=12,
+                )
+            ),
+            crop=crop,
+            new_line_start=True,
+            end="",
+        )
+    # strip trailing newline, not usually part of a text repr
+    # I'm not sure if this should be prevented at a lower level
+    return capture.get().rstrip("\n")
+
+
+def _safe_isinstance(
+    obj: object, class_or_tuple: Union[type, Tuple[type, ...]]
+) -> bool:
+    """isinstance can fail in rare cases, for example types with no __class__"""
+    try:
+        return isinstance(obj, class_or_tuple)
+    except Exception:
+        return False
+
+
+def install(
+    console: Optional["Console"] = None,
+    overflow: "OverflowMethod" = "ignore",
+    crop: bool = False,
+    indent_guides: bool = False,
+    max_length: Optional[int] = None,
+    max_string: Optional[int] = None,
+    max_depth: Optional[int] = None,
+    expand_all: bool = False,
+) -> None:
+    """Install automatic pretty printing in the Python REPL.
+
+    Args:
+        console (Console, optional): Console instance or ``None`` to use global console. Defaults to None.
+        overflow (Optional[OverflowMethod], optional): Overflow method. Defaults to "ignore".
+        crop (Optional[bool], optional): Enable cropping of long lines. Defaults to False.
+        indent_guides (bool, optional): Enable indentation guides. Defaults to False.
+        max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+            Defaults to None.
+        max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None.
+        max_depth (int, optional): Maximum depth of nested data structures, or None for no maximum. Defaults to None.
+        expand_all (bool, optional): Expand all containers. Defaults to False.
+        max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100.
+    """
+    from rich import get_console
+
+    console = console or get_console()
+    assert console is not None
+
+    def display_hook(value: Any) -> None:
+        """Replacement sys.displayhook which prettifies objects with Rich."""
+        if value is not None:
+            assert console is not None
+            builtins._ = None  # type: ignore[attr-defined]
+            console.print(
+                (
+                    value
+                    if _safe_isinstance(value, RichRenderable)
+                    else Pretty(
+                        value,
+                        overflow=overflow,
+                        indent_guides=indent_guides,
+                        max_length=max_length,
+                        max_string=max_string,
+                        max_depth=max_depth,
+                        expand_all=expand_all,
+                    )
+                ),
+                crop=crop,
+            )
+            builtins._ = value  # type: ignore[attr-defined]
+
+    try:
+        ip = get_ipython()  # type: ignore[name-defined]
+    except NameError:
+        sys.displayhook = display_hook
+    else:
+        from IPython.core.formatters import BaseFormatter
+
+        class RichFormatter(BaseFormatter):  # type: ignore[misc]
+            pprint: bool = True
+
+            def __call__(self, value: Any) -> Any:
+                if self.pprint:
+                    return _ipy_display_hook(
+                        value,
+                        console=get_console(),
+                        overflow=overflow,
+                        indent_guides=indent_guides,
+                        max_length=max_length,
+                        max_string=max_string,
+                        max_depth=max_depth,
+                        expand_all=expand_all,
+                    )
+                else:
+                    return repr(value)
+
+        # replace plain text formatter with rich formatter
+        rich_formatter = RichFormatter()
+        ip.display_formatter.formatters["text/plain"] = rich_formatter
+
+
+class Pretty(JupyterMixin):
+    """A rich renderable that pretty prints an object.
+
+    Args:
+        _object (Any): An object to pretty print.
+        highlighter (HighlighterType, optional): Highlighter object to apply to result, or None for ReprHighlighter. Defaults to None.
+        indent_size (int, optional): Number of spaces in indent. Defaults to 4.
+        justify (JustifyMethod, optional): Justify method, or None for default. Defaults to None.
+        overflow (OverflowMethod, optional): Overflow method, or None for default. Defaults to None.
+        no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to False.
+        indent_guides (bool, optional): Enable indentation guides. Defaults to False.
+        max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+            Defaults to None.
+        max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None.
+        max_depth (int, optional): Maximum depth of nested data structures, or None for no maximum. Defaults to None.
+        expand_all (bool, optional): Expand all containers. Defaults to False.
+        margin (int, optional): Subtrace a margin from width to force containers to expand earlier. Defaults to 0.
+        insert_line (bool, optional): Insert a new line if the output has multiple new lines. Defaults to False.
+    """
+
+    def __init__(
+        self,
+        _object: Any,
+        highlighter: Optional["HighlighterType"] = None,
+        *,
+        indent_size: int = 4,
+        justify: Optional["JustifyMethod"] = None,
+        overflow: Optional["OverflowMethod"] = None,
+        no_wrap: Optional[bool] = False,
+        indent_guides: bool = False,
+        max_length: Optional[int] = None,
+        max_string: Optional[int] = None,
+        max_depth: Optional[int] = None,
+        expand_all: bool = False,
+        margin: int = 0,
+        insert_line: bool = False,
+    ) -> None:
+        self._object = _object
+        self.highlighter = highlighter or ReprHighlighter()
+        self.indent_size = indent_size
+        self.justify: Optional["JustifyMethod"] = justify
+        self.overflow: Optional["OverflowMethod"] = overflow
+        self.no_wrap = no_wrap
+        self.indent_guides = indent_guides
+        self.max_length = max_length
+        self.max_string = max_string
+        self.max_depth = max_depth
+        self.expand_all = expand_all
+        self.margin = margin
+        self.insert_line = insert_line
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        pretty_str = pretty_repr(
+            self._object,
+            max_width=options.max_width - self.margin,
+            indent_size=self.indent_size,
+            max_length=self.max_length,
+            max_string=self.max_string,
+            max_depth=self.max_depth,
+            expand_all=self.expand_all,
+        )
+        pretty_text = Text.from_ansi(
+            pretty_str,
+            justify=self.justify or options.justify,
+            overflow=self.overflow or options.overflow,
+            no_wrap=pick_bool(self.no_wrap, options.no_wrap),
+            style="pretty",
+        )
+        pretty_text = (
+            self.highlighter(pretty_text)
+            if pretty_text
+            else Text(
+                f"{type(self._object)}.__repr__ returned empty string",
+                style="dim italic",
+            )
+        )
+        if self.indent_guides and not options.ascii_only:
+            pretty_text = pretty_text.with_indent_guides(
+                self.indent_size, style="repr.indent"
+            )
+        if self.insert_line and "\n" in pretty_text:
+            yield ""
+        yield pretty_text
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "Measurement":
+        pretty_str = pretty_repr(
+            self._object,
+            max_width=options.max_width,
+            indent_size=self.indent_size,
+            max_length=self.max_length,
+            max_string=self.max_string,
+            max_depth=self.max_depth,
+            expand_all=self.expand_all,
+        )
+        text_width = (
+            max(cell_len(line) for line in pretty_str.splitlines()) if pretty_str else 0
+        )
+        return Measurement(text_width, text_width)
+
+
+def _get_braces_for_defaultdict(_object: DefaultDict[Any, Any]) -> Tuple[str, str, str]:
+    return (
+        f"defaultdict({_object.default_factory!r}, {{",
+        "})",
+        f"defaultdict({_object.default_factory!r}, {{}})",
+    )
+
+
+def _get_braces_for_deque(_object: Deque[Any]) -> Tuple[str, str, str]:
+    if _object.maxlen is None:
+        return ("deque([", "])", "deque()")
+    return (
+        "deque([",
+        f"], maxlen={_object.maxlen})",
+        f"deque(maxlen={_object.maxlen})",
+    )
+
+
+def _get_braces_for_array(_object: "array[Any]") -> Tuple[str, str, str]:
+    return (f"array({_object.typecode!r}, [", "])", f"array({_object.typecode!r})")
+
+
+_BRACES: Dict[type, Callable[[Any], Tuple[str, str, str]]] = {
+    os._Environ: lambda _object: ("environ({", "})", "environ({})"),
+    array: _get_braces_for_array,
+    defaultdict: _get_braces_for_defaultdict,
+    Counter: lambda _object: ("Counter({", "})", "Counter()"),
+    deque: _get_braces_for_deque,
+    dict: lambda _object: ("{", "}", "{}"),
+    UserDict: lambda _object: ("{", "}", "{}"),
+    frozenset: lambda _object: ("frozenset({", "})", "frozenset()"),
+    list: lambda _object: ("[", "]", "[]"),
+    UserList: lambda _object: ("[", "]", "[]"),
+    set: lambda _object: ("{", "}", "set()"),
+    tuple: lambda _object: ("(", ")", "()"),
+    MappingProxyType: lambda _object: ("mappingproxy({", "})", "mappingproxy({})"),
+}
+_CONTAINERS = tuple(_BRACES.keys())
+_MAPPING_CONTAINERS = (dict, os._Environ, MappingProxyType, UserDict)
+
+
+def is_expandable(obj: Any) -> bool:
+    """Check if an object may be expanded by pretty print."""
+    return (
+        _safe_isinstance(obj, _CONTAINERS)
+        or (is_dataclass(obj))
+        or (hasattr(obj, "__rich_repr__"))
+        or _is_attr_object(obj)
+    ) and not isclass(obj)
+
+
+@dataclass
+class Node:
+    """A node in a repr tree. May be atomic or a container."""
+
+    key_repr: str = ""
+    value_repr: str = ""
+    open_brace: str = ""
+    close_brace: str = ""
+    empty: str = ""
+    last: bool = False
+    is_tuple: bool = False
+    is_namedtuple: bool = False
+    children: Optional[List["Node"]] = None
+    key_separator: str = ": "
+    separator: str = ", "
+
+    def iter_tokens(self) -> Iterable[str]:
+        """Generate tokens for this node."""
+        if self.key_repr:
+            yield self.key_repr
+            yield self.key_separator
+        if self.value_repr:
+            yield self.value_repr
+        elif self.children is not None:
+            if self.children:
+                yield self.open_brace
+                if self.is_tuple and not self.is_namedtuple and len(self.children) == 1:
+                    yield from self.children[0].iter_tokens()
+                    yield ","
+                else:
+                    for child in self.children:
+                        yield from child.iter_tokens()
+                        if not child.last:
+                            yield self.separator
+                yield self.close_brace
+            else:
+                yield self.empty
+
+    def check_length(self, start_length: int, max_length: int) -> bool:
+        """Check the length fits within a limit.
+
+        Args:
+            start_length (int): Starting length of the line (indent, prefix, suffix).
+            max_length (int): Maximum length.
+
+        Returns:
+            bool: True if the node can be rendered within max length, otherwise False.
+        """
+        total_length = start_length
+        for token in self.iter_tokens():
+            total_length += cell_len(token)
+            if total_length > max_length:
+                return False
+        return True
+
+    def __str__(self) -> str:
+        repr_text = "".join(self.iter_tokens())
+        return repr_text
+
+    def render(
+        self, max_width: int = 80, indent_size: int = 4, expand_all: bool = False
+    ) -> str:
+        """Render the node to a pretty repr.
+
+        Args:
+            max_width (int, optional): Maximum width of the repr. Defaults to 80.
+            indent_size (int, optional): Size of indents. Defaults to 4.
+            expand_all (bool, optional): Expand all levels. Defaults to False.
+
+        Returns:
+            str: A repr string of the original object.
+        """
+        lines = [_Line(node=self, is_root=True)]
+        line_no = 0
+        while line_no < len(lines):
+            line = lines[line_no]
+            if line.expandable and not line.expanded:
+                if expand_all or not line.check_length(max_width):
+                    lines[line_no : line_no + 1] = line.expand(indent_size)
+            line_no += 1
+
+        repr_str = "\n".join(str(line) for line in lines)
+        return repr_str
+
+
+@dataclass
+class _Line:
+    """A line in repr output."""
+
+    parent: Optional["_Line"] = None
+    is_root: bool = False
+    node: Optional[Node] = None
+    text: str = ""
+    suffix: str = ""
+    whitespace: str = ""
+    expanded: bool = False
+    last: bool = False
+
+    @property
+    def expandable(self) -> bool:
+        """Check if the line may be expanded."""
+        return bool(self.node is not None and self.node.children)
+
+    def check_length(self, max_length: int) -> bool:
+        """Check this line fits within a given number of cells."""
+        start_length = (
+            len(self.whitespace) + cell_len(self.text) + cell_len(self.suffix)
+        )
+        assert self.node is not None
+        return self.node.check_length(start_length, max_length)
+
+    def expand(self, indent_size: int) -> Iterable["_Line"]:
+        """Expand this line by adding children on their own line."""
+        node = self.node
+        assert node is not None
+        whitespace = self.whitespace
+        assert node.children
+        if node.key_repr:
+            new_line = yield _Line(
+                text=f"{node.key_repr}{node.key_separator}{node.open_brace}",
+                whitespace=whitespace,
+            )
+        else:
+            new_line = yield _Line(text=node.open_brace, whitespace=whitespace)
+        child_whitespace = self.whitespace + " " * indent_size
+        tuple_of_one = node.is_tuple and len(node.children) == 1
+        for last, child in loop_last(node.children):
+            separator = "," if tuple_of_one else node.separator
+            line = _Line(
+                parent=new_line,
+                node=child,
+                whitespace=child_whitespace,
+                suffix=separator,
+                last=last and not tuple_of_one,
+            )
+            yield line
+
+        yield _Line(
+            text=node.close_brace,
+            whitespace=whitespace,
+            suffix=self.suffix,
+            last=self.last,
+        )
+
+    def __str__(self) -> str:
+        if self.last:
+            return f"{self.whitespace}{self.text}{self.node or ''}"
+        else:
+            return (
+                f"{self.whitespace}{self.text}{self.node or ''}{self.suffix.rstrip()}"
+            )
+
+
+def _is_namedtuple(obj: Any) -> bool:
+    """Checks if an object is most likely a namedtuple. It is possible
+    to craft an object that passes this check and isn't a namedtuple, but
+    there is only a minuscule chance of this happening unintentionally.
+
+    Args:
+        obj (Any): The object to test
+
+    Returns:
+        bool: True if the object is a namedtuple. False otherwise.
+    """
+    try:
+        fields = getattr(obj, "_fields", None)
+    except Exception:
+        # Being very defensive - if we cannot get the attr then its not a namedtuple
+        return False
+    return isinstance(obj, tuple) and isinstance(fields, tuple)
+
+
+def traverse(
+    _object: Any,
+    max_length: Optional[int] = None,
+    max_string: Optional[int] = None,
+    max_depth: Optional[int] = None,
+) -> Node:
+    """Traverse object and generate a tree.
+
+    Args:
+        _object (Any): Object to be traversed.
+        max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+            Defaults to None.
+        max_string (int, optional): Maximum length of string before truncating, or None to disable truncating.
+            Defaults to None.
+        max_depth (int, optional): Maximum depth of data structures, or None for no maximum.
+            Defaults to None.
+
+    Returns:
+        Node: The root of a tree structure which can be used to render a pretty repr.
+    """
+
+    def to_repr(obj: Any) -> str:
+        """Get repr string for an object, but catch errors."""
+        if (
+            max_string is not None
+            and _safe_isinstance(obj, (bytes, str))
+            and len(obj) > max_string
+        ):
+            truncated = len(obj) - max_string
+            obj_repr = f"{obj[:max_string]!r}+{truncated}"
+        else:
+            try:
+                obj_repr = repr(obj)
+            except Exception as error:
+                obj_repr = f"<repr-error {str(error)!r}>"
+        return obj_repr
+
+    visited_ids: Set[int] = set()
+    push_visited = visited_ids.add
+    pop_visited = visited_ids.remove
+
+    def _traverse(obj: Any, root: bool = False, depth: int = 0) -> Node:
+        """Walk the object depth first."""
+
+        obj_id = id(obj)
+        if obj_id in visited_ids:
+            # Recursion detected
+            return Node(value_repr="...")
+
+        obj_type = type(obj)
+        children: List[Node]
+        reached_max_depth = max_depth is not None and depth >= max_depth
+
+        def iter_rich_args(rich_args: Any) -> Iterable[Union[Any, Tuple[str, Any]]]:
+            for arg in rich_args:
+                if _safe_isinstance(arg, tuple):
+                    if len(arg) == 3:
+                        key, child, default = arg
+                        if default == child:
+                            continue
+                        yield key, child
+                    elif len(arg) == 2:
+                        key, child = arg
+                        yield key, child
+                    elif len(arg) == 1:
+                        yield arg[0]
+                else:
+                    yield arg
+
+        try:
+            fake_attributes = hasattr(
+                obj, "awehoi234_wdfjwljet234_234wdfoijsdfmmnxpi492"
+            )
+        except Exception:
+            fake_attributes = False
+
+        rich_repr_result: Optional[RichReprResult] = None
+        if not fake_attributes:
+            try:
+                if hasattr(obj, "__rich_repr__") and not isclass(obj):
+                    rich_repr_result = obj.__rich_repr__()
+            except Exception:
+                pass
+
+        if rich_repr_result is not None:
+            push_visited(obj_id)
+            angular = getattr(obj.__rich_repr__, "angular", False)
+            args = list(iter_rich_args(rich_repr_result))
+            class_name = obj.__class__.__name__
+
+            if args:
+                children = []
+                append = children.append
+
+                if reached_max_depth:
+                    if angular:
+                        node = Node(value_repr=f"<{class_name}...>")
+                    else:
+                        node = Node(value_repr=f"{class_name}(...)")
+                else:
+                    if angular:
+                        node = Node(
+                            open_brace=f"<{class_name} ",
+                            close_brace=">",
+                            children=children,
+                            last=root,
+                            separator=" ",
+                        )
+                    else:
+                        node = Node(
+                            open_brace=f"{class_name}(",
+                            close_brace=")",
+                            children=children,
+                            last=root,
+                        )
+                    for last, arg in loop_last(args):
+                        if _safe_isinstance(arg, tuple):
+                            key, child = arg
+                            child_node = _traverse(child, depth=depth + 1)
+                            child_node.last = last
+                            child_node.key_repr = key
+                            child_node.key_separator = "="
+                            append(child_node)
+                        else:
+                            child_node = _traverse(arg, depth=depth + 1)
+                            child_node.last = last
+                            append(child_node)
+            else:
+                node = Node(
+                    value_repr=f"<{class_name}>" if angular else f"{class_name}()",
+                    children=[],
+                    last=root,
+                )
+            pop_visited(obj_id)
+        elif _is_attr_object(obj) and not fake_attributes:
+            push_visited(obj_id)
+            children = []
+            append = children.append
+
+            attr_fields = _get_attr_fields(obj)
+            if attr_fields:
+                if reached_max_depth:
+                    node = Node(value_repr=f"{obj.__class__.__name__}(...)")
+                else:
+                    node = Node(
+                        open_brace=f"{obj.__class__.__name__}(",
+                        close_brace=")",
+                        children=children,
+                        last=root,
+                    )
+
+                    def iter_attrs() -> (
+                        Iterable[Tuple[str, Any, Optional[Callable[[Any], str]]]]
+                    ):
+                        """Iterate over attr fields and values."""
+                        for attr in attr_fields:
+                            if attr.repr:
+                                try:
+                                    value = getattr(obj, attr.name)
+                                except Exception as error:
+                                    # Can happen, albeit rarely
+                                    yield (attr.name, error, None)
+                                else:
+                                    yield (
+                                        attr.name,
+                                        value,
+                                        attr.repr if callable(attr.repr) else None,
+                                    )
+
+                    for last, (name, value, repr_callable) in loop_last(iter_attrs()):
+                        if repr_callable:
+                            child_node = Node(value_repr=str(repr_callable(value)))
+                        else:
+                            child_node = _traverse(value, depth=depth + 1)
+                        child_node.last = last
+                        child_node.key_repr = name
+                        child_node.key_separator = "="
+                        append(child_node)
+            else:
+                node = Node(
+                    value_repr=f"{obj.__class__.__name__}()", children=[], last=root
+                )
+            pop_visited(obj_id)
+        elif (
+            is_dataclass(obj)
+            and not _safe_isinstance(obj, type)
+            and not fake_attributes
+            and _is_dataclass_repr(obj)
+        ):
+            push_visited(obj_id)
+            children = []
+            append = children.append
+            if reached_max_depth:
+                node = Node(value_repr=f"{obj.__class__.__name__}(...)")
+            else:
+                node = Node(
+                    open_brace=f"{obj.__class__.__name__}(",
+                    close_brace=")",
+                    children=children,
+                    last=root,
+                    empty=f"{obj.__class__.__name__}()",
+                )
+
+                for last, field in loop_last(
+                    field
+                    for field in fields(obj)
+                    if field.repr and hasattr(obj, field.name)
+                ):
+                    child_node = _traverse(getattr(obj, field.name), depth=depth + 1)
+                    child_node.key_repr = field.name
+                    child_node.last = last
+                    child_node.key_separator = "="
+                    append(child_node)
+
+            pop_visited(obj_id)
+        elif _is_namedtuple(obj) and _has_default_namedtuple_repr(obj):
+            push_visited(obj_id)
+            class_name = obj.__class__.__name__
+            if reached_max_depth:
+                # If we've reached the max depth, we still show the class name, but not its contents
+                node = Node(
+                    value_repr=f"{class_name}(...)",
+                )
+            else:
+                children = []
+                append = children.append
+                node = Node(
+                    open_brace=f"{class_name}(",
+                    close_brace=")",
+                    children=children,
+                    empty=f"{class_name}()",
+                )
+                for last, (key, value) in loop_last(obj._asdict().items()):
+                    child_node = _traverse(value, depth=depth + 1)
+                    child_node.key_repr = key
+                    child_node.last = last
+                    child_node.key_separator = "="
+                    append(child_node)
+            pop_visited(obj_id)
+        elif _safe_isinstance(obj, _CONTAINERS):
+            for container_type in _CONTAINERS:
+                if _safe_isinstance(obj, container_type):
+                    obj_type = container_type
+                    break
+
+            push_visited(obj_id)
+
+            open_brace, close_brace, empty = _BRACES[obj_type](obj)
+
+            if reached_max_depth:
+                node = Node(value_repr=f"{open_brace}...{close_brace}")
+            elif obj_type.__repr__ != type(obj).__repr__:
+                node = Node(value_repr=to_repr(obj), last=root)
+            elif obj:
+                children = []
+                node = Node(
+                    open_brace=open_brace,
+                    close_brace=close_brace,
+                    children=children,
+                    last=root,
+                )
+                append = children.append
+                num_items = len(obj)
+                last_item_index = num_items - 1
+
+                if _safe_isinstance(obj, _MAPPING_CONTAINERS):
+                    iter_items = iter(obj.items())
+                    if max_length is not None:
+                        iter_items = islice(iter_items, max_length)
+                    for index, (key, child) in enumerate(iter_items):
+                        child_node = _traverse(child, depth=depth + 1)
+                        child_node.key_repr = to_repr(key)
+                        child_node.last = index == last_item_index
+                        append(child_node)
+                else:
+                    iter_values = iter(obj)
+                    if max_length is not None:
+                        iter_values = islice(iter_values, max_length)
+                    for index, child in enumerate(iter_values):
+                        child_node = _traverse(child, depth=depth + 1)
+                        child_node.last = index == last_item_index
+                        append(child_node)
+                if max_length is not None and num_items > max_length:
+                    append(Node(value_repr=f"... +{num_items - max_length}", last=True))
+            else:
+                node = Node(empty=empty, children=[], last=root)
+
+            pop_visited(obj_id)
+        else:
+            node = Node(value_repr=to_repr(obj), last=root)
+        node.is_tuple = type(obj) == tuple
+        node.is_namedtuple = _is_namedtuple(obj)
+        return node
+
+    node = _traverse(_object, root=True)
+    return node
+
+
+def pretty_repr(
+    _object: Any,
+    *,
+    max_width: int = 80,
+    indent_size: int = 4,
+    max_length: Optional[int] = None,
+    max_string: Optional[int] = None,
+    max_depth: Optional[int] = None,
+    expand_all: bool = False,
+) -> str:
+    """Prettify repr string by expanding on to new lines to fit within a given width.
+
+    Args:
+        _object (Any): Object to repr.
+        max_width (int, optional): Desired maximum width of repr string. Defaults to 80.
+        indent_size (int, optional): Number of spaces to indent. Defaults to 4.
+        max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+            Defaults to None.
+        max_string (int, optional): Maximum length of string before truncating, or None to disable truncating.
+            Defaults to None.
+        max_depth (int, optional): Maximum depth of nested data structure, or None for no depth.
+            Defaults to None.
+        expand_all (bool, optional): Expand all containers regardless of available width. Defaults to False.
+
+    Returns:
+        str: A possibly multi-line representation of the object.
+    """
+
+    if _safe_isinstance(_object, Node):
+        node = _object
+    else:
+        node = traverse(
+            _object, max_length=max_length, max_string=max_string, max_depth=max_depth
+        )
+    repr_str: str = node.render(
+        max_width=max_width, indent_size=indent_size, expand_all=expand_all
+    )
+    return repr_str
+
+
+def pprint(
+    _object: Any,
+    *,
+    console: Optional["Console"] = None,
+    indent_guides: bool = True,
+    max_length: Optional[int] = None,
+    max_string: Optional[int] = None,
+    max_depth: Optional[int] = None,
+    expand_all: bool = False,
+) -> None:
+    """A convenience function for pretty printing.
+
+    Args:
+        _object (Any): Object to pretty print.
+        console (Console, optional): Console instance, or None to use default. Defaults to None.
+        max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+            Defaults to None.
+        max_string (int, optional): Maximum length of strings before truncating, or None to disable. Defaults to None.
+        max_depth (int, optional): Maximum depth for nested data structures, or None for unlimited depth. Defaults to None.
+        indent_guides (bool, optional): Enable indentation guides. Defaults to True.
+        expand_all (bool, optional): Expand all containers. Defaults to False.
+    """
+    _console = get_console() if console is None else console
+    _console.print(
+        Pretty(
+            _object,
+            max_length=max_length,
+            max_string=max_string,
+            max_depth=max_depth,
+            indent_guides=indent_guides,
+            expand_all=expand_all,
+            overflow="ignore",
+        ),
+        soft_wrap=True,
+    )
+
+
+if __name__ == "__main__":  # pragma: no cover
+
+    class BrokenRepr:
+        def __repr__(self) -> str:
+            1 / 0
+            return "this will fail"
+
+    from typing import NamedTuple
+
+    class StockKeepingUnit(NamedTuple):
+        name: str
+        description: str
+        price: float
+        category: str
+        reviews: List[str]
+
+    d = defaultdict(int)
+    d["foo"] = 5
+    data = {
+        "foo": [
+            1,
+            "Hello World!",
+            100.123,
+            323.232,
+            432324.0,
+            {5, 6, 7, (1, 2, 3, 4), 8},
+        ],
+        "bar": frozenset({1, 2, 3}),
+        "defaultdict": defaultdict(
+            list, {"crumble": ["apple", "rhubarb", "butter", "sugar", "flour"]}
+        ),
+        "counter": Counter(
+            [
+                "apple",
+                "orange",
+                "pear",
+                "kumquat",
+                "kumquat",
+                "durian" * 100,
+            ]
+        ),
+        "atomic": (False, True, None),
+        "namedtuple": StockKeepingUnit(
+            "Sparkling British Spring Water",
+            "Carbonated spring water",
+            0.9,
+            "water",
+            ["its amazing!", "its terrible!"],
+        ),
+        "Broken": BrokenRepr(),
+    }
+    data["foo"].append(data)  # type: ignore[attr-defined]
+
+    from rich import print
+
+    print(Pretty(data, indent_guides=True, max_string=20))
+
+    class Thing:
+        def __repr__(self) -> str:
+            return "Hello\x1b[38;5;239m World!"
+
+    print(Pretty(Thing()))
diff --git a/.venv/Lib/site-packages/rich/progress.py b/.venv/Lib/site-packages/rich/progress.py
new file mode 100644 (file)
index 0000000..1e92eb6
--- /dev/null
@@ -0,0 +1,1715 @@
+import io
+import sys
+import typing
+import warnings
+from abc import ABC, abstractmethod
+from collections import deque
+from dataclasses import dataclass, field
+from datetime import timedelta
+from io import RawIOBase, UnsupportedOperation
+from math import ceil
+from mmap import mmap
+from operator import length_hint
+from os import PathLike, stat
+from threading import Event, RLock, Thread
+from types import TracebackType
+from typing import (
+    Any,
+    BinaryIO,
+    Callable,
+    ContextManager,
+    Deque,
+    Dict,
+    Generic,
+    Iterable,
+    List,
+    NamedTuple,
+    NewType,
+    Optional,
+    Sequence,
+    TextIO,
+    Tuple,
+    Type,
+    TypeVar,
+    Union,
+)
+
+if sys.version_info >= (3, 8):
+    from typing import Literal
+else:
+    from typing_extensions import Literal  # pragma: no cover
+
+if sys.version_info >= (3, 11):
+    from typing import Self
+else:
+    from typing_extensions import Self  # pragma: no cover
+
+from . import filesize, get_console
+from .console import Console, Group, JustifyMethod, RenderableType
+from .highlighter import Highlighter
+from .jupyter import JupyterMixin
+from .live import Live
+from .progress_bar import ProgressBar
+from .spinner import Spinner
+from .style import StyleType
+from .table import Column, Table
+from .text import Text, TextType
+
+TaskID = NewType("TaskID", int)
+
+ProgressType = TypeVar("ProgressType")
+
+GetTimeCallable = Callable[[], float]
+
+
+_I = typing.TypeVar("_I", TextIO, BinaryIO)
+
+
+class _TrackThread(Thread):
+    """A thread to periodically update progress."""
+
+    def __init__(self, progress: "Progress", task_id: "TaskID", update_period: float):
+        self.progress = progress
+        self.task_id = task_id
+        self.update_period = update_period
+        self.done = Event()
+
+        self.completed = 0
+        super().__init__(daemon=True)
+
+    def run(self) -> None:
+        task_id = self.task_id
+        advance = self.progress.advance
+        update_period = self.update_period
+        last_completed = 0
+        wait = self.done.wait
+        while not wait(update_period) and self.progress.live.is_started:
+            completed = self.completed
+            if last_completed != completed:
+                advance(task_id, completed - last_completed)
+                last_completed = completed
+
+        self.progress.update(self.task_id, completed=self.completed, refresh=True)
+
+    def __enter__(self) -> "_TrackThread":
+        self.start()
+        return self
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc_val: Optional[BaseException],
+        exc_tb: Optional[TracebackType],
+    ) -> None:
+        self.done.set()
+        self.join()
+
+
+def track(
+    sequence: Union[Sequence[ProgressType], Iterable[ProgressType]],
+    description: str = "Working...",
+    total: Optional[float] = None,
+    completed: int = 0,
+    auto_refresh: bool = True,
+    console: Optional[Console] = None,
+    transient: bool = False,
+    get_time: Optional[Callable[[], float]] = None,
+    refresh_per_second: float = 10,
+    style: StyleType = "bar.back",
+    complete_style: StyleType = "bar.complete",
+    finished_style: StyleType = "bar.finished",
+    pulse_style: StyleType = "bar.pulse",
+    update_period: float = 0.1,
+    disable: bool = False,
+    show_speed: bool = True,
+) -> Iterable[ProgressType]:
+    """Track progress by iterating over a sequence.
+
+    Args:
+        sequence (Iterable[ProgressType]): A sequence (must support "len") you wish to iterate over.
+        description (str, optional): Description of task show next to progress bar. Defaults to "Working".
+        total: (float, optional): Total number of steps. Default is len(sequence).
+        completed (int, optional): Number of steps completed so far. Defaults to 0.
+        auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True.
+        transient: (bool, optional): Clear the progress on exit. Defaults to False.
+        console (Console, optional): Console to write to. Default creates internal Console instance.
+        refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10.
+        style (StyleType, optional): Style for the bar background. Defaults to "bar.back".
+        complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete".
+        finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished".
+        pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse".
+        update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1.
+        disable (bool, optional): Disable display of progress.
+        show_speed (bool, optional): Show speed if total isn't known. Defaults to True.
+    Returns:
+        Iterable[ProgressType]: An iterable of the values in the sequence.
+
+    """
+
+    columns: List["ProgressColumn"] = (
+        [TextColumn("[progress.description]{task.description}")] if description else []
+    )
+    columns.extend(
+        (
+            BarColumn(
+                style=style,
+                complete_style=complete_style,
+                finished_style=finished_style,
+                pulse_style=pulse_style,
+            ),
+            TaskProgressColumn(show_speed=show_speed),
+            TimeRemainingColumn(elapsed_when_finished=True),
+        )
+    )
+    progress = Progress(
+        *columns,
+        auto_refresh=auto_refresh,
+        console=console,
+        transient=transient,
+        get_time=get_time,
+        refresh_per_second=refresh_per_second or 10,
+        disable=disable,
+    )
+
+    with progress:
+        yield from progress.track(
+            sequence,
+            total=total,
+            completed=completed,
+            description=description,
+            update_period=update_period,
+        )
+
+
+class _Reader(RawIOBase, BinaryIO):
+    """A reader that tracks progress while it's being read from."""
+
+    def __init__(
+        self,
+        handle: BinaryIO,
+        progress: "Progress",
+        task: TaskID,
+        close_handle: bool = True,
+    ) -> None:
+        self.handle = handle
+        self.progress = progress
+        self.task = task
+        self.close_handle = close_handle
+        self._closed = False
+
+    def __enter__(self) -> "_Reader":
+        self.handle.__enter__()
+        return self
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc_val: Optional[BaseException],
+        exc_tb: Optional[TracebackType],
+    ) -> None:
+        self.close()
+
+    def __iter__(self) -> BinaryIO:
+        return self
+
+    def __next__(self) -> bytes:
+        line = next(self.handle)
+        self.progress.advance(self.task, advance=len(line))
+        return line
+
+    @property
+    def closed(self) -> bool:
+        return self._closed
+
+    def fileno(self) -> int:
+        return self.handle.fileno()
+
+    def isatty(self) -> bool:
+        return self.handle.isatty()
+
+    @property
+    def mode(self) -> str:
+        return self.handle.mode
+
+    @property
+    def name(self) -> str:
+        return self.handle.name
+
+    def readable(self) -> bool:
+        return self.handle.readable()
+
+    def seekable(self) -> bool:
+        return self.handle.seekable()
+
+    def writable(self) -> bool:
+        return False
+
+    def read(self, size: int = -1) -> bytes:
+        block = self.handle.read(size)
+        self.progress.advance(self.task, advance=len(block))
+        return block
+
+    def readinto(self, b: Union[bytearray, memoryview, mmap]):  # type: ignore[no-untyped-def, override]
+        n = self.handle.readinto(b)  # type: ignore[attr-defined]
+        self.progress.advance(self.task, advance=n)
+        return n
+
+    def readline(self, size: int = -1) -> bytes:  # type: ignore[override]
+        line = self.handle.readline(size)
+        self.progress.advance(self.task, advance=len(line))
+        return line
+
+    def readlines(self, hint: int = -1) -> List[bytes]:
+        lines = self.handle.readlines(hint)
+        self.progress.advance(self.task, advance=sum(map(len, lines)))
+        return lines
+
+    def close(self) -> None:
+        if self.close_handle:
+            self.handle.close()
+        self._closed = True
+
+    def seek(self, offset: int, whence: int = 0) -> int:
+        pos = self.handle.seek(offset, whence)
+        self.progress.update(self.task, completed=pos)
+        return pos
+
+    def tell(self) -> int:
+        return self.handle.tell()
+
+    def write(self, s: Any) -> int:
+        raise UnsupportedOperation("write")
+
+    def writelines(self, lines: Iterable[Any]) -> None:
+        raise UnsupportedOperation("writelines")
+
+
+class _ReadContext(ContextManager[_I], Generic[_I]):
+    """A utility class to handle a context for both a reader and a progress."""
+
+    def __init__(self, progress: "Progress", reader: _I) -> None:
+        self.progress = progress
+        self.reader: _I = reader
+
+    def __enter__(self) -> _I:
+        self.progress.start()
+        return self.reader.__enter__()
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc_val: Optional[BaseException],
+        exc_tb: Optional[TracebackType],
+    ) -> None:
+        self.progress.stop()
+        self.reader.__exit__(exc_type, exc_val, exc_tb)
+
+
+def wrap_file(
+    file: BinaryIO,
+    total: int,
+    *,
+    description: str = "Reading...",
+    auto_refresh: bool = True,
+    console: Optional[Console] = None,
+    transient: bool = False,
+    get_time: Optional[Callable[[], float]] = None,
+    refresh_per_second: float = 10,
+    style: StyleType = "bar.back",
+    complete_style: StyleType = "bar.complete",
+    finished_style: StyleType = "bar.finished",
+    pulse_style: StyleType = "bar.pulse",
+    disable: bool = False,
+) -> ContextManager[BinaryIO]:
+    """Read bytes from a file while tracking progress.
+
+    Args:
+        file (Union[str, PathLike[str], BinaryIO]): The path to the file to read, or a file-like object in binary mode.
+        total (int): Total number of bytes to read.
+        description (str, optional): Description of task show next to progress bar. Defaults to "Reading".
+        auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True.
+        transient: (bool, optional): Clear the progress on exit. Defaults to False.
+        console (Console, optional): Console to write to. Default creates internal Console instance.
+        refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10.
+        style (StyleType, optional): Style for the bar background. Defaults to "bar.back".
+        complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete".
+        finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished".
+        pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse".
+        disable (bool, optional): Disable display of progress.
+    Returns:
+        ContextManager[BinaryIO]: A context manager yielding a progress reader.
+
+    """
+
+    columns: List["ProgressColumn"] = (
+        [TextColumn("[progress.description]{task.description}")] if description else []
+    )
+    columns.extend(
+        (
+            BarColumn(
+                style=style,
+                complete_style=complete_style,
+                finished_style=finished_style,
+                pulse_style=pulse_style,
+            ),
+            DownloadColumn(),
+            TimeRemainingColumn(),
+        )
+    )
+    progress = Progress(
+        *columns,
+        auto_refresh=auto_refresh,
+        console=console,
+        transient=transient,
+        get_time=get_time,
+        refresh_per_second=refresh_per_second or 10,
+        disable=disable,
+    )
+
+    reader = progress.wrap_file(file, total=total, description=description)
+    return _ReadContext(progress, reader)
+
+
+@typing.overload
+def open(
+    file: Union[str, "PathLike[str]", bytes],
+    mode: Union[Literal["rt"], Literal["r"]],
+    buffering: int = -1,
+    encoding: Optional[str] = None,
+    errors: Optional[str] = None,
+    newline: Optional[str] = None,
+    *,
+    total: Optional[int] = None,
+    description: str = "Reading...",
+    auto_refresh: bool = True,
+    console: Optional[Console] = None,
+    transient: bool = False,
+    get_time: Optional[Callable[[], float]] = None,
+    refresh_per_second: float = 10,
+    style: StyleType = "bar.back",
+    complete_style: StyleType = "bar.complete",
+    finished_style: StyleType = "bar.finished",
+    pulse_style: StyleType = "bar.pulse",
+    disable: bool = False,
+) -> ContextManager[TextIO]:
+    pass
+
+
+@typing.overload
+def open(
+    file: Union[str, "PathLike[str]", bytes],
+    mode: Literal["rb"],
+    buffering: int = -1,
+    encoding: Optional[str] = None,
+    errors: Optional[str] = None,
+    newline: Optional[str] = None,
+    *,
+    total: Optional[int] = None,
+    description: str = "Reading...",
+    auto_refresh: bool = True,
+    console: Optional[Console] = None,
+    transient: bool = False,
+    get_time: Optional[Callable[[], float]] = None,
+    refresh_per_second: float = 10,
+    style: StyleType = "bar.back",
+    complete_style: StyleType = "bar.complete",
+    finished_style: StyleType = "bar.finished",
+    pulse_style: StyleType = "bar.pulse",
+    disable: bool = False,
+) -> ContextManager[BinaryIO]:
+    pass
+
+
+def open(
+    file: Union[str, "PathLike[str]", bytes],
+    mode: Union[Literal["rb"], Literal["rt"], Literal["r"]] = "r",
+    buffering: int = -1,
+    encoding: Optional[str] = None,
+    errors: Optional[str] = None,
+    newline: Optional[str] = None,
+    *,
+    total: Optional[int] = None,
+    description: str = "Reading...",
+    auto_refresh: bool = True,
+    console: Optional[Console] = None,
+    transient: bool = False,
+    get_time: Optional[Callable[[], float]] = None,
+    refresh_per_second: float = 10,
+    style: StyleType = "bar.back",
+    complete_style: StyleType = "bar.complete",
+    finished_style: StyleType = "bar.finished",
+    pulse_style: StyleType = "bar.pulse",
+    disable: bool = False,
+) -> Union[ContextManager[BinaryIO], ContextManager[TextIO]]:
+    """Read bytes from a file while tracking progress.
+
+    Args:
+        path (Union[str, PathLike[str], BinaryIO]): The path to the file to read, or a file-like object in binary mode.
+        mode (str): The mode to use to open the file. Only supports "r", "rb" or "rt".
+        buffering (int): The buffering strategy to use, see :func:`io.open`.
+        encoding (str, optional): The encoding to use when reading in text mode, see :func:`io.open`.
+        errors (str, optional): The error handling strategy for decoding errors, see :func:`io.open`.
+        newline (str, optional): The strategy for handling newlines in text mode, see :func:`io.open`
+        total: (int, optional): Total number of bytes to read. Must be provided if reading from a file handle. Default for a path is os.stat(file).st_size.
+        description (str, optional): Description of task show next to progress bar. Defaults to "Reading".
+        auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True.
+        transient: (bool, optional): Clear the progress on exit. Defaults to False.
+        console (Console, optional): Console to write to. Default creates internal Console instance.
+        refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10.
+        style (StyleType, optional): Style for the bar background. Defaults to "bar.back".
+        complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete".
+        finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished".
+        pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse".
+        disable (bool, optional): Disable display of progress.
+        encoding (str, optional): The encoding to use when reading in text mode.
+
+    Returns:
+        ContextManager[BinaryIO]: A context manager yielding a progress reader.
+
+    """
+
+    columns: List["ProgressColumn"] = (
+        [TextColumn("[progress.description]{task.description}")] if description else []
+    )
+    columns.extend(
+        (
+            BarColumn(
+                style=style,
+                complete_style=complete_style,
+                finished_style=finished_style,
+                pulse_style=pulse_style,
+            ),
+            DownloadColumn(),
+            TimeRemainingColumn(),
+        )
+    )
+    progress = Progress(
+        *columns,
+        auto_refresh=auto_refresh,
+        console=console,
+        transient=transient,
+        get_time=get_time,
+        refresh_per_second=refresh_per_second or 10,
+        disable=disable,
+    )
+
+    reader = progress.open(
+        file,
+        mode=mode,
+        buffering=buffering,
+        encoding=encoding,
+        errors=errors,
+        newline=newline,
+        total=total,
+        description=description,
+    )
+    return _ReadContext(progress, reader)  # type: ignore[return-value, type-var]
+
+
+class ProgressColumn(ABC):
+    """Base class for a widget to use in progress display."""
+
+    max_refresh: Optional[float] = None
+
+    def __init__(self, table_column: Optional[Column] = None) -> None:
+        self._table_column = table_column
+        self._renderable_cache: Dict[TaskID, Tuple[float, RenderableType]] = {}
+        self._update_time: Optional[float] = None
+
+    def get_table_column(self) -> Column:
+        """Get a table column, used to build tasks table."""
+        return self._table_column or Column()
+
+    def __call__(self, task: "Task") -> RenderableType:
+        """Called by the Progress object to return a renderable for the given task.
+
+        Args:
+            task (Task): An object containing information regarding the task.
+
+        Returns:
+            RenderableType: Anything renderable (including str).
+        """
+        current_time = task.get_time()
+        if self.max_refresh is not None and not task.completed:
+            try:
+                timestamp, renderable = self._renderable_cache[task.id]
+            except KeyError:
+                pass
+            else:
+                if timestamp + self.max_refresh > current_time:
+                    return renderable
+
+        renderable = self.render(task)
+        self._renderable_cache[task.id] = (current_time, renderable)
+        return renderable
+
+    @abstractmethod
+    def render(self, task: "Task") -> RenderableType:
+        """Should return a renderable object."""
+
+
+class RenderableColumn(ProgressColumn):
+    """A column to insert an arbitrary column.
+
+    Args:
+        renderable (RenderableType, optional): Any renderable. Defaults to empty string.
+    """
+
+    def __init__(
+        self, renderable: RenderableType = "", *, table_column: Optional[Column] = None
+    ):
+        self.renderable = renderable
+        super().__init__(table_column=table_column)
+
+    def render(self, task: "Task") -> RenderableType:
+        return self.renderable
+
+
+class SpinnerColumn(ProgressColumn):
+    """A column with a 'spinner' animation.
+
+    Args:
+        spinner_name (str, optional): Name of spinner animation. Defaults to "dots".
+        style (StyleType, optional): Style of spinner. Defaults to "progress.spinner".
+        speed (float, optional): Speed factor of spinner. Defaults to 1.0.
+        finished_text (TextType, optional): Text used when task is finished. Defaults to " ".
+    """
+
+    def __init__(
+        self,
+        spinner_name: str = "dots",
+        style: Optional[StyleType] = "progress.spinner",
+        speed: float = 1.0,
+        finished_text: TextType = " ",
+        table_column: Optional[Column] = None,
+    ):
+        self.spinner = Spinner(spinner_name, style=style, speed=speed)
+        self.finished_text = (
+            Text.from_markup(finished_text)
+            if isinstance(finished_text, str)
+            else finished_text
+        )
+        super().__init__(table_column=table_column)
+
+    def set_spinner(
+        self,
+        spinner_name: str,
+        spinner_style: Optional[StyleType] = "progress.spinner",
+        speed: float = 1.0,
+    ) -> None:
+        """Set a new spinner.
+
+        Args:
+            spinner_name (str): Spinner name, see python -m rich.spinner.
+            spinner_style (Optional[StyleType], optional): Spinner style. Defaults to "progress.spinner".
+            speed (float, optional): Speed factor of spinner. Defaults to 1.0.
+        """
+        self.spinner = Spinner(spinner_name, style=spinner_style, speed=speed)
+
+    def render(self, task: "Task") -> RenderableType:
+        text = (
+            self.finished_text
+            if task.finished
+            else self.spinner.render(task.get_time())
+        )
+        return text
+
+
+class TextColumn(ProgressColumn):
+    """A column containing text."""
+
+    def __init__(
+        self,
+        text_format: str,
+        style: StyleType = "none",
+        justify: JustifyMethod = "left",
+        markup: bool = True,
+        highlighter: Optional[Highlighter] = None,
+        table_column: Optional[Column] = None,
+    ) -> None:
+        self.text_format = text_format
+        self.justify: JustifyMethod = justify
+        self.style = style
+        self.markup = markup
+        self.highlighter = highlighter
+        super().__init__(table_column=table_column or Column(no_wrap=True))
+
+    def render(self, task: "Task") -> Text:
+        _text = self.text_format.format(task=task)
+        if self.markup:
+            text = Text.from_markup(_text, style=self.style, justify=self.justify)
+        else:
+            text = Text(_text, style=self.style, justify=self.justify)
+        if self.highlighter:
+            self.highlighter.highlight(text)
+        return text
+
+
+class BarColumn(ProgressColumn):
+    """Renders a visual progress bar.
+
+    Args:
+        bar_width (Optional[int], optional): Width of bar or None for full width. Defaults to 40.
+        style (StyleType, optional): Style for the bar background. Defaults to "bar.back".
+        complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete".
+        finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished".
+        pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse".
+    """
+
+    def __init__(
+        self,
+        bar_width: Optional[int] = 40,
+        style: StyleType = "bar.back",
+        complete_style: StyleType = "bar.complete",
+        finished_style: StyleType = "bar.finished",
+        pulse_style: StyleType = "bar.pulse",
+        table_column: Optional[Column] = None,
+    ) -> None:
+        self.bar_width = bar_width
+        self.style = style
+        self.complete_style = complete_style
+        self.finished_style = finished_style
+        self.pulse_style = pulse_style
+        super().__init__(table_column=table_column)
+
+    def render(self, task: "Task") -> ProgressBar:
+        """Gets a progress bar widget for a task."""
+        return ProgressBar(
+            total=max(0, task.total) if task.total is not None else None,
+            completed=max(0, task.completed),
+            width=None if self.bar_width is None else max(1, self.bar_width),
+            pulse=not task.started,
+            animation_time=task.get_time(),
+            style=self.style,
+            complete_style=self.complete_style,
+            finished_style=self.finished_style,
+            pulse_style=self.pulse_style,
+        )
+
+
+class TimeElapsedColumn(ProgressColumn):
+    """Renders time elapsed."""
+
+    def render(self, task: "Task") -> Text:
+        """Show time elapsed."""
+        elapsed = task.finished_time if task.finished else task.elapsed
+        if elapsed is None:
+            return Text("-:--:--", style="progress.elapsed")
+        delta = timedelta(seconds=max(0, int(elapsed)))
+        return Text(str(delta), style="progress.elapsed")
+
+
+class TaskProgressColumn(TextColumn):
+    """Show task progress as a percentage.
+
+    Args:
+        text_format (str, optional): Format for percentage display. Defaults to "[progress.percentage]{task.percentage:>3.0f}%".
+        text_format_no_percentage (str, optional): Format if percentage is unknown. Defaults to "".
+        style (StyleType, optional): Style of output. Defaults to "none".
+        justify (JustifyMethod, optional): Text justification. Defaults to "left".
+        markup (bool, optional): Enable markup. Defaults to True.
+        highlighter (Optional[Highlighter], optional): Highlighter to apply to output. Defaults to None.
+        table_column (Optional[Column], optional): Table Column to use. Defaults to None.
+        show_speed (bool, optional): Show speed if total is unknown. Defaults to False.
+    """
+
+    def __init__(
+        self,
+        text_format: str = "[progress.percentage]{task.percentage:>3.0f}%",
+        text_format_no_percentage: str = "",
+        style: StyleType = "none",
+        justify: JustifyMethod = "left",
+        markup: bool = True,
+        highlighter: Optional[Highlighter] = None,
+        table_column: Optional[Column] = None,
+        show_speed: bool = False,
+    ) -> None:
+        self.text_format_no_percentage = text_format_no_percentage
+        self.show_speed = show_speed
+        super().__init__(
+            text_format=text_format,
+            style=style,
+            justify=justify,
+            markup=markup,
+            highlighter=highlighter,
+            table_column=table_column,
+        )
+
+    @classmethod
+    def render_speed(cls, speed: Optional[float]) -> Text:
+        """Render the speed in iterations per second.
+
+        Args:
+            task (Task): A Task object.
+
+        Returns:
+            Text: Text object containing the task speed.
+        """
+        if speed is None:
+            return Text("", style="progress.percentage")
+        unit, suffix = filesize.pick_unit_and_suffix(
+            int(speed),
+            ["", "×10³", "×10⁶", "×10⁹", "×10¹²"],
+            1000,
+        )
+        data_speed = speed / unit
+        return Text(f"{data_speed:.1f}{suffix} it/s", style="progress.percentage")
+
+    def render(self, task: "Task") -> Text:
+        if task.total is None and self.show_speed:
+            return self.render_speed(task.finished_speed or task.speed)
+        text_format = (
+            self.text_format_no_percentage if task.total is None else self.text_format
+        )
+        _text = text_format.format(task=task)
+        if self.markup:
+            text = Text.from_markup(_text, style=self.style, justify=self.justify)
+        else:
+            text = Text(_text, style=self.style, justify=self.justify)
+        if self.highlighter:
+            self.highlighter.highlight(text)
+        return text
+
+
+class TimeRemainingColumn(ProgressColumn):
+    """Renders estimated time remaining.
+
+    Args:
+        compact (bool, optional): Render MM:SS when time remaining is less than an hour. Defaults to False.
+        elapsed_when_finished (bool, optional): Render time elapsed when the task is finished. Defaults to False.
+    """
+
+    # Only refresh twice a second to prevent jitter
+    max_refresh = 0.5
+
+    def __init__(
+        self,
+        compact: bool = False,
+        elapsed_when_finished: bool = False,
+        table_column: Optional[Column] = None,
+    ):
+        self.compact = compact
+        self.elapsed_when_finished = elapsed_when_finished
+        super().__init__(table_column=table_column)
+
+    def render(self, task: "Task") -> Text:
+        """Show time remaining."""
+        if self.elapsed_when_finished and task.finished:
+            task_time = task.finished_time
+            style = "progress.elapsed"
+        else:
+            task_time = task.time_remaining
+            style = "progress.remaining"
+
+        if task.total is None:
+            return Text("", style=style)
+
+        if task_time is None:
+            return Text("--:--" if self.compact else "-:--:--", style=style)
+
+        # Based on https://github.com/tqdm/tqdm/blob/master/tqdm/std.py
+        minutes, seconds = divmod(int(task_time), 60)
+        hours, minutes = divmod(minutes, 60)
+
+        if self.compact and not hours:
+            formatted = f"{minutes:02d}:{seconds:02d}"
+        else:
+            formatted = f"{hours:d}:{minutes:02d}:{seconds:02d}"
+
+        return Text(formatted, style=style)
+
+
+class FileSizeColumn(ProgressColumn):
+    """Renders completed filesize."""
+
+    def render(self, task: "Task") -> Text:
+        """Show data completed."""
+        data_size = filesize.decimal(int(task.completed))
+        return Text(data_size, style="progress.filesize")
+
+
+class TotalFileSizeColumn(ProgressColumn):
+    """Renders total filesize."""
+
+    def render(self, task: "Task") -> Text:
+        """Show data completed."""
+        data_size = filesize.decimal(int(task.total)) if task.total is not None else ""
+        return Text(data_size, style="progress.filesize.total")
+
+
+class MofNCompleteColumn(ProgressColumn):
+    """Renders completed count/total, e.g. '  10/1000'.
+
+    Best for bounded tasks with int quantities.
+
+    Space pads the completed count so that progress length does not change as task progresses
+    past powers of 10.
+
+    Args:
+        separator (str, optional): Text to separate completed and total values. Defaults to "/".
+    """
+
+    def __init__(self, separator: str = "/", table_column: Optional[Column] = None):
+        self.separator = separator
+        super().__init__(table_column=table_column)
+
+    def render(self, task: "Task") -> Text:
+        """Show completed/total."""
+        completed = int(task.completed)
+        total = int(task.total) if task.total is not None else "?"
+        total_width = len(str(total))
+        return Text(
+            f"{completed:{total_width}d}{self.separator}{total}",
+            style="progress.download",
+        )
+
+
+class DownloadColumn(ProgressColumn):
+    """Renders file size downloaded and total, e.g. '0.5/2.3 GB'.
+
+    Args:
+        binary_units (bool, optional): Use binary units, KiB, MiB etc. Defaults to False.
+    """
+
+    def __init__(
+        self, binary_units: bool = False, table_column: Optional[Column] = None
+    ) -> None:
+        self.binary_units = binary_units
+        super().__init__(table_column=table_column)
+
+    def render(self, task: "Task") -> Text:
+        """Calculate common unit for completed and total."""
+        completed = int(task.completed)
+
+        unit_and_suffix_calculation_base = (
+            int(task.total) if task.total is not None else completed
+        )
+        if self.binary_units:
+            unit, suffix = filesize.pick_unit_and_suffix(
+                unit_and_suffix_calculation_base,
+                ["bytes", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"],
+                1024,
+            )
+        else:
+            unit, suffix = filesize.pick_unit_and_suffix(
+                unit_and_suffix_calculation_base,
+                ["bytes", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"],
+                1000,
+            )
+        precision = 0 if unit == 1 else 1
+
+        completed_ratio = completed / unit
+        completed_str = f"{completed_ratio:,.{precision}f}"
+
+        if task.total is not None:
+            total = int(task.total)
+            total_ratio = total / unit
+            total_str = f"{total_ratio:,.{precision}f}"
+        else:
+            total_str = "?"
+
+        download_status = f"{completed_str}/{total_str} {suffix}"
+        download_text = Text(download_status, style="progress.download")
+        return download_text
+
+
+class TransferSpeedColumn(ProgressColumn):
+    """Renders human readable transfer speed."""
+
+    def render(self, task: "Task") -> Text:
+        """Show data transfer speed."""
+        speed = task.finished_speed or task.speed
+        if speed is None:
+            return Text("?", style="progress.data.speed")
+        data_speed = filesize.decimal(int(speed))
+        return Text(f"{data_speed}/s", style="progress.data.speed")
+
+
+class ProgressSample(NamedTuple):
+    """Sample of progress for a given time."""
+
+    timestamp: float
+    """Timestamp of sample."""
+    completed: float
+    """Number of steps completed."""
+
+
+@dataclass
+class Task:
+    """Information regarding a progress task.
+
+    This object should be considered read-only outside of the :class:`~Progress` class.
+
+    """
+
+    id: TaskID
+    """Task ID associated with this task (used in Progress methods)."""
+
+    description: str
+    """str: Description of the task."""
+
+    total: Optional[float]
+    """Optional[float]: Total number of steps in this task."""
+
+    completed: float
+    """float: Number of steps completed"""
+
+    _get_time: GetTimeCallable
+    """Callable to get the current time."""
+
+    finished_time: Optional[float] = None
+    """float: Time task was finished."""
+
+    visible: bool = True
+    """bool: Indicates if this task is visible in the progress display."""
+
+    fields: Dict[str, Any] = field(default_factory=dict)
+    """dict: Arbitrary fields passed in via Progress.update."""
+
+    start_time: Optional[float] = field(default=None, init=False, repr=False)
+    """Optional[float]: Time this task was started, or None if not started."""
+
+    stop_time: Optional[float] = field(default=None, init=False, repr=False)
+    """Optional[float]: Time this task was stopped, or None if not stopped."""
+
+    finished_speed: Optional[float] = None
+    """Optional[float]: The last speed for a finished task."""
+
+    _progress: Deque[ProgressSample] = field(
+        default_factory=lambda: deque(maxlen=1000), init=False, repr=False
+    )
+
+    _lock: RLock = field(repr=False, default_factory=RLock)
+    """Thread lock."""
+
+    def get_time(self) -> float:
+        """float: Get the current time, in seconds."""
+        return self._get_time()
+
+    @property
+    def started(self) -> bool:
+        """bool: Check if the task as started."""
+        return self.start_time is not None
+
+    @property
+    def remaining(self) -> Optional[float]:
+        """Optional[float]: Get the number of steps remaining, if a non-None total was set."""
+        if self.total is None:
+            return None
+        return self.total - self.completed
+
+    @property
+    def elapsed(self) -> Optional[float]:
+        """Optional[float]: Time elapsed since task was started, or ``None`` if the task hasn't started."""
+        if self.start_time is None:
+            return None
+        if self.stop_time is not None:
+            return self.stop_time - self.start_time
+        return self.get_time() - self.start_time
+
+    @property
+    def finished(self) -> bool:
+        """Check if the task has finished."""
+        return self.finished_time is not None
+
+    @property
+    def percentage(self) -> float:
+        """float: Get progress of task as a percentage. If a None total was set, returns 0"""
+        if not self.total:
+            return 0.0
+        completed = (self.completed / self.total) * 100.0
+        completed = min(100.0, max(0.0, completed))
+        return completed
+
+    @property
+    def speed(self) -> Optional[float]:
+        """Optional[float]: Get the estimated speed in steps per second."""
+        if self.start_time is None:
+            return None
+        with self._lock:
+            progress = self._progress
+            if not progress:
+                return None
+            total_time = progress[-1].timestamp - progress[0].timestamp
+            if total_time == 0:
+                return None
+            iter_progress = iter(progress)
+            next(iter_progress)
+            total_completed = sum(sample.completed for sample in iter_progress)
+            speed = total_completed / total_time
+            return speed
+
+    @property
+    def time_remaining(self) -> Optional[float]:
+        """Optional[float]: Get estimated time to completion, or ``None`` if no data."""
+        if self.finished:
+            return 0.0
+        speed = self.speed
+        if not speed:
+            return None
+        remaining = self.remaining
+        if remaining is None:
+            return None
+        estimate = ceil(remaining / speed)
+        return estimate
+
+    def _reset(self) -> None:
+        """Reset progress."""
+        self._progress.clear()
+        self.finished_time = None
+        self.finished_speed = None
+
+
+class Progress(JupyterMixin):
+    """Renders an auto-updating progress bar(s).
+
+    Args:
+        console (Console, optional): Optional Console instance. Defaults to an internal Console instance writing to stdout.
+        auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()`.
+        refresh_per_second (Optional[float], optional): Number of times per second to refresh the progress information or None to use default (10). Defaults to None.
+        speed_estimate_period: (float, optional): Period (in seconds) used to calculate the speed estimate. Defaults to 30.
+        transient: (bool, optional): Clear the progress on exit. Defaults to False.
+        redirect_stdout: (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True.
+        redirect_stderr: (bool, optional): Enable redirection of stderr. Defaults to True.
+        get_time: (Callable, optional): A callable that gets the current time, or None to use Console.get_time. Defaults to None.
+        disable (bool, optional): Disable progress display. Defaults to False
+        expand (bool, optional): Expand tasks table to fit width. Defaults to False.
+    """
+
+    def __init__(
+        self,
+        *columns: Union[str, ProgressColumn],
+        console: Optional[Console] = None,
+        auto_refresh: bool = True,
+        refresh_per_second: float = 10,
+        speed_estimate_period: float = 30.0,
+        transient: bool = False,
+        redirect_stdout: bool = True,
+        redirect_stderr: bool = True,
+        get_time: Optional[GetTimeCallable] = None,
+        disable: bool = False,
+        expand: bool = False,
+    ) -> None:
+        assert refresh_per_second > 0, "refresh_per_second must be > 0"
+        self._lock = RLock()
+        self.columns = columns or self.get_default_columns()
+        self.speed_estimate_period = speed_estimate_period
+
+        self.disable = disable
+        self.expand = expand
+        self._tasks: Dict[TaskID, Task] = {}
+        self._task_index: TaskID = TaskID(0)
+        self.live = Live(
+            console=console or get_console(),
+            auto_refresh=auto_refresh,
+            refresh_per_second=refresh_per_second,
+            transient=transient,
+            redirect_stdout=redirect_stdout,
+            redirect_stderr=redirect_stderr,
+            get_renderable=self.get_renderable,
+        )
+        self.get_time = get_time or self.console.get_time
+        self.print = self.console.print
+        self.log = self.console.log
+
+    @classmethod
+    def get_default_columns(cls) -> Tuple[ProgressColumn, ...]:
+        """Get the default columns used for a new Progress instance:
+           - a text column for the description (TextColumn)
+           - the bar itself (BarColumn)
+           - a text column showing completion percentage (TextColumn)
+           - an estimated-time-remaining column (TimeRemainingColumn)
+        If the Progress instance is created without passing a columns argument,
+        the default columns defined here will be used.
+
+        You can also create a Progress instance using custom columns before
+        and/or after the defaults, as in this example:
+
+            progress = Progress(
+                SpinnerColumn(),
+                *Progress.get_default_columns(),
+                "Elapsed:",
+                TimeElapsedColumn(),
+            )
+
+        This code shows the creation of a Progress display, containing
+        a spinner to the left, the default columns, and a labeled elapsed
+        time column.
+        """
+        return (
+            TextColumn("[progress.description]{task.description}"),
+            BarColumn(),
+            TaskProgressColumn(),
+            TimeRemainingColumn(),
+        )
+
+    @property
+    def console(self) -> Console:
+        return self.live.console
+
+    @property
+    def tasks(self) -> List[Task]:
+        """Get a list of Task instances."""
+        with self._lock:
+            return list(self._tasks.values())
+
+    @property
+    def task_ids(self) -> List[TaskID]:
+        """A list of task IDs."""
+        with self._lock:
+            return list(self._tasks.keys())
+
+    @property
+    def finished(self) -> bool:
+        """Check if all tasks have been completed."""
+        with self._lock:
+            if not self._tasks:
+                return True
+            return all(task.finished for task in self._tasks.values())
+
+    def start(self) -> None:
+        """Start the progress display."""
+        if not self.disable:
+            self.live.start(refresh=True)
+
+    def stop(self) -> None:
+        """Stop the progress display."""
+        self.live.stop()
+        if not self.console.is_interactive and not self.console.is_jupyter:
+            self.console.print()
+
+    def __enter__(self) -> Self:
+        self.start()
+        return self
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc_val: Optional[BaseException],
+        exc_tb: Optional[TracebackType],
+    ) -> None:
+        self.stop()
+
+    def track(
+        self,
+        sequence: Union[Iterable[ProgressType], Sequence[ProgressType]],
+        total: Optional[float] = None,
+        completed: int = 0,
+        task_id: Optional[TaskID] = None,
+        description: str = "Working...",
+        update_period: float = 0.1,
+    ) -> Iterable[ProgressType]:
+        """Track progress by iterating over a sequence.
+
+        Args:
+            sequence (Sequence[ProgressType]): A sequence of values you want to iterate over and track progress.
+            total: (float, optional): Total number of steps. Default is len(sequence).
+            completed (int, optional): Number of steps completed so far. Defaults to 0.
+            task_id: (TaskID): Task to track. Default is new task.
+            description: (str, optional): Description of task, if new task is created.
+            update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1.
+
+        Returns:
+            Iterable[ProgressType]: An iterable of values taken from the provided sequence.
+        """
+        if total is None:
+            total = float(length_hint(sequence)) or None
+
+        if task_id is None:
+            task_id = self.add_task(description, total=total, completed=completed)
+        else:
+            self.update(task_id, total=total, completed=completed)
+
+        if self.live.auto_refresh:
+            with _TrackThread(self, task_id, update_period) as track_thread:
+                for value in sequence:
+                    yield value
+                    track_thread.completed += 1
+        else:
+            advance = self.advance
+            refresh = self.refresh
+            for value in sequence:
+                yield value
+                advance(task_id, 1)
+                refresh()
+
+    def wrap_file(
+        self,
+        file: BinaryIO,
+        total: Optional[int] = None,
+        *,
+        task_id: Optional[TaskID] = None,
+        description: str = "Reading...",
+    ) -> BinaryIO:
+        """Track progress file reading from a binary file.
+
+        Args:
+            file (BinaryIO): A file-like object opened in binary mode.
+            total (int, optional): Total number of bytes to read. This must be provided unless a task with a total is also given.
+            task_id (TaskID): Task to track. Default is new task.
+            description (str, optional): Description of task, if new task is created.
+
+        Returns:
+            BinaryIO: A readable file-like object in binary mode.
+
+        Raises:
+            ValueError: When no total value can be extracted from the arguments or the task.
+        """
+        # attempt to recover the total from the task
+        total_bytes: Optional[float] = None
+        if total is not None:
+            total_bytes = total
+        elif task_id is not None:
+            with self._lock:
+                total_bytes = self._tasks[task_id].total
+        if total_bytes is None:
+            raise ValueError(
+                f"unable to get the total number of bytes, please specify 'total'"
+            )
+
+        # update total of task or create new task
+        if task_id is None:
+            task_id = self.add_task(description, total=total_bytes)
+        else:
+            self.update(task_id, total=total_bytes)
+
+        return _Reader(file, self, task_id, close_handle=False)
+
+    @typing.overload
+    def open(
+        self,
+        file: Union[str, "PathLike[str]", bytes],
+        mode: Literal["rb"],
+        buffering: int = -1,
+        encoding: Optional[str] = None,
+        errors: Optional[str] = None,
+        newline: Optional[str] = None,
+        *,
+        total: Optional[int] = None,
+        task_id: Optional[TaskID] = None,
+        description: str = "Reading...",
+    ) -> BinaryIO:
+        pass
+
+    @typing.overload
+    def open(
+        self,
+        file: Union[str, "PathLike[str]", bytes],
+        mode: Union[Literal["r"], Literal["rt"]],
+        buffering: int = -1,
+        encoding: Optional[str] = None,
+        errors: Optional[str] = None,
+        newline: Optional[str] = None,
+        *,
+        total: Optional[int] = None,
+        task_id: Optional[TaskID] = None,
+        description: str = "Reading...",
+    ) -> TextIO:
+        pass
+
+    def open(
+        self,
+        file: Union[str, "PathLike[str]", bytes],
+        mode: Union[Literal["rb"], Literal["rt"], Literal["r"]] = "r",
+        buffering: int = -1,
+        encoding: Optional[str] = None,
+        errors: Optional[str] = None,
+        newline: Optional[str] = None,
+        *,
+        total: Optional[int] = None,
+        task_id: Optional[TaskID] = None,
+        description: str = "Reading...",
+    ) -> Union[BinaryIO, TextIO]:
+        """Track progress while reading from a binary file.
+
+        Args:
+            path (Union[str, PathLike[str]]): The path to the file to read.
+            mode (str): The mode to use to open the file. Only supports "r", "rb" or "rt".
+            buffering (int): The buffering strategy to use, see :func:`io.open`.
+            encoding (str, optional): The encoding to use when reading in text mode, see :func:`io.open`.
+            errors (str, optional): The error handling strategy for decoding errors, see :func:`io.open`.
+            newline (str, optional): The strategy for handling newlines in text mode, see :func:`io.open`.
+            total (int, optional): Total number of bytes to read. If none given, os.stat(path).st_size is used.
+            task_id (TaskID): Task to track. Default is new task.
+            description (str, optional): Description of task, if new task is created.
+
+        Returns:
+            BinaryIO: A readable file-like object in binary mode.
+
+        Raises:
+            ValueError: When an invalid mode is given.
+        """
+        # normalize the mode (always rb, rt)
+        _mode = "".join(sorted(mode, reverse=False))
+        if _mode not in ("br", "rt", "r"):
+            raise ValueError(f"invalid mode {mode!r}")
+
+        # patch buffering to provide the same behaviour as the builtin `open`
+        line_buffering = buffering == 1
+        if _mode == "br" and buffering == 1:
+            warnings.warn(
+                "line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used",
+                RuntimeWarning,
+            )
+            buffering = -1
+        elif _mode in ("rt", "r"):
+            if buffering == 0:
+                raise ValueError("can't have unbuffered text I/O")
+            elif buffering == 1:
+                buffering = -1
+
+        # attempt to get the total with `os.stat`
+        if total is None:
+            total = stat(file).st_size
+
+        # update total of task or create new task
+        if task_id is None:
+            task_id = self.add_task(description, total=total)
+        else:
+            self.update(task_id, total=total)
+
+        # open the file in binary mode,
+        handle = io.open(file, "rb", buffering=buffering)
+        reader = _Reader(handle, self, task_id, close_handle=True)
+
+        # wrap the reader in a `TextIOWrapper` if text mode
+        if mode in ("r", "rt"):
+            return io.TextIOWrapper(
+                reader,
+                encoding=encoding,
+                errors=errors,
+                newline=newline,
+                line_buffering=line_buffering,
+            )
+
+        return reader
+
+    def start_task(self, task_id: TaskID) -> None:
+        """Start a task.
+
+        Starts a task (used when calculating elapsed time). You may need to call this manually,
+        if you called ``add_task`` with ``start=False``.
+
+        Args:
+            task_id (TaskID): ID of task.
+        """
+        with self._lock:
+            task = self._tasks[task_id]
+            if task.start_time is None:
+                task.start_time = self.get_time()
+
+    def stop_task(self, task_id: TaskID) -> None:
+        """Stop a task.
+
+        This will freeze the elapsed time on the task.
+
+        Args:
+            task_id (TaskID): ID of task.
+        """
+        with self._lock:
+            task = self._tasks[task_id]
+            current_time = self.get_time()
+            if task.start_time is None:
+                task.start_time = current_time
+            task.stop_time = current_time
+
+    def update(
+        self,
+        task_id: TaskID,
+        *,
+        total: Optional[float] = None,
+        completed: Optional[float] = None,
+        advance: Optional[float] = None,
+        description: Optional[str] = None,
+        visible: Optional[bool] = None,
+        refresh: bool = False,
+        **fields: Any,
+    ) -> None:
+        """Update information associated with a task.
+
+        Args:
+            task_id (TaskID): Task id (returned by add_task).
+            total (float, optional): Updates task.total if not None.
+            completed (float, optional): Updates task.completed if not None.
+            advance (float, optional): Add a value to task.completed if not None.
+            description (str, optional): Change task description if not None.
+            visible (bool, optional): Set visible flag if not None.
+            refresh (bool): Force a refresh of progress information. Default is False.
+            **fields (Any): Additional data fields required for rendering.
+        """
+        with self._lock:
+            task = self._tasks[task_id]
+            completed_start = task.completed
+
+            if total is not None and total != task.total:
+                task.total = total
+                task._reset()
+            if advance is not None:
+                task.completed += advance
+            if completed is not None:
+                task.completed = completed
+            if description is not None:
+                task.description = description
+            if visible is not None:
+                task.visible = visible
+            task.fields.update(fields)
+            update_completed = task.completed - completed_start
+
+            current_time = self.get_time()
+            old_sample_time = current_time - self.speed_estimate_period
+            _progress = task._progress
+
+            popleft = _progress.popleft
+            while _progress and _progress[0].timestamp < old_sample_time:
+                popleft()
+            if update_completed > 0:
+                _progress.append(ProgressSample(current_time, update_completed))
+            if (
+                task.total is not None
+                and task.completed >= task.total
+                and task.finished_time is None
+            ):
+                task.finished_time = task.elapsed
+
+        if refresh:
+            self.refresh()
+
+    def reset(
+        self,
+        task_id: TaskID,
+        *,
+        start: bool = True,
+        total: Optional[float] = None,
+        completed: int = 0,
+        visible: Optional[bool] = None,
+        description: Optional[str] = None,
+        **fields: Any,
+    ) -> None:
+        """Reset a task so completed is 0 and the clock is reset.
+
+        Args:
+            task_id (TaskID): ID of task.
+            start (bool, optional): Start the task after reset. Defaults to True.
+            total (float, optional): New total steps in task, or None to use current total. Defaults to None.
+            completed (int, optional): Number of steps completed. Defaults to 0.
+            visible (bool, optional): Enable display of the task. Defaults to True.
+            description (str, optional): Change task description if not None. Defaults to None.
+            **fields (str): Additional data fields required for rendering.
+        """
+        current_time = self.get_time()
+        with self._lock:
+            task = self._tasks[task_id]
+            task._reset()
+            task.start_time = current_time if start else None
+            if total is not None:
+                task.total = total
+            task.completed = completed
+            if visible is not None:
+                task.visible = visible
+            if fields:
+                task.fields = fields
+            if description is not None:
+                task.description = description
+            task.finished_time = None
+        self.refresh()
+
+    def advance(self, task_id: TaskID, advance: float = 1) -> None:
+        """Advance task by a number of steps.
+
+        Args:
+            task_id (TaskID): ID of task.
+            advance (float): Number of steps to advance. Default is 1.
+        """
+        current_time = self.get_time()
+        with self._lock:
+            task = self._tasks[task_id]
+            completed_start = task.completed
+            task.completed += advance
+            update_completed = task.completed - completed_start
+            old_sample_time = current_time - self.speed_estimate_period
+            _progress = task._progress
+
+            popleft = _progress.popleft
+            while _progress and _progress[0].timestamp < old_sample_time:
+                popleft()
+            while len(_progress) > 1000:
+                popleft()
+            _progress.append(ProgressSample(current_time, update_completed))
+            if (
+                task.total is not None
+                and task.completed >= task.total
+                and task.finished_time is None
+            ):
+                task.finished_time = task.elapsed
+                task.finished_speed = task.speed
+
+    def refresh(self) -> None:
+        """Refresh (render) the progress information."""
+        if not self.disable and self.live.is_started:
+            self.live.refresh()
+
+    def get_renderable(self) -> RenderableType:
+        """Get a renderable for the progress display."""
+        renderable = Group(*self.get_renderables())
+        return renderable
+
+    def get_renderables(self) -> Iterable[RenderableType]:
+        """Get a number of renderables for the progress display."""
+        table = self.make_tasks_table(self.tasks)
+        yield table
+
+    def make_tasks_table(self, tasks: Iterable[Task]) -> Table:
+        """Get a table to render the Progress display.
+
+        Args:
+            tasks (Iterable[Task]): An iterable of Task instances, one per row of the table.
+
+        Returns:
+            Table: A table instance.
+        """
+        table_columns = (
+            (
+                Column(no_wrap=True)
+                if isinstance(_column, str)
+                else _column.get_table_column().copy()
+            )
+            for _column in self.columns
+        )
+        table = Table.grid(*table_columns, padding=(0, 1), expand=self.expand)
+
+        for task in tasks:
+            if task.visible:
+                table.add_row(
+                    *(
+                        (
+                            column.format(task=task)
+                            if isinstance(column, str)
+                            else column(task)
+                        )
+                        for column in self.columns
+                    )
+                )
+        return table
+
+    def __rich__(self) -> RenderableType:
+        """Makes the Progress class itself renderable."""
+        with self._lock:
+            return self.get_renderable()
+
+    def add_task(
+        self,
+        description: str,
+        start: bool = True,
+        total: Optional[float] = 100.0,
+        completed: int = 0,
+        visible: bool = True,
+        **fields: Any,
+    ) -> TaskID:
+        """Add a new 'task' to the Progress display.
+
+        Args:
+            description (str): A description of the task.
+            start (bool, optional): Start the task immediately (to calculate elapsed time). If set to False,
+                you will need to call `start` manually. Defaults to True.
+            total (float, optional): Number of total steps in the progress if known.
+                Set to None to render a pulsing animation. Defaults to 100.
+            completed (int, optional): Number of steps completed so far. Defaults to 0.
+            visible (bool, optional): Enable display of the task. Defaults to True.
+            **fields (str): Additional data fields required for rendering.
+
+        Returns:
+            TaskID: An ID you can use when calling `update`.
+        """
+        with self._lock:
+            task = Task(
+                self._task_index,
+                description,
+                total,
+                completed,
+                visible=visible,
+                fields=fields,
+                _get_time=self.get_time,
+                _lock=self._lock,
+            )
+            self._tasks[self._task_index] = task
+            if start:
+                self.start_task(self._task_index)
+            new_task_index = self._task_index
+            self._task_index = TaskID(int(self._task_index) + 1)
+        self.refresh()
+        return new_task_index
+
+    def remove_task(self, task_id: TaskID) -> None:
+        """Delete a task if it exists.
+
+        Args:
+            task_id (TaskID): A task ID.
+
+        """
+        with self._lock:
+            del self._tasks[task_id]
+
+
+if __name__ == "__main__":  # pragma: no coverage
+    import random
+    import time
+
+    from .panel import Panel
+    from .rule import Rule
+    from .syntax import Syntax
+    from .table import Table
+
+    syntax = Syntax(
+        '''def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]:
+    """Iterate and generate a tuple with a flag for last value."""
+    iter_values = iter(values)
+    try:
+        previous_value = next(iter_values)
+    except StopIteration:
+        return
+    for value in iter_values:
+        yield False, previous_value
+        previous_value = value
+    yield True, previous_value''',
+        "python",
+        line_numbers=True,
+    )
+
+    table = Table("foo", "bar", "baz")
+    table.add_row("1", "2", "3")
+
+    progress_renderables = [
+        "Text may be printed while the progress bars are rendering.",
+        Panel("In fact, [i]any[/i] renderable will work"),
+        "Such as [magenta]tables[/]...",
+        table,
+        "Pretty printed structures...",
+        {"type": "example", "text": "Pretty printed"},
+        "Syntax...",
+        syntax,
+        Rule("Give it a try!"),
+    ]
+
+    from itertools import cycle
+
+    examples = cycle(progress_renderables)
+
+    console = Console(record=True)
+
+    with Progress(
+        SpinnerColumn(),
+        *Progress.get_default_columns(),
+        TimeElapsedColumn(),
+        console=console,
+        transient=False,
+    ) as progress:
+        task1 = progress.add_task("[red]Downloading", total=1000)
+        task2 = progress.add_task("[green]Processing", total=1000)
+        task3 = progress.add_task("[yellow]Thinking", total=None)
+
+        while not progress.finished:
+            progress.update(task1, advance=0.5)
+            progress.update(task2, advance=0.3)
+            time.sleep(0.01)
+            if random.randint(0, 100) < 1:
+                progress.log(next(examples))
diff --git a/.venv/Lib/site-packages/rich/progress_bar.py b/.venv/Lib/site-packages/rich/progress_bar.py
new file mode 100644 (file)
index 0000000..41794f7
--- /dev/null
@@ -0,0 +1,223 @@
+import math
+from functools import lru_cache
+from time import monotonic
+from typing import Iterable, List, Optional
+
+from .color import Color, blend_rgb
+from .color_triplet import ColorTriplet
+from .console import Console, ConsoleOptions, RenderResult
+from .jupyter import JupyterMixin
+from .measure import Measurement
+from .segment import Segment
+from .style import Style, StyleType
+
+# Number of characters before 'pulse' animation repeats
+PULSE_SIZE = 20
+
+
+class ProgressBar(JupyterMixin):
+    """Renders a (progress) bar. Used by rich.progress.
+
+    Args:
+        total (float, optional): Number of steps in the bar. Defaults to 100. Set to None to render a pulsing animation.
+        completed (float, optional): Number of steps completed. Defaults to 0.
+        width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None.
+        pulse (bool, optional): Enable pulse effect. Defaults to False. Will pulse if a None total was passed.
+        style (StyleType, optional): Style for the bar background. Defaults to "bar.back".
+        complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete".
+        finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished".
+        pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse".
+        animation_time (Optional[float], optional): Time in seconds to use for animation, or None to use system time.
+    """
+
+    def __init__(
+        self,
+        total: Optional[float] = 100.0,
+        completed: float = 0,
+        width: Optional[int] = None,
+        pulse: bool = False,
+        style: StyleType = "bar.back",
+        complete_style: StyleType = "bar.complete",
+        finished_style: StyleType = "bar.finished",
+        pulse_style: StyleType = "bar.pulse",
+        animation_time: Optional[float] = None,
+    ):
+        self.total = total
+        self.completed = completed
+        self.width = width
+        self.pulse = pulse
+        self.style = style
+        self.complete_style = complete_style
+        self.finished_style = finished_style
+        self.pulse_style = pulse_style
+        self.animation_time = animation_time
+
+        self._pulse_segments: Optional[List[Segment]] = None
+
+    def __repr__(self) -> str:
+        return f"<Bar {self.completed!r} of {self.total!r}>"
+
+    @property
+    def percentage_completed(self) -> Optional[float]:
+        """Calculate percentage complete."""
+        if self.total is None:
+            return None
+        completed = (self.completed / self.total) * 100.0
+        completed = min(100, max(0.0, completed))
+        return completed
+
+    @lru_cache(maxsize=16)
+    def _get_pulse_segments(
+        self,
+        fore_style: Style,
+        back_style: Style,
+        color_system: str,
+        no_color: bool,
+        ascii: bool = False,
+    ) -> List[Segment]:
+        """Get a list of segments to render a pulse animation.
+
+        Returns:
+            List[Segment]: A list of segments, one segment per character.
+        """
+        bar = "-" if ascii else "━"
+        segments: List[Segment] = []
+        if color_system not in ("standard", "eight_bit", "truecolor") or no_color:
+            segments += [Segment(bar, fore_style)] * (PULSE_SIZE // 2)
+            segments += [Segment(" " if no_color else bar, back_style)] * (
+                PULSE_SIZE - (PULSE_SIZE // 2)
+            )
+            return segments
+
+        append = segments.append
+        fore_color = (
+            fore_style.color.get_truecolor()
+            if fore_style.color
+            else ColorTriplet(255, 0, 255)
+        )
+        back_color = (
+            back_style.color.get_truecolor()
+            if back_style.color
+            else ColorTriplet(0, 0, 0)
+        )
+        cos = math.cos
+        pi = math.pi
+        _Segment = Segment
+        _Style = Style
+        from_triplet = Color.from_triplet
+
+        for index in range(PULSE_SIZE):
+            position = index / PULSE_SIZE
+            fade = 0.5 + cos(position * pi * 2) / 2.0
+            color = blend_rgb(fore_color, back_color, cross_fade=fade)
+            append(_Segment(bar, _Style(color=from_triplet(color))))
+        return segments
+
+    def update(self, completed: float, total: Optional[float] = None) -> None:
+        """Update progress with new values.
+
+        Args:
+            completed (float): Number of steps completed.
+            total (float, optional): Total number of steps, or ``None`` to not change. Defaults to None.
+        """
+        self.completed = completed
+        self.total = total if total is not None else self.total
+
+    def _render_pulse(
+        self, console: Console, width: int, ascii: bool = False
+    ) -> Iterable[Segment]:
+        """Renders the pulse animation.
+
+        Args:
+            console (Console): Console instance.
+            width (int): Width in characters of pulse animation.
+
+        Returns:
+            RenderResult: [description]
+
+        Yields:
+            Iterator[Segment]: Segments to render pulse
+        """
+        fore_style = console.get_style(self.pulse_style, default="white")
+        back_style = console.get_style(self.style, default="black")
+
+        pulse_segments = self._get_pulse_segments(
+            fore_style, back_style, console.color_system, console.no_color, ascii=ascii
+        )
+        segment_count = len(pulse_segments)
+        current_time = (
+            monotonic() if self.animation_time is None else self.animation_time
+        )
+        segments = pulse_segments * (int(width / segment_count) + 2)
+        offset = int(-current_time * 15) % segment_count
+        segments = segments[offset : offset + width]
+        yield from segments
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        width = min(self.width or options.max_width, options.max_width)
+        ascii = options.legacy_windows or options.ascii_only
+        should_pulse = self.pulse or self.total is None
+        if should_pulse:
+            yield from self._render_pulse(console, width, ascii=ascii)
+            return
+
+        completed: Optional[float] = (
+            min(self.total, max(0, self.completed)) if self.total is not None else None
+        )
+
+        bar = "-" if ascii else "━"
+        half_bar_right = " " if ascii else "╸"
+        half_bar_left = " " if ascii else "╺"
+        complete_halves = (
+            int(width * 2 * completed / self.total)
+            if self.total and completed is not None
+            else width * 2
+        )
+        bar_count = complete_halves // 2
+        half_bar_count = complete_halves % 2
+        style = console.get_style(self.style)
+        is_finished = self.total is None or self.completed >= self.total
+        complete_style = console.get_style(
+            self.finished_style if is_finished else self.complete_style
+        )
+        _Segment = Segment
+        if bar_count:
+            yield _Segment(bar * bar_count, complete_style)
+        if half_bar_count:
+            yield _Segment(half_bar_right * half_bar_count, complete_style)
+
+        if not console.no_color:
+            remaining_bars = width - bar_count - half_bar_count
+            if remaining_bars and console.color_system is not None:
+                if not half_bar_count and bar_count:
+                    yield _Segment(half_bar_left, style)
+                    remaining_bars -= 1
+                if remaining_bars:
+                    yield _Segment(bar * remaining_bars, style)
+
+    def __rich_measure__(
+        self, console: Console, options: ConsoleOptions
+    ) -> Measurement:
+        return (
+            Measurement(self.width, self.width)
+            if self.width is not None
+            else Measurement(4, options.max_width)
+        )
+
+
+if __name__ == "__main__":  # pragma: no cover
+    console = Console()
+    bar = ProgressBar(width=50, total=100)
+
+    import time
+
+    console.show_cursor(False)
+    for n in range(0, 101, 1):
+        bar.update(n)
+        console.print(bar)
+        console.file.write("\r")
+        time.sleep(0.05)
+    console.show_cursor(True)
+    console.print()
diff --git a/.venv/Lib/site-packages/rich/prompt.py b/.venv/Lib/site-packages/rich/prompt.py
new file mode 100644 (file)
index 0000000..c7cf25b
--- /dev/null
@@ -0,0 +1,400 @@
+from typing import Any, Generic, List, Optional, TextIO, TypeVar, Union, overload
+
+from . import get_console
+from .console import Console
+from .text import Text, TextType
+
+PromptType = TypeVar("PromptType")
+DefaultType = TypeVar("DefaultType")
+
+
+class PromptError(Exception):
+    """Exception base class for prompt related errors."""
+
+
+class InvalidResponse(PromptError):
+    """Exception to indicate a response was invalid. Raise this within process_response() to indicate an error
+    and provide an error message.
+
+    Args:
+        message (Union[str, Text]): Error message.
+    """
+
+    def __init__(self, message: TextType) -> None:
+        self.message = message
+
+    def __rich__(self) -> TextType:
+        return self.message
+
+
+class PromptBase(Generic[PromptType]):
+    """Ask the user for input until a valid response is received. This is the base class, see one of
+    the concrete classes for examples.
+
+    Args:
+        prompt (TextType, optional): Prompt text. Defaults to "".
+        console (Console, optional): A Console instance or None to use global console. Defaults to None.
+        password (bool, optional): Enable password input. Defaults to False.
+        choices (List[str], optional): A list of valid choices. Defaults to None.
+        case_sensitive (bool, optional): Matching of choices should be case-sensitive. Defaults to True.
+        show_default (bool, optional): Show default in prompt. Defaults to True.
+        show_choices (bool, optional): Show choices in prompt. Defaults to True.
+    """
+
+    response_type: type = str
+
+    validate_error_message = "[prompt.invalid]Please enter a valid value"
+    illegal_choice_message = (
+        "[prompt.invalid.choice]Please select one of the available options"
+    )
+    prompt_suffix = ": "
+
+    choices: Optional[List[str]] = None
+
+    def __init__(
+        self,
+        prompt: TextType = "",
+        *,
+        console: Optional[Console] = None,
+        password: bool = False,
+        choices: Optional[List[str]] = None,
+        case_sensitive: bool = True,
+        show_default: bool = True,
+        show_choices: bool = True,
+    ) -> None:
+        self.console = console or get_console()
+        self.prompt = (
+            Text.from_markup(prompt, style="prompt")
+            if isinstance(prompt, str)
+            else prompt
+        )
+        self.password = password
+        if choices is not None:
+            self.choices = choices
+        self.case_sensitive = case_sensitive
+        self.show_default = show_default
+        self.show_choices = show_choices
+
+    @classmethod
+    @overload
+    def ask(
+        cls,
+        prompt: TextType = "",
+        *,
+        console: Optional[Console] = None,
+        password: bool = False,
+        choices: Optional[List[str]] = None,
+        case_sensitive: bool = True,
+        show_default: bool = True,
+        show_choices: bool = True,
+        default: DefaultType,
+        stream: Optional[TextIO] = None,
+    ) -> Union[DefaultType, PromptType]:
+        ...
+
+    @classmethod
+    @overload
+    def ask(
+        cls,
+        prompt: TextType = "",
+        *,
+        console: Optional[Console] = None,
+        password: bool = False,
+        choices: Optional[List[str]] = None,
+        case_sensitive: bool = True,
+        show_default: bool = True,
+        show_choices: bool = True,
+        stream: Optional[TextIO] = None,
+    ) -> PromptType:
+        ...
+
+    @classmethod
+    def ask(
+        cls,
+        prompt: TextType = "",
+        *,
+        console: Optional[Console] = None,
+        password: bool = False,
+        choices: Optional[List[str]] = None,
+        case_sensitive: bool = True,
+        show_default: bool = True,
+        show_choices: bool = True,
+        default: Any = ...,
+        stream: Optional[TextIO] = None,
+    ) -> Any:
+        """Shortcut to construct and run a prompt loop and return the result.
+
+        Example:
+            >>> filename = Prompt.ask("Enter a filename")
+
+        Args:
+            prompt (TextType, optional): Prompt text. Defaults to "".
+            console (Console, optional): A Console instance or None to use global console. Defaults to None.
+            password (bool, optional): Enable password input. Defaults to False.
+            choices (List[str], optional): A list of valid choices. Defaults to None.
+            case_sensitive (bool, optional): Matching of choices should be case-sensitive. Defaults to True.
+            show_default (bool, optional): Show default in prompt. Defaults to True.
+            show_choices (bool, optional): Show choices in prompt. Defaults to True.
+            stream (TextIO, optional): Optional text file open for reading to get input. Defaults to None.
+        """
+        _prompt = cls(
+            prompt,
+            console=console,
+            password=password,
+            choices=choices,
+            case_sensitive=case_sensitive,
+            show_default=show_default,
+            show_choices=show_choices,
+        )
+        return _prompt(default=default, stream=stream)
+
+    def render_default(self, default: DefaultType) -> Text:
+        """Turn the supplied default in to a Text instance.
+
+        Args:
+            default (DefaultType): Default value.
+
+        Returns:
+            Text: Text containing rendering of default value.
+        """
+        return Text(f"({default})", "prompt.default")
+
+    def make_prompt(self, default: DefaultType) -> Text:
+        """Make prompt text.
+
+        Args:
+            default (DefaultType): Default value.
+
+        Returns:
+            Text: Text to display in prompt.
+        """
+        prompt = self.prompt.copy()
+        prompt.end = ""
+
+        if self.show_choices and self.choices:
+            _choices = "/".join(self.choices)
+            choices = f"[{_choices}]"
+            prompt.append(" ")
+            prompt.append(choices, "prompt.choices")
+
+        if (
+            default != ...
+            and self.show_default
+            and isinstance(default, (str, self.response_type))
+        ):
+            prompt.append(" ")
+            _default = self.render_default(default)
+            prompt.append(_default)
+
+        prompt.append(self.prompt_suffix)
+
+        return prompt
+
+    @classmethod
+    def get_input(
+        cls,
+        console: Console,
+        prompt: TextType,
+        password: bool,
+        stream: Optional[TextIO] = None,
+    ) -> str:
+        """Get input from user.
+
+        Args:
+            console (Console): Console instance.
+            prompt (TextType): Prompt text.
+            password (bool): Enable password entry.
+
+        Returns:
+            str: String from user.
+        """
+        return console.input(prompt, password=password, stream=stream)
+
+    def check_choice(self, value: str) -> bool:
+        """Check value is in the list of valid choices.
+
+        Args:
+            value (str): Value entered by user.
+
+        Returns:
+            bool: True if choice was valid, otherwise False.
+        """
+        assert self.choices is not None
+        if self.case_sensitive:
+            return value.strip() in self.choices
+        return value.strip().lower() in [choice.lower() for choice in self.choices]
+
+    def process_response(self, value: str) -> PromptType:
+        """Process response from user, convert to prompt type.
+
+        Args:
+            value (str): String typed by user.
+
+        Raises:
+            InvalidResponse: If ``value`` is invalid.
+
+        Returns:
+            PromptType: The value to be returned from ask method.
+        """
+        value = value.strip()
+        try:
+            return_value: PromptType = self.response_type(value)
+        except ValueError:
+            raise InvalidResponse(self.validate_error_message)
+
+        if self.choices is not None:
+            if not self.check_choice(value):
+                raise InvalidResponse(self.illegal_choice_message)
+
+            if not self.case_sensitive:
+                # return the original choice, not the lower case version
+                return_value = self.response_type(
+                    self.choices[
+                        [choice.lower() for choice in self.choices].index(value.lower())
+                    ]
+                )
+        return return_value
+
+    def on_validate_error(self, value: str, error: InvalidResponse) -> None:
+        """Called to handle validation error.
+
+        Args:
+            value (str): String entered by user.
+            error (InvalidResponse): Exception instance the initiated the error.
+        """
+        self.console.print(error)
+
+    def pre_prompt(self) -> None:
+        """Hook to display something before the prompt."""
+
+    @overload
+    def __call__(self, *, stream: Optional[TextIO] = None) -> PromptType:
+        ...
+
+    @overload
+    def __call__(
+        self, *, default: DefaultType, stream: Optional[TextIO] = None
+    ) -> Union[PromptType, DefaultType]:
+        ...
+
+    def __call__(self, *, default: Any = ..., stream: Optional[TextIO] = None) -> Any:
+        """Run the prompt loop.
+
+        Args:
+            default (Any, optional): Optional default value.
+
+        Returns:
+            PromptType: Processed value.
+        """
+        while True:
+            self.pre_prompt()
+            prompt = self.make_prompt(default)
+            value = self.get_input(self.console, prompt, self.password, stream=stream)
+            if value == "" and default != ...:
+                return default
+            try:
+                return_value = self.process_response(value)
+            except InvalidResponse as error:
+                self.on_validate_error(value, error)
+                continue
+            else:
+                return return_value
+
+
+class Prompt(PromptBase[str]):
+    """A prompt that returns a str.
+
+    Example:
+        >>> name = Prompt.ask("Enter your name")
+
+
+    """
+
+    response_type = str
+
+
+class IntPrompt(PromptBase[int]):
+    """A prompt that returns an integer.
+
+    Example:
+        >>> burrito_count = IntPrompt.ask("How many burritos do you want to order")
+
+    """
+
+    response_type = int
+    validate_error_message = "[prompt.invalid]Please enter a valid integer number"
+
+
+class FloatPrompt(PromptBase[float]):
+    """A prompt that returns a float.
+
+    Example:
+        >>> temperature = FloatPrompt.ask("Enter desired temperature")
+
+    """
+
+    response_type = float
+    validate_error_message = "[prompt.invalid]Please enter a number"
+
+
+class Confirm(PromptBase[bool]):
+    """A yes / no confirmation prompt.
+
+    Example:
+        >>> if Confirm.ask("Continue"):
+                run_job()
+
+    """
+
+    response_type = bool
+    validate_error_message = "[prompt.invalid]Please enter Y or N"
+    choices: List[str] = ["y", "n"]
+
+    def render_default(self, default: DefaultType) -> Text:
+        """Render the default as (y) or (n) rather than True/False."""
+        yes, no = self.choices
+        return Text(f"({yes})" if default else f"({no})", style="prompt.default")
+
+    def process_response(self, value: str) -> bool:
+        """Convert choices to a bool."""
+        value = value.strip().lower()
+        if value not in self.choices:
+            raise InvalidResponse(self.validate_error_message)
+        return value == self.choices[0]
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich import print
+
+    if Confirm.ask("Run [i]prompt[/i] tests?", default=True):
+        while True:
+            result = IntPrompt.ask(
+                ":rocket: Enter a number between [b]1[/b] and [b]10[/b]", default=5
+            )
+            if result >= 1 and result <= 10:
+                break
+            print(":pile_of_poo: [prompt.invalid]Number must be between 1 and 10")
+        print(f"number={result}")
+
+        while True:
+            password = Prompt.ask(
+                "Please enter a password [cyan](must be at least 5 characters)",
+                password=True,
+            )
+            if len(password) >= 5:
+                break
+            print("[prompt.invalid]password too short")
+        print(f"password={password!r}")
+
+        fruit = Prompt.ask("Enter a fruit", choices=["apple", "orange", "pear"])
+        print(f"fruit={fruit!r}")
+
+        doggie = Prompt.ask(
+            "What's the best Dog? (Case INSENSITIVE)",
+            choices=["Border Terrier", "Collie", "Labradoodle"],
+            case_sensitive=False,
+        )
+        print(f"doggie={doggie!r}")
+
+    else:
+        print("[b]OK :loudly_crying_face:")
diff --git a/.venv/Lib/site-packages/rich/protocol.py b/.venv/Lib/site-packages/rich/protocol.py
new file mode 100644 (file)
index 0000000..c6923dd
--- /dev/null
@@ -0,0 +1,42 @@
+from typing import Any, cast, Set, TYPE_CHECKING
+from inspect import isclass
+
+if TYPE_CHECKING:
+    from rich.console import RenderableType
+
+_GIBBERISH = """aihwerij235234ljsdnp34ksodfipwoe234234jlskjdf"""
+
+
+def is_renderable(check_object: Any) -> bool:
+    """Check if an object may be rendered by Rich."""
+    return (
+        isinstance(check_object, str)
+        or hasattr(check_object, "__rich__")
+        or hasattr(check_object, "__rich_console__")
+    )
+
+
+def rich_cast(renderable: object) -> "RenderableType":
+    """Cast an object to a renderable by calling __rich__ if present.
+
+    Args:
+        renderable (object): A potentially renderable object
+
+    Returns:
+        object: The result of recursively calling __rich__.
+    """
+    from rich.console import RenderableType
+
+    rich_visited_set: Set[type] = set()  # Prevent potential infinite loop
+    while hasattr(renderable, "__rich__") and not isclass(renderable):
+        # Detect object which claim to have all the attributes
+        if hasattr(renderable, _GIBBERISH):
+            return repr(renderable)
+        cast_method = getattr(renderable, "__rich__")
+        renderable = cast_method()
+        renderable_type = type(renderable)
+        if renderable_type in rich_visited_set:
+            break
+        rich_visited_set.add(renderable_type)
+
+    return cast(RenderableType, renderable)
diff --git a/.venv/Lib/site-packages/rich/py.typed b/.venv/Lib/site-packages/rich/py.typed
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/.venv/Lib/site-packages/rich/region.py b/.venv/Lib/site-packages/rich/region.py
new file mode 100644 (file)
index 0000000..75b3631
--- /dev/null
@@ -0,0 +1,10 @@
+from typing import NamedTuple
+
+
+class Region(NamedTuple):
+    """Defines a rectangular region of the screen."""
+
+    x: int
+    y: int
+    width: int
+    height: int
diff --git a/.venv/Lib/site-packages/rich/repr.py b/.venv/Lib/site-packages/rich/repr.py
new file mode 100644 (file)
index 0000000..9533100
--- /dev/null
@@ -0,0 +1,149 @@
+import inspect
+from functools import partial
+from typing import (
+    Any,
+    Callable,
+    Iterable,
+    List,
+    Optional,
+    Tuple,
+    Type,
+    TypeVar,
+    Union,
+    overload,
+)
+
+T = TypeVar("T")
+
+
+Result = Iterable[Union[Any, Tuple[Any], Tuple[str, Any], Tuple[str, Any, Any]]]
+RichReprResult = Result
+
+
+class ReprError(Exception):
+    """An error occurred when attempting to build a repr."""
+
+
+@overload
+def auto(cls: Optional[Type[T]]) -> Type[T]:
+    ...
+
+
+@overload
+def auto(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]:
+    ...
+
+
+def auto(
+    cls: Optional[Type[T]] = None, *, angular: Optional[bool] = None
+) -> Union[Type[T], Callable[[Type[T]], Type[T]]]:
+    """Class decorator to create __repr__ from __rich_repr__"""
+
+    def do_replace(cls: Type[T], angular: Optional[bool] = None) -> Type[T]:
+        def auto_repr(self: T) -> str:
+            """Create repr string from __rich_repr__"""
+            repr_str: List[str] = []
+            append = repr_str.append
+
+            angular: bool = getattr(self.__rich_repr__, "angular", False)  # type: ignore[attr-defined]
+            for arg in self.__rich_repr__():  # type: ignore[attr-defined]
+                if isinstance(arg, tuple):
+                    if len(arg) == 1:
+                        append(repr(arg[0]))
+                    else:
+                        key, value, *default = arg
+                        if key is None:
+                            append(repr(value))
+                        else:
+                            if default and default[0] == value:
+                                continue
+                            append(f"{key}={value!r}")
+                else:
+                    append(repr(arg))
+            if angular:
+                return f"<{self.__class__.__name__} {' '.join(repr_str)}>"
+            else:
+                return f"{self.__class__.__name__}({', '.join(repr_str)})"
+
+        def auto_rich_repr(self: Type[T]) -> Result:
+            """Auto generate __rich_rep__ from signature of __init__"""
+            try:
+                signature = inspect.signature(self.__init__)
+                for name, param in signature.parameters.items():
+                    if param.kind == param.POSITIONAL_ONLY:
+                        yield getattr(self, name)
+                    elif param.kind in (
+                        param.POSITIONAL_OR_KEYWORD,
+                        param.KEYWORD_ONLY,
+                    ):
+                        if param.default is param.empty:
+                            yield getattr(self, param.name)
+                        else:
+                            yield param.name, getattr(self, param.name), param.default
+            except Exception as error:
+                raise ReprError(
+                    f"Failed to auto generate __rich_repr__; {error}"
+                ) from None
+
+        if not hasattr(cls, "__rich_repr__"):
+            auto_rich_repr.__doc__ = "Build a rich repr"
+            cls.__rich_repr__ = auto_rich_repr  # type: ignore[attr-defined]
+
+        auto_repr.__doc__ = "Return repr(self)"
+        cls.__repr__ = auto_repr  # type: ignore[assignment]
+        if angular is not None:
+            cls.__rich_repr__.angular = angular  # type: ignore[attr-defined]
+        return cls
+
+    if cls is None:
+        return partial(do_replace, angular=angular)
+    else:
+        return do_replace(cls, angular=angular)
+
+
+@overload
+def rich_repr(cls: Optional[Type[T]]) -> Type[T]:
+    ...
+
+
+@overload
+def rich_repr(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]:
+    ...
+
+
+def rich_repr(
+    cls: Optional[Type[T]] = None, *, angular: bool = False
+) -> Union[Type[T], Callable[[Type[T]], Type[T]]]:
+    if cls is None:
+        return auto(angular=angular)
+    else:
+        return auto(cls)
+
+
+if __name__ == "__main__":
+
+    @auto
+    class Foo:
+        def __rich_repr__(self) -> Result:
+            yield "foo"
+            yield "bar", {"shopping": ["eggs", "ham", "pineapple"]}
+            yield "buy", "hand sanitizer"
+
+    foo = Foo()
+    from rich.console import Console
+
+    console = Console()
+
+    console.rule("Standard repr")
+    console.print(foo)
+
+    console.print(foo, width=60)
+    console.print(foo, width=30)
+
+    console.rule("Angular repr")
+    Foo.__rich_repr__.angular = True  # type: ignore[attr-defined]
+
+    console.print(foo)
+
+    console.print(foo, width=60)
+    console.print(foo, width=30)
diff --git a/.venv/Lib/site-packages/rich/rule.py b/.venv/Lib/site-packages/rich/rule.py
new file mode 100644 (file)
index 0000000..fb3d432
--- /dev/null
@@ -0,0 +1,130 @@
+from typing import Union
+
+from .align import AlignMethod
+from .cells import cell_len, set_cell_size
+from .console import Console, ConsoleOptions, RenderResult
+from .jupyter import JupyterMixin
+from .measure import Measurement
+from .style import Style
+from .text import Text
+
+
+class Rule(JupyterMixin):
+    """A console renderable to draw a horizontal rule (line).
+
+    Args:
+        title (Union[str, Text], optional): Text to render in the rule. Defaults to "".
+        characters (str, optional): Character(s) used to draw the line. Defaults to "─".
+        style (StyleType, optional): Style of Rule. Defaults to "rule.line".
+        end (str, optional): Character at end of Rule. defaults to "\\\\n"
+        align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center".
+    """
+
+    def __init__(
+        self,
+        title: Union[str, Text] = "",
+        *,
+        characters: str = "─",
+        style: Union[str, Style] = "rule.line",
+        end: str = "\n",
+        align: AlignMethod = "center",
+    ) -> None:
+        if cell_len(characters) < 1:
+            raise ValueError(
+                "'characters' argument must have a cell width of at least 1"
+            )
+        if align not in ("left", "center", "right"):
+            raise ValueError(
+                f'invalid value for align, expected "left", "center", "right" (not {align!r})'
+            )
+        self.title = title
+        self.characters = characters
+        self.style = style
+        self.end = end
+        self.align = align
+
+    def __repr__(self) -> str:
+        return f"Rule({self.title!r}, {self.characters!r})"
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        width = options.max_width
+
+        characters = (
+            "-"
+            if (options.ascii_only and not self.characters.isascii())
+            else self.characters
+        )
+
+        chars_len = cell_len(characters)
+        if not self.title:
+            yield self._rule_line(chars_len, width)
+            return
+
+        if isinstance(self.title, Text):
+            title_text = self.title
+        else:
+            title_text = console.render_str(self.title, style="rule.text")
+
+        title_text.plain = title_text.plain.replace("\n", " ")
+        title_text.expand_tabs()
+
+        required_space = 4 if self.align == "center" else 2
+        truncate_width = max(0, width - required_space)
+        if not truncate_width:
+            yield self._rule_line(chars_len, width)
+            return
+
+        rule_text = Text(end=self.end)
+        if self.align == "center":
+            title_text.truncate(truncate_width, overflow="ellipsis")
+            side_width = (width - cell_len(title_text.plain)) // 2
+            left = Text(characters * (side_width // chars_len + 1))
+            left.truncate(side_width - 1)
+            right_length = width - cell_len(left.plain) - cell_len(title_text.plain)
+            right = Text(characters * (side_width // chars_len + 1))
+            right.truncate(right_length)
+            rule_text.append(left.plain + " ", self.style)
+            rule_text.append(title_text)
+            rule_text.append(" " + right.plain, self.style)
+        elif self.align == "left":
+            title_text.truncate(truncate_width, overflow="ellipsis")
+            rule_text.append(title_text)
+            rule_text.append(" ")
+            rule_text.append(characters * (width - rule_text.cell_len), self.style)
+        elif self.align == "right":
+            title_text.truncate(truncate_width, overflow="ellipsis")
+            rule_text.append(characters * (width - title_text.cell_len - 1), self.style)
+            rule_text.append(" ")
+            rule_text.append(title_text)
+
+        rule_text.plain = set_cell_size(rule_text.plain, width)
+        yield rule_text
+
+    def _rule_line(self, chars_len: int, width: int) -> Text:
+        rule_text = Text(self.characters * ((width // chars_len) + 1), self.style)
+        rule_text.truncate(width)
+        rule_text.plain = set_cell_size(rule_text.plain, width)
+        return rule_text
+
+    def __rich_measure__(
+        self, console: Console, options: ConsoleOptions
+    ) -> Measurement:
+        return Measurement(1, 1)
+
+
+if __name__ == "__main__":  # pragma: no cover
+    import sys
+
+    from rich.console import Console
+
+    try:
+        text = sys.argv[1]
+    except IndexError:
+        text = "Hello, World"
+    console = Console()
+    console.print(Rule(title=text))
+
+    console = Console()
+    console.print(Rule("foo"), width=4)
diff --git a/.venv/Lib/site-packages/rich/scope.py b/.venv/Lib/site-packages/rich/scope.py
new file mode 100644 (file)
index 0000000..36c0624
--- /dev/null
@@ -0,0 +1,86 @@
+from collections.abc import Mapping
+from typing import TYPE_CHECKING, Any, Optional, Tuple
+
+from .highlighter import ReprHighlighter
+from .panel import Panel
+from .pretty import Pretty
+from .table import Table
+from .text import Text, TextType
+
+if TYPE_CHECKING:
+    from .console import ConsoleRenderable
+
+
+def render_scope(
+    scope: "Mapping[str, Any]",
+    *,
+    title: Optional[TextType] = None,
+    sort_keys: bool = True,
+    indent_guides: bool = False,
+    max_length: Optional[int] = None,
+    max_string: Optional[int] = None,
+) -> "ConsoleRenderable":
+    """Render python variables in a given scope.
+
+    Args:
+        scope (Mapping): A mapping containing variable names and values.
+        title (str, optional): Optional title. Defaults to None.
+        sort_keys (bool, optional): Enable sorting of items. Defaults to True.
+        indent_guides (bool, optional): Enable indentation guides. Defaults to False.
+        max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+            Defaults to None.
+        max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None.
+
+    Returns:
+        ConsoleRenderable: A renderable object.
+    """
+    highlighter = ReprHighlighter()
+    items_table = Table.grid(padding=(0, 1), expand=False)
+    items_table.add_column(justify="right")
+
+    def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]:
+        """Sort special variables first, then alphabetically."""
+        key, _ = item
+        return (not key.startswith("__"), key.lower())
+
+    items = sorted(scope.items(), key=sort_items) if sort_keys else scope.items()
+    for key, value in items:
+        key_text = Text.assemble(
+            (key, "scope.key.special" if key.startswith("__") else "scope.key"),
+            (" =", "scope.equals"),
+        )
+        items_table.add_row(
+            key_text,
+            Pretty(
+                value,
+                highlighter=highlighter,
+                indent_guides=indent_guides,
+                max_length=max_length,
+                max_string=max_string,
+            ),
+        )
+    return Panel.fit(
+        items_table,
+        title=title,
+        border_style="scope.border",
+        padding=(0, 1),
+    )
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich import print
+
+    print()
+
+    def test(foo: float, bar: float) -> None:
+        list_of_things = [1, 2, 3, None, 4, True, False, "Hello World"]
+        dict_of_things = {
+            "version": "1.1",
+            "method": "confirmFruitPurchase",
+            "params": [["apple", "orange", "mangoes", "pomelo"], 1.123],
+            "id": "194521489",
+        }
+        print(render_scope(locals(), title="[i]locals", sort_keys=False))
+
+    test(20.3423, 3.1427)
+    print()
diff --git a/.venv/Lib/site-packages/rich/screen.py b/.venv/Lib/site-packages/rich/screen.py
new file mode 100644 (file)
index 0000000..b4f7fd1
--- /dev/null
@@ -0,0 +1,54 @@
+from typing import Optional, TYPE_CHECKING
+
+from .segment import Segment
+from .style import StyleType
+from ._loop import loop_last
+
+
+if TYPE_CHECKING:
+    from .console import (
+        Console,
+        ConsoleOptions,
+        RenderResult,
+        RenderableType,
+        Group,
+    )
+
+
+class Screen:
+    """A renderable that fills the terminal screen and crops excess.
+
+    Args:
+        renderable (RenderableType): Child renderable.
+        style (StyleType, optional): Optional background style. Defaults to None.
+    """
+
+    renderable: "RenderableType"
+
+    def __init__(
+        self,
+        *renderables: "RenderableType",
+        style: Optional[StyleType] = None,
+        application_mode: bool = False,
+    ) -> None:
+        from rich.console import Group
+
+        self.renderable = Group(*renderables)
+        self.style = style
+        self.application_mode = application_mode
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        width, height = options.size
+        style = console.get_style(self.style) if self.style else None
+        render_options = options.update(width=width, height=height)
+        lines = console.render_lines(
+            self.renderable or "", render_options, style=style, pad=True
+        )
+        lines = Segment.set_shape(lines, width, height, style=style)
+        new_line = Segment("\n\r") if self.application_mode else Segment.line()
+        for last, line in loop_last(lines):
+            yield from line
+            if not last:
+                yield new_line
diff --git a/.venv/Lib/site-packages/rich/segment.py b/.venv/Lib/site-packages/rich/segment.py
new file mode 100644 (file)
index 0000000..edcb52d
--- /dev/null
@@ -0,0 +1,752 @@
+from enum import IntEnum
+from functools import lru_cache
+from itertools import filterfalse
+from logging import getLogger
+from operator import attrgetter
+from typing import (
+    TYPE_CHECKING,
+    Dict,
+    Iterable,
+    List,
+    NamedTuple,
+    Optional,
+    Sequence,
+    Tuple,
+    Type,
+    Union,
+)
+
+from .cells import (
+    _is_single_cell_widths,
+    cached_cell_len,
+    cell_len,
+    get_character_cell_size,
+    set_cell_size,
+)
+from .repr import Result, rich_repr
+from .style import Style
+
+if TYPE_CHECKING:
+    from .console import Console, ConsoleOptions, RenderResult
+
+log = getLogger("rich")
+
+
+class ControlType(IntEnum):
+    """Non-printable control codes which typically translate to ANSI codes."""
+
+    BELL = 1
+    CARRIAGE_RETURN = 2
+    HOME = 3
+    CLEAR = 4
+    SHOW_CURSOR = 5
+    HIDE_CURSOR = 6
+    ENABLE_ALT_SCREEN = 7
+    DISABLE_ALT_SCREEN = 8
+    CURSOR_UP = 9
+    CURSOR_DOWN = 10
+    CURSOR_FORWARD = 11
+    CURSOR_BACKWARD = 12
+    CURSOR_MOVE_TO_COLUMN = 13
+    CURSOR_MOVE_TO = 14
+    ERASE_IN_LINE = 15
+    SET_WINDOW_TITLE = 16
+
+
+ControlCode = Union[
+    Tuple[ControlType],
+    Tuple[ControlType, Union[int, str]],
+    Tuple[ControlType, int, int],
+]
+
+
+@rich_repr()
+class Segment(NamedTuple):
+    """A piece of text with associated style. Segments are produced by the Console render process and
+    are ultimately converted in to strings to be written to the terminal.
+
+    Args:
+        text (str): A piece of text.
+        style (:class:`~rich.style.Style`, optional): An optional style to apply to the text.
+        control (Tuple[ControlCode], optional): Optional sequence of control codes.
+
+    Attributes:
+        cell_length (int): The cell length of this Segment.
+    """
+
+    text: str
+    style: Optional[Style] = None
+    control: Optional[Sequence[ControlCode]] = None
+
+    @property
+    def cell_length(self) -> int:
+        """The number of terminal cells required to display self.text.
+
+        Returns:
+            int: A number of cells.
+        """
+        text, _style, control = self
+        return 0 if control else cell_len(text)
+
+    def __rich_repr__(self) -> Result:
+        yield self.text
+        if self.control is None:
+            if self.style is not None:
+                yield self.style
+        else:
+            yield self.style
+            yield self.control
+
+    def __bool__(self) -> bool:
+        """Check if the segment contains text."""
+        return bool(self.text)
+
+    @property
+    def is_control(self) -> bool:
+        """Check if the segment contains control codes."""
+        return self.control is not None
+
+    @classmethod
+    @lru_cache(1024 * 16)
+    def _split_cells(cls, segment: "Segment", cut: int) -> Tuple["Segment", "Segment"]:
+        """Split a segment in to two at a given cell position.
+
+        Note that splitting a double-width character, may result in that character turning
+        into two spaces.
+
+        Args:
+            segment (Segment): A segment to split.
+            cut (int): A cell position to cut on.
+
+        Returns:
+            A tuple of two segments.
+        """
+        text, style, control = segment
+        _Segment = Segment
+        cell_length = segment.cell_length
+        if cut >= cell_length:
+            return segment, _Segment("", style, control)
+
+        cell_size = get_character_cell_size
+
+        pos = int((cut / cell_length) * len(text))
+
+        while True:
+            before = text[:pos]
+            cell_pos = cell_len(before)
+            out_by = cell_pos - cut
+            if not out_by:
+                return (
+                    _Segment(before, style, control),
+                    _Segment(text[pos:], style, control),
+                )
+            if out_by == -1 and cell_size(text[pos]) == 2:
+                return (
+                    _Segment(text[:pos] + " ", style, control),
+                    _Segment(" " + text[pos + 1 :], style, control),
+                )
+            if out_by == +1 and cell_size(text[pos - 1]) == 2:
+                return (
+                    _Segment(text[: pos - 1] + " ", style, control),
+                    _Segment(" " + text[pos:], style, control),
+                )
+            if cell_pos < cut:
+                pos += 1
+            else:
+                pos -= 1
+
+    def split_cells(self, cut: int) -> Tuple["Segment", "Segment"]:
+        """Split segment in to two segments at the specified column.
+
+        If the cut point falls in the middle of a 2-cell wide character then it is replaced
+        by two spaces, to preserve the display width of the parent segment.
+
+        Args:
+            cut (int): Offset within the segment to cut.
+
+        Returns:
+            Tuple[Segment, Segment]: Two segments.
+        """
+        text, style, control = self
+        assert cut >= 0
+
+        if _is_single_cell_widths(text):
+            # Fast path with all 1 cell characters
+            if cut >= len(text):
+                return self, Segment("", style, control)
+            return (
+                Segment(text[:cut], style, control),
+                Segment(text[cut:], style, control),
+            )
+
+        return self._split_cells(self, cut)
+
+    @classmethod
+    def line(cls) -> "Segment":
+        """Make a new line segment."""
+        return cls("\n")
+
+    @classmethod
+    def apply_style(
+        cls,
+        segments: Iterable["Segment"],
+        style: Optional[Style] = None,
+        post_style: Optional[Style] = None,
+    ) -> Iterable["Segment"]:
+        """Apply style(s) to an iterable of segments.
+
+        Returns an iterable of segments where the style is replaced by ``style + segment.style + post_style``.
+
+        Args:
+            segments (Iterable[Segment]): Segments to process.
+            style (Style, optional): Base style. Defaults to None.
+            post_style (Style, optional): Style to apply on top of segment style. Defaults to None.
+
+        Returns:
+            Iterable[Segments]: A new iterable of segments (possibly the same iterable).
+        """
+        result_segments = segments
+        if style:
+            apply = style.__add__
+            result_segments = (
+                cls(text, None if control else apply(_style), control)
+                for text, _style, control in result_segments
+            )
+        if post_style:
+            result_segments = (
+                cls(
+                    text,
+                    (
+                        None
+                        if control
+                        else (_style + post_style if _style else post_style)
+                    ),
+                    control,
+                )
+                for text, _style, control in result_segments
+            )
+        return result_segments
+
+    @classmethod
+    def filter_control(
+        cls, segments: Iterable["Segment"], is_control: bool = False
+    ) -> Iterable["Segment"]:
+        """Filter segments by ``is_control`` attribute.
+
+        Args:
+            segments (Iterable[Segment]): An iterable of Segment instances.
+            is_control (bool, optional): is_control flag to match in search.
+
+        Returns:
+            Iterable[Segment]: And iterable of Segment instances.
+
+        """
+        if is_control:
+            return filter(attrgetter("control"), segments)
+        else:
+            return filterfalse(attrgetter("control"), segments)
+
+    @classmethod
+    def split_lines(cls, segments: Iterable["Segment"]) -> Iterable[List["Segment"]]:
+        """Split a sequence of segments in to a list of lines.
+
+        Args:
+            segments (Iterable[Segment]): Segments potentially containing line feeds.
+
+        Yields:
+            Iterable[List[Segment]]: Iterable of segment lists, one per line.
+        """
+        line: List[Segment] = []
+        append = line.append
+
+        for segment in segments:
+            if "\n" in segment.text and not segment.control:
+                text, style, _ = segment
+                while text:
+                    _text, new_line, text = text.partition("\n")
+                    if _text:
+                        append(cls(_text, style))
+                    if new_line:
+                        yield line
+                        line = []
+                        append = line.append
+            else:
+                append(segment)
+        if line:
+            yield line
+
+    @classmethod
+    def split_and_crop_lines(
+        cls,
+        segments: Iterable["Segment"],
+        length: int,
+        style: Optional[Style] = None,
+        pad: bool = True,
+        include_new_lines: bool = True,
+    ) -> Iterable[List["Segment"]]:
+        """Split segments in to lines, and crop lines greater than a given length.
+
+        Args:
+            segments (Iterable[Segment]): An iterable of segments, probably
+                generated from console.render.
+            length (int): Desired line length.
+            style (Style, optional): Style to use for any padding.
+            pad (bool): Enable padding of lines that are less than `length`.
+
+        Returns:
+            Iterable[List[Segment]]: An iterable of lines of segments.
+        """
+        line: List[Segment] = []
+        append = line.append
+
+        adjust_line_length = cls.adjust_line_length
+        new_line_segment = cls("\n")
+
+        for segment in segments:
+            if "\n" in segment.text and not segment.control:
+                text, segment_style, _ = segment
+                while text:
+                    _text, new_line, text = text.partition("\n")
+                    if _text:
+                        append(cls(_text, segment_style))
+                    if new_line:
+                        cropped_line = adjust_line_length(
+                            line, length, style=style, pad=pad
+                        )
+                        if include_new_lines:
+                            cropped_line.append(new_line_segment)
+                        yield cropped_line
+                        line.clear()
+            else:
+                append(segment)
+        if line:
+            yield adjust_line_length(line, length, style=style, pad=pad)
+
+    @classmethod
+    def adjust_line_length(
+        cls,
+        line: List["Segment"],
+        length: int,
+        style: Optional[Style] = None,
+        pad: bool = True,
+    ) -> List["Segment"]:
+        """Adjust a line to a given width (cropping or padding as required).
+
+        Args:
+            segments (Iterable[Segment]): A list of segments in a single line.
+            length (int): The desired width of the line.
+            style (Style, optional): The style of padding if used (space on the end). Defaults to None.
+            pad (bool, optional): Pad lines with spaces if they are shorter than `length`. Defaults to True.
+
+        Returns:
+            List[Segment]: A line of segments with the desired length.
+        """
+        line_length = sum(segment.cell_length for segment in line)
+        new_line: List[Segment]
+
+        if line_length < length:
+            if pad:
+                new_line = line + [cls(" " * (length - line_length), style)]
+            else:
+                new_line = line[:]
+        elif line_length > length:
+            new_line = []
+            append = new_line.append
+            line_length = 0
+            for segment in line:
+                segment_length = segment.cell_length
+                if line_length + segment_length < length or segment.control:
+                    append(segment)
+                    line_length += segment_length
+                else:
+                    text, segment_style, _ = segment
+                    text = set_cell_size(text, length - line_length)
+                    append(cls(text, segment_style))
+                    break
+        else:
+            new_line = line[:]
+        return new_line
+
+    @classmethod
+    def get_line_length(cls, line: List["Segment"]) -> int:
+        """Get the length of list of segments.
+
+        Args:
+            line (List[Segment]): A line encoded as a list of Segments (assumes no '\\\\n' characters),
+
+        Returns:
+            int: The length of the line.
+        """
+        _cell_len = cell_len
+        return sum(_cell_len(text) for text, style, control in line if not control)
+
+    @classmethod
+    def get_shape(cls, lines: List[List["Segment"]]) -> Tuple[int, int]:
+        """Get the shape (enclosing rectangle) of a list of lines.
+
+        Args:
+            lines (List[List[Segment]]): A list of lines (no '\\\\n' characters).
+
+        Returns:
+            Tuple[int, int]: Width and height in characters.
+        """
+        get_line_length = cls.get_line_length
+        max_width = max(get_line_length(line) for line in lines) if lines else 0
+        return (max_width, len(lines))
+
+    @classmethod
+    def set_shape(
+        cls,
+        lines: List[List["Segment"]],
+        width: int,
+        height: Optional[int] = None,
+        style: Optional[Style] = None,
+        new_lines: bool = False,
+    ) -> List[List["Segment"]]:
+        """Set the shape of a list of lines (enclosing rectangle).
+
+        Args:
+            lines (List[List[Segment]]): A list of lines.
+            width (int): Desired width.
+            height (int, optional): Desired height or None for no change.
+            style (Style, optional): Style of any padding added.
+            new_lines (bool, optional): Padded lines should include "\n". Defaults to False.
+
+        Returns:
+            List[List[Segment]]: New list of lines.
+        """
+        _height = height or len(lines)
+
+        blank = (
+            [cls(" " * width + "\n", style)] if new_lines else [cls(" " * width, style)]
+        )
+
+        adjust_line_length = cls.adjust_line_length
+        shaped_lines = lines[:_height]
+        shaped_lines[:] = [
+            adjust_line_length(line, width, style=style) for line in lines
+        ]
+        if len(shaped_lines) < _height:
+            shaped_lines.extend([blank] * (_height - len(shaped_lines)))
+        return shaped_lines
+
+    @classmethod
+    def align_top(
+        cls: Type["Segment"],
+        lines: List[List["Segment"]],
+        width: int,
+        height: int,
+        style: Style,
+        new_lines: bool = False,
+    ) -> List[List["Segment"]]:
+        """Aligns lines to top (adds extra lines to bottom as required).
+
+        Args:
+            lines (List[List[Segment]]): A list of lines.
+            width (int): Desired width.
+            height (int, optional): Desired height or None for no change.
+            style (Style): Style of any padding added.
+            new_lines (bool, optional): Padded lines should include "\n". Defaults to False.
+
+        Returns:
+            List[List[Segment]]: New list of lines.
+        """
+        extra_lines = height - len(lines)
+        if not extra_lines:
+            return lines[:]
+        lines = lines[:height]
+        blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style)
+        lines = lines + [[blank]] * extra_lines
+        return lines
+
+    @classmethod
+    def align_bottom(
+        cls: Type["Segment"],
+        lines: List[List["Segment"]],
+        width: int,
+        height: int,
+        style: Style,
+        new_lines: bool = False,
+    ) -> List[List["Segment"]]:
+        """Aligns render to bottom (adds extra lines above as required).
+
+        Args:
+            lines (List[List[Segment]]): A list of lines.
+            width (int): Desired width.
+            height (int, optional): Desired height or None for no change.
+            style (Style): Style of any padding added. Defaults to None.
+            new_lines (bool, optional): Padded lines should include "\n". Defaults to False.
+
+        Returns:
+            List[List[Segment]]: New list of lines.
+        """
+        extra_lines = height - len(lines)
+        if not extra_lines:
+            return lines[:]
+        lines = lines[:height]
+        blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style)
+        lines = [[blank]] * extra_lines + lines
+        return lines
+
+    @classmethod
+    def align_middle(
+        cls: Type["Segment"],
+        lines: List[List["Segment"]],
+        width: int,
+        height: int,
+        style: Style,
+        new_lines: bool = False,
+    ) -> List[List["Segment"]]:
+        """Aligns lines to middle (adds extra lines to above and below as required).
+
+        Args:
+            lines (List[List[Segment]]): A list of lines.
+            width (int): Desired width.
+            height (int, optional): Desired height or None for no change.
+            style (Style): Style of any padding added.
+            new_lines (bool, optional): Padded lines should include "\n". Defaults to False.
+
+        Returns:
+            List[List[Segment]]: New list of lines.
+        """
+        extra_lines = height - len(lines)
+        if not extra_lines:
+            return lines[:]
+        lines = lines[:height]
+        blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style)
+        top_lines = extra_lines // 2
+        bottom_lines = extra_lines - top_lines
+        lines = [[blank]] * top_lines + lines + [[blank]] * bottom_lines
+        return lines
+
+    @classmethod
+    def simplify(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]:
+        """Simplify an iterable of segments by combining contiguous segments with the same style.
+
+        Args:
+            segments (Iterable[Segment]): An iterable of segments.
+
+        Returns:
+            Iterable[Segment]: A possibly smaller iterable of segments that will render the same way.
+        """
+        iter_segments = iter(segments)
+        try:
+            last_segment = next(iter_segments)
+        except StopIteration:
+            return
+
+        _Segment = Segment
+        for segment in iter_segments:
+            if last_segment.style == segment.style and not segment.control:
+                last_segment = _Segment(
+                    last_segment.text + segment.text, last_segment.style
+                )
+            else:
+                yield last_segment
+                last_segment = segment
+        yield last_segment
+
+    @classmethod
+    def strip_links(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]:
+        """Remove all links from an iterable of styles.
+
+        Args:
+            segments (Iterable[Segment]): An iterable segments.
+
+        Yields:
+            Segment: Segments with link removed.
+        """
+        for segment in segments:
+            if segment.control or segment.style is None:
+                yield segment
+            else:
+                text, style, _control = segment
+                yield cls(text, style.update_link(None) if style else None)
+
+    @classmethod
+    def strip_styles(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]:
+        """Remove all styles from an iterable of segments.
+
+        Args:
+            segments (Iterable[Segment]): An iterable segments.
+
+        Yields:
+            Segment: Segments with styles replace with None
+        """
+        for text, _style, control in segments:
+            yield cls(text, None, control)
+
+    @classmethod
+    def remove_color(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]:
+        """Remove all color from an iterable of segments.
+
+        Args:
+            segments (Iterable[Segment]): An iterable segments.
+
+        Yields:
+            Segment: Segments with colorless style.
+        """
+
+        cache: Dict[Style, Style] = {}
+        for text, style, control in segments:
+            if style:
+                colorless_style = cache.get(style)
+                if colorless_style is None:
+                    colorless_style = style.without_color
+                    cache[style] = colorless_style
+                yield cls(text, colorless_style, control)
+            else:
+                yield cls(text, None, control)
+
+    @classmethod
+    def divide(
+        cls, segments: Iterable["Segment"], cuts: Iterable[int]
+    ) -> Iterable[List["Segment"]]:
+        """Divides an iterable of segments in to portions.
+
+        Args:
+            cuts (Iterable[int]): Cell positions where to divide.
+
+        Yields:
+            [Iterable[List[Segment]]]: An iterable of Segments in List.
+        """
+        split_segments: List["Segment"] = []
+        add_segment = split_segments.append
+
+        iter_cuts = iter(cuts)
+
+        while True:
+            cut = next(iter_cuts, -1)
+            if cut == -1:
+                return
+            if cut != 0:
+                break
+            yield []
+        pos = 0
+
+        segments_clear = split_segments.clear
+        segments_copy = split_segments.copy
+
+        _cell_len = cached_cell_len
+        for segment in segments:
+            text, _style, control = segment
+            while text:
+                end_pos = pos if control else pos + _cell_len(text)
+                if end_pos < cut:
+                    add_segment(segment)
+                    pos = end_pos
+                    break
+
+                if end_pos == cut:
+                    add_segment(segment)
+                    yield segments_copy()
+                    segments_clear()
+                    pos = end_pos
+
+                    cut = next(iter_cuts, -1)
+                    if cut == -1:
+                        if split_segments:
+                            yield segments_copy()
+                        return
+
+                    break
+
+                else:
+                    before, segment = segment.split_cells(cut - pos)
+                    text, _style, control = segment
+                    add_segment(before)
+                    yield segments_copy()
+                    segments_clear()
+                    pos = cut
+
+                cut = next(iter_cuts, -1)
+                if cut == -1:
+                    if split_segments:
+                        yield segments_copy()
+                    return
+
+        yield segments_copy()
+
+
+class Segments:
+    """A simple renderable to render an iterable of segments. This class may be useful if
+    you want to print segments outside of a __rich_console__ method.
+
+    Args:
+        segments (Iterable[Segment]): An iterable of segments.
+        new_lines (bool, optional): Add new lines between segments. Defaults to False.
+    """
+
+    def __init__(self, segments: Iterable[Segment], new_lines: bool = False) -> None:
+        self.segments = list(segments)
+        self.new_lines = new_lines
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        if self.new_lines:
+            line = Segment.line()
+            for segment in self.segments:
+                yield segment
+                yield line
+        else:
+            yield from self.segments
+
+
+class SegmentLines:
+    def __init__(self, lines: Iterable[List[Segment]], new_lines: bool = False) -> None:
+        """A simple renderable containing a number of lines of segments. May be used as an intermediate
+        in rendering process.
+
+        Args:
+            lines (Iterable[List[Segment]]): Lists of segments forming lines.
+            new_lines (bool, optional): Insert new lines after each line. Defaults to False.
+        """
+        self.lines = list(lines)
+        self.new_lines = new_lines
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        if self.new_lines:
+            new_line = Segment.line()
+            for line in self.lines:
+                yield from line
+                yield new_line
+        else:
+            for line in self.lines:
+                yield from line
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich.console import Console
+    from rich.syntax import Syntax
+    from rich.text import Text
+
+    code = """from rich.console import Console
+console = Console()
+text = Text.from_markup("Hello, [bold magenta]World[/]!")
+console.print(text)"""
+
+    text = Text.from_markup("Hello, [bold magenta]World[/]!")
+
+    console = Console()
+
+    console.rule("rich.Segment")
+    console.print(
+        "A Segment is the last step in the Rich render process before generating text with ANSI codes."
+    )
+    console.print("\nConsider the following code:\n")
+    console.print(Syntax(code, "python", line_numbers=True))
+    console.print()
+    console.print(
+        "When you call [b]print()[/b], Rich [i]renders[/i] the object in to the following:\n"
+    )
+    fragments = list(console.render(text))
+    console.print(fragments)
+    console.print()
+    console.print("The Segments are then processed to produce the following output:\n")
+    console.print(text)
+    console.print(
+        "\nYou will only need to know this if you are implementing your own Rich renderables."
+    )
diff --git a/.venv/Lib/site-packages/rich/spinner.py b/.venv/Lib/site-packages/rich/spinner.py
new file mode 100644 (file)
index 0000000..70570b6
--- /dev/null
@@ -0,0 +1,138 @@
+from typing import cast, List, Optional, TYPE_CHECKING, Union
+
+from ._spinners import SPINNERS
+from .measure import Measurement
+from .table import Table
+from .text import Text
+
+if TYPE_CHECKING:
+    from .console import Console, ConsoleOptions, RenderResult, RenderableType
+    from .style import StyleType
+
+
+class Spinner:
+    """A spinner animation.
+
+    Args:
+        name (str): Name of spinner (run python -m rich.spinner).
+        text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "".
+        style (StyleType, optional): Style for spinner animation. Defaults to None.
+        speed (float, optional): Speed factor for animation. Defaults to 1.0.
+
+    Raises:
+        KeyError: If name isn't one of the supported spinner animations.
+    """
+
+    def __init__(
+        self,
+        name: str,
+        text: "RenderableType" = "",
+        *,
+        style: Optional["StyleType"] = None,
+        speed: float = 1.0,
+    ) -> None:
+        try:
+            spinner = SPINNERS[name]
+        except KeyError:
+            raise KeyError(f"no spinner called {name!r}")
+        self.text: "Union[RenderableType, Text]" = (
+            Text.from_markup(text) if isinstance(text, str) else text
+        )
+        self.name = name
+        self.frames = cast(List[str], spinner["frames"])[:]
+        self.interval = cast(float, spinner["interval"])
+        self.start_time: Optional[float] = None
+        self.style = style
+        self.speed = speed
+        self.frame_no_offset: float = 0.0
+        self._update_speed = 0.0
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        yield self.render(console.get_time())
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> Measurement:
+        text = self.render(0)
+        return Measurement.get(console, options, text)
+
+    def render(self, time: float) -> "RenderableType":
+        """Render the spinner for a given time.
+
+        Args:
+            time (float): Time in seconds.
+
+        Returns:
+            RenderableType: A renderable containing animation frame.
+        """
+        if self.start_time is None:
+            self.start_time = time
+
+        frame_no = ((time - self.start_time) * self.speed) / (
+            self.interval / 1000.0
+        ) + self.frame_no_offset
+        frame = Text(
+            self.frames[int(frame_no) % len(self.frames)], style=self.style or ""
+        )
+
+        if self._update_speed:
+            self.frame_no_offset = frame_no
+            self.start_time = time
+            self.speed = self._update_speed
+            self._update_speed = 0.0
+
+        if not self.text:
+            return frame
+        elif isinstance(self.text, (str, Text)):
+            return Text.assemble(frame, " ", self.text)
+        else:
+            table = Table.grid(padding=1)
+            table.add_row(frame, self.text)
+            return table
+
+    def update(
+        self,
+        *,
+        text: "RenderableType" = "",
+        style: Optional["StyleType"] = None,
+        speed: Optional[float] = None,
+    ) -> None:
+        """Updates attributes of a spinner after it has been started.
+
+        Args:
+            text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "".
+            style (StyleType, optional): Style for spinner animation. Defaults to None.
+            speed (float, optional): Speed factor for animation. Defaults to None.
+        """
+        if text:
+            self.text = Text.from_markup(text) if isinstance(text, str) else text
+        if style:
+            self.style = style
+        if speed:
+            self._update_speed = speed
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from time import sleep
+
+    from .columns import Columns
+    from .panel import Panel
+    from .live import Live
+
+    all_spinners = Columns(
+        [
+            Spinner(spinner_name, text=Text(repr(spinner_name), style="green"))
+            for spinner_name in sorted(SPINNERS.keys())
+        ],
+        column_first=True,
+        expand=True,
+    )
+
+    with Live(
+        Panel(all_spinners, title="Spinners", border_style="blue"),
+        refresh_per_second=20,
+    ) as live:
+        while True:
+            sleep(0.1)
diff --git a/.venv/Lib/site-packages/rich/status.py b/.venv/Lib/site-packages/rich/status.py
new file mode 100644 (file)
index 0000000..6574483
--- /dev/null
@@ -0,0 +1,131 @@
+from types import TracebackType
+from typing import Optional, Type
+
+from .console import Console, RenderableType
+from .jupyter import JupyterMixin
+from .live import Live
+from .spinner import Spinner
+from .style import StyleType
+
+
+class Status(JupyterMixin):
+    """Displays a status indicator with a 'spinner' animation.
+
+    Args:
+        status (RenderableType): A status renderable (str or Text typically).
+        console (Console, optional): Console instance to use, or None for global console. Defaults to None.
+        spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots".
+        spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner".
+        speed (float, optional): Speed factor for spinner animation. Defaults to 1.0.
+        refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5.
+    """
+
+    def __init__(
+        self,
+        status: RenderableType,
+        *,
+        console: Optional[Console] = None,
+        spinner: str = "dots",
+        spinner_style: StyleType = "status.spinner",
+        speed: float = 1.0,
+        refresh_per_second: float = 12.5,
+    ):
+        self.status = status
+        self.spinner_style = spinner_style
+        self.speed = speed
+        self._spinner = Spinner(spinner, text=status, style=spinner_style, speed=speed)
+        self._live = Live(
+            self.renderable,
+            console=console,
+            refresh_per_second=refresh_per_second,
+            transient=True,
+        )
+
+    @property
+    def renderable(self) -> Spinner:
+        return self._spinner
+
+    @property
+    def console(self) -> "Console":
+        """Get the Console used by the Status objects."""
+        return self._live.console
+
+    def update(
+        self,
+        status: Optional[RenderableType] = None,
+        *,
+        spinner: Optional[str] = None,
+        spinner_style: Optional[StyleType] = None,
+        speed: Optional[float] = None,
+    ) -> None:
+        """Update status.
+
+        Args:
+            status (Optional[RenderableType], optional): New status renderable or None for no change. Defaults to None.
+            spinner (Optional[str], optional): New spinner or None for no change. Defaults to None.
+            spinner_style (Optional[StyleType], optional): New spinner style or None for no change. Defaults to None.
+            speed (Optional[float], optional): Speed factor for spinner animation or None for no change. Defaults to None.
+        """
+        if status is not None:
+            self.status = status
+        if spinner_style is not None:
+            self.spinner_style = spinner_style
+        if speed is not None:
+            self.speed = speed
+        if spinner is not None:
+            self._spinner = Spinner(
+                spinner, text=self.status, style=self.spinner_style, speed=self.speed
+            )
+            self._live.update(self.renderable, refresh=True)
+        else:
+            self._spinner.update(
+                text=self.status, style=self.spinner_style, speed=self.speed
+            )
+
+    def start(self) -> None:
+        """Start the status animation."""
+        self._live.start()
+
+    def stop(self) -> None:
+        """Stop the spinner animation."""
+        self._live.stop()
+
+    def __rich__(self) -> RenderableType:
+        return self.renderable
+
+    def __enter__(self) -> "Status":
+        self.start()
+        return self
+
+    def __exit__(
+        self,
+        exc_type: Optional[Type[BaseException]],
+        exc_val: Optional[BaseException],
+        exc_tb: Optional[TracebackType],
+    ) -> None:
+        self.stop()
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from time import sleep
+
+    from .console import Console
+
+    console = Console()
+    with console.status("[magenta]Covid detector booting up") as status:
+        sleep(3)
+        console.log("Importing advanced AI")
+        sleep(3)
+        console.log("Advanced Covid AI Ready")
+        sleep(3)
+        status.update(status="[bold blue] Scanning for Covid", spinner="earth")
+        sleep(3)
+        console.log("Found 10,000,000,000 copies of Covid32.exe")
+        sleep(3)
+        status.update(
+            status="[bold red]Moving Covid32.exe to Trash",
+            spinner="bouncingBall",
+            spinner_style="yellow",
+        )
+        sleep(5)
+    console.print("[bold green]Covid deleted successfully")
diff --git a/.venv/Lib/site-packages/rich/style.py b/.venv/Lib/site-packages/rich/style.py
new file mode 100644 (file)
index 0000000..835d06f
--- /dev/null
@@ -0,0 +1,796 @@
+import sys
+from functools import lru_cache
+from marshal import dumps, loads
+from random import randint
+from typing import Any, Dict, Iterable, List, Optional, Type, Union, cast
+
+from . import errors
+from .color import Color, ColorParseError, ColorSystem, blend_rgb
+from .repr import Result, rich_repr
+from .terminal_theme import DEFAULT_TERMINAL_THEME, TerminalTheme
+
+# Style instances and style definitions are often interchangeable
+StyleType = Union[str, "Style"]
+
+
+class _Bit:
+    """A descriptor to get/set a style attribute bit."""
+
+    __slots__ = ["bit"]
+
+    def __init__(self, bit_no: int) -> None:
+        self.bit = 1 << bit_no
+
+    def __get__(self, obj: "Style", objtype: Type["Style"]) -> Optional[bool]:
+        if obj._set_attributes & self.bit:
+            return obj._attributes & self.bit != 0
+        return None
+
+
+@rich_repr
+class Style:
+    """A terminal style.
+
+    A terminal style consists of a color (`color`), a background color (`bgcolor`), and a number of attributes, such
+    as bold, italic etc. The attributes have 3 states: they can either be on
+    (``True``), off (``False``), or not set (``None``).
+
+    Args:
+        color (Union[Color, str], optional): Color of terminal text. Defaults to None.
+        bgcolor (Union[Color, str], optional): Color of terminal background. Defaults to None.
+        bold (bool, optional): Enable bold text. Defaults to None.
+        dim (bool, optional): Enable dim text. Defaults to None.
+        italic (bool, optional): Enable italic text. Defaults to None.
+        underline (bool, optional): Enable underlined text. Defaults to None.
+        blink (bool, optional): Enabled blinking text. Defaults to None.
+        blink2 (bool, optional): Enable fast blinking text. Defaults to None.
+        reverse (bool, optional): Enabled reverse text. Defaults to None.
+        conceal (bool, optional): Enable concealed text. Defaults to None.
+        strike (bool, optional): Enable strikethrough text. Defaults to None.
+        underline2 (bool, optional): Enable doubly underlined text. Defaults to None.
+        frame (bool, optional): Enable framed text. Defaults to None.
+        encircle (bool, optional): Enable encircled text. Defaults to None.
+        overline (bool, optional): Enable overlined text. Defaults to None.
+        link (str, link): Link URL. Defaults to None.
+
+    """
+
+    _color: Optional[Color]
+    _bgcolor: Optional[Color]
+    _attributes: int
+    _set_attributes: int
+    _hash: Optional[int]
+    _null: bool
+    _meta: Optional[bytes]
+
+    __slots__ = [
+        "_color",
+        "_bgcolor",
+        "_attributes",
+        "_set_attributes",
+        "_link",
+        "_link_id",
+        "_ansi",
+        "_style_definition",
+        "_hash",
+        "_null",
+        "_meta",
+    ]
+
+    # maps bits on to SGR parameter
+    _style_map = {
+        0: "1",
+        1: "2",
+        2: "3",
+        3: "4",
+        4: "5",
+        5: "6",
+        6: "7",
+        7: "8",
+        8: "9",
+        9: "21",
+        10: "51",
+        11: "52",
+        12: "53",
+    }
+
+    STYLE_ATTRIBUTES = {
+        "dim": "dim",
+        "d": "dim",
+        "bold": "bold",
+        "b": "bold",
+        "italic": "italic",
+        "i": "italic",
+        "underline": "underline",
+        "u": "underline",
+        "blink": "blink",
+        "blink2": "blink2",
+        "reverse": "reverse",
+        "r": "reverse",
+        "conceal": "conceal",
+        "c": "conceal",
+        "strike": "strike",
+        "s": "strike",
+        "underline2": "underline2",
+        "uu": "underline2",
+        "frame": "frame",
+        "encircle": "encircle",
+        "overline": "overline",
+        "o": "overline",
+    }
+
+    def __init__(
+        self,
+        *,
+        color: Optional[Union[Color, str]] = None,
+        bgcolor: Optional[Union[Color, str]] = None,
+        bold: Optional[bool] = None,
+        dim: Optional[bool] = None,
+        italic: Optional[bool] = None,
+        underline: Optional[bool] = None,
+        blink: Optional[bool] = None,
+        blink2: Optional[bool] = None,
+        reverse: Optional[bool] = None,
+        conceal: Optional[bool] = None,
+        strike: Optional[bool] = None,
+        underline2: Optional[bool] = None,
+        frame: Optional[bool] = None,
+        encircle: Optional[bool] = None,
+        overline: Optional[bool] = None,
+        link: Optional[str] = None,
+        meta: Optional[Dict[str, Any]] = None,
+    ):
+        self._ansi: Optional[str] = None
+        self._style_definition: Optional[str] = None
+
+        def _make_color(color: Union[Color, str]) -> Color:
+            return color if isinstance(color, Color) else Color.parse(color)
+
+        self._color = None if color is None else _make_color(color)
+        self._bgcolor = None if bgcolor is None else _make_color(bgcolor)
+        self._set_attributes = sum(
+            (
+                bold is not None,
+                dim is not None and 2,
+                italic is not None and 4,
+                underline is not None and 8,
+                blink is not None and 16,
+                blink2 is not None and 32,
+                reverse is not None and 64,
+                conceal is not None and 128,
+                strike is not None and 256,
+                underline2 is not None and 512,
+                frame is not None and 1024,
+                encircle is not None and 2048,
+                overline is not None and 4096,
+            )
+        )
+        self._attributes = (
+            sum(
+                (
+                    bold and 1 or 0,
+                    dim and 2 or 0,
+                    italic and 4 or 0,
+                    underline and 8 or 0,
+                    blink and 16 or 0,
+                    blink2 and 32 or 0,
+                    reverse and 64 or 0,
+                    conceal and 128 or 0,
+                    strike and 256 or 0,
+                    underline2 and 512 or 0,
+                    frame and 1024 or 0,
+                    encircle and 2048 or 0,
+                    overline and 4096 or 0,
+                )
+            )
+            if self._set_attributes
+            else 0
+        )
+
+        self._link = link
+        self._meta = None if meta is None else dumps(meta)
+        self._link_id = (
+            f"{randint(0, 999999)}{hash(self._meta)}" if (link or meta) else ""
+        )
+        self._hash: Optional[int] = None
+        self._null = not (self._set_attributes or color or bgcolor or link or meta)
+
+    @classmethod
+    def null(cls) -> "Style":
+        """Create an 'null' style, equivalent to Style(), but more performant."""
+        return NULL_STYLE
+
+    @classmethod
+    def from_color(
+        cls, color: Optional[Color] = None, bgcolor: Optional[Color] = None
+    ) -> "Style":
+        """Create a new style with colors and no attributes.
+
+        Returns:
+            color (Optional[Color]): A (foreground) color, or None for no color. Defaults to None.
+            bgcolor (Optional[Color]): A (background) color, or None for no color. Defaults to None.
+        """
+        style: Style = cls.__new__(Style)
+        style._ansi = None
+        style._style_definition = None
+        style._color = color
+        style._bgcolor = bgcolor
+        style._set_attributes = 0
+        style._attributes = 0
+        style._link = None
+        style._link_id = ""
+        style._meta = None
+        style._null = not (color or bgcolor)
+        style._hash = None
+        return style
+
+    @classmethod
+    def from_meta(cls, meta: Optional[Dict[str, Any]]) -> "Style":
+        """Create a new style with meta data.
+
+        Returns:
+            meta (Optional[Dict[str, Any]]): A dictionary of meta data. Defaults to None.
+        """
+        style: Style = cls.__new__(Style)
+        style._ansi = None
+        style._style_definition = None
+        style._color = None
+        style._bgcolor = None
+        style._set_attributes = 0
+        style._attributes = 0
+        style._link = None
+        style._meta = dumps(meta)
+        style._link_id = f"{randint(0, 999999)}{hash(style._meta)}"
+        style._hash = None
+        style._null = not (meta)
+        return style
+
+    @classmethod
+    def on(cls, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Style":
+        """Create a blank style with meta information.
+
+        Example:
+            style = Style.on(click=self.on_click)
+
+        Args:
+            meta (Optional[Dict[str, Any]], optional): An optional dict of meta information.
+            **handlers (Any): Keyword arguments are translated in to handlers.
+
+        Returns:
+            Style: A Style with meta information attached.
+        """
+        meta = {} if meta is None else meta
+        meta.update({f"@{key}": value for key, value in handlers.items()})
+        return cls.from_meta(meta)
+
+    bold = _Bit(0)
+    dim = _Bit(1)
+    italic = _Bit(2)
+    underline = _Bit(3)
+    blink = _Bit(4)
+    blink2 = _Bit(5)
+    reverse = _Bit(6)
+    conceal = _Bit(7)
+    strike = _Bit(8)
+    underline2 = _Bit(9)
+    frame = _Bit(10)
+    encircle = _Bit(11)
+    overline = _Bit(12)
+
+    @property
+    def link_id(self) -> str:
+        """Get a link id, used in ansi code for links."""
+        return self._link_id
+
+    def __str__(self) -> str:
+        """Re-generate style definition from attributes."""
+        if self._style_definition is None:
+            attributes: List[str] = []
+            append = attributes.append
+            bits = self._set_attributes
+            if bits & 0b0000000001111:
+                if bits & 1:
+                    append("bold" if self.bold else "not bold")
+                if bits & (1 << 1):
+                    append("dim" if self.dim else "not dim")
+                if bits & (1 << 2):
+                    append("italic" if self.italic else "not italic")
+                if bits & (1 << 3):
+                    append("underline" if self.underline else "not underline")
+            if bits & 0b0000111110000:
+                if bits & (1 << 4):
+                    append("blink" if self.blink else "not blink")
+                if bits & (1 << 5):
+                    append("blink2" if self.blink2 else "not blink2")
+                if bits & (1 << 6):
+                    append("reverse" if self.reverse else "not reverse")
+                if bits & (1 << 7):
+                    append("conceal" if self.conceal else "not conceal")
+                if bits & (1 << 8):
+                    append("strike" if self.strike else "not strike")
+            if bits & 0b1111000000000:
+                if bits & (1 << 9):
+                    append("underline2" if self.underline2 else "not underline2")
+                if bits & (1 << 10):
+                    append("frame" if self.frame else "not frame")
+                if bits & (1 << 11):
+                    append("encircle" if self.encircle else "not encircle")
+                if bits & (1 << 12):
+                    append("overline" if self.overline else "not overline")
+            if self._color is not None:
+                append(self._color.name)
+            if self._bgcolor is not None:
+                append("on")
+                append(self._bgcolor.name)
+            if self._link:
+                append("link")
+                append(self._link)
+            self._style_definition = " ".join(attributes) or "none"
+        return self._style_definition
+
+    def __bool__(self) -> bool:
+        """A Style is false if it has no attributes, colors, or links."""
+        return not self._null
+
+    def _make_ansi_codes(self, color_system: ColorSystem) -> str:
+        """Generate ANSI codes for this style.
+
+        Args:
+            color_system (ColorSystem): Color system.
+
+        Returns:
+            str: String containing codes.
+        """
+
+        if self._ansi is None:
+            sgr: List[str] = []
+            append = sgr.append
+            _style_map = self._style_map
+            attributes = self._attributes & self._set_attributes
+            if attributes:
+                if attributes & 1:
+                    append(_style_map[0])
+                if attributes & 2:
+                    append(_style_map[1])
+                if attributes & 4:
+                    append(_style_map[2])
+                if attributes & 8:
+                    append(_style_map[3])
+                if attributes & 0b0000111110000:
+                    for bit in range(4, 9):
+                        if attributes & (1 << bit):
+                            append(_style_map[bit])
+                if attributes & 0b1111000000000:
+                    for bit in range(9, 13):
+                        if attributes & (1 << bit):
+                            append(_style_map[bit])
+            if self._color is not None:
+                sgr.extend(self._color.downgrade(color_system).get_ansi_codes())
+            if self._bgcolor is not None:
+                sgr.extend(
+                    self._bgcolor.downgrade(color_system).get_ansi_codes(
+                        foreground=False
+                    )
+                )
+            self._ansi = ";".join(sgr)
+        return self._ansi
+
+    @classmethod
+    @lru_cache(maxsize=1024)
+    def normalize(cls, style: str) -> str:
+        """Normalize a style definition so that styles with the same effect have the same string
+        representation.
+
+        Args:
+            style (str): A style definition.
+
+        Returns:
+            str: Normal form of style definition.
+        """
+        try:
+            return str(cls.parse(style))
+        except errors.StyleSyntaxError:
+            return style.strip().lower()
+
+    @classmethod
+    def pick_first(cls, *values: Optional[StyleType]) -> StyleType:
+        """Pick first non-None style."""
+        for value in values:
+            if value is not None:
+                return value
+        raise ValueError("expected at least one non-None style")
+
+    def __rich_repr__(self) -> Result:
+        yield "color", self.color, None
+        yield "bgcolor", self.bgcolor, None
+        yield "bold", self.bold, None,
+        yield "dim", self.dim, None,
+        yield "italic", self.italic, None
+        yield "underline", self.underline, None,
+        yield "blink", self.blink, None
+        yield "blink2", self.blink2, None
+        yield "reverse", self.reverse, None
+        yield "conceal", self.conceal, None
+        yield "strike", self.strike, None
+        yield "underline2", self.underline2, None
+        yield "frame", self.frame, None
+        yield "encircle", self.encircle, None
+        yield "link", self.link, None
+        if self._meta:
+            yield "meta", self.meta
+
+    def __eq__(self, other: Any) -> bool:
+        if not isinstance(other, Style):
+            return NotImplemented
+        return self.__hash__() == other.__hash__()
+
+    def __ne__(self, other: Any) -> bool:
+        if not isinstance(other, Style):
+            return NotImplemented
+        return self.__hash__() != other.__hash__()
+
+    def __hash__(self) -> int:
+        if self._hash is not None:
+            return self._hash
+        self._hash = hash(
+            (
+                self._color,
+                self._bgcolor,
+                self._attributes,
+                self._set_attributes,
+                self._link,
+                self._meta,
+            )
+        )
+        return self._hash
+
+    @property
+    def color(self) -> Optional[Color]:
+        """The foreground color or None if it is not set."""
+        return self._color
+
+    @property
+    def bgcolor(self) -> Optional[Color]:
+        """The background color or None if it is not set."""
+        return self._bgcolor
+
+    @property
+    def link(self) -> Optional[str]:
+        """Link text, if set."""
+        return self._link
+
+    @property
+    def transparent_background(self) -> bool:
+        """Check if the style specified a transparent background."""
+        return self.bgcolor is None or self.bgcolor.is_default
+
+    @property
+    def background_style(self) -> "Style":
+        """A Style with background only."""
+        return Style(bgcolor=self.bgcolor)
+
+    @property
+    def meta(self) -> Dict[str, Any]:
+        """Get meta information (can not be changed after construction)."""
+        return {} if self._meta is None else cast(Dict[str, Any], loads(self._meta))
+
+    @property
+    def without_color(self) -> "Style":
+        """Get a copy of the style with color removed."""
+        if self._null:
+            return NULL_STYLE
+        style: Style = self.__new__(Style)
+        style._ansi = None
+        style._style_definition = None
+        style._color = None
+        style._bgcolor = None
+        style._attributes = self._attributes
+        style._set_attributes = self._set_attributes
+        style._link = self._link
+        style._link_id = f"{randint(0, 999999)}" if self._link else ""
+        style._null = False
+        style._meta = None
+        style._hash = None
+        return style
+
+    @classmethod
+    @lru_cache(maxsize=4096)
+    def parse(cls, style_definition: str) -> "Style":
+        """Parse a style definition.
+
+        Args:
+            style_definition (str): A string containing a style.
+
+        Raises:
+            errors.StyleSyntaxError: If the style definition syntax is invalid.
+
+        Returns:
+            `Style`: A Style instance.
+        """
+        if style_definition.strip() == "none" or not style_definition:
+            return cls.null()
+
+        STYLE_ATTRIBUTES = cls.STYLE_ATTRIBUTES
+        color: Optional[str] = None
+        bgcolor: Optional[str] = None
+        attributes: Dict[str, Optional[Any]] = {}
+        link: Optional[str] = None
+
+        words = iter(style_definition.split())
+        for original_word in words:
+            word = original_word.lower()
+            if word == "on":
+                word = next(words, "")
+                if not word:
+                    raise errors.StyleSyntaxError("color expected after 'on'")
+                try:
+                    Color.parse(word)
+                except ColorParseError as error:
+                    raise errors.StyleSyntaxError(
+                        f"unable to parse {word!r} as background color; {error}"
+                    ) from None
+                bgcolor = word
+
+            elif word == "not":
+                word = next(words, "")
+                attribute = STYLE_ATTRIBUTES.get(word)
+                if attribute is None:
+                    raise errors.StyleSyntaxError(
+                        f"expected style attribute after 'not', found {word!r}"
+                    )
+                attributes[attribute] = False
+
+            elif word == "link":
+                word = next(words, "")
+                if not word:
+                    raise errors.StyleSyntaxError("URL expected after 'link'")
+                link = word
+
+            elif word in STYLE_ATTRIBUTES:
+                attributes[STYLE_ATTRIBUTES[word]] = True
+
+            else:
+                try:
+                    Color.parse(word)
+                except ColorParseError as error:
+                    raise errors.StyleSyntaxError(
+                        f"unable to parse {word!r} as color; {error}"
+                    ) from None
+                color = word
+        style = Style(color=color, bgcolor=bgcolor, link=link, **attributes)
+        return style
+
+    @lru_cache(maxsize=1024)
+    def get_html_style(self, theme: Optional[TerminalTheme] = None) -> str:
+        """Get a CSS style rule."""
+        theme = theme or DEFAULT_TERMINAL_THEME
+        css: List[str] = []
+        append = css.append
+
+        color = self.color
+        bgcolor = self.bgcolor
+        if self.reverse:
+            color, bgcolor = bgcolor, color
+        if self.dim:
+            foreground_color = (
+                theme.foreground_color if color is None else color.get_truecolor(theme)
+            )
+            color = Color.from_triplet(
+                blend_rgb(foreground_color, theme.background_color, 0.5)
+            )
+        if color is not None:
+            theme_color = color.get_truecolor(theme)
+            append(f"color: {theme_color.hex}")
+            append(f"text-decoration-color: {theme_color.hex}")
+        if bgcolor is not None:
+            theme_color = bgcolor.get_truecolor(theme, foreground=False)
+            append(f"background-color: {theme_color.hex}")
+        if self.bold:
+            append("font-weight: bold")
+        if self.italic:
+            append("font-style: italic")
+        if self.underline:
+            append("text-decoration: underline")
+        if self.strike:
+            append("text-decoration: line-through")
+        if self.overline:
+            append("text-decoration: overline")
+        return "; ".join(css)
+
+    @classmethod
+    def combine(cls, styles: Iterable["Style"]) -> "Style":
+        """Combine styles and get result.
+
+        Args:
+            styles (Iterable[Style]): Styles to combine.
+
+        Returns:
+            Style: A new style instance.
+        """
+        iter_styles = iter(styles)
+        return sum(iter_styles, next(iter_styles))
+
+    @classmethod
+    def chain(cls, *styles: "Style") -> "Style":
+        """Combine styles from positional argument in to a single style.
+
+        Args:
+            *styles (Iterable[Style]): Styles to combine.
+
+        Returns:
+            Style: A new style instance.
+        """
+        iter_styles = iter(styles)
+        return sum(iter_styles, next(iter_styles))
+
+    def copy(self) -> "Style":
+        """Get a copy of this style.
+
+        Returns:
+            Style: A new Style instance with identical attributes.
+        """
+        if self._null:
+            return NULL_STYLE
+        style: Style = self.__new__(Style)
+        style._ansi = self._ansi
+        style._style_definition = self._style_definition
+        style._color = self._color
+        style._bgcolor = self._bgcolor
+        style._attributes = self._attributes
+        style._set_attributes = self._set_attributes
+        style._link = self._link
+        style._link_id = f"{randint(0, 999999)}" if self._link else ""
+        style._hash = self._hash
+        style._null = False
+        style._meta = self._meta
+        return style
+
+    @lru_cache(maxsize=128)
+    def clear_meta_and_links(self) -> "Style":
+        """Get a copy of this style with link and meta information removed.
+
+        Returns:
+            Style: New style object.
+        """
+        if self._null:
+            return NULL_STYLE
+        style: Style = self.__new__(Style)
+        style._ansi = self._ansi
+        style._style_definition = self._style_definition
+        style._color = self._color
+        style._bgcolor = self._bgcolor
+        style._attributes = self._attributes
+        style._set_attributes = self._set_attributes
+        style._link = None
+        style._link_id = ""
+        style._hash = None
+        style._null = False
+        style._meta = None
+        return style
+
+    def update_link(self, link: Optional[str] = None) -> "Style":
+        """Get a copy with a different value for link.
+
+        Args:
+            link (str, optional): New value for link. Defaults to None.
+
+        Returns:
+            Style: A new Style instance.
+        """
+        style: Style = self.__new__(Style)
+        style._ansi = self._ansi
+        style._style_definition = self._style_definition
+        style._color = self._color
+        style._bgcolor = self._bgcolor
+        style._attributes = self._attributes
+        style._set_attributes = self._set_attributes
+        style._link = link
+        style._link_id = f"{randint(0, 999999)}" if link else ""
+        style._hash = None
+        style._null = False
+        style._meta = self._meta
+        return style
+
+    def render(
+        self,
+        text: str = "",
+        *,
+        color_system: Optional[ColorSystem] = ColorSystem.TRUECOLOR,
+        legacy_windows: bool = False,
+    ) -> str:
+        """Render the ANSI codes for the style.
+
+        Args:
+            text (str, optional): A string to style. Defaults to "".
+            color_system (Optional[ColorSystem], optional): Color system to render to. Defaults to ColorSystem.TRUECOLOR.
+
+        Returns:
+            str: A string containing ANSI style codes.
+        """
+        if not text or color_system is None:
+            return text
+        attrs = self._ansi or self._make_ansi_codes(color_system)
+        rendered = f"\x1b[{attrs}m{text}\x1b[0m" if attrs else text
+        if self._link and not legacy_windows:
+            rendered = (
+                f"\x1b]8;id={self._link_id};{self._link}\x1b\\{rendered}\x1b]8;;\x1b\\"
+            )
+        return rendered
+
+    def test(self, text: Optional[str] = None) -> None:
+        """Write text with style directly to terminal.
+
+        This method is for testing purposes only.
+
+        Args:
+            text (Optional[str], optional): Text to style or None for style name.
+
+        """
+        text = text or str(self)
+        sys.stdout.write(f"{self.render(text)}\n")
+
+    @lru_cache(maxsize=1024)
+    def _add(self, style: Optional["Style"]) -> "Style":
+        if style is None or style._null:
+            return self
+        if self._null:
+            return style
+        new_style: Style = self.__new__(Style)
+        new_style._ansi = None
+        new_style._style_definition = None
+        new_style._color = style._color or self._color
+        new_style._bgcolor = style._bgcolor or self._bgcolor
+        new_style._attributes = (self._attributes & ~style._set_attributes) | (
+            style._attributes & style._set_attributes
+        )
+        new_style._set_attributes = self._set_attributes | style._set_attributes
+        new_style._link = style._link or self._link
+        new_style._link_id = style._link_id or self._link_id
+        new_style._null = style._null
+        if self._meta and style._meta:
+            new_style._meta = dumps({**self.meta, **style.meta})
+        else:
+            new_style._meta = self._meta or style._meta
+        new_style._hash = None
+        return new_style
+
+    def __add__(self, style: Optional["Style"]) -> "Style":
+        combined_style = self._add(style)
+        return combined_style.copy() if combined_style.link else combined_style
+
+
+NULL_STYLE = Style()
+
+
+class StyleStack:
+    """A stack of styles."""
+
+    __slots__ = ["_stack"]
+
+    def __init__(self, default_style: "Style") -> None:
+        self._stack: List[Style] = [default_style]
+
+    def __repr__(self) -> str:
+        return f"<stylestack {self._stack!r}>"
+
+    @property
+    def current(self) -> Style:
+        """Get the Style at the top of the stack."""
+        return self._stack[-1]
+
+    def push(self, style: Style) -> None:
+        """Push a new style on to the stack.
+
+        Args:
+            style (Style): New style to combine with current style.
+        """
+        self._stack.append(self._stack[-1] + style)
+
+    def pop(self) -> Style:
+        """Pop last style and discard.
+
+        Returns:
+            Style: New current style (also available as stack.current)
+        """
+        self._stack.pop()
+        return self._stack[-1]
diff --git a/.venv/Lib/site-packages/rich/styled.py b/.venv/Lib/site-packages/rich/styled.py
new file mode 100644 (file)
index 0000000..27243be
--- /dev/null
@@ -0,0 +1,42 @@
+from typing import TYPE_CHECKING
+
+from .measure import Measurement
+from .segment import Segment
+from .style import StyleType
+
+if TYPE_CHECKING:
+    from .console import Console, ConsoleOptions, RenderResult, RenderableType
+
+
+class Styled:
+    """Apply a style to a renderable.
+
+    Args:
+        renderable (RenderableType): Any renderable.
+        style (StyleType): A style to apply across the entire renderable.
+    """
+
+    def __init__(self, renderable: "RenderableType", style: "StyleType") -> None:
+        self.renderable = renderable
+        self.style = style
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        style = console.get_style(self.style)
+        rendered_segments = console.render(self.renderable, options)
+        segments = Segment.apply_style(rendered_segments, style)
+        return segments
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> Measurement:
+        return Measurement.get(console, options, self.renderable)
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich import print
+    from rich.panel import Panel
+
+    panel = Styled(Panel("hello"), "on blue")
+    print(panel)
diff --git a/.venv/Lib/site-packages/rich/syntax.py b/.venv/Lib/site-packages/rich/syntax.py
new file mode 100644 (file)
index 0000000..cff8fd2
--- /dev/null
@@ -0,0 +1,966 @@
+import os.path
+import re
+import sys
+import textwrap
+from abc import ABC, abstractmethod
+from pathlib import Path
+from typing import (
+    Any,
+    Dict,
+    Iterable,
+    List,
+    NamedTuple,
+    Optional,
+    Sequence,
+    Set,
+    Tuple,
+    Type,
+    Union,
+)
+
+from pygments.lexer import Lexer
+from pygments.lexers import get_lexer_by_name, guess_lexer_for_filename
+from pygments.style import Style as PygmentsStyle
+from pygments.styles import get_style_by_name
+from pygments.token import (
+    Comment,
+    Error,
+    Generic,
+    Keyword,
+    Name,
+    Number,
+    Operator,
+    String,
+    Token,
+    Whitespace,
+)
+from pygments.util import ClassNotFound
+
+from rich.containers import Lines
+from rich.padding import Padding, PaddingDimensions
+
+from ._loop import loop_first
+from .cells import cell_len
+from .color import Color, blend_rgb
+from .console import Console, ConsoleOptions, JustifyMethod, RenderResult
+from .jupyter import JupyterMixin
+from .measure import Measurement
+from .segment import Segment, Segments
+from .style import Style, StyleType
+from .text import Text
+
+TokenType = Tuple[str, ...]
+
+WINDOWS = sys.platform == "win32"
+DEFAULT_THEME = "monokai"
+
+# The following styles are based on https://github.com/pygments/pygments/blob/master/pygments/formatters/terminal.py
+# A few modifications were made
+
+ANSI_LIGHT: Dict[TokenType, Style] = {
+    Token: Style(),
+    Whitespace: Style(color="white"),
+    Comment: Style(dim=True),
+    Comment.Preproc: Style(color="cyan"),
+    Keyword: Style(color="blue"),
+    Keyword.Type: Style(color="cyan"),
+    Operator.Word: Style(color="magenta"),
+    Name.Builtin: Style(color="cyan"),
+    Name.Function: Style(color="green"),
+    Name.Namespace: Style(color="cyan", underline=True),
+    Name.Class: Style(color="green", underline=True),
+    Name.Exception: Style(color="cyan"),
+    Name.Decorator: Style(color="magenta", bold=True),
+    Name.Variable: Style(color="red"),
+    Name.Constant: Style(color="red"),
+    Name.Attribute: Style(color="cyan"),
+    Name.Tag: Style(color="bright_blue"),
+    String: Style(color="yellow"),
+    Number: Style(color="blue"),
+    Generic.Deleted: Style(color="bright_red"),
+    Generic.Inserted: Style(color="green"),
+    Generic.Heading: Style(bold=True),
+    Generic.Subheading: Style(color="magenta", bold=True),
+    Generic.Prompt: Style(bold=True),
+    Generic.Error: Style(color="bright_red"),
+    Error: Style(color="red", underline=True),
+}
+
+ANSI_DARK: Dict[TokenType, Style] = {
+    Token: Style(),
+    Whitespace: Style(color="bright_black"),
+    Comment: Style(dim=True),
+    Comment.Preproc: Style(color="bright_cyan"),
+    Keyword: Style(color="bright_blue"),
+    Keyword.Type: Style(color="bright_cyan"),
+    Operator.Word: Style(color="bright_magenta"),
+    Name.Builtin: Style(color="bright_cyan"),
+    Name.Function: Style(color="bright_green"),
+    Name.Namespace: Style(color="bright_cyan", underline=True),
+    Name.Class: Style(color="bright_green", underline=True),
+    Name.Exception: Style(color="bright_cyan"),
+    Name.Decorator: Style(color="bright_magenta", bold=True),
+    Name.Variable: Style(color="bright_red"),
+    Name.Constant: Style(color="bright_red"),
+    Name.Attribute: Style(color="bright_cyan"),
+    Name.Tag: Style(color="bright_blue"),
+    String: Style(color="yellow"),
+    Number: Style(color="bright_blue"),
+    Generic.Deleted: Style(color="bright_red"),
+    Generic.Inserted: Style(color="bright_green"),
+    Generic.Heading: Style(bold=True),
+    Generic.Subheading: Style(color="bright_magenta", bold=True),
+    Generic.Prompt: Style(bold=True),
+    Generic.Error: Style(color="bright_red"),
+    Error: Style(color="red", underline=True),
+}
+
+RICH_SYNTAX_THEMES = {"ansi_light": ANSI_LIGHT, "ansi_dark": ANSI_DARK}
+NUMBERS_COLUMN_DEFAULT_PADDING = 2
+
+
+class SyntaxTheme(ABC):
+    """Base class for a syntax theme."""
+
+    @abstractmethod
+    def get_style_for_token(self, token_type: TokenType) -> Style:
+        """Get a style for a given Pygments token."""
+        raise NotImplementedError  # pragma: no cover
+
+    @abstractmethod
+    def get_background_style(self) -> Style:
+        """Get the background color."""
+        raise NotImplementedError  # pragma: no cover
+
+
+class PygmentsSyntaxTheme(SyntaxTheme):
+    """Syntax theme that delegates to Pygments theme."""
+
+    def __init__(self, theme: Union[str, Type[PygmentsStyle]]) -> None:
+        self._style_cache: Dict[TokenType, Style] = {}
+        if isinstance(theme, str):
+            try:
+                self._pygments_style_class = get_style_by_name(theme)
+            except ClassNotFound:
+                self._pygments_style_class = get_style_by_name("default")
+        else:
+            self._pygments_style_class = theme
+
+        self._background_color = self._pygments_style_class.background_color
+        self._background_style = Style(bgcolor=self._background_color)
+
+    def get_style_for_token(self, token_type: TokenType) -> Style:
+        """Get a style from a Pygments class."""
+        try:
+            return self._style_cache[token_type]
+        except KeyError:
+            try:
+                pygments_style = self._pygments_style_class.style_for_token(token_type)
+            except KeyError:
+                style = Style.null()
+            else:
+                color = pygments_style["color"]
+                bgcolor = pygments_style["bgcolor"]
+                style = Style(
+                    color="#" + color if color else "#000000",
+                    bgcolor="#" + bgcolor if bgcolor else self._background_color,
+                    bold=pygments_style["bold"],
+                    italic=pygments_style["italic"],
+                    underline=pygments_style["underline"],
+                )
+            self._style_cache[token_type] = style
+        return style
+
+    def get_background_style(self) -> Style:
+        return self._background_style
+
+
+class ANSISyntaxTheme(SyntaxTheme):
+    """Syntax theme to use standard colors."""
+
+    def __init__(self, style_map: Dict[TokenType, Style]) -> None:
+        self.style_map = style_map
+        self._missing_style = Style.null()
+        self._background_style = Style.null()
+        self._style_cache: Dict[TokenType, Style] = {}
+
+    def get_style_for_token(self, token_type: TokenType) -> Style:
+        """Look up style in the style map."""
+        try:
+            return self._style_cache[token_type]
+        except KeyError:
+            # Styles form a hierarchy
+            # We need to go from most to least specific
+            # e.g. ("foo", "bar", "baz") to ("foo", "bar")  to ("foo",)
+            get_style = self.style_map.get
+            token = tuple(token_type)
+            style = self._missing_style
+            while token:
+                _style = get_style(token)
+                if _style is not None:
+                    style = _style
+                    break
+                token = token[:-1]
+            self._style_cache[token_type] = style
+            return style
+
+    def get_background_style(self) -> Style:
+        return self._background_style
+
+
+SyntaxPosition = Tuple[int, int]
+
+
+class _SyntaxHighlightRange(NamedTuple):
+    """
+    A range to highlight in a Syntax object.
+    `start` and `end` are 2-integers tuples, where the first integer is the line number
+    (starting from 1) and the second integer is the column index (starting from 0).
+    """
+
+    style: StyleType
+    start: SyntaxPosition
+    end: SyntaxPosition
+    style_before: bool = False
+
+
+class Syntax(JupyterMixin):
+    """Construct a Syntax object to render syntax highlighted code.
+
+    Args:
+        code (str): Code to highlight.
+        lexer (Lexer | str): Lexer to use (see https://pygments.org/docs/lexers/)
+        theme (str, optional): Color theme, aka Pygments style (see https://pygments.org/docs/styles/#getting-a-list-of-available-styles). Defaults to "monokai".
+        dedent (bool, optional): Enable stripping of initial whitespace. Defaults to False.
+        line_numbers (bool, optional): Enable rendering of line numbers. Defaults to False.
+        start_line (int, optional): Starting number for line numbers. Defaults to 1.
+        line_range (Tuple[int | None, int | None], optional): If given should be a tuple of the start and end line to render.
+            A value of None in the tuple indicates the range is open in that direction.
+        highlight_lines (Set[int]): A set of line numbers to highlight.
+        code_width: Width of code to render (not including line numbers), or ``None`` to use all available width.
+        tab_size (int, optional): Size of tabs. Defaults to 4.
+        word_wrap (bool, optional): Enable word wrapping.
+        background_color (str, optional): Optional background color, or None to use theme color. Defaults to None.
+        indent_guides (bool, optional): Show indent guides. Defaults to False.
+        padding (PaddingDimensions): Padding to apply around the syntax. Defaults to 0 (no padding).
+    """
+
+    _pygments_style_class: Type[PygmentsStyle]
+    _theme: SyntaxTheme
+
+    @classmethod
+    def get_theme(cls, name: Union[str, SyntaxTheme]) -> SyntaxTheme:
+        """Get a syntax theme instance."""
+        if isinstance(name, SyntaxTheme):
+            return name
+        theme: SyntaxTheme
+        if name in RICH_SYNTAX_THEMES:
+            theme = ANSISyntaxTheme(RICH_SYNTAX_THEMES[name])
+        else:
+            theme = PygmentsSyntaxTheme(name)
+        return theme
+
+    def __init__(
+        self,
+        code: str,
+        lexer: Union[Lexer, str],
+        *,
+        theme: Union[str, SyntaxTheme] = DEFAULT_THEME,
+        dedent: bool = False,
+        line_numbers: bool = False,
+        start_line: int = 1,
+        line_range: Optional[Tuple[Optional[int], Optional[int]]] = None,
+        highlight_lines: Optional[Set[int]] = None,
+        code_width: Optional[int] = None,
+        tab_size: int = 4,
+        word_wrap: bool = False,
+        background_color: Optional[str] = None,
+        indent_guides: bool = False,
+        padding: PaddingDimensions = 0,
+    ) -> None:
+        self.code = code
+        self._lexer = lexer
+        self.dedent = dedent
+        self.line_numbers = line_numbers
+        self.start_line = start_line
+        self.line_range = line_range
+        self.highlight_lines = highlight_lines or set()
+        self.code_width = code_width
+        self.tab_size = tab_size
+        self.word_wrap = word_wrap
+        self.background_color = background_color
+        self.background_style = (
+            Style(bgcolor=background_color) if background_color else Style()
+        )
+        self.indent_guides = indent_guides
+        self.padding = padding
+
+        self._theme = self.get_theme(theme)
+        self._stylized_ranges: List[_SyntaxHighlightRange] = []
+
+    @classmethod
+    def from_path(
+        cls,
+        path: str,
+        encoding: str = "utf-8",
+        lexer: Optional[Union[Lexer, str]] = None,
+        theme: Union[str, SyntaxTheme] = DEFAULT_THEME,
+        dedent: bool = False,
+        line_numbers: bool = False,
+        line_range: Optional[Tuple[int, int]] = None,
+        start_line: int = 1,
+        highlight_lines: Optional[Set[int]] = None,
+        code_width: Optional[int] = None,
+        tab_size: int = 4,
+        word_wrap: bool = False,
+        background_color: Optional[str] = None,
+        indent_guides: bool = False,
+        padding: PaddingDimensions = 0,
+    ) -> "Syntax":
+        """Construct a Syntax object from a file.
+
+        Args:
+            path (str): Path to file to highlight.
+            encoding (str): Encoding of file.
+            lexer (str | Lexer, optional): Lexer to use. If None, lexer will be auto-detected from path/file content.
+            theme (str, optional): Color theme, aka Pygments style (see https://pygments.org/docs/styles/#getting-a-list-of-available-styles). Defaults to "emacs".
+            dedent (bool, optional): Enable stripping of initial whitespace. Defaults to True.
+            line_numbers (bool, optional): Enable rendering of line numbers. Defaults to False.
+            start_line (int, optional): Starting number for line numbers. Defaults to 1.
+            line_range (Tuple[int, int], optional): If given should be a tuple of the start and end line to render.
+            highlight_lines (Set[int]): A set of line numbers to highlight.
+            code_width: Width of code to render (not including line numbers), or ``None`` to use all available width.
+            tab_size (int, optional): Size of tabs. Defaults to 4.
+            word_wrap (bool, optional): Enable word wrapping of code.
+            background_color (str, optional): Optional background color, or None to use theme color. Defaults to None.
+            indent_guides (bool, optional): Show indent guides. Defaults to False.
+            padding (PaddingDimensions): Padding to apply around the syntax. Defaults to 0 (no padding).
+
+        Returns:
+            [Syntax]: A Syntax object that may be printed to the console
+        """
+        code = Path(path).read_text(encoding=encoding)
+
+        if not lexer:
+            lexer = cls.guess_lexer(path, code=code)
+
+        return cls(
+            code,
+            lexer,
+            theme=theme,
+            dedent=dedent,
+            line_numbers=line_numbers,
+            line_range=line_range,
+            start_line=start_line,
+            highlight_lines=highlight_lines,
+            code_width=code_width,
+            tab_size=tab_size,
+            word_wrap=word_wrap,
+            background_color=background_color,
+            indent_guides=indent_guides,
+            padding=padding,
+        )
+
+    @classmethod
+    def guess_lexer(cls, path: str, code: Optional[str] = None) -> str:
+        """Guess the alias of the Pygments lexer to use based on a path and an optional string of code.
+        If code is supplied, it will use a combination of the code and the filename to determine the
+        best lexer to use. For example, if the file is ``index.html`` and the file contains Django
+        templating syntax, then "html+django" will be returned. If the file is ``index.html``, and no
+        templating language is used, the "html" lexer will be used. If no string of code
+        is supplied, the lexer will be chosen based on the file extension..
+
+        Args:
+             path (AnyStr): The path to the file containing the code you wish to know the lexer for.
+             code (str, optional): Optional string of code that will be used as a fallback if no lexer
+                is found for the supplied path.
+
+        Returns:
+            str: The name of the Pygments lexer that best matches the supplied path/code.
+        """
+        lexer: Optional[Lexer] = None
+        lexer_name = "default"
+        if code:
+            try:
+                lexer = guess_lexer_for_filename(path, code)
+            except ClassNotFound:
+                pass
+
+        if not lexer:
+            try:
+                _, ext = os.path.splitext(path)
+                if ext:
+                    extension = ext.lstrip(".").lower()
+                    lexer = get_lexer_by_name(extension)
+            except ClassNotFound:
+                pass
+
+        if lexer:
+            if lexer.aliases:
+                lexer_name = lexer.aliases[0]
+            else:
+                lexer_name = lexer.name
+
+        return lexer_name
+
+    def _get_base_style(self) -> Style:
+        """Get the base style."""
+        default_style = self._theme.get_background_style() + self.background_style
+        return default_style
+
+    def _get_token_color(self, token_type: TokenType) -> Optional[Color]:
+        """Get a color (if any) for the given token.
+
+        Args:
+            token_type (TokenType): A token type tuple from Pygments.
+
+        Returns:
+            Optional[Color]: Color from theme, or None for no color.
+        """
+        style = self._theme.get_style_for_token(token_type)
+        return style.color
+
+    @property
+    def lexer(self) -> Optional[Lexer]:
+        """The lexer for this syntax, or None if no lexer was found.
+
+        Tries to find the lexer by name if a string was passed to the constructor.
+        """
+
+        if isinstance(self._lexer, Lexer):
+            return self._lexer
+        try:
+            return get_lexer_by_name(
+                self._lexer,
+                stripnl=False,
+                ensurenl=True,
+                tabsize=self.tab_size,
+            )
+        except ClassNotFound:
+            return None
+
+    @property
+    def default_lexer(self) -> Lexer:
+        """A Pygments Lexer to use if one is not specified or invalid."""
+        return get_lexer_by_name(
+            "text",
+            stripnl=False,
+            ensurenl=True,
+            tabsize=self.tab_size,
+        )
+
+    def highlight(
+        self,
+        code: str,
+        line_range: Optional[Tuple[Optional[int], Optional[int]]] = None,
+    ) -> Text:
+        """Highlight code and return a Text instance.
+
+        Args:
+            code (str): Code to highlight.
+            line_range(Tuple[int, int], optional): Optional line range to highlight.
+
+        Returns:
+            Text: A text instance containing highlighted syntax.
+        """
+
+        base_style = self._get_base_style()
+        justify: JustifyMethod = (
+            "default" if base_style.transparent_background else "left"
+        )
+
+        text = Text(
+            justify=justify,
+            style=base_style,
+            tab_size=self.tab_size,
+            no_wrap=not self.word_wrap,
+        )
+        _get_theme_style = self._theme.get_style_for_token
+
+        lexer = self.lexer or self.default_lexer
+
+        if lexer is None:
+            text.append(code)
+        else:
+            if line_range:
+                # More complicated path to only stylize a portion of the code
+                # This speeds up further operations as there are less spans to process
+                line_start, line_end = line_range
+
+                def line_tokenize() -> Iterable[Tuple[Any, str]]:
+                    """Split tokens to one per line."""
+                    assert lexer  # required to make MyPy happy - we know lexer is not None at this point
+
+                    for token_type, token in lexer.get_tokens(code):
+                        while token:
+                            line_token, new_line, token = token.partition("\n")
+                            yield token_type, line_token + new_line
+
+                def tokens_to_spans() -> Iterable[Tuple[str, Optional[Style]]]:
+                    """Convert tokens to spans."""
+                    tokens = iter(line_tokenize())
+                    line_no = 0
+                    _line_start = line_start - 1 if line_start else 0
+
+                    # Skip over tokens until line start
+                    while line_no < _line_start:
+                        try:
+                            _token_type, token = next(tokens)
+                        except StopIteration:
+                            break
+                        yield (token, None)
+                        if token.endswith("\n"):
+                            line_no += 1
+                    # Generate spans until line end
+                    for token_type, token in tokens:
+                        yield (token, _get_theme_style(token_type))
+                        if token.endswith("\n"):
+                            line_no += 1
+                            if line_end and line_no >= line_end:
+                                break
+
+                text.append_tokens(tokens_to_spans())
+
+            else:
+                text.append_tokens(
+                    (token, _get_theme_style(token_type))
+                    for token_type, token in lexer.get_tokens(code)
+                )
+            if self.background_color is not None:
+                text.stylize(f"on {self.background_color}")
+
+        if self._stylized_ranges:
+            self._apply_stylized_ranges(text)
+
+        return text
+
+    def stylize_range(
+        self,
+        style: StyleType,
+        start: SyntaxPosition,
+        end: SyntaxPosition,
+        style_before: bool = False,
+    ) -> None:
+        """
+        Adds a custom style on a part of the code, that will be applied to the syntax display when it's rendered.
+        Line numbers are 1-based, while column indexes are 0-based.
+
+        Args:
+            style (StyleType): The style to apply.
+            start (Tuple[int, int]): The start of the range, in the form `[line number, column index]`.
+            end (Tuple[int, int]): The end of the range, in the form `[line number, column index]`.
+            style_before (bool): Apply the style before any existing styles.
+        """
+        self._stylized_ranges.append(
+            _SyntaxHighlightRange(style, start, end, style_before)
+        )
+
+    def _get_line_numbers_color(self, blend: float = 0.3) -> Color:
+        background_style = self._theme.get_background_style() + self.background_style
+        background_color = background_style.bgcolor
+        if background_color is None or background_color.is_system_defined:
+            return Color.default()
+        foreground_color = self._get_token_color(Token.Text)
+        if foreground_color is None or foreground_color.is_system_defined:
+            return foreground_color or Color.default()
+        new_color = blend_rgb(
+            background_color.get_truecolor(),
+            foreground_color.get_truecolor(),
+            cross_fade=blend,
+        )
+        return Color.from_triplet(new_color)
+
+    @property
+    def _numbers_column_width(self) -> int:
+        """Get the number of characters used to render the numbers column."""
+        column_width = 0
+        if self.line_numbers:
+            column_width = (
+                len(str(self.start_line + self.code.count("\n")))
+                + NUMBERS_COLUMN_DEFAULT_PADDING
+            )
+        return column_width
+
+    def _get_number_styles(self, console: Console) -> Tuple[Style, Style, Style]:
+        """Get background, number, and highlight styles for line numbers."""
+        background_style = self._get_base_style()
+        if background_style.transparent_background:
+            return Style.null(), Style(dim=True), Style.null()
+        if console.color_system in ("256", "truecolor"):
+            number_style = Style.chain(
+                background_style,
+                self._theme.get_style_for_token(Token.Text),
+                Style(color=self._get_line_numbers_color()),
+                self.background_style,
+            )
+            highlight_number_style = Style.chain(
+                background_style,
+                self._theme.get_style_for_token(Token.Text),
+                Style(bold=True, color=self._get_line_numbers_color(0.9)),
+                self.background_style,
+            )
+        else:
+            number_style = background_style + Style(dim=True)
+            highlight_number_style = background_style + Style(dim=False)
+        return background_style, number_style, highlight_number_style
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "Measurement":
+        _, right, _, left = Padding.unpack(self.padding)
+        padding = left + right
+        if self.code_width is not None:
+            width = self.code_width + self._numbers_column_width + padding + 1
+            return Measurement(self._numbers_column_width, width)
+        lines = self.code.splitlines()
+        width = (
+            self._numbers_column_width
+            + padding
+            + (max(cell_len(line) for line in lines) if lines else 0)
+        )
+        if self.line_numbers:
+            width += 1
+        return Measurement(self._numbers_column_width, width)
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        segments = Segments(self._get_syntax(console, options))
+        if self.padding:
+            yield Padding(segments, style=self._get_base_style(), pad=self.padding)
+        else:
+            yield segments
+
+    def _get_syntax(
+        self,
+        console: Console,
+        options: ConsoleOptions,
+    ) -> Iterable[Segment]:
+        """
+        Get the Segments for the Syntax object, excluding any vertical/horizontal padding
+        """
+        transparent_background = self._get_base_style().transparent_background
+        code_width = (
+            (
+                (options.max_width - self._numbers_column_width - 1)
+                if self.line_numbers
+                else options.max_width
+            )
+            if self.code_width is None
+            else self.code_width
+        )
+
+        ends_on_nl, processed_code = self._process_code(self.code)
+        text = self.highlight(processed_code, self.line_range)
+
+        if not self.line_numbers and not self.word_wrap and not self.line_range:
+            if not ends_on_nl:
+                text.remove_suffix("\n")
+            # Simple case of just rendering text
+            style = (
+                self._get_base_style()
+                + self._theme.get_style_for_token(Comment)
+                + Style(dim=True)
+                + self.background_style
+            )
+            if self.indent_guides and not options.ascii_only:
+                text = text.with_indent_guides(self.tab_size, style=style)
+                text.overflow = "crop"
+            if style.transparent_background:
+                yield from console.render(
+                    text, options=options.update(width=code_width)
+                )
+            else:
+                syntax_lines = console.render_lines(
+                    text,
+                    options.update(width=code_width, height=None, justify="left"),
+                    style=self.background_style,
+                    pad=True,
+                    new_lines=True,
+                )
+                for syntax_line in syntax_lines:
+                    yield from syntax_line
+            return
+
+        start_line, end_line = self.line_range or (None, None)
+        line_offset = 0
+        if start_line:
+            line_offset = max(0, start_line - 1)
+        lines: Union[List[Text], Lines] = text.split("\n", allow_blank=ends_on_nl)
+        if self.line_range:
+            if line_offset > len(lines):
+                return
+            lines = lines[line_offset:end_line]
+
+        if self.indent_guides and not options.ascii_only:
+            style = (
+                self._get_base_style()
+                + self._theme.get_style_for_token(Comment)
+                + Style(dim=True)
+                + self.background_style
+            )
+            lines = (
+                Text("\n")
+                .join(lines)
+                .with_indent_guides(self.tab_size, style=style + Style(italic=False))
+                .split("\n", allow_blank=True)
+            )
+
+        numbers_column_width = self._numbers_column_width
+        render_options = options.update(width=code_width)
+
+        highlight_line = self.highlight_lines.__contains__
+        _Segment = Segment
+        new_line = _Segment("\n")
+
+        line_pointer = "> " if options.legacy_windows else "❱ "
+
+        (
+            background_style,
+            number_style,
+            highlight_number_style,
+        ) = self._get_number_styles(console)
+
+        for line_no, line in enumerate(lines, self.start_line + line_offset):
+            if self.word_wrap:
+                wrapped_lines = console.render_lines(
+                    line,
+                    render_options.update(height=None, justify="left"),
+                    style=background_style,
+                    pad=not transparent_background,
+                )
+            else:
+                segments = list(line.render(console, end=""))
+                if options.no_wrap:
+                    wrapped_lines = [segments]
+                else:
+                    wrapped_lines = [
+                        _Segment.adjust_line_length(
+                            segments,
+                            render_options.max_width,
+                            style=background_style,
+                            pad=not transparent_background,
+                        )
+                    ]
+
+            if self.line_numbers:
+                wrapped_line_left_pad = _Segment(
+                    " " * numbers_column_width + " ", background_style
+                )
+                for first, wrapped_line in loop_first(wrapped_lines):
+                    if first:
+                        line_column = str(line_no).rjust(numbers_column_width - 2) + " "
+                        if highlight_line(line_no):
+                            yield _Segment(line_pointer, Style(color="red"))
+                            yield _Segment(line_column, highlight_number_style)
+                        else:
+                            yield _Segment("  ", highlight_number_style)
+                            yield _Segment(line_column, number_style)
+                    else:
+                        yield wrapped_line_left_pad
+                    yield from wrapped_line
+                    yield new_line
+            else:
+                for wrapped_line in wrapped_lines:
+                    yield from wrapped_line
+                    yield new_line
+
+    def _apply_stylized_ranges(self, text: Text) -> None:
+        """
+        Apply stylized ranges to a text instance,
+        using the given code to determine the right portion to apply the style to.
+
+        Args:
+            text (Text): Text instance to apply the style to.
+        """
+        code = text.plain
+        newlines_offsets = [
+            # Let's add outer boundaries at each side of the list:
+            0,
+            # N.B. using "\n" here is much faster than using metacharacters such as "^" or "\Z":
+            *[
+                match.start() + 1
+                for match in re.finditer("\n", code, flags=re.MULTILINE)
+            ],
+            len(code) + 1,
+        ]
+
+        for stylized_range in self._stylized_ranges:
+            start = _get_code_index_for_syntax_position(
+                newlines_offsets, stylized_range.start
+            )
+            end = _get_code_index_for_syntax_position(
+                newlines_offsets, stylized_range.end
+            )
+            if start is not None and end is not None:
+                if stylized_range.style_before:
+                    text.stylize_before(stylized_range.style, start, end)
+                else:
+                    text.stylize(stylized_range.style, start, end)
+
+    def _process_code(self, code: str) -> Tuple[bool, str]:
+        """
+        Applies various processing to a raw code string
+        (normalises it so it always ends with a line return, dedents it if necessary, etc.)
+
+        Args:
+            code (str): The raw code string to process
+
+        Returns:
+            Tuple[bool, str]: the boolean indicates whether the raw code ends with a line return,
+                while the string is the processed code.
+        """
+        ends_on_nl = code.endswith("\n")
+        processed_code = code if ends_on_nl else code + "\n"
+        processed_code = (
+            textwrap.dedent(processed_code) if self.dedent else processed_code
+        )
+        processed_code = processed_code.expandtabs(self.tab_size)
+        return ends_on_nl, processed_code
+
+
+def _get_code_index_for_syntax_position(
+    newlines_offsets: Sequence[int], position: SyntaxPosition
+) -> Optional[int]:
+    """
+    Returns the index of the code string for the given positions.
+
+    Args:
+        newlines_offsets (Sequence[int]): The offset of each newline character found in the code snippet.
+        position (SyntaxPosition): The position to search for.
+
+    Returns:
+        Optional[int]: The index of the code string for this position, or `None`
+            if the given position's line number is out of range (if it's the column that is out of range
+            we silently clamp its value so that it reaches the end of the line)
+    """
+    lines_count = len(newlines_offsets)
+
+    line_number, column_index = position
+    if line_number > lines_count or len(newlines_offsets) < (line_number + 1):
+        return None  # `line_number` is out of range
+    line_index = line_number - 1
+    line_length = newlines_offsets[line_index + 1] - newlines_offsets[line_index] - 1
+    # If `column_index` is out of range: let's silently clamp it:
+    column_index = min(line_length, column_index)
+    return newlines_offsets[line_index] + column_index
+
+
+if __name__ == "__main__":  # pragma: no cover
+    import argparse
+    import sys
+
+    parser = argparse.ArgumentParser(
+        description="Render syntax to the console with Rich"
+    )
+    parser.add_argument(
+        "path",
+        metavar="PATH",
+        help="path to file, or - for stdin",
+    )
+    parser.add_argument(
+        "-c",
+        "--force-color",
+        dest="force_color",
+        action="store_true",
+        default=None,
+        help="force color for non-terminals",
+    )
+    parser.add_argument(
+        "-i",
+        "--indent-guides",
+        dest="indent_guides",
+        action="store_true",
+        default=False,
+        help="display indent guides",
+    )
+    parser.add_argument(
+        "-l",
+        "--line-numbers",
+        dest="line_numbers",
+        action="store_true",
+        help="render line numbers",
+    )
+    parser.add_argument(
+        "-w",
+        "--width",
+        type=int,
+        dest="width",
+        default=None,
+        help="width of output (default will auto-detect)",
+    )
+    parser.add_argument(
+        "-r",
+        "--wrap",
+        dest="word_wrap",
+        action="store_true",
+        default=False,
+        help="word wrap long lines",
+    )
+    parser.add_argument(
+        "-s",
+        "--soft-wrap",
+        action="store_true",
+        dest="soft_wrap",
+        default=False,
+        help="enable soft wrapping mode",
+    )
+    parser.add_argument(
+        "-t", "--theme", dest="theme", default="monokai", help="pygments theme"
+    )
+    parser.add_argument(
+        "-b",
+        "--background-color",
+        dest="background_color",
+        default=None,
+        help="Override background color",
+    )
+    parser.add_argument(
+        "-x",
+        "--lexer",
+        default=None,
+        dest="lexer_name",
+        help="Lexer name",
+    )
+    parser.add_argument(
+        "-p", "--padding", type=int, default=0, dest="padding", help="Padding"
+    )
+    parser.add_argument(
+        "--highlight-line",
+        type=int,
+        default=None,
+        dest="highlight_line",
+        help="The line number (not index!) to highlight",
+    )
+    args = parser.parse_args()
+
+    from rich.console import Console
+
+    console = Console(force_terminal=args.force_color, width=args.width)
+
+    if args.path == "-":
+        code = sys.stdin.read()
+        syntax = Syntax(
+            code=code,
+            lexer=args.lexer_name,
+            line_numbers=args.line_numbers,
+            word_wrap=args.word_wrap,
+            theme=args.theme,
+            background_color=args.background_color,
+            indent_guides=args.indent_guides,
+            padding=args.padding,
+            highlight_lines={args.highlight_line},
+        )
+    else:
+        syntax = Syntax.from_path(
+            args.path,
+            lexer=args.lexer_name,
+            line_numbers=args.line_numbers,
+            word_wrap=args.word_wrap,
+            theme=args.theme,
+            background_color=args.background_color,
+            indent_guides=args.indent_guides,
+            padding=args.padding,
+            highlight_lines={args.highlight_line},
+        )
+    console.print(syntax, soft_wrap=args.soft_wrap)
diff --git a/.venv/Lib/site-packages/rich/table.py b/.venv/Lib/site-packages/rich/table.py
new file mode 100644 (file)
index 0000000..942175d
--- /dev/null
@@ -0,0 +1,1006 @@
+from dataclasses import dataclass, field, replace
+from typing import (
+    TYPE_CHECKING,
+    Dict,
+    Iterable,
+    List,
+    NamedTuple,
+    Optional,
+    Sequence,
+    Tuple,
+    Union,
+)
+
+from . import box, errors
+from ._loop import loop_first_last, loop_last
+from ._pick import pick_bool
+from ._ratio import ratio_distribute, ratio_reduce
+from .align import VerticalAlignMethod
+from .jupyter import JupyterMixin
+from .measure import Measurement
+from .padding import Padding, PaddingDimensions
+from .protocol import is_renderable
+from .segment import Segment
+from .style import Style, StyleType
+from .text import Text, TextType
+
+if TYPE_CHECKING:
+    from .console import (
+        Console,
+        ConsoleOptions,
+        JustifyMethod,
+        OverflowMethod,
+        RenderableType,
+        RenderResult,
+    )
+
+
+@dataclass
+class Column:
+    """Defines a column within a ~Table.
+
+    Args:
+        title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None.
+        caption (Union[str, Text], optional): The table caption rendered below. Defaults to None.
+        width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None.
+        min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None.
+        box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD.
+        safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True.
+        padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1).
+        collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False.
+        pad_edge (bool, optional): Enable padding of edge cells. Defaults to True.
+        expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False.
+        show_header (bool, optional): Show a header row. Defaults to True.
+        show_footer (bool, optional): Show a footer row. Defaults to False.
+        show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True.
+        show_lines (bool, optional): Draw lines between every row. Defaults to False.
+        leading (int, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0.
+        style (Union[str, Style], optional): Default style for the table. Defaults to "none".
+        row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None.
+        header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header".
+        footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer".
+        border_style (Union[str, Style], optional): Style of the border. Defaults to None.
+        title_style (Union[str, Style], optional): Style of the title. Defaults to None.
+        caption_style (Union[str, Style], optional): Style of the caption. Defaults to None.
+        title_justify (str, optional): Justify method for title. Defaults to "center".
+        caption_justify (str, optional): Justify method for caption. Defaults to "center".
+        highlight (bool, optional): Highlight cell contents (if str). Defaults to False.
+    """
+
+    header: "RenderableType" = ""
+    """RenderableType: Renderable for the header (typically a string)"""
+
+    footer: "RenderableType" = ""
+    """RenderableType: Renderable for the footer (typically a string)"""
+
+    header_style: StyleType = ""
+    """StyleType: The style of the header."""
+
+    footer_style: StyleType = ""
+    """StyleType: The style of the footer."""
+
+    style: StyleType = ""
+    """StyleType: The style of the column."""
+
+    justify: "JustifyMethod" = "left"
+    """str: How to justify text within the column ("left", "center", "right", or "full")"""
+
+    vertical: "VerticalAlignMethod" = "top"
+    """str: How to vertically align content ("top", "middle", or "bottom")"""
+
+    overflow: "OverflowMethod" = "ellipsis"
+    """str: Overflow method."""
+
+    width: Optional[int] = None
+    """Optional[int]: Width of the column, or ``None`` (default) to auto calculate width."""
+
+    min_width: Optional[int] = None
+    """Optional[int]: Minimum width of column, or ``None`` for no minimum. Defaults to None."""
+
+    max_width: Optional[int] = None
+    """Optional[int]: Maximum width of column, or ``None`` for no maximum. Defaults to None."""
+
+    ratio: Optional[int] = None
+    """Optional[int]: Ratio to use when calculating column width, or ``None`` (default) to adapt to column contents."""
+
+    no_wrap: bool = False
+    """bool: Prevent wrapping of text within the column. Defaults to ``False``."""
+
+    highlight: bool = False
+    """bool: Apply highlighter to column. Defaults to ``False``."""
+
+    _index: int = 0
+    """Index of column."""
+
+    _cells: List["RenderableType"] = field(default_factory=list)
+
+    def copy(self) -> "Column":
+        """Return a copy of this Column."""
+        return replace(self, _cells=[])
+
+    @property
+    def cells(self) -> Iterable["RenderableType"]:
+        """Get all cells in the column, not including header."""
+        yield from self._cells
+
+    @property
+    def flexible(self) -> bool:
+        """Check if this column is flexible."""
+        return self.ratio is not None
+
+
+@dataclass
+class Row:
+    """Information regarding a row."""
+
+    style: Optional[StyleType] = None
+    """Style to apply to row."""
+
+    end_section: bool = False
+    """Indicated end of section, which will force a line beneath the row."""
+
+
+class _Cell(NamedTuple):
+    """A single cell in a table."""
+
+    style: StyleType
+    """Style to apply to cell."""
+    renderable: "RenderableType"
+    """Cell renderable."""
+    vertical: VerticalAlignMethod
+    """Cell vertical alignment."""
+
+
+class Table(JupyterMixin):
+    """A console renderable to draw a table.
+
+    Args:
+        *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance.
+        title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None.
+        caption (Union[str, Text], optional): The table caption rendered below. Defaults to None.
+        width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None.
+        min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None.
+        box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD.
+        safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True.
+        padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1).
+        collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False.
+        pad_edge (bool, optional): Enable padding of edge cells. Defaults to True.
+        expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False.
+        show_header (bool, optional): Show a header row. Defaults to True.
+        show_footer (bool, optional): Show a footer row. Defaults to False.
+        show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True.
+        show_lines (bool, optional): Draw lines between every row. Defaults to False.
+        leading (int, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0.
+        style (Union[str, Style], optional): Default style for the table. Defaults to "none".
+        row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None.
+        header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header".
+        footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer".
+        border_style (Union[str, Style], optional): Style of the border. Defaults to None.
+        title_style (Union[str, Style], optional): Style of the title. Defaults to None.
+        caption_style (Union[str, Style], optional): Style of the caption. Defaults to None.
+        title_justify (str, optional): Justify method for title. Defaults to "center".
+        caption_justify (str, optional): Justify method for caption. Defaults to "center".
+        highlight (bool, optional): Highlight cell contents (if str). Defaults to False.
+    """
+
+    columns: List[Column]
+    rows: List[Row]
+
+    def __init__(
+        self,
+        *headers: Union[Column, str],
+        title: Optional[TextType] = None,
+        caption: Optional[TextType] = None,
+        width: Optional[int] = None,
+        min_width: Optional[int] = None,
+        box: Optional[box.Box] = box.HEAVY_HEAD,
+        safe_box: Optional[bool] = None,
+        padding: PaddingDimensions = (0, 1),
+        collapse_padding: bool = False,
+        pad_edge: bool = True,
+        expand: bool = False,
+        show_header: bool = True,
+        show_footer: bool = False,
+        show_edge: bool = True,
+        show_lines: bool = False,
+        leading: int = 0,
+        style: StyleType = "none",
+        row_styles: Optional[Iterable[StyleType]] = None,
+        header_style: Optional[StyleType] = "table.header",
+        footer_style: Optional[StyleType] = "table.footer",
+        border_style: Optional[StyleType] = None,
+        title_style: Optional[StyleType] = None,
+        caption_style: Optional[StyleType] = None,
+        title_justify: "JustifyMethod" = "center",
+        caption_justify: "JustifyMethod" = "center",
+        highlight: bool = False,
+    ) -> None:
+        self.columns: List[Column] = []
+        self.rows: List[Row] = []
+        self.title = title
+        self.caption = caption
+        self.width = width
+        self.min_width = min_width
+        self.box = box
+        self.safe_box = safe_box
+        self._padding = Padding.unpack(padding)
+        self.pad_edge = pad_edge
+        self._expand = expand
+        self.show_header = show_header
+        self.show_footer = show_footer
+        self.show_edge = show_edge
+        self.show_lines = show_lines
+        self.leading = leading
+        self.collapse_padding = collapse_padding
+        self.style = style
+        self.header_style = header_style or ""
+        self.footer_style = footer_style or ""
+        self.border_style = border_style
+        self.title_style = title_style
+        self.caption_style = caption_style
+        self.title_justify: "JustifyMethod" = title_justify
+        self.caption_justify: "JustifyMethod" = caption_justify
+        self.highlight = highlight
+        self.row_styles: Sequence[StyleType] = list(row_styles or [])
+        append_column = self.columns.append
+        for header in headers:
+            if isinstance(header, str):
+                self.add_column(header=header)
+            else:
+                header._index = len(self.columns)
+                append_column(header)
+
+    @classmethod
+    def grid(
+        cls,
+        *headers: Union[Column, str],
+        padding: PaddingDimensions = 0,
+        collapse_padding: bool = True,
+        pad_edge: bool = False,
+        expand: bool = False,
+    ) -> "Table":
+        """Get a table with no lines, headers, or footer.
+
+        Args:
+            *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance.
+            padding (PaddingDimensions, optional): Get padding around cells. Defaults to 0.
+            collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to True.
+            pad_edge (bool, optional): Enable padding around edges of table. Defaults to False.
+            expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False.
+
+        Returns:
+            Table: A table instance.
+        """
+        return cls(
+            *headers,
+            box=None,
+            padding=padding,
+            collapse_padding=collapse_padding,
+            show_header=False,
+            show_footer=False,
+            show_edge=False,
+            pad_edge=pad_edge,
+            expand=expand,
+        )
+
+    @property
+    def expand(self) -> bool:
+        """Setting a non-None self.width implies expand."""
+        return self._expand or self.width is not None
+
+    @expand.setter
+    def expand(self, expand: bool) -> None:
+        """Set expand."""
+        self._expand = expand
+
+    @property
+    def _extra_width(self) -> int:
+        """Get extra width to add to cell content."""
+        width = 0
+        if self.box and self.show_edge:
+            width += 2
+        if self.box:
+            width += len(self.columns) - 1
+        return width
+
+    @property
+    def row_count(self) -> int:
+        """Get the current number of rows."""
+        return len(self.rows)
+
+    def get_row_style(self, console: "Console", index: int) -> StyleType:
+        """Get the current row style."""
+        style = Style.null()
+        if self.row_styles:
+            style += console.get_style(self.row_styles[index % len(self.row_styles)])
+        row_style = self.rows[index].style
+        if row_style is not None:
+            style += console.get_style(row_style)
+        return style
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> Measurement:
+        max_width = options.max_width
+        if self.width is not None:
+            max_width = self.width
+        if max_width < 0:
+            return Measurement(0, 0)
+
+        extra_width = self._extra_width
+        max_width = sum(
+            self._calculate_column_widths(
+                console, options.update_width(max_width - extra_width)
+            )
+        )
+        _measure_column = self._measure_column
+
+        measurements = [
+            _measure_column(console, options.update_width(max_width), column)
+            for column in self.columns
+        ]
+        minimum_width = (
+            sum(measurement.minimum for measurement in measurements) + extra_width
+        )
+        maximum_width = (
+            sum(measurement.maximum for measurement in measurements) + extra_width
+            if (self.width is None)
+            else self.width
+        )
+        measurement = Measurement(minimum_width, maximum_width)
+        measurement = measurement.clamp(self.min_width)
+        return measurement
+
+    @property
+    def padding(self) -> Tuple[int, int, int, int]:
+        """Get cell padding."""
+        return self._padding
+
+    @padding.setter
+    def padding(self, padding: PaddingDimensions) -> "Table":
+        """Set cell padding."""
+        self._padding = Padding.unpack(padding)
+        return self
+
+    def add_column(
+        self,
+        header: "RenderableType" = "",
+        footer: "RenderableType" = "",
+        *,
+        header_style: Optional[StyleType] = None,
+        highlight: Optional[bool] = None,
+        footer_style: Optional[StyleType] = None,
+        style: Optional[StyleType] = None,
+        justify: "JustifyMethod" = "left",
+        vertical: "VerticalAlignMethod" = "top",
+        overflow: "OverflowMethod" = "ellipsis",
+        width: Optional[int] = None,
+        min_width: Optional[int] = None,
+        max_width: Optional[int] = None,
+        ratio: Optional[int] = None,
+        no_wrap: bool = False,
+    ) -> None:
+        """Add a column to the table.
+
+        Args:
+            header (RenderableType, optional): Text or renderable for the header.
+                Defaults to "".
+            footer (RenderableType, optional): Text or renderable for the footer.
+                Defaults to "".
+            header_style (Union[str, Style], optional): Style for the header, or None for default. Defaults to None.
+            highlight (bool, optional): Whether to highlight the text. The default of None uses the value of the table (self) object.
+            footer_style (Union[str, Style], optional): Style for the footer, or None for default. Defaults to None.
+            style (Union[str, Style], optional): Style for the column cells, or None for default. Defaults to None.
+            justify (JustifyMethod, optional): Alignment for cells. Defaults to "left".
+            vertical (VerticalAlignMethod, optional): Vertical alignment, one of "top", "middle", or "bottom". Defaults to "top".
+            overflow (OverflowMethod): Overflow method: "crop", "fold", "ellipsis". Defaults to "ellipsis".
+            width (int, optional): Desired width of column in characters, or None to fit to contents. Defaults to None.
+            min_width (Optional[int], optional): Minimum width of column, or ``None`` for no minimum. Defaults to None.
+            max_width (Optional[int], optional): Maximum width of column, or ``None`` for no maximum. Defaults to None.
+            ratio (int, optional): Flexible ratio for the column (requires ``Table.expand`` or ``Table.width``). Defaults to None.
+            no_wrap (bool, optional): Set to ``True`` to disable wrapping of this column.
+        """
+
+        column = Column(
+            _index=len(self.columns),
+            header=header,
+            footer=footer,
+            header_style=header_style or "",
+            highlight=highlight if highlight is not None else self.highlight,
+            footer_style=footer_style or "",
+            style=style or "",
+            justify=justify,
+            vertical=vertical,
+            overflow=overflow,
+            width=width,
+            min_width=min_width,
+            max_width=max_width,
+            ratio=ratio,
+            no_wrap=no_wrap,
+        )
+        self.columns.append(column)
+
+    def add_row(
+        self,
+        *renderables: Optional["RenderableType"],
+        style: Optional[StyleType] = None,
+        end_section: bool = False,
+    ) -> None:
+        """Add a row of renderables.
+
+        Args:
+            *renderables (None or renderable): Each cell in a row must be a renderable object (including str),
+                or ``None`` for a blank cell.
+            style (StyleType, optional): An optional style to apply to the entire row. Defaults to None.
+            end_section (bool, optional): End a section and draw a line. Defaults to False.
+
+        Raises:
+            errors.NotRenderableError: If you add something that can't be rendered.
+        """
+
+        def add_cell(column: Column, renderable: "RenderableType") -> None:
+            column._cells.append(renderable)
+
+        cell_renderables: List[Optional["RenderableType"]] = list(renderables)
+
+        columns = self.columns
+        if len(cell_renderables) < len(columns):
+            cell_renderables = [
+                *cell_renderables,
+                *[None] * (len(columns) - len(cell_renderables)),
+            ]
+        for index, renderable in enumerate(cell_renderables):
+            if index == len(columns):
+                column = Column(_index=index, highlight=self.highlight)
+                for _ in self.rows:
+                    add_cell(column, Text(""))
+                self.columns.append(column)
+            else:
+                column = columns[index]
+            if renderable is None:
+                add_cell(column, "")
+            elif is_renderable(renderable):
+                add_cell(column, renderable)
+            else:
+                raise errors.NotRenderableError(
+                    f"unable to render {type(renderable).__name__}; a string or other renderable object is required"
+                )
+        self.rows.append(Row(style=style, end_section=end_section))
+
+    def add_section(self) -> None:
+        """Add a new section (draw a line after current row)."""
+
+        if self.rows:
+            self.rows[-1].end_section = True
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        if not self.columns:
+            yield Segment("\n")
+            return
+
+        max_width = options.max_width
+        if self.width is not None:
+            max_width = self.width
+
+        extra_width = self._extra_width
+        widths = self._calculate_column_widths(
+            console, options.update_width(max_width - extra_width)
+        )
+        table_width = sum(widths) + extra_width
+
+        render_options = options.update(
+            width=table_width, highlight=self.highlight, height=None
+        )
+
+        def render_annotation(
+            text: TextType, style: StyleType, justify: "JustifyMethod" = "center"
+        ) -> "RenderResult":
+            render_text = (
+                console.render_str(text, style=style, highlight=False)
+                if isinstance(text, str)
+                else text
+            )
+            return console.render(
+                render_text, options=render_options.update(justify=justify)
+            )
+
+        if self.title:
+            yield from render_annotation(
+                self.title,
+                style=Style.pick_first(self.title_style, "table.title"),
+                justify=self.title_justify,
+            )
+        yield from self._render(console, render_options, widths)
+        if self.caption:
+            yield from render_annotation(
+                self.caption,
+                style=Style.pick_first(self.caption_style, "table.caption"),
+                justify=self.caption_justify,
+            )
+
+    def _calculate_column_widths(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> List[int]:
+        """Calculate the widths of each column, including padding, not including borders."""
+        max_width = options.max_width
+        columns = self.columns
+        width_ranges = [
+            self._measure_column(console, options, column) for column in columns
+        ]
+        widths = [_range.maximum or 1 for _range in width_ranges]
+        get_padding_width = self._get_padding_width
+        extra_width = self._extra_width
+        if self.expand:
+            ratios = [col.ratio or 0 for col in columns if col.flexible]
+            if any(ratios):
+                fixed_widths = [
+                    0 if column.flexible else _range.maximum
+                    for _range, column in zip(width_ranges, columns)
+                ]
+                flex_minimum = [
+                    (column.width or 1) + get_padding_width(column._index)
+                    for column in columns
+                    if column.flexible
+                ]
+                flexible_width = max_width - sum(fixed_widths)
+                flex_widths = ratio_distribute(flexible_width, ratios, flex_minimum)
+                iter_flex_widths = iter(flex_widths)
+                for index, column in enumerate(columns):
+                    if column.flexible:
+                        widths[index] = fixed_widths[index] + next(iter_flex_widths)
+        table_width = sum(widths)
+
+        if table_width > max_width:
+            widths = self._collapse_widths(
+                widths,
+                [(column.width is None and not column.no_wrap) for column in columns],
+                max_width,
+            )
+            table_width = sum(widths)
+            # last resort, reduce columns evenly
+            if table_width > max_width:
+                excess_width = table_width - max_width
+                widths = ratio_reduce(excess_width, [1] * len(widths), widths, widths)
+                table_width = sum(widths)
+
+            width_ranges = [
+                self._measure_column(console, options.update_width(width), column)
+                for width, column in zip(widths, columns)
+            ]
+            widths = [_range.maximum or 0 for _range in width_ranges]
+
+        if (table_width < max_width and self.expand) or (
+            self.min_width is not None and table_width < (self.min_width - extra_width)
+        ):
+            _max_width = (
+                max_width
+                if self.min_width is None
+                else min(self.min_width - extra_width, max_width)
+            )
+            pad_widths = ratio_distribute(_max_width - table_width, widths)
+            widths = [_width + pad for _width, pad in zip(widths, pad_widths)]
+
+        return widths
+
+    @classmethod
+    def _collapse_widths(
+        cls, widths: List[int], wrapable: List[bool], max_width: int
+    ) -> List[int]:
+        """Reduce widths so that the total is under max_width.
+
+        Args:
+            widths (List[int]): List of widths.
+            wrapable (List[bool]): List of booleans that indicate if a column may shrink.
+            max_width (int): Maximum width to reduce to.
+
+        Returns:
+            List[int]: A new list of widths.
+        """
+        total_width = sum(widths)
+        excess_width = total_width - max_width
+        if any(wrapable):
+            while total_width and excess_width > 0:
+                max_column = max(
+                    width for width, allow_wrap in zip(widths, wrapable) if allow_wrap
+                )
+                second_max_column = max(
+                    width if allow_wrap and width != max_column else 0
+                    for width, allow_wrap in zip(widths, wrapable)
+                )
+                column_difference = max_column - second_max_column
+                ratios = [
+                    (1 if (width == max_column and allow_wrap) else 0)
+                    for width, allow_wrap in zip(widths, wrapable)
+                ]
+                if not any(ratios) or not column_difference:
+                    break
+                max_reduce = [min(excess_width, column_difference)] * len(widths)
+                widths = ratio_reduce(excess_width, ratios, max_reduce, widths)
+
+                total_width = sum(widths)
+                excess_width = total_width - max_width
+        return widths
+
+    def _get_cells(
+        self, console: "Console", column_index: int, column: Column
+    ) -> Iterable[_Cell]:
+        """Get all the cells with padding and optional header."""
+
+        collapse_padding = self.collapse_padding
+        pad_edge = self.pad_edge
+        padding = self.padding
+        any_padding = any(padding)
+
+        first_column = column_index == 0
+        last_column = column_index == len(self.columns) - 1
+
+        _padding_cache: Dict[Tuple[bool, bool], Tuple[int, int, int, int]] = {}
+
+        def get_padding(first_row: bool, last_row: bool) -> Tuple[int, int, int, int]:
+            cached = _padding_cache.get((first_row, last_row))
+            if cached:
+                return cached
+            top, right, bottom, left = padding
+
+            if collapse_padding:
+                if not first_column:
+                    left = max(0, left - right)
+                if not last_row:
+                    bottom = max(0, top - bottom)
+
+            if not pad_edge:
+                if first_column:
+                    left = 0
+                if last_column:
+                    right = 0
+                if first_row:
+                    top = 0
+                if last_row:
+                    bottom = 0
+            _padding = (top, right, bottom, left)
+            _padding_cache[(first_row, last_row)] = _padding
+            return _padding
+
+        raw_cells: List[Tuple[StyleType, "RenderableType"]] = []
+        _append = raw_cells.append
+        get_style = console.get_style
+        if self.show_header:
+            header_style = get_style(self.header_style or "") + get_style(
+                column.header_style
+            )
+            _append((header_style, column.header))
+        cell_style = get_style(column.style or "")
+        for cell in column.cells:
+            _append((cell_style, cell))
+        if self.show_footer:
+            footer_style = get_style(self.footer_style or "") + get_style(
+                column.footer_style
+            )
+            _append((footer_style, column.footer))
+
+        if any_padding:
+            _Padding = Padding
+            for first, last, (style, renderable) in loop_first_last(raw_cells):
+                yield _Cell(
+                    style,
+                    _Padding(renderable, get_padding(first, last)),
+                    getattr(renderable, "vertical", None) or column.vertical,
+                )
+        else:
+            for style, renderable in raw_cells:
+                yield _Cell(
+                    style,
+                    renderable,
+                    getattr(renderable, "vertical", None) or column.vertical,
+                )
+
+    def _get_padding_width(self, column_index: int) -> int:
+        """Get extra width from padding."""
+        _, pad_right, _, pad_left = self.padding
+        if self.collapse_padding:
+            if column_index > 0:
+                pad_left = max(0, pad_left - pad_right)
+        return pad_left + pad_right
+
+    def _measure_column(
+        self,
+        console: "Console",
+        options: "ConsoleOptions",
+        column: Column,
+    ) -> Measurement:
+        """Get the minimum and maximum width of the column."""
+
+        max_width = options.max_width
+        if max_width < 1:
+            return Measurement(0, 0)
+
+        padding_width = self._get_padding_width(column._index)
+
+        if column.width is not None:
+            # Fixed width column
+            return Measurement(
+                column.width + padding_width, column.width + padding_width
+            ).with_maximum(max_width)
+        # Flexible column, we need to measure contents
+        min_widths: List[int] = []
+        max_widths: List[int] = []
+        append_min = min_widths.append
+        append_max = max_widths.append
+        get_render_width = Measurement.get
+        for cell in self._get_cells(console, column._index, column):
+            _min, _max = get_render_width(console, options, cell.renderable)
+            append_min(_min)
+            append_max(_max)
+
+        measurement = Measurement(
+            max(min_widths) if min_widths else 1,
+            max(max_widths) if max_widths else max_width,
+        ).with_maximum(max_width)
+        measurement = measurement.clamp(
+            None if column.min_width is None else column.min_width + padding_width,
+            None if column.max_width is None else column.max_width + padding_width,
+        )
+        return measurement
+
+    def _render(
+        self, console: "Console", options: "ConsoleOptions", widths: List[int]
+    ) -> "RenderResult":
+        table_style = console.get_style(self.style or "")
+
+        border_style = table_style + console.get_style(self.border_style or "")
+        _column_cells = (
+            self._get_cells(console, column_index, column)
+            for column_index, column in enumerate(self.columns)
+        )
+        row_cells: List[Tuple[_Cell, ...]] = list(zip(*_column_cells))
+        _box = (
+            self.box.substitute(
+                options, safe=pick_bool(self.safe_box, console.safe_box)
+            )
+            if self.box
+            else None
+        )
+        _box = _box.get_plain_headed_box() if _box and not self.show_header else _box
+
+        new_line = Segment.line()
+
+        columns = self.columns
+        show_header = self.show_header
+        show_footer = self.show_footer
+        show_edge = self.show_edge
+        show_lines = self.show_lines
+        leading = self.leading
+
+        _Segment = Segment
+        if _box:
+            box_segments = [
+                (
+                    _Segment(_box.head_left, border_style),
+                    _Segment(_box.head_right, border_style),
+                    _Segment(_box.head_vertical, border_style),
+                ),
+                (
+                    _Segment(_box.mid_left, border_style),
+                    _Segment(_box.mid_right, border_style),
+                    _Segment(_box.mid_vertical, border_style),
+                ),
+                (
+                    _Segment(_box.foot_left, border_style),
+                    _Segment(_box.foot_right, border_style),
+                    _Segment(_box.foot_vertical, border_style),
+                ),
+            ]
+            if show_edge:
+                yield _Segment(_box.get_top(widths), border_style)
+                yield new_line
+        else:
+            box_segments = []
+
+        get_row_style = self.get_row_style
+        get_style = console.get_style
+
+        for index, (first, last, row_cell) in enumerate(loop_first_last(row_cells)):
+            header_row = first and show_header
+            footer_row = last and show_footer
+            row = (
+                self.rows[index - show_header]
+                if (not header_row and not footer_row)
+                else None
+            )
+            max_height = 1
+            cells: List[List[List[Segment]]] = []
+            if header_row or footer_row:
+                row_style = Style.null()
+            else:
+                row_style = get_style(
+                    get_row_style(console, index - 1 if show_header else index)
+                )
+            for width, cell, column in zip(widths, row_cell, columns):
+                render_options = options.update(
+                    width=width,
+                    justify=column.justify,
+                    no_wrap=column.no_wrap,
+                    overflow=column.overflow,
+                    height=None,
+                    highlight=column.highlight,
+                )
+                lines = console.render_lines(
+                    cell.renderable,
+                    render_options,
+                    style=get_style(cell.style) + row_style,
+                )
+                max_height = max(max_height, len(lines))
+                cells.append(lines)
+
+            row_height = max(len(cell) for cell in cells)
+
+            def align_cell(
+                cell: List[List[Segment]],
+                vertical: "VerticalAlignMethod",
+                width: int,
+                style: Style,
+            ) -> List[List[Segment]]:
+                if header_row:
+                    vertical = "bottom"
+                elif footer_row:
+                    vertical = "top"
+
+                if vertical == "top":
+                    return _Segment.align_top(cell, width, row_height, style)
+                elif vertical == "middle":
+                    return _Segment.align_middle(cell, width, row_height, style)
+                return _Segment.align_bottom(cell, width, row_height, style)
+
+            cells[:] = [
+                _Segment.set_shape(
+                    align_cell(
+                        cell,
+                        _cell.vertical,
+                        width,
+                        get_style(_cell.style) + row_style,
+                    ),
+                    width,
+                    max_height,
+                )
+                for width, _cell, cell, column in zip(widths, row_cell, cells, columns)
+            ]
+
+            if _box:
+                if last and show_footer:
+                    yield _Segment(
+                        _box.get_row(widths, "foot", edge=show_edge), border_style
+                    )
+                    yield new_line
+                left, right, _divider = box_segments[0 if first else (2 if last else 1)]
+
+                # If the column divider is whitespace also style it with the row background
+                divider = (
+                    _divider
+                    if _divider.text.strip()
+                    else _Segment(
+                        _divider.text, row_style.background_style + _divider.style
+                    )
+                )
+                for line_no in range(max_height):
+                    if show_edge:
+                        yield left
+                    for last_cell, rendered_cell in loop_last(cells):
+                        yield from rendered_cell[line_no]
+                        if not last_cell:
+                            yield divider
+                    if show_edge:
+                        yield right
+                    yield new_line
+            else:
+                for line_no in range(max_height):
+                    for rendered_cell in cells:
+                        yield from rendered_cell[line_no]
+                    yield new_line
+            if _box and first and show_header:
+                yield _Segment(
+                    _box.get_row(widths, "head", edge=show_edge), border_style
+                )
+                yield new_line
+            end_section = row and row.end_section
+            if _box and (show_lines or leading or end_section):
+                if (
+                    not last
+                    and not (show_footer and index >= len(row_cells) - 2)
+                    and not (show_header and header_row)
+                ):
+                    if leading:
+                        yield _Segment(
+                            _box.get_row(widths, "mid", edge=show_edge) * leading,
+                            border_style,
+                        )
+                    else:
+                        yield _Segment(
+                            _box.get_row(widths, "row", edge=show_edge), border_style
+                        )
+                    yield new_line
+
+        if _box and show_edge:
+            yield _Segment(_box.get_bottom(widths), border_style)
+            yield new_line
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich.console import Console
+    from rich.highlighter import ReprHighlighter
+
+    from ._timer import timer
+
+    with timer("Table render"):
+        table = Table(
+            title="Star Wars Movies",
+            caption="Rich example table",
+            caption_justify="right",
+        )
+
+        table.add_column(
+            "Released", header_style="bright_cyan", style="cyan", no_wrap=True
+        )
+        table.add_column("Title", style="magenta")
+        table.add_column("Box Office", justify="right", style="green")
+
+        table.add_row(
+            "Dec 20, 2019",
+            "Star Wars: The Rise of Skywalker",
+            "$952,110,690",
+        )
+        table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347")
+        table.add_row(
+            "Dec 15, 2017",
+            "Star Wars Ep. V111: The Last Jedi",
+            "$1,332,539,889",
+            style="on black",
+            end_section=True,
+        )
+        table.add_row(
+            "Dec 16, 2016",
+            "Rogue One: A Star Wars Story",
+            "$1,332,439,889",
+        )
+
+        def header(text: str) -> None:
+            console.print()
+            console.rule(highlight(text))
+            console.print()
+
+        console = Console()
+        highlight = ReprHighlighter()
+        header("Example Table")
+        console.print(table, justify="center")
+
+        table.expand = True
+        header("expand=True")
+        console.print(table)
+
+        table.width = 50
+        header("width=50")
+
+        console.print(table, justify="center")
+
+        table.width = None
+        table.expand = False
+        table.row_styles = ["dim", "none"]
+        header("row_styles=['dim', 'none']")
+
+        console.print(table, justify="center")
+
+        table.width = None
+        table.expand = False
+        table.row_styles = ["dim", "none"]
+        table.leading = 1
+        header("leading=1, row_styles=['dim', 'none']")
+        console.print(table, justify="center")
+
+        table.width = None
+        table.expand = False
+        table.row_styles = ["dim", "none"]
+        table.show_lines = True
+        table.leading = 0
+        header("show_lines=True, row_styles=['dim', 'none']")
+        console.print(table, justify="center")
diff --git a/.venv/Lib/site-packages/rich/terminal_theme.py b/.venv/Lib/site-packages/rich/terminal_theme.py
new file mode 100644 (file)
index 0000000..565e9d9
--- /dev/null
@@ -0,0 +1,153 @@
+from typing import List, Optional, Tuple
+
+from .color_triplet import ColorTriplet
+from .palette import Palette
+
+_ColorTuple = Tuple[int, int, int]
+
+
+class TerminalTheme:
+    """A color theme used when exporting console content.
+
+    Args:
+        background (Tuple[int, int, int]): The background color.
+        foreground (Tuple[int, int, int]): The foreground (text) color.
+        normal (List[Tuple[int, int, int]]): A list of 8 normal intensity colors.
+        bright (List[Tuple[int, int, int]], optional): A list of 8 bright colors, or None
+            to repeat normal intensity. Defaults to None.
+    """
+
+    def __init__(
+        self,
+        background: _ColorTuple,
+        foreground: _ColorTuple,
+        normal: List[_ColorTuple],
+        bright: Optional[List[_ColorTuple]] = None,
+    ) -> None:
+        self.background_color = ColorTriplet(*background)
+        self.foreground_color = ColorTriplet(*foreground)
+        self.ansi_colors = Palette(normal + (bright or normal))
+
+
+DEFAULT_TERMINAL_THEME = TerminalTheme(
+    (255, 255, 255),
+    (0, 0, 0),
+    [
+        (0, 0, 0),
+        (128, 0, 0),
+        (0, 128, 0),
+        (128, 128, 0),
+        (0, 0, 128),
+        (128, 0, 128),
+        (0, 128, 128),
+        (192, 192, 192),
+    ],
+    [
+        (128, 128, 128),
+        (255, 0, 0),
+        (0, 255, 0),
+        (255, 255, 0),
+        (0, 0, 255),
+        (255, 0, 255),
+        (0, 255, 255),
+        (255, 255, 255),
+    ],
+)
+
+MONOKAI = TerminalTheme(
+    (12, 12, 12),
+    (217, 217, 217),
+    [
+        (26, 26, 26),
+        (244, 0, 95),
+        (152, 224, 36),
+        (253, 151, 31),
+        (157, 101, 255),
+        (244, 0, 95),
+        (88, 209, 235),
+        (196, 197, 181),
+        (98, 94, 76),
+    ],
+    [
+        (244, 0, 95),
+        (152, 224, 36),
+        (224, 213, 97),
+        (157, 101, 255),
+        (244, 0, 95),
+        (88, 209, 235),
+        (246, 246, 239),
+    ],
+)
+DIMMED_MONOKAI = TerminalTheme(
+    (25, 25, 25),
+    (185, 188, 186),
+    [
+        (58, 61, 67),
+        (190, 63, 72),
+        (135, 154, 59),
+        (197, 166, 53),
+        (79, 118, 161),
+        (133, 92, 141),
+        (87, 143, 164),
+        (185, 188, 186),
+        (136, 137, 135),
+    ],
+    [
+        (251, 0, 31),
+        (15, 114, 47),
+        (196, 112, 51),
+        (24, 109, 227),
+        (251, 0, 103),
+        (46, 112, 109),
+        (253, 255, 185),
+    ],
+)
+NIGHT_OWLISH = TerminalTheme(
+    (255, 255, 255),
+    (64, 63, 83),
+    [
+        (1, 22, 39),
+        (211, 66, 62),
+        (42, 162, 152),
+        (218, 170, 1),
+        (72, 118, 214),
+        (64, 63, 83),
+        (8, 145, 106),
+        (122, 129, 129),
+        (122, 129, 129),
+    ],
+    [
+        (247, 110, 110),
+        (73, 208, 197),
+        (218, 194, 107),
+        (92, 167, 228),
+        (105, 112, 152),
+        (0, 201, 144),
+        (152, 159, 177),
+    ],
+)
+
+SVG_EXPORT_THEME = TerminalTheme(
+    (41, 41, 41),
+    (197, 200, 198),
+    [
+        (75, 78, 85),
+        (204, 85, 90),
+        (152, 168, 75),
+        (208, 179, 68),
+        (96, 138, 177),
+        (152, 114, 159),
+        (104, 160, 179),
+        (197, 200, 198),
+        (154, 155, 153),
+    ],
+    [
+        (255, 38, 39),
+        (0, 130, 61),
+        (208, 132, 66),
+        (25, 132, 233),
+        (255, 44, 122),
+        (57, 130, 128),
+        (253, 253, 197),
+    ],
+)
diff --git a/.venv/Lib/site-packages/rich/text.py b/.venv/Lib/site-packages/rich/text.py
new file mode 100644 (file)
index 0000000..b57d77c
--- /dev/null
@@ -0,0 +1,1361 @@
+import re
+from functools import partial, reduce
+from math import gcd
+from operator import itemgetter
+from typing import (
+    TYPE_CHECKING,
+    Any,
+    Callable,
+    Dict,
+    Iterable,
+    List,
+    NamedTuple,
+    Optional,
+    Pattern,
+    Tuple,
+    Union,
+)
+
+from ._loop import loop_last
+from ._pick import pick_bool
+from ._wrap import divide_line
+from .align import AlignMethod
+from .cells import cell_len, set_cell_size
+from .containers import Lines
+from .control import strip_control_codes
+from .emoji import EmojiVariant
+from .jupyter import JupyterMixin
+from .measure import Measurement
+from .segment import Segment
+from .style import Style, StyleType
+
+if TYPE_CHECKING:  # pragma: no cover
+    from .console import Console, ConsoleOptions, JustifyMethod, OverflowMethod
+
+DEFAULT_JUSTIFY: "JustifyMethod" = "default"
+DEFAULT_OVERFLOW: "OverflowMethod" = "fold"
+
+
+_re_whitespace = re.compile(r"\s+$")
+
+TextType = Union[str, "Text"]
+"""A plain string or a :class:`Text` instance."""
+
+GetStyleCallable = Callable[[str], Optional[StyleType]]
+
+
+class Span(NamedTuple):
+    """A marked up region in some text."""
+
+    start: int
+    """Span start index."""
+    end: int
+    """Span end index."""
+    style: Union[str, Style]
+    """Style associated with the span."""
+
+    def __repr__(self) -> str:
+        return f"Span({self.start}, {self.end}, {self.style!r})"
+
+    def __bool__(self) -> bool:
+        return self.end > self.start
+
+    def split(self, offset: int) -> Tuple["Span", Optional["Span"]]:
+        """Split a span in to 2 from a given offset."""
+
+        if offset < self.start:
+            return self, None
+        if offset >= self.end:
+            return self, None
+
+        start, end, style = self
+        span1 = Span(start, min(end, offset), style)
+        span2 = Span(span1.end, end, style)
+        return span1, span2
+
+    def move(self, offset: int) -> "Span":
+        """Move start and end by a given offset.
+
+        Args:
+            offset (int): Number of characters to add to start and end.
+
+        Returns:
+            TextSpan: A new TextSpan with adjusted position.
+        """
+        start, end, style = self
+        return Span(start + offset, end + offset, style)
+
+    def right_crop(self, offset: int) -> "Span":
+        """Crop the span at the given offset.
+
+        Args:
+            offset (int): A value between start and end.
+
+        Returns:
+            Span: A new (possibly smaller) span.
+        """
+        start, end, style = self
+        if offset >= end:
+            return self
+        return Span(start, min(offset, end), style)
+
+    def extend(self, cells: int) -> "Span":
+        """Extend the span by the given number of cells.
+
+        Args:
+            cells (int): Additional space to add to end of span.
+
+        Returns:
+            Span: A span.
+        """
+        if cells:
+            start, end, style = self
+            return Span(start, end + cells, style)
+        else:
+            return self
+
+
+class Text(JupyterMixin):
+    """Text with color / style.
+
+    Args:
+        text (str, optional): Default unstyled text. Defaults to "".
+        style (Union[str, Style], optional): Base style for text. Defaults to "".
+        justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
+        overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
+        no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None.
+        end (str, optional): Character to end text with. Defaults to "\\\\n".
+        tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None.
+        spans (List[Span], optional). A list of predefined style spans. Defaults to None.
+    """
+
+    __slots__ = [
+        "_text",
+        "style",
+        "justify",
+        "overflow",
+        "no_wrap",
+        "end",
+        "tab_size",
+        "_spans",
+        "_length",
+    ]
+
+    def __init__(
+        self,
+        text: str = "",
+        style: Union[str, Style] = "",
+        *,
+        justify: Optional["JustifyMethod"] = None,
+        overflow: Optional["OverflowMethod"] = None,
+        no_wrap: Optional[bool] = None,
+        end: str = "\n",
+        tab_size: Optional[int] = None,
+        spans: Optional[List[Span]] = None,
+    ) -> None:
+        sanitized_text = strip_control_codes(text)
+        self._text = [sanitized_text]
+        self.style = style
+        self.justify: Optional["JustifyMethod"] = justify
+        self.overflow: Optional["OverflowMethod"] = overflow
+        self.no_wrap = no_wrap
+        self.end = end
+        self.tab_size = tab_size
+        self._spans: List[Span] = spans or []
+        self._length: int = len(sanitized_text)
+
+    def __len__(self) -> int:
+        return self._length
+
+    def __bool__(self) -> bool:
+        return bool(self._length)
+
+    def __str__(self) -> str:
+        return self.plain
+
+    def __repr__(self) -> str:
+        return f"<text {self.plain!r} {self._spans!r} {self.style!r}>"
+
+    def __add__(self, other: Any) -> "Text":
+        if isinstance(other, (str, Text)):
+            result = self.copy()
+            result.append(other)
+            return result
+        return NotImplemented
+
+    def __eq__(self, other: object) -> bool:
+        if not isinstance(other, Text):
+            return NotImplemented
+        return self.plain == other.plain and self._spans == other._spans
+
+    def __contains__(self, other: object) -> bool:
+        if isinstance(other, str):
+            return other in self.plain
+        elif isinstance(other, Text):
+            return other.plain in self.plain
+        return False
+
+    def __getitem__(self, slice: Union[int, slice]) -> "Text":
+        def get_text_at(offset: int) -> "Text":
+            _Span = Span
+            text = Text(
+                self.plain[offset],
+                spans=[
+                    _Span(0, 1, style)
+                    for start, end, style in self._spans
+                    if end > offset >= start
+                ],
+                end="",
+            )
+            return text
+
+        if isinstance(slice, int):
+            return get_text_at(slice)
+        else:
+            start, stop, step = slice.indices(len(self.plain))
+            if step == 1:
+                lines = self.divide([start, stop])
+                return lines[1]
+            else:
+                # This would be a bit of work to implement efficiently
+                # For now, its not required
+                raise TypeError("slices with step!=1 are not supported")
+
+    @property
+    def cell_len(self) -> int:
+        """Get the number of cells required to render this text."""
+        return cell_len(self.plain)
+
+    @property
+    def markup(self) -> str:
+        """Get console markup to render this Text.
+
+        Returns:
+            str: A string potentially creating markup tags.
+        """
+        from .markup import escape
+
+        output: List[str] = []
+
+        plain = self.plain
+        markup_spans = [
+            (0, False, self.style),
+            *((span.start, False, span.style) for span in self._spans),
+            *((span.end, True, span.style) for span in self._spans),
+            (len(plain), True, self.style),
+        ]
+        markup_spans.sort(key=itemgetter(0, 1))
+        position = 0
+        append = output.append
+        for offset, closing, style in markup_spans:
+            if offset > position:
+                append(escape(plain[position:offset]))
+                position = offset
+            if style:
+                append(f"[/{style}]" if closing else f"[{style}]")
+        markup = "".join(output)
+        return markup
+
+    @classmethod
+    def from_markup(
+        cls,
+        text: str,
+        *,
+        style: Union[str, Style] = "",
+        emoji: bool = True,
+        emoji_variant: Optional[EmojiVariant] = None,
+        justify: Optional["JustifyMethod"] = None,
+        overflow: Optional["OverflowMethod"] = None,
+        end: str = "\n",
+    ) -> "Text":
+        """Create Text instance from markup.
+
+        Args:
+            text (str): A string containing console markup.
+            style (Union[str, Style], optional): Base style for text. Defaults to "".
+            emoji (bool, optional): Also render emoji code. Defaults to True.
+            emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None.
+            justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
+            overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
+            end (str, optional): Character to end text with. Defaults to "\\\\n".
+
+        Returns:
+            Text: A Text instance with markup rendered.
+        """
+        from .markup import render
+
+        rendered_text = render(text, style, emoji=emoji, emoji_variant=emoji_variant)
+        rendered_text.justify = justify
+        rendered_text.overflow = overflow
+        rendered_text.end = end
+        return rendered_text
+
+    @classmethod
+    def from_ansi(
+        cls,
+        text: str,
+        *,
+        style: Union[str, Style] = "",
+        justify: Optional["JustifyMethod"] = None,
+        overflow: Optional["OverflowMethod"] = None,
+        no_wrap: Optional[bool] = None,
+        end: str = "\n",
+        tab_size: Optional[int] = 8,
+    ) -> "Text":
+        """Create a Text object from a string containing ANSI escape codes.
+
+        Args:
+            text (str): A string containing escape codes.
+            style (Union[str, Style], optional): Base style for text. Defaults to "".
+            justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
+            overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
+            no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None.
+            end (str, optional): Character to end text with. Defaults to "\\\\n".
+            tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None.
+        """
+        from .ansi import AnsiDecoder
+
+        joiner = Text(
+            "\n",
+            justify=justify,
+            overflow=overflow,
+            no_wrap=no_wrap,
+            end=end,
+            tab_size=tab_size,
+            style=style,
+        )
+        decoder = AnsiDecoder()
+        result = joiner.join(line for line in decoder.decode(text))
+        return result
+
+    @classmethod
+    def styled(
+        cls,
+        text: str,
+        style: StyleType = "",
+        *,
+        justify: Optional["JustifyMethod"] = None,
+        overflow: Optional["OverflowMethod"] = None,
+    ) -> "Text":
+        """Construct a Text instance with a pre-applied styled. A style applied in this way won't be used
+        to pad the text when it is justified.
+
+        Args:
+            text (str): A string containing console markup.
+            style (Union[str, Style]): Style to apply to the text. Defaults to "".
+            justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
+            overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
+
+        Returns:
+            Text: A text instance with a style applied to the entire string.
+        """
+        styled_text = cls(text, justify=justify, overflow=overflow)
+        styled_text.stylize(style)
+        return styled_text
+
+    @classmethod
+    def assemble(
+        cls,
+        *parts: Union[str, "Text", Tuple[str, StyleType]],
+        style: Union[str, Style] = "",
+        justify: Optional["JustifyMethod"] = None,
+        overflow: Optional["OverflowMethod"] = None,
+        no_wrap: Optional[bool] = None,
+        end: str = "\n",
+        tab_size: int = 8,
+        meta: Optional[Dict[str, Any]] = None,
+    ) -> "Text":
+        """Construct a text instance by combining a sequence of strings with optional styles.
+        The positional arguments should be either strings, or a tuple of string + style.
+
+        Args:
+            style (Union[str, Style], optional): Base style for text. Defaults to "".
+            justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None.
+            overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None.
+            no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None.
+            end (str, optional): Character to end text with. Defaults to "\\\\n".
+            tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None.
+            meta (Dict[str, Any], optional). Meta data to apply to text, or None for no meta data. Default to None
+
+        Returns:
+            Text: A new text instance.
+        """
+        text = cls(
+            style=style,
+            justify=justify,
+            overflow=overflow,
+            no_wrap=no_wrap,
+            end=end,
+            tab_size=tab_size,
+        )
+        append = text.append
+        _Text = Text
+        for part in parts:
+            if isinstance(part, (_Text, str)):
+                append(part)
+            else:
+                append(*part)
+        if meta:
+            text.apply_meta(meta)
+        return text
+
+    @property
+    def plain(self) -> str:
+        """Get the text as a single string."""
+        if len(self._text) != 1:
+            self._text[:] = ["".join(self._text)]
+        return self._text[0]
+
+    @plain.setter
+    def plain(self, new_text: str) -> None:
+        """Set the text to a new value."""
+        if new_text != self.plain:
+            sanitized_text = strip_control_codes(new_text)
+            self._text[:] = [sanitized_text]
+            old_length = self._length
+            self._length = len(sanitized_text)
+            if old_length > self._length:
+                self._trim_spans()
+
+    @property
+    def spans(self) -> List[Span]:
+        """Get a reference to the internal list of spans."""
+        return self._spans
+
+    @spans.setter
+    def spans(self, spans: List[Span]) -> None:
+        """Set spans."""
+        self._spans = spans[:]
+
+    def blank_copy(self, plain: str = "") -> "Text":
+        """Return a new Text instance with copied metadata (but not the string or spans)."""
+        copy_self = Text(
+            plain,
+            style=self.style,
+            justify=self.justify,
+            overflow=self.overflow,
+            no_wrap=self.no_wrap,
+            end=self.end,
+            tab_size=self.tab_size,
+        )
+        return copy_self
+
+    def copy(self) -> "Text":
+        """Return a copy of this instance."""
+        copy_self = Text(
+            self.plain,
+            style=self.style,
+            justify=self.justify,
+            overflow=self.overflow,
+            no_wrap=self.no_wrap,
+            end=self.end,
+            tab_size=self.tab_size,
+        )
+        copy_self._spans[:] = self._spans
+        return copy_self
+
+    def stylize(
+        self,
+        style: Union[str, Style],
+        start: int = 0,
+        end: Optional[int] = None,
+    ) -> None:
+        """Apply a style to the text, or a portion of the text.
+
+        Args:
+            style (Union[str, Style]): Style instance or style definition to apply.
+            start (int): Start offset (negative indexing is supported). Defaults to 0.
+            end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None.
+        """
+        if style:
+            length = len(self)
+            if start < 0:
+                start = length + start
+            if end is None:
+                end = length
+            if end < 0:
+                end = length + end
+            if start >= length or end <= start:
+                # Span not in text or not valid
+                return
+            self._spans.append(Span(start, min(length, end), style))
+
+    def stylize_before(
+        self,
+        style: Union[str, Style],
+        start: int = 0,
+        end: Optional[int] = None,
+    ) -> None:
+        """Apply a style to the text, or a portion of the text. Styles will be applied before other styles already present.
+
+        Args:
+            style (Union[str, Style]): Style instance or style definition to apply.
+            start (int): Start offset (negative indexing is supported). Defaults to 0.
+            end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None.
+        """
+        if style:
+            length = len(self)
+            if start < 0:
+                start = length + start
+            if end is None:
+                end = length
+            if end < 0:
+                end = length + end
+            if start >= length or end <= start:
+                # Span not in text or not valid
+                return
+            self._spans.insert(0, Span(start, min(length, end), style))
+
+    def apply_meta(
+        self, meta: Dict[str, Any], start: int = 0, end: Optional[int] = None
+    ) -> None:
+        """Apply metadata to the text, or a portion of the text.
+
+        Args:
+            meta (Dict[str, Any]): A dict of meta information.
+            start (int): Start offset (negative indexing is supported). Defaults to 0.
+            end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None.
+
+        """
+        style = Style.from_meta(meta)
+        self.stylize(style, start=start, end=end)
+
+    def on(self, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Text":
+        """Apply event handlers (used by Textual project).
+
+        Example:
+            >>> from rich.text import Text
+            >>> text = Text("hello world")
+            >>> text.on(click="view.toggle('world')")
+
+        Args:
+            meta (Dict[str, Any]): Mapping of meta information.
+            **handlers: Keyword args are prefixed with "@" to defined handlers.
+
+        Returns:
+            Text: Self is returned to method may be chained.
+        """
+        meta = {} if meta is None else meta
+        meta.update({f"@{key}": value for key, value in handlers.items()})
+        self.stylize(Style.from_meta(meta))
+        return self
+
+    def remove_suffix(self, suffix: str) -> None:
+        """Remove a suffix if it exists.
+
+        Args:
+            suffix (str): Suffix to remove.
+        """
+        if self.plain.endswith(suffix):
+            self.right_crop(len(suffix))
+
+    def get_style_at_offset(self, console: "Console", offset: int) -> Style:
+        """Get the style of a character at give offset.
+
+        Args:
+            console (~Console): Console where text will be rendered.
+            offset (int): Offset in to text (negative indexing supported)
+
+        Returns:
+            Style: A Style instance.
+        """
+        # TODO: This is a little inefficient, it is only used by full justify
+        if offset < 0:
+            offset = len(self) + offset
+        get_style = console.get_style
+        style = get_style(self.style).copy()
+        for start, end, span_style in self._spans:
+            if end > offset >= start:
+                style += get_style(span_style, default="")
+        return style
+
+    def extend_style(self, spaces: int) -> None:
+        """Extend the Text given number of spaces where the spaces have the same style as the last character.
+
+        Args:
+            spaces (int): Number of spaces to add to the Text.
+        """
+        if spaces <= 0:
+            return
+        spans = self.spans
+        new_spaces = " " * spaces
+        if spans:
+            end_offset = len(self)
+            self._spans[:] = [
+                span.extend(spaces) if span.end >= end_offset else span
+                for span in spans
+            ]
+            self._text.append(new_spaces)
+            self._length += spaces
+        else:
+            self.plain += new_spaces
+
+    def highlight_regex(
+        self,
+        re_highlight: Union[Pattern[str], str],
+        style: Optional[Union[GetStyleCallable, StyleType]] = None,
+        *,
+        style_prefix: str = "",
+    ) -> int:
+        """Highlight text with a regular expression, where group names are
+        translated to styles.
+
+        Args:
+            re_highlight (Union[re.Pattern, str]): A regular expression object or string.
+            style (Union[GetStyleCallable, StyleType]): Optional style to apply to whole match, or a callable
+                which accepts the matched text and returns a style. Defaults to None.
+            style_prefix (str, optional): Optional prefix to add to style group names.
+
+        Returns:
+            int: Number of regex matches
+        """
+        count = 0
+        append_span = self._spans.append
+        _Span = Span
+        plain = self.plain
+        if isinstance(re_highlight, str):
+            re_highlight = re.compile(re_highlight)
+        for match in re_highlight.finditer(plain):
+            get_span = match.span
+            if style:
+                start, end = get_span()
+                match_style = style(plain[start:end]) if callable(style) else style
+                if match_style is not None and end > start:
+                    append_span(_Span(start, end, match_style))
+
+            count += 1
+            for name in match.groupdict().keys():
+                start, end = get_span(name)
+                if start != -1 and end > start:
+                    append_span(_Span(start, end, f"{style_prefix}{name}"))
+        return count
+
+    def highlight_words(
+        self,
+        words: Iterable[str],
+        style: Union[str, Style],
+        *,
+        case_sensitive: bool = True,
+    ) -> int:
+        """Highlight words with a style.
+
+        Args:
+            words (Iterable[str]): Words to highlight.
+            style (Union[str, Style]): Style to apply.
+            case_sensitive (bool, optional): Enable case sensitive matching. Defaults to True.
+
+        Returns:
+            int: Number of words highlighted.
+        """
+        re_words = "|".join(re.escape(word) for word in words)
+        add_span = self._spans.append
+        count = 0
+        _Span = Span
+        for match in re.finditer(
+            re_words, self.plain, flags=0 if case_sensitive else re.IGNORECASE
+        ):
+            start, end = match.span(0)
+            add_span(_Span(start, end, style))
+            count += 1
+        return count
+
+    def rstrip(self) -> None:
+        """Strip whitespace from end of text."""
+        self.plain = self.plain.rstrip()
+
+    def rstrip_end(self, size: int) -> None:
+        """Remove whitespace beyond a certain width at the end of the text.
+
+        Args:
+            size (int): The desired size of the text.
+        """
+        text_length = len(self)
+        if text_length > size:
+            excess = text_length - size
+            whitespace_match = _re_whitespace.search(self.plain)
+            if whitespace_match is not None:
+                whitespace_count = len(whitespace_match.group(0))
+                self.right_crop(min(whitespace_count, excess))
+
+    def set_length(self, new_length: int) -> None:
+        """Set new length of the text, clipping or padding is required."""
+        length = len(self)
+        if length != new_length:
+            if length < new_length:
+                self.pad_right(new_length - length)
+            else:
+                self.right_crop(length - new_length)
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> Iterable[Segment]:
+        tab_size: int = console.tab_size if self.tab_size is None else self.tab_size
+        justify = self.justify or options.justify or DEFAULT_JUSTIFY
+
+        overflow = self.overflow or options.overflow or DEFAULT_OVERFLOW
+
+        lines = self.wrap(
+            console,
+            options.max_width,
+            justify=justify,
+            overflow=overflow,
+            tab_size=tab_size or 8,
+            no_wrap=pick_bool(self.no_wrap, options.no_wrap, False),
+        )
+        all_lines = Text("\n").join(lines)
+        yield from all_lines.render(console, end=self.end)
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> Measurement:
+        text = self.plain
+        lines = text.splitlines()
+        max_text_width = max(cell_len(line) for line in lines) if lines else 0
+        words = text.split()
+        min_text_width = (
+            max(cell_len(word) for word in words) if words else max_text_width
+        )
+        return Measurement(min_text_width, max_text_width)
+
+    def render(self, console: "Console", end: str = "") -> Iterable["Segment"]:
+        """Render the text as Segments.
+
+        Args:
+            console (Console): Console instance.
+            end (Optional[str], optional): Optional end character.
+
+        Returns:
+            Iterable[Segment]: Result of render that may be written to the console.
+        """
+        _Segment = Segment
+        text = self.plain
+        if not self._spans:
+            yield Segment(text)
+            if end:
+                yield _Segment(end)
+            return
+        get_style = partial(console.get_style, default=Style.null())
+
+        enumerated_spans = list(enumerate(self._spans, 1))
+        style_map = {index: get_style(span.style) for index, span in enumerated_spans}
+        style_map[0] = get_style(self.style)
+
+        spans = [
+            (0, False, 0),
+            *((span.start, False, index) for index, span in enumerated_spans),
+            *((span.end, True, index) for index, span in enumerated_spans),
+            (len(text), True, 0),
+        ]
+        spans.sort(key=itemgetter(0, 1))
+
+        stack: List[int] = []
+        stack_append = stack.append
+        stack_pop = stack.remove
+
+        style_cache: Dict[Tuple[Style, ...], Style] = {}
+        style_cache_get = style_cache.get
+        combine = Style.combine
+
+        def get_current_style() -> Style:
+            """Construct current style from stack."""
+            styles = tuple(style_map[_style_id] for _style_id in sorted(stack))
+            cached_style = style_cache_get(styles)
+            if cached_style is not None:
+                return cached_style
+            current_style = combine(styles)
+            style_cache[styles] = current_style
+            return current_style
+
+        for (offset, leaving, style_id), (next_offset, _, _) in zip(spans, spans[1:]):
+            if leaving:
+                stack_pop(style_id)
+            else:
+                stack_append(style_id)
+            if next_offset > offset:
+                yield _Segment(text[offset:next_offset], get_current_style())
+        if end:
+            yield _Segment(end)
+
+    def join(self, lines: Iterable["Text"]) -> "Text":
+        """Join text together with this instance as the separator.
+
+        Args:
+            lines (Iterable[Text]): An iterable of Text instances to join.
+
+        Returns:
+            Text: A new text instance containing join text.
+        """
+
+        new_text = self.blank_copy()
+
+        def iter_text() -> Iterable["Text"]:
+            if self.plain:
+                for last, line in loop_last(lines):
+                    yield line
+                    if not last:
+                        yield self
+            else:
+                yield from lines
+
+        extend_text = new_text._text.extend
+        append_span = new_text._spans.append
+        extend_spans = new_text._spans.extend
+        offset = 0
+        _Span = Span
+
+        for text in iter_text():
+            extend_text(text._text)
+            if text.style:
+                append_span(_Span(offset, offset + len(text), text.style))
+            extend_spans(
+                _Span(offset + start, offset + end, style)
+                for start, end, style in text._spans
+            )
+            offset += len(text)
+        new_text._length = offset
+        return new_text
+
+    def expand_tabs(self, tab_size: Optional[int] = None) -> None:
+        """Converts tabs to spaces.
+
+        Args:
+            tab_size (int, optional): Size of tabs. Defaults to 8.
+
+        """
+        if "\t" not in self.plain:
+            return
+        if tab_size is None:
+            tab_size = self.tab_size
+        if tab_size is None:
+            tab_size = 8
+
+        new_text: List[Text] = []
+        append = new_text.append
+
+        for line in self.split("\n", include_separator=True):
+            if "\t" not in line.plain:
+                append(line)
+            else:
+                cell_position = 0
+                parts = line.split("\t", include_separator=True)
+                for part in parts:
+                    if part.plain.endswith("\t"):
+                        part._text[-1] = part._text[-1][:-1] + " "
+                        cell_position += part.cell_len
+                        tab_remainder = cell_position % tab_size
+                        if tab_remainder:
+                            spaces = tab_size - tab_remainder
+                            part.extend_style(spaces)
+                            cell_position += spaces
+                    else:
+                        cell_position += part.cell_len
+                    append(part)
+
+        result = Text("").join(new_text)
+
+        self._text = [result.plain]
+        self._length = len(self.plain)
+        self._spans[:] = result._spans
+
+    def truncate(
+        self,
+        max_width: int,
+        *,
+        overflow: Optional["OverflowMethod"] = None,
+        pad: bool = False,
+    ) -> None:
+        """Truncate text if it is longer that a given width.
+
+        Args:
+            max_width (int): Maximum number of characters in text.
+            overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None, to use self.overflow.
+            pad (bool, optional): Pad with spaces if the length is less than max_width. Defaults to False.
+        """
+        _overflow = overflow or self.overflow or DEFAULT_OVERFLOW
+        if _overflow != "ignore":
+            length = cell_len(self.plain)
+            if length > max_width:
+                if _overflow == "ellipsis":
+                    self.plain = set_cell_size(self.plain, max_width - 1) + "…"
+                else:
+                    self.plain = set_cell_size(self.plain, max_width)
+            if pad and length < max_width:
+                spaces = max_width - length
+                self._text = [f"{self.plain}{' ' * spaces}"]
+                self._length = len(self.plain)
+
+    def _trim_spans(self) -> None:
+        """Remove or modify any spans that are over the end of the text."""
+        max_offset = len(self.plain)
+        _Span = Span
+        self._spans[:] = [
+            (
+                span
+                if span.end < max_offset
+                else _Span(span.start, min(max_offset, span.end), span.style)
+            )
+            for span in self._spans
+            if span.start < max_offset
+        ]
+
+    def pad(self, count: int, character: str = " ") -> None:
+        """Pad left and right with a given number of characters.
+
+        Args:
+            count (int): Width of padding.
+            character (str): The character to pad with. Must be a string of length 1.
+        """
+        assert len(character) == 1, "Character must be a string of length 1"
+        if count:
+            pad_characters = character * count
+            self.plain = f"{pad_characters}{self.plain}{pad_characters}"
+            _Span = Span
+            self._spans[:] = [
+                _Span(start + count, end + count, style)
+                for start, end, style in self._spans
+            ]
+
+    def pad_left(self, count: int, character: str = " ") -> None:
+        """Pad the left with a given character.
+
+        Args:
+            count (int): Number of characters to pad.
+            character (str, optional): Character to pad with. Defaults to " ".
+        """
+        assert len(character) == 1, "Character must be a string of length 1"
+        if count:
+            self.plain = f"{character * count}{self.plain}"
+            _Span = Span
+            self._spans[:] = [
+                _Span(start + count, end + count, style)
+                for start, end, style in self._spans
+            ]
+
+    def pad_right(self, count: int, character: str = " ") -> None:
+        """Pad the right with a given character.
+
+        Args:
+            count (int): Number of characters to pad.
+            character (str, optional): Character to pad with. Defaults to " ".
+        """
+        assert len(character) == 1, "Character must be a string of length 1"
+        if count:
+            self.plain = f"{self.plain}{character * count}"
+
+    def align(self, align: AlignMethod, width: int, character: str = " ") -> None:
+        """Align text to a given width.
+
+        Args:
+            align (AlignMethod): One of "left", "center", or "right".
+            width (int): Desired width.
+            character (str, optional): Character to pad with. Defaults to " ".
+        """
+        self.truncate(width)
+        excess_space = width - cell_len(self.plain)
+        if excess_space:
+            if align == "left":
+                self.pad_right(excess_space, character)
+            elif align == "center":
+                left = excess_space // 2
+                self.pad_left(left, character)
+                self.pad_right(excess_space - left, character)
+            else:
+                self.pad_left(excess_space, character)
+
+    def append(
+        self, text: Union["Text", str], style: Optional[Union[str, "Style"]] = None
+    ) -> "Text":
+        """Add text with an optional style.
+
+        Args:
+            text (Union[Text, str]): A str or Text to append.
+            style (str, optional): A style name. Defaults to None.
+
+        Returns:
+            Text: Returns self for chaining.
+        """
+
+        if not isinstance(text, (str, Text)):
+            raise TypeError("Only str or Text can be appended to Text")
+
+        if len(text):
+            if isinstance(text, str):
+                sanitized_text = strip_control_codes(text)
+                self._text.append(sanitized_text)
+                offset = len(self)
+                text_length = len(sanitized_text)
+                if style:
+                    self._spans.append(Span(offset, offset + text_length, style))
+                self._length += text_length
+            elif isinstance(text, Text):
+                _Span = Span
+                if style is not None:
+                    raise ValueError(
+                        "style must not be set when appending Text instance"
+                    )
+                text_length = self._length
+                if text.style:
+                    self._spans.append(
+                        _Span(text_length, text_length + len(text), text.style)
+                    )
+                self._text.append(text.plain)
+                self._spans.extend(
+                    _Span(start + text_length, end + text_length, style)
+                    for start, end, style in text._spans.copy()
+                )
+                self._length += len(text)
+        return self
+
+    def append_text(self, text: "Text") -> "Text":
+        """Append another Text instance. This method is more performant that Text.append, but
+        only works for Text.
+
+        Args:
+            text (Text): The Text instance to append to this instance.
+
+        Returns:
+            Text: Returns self for chaining.
+        """
+        _Span = Span
+        text_length = self._length
+        if text.style:
+            self._spans.append(_Span(text_length, text_length + len(text), text.style))
+        self._text.append(text.plain)
+        self._spans.extend(
+            _Span(start + text_length, end + text_length, style)
+            for start, end, style in text._spans.copy()
+        )
+        self._length += len(text)
+        return self
+
+    def append_tokens(
+        self, tokens: Iterable[Tuple[str, Optional[StyleType]]]
+    ) -> "Text":
+        """Append iterable of str and style. Style may be a Style instance or a str style definition.
+
+        Args:
+            tokens (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style.
+
+        Returns:
+            Text: Returns self for chaining.
+        """
+        append_text = self._text.append
+        append_span = self._spans.append
+        _Span = Span
+        offset = len(self)
+        for content, style in tokens:
+            content = strip_control_codes(content)
+            append_text(content)
+            if style:
+                append_span(_Span(offset, offset + len(content), style))
+            offset += len(content)
+        self._length = offset
+        return self
+
+    def copy_styles(self, text: "Text") -> None:
+        """Copy styles from another Text instance.
+
+        Args:
+            text (Text): A Text instance to copy styles from, must be the same length.
+        """
+        self._spans.extend(text._spans)
+
+    def split(
+        self,
+        separator: str = "\n",
+        *,
+        include_separator: bool = False,
+        allow_blank: bool = False,
+    ) -> Lines:
+        """Split rich text in to lines, preserving styles.
+
+        Args:
+            separator (str, optional): String to split on. Defaults to "\\\\n".
+            include_separator (bool, optional): Include the separator in the lines. Defaults to False.
+            allow_blank (bool, optional): Return a blank line if the text ends with a separator. Defaults to False.
+
+        Returns:
+            List[RichText]: A list of rich text, one per line of the original.
+        """
+        assert separator, "separator must not be empty"
+
+        text = self.plain
+        if separator not in text:
+            return Lines([self.copy()])
+
+        if include_separator:
+            lines = self.divide(
+                match.end() for match in re.finditer(re.escape(separator), text)
+            )
+        else:
+
+            def flatten_spans() -> Iterable[int]:
+                for match in re.finditer(re.escape(separator), text):
+                    start, end = match.span()
+                    yield start
+                    yield end
+
+            lines = Lines(
+                line for line in self.divide(flatten_spans()) if line.plain != separator
+            )
+
+        if not allow_blank and text.endswith(separator):
+            lines.pop()
+
+        return lines
+
+    def divide(self, offsets: Iterable[int]) -> Lines:
+        """Divide text in to a number of lines at given offsets.
+
+        Args:
+            offsets (Iterable[int]): Offsets used to divide text.
+
+        Returns:
+            Lines: New RichText instances between offsets.
+        """
+        _offsets = list(offsets)
+
+        if not _offsets:
+            return Lines([self.copy()])
+
+        text = self.plain
+        text_length = len(text)
+        divide_offsets = [0, *_offsets, text_length]
+        line_ranges = list(zip(divide_offsets, divide_offsets[1:]))
+
+        style = self.style
+        justify = self.justify
+        overflow = self.overflow
+        _Text = Text
+        new_lines = Lines(
+            _Text(
+                text[start:end],
+                style=style,
+                justify=justify,
+                overflow=overflow,
+            )
+            for start, end in line_ranges
+        )
+        if not self._spans:
+            return new_lines
+
+        _line_appends = [line._spans.append for line in new_lines._lines]
+        line_count = len(line_ranges)
+        _Span = Span
+
+        for span_start, span_end, style in self._spans:
+            lower_bound = 0
+            upper_bound = line_count
+            start_line_no = (lower_bound + upper_bound) // 2
+
+            while True:
+                line_start, line_end = line_ranges[start_line_no]
+                if span_start < line_start:
+                    upper_bound = start_line_no - 1
+                elif span_start > line_end:
+                    lower_bound = start_line_no + 1
+                else:
+                    break
+                start_line_no = (lower_bound + upper_bound) // 2
+
+            if span_end < line_end:
+                end_line_no = start_line_no
+            else:
+                end_line_no = lower_bound = start_line_no
+                upper_bound = line_count
+
+                while True:
+                    line_start, line_end = line_ranges[end_line_no]
+                    if span_end < line_start:
+                        upper_bound = end_line_no - 1
+                    elif span_end > line_end:
+                        lower_bound = end_line_no + 1
+                    else:
+                        break
+                    end_line_no = (lower_bound + upper_bound) // 2
+
+            for line_no in range(start_line_no, end_line_no + 1):
+                line_start, line_end = line_ranges[line_no]
+                new_start = max(0, span_start - line_start)
+                new_end = min(span_end - line_start, line_end - line_start)
+                if new_end > new_start:
+                    _line_appends[line_no](_Span(new_start, new_end, style))
+
+        return new_lines
+
+    def right_crop(self, amount: int = 1) -> None:
+        """Remove a number of characters from the end of the text."""
+        max_offset = len(self.plain) - amount
+        _Span = Span
+        self._spans[:] = [
+            (
+                span
+                if span.end < max_offset
+                else _Span(span.start, min(max_offset, span.end), span.style)
+            )
+            for span in self._spans
+            if span.start < max_offset
+        ]
+        self._text = [self.plain[:-amount]]
+        self._length -= amount
+
+    def wrap(
+        self,
+        console: "Console",
+        width: int,
+        *,
+        justify: Optional["JustifyMethod"] = None,
+        overflow: Optional["OverflowMethod"] = None,
+        tab_size: int = 8,
+        no_wrap: Optional[bool] = None,
+    ) -> Lines:
+        """Word wrap the text.
+
+        Args:
+            console (Console): Console instance.
+            width (int): Number of cells available per line.
+            justify (str, optional): Justify method: "default", "left", "center", "full", "right". Defaults to "default".
+            overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None.
+            tab_size (int, optional): Default tab size. Defaults to 8.
+            no_wrap (bool, optional): Disable wrapping, Defaults to False.
+
+        Returns:
+            Lines: Number of lines.
+        """
+        wrap_justify = justify or self.justify or DEFAULT_JUSTIFY
+        wrap_overflow = overflow or self.overflow or DEFAULT_OVERFLOW
+
+        no_wrap = pick_bool(no_wrap, self.no_wrap, False) or overflow == "ignore"
+
+        lines = Lines()
+        for line in self.split(allow_blank=True):
+            if "\t" in line:
+                line.expand_tabs(tab_size)
+            if no_wrap:
+                new_lines = Lines([line])
+            else:
+                offsets = divide_line(str(line), width, fold=wrap_overflow == "fold")
+                new_lines = line.divide(offsets)
+            for line in new_lines:
+                line.rstrip_end(width)
+            if wrap_justify:
+                new_lines.justify(
+                    console, width, justify=wrap_justify, overflow=wrap_overflow
+                )
+            for line in new_lines:
+                line.truncate(width, overflow=wrap_overflow)
+            lines.extend(new_lines)
+        return lines
+
+    def fit(self, width: int) -> Lines:
+        """Fit the text in to given width by chopping in to lines.
+
+        Args:
+            width (int): Maximum characters in a line.
+
+        Returns:
+            Lines: Lines container.
+        """
+        lines: Lines = Lines()
+        append = lines.append
+        for line in self.split():
+            line.set_length(width)
+            append(line)
+        return lines
+
+    def detect_indentation(self) -> int:
+        """Auto-detect indentation of code.
+
+        Returns:
+            int: Number of spaces used to indent code.
+        """
+
+        _indentations = {
+            len(match.group(1))
+            for match in re.finditer(r"^( *)(.*)$", self.plain, flags=re.MULTILINE)
+        }
+
+        try:
+            indentation = (
+                reduce(gcd, [indent for indent in _indentations if not indent % 2]) or 1
+            )
+        except TypeError:
+            indentation = 1
+
+        return indentation
+
+    def with_indent_guides(
+        self,
+        indent_size: Optional[int] = None,
+        *,
+        character: str = "│",
+        style: StyleType = "dim green",
+    ) -> "Text":
+        """Adds indent guide lines to text.
+
+        Args:
+            indent_size (Optional[int]): Size of indentation, or None to auto detect. Defaults to None.
+            character (str, optional): Character to use for indentation. Defaults to "│".
+            style (Union[Style, str], optional): Style of indent guides.
+
+        Returns:
+            Text: New text with indentation guides.
+        """
+
+        _indent_size = self.detect_indentation() if indent_size is None else indent_size
+
+        text = self.copy()
+        text.expand_tabs()
+        indent_line = f"{character}{' ' * (_indent_size - 1)}"
+
+        re_indent = re.compile(r"^( *)(.*)$")
+        new_lines: List[Text] = []
+        add_line = new_lines.append
+        blank_lines = 0
+        for line in text.split(allow_blank=True):
+            match = re_indent.match(line.plain)
+            if not match or not match.group(2):
+                blank_lines += 1
+                continue
+            indent = match.group(1)
+            full_indents, remaining_space = divmod(len(indent), _indent_size)
+            new_indent = f"{indent_line * full_indents}{' ' * remaining_space}"
+            line.plain = new_indent + line.plain[len(new_indent) :]
+            line.stylize(style, 0, len(new_indent))
+            if blank_lines:
+                new_lines.extend([Text(new_indent, style=style)] * blank_lines)
+                blank_lines = 0
+            add_line(line)
+        if blank_lines:
+            new_lines.extend([Text("", style=style)] * blank_lines)
+
+        new_text = text.blank_copy("\n").join(new_lines)
+        return new_text
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich.console import Console
+
+    text = Text(
+        """\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n"""
+    )
+    text.highlight_words(["Lorem"], "bold")
+    text.highlight_words(["ipsum"], "italic")
+
+    console = Console()
+
+    console.rule("justify='left'")
+    console.print(text, style="red")
+    console.print()
+
+    console.rule("justify='center'")
+    console.print(text, style="green", justify="center")
+    console.print()
+
+    console.rule("justify='right'")
+    console.print(text, style="blue", justify="right")
+    console.print()
+
+    console.rule("justify='full'")
+    console.print(text, style="magenta", justify="full")
+    console.print()
diff --git a/.venv/Lib/site-packages/rich/theme.py b/.venv/Lib/site-packages/rich/theme.py
new file mode 100644 (file)
index 0000000..227f1d8
--- /dev/null
@@ -0,0 +1,115 @@
+import configparser
+from typing import IO, Dict, List, Mapping, Optional
+
+from .default_styles import DEFAULT_STYLES
+from .style import Style, StyleType
+
+
+class Theme:
+    """A container for style information, used by :class:`~rich.console.Console`.
+
+    Args:
+        styles (Dict[str, Style], optional): A mapping of style names on to styles. Defaults to None for a theme with no styles.
+        inherit (bool, optional): Inherit default styles. Defaults to True.
+    """
+
+    styles: Dict[str, Style]
+
+    def __init__(
+        self, styles: Optional[Mapping[str, StyleType]] = None, inherit: bool = True
+    ):
+        self.styles = DEFAULT_STYLES.copy() if inherit else {}
+        if styles is not None:
+            self.styles.update(
+                {
+                    name: style if isinstance(style, Style) else Style.parse(style)
+                    for name, style in styles.items()
+                }
+            )
+
+    @property
+    def config(self) -> str:
+        """Get contents of a config file for this theme."""
+        config = "[styles]\n" + "\n".join(
+            f"{name} = {style}" for name, style in sorted(self.styles.items())
+        )
+        return config
+
+    @classmethod
+    def from_file(
+        cls, config_file: IO[str], source: Optional[str] = None, inherit: bool = True
+    ) -> "Theme":
+        """Load a theme from a text mode file.
+
+        Args:
+            config_file (IO[str]): An open conf file.
+            source (str, optional): The filename of the open file. Defaults to None.
+            inherit (bool, optional): Inherit default styles. Defaults to True.
+
+        Returns:
+            Theme: A New theme instance.
+        """
+        config = configparser.ConfigParser()
+        config.read_file(config_file, source=source)
+        styles = {name: Style.parse(value) for name, value in config.items("styles")}
+        theme = Theme(styles, inherit=inherit)
+        return theme
+
+    @classmethod
+    def read(
+        cls, path: str, inherit: bool = True, encoding: Optional[str] = None
+    ) -> "Theme":
+        """Read a theme from a path.
+
+        Args:
+            path (str): Path to a config file readable by Python configparser module.
+            inherit (bool, optional): Inherit default styles. Defaults to True.
+            encoding (str, optional): Encoding of the config file. Defaults to None.
+
+        Returns:
+            Theme: A new theme instance.
+        """
+        with open(path, encoding=encoding) as config_file:
+            return cls.from_file(config_file, source=path, inherit=inherit)
+
+
+class ThemeStackError(Exception):
+    """Base exception for errors related to the theme stack."""
+
+
+class ThemeStack:
+    """A stack of themes.
+
+    Args:
+        theme (Theme): A theme instance
+    """
+
+    def __init__(self, theme: Theme) -> None:
+        self._entries: List[Dict[str, Style]] = [theme.styles]
+        self.get = self._entries[-1].get
+
+    def push_theme(self, theme: Theme, inherit: bool = True) -> None:
+        """Push a theme on the top of the stack.
+
+        Args:
+            theme (Theme): A Theme instance.
+            inherit (boolean, optional): Inherit styles from current top of stack.
+        """
+        styles: Dict[str, Style]
+        styles = (
+            {**self._entries[-1], **theme.styles} if inherit else theme.styles.copy()
+        )
+        self._entries.append(styles)
+        self.get = self._entries[-1].get
+
+    def pop_theme(self) -> None:
+        """Pop (and discard) the top-most theme."""
+        if len(self._entries) == 1:
+            raise ThemeStackError("Unable to pop base theme")
+        self._entries.pop()
+        self.get = self._entries[-1].get
+
+
+if __name__ == "__main__":  # pragma: no cover
+    theme = Theme()
+    print(theme.config)
diff --git a/.venv/Lib/site-packages/rich/themes.py b/.venv/Lib/site-packages/rich/themes.py
new file mode 100644 (file)
index 0000000..bf6db10
--- /dev/null
@@ -0,0 +1,5 @@
+from .default_styles import DEFAULT_STYLES
+from .theme import Theme
+
+
+DEFAULT = Theme(DEFAULT_STYLES)
diff --git a/.venv/Lib/site-packages/rich/traceback.py b/.venv/Lib/site-packages/rich/traceback.py
new file mode 100644 (file)
index 0000000..b2cc630
--- /dev/null
@@ -0,0 +1,884 @@
+import inspect
+import linecache
+import os
+import sys
+from dataclasses import dataclass, field
+from itertools import islice
+from traceback import walk_tb
+from types import ModuleType, TracebackType
+from typing import (
+    Any,
+    Callable,
+    Dict,
+    Iterable,
+    List,
+    Optional,
+    Sequence,
+    Tuple,
+    Type,
+    Union,
+)
+
+from pygments.lexers import guess_lexer_for_filename
+from pygments.token import Comment, Keyword, Name, Number, Operator, String
+from pygments.token import Text as TextToken
+from pygments.token import Token
+from pygments.util import ClassNotFound
+
+from . import pretty
+from ._loop import loop_first_last, loop_last
+from .columns import Columns
+from .console import (
+    Console,
+    ConsoleOptions,
+    ConsoleRenderable,
+    Group,
+    RenderResult,
+    group,
+)
+from .constrain import Constrain
+from .highlighter import RegexHighlighter, ReprHighlighter
+from .panel import Panel
+from .scope import render_scope
+from .style import Style
+from .syntax import Syntax, SyntaxPosition
+from .text import Text
+from .theme import Theme
+
+WINDOWS = sys.platform == "win32"
+
+LOCALS_MAX_LENGTH = 10
+LOCALS_MAX_STRING = 80
+
+
+def _iter_syntax_lines(
+    start: SyntaxPosition, end: SyntaxPosition
+) -> Iterable[Tuple[int, int, int]]:
+    """Yield start and end positions per line.
+
+    Args:
+        start: Start position.
+        end: End position.
+
+    Returns:
+        Iterable of (LINE, COLUMN1, COLUMN2).
+    """
+
+    line1, column1 = start
+    line2, column2 = end
+
+    if line1 == line2:
+        yield line1, column1, column2
+    else:
+        for first, last, line_no in loop_first_last(range(line1, line2 + 1)):
+            if first:
+                yield line_no, column1, -1
+            elif last:
+                yield line_no, 0, column2
+            else:
+                yield line_no, 0, -1
+
+
+def install(
+    *,
+    console: Optional[Console] = None,
+    width: Optional[int] = 100,
+    code_width: Optional[int] = 88,
+    extra_lines: int = 3,
+    theme: Optional[str] = None,
+    word_wrap: bool = False,
+    show_locals: bool = False,
+    locals_max_length: int = LOCALS_MAX_LENGTH,
+    locals_max_string: int = LOCALS_MAX_STRING,
+    locals_hide_dunder: bool = True,
+    locals_hide_sunder: Optional[bool] = None,
+    indent_guides: bool = True,
+    suppress: Iterable[Union[str, ModuleType]] = (),
+    max_frames: int = 100,
+) -> Callable[[Type[BaseException], BaseException, Optional[TracebackType]], Any]:
+    """Install a rich traceback handler.
+
+    Once installed, any tracebacks will be printed with syntax highlighting and rich formatting.
+
+
+    Args:
+        console (Optional[Console], optional): Console to write exception to. Default uses internal Console instance.
+        width (Optional[int], optional): Width (in characters) of traceback. Defaults to 100.
+        code_width (Optional[int], optional): Code width (in characters) of traceback. Defaults to 88.
+        extra_lines (int, optional): Extra lines of code. Defaults to 3.
+        theme (Optional[str], optional): Pygments theme to use in traceback. Defaults to ``None`` which will pick
+            a theme appropriate for the platform.
+        word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False.
+        show_locals (bool, optional): Enable display of local variables. Defaults to False.
+        locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+            Defaults to 10.
+        locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
+        locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True.
+        locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False.
+        indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True.
+        suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.
+
+    Returns:
+        Callable: The previous exception handler that was replaced.
+
+    """
+    traceback_console = Console(stderr=True) if console is None else console
+
+    locals_hide_sunder = (
+        True
+        if (traceback_console.is_jupyter and locals_hide_sunder is None)
+        else locals_hide_sunder
+    )
+
+    def excepthook(
+        type_: Type[BaseException],
+        value: BaseException,
+        traceback: Optional[TracebackType],
+    ) -> None:
+        exception_traceback = Traceback.from_exception(
+            type_,
+            value,
+            traceback,
+            width=width,
+            code_width=code_width,
+            extra_lines=extra_lines,
+            theme=theme,
+            word_wrap=word_wrap,
+            show_locals=show_locals,
+            locals_max_length=locals_max_length,
+            locals_max_string=locals_max_string,
+            locals_hide_dunder=locals_hide_dunder,
+            locals_hide_sunder=bool(locals_hide_sunder),
+            indent_guides=indent_guides,
+            suppress=suppress,
+            max_frames=max_frames,
+        )
+        traceback_console.print(exception_traceback)
+
+    def ipy_excepthook_closure(ip: Any) -> None:  # pragma: no cover
+        tb_data = {}  # store information about showtraceback call
+        default_showtraceback = ip.showtraceback  # keep reference of default traceback
+
+        def ipy_show_traceback(*args: Any, **kwargs: Any) -> None:
+            """wrap the default ip.showtraceback to store info for ip._showtraceback"""
+            nonlocal tb_data
+            tb_data = kwargs
+            default_showtraceback(*args, **kwargs)
+
+        def ipy_display_traceback(
+            *args: Any, is_syntax: bool = False, **kwargs: Any
+        ) -> None:
+            """Internally called traceback from ip._showtraceback"""
+            nonlocal tb_data
+            exc_tuple = ip._get_exc_info()
+
+            # do not display trace on syntax error
+            tb: Optional[TracebackType] = None if is_syntax else exc_tuple[2]
+
+            # determine correct tb_offset
+            compiled = tb_data.get("running_compiled_code", False)
+            tb_offset = tb_data.get("tb_offset", 1 if compiled else 0)
+            # remove ipython internal frames from trace with tb_offset
+            for _ in range(tb_offset):
+                if tb is None:
+                    break
+                tb = tb.tb_next
+
+            excepthook(exc_tuple[0], exc_tuple[1], tb)
+            tb_data = {}  # clear data upon usage
+
+        # replace _showtraceback instead of showtraceback to allow ipython features such as debugging to work
+        # this is also what the ipython docs recommends to modify when subclassing InteractiveShell
+        ip._showtraceback = ipy_display_traceback
+        # add wrapper to capture tb_data
+        ip.showtraceback = ipy_show_traceback
+        ip.showsyntaxerror = lambda *args, **kwargs: ipy_display_traceback(
+            *args, is_syntax=True, **kwargs
+        )
+
+    try:  # pragma: no cover
+        # if within ipython, use customized traceback
+        ip = get_ipython()  # type: ignore[name-defined]
+        ipy_excepthook_closure(ip)
+        return sys.excepthook
+    except Exception:
+        # otherwise use default system hook
+        old_excepthook = sys.excepthook
+        sys.excepthook = excepthook
+        return old_excepthook
+
+
+@dataclass
+class Frame:
+    filename: str
+    lineno: int
+    name: str
+    line: str = ""
+    locals: Optional[Dict[str, pretty.Node]] = None
+    last_instruction: Optional[Tuple[Tuple[int, int], Tuple[int, int]]] = None
+
+
+@dataclass
+class _SyntaxError:
+    offset: int
+    filename: str
+    line: str
+    lineno: int
+    msg: str
+    notes: List[str] = field(default_factory=list)
+
+
+@dataclass
+class Stack:
+    exc_type: str
+    exc_value: str
+    syntax_error: Optional[_SyntaxError] = None
+    is_cause: bool = False
+    frames: List[Frame] = field(default_factory=list)
+    notes: List[str] = field(default_factory=list)
+    is_group: bool = False
+    exceptions: List["Trace"] = field(default_factory=list)
+
+
+@dataclass
+class Trace:
+    stacks: List[Stack]
+
+
+class PathHighlighter(RegexHighlighter):
+    highlights = [r"(?P<dim>.*/)(?P<bold>.+)"]
+
+
+class Traceback:
+    """A Console renderable that renders a traceback.
+
+    Args:
+        trace (Trace, optional): A `Trace` object produced from `extract`. Defaults to None, which uses
+            the last exception.
+        width (Optional[int], optional): Number of characters used to traceback. Defaults to 100.
+        code_width (Optional[int], optional): Number of code characters used to traceback. Defaults to 88.
+        extra_lines (int, optional): Additional lines of code to render. Defaults to 3.
+        theme (str, optional): Override pygments theme used in traceback.
+        word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False.
+        show_locals (bool, optional): Enable display of local variables. Defaults to False.
+        indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True.
+        locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+            Defaults to 10.
+        locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
+        locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True.
+        locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False.
+        suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.
+        max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100.
+
+    """
+
+    LEXERS = {
+        "": "text",
+        ".py": "python",
+        ".pxd": "cython",
+        ".pyx": "cython",
+        ".pxi": "pyrex",
+    }
+
+    def __init__(
+        self,
+        trace: Optional[Trace] = None,
+        *,
+        width: Optional[int] = 100,
+        code_width: Optional[int] = 88,
+        extra_lines: int = 3,
+        theme: Optional[str] = None,
+        word_wrap: bool = False,
+        show_locals: bool = False,
+        locals_max_length: int = LOCALS_MAX_LENGTH,
+        locals_max_string: int = LOCALS_MAX_STRING,
+        locals_hide_dunder: bool = True,
+        locals_hide_sunder: bool = False,
+        indent_guides: bool = True,
+        suppress: Iterable[Union[str, ModuleType]] = (),
+        max_frames: int = 100,
+    ):
+        if trace is None:
+            exc_type, exc_value, traceback = sys.exc_info()
+            if exc_type is None or exc_value is None or traceback is None:
+                raise ValueError(
+                    "Value for 'trace' required if not called in except: block"
+                )
+            trace = self.extract(
+                exc_type, exc_value, traceback, show_locals=show_locals
+            )
+        self.trace = trace
+        self.width = width
+        self.code_width = code_width
+        self.extra_lines = extra_lines
+        self.theme = Syntax.get_theme(theme or "ansi_dark")
+        self.word_wrap = word_wrap
+        self.show_locals = show_locals
+        self.indent_guides = indent_guides
+        self.locals_max_length = locals_max_length
+        self.locals_max_string = locals_max_string
+        self.locals_hide_dunder = locals_hide_dunder
+        self.locals_hide_sunder = locals_hide_sunder
+
+        self.suppress: Sequence[str] = []
+        for suppress_entity in suppress:
+            if not isinstance(suppress_entity, str):
+                assert (
+                    suppress_entity.__file__ is not None
+                ), f"{suppress_entity!r} must be a module with '__file__' attribute"
+                path = os.path.dirname(suppress_entity.__file__)
+            else:
+                path = suppress_entity
+            path = os.path.normpath(os.path.abspath(path))
+            self.suppress.append(path)
+        self.max_frames = max(4, max_frames) if max_frames > 0 else 0
+
+    @classmethod
+    def from_exception(
+        cls,
+        exc_type: Type[Any],
+        exc_value: BaseException,
+        traceback: Optional[TracebackType],
+        *,
+        width: Optional[int] = 100,
+        code_width: Optional[int] = 88,
+        extra_lines: int = 3,
+        theme: Optional[str] = None,
+        word_wrap: bool = False,
+        show_locals: bool = False,
+        locals_max_length: int = LOCALS_MAX_LENGTH,
+        locals_max_string: int = LOCALS_MAX_STRING,
+        locals_hide_dunder: bool = True,
+        locals_hide_sunder: bool = False,
+        indent_guides: bool = True,
+        suppress: Iterable[Union[str, ModuleType]] = (),
+        max_frames: int = 100,
+    ) -> "Traceback":
+        """Create a traceback from exception info
+
+        Args:
+            exc_type (Type[BaseException]): Exception type.
+            exc_value (BaseException): Exception value.
+            traceback (TracebackType): Python Traceback object.
+            width (Optional[int], optional): Number of characters used to traceback. Defaults to 100.
+            code_width (Optional[int], optional): Number of code characters used to traceback. Defaults to 88.
+            extra_lines (int, optional): Additional lines of code to render. Defaults to 3.
+            theme (str, optional): Override pygments theme used in traceback.
+            word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False.
+            show_locals (bool, optional): Enable display of local variables. Defaults to False.
+            indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True.
+            locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+                Defaults to 10.
+            locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
+            locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True.
+            locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False.
+            suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.
+            max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100.
+
+        Returns:
+            Traceback: A Traceback instance that may be printed.
+        """
+        rich_traceback = cls.extract(
+            exc_type,
+            exc_value,
+            traceback,
+            show_locals=show_locals,
+            locals_max_length=locals_max_length,
+            locals_max_string=locals_max_string,
+            locals_hide_dunder=locals_hide_dunder,
+            locals_hide_sunder=locals_hide_sunder,
+        )
+
+        return cls(
+            rich_traceback,
+            width=width,
+            code_width=code_width,
+            extra_lines=extra_lines,
+            theme=theme,
+            word_wrap=word_wrap,
+            show_locals=show_locals,
+            indent_guides=indent_guides,
+            locals_max_length=locals_max_length,
+            locals_max_string=locals_max_string,
+            locals_hide_dunder=locals_hide_dunder,
+            locals_hide_sunder=locals_hide_sunder,
+            suppress=suppress,
+            max_frames=max_frames,
+        )
+
+    @classmethod
+    def extract(
+        cls,
+        exc_type: Type[BaseException],
+        exc_value: BaseException,
+        traceback: Optional[TracebackType],
+        *,
+        show_locals: bool = False,
+        locals_max_length: int = LOCALS_MAX_LENGTH,
+        locals_max_string: int = LOCALS_MAX_STRING,
+        locals_hide_dunder: bool = True,
+        locals_hide_sunder: bool = False,
+    ) -> Trace:
+        """Extract traceback information.
+
+        Args:
+            exc_type (Type[BaseException]): Exception type.
+            exc_value (BaseException): Exception value.
+            traceback (TracebackType): Python Traceback object.
+            show_locals (bool, optional): Enable display of local variables. Defaults to False.
+            locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
+                Defaults to 10.
+            locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
+            locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True.
+            locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False.
+
+        Returns:
+            Trace: A Trace instance which you can use to construct a `Traceback`.
+        """
+
+        stacks: List[Stack] = []
+        is_cause = False
+
+        from rich import _IMPORT_CWD
+
+        notes: List[str] = getattr(exc_value, "__notes__", None) or []
+
+        def safe_str(_object: Any) -> str:
+            """Don't allow exceptions from __str__ to propagate."""
+            try:
+                return str(_object)
+            except Exception:
+                return "<exception str() failed>"
+
+        while True:
+            stack = Stack(
+                exc_type=safe_str(exc_type.__name__),
+                exc_value=safe_str(exc_value),
+                is_cause=is_cause,
+                notes=notes,
+            )
+
+            if sys.version_info >= (3, 11):
+                if isinstance(exc_value, (BaseExceptionGroup, ExceptionGroup)):
+                    stack.is_group = True
+                    for exception in exc_value.exceptions:
+                        stack.exceptions.append(
+                            Traceback.extract(
+                                type(exception),
+                                exception,
+                                exception.__traceback__,
+                                show_locals=show_locals,
+                                locals_max_length=locals_max_length,
+                                locals_hide_dunder=locals_hide_dunder,
+                                locals_hide_sunder=locals_hide_sunder,
+                            )
+                        )
+
+            if isinstance(exc_value, SyntaxError):
+                stack.syntax_error = _SyntaxError(
+                    offset=exc_value.offset or 0,
+                    filename=exc_value.filename or "?",
+                    lineno=exc_value.lineno or 0,
+                    line=exc_value.text or "",
+                    msg=exc_value.msg,
+                    notes=notes,
+                )
+
+            stacks.append(stack)
+            append = stack.frames.append
+
+            def get_locals(
+                iter_locals: Iterable[Tuple[str, object]],
+            ) -> Iterable[Tuple[str, object]]:
+                """Extract locals from an iterator of key pairs."""
+                if not (locals_hide_dunder or locals_hide_sunder):
+                    yield from iter_locals
+                    return
+                for key, value in iter_locals:
+                    if locals_hide_dunder and key.startswith("__"):
+                        continue
+                    if locals_hide_sunder and key.startswith("_"):
+                        continue
+                    yield key, value
+
+            for frame_summary, line_no in walk_tb(traceback):
+                filename = frame_summary.f_code.co_filename
+
+                last_instruction: Optional[Tuple[Tuple[int, int], Tuple[int, int]]]
+                last_instruction = None
+                if sys.version_info >= (3, 11):
+                    instruction_index = frame_summary.f_lasti // 2
+                    instruction_position = next(
+                        islice(
+                            frame_summary.f_code.co_positions(),
+                            instruction_index,
+                            instruction_index + 1,
+                        )
+                    )
+                    (
+                        start_line,
+                        end_line,
+                        start_column,
+                        end_column,
+                    ) = instruction_position
+                    if (
+                        start_line is not None
+                        and end_line is not None
+                        and start_column is not None
+                        and end_column is not None
+                    ):
+                        last_instruction = (
+                            (start_line, start_column),
+                            (end_line, end_column),
+                        )
+
+                if filename and not filename.startswith("<"):
+                    if not os.path.isabs(filename):
+                        filename = os.path.join(_IMPORT_CWD, filename)
+                if frame_summary.f_locals.get("_rich_traceback_omit", False):
+                    continue
+
+                frame = Frame(
+                    filename=filename or "?",
+                    lineno=line_no,
+                    name=frame_summary.f_code.co_name,
+                    locals=(
+                        {
+                            key: pretty.traverse(
+                                value,
+                                max_length=locals_max_length,
+                                max_string=locals_max_string,
+                            )
+                            for key, value in get_locals(frame_summary.f_locals.items())
+                            if not (inspect.isfunction(value) or inspect.isclass(value))
+                        }
+                        if show_locals
+                        else None
+                    ),
+                    last_instruction=last_instruction,
+                )
+                append(frame)
+                if frame_summary.f_locals.get("_rich_traceback_guard", False):
+                    del stack.frames[:]
+
+            cause = getattr(exc_value, "__cause__", None)
+            if cause:
+                exc_type = cause.__class__
+                exc_value = cause
+                # __traceback__ can be None, e.g. for exceptions raised by the
+                # 'multiprocessing' module
+                traceback = cause.__traceback__
+                is_cause = True
+                continue
+
+            cause = exc_value.__context__
+            if cause and not getattr(exc_value, "__suppress_context__", False):
+                exc_type = cause.__class__
+                exc_value = cause
+                traceback = cause.__traceback__
+                is_cause = False
+                continue
+            # No cover, code is reached but coverage doesn't recognize it.
+            break  # pragma: no cover
+
+        trace = Trace(stacks=stacks)
+
+        return trace
+
+    def __rich_console__(
+        self, console: Console, options: ConsoleOptions
+    ) -> RenderResult:
+        theme = self.theme
+        background_style = theme.get_background_style()
+        token_style = theme.get_style_for_token
+
+        traceback_theme = Theme(
+            {
+                "pretty": token_style(TextToken),
+                "pygments.text": token_style(Token),
+                "pygments.string": token_style(String),
+                "pygments.function": token_style(Name.Function),
+                "pygments.number": token_style(Number),
+                "repr.indent": token_style(Comment) + Style(dim=True),
+                "repr.str": token_style(String),
+                "repr.brace": token_style(TextToken) + Style(bold=True),
+                "repr.number": token_style(Number),
+                "repr.bool_true": token_style(Keyword.Constant),
+                "repr.bool_false": token_style(Keyword.Constant),
+                "repr.none": token_style(Keyword.Constant),
+                "scope.border": token_style(String.Delimiter),
+                "scope.equals": token_style(Operator),
+                "scope.key": token_style(Name),
+                "scope.key.special": token_style(Name.Constant) + Style(dim=True),
+            },
+            inherit=False,
+        )
+
+        highlighter = ReprHighlighter()
+
+        @group()
+        def render_stack(stack: Stack, last: bool) -> RenderResult:
+            if stack.frames:
+                stack_renderable: ConsoleRenderable = Panel(
+                    self._render_stack(stack),
+                    title="[traceback.title]Traceback [dim](most recent call last)",
+                    style=background_style,
+                    border_style="traceback.border",
+                    expand=True,
+                    padding=(0, 1),
+                )
+                stack_renderable = Constrain(stack_renderable, self.width)
+                with console.use_theme(traceback_theme):
+                    yield stack_renderable
+
+            if stack.syntax_error is not None:
+                with console.use_theme(traceback_theme):
+                    yield Constrain(
+                        Panel(
+                            self._render_syntax_error(stack.syntax_error),
+                            style=background_style,
+                            border_style="traceback.border.syntax_error",
+                            expand=True,
+                            padding=(0, 1),
+                            width=self.width,
+                        ),
+                        self.width,
+                    )
+                yield Text.assemble(
+                    (f"{stack.exc_type}: ", "traceback.exc_type"),
+                    highlighter(stack.syntax_error.msg),
+                )
+            elif stack.exc_value:
+                yield Text.assemble(
+                    (f"{stack.exc_type}: ", "traceback.exc_type"),
+                    highlighter(stack.exc_value),
+                )
+            else:
+                yield Text.assemble((f"{stack.exc_type}", "traceback.exc_type"))
+
+            for note in stack.notes:
+                yield Text.assemble(("[NOTE] ", "traceback.note"), highlighter(note))
+
+            if stack.is_group:
+                for group_no, group_exception in enumerate(stack.exceptions, 1):
+                    grouped_exceptions: List[Group] = []
+                    for group_last, group_stack in loop_last(group_exception.stacks):
+                        grouped_exceptions.append(render_stack(group_stack, group_last))
+                    yield ""
+                    yield Constrain(
+                        Panel(
+                            Group(*grouped_exceptions),
+                            title=f"Sub-exception #{group_no}",
+                            border_style="traceback.group.border",
+                        ),
+                        self.width,
+                    )
+
+            if not last:
+                if stack.is_cause:
+                    yield Text.from_markup(
+                        "\n[i]The above exception was the direct cause of the following exception:\n",
+                    )
+                else:
+                    yield Text.from_markup(
+                        "\n[i]During handling of the above exception, another exception occurred:\n",
+                    )
+
+        for last, stack in loop_last(reversed(self.trace.stacks)):
+            yield render_stack(stack, last)
+
+    @group()
+    def _render_syntax_error(self, syntax_error: _SyntaxError) -> RenderResult:
+        highlighter = ReprHighlighter()
+        path_highlighter = PathHighlighter()
+        if syntax_error.filename != "<stdin>":
+            if os.path.exists(syntax_error.filename):
+                text = Text.assemble(
+                    (f" {syntax_error.filename}", "pygments.string"),
+                    (":", "pygments.text"),
+                    (str(syntax_error.lineno), "pygments.number"),
+                    style="pygments.text",
+                )
+                yield path_highlighter(text)
+        syntax_error_text = highlighter(syntax_error.line.rstrip())
+        syntax_error_text.no_wrap = True
+        offset = min(syntax_error.offset - 1, len(syntax_error_text))
+        syntax_error_text.stylize("bold underline", offset, offset)
+        syntax_error_text += Text.from_markup(
+            "\n" + " " * offset + "[traceback.offset]▲[/]",
+            style="pygments.text",
+        )
+        yield syntax_error_text
+
+    @classmethod
+    def _guess_lexer(cls, filename: str, code: str) -> str:
+        ext = os.path.splitext(filename)[-1]
+        if not ext:
+            # No extension, look at first line to see if it is a hashbang
+            # Note, this is an educated guess and not a guarantee
+            # If it fails, the only downside is that the code is highlighted strangely
+            new_line_index = code.index("\n")
+            first_line = code[:new_line_index] if new_line_index != -1 else code
+            if first_line.startswith("#!") and "python" in first_line.lower():
+                return "python"
+        try:
+            return cls.LEXERS.get(ext) or guess_lexer_for_filename(filename, code).name
+        except ClassNotFound:
+            return "text"
+
+    @group()
+    def _render_stack(self, stack: Stack) -> RenderResult:
+        path_highlighter = PathHighlighter()
+        theme = self.theme
+
+        def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]:
+            if frame.locals:
+                yield render_scope(
+                    frame.locals,
+                    title="locals",
+                    indent_guides=self.indent_guides,
+                    max_length=self.locals_max_length,
+                    max_string=self.locals_max_string,
+                )
+
+        exclude_frames: Optional[range] = None
+        if self.max_frames != 0:
+            exclude_frames = range(
+                self.max_frames // 2,
+                len(stack.frames) - self.max_frames // 2,
+            )
+
+        excluded = False
+        for frame_index, frame in enumerate(stack.frames):
+            if exclude_frames and frame_index in exclude_frames:
+                excluded = True
+                continue
+
+            if excluded:
+                assert exclude_frames is not None
+                yield Text(
+                    f"\n... {len(exclude_frames)} frames hidden ...",
+                    justify="center",
+                    style="traceback.error",
+                )
+                excluded = False
+
+            first = frame_index == 0
+            frame_filename = frame.filename
+            suppressed = any(frame_filename.startswith(path) for path in self.suppress)
+
+            if os.path.exists(frame.filename):
+                text = Text.assemble(
+                    path_highlighter(Text(frame.filename, style="pygments.string")),
+                    (":", "pygments.text"),
+                    (str(frame.lineno), "pygments.number"),
+                    " in ",
+                    (frame.name, "pygments.function"),
+                    style="pygments.text",
+                )
+            else:
+                text = Text.assemble(
+                    "in ",
+                    (frame.name, "pygments.function"),
+                    (":", "pygments.text"),
+                    (str(frame.lineno), "pygments.number"),
+                    style="pygments.text",
+                )
+            if not frame.filename.startswith("<") and not first:
+                yield ""
+            yield text
+            if frame.filename.startswith("<"):
+                yield from render_locals(frame)
+                continue
+            if not suppressed:
+                try:
+                    code_lines = linecache.getlines(frame.filename)
+                    code = "".join(code_lines)
+                    if not code:
+                        # code may be an empty string if the file doesn't exist, OR
+                        # if the traceback filename is generated dynamically
+                        continue
+                    lexer_name = self._guess_lexer(frame.filename, code)
+                    syntax = Syntax(
+                        code,
+                        lexer_name,
+                        theme=theme,
+                        line_numbers=True,
+                        line_range=(
+                            frame.lineno - self.extra_lines,
+                            frame.lineno + self.extra_lines,
+                        ),
+                        highlight_lines={frame.lineno},
+                        word_wrap=self.word_wrap,
+                        code_width=self.code_width,
+                        indent_guides=self.indent_guides,
+                        dedent=False,
+                    )
+                    yield ""
+                except Exception as error:
+                    yield Text.assemble(
+                        (f"\n{error}", "traceback.error"),
+                    )
+                else:
+                    if frame.last_instruction is not None:
+                        start, end = frame.last_instruction
+
+                        # Stylize a line at a time
+                        # So that indentation isn't underlined (which looks bad)
+                        for line1, column1, column2 in _iter_syntax_lines(start, end):
+                            try:
+                                if column1 == 0:
+                                    line = code_lines[line1 - 1]
+                                    column1 = len(line) - len(line.lstrip())
+                                if column2 == -1:
+                                    column2 = len(code_lines[line1 - 1])
+                            except IndexError:
+                                # Being defensive here
+                                # If last_instruction reports a line out-of-bounds, we don't want to crash
+                                continue
+
+                            syntax.stylize_range(
+                                style="traceback.error_range",
+                                start=(line1, column1),
+                                end=(line1, column2),
+                            )
+                    yield (
+                        Columns(
+                            [
+                                syntax,
+                                *render_locals(frame),
+                            ],
+                            padding=1,
+                        )
+                        if frame.locals
+                        else syntax
+                    )
+
+
+if __name__ == "__main__":  # pragma: no cover
+    install(show_locals=True)
+    import sys
+
+    def bar(
+        a: Any,
+    ) -> None:  # 这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑
+        one = 1
+        print(one / a)
+
+    def foo(a: Any) -> None:
+        _rich_traceback_guard = True
+        zed = {
+            "characters": {
+                "Paul Atreides",
+                "Vladimir Harkonnen",
+                "Thufir Hawat",
+                "Duncan Idaho",
+            },
+            "atomic_types": (None, False, True),
+        }
+        bar(a)
+
+    def error() -> None:
+        foo(0)
+
+    error()
diff --git a/.venv/Lib/site-packages/rich/tree.py b/.venv/Lib/site-packages/rich/tree.py
new file mode 100644 (file)
index 0000000..9a87d60
--- /dev/null
@@ -0,0 +1,257 @@
+from typing import Iterator, List, Optional, Tuple
+
+from ._loop import loop_first, loop_last
+from .console import Console, ConsoleOptions, RenderableType, RenderResult
+from .jupyter import JupyterMixin
+from .measure import Measurement
+from .segment import Segment
+from .style import Style, StyleStack, StyleType
+from .styled import Styled
+
+GuideType = Tuple[str, str, str, str]
+
+
+class Tree(JupyterMixin):
+    """A renderable for a tree structure.
+
+    Attributes:
+        ASCII_GUIDES (GuideType): Guide lines used when Console.ascii_only is True.
+        TREE_GUIDES (List[GuideType, GuideType, GuideType]): Default guide lines.
+
+    Args:
+        label (RenderableType): The renderable or str for the tree label.
+        style (StyleType, optional): Style of this tree. Defaults to "tree".
+        guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line".
+        expanded (bool, optional): Also display children. Defaults to True.
+        highlight (bool, optional): Highlight renderable (if str). Defaults to False.
+        hide_root (bool, optional): Hide the root node. Defaults to False.
+    """
+
+    ASCII_GUIDES = ("    ", "|   ", "+-- ", "`-- ")
+    TREE_GUIDES = [
+        ("    ", "│   ", "├── ", "└── "),
+        ("    ", "┃   ", "┣━━ ", "┗━━ "),
+        ("    ", "║   ", "╠══ ", "╚══ "),
+    ]
+
+    def __init__(
+        self,
+        label: RenderableType,
+        *,
+        style: StyleType = "tree",
+        guide_style: StyleType = "tree.line",
+        expanded: bool = True,
+        highlight: bool = False,
+        hide_root: bool = False,
+    ) -> None:
+        self.label = label
+        self.style = style
+        self.guide_style = guide_style
+        self.children: List[Tree] = []
+        self.expanded = expanded
+        self.highlight = highlight
+        self.hide_root = hide_root
+
+    def add(
+        self,
+        label: RenderableType,
+        *,
+        style: Optional[StyleType] = None,
+        guide_style: Optional[StyleType] = None,
+        expanded: bool = True,
+        highlight: Optional[bool] = False,
+    ) -> "Tree":
+        """Add a child tree.
+
+        Args:
+            label (RenderableType): The renderable or str for the tree label.
+            style (StyleType, optional): Style of this tree. Defaults to "tree".
+            guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line".
+            expanded (bool, optional): Also display children. Defaults to True.
+            highlight (Optional[bool], optional): Highlight renderable (if str). Defaults to False.
+
+        Returns:
+            Tree: A new child Tree, which may be further modified.
+        """
+        node = Tree(
+            label,
+            style=self.style if style is None else style,
+            guide_style=self.guide_style if guide_style is None else guide_style,
+            expanded=expanded,
+            highlight=self.highlight if highlight is None else highlight,
+        )
+        self.children.append(node)
+        return node
+
+    def __rich_console__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "RenderResult":
+        stack: List[Iterator[Tuple[bool, Tree]]] = []
+        pop = stack.pop
+        push = stack.append
+        new_line = Segment.line()
+
+        get_style = console.get_style
+        null_style = Style.null()
+        guide_style = get_style(self.guide_style, default="") or null_style
+        SPACE, CONTINUE, FORK, END = range(4)
+
+        _Segment = Segment
+
+        def make_guide(index: int, style: Style) -> Segment:
+            """Make a Segment for a level of the guide lines."""
+            if options.ascii_only:
+                line = self.ASCII_GUIDES[index]
+            else:
+                guide = 1 if style.bold else (2 if style.underline2 else 0)
+                line = self.TREE_GUIDES[0 if options.legacy_windows else guide][index]
+            return _Segment(line, style)
+
+        levels: List[Segment] = [make_guide(CONTINUE, guide_style)]
+        push(iter(loop_last([self])))
+
+        guide_style_stack = StyleStack(get_style(self.guide_style))
+        style_stack = StyleStack(get_style(self.style))
+        remove_guide_styles = Style(bold=False, underline2=False)
+
+        depth = 0
+
+        while stack:
+            stack_node = pop()
+            try:
+                last, node = next(stack_node)
+            except StopIteration:
+                levels.pop()
+                if levels:
+                    guide_style = levels[-1].style or null_style
+                    levels[-1] = make_guide(FORK, guide_style)
+                    guide_style_stack.pop()
+                    style_stack.pop()
+                continue
+            push(stack_node)
+            if last:
+                levels[-1] = make_guide(END, levels[-1].style or null_style)
+
+            guide_style = guide_style_stack.current + get_style(node.guide_style)
+            style = style_stack.current + get_style(node.style)
+            prefix = levels[(2 if self.hide_root else 1) :]
+            renderable_lines = console.render_lines(
+                Styled(node.label, style),
+                options.update(
+                    width=options.max_width
+                    - sum(level.cell_length for level in prefix),
+                    highlight=self.highlight,
+                    height=None,
+                ),
+                pad=options.justify is not None,
+            )
+
+            if not (depth == 0 and self.hide_root):
+                for first, line in loop_first(renderable_lines):
+                    if prefix:
+                        yield from _Segment.apply_style(
+                            prefix,
+                            style.background_style,
+                            post_style=remove_guide_styles,
+                        )
+                    yield from line
+                    yield new_line
+                    if first and prefix:
+                        prefix[-1] = make_guide(
+                            SPACE if last else CONTINUE, prefix[-1].style or null_style
+                        )
+
+            if node.expanded and node.children:
+                levels[-1] = make_guide(
+                    SPACE if last else CONTINUE, levels[-1].style or null_style
+                )
+                levels.append(
+                    make_guide(END if len(node.children) == 1 else FORK, guide_style)
+                )
+                style_stack.push(get_style(node.style))
+                guide_style_stack.push(get_style(node.guide_style))
+                push(iter(loop_last(node.children)))
+                depth += 1
+
+    def __rich_measure__(
+        self, console: "Console", options: "ConsoleOptions"
+    ) -> "Measurement":
+        stack: List[Iterator[Tree]] = [iter([self])]
+        pop = stack.pop
+        push = stack.append
+        minimum = 0
+        maximum = 0
+        measure = Measurement.get
+        level = 0
+        while stack:
+            iter_tree = pop()
+            try:
+                tree = next(iter_tree)
+            except StopIteration:
+                level -= 1
+                continue
+            push(iter_tree)
+            min_measure, max_measure = measure(console, options, tree.label)
+            indent = level * 4
+            minimum = max(min_measure + indent, minimum)
+            maximum = max(max_measure + indent, maximum)
+            if tree.expanded and tree.children:
+                push(iter(tree.children))
+                level += 1
+        return Measurement(minimum, maximum)
+
+
+if __name__ == "__main__":  # pragma: no cover
+    from rich.console import Group
+    from rich.markdown import Markdown
+    from rich.panel import Panel
+    from rich.syntax import Syntax
+    from rich.table import Table
+
+    table = Table(row_styles=["", "dim"])
+
+    table.add_column("Released", style="cyan", no_wrap=True)
+    table.add_column("Title", style="magenta")
+    table.add_column("Box Office", justify="right", style="green")
+
+    table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690")
+    table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347")
+    table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889")
+    table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889")
+
+    code = """\
+class Segment(NamedTuple):
+    text: str = ""
+    style: Optional[Style] = None
+    is_control: bool = False
+"""
+    syntax = Syntax(code, "python", theme="monokai", line_numbers=True)
+
+    markdown = Markdown(
+        """\
+### example.md
+> Hello, World!
+>
+> Markdown _all_ the things
+"""
+    )
+
+    root = Tree("🌲 [b green]Rich Tree", highlight=True, hide_root=True)
+
+    node = root.add(":file_folder: Renderables", guide_style="red")
+    simple_node = node.add(":file_folder: [bold yellow]Atomic", guide_style="uu green")
+    simple_node.add(Group("📄 Syntax", syntax))
+    simple_node.add(Group("📄 Markdown", Panel(markdown, border_style="green")))
+
+    containers_node = node.add(
+        ":file_folder: [bold magenta]Containers", guide_style="bold magenta"
+    )
+    containers_node.expanded = True
+    panel = Panel.fit("Just a panel", border_style="red")
+    containers_node.add(Group("📄 Panels", panel))
+
+    containers_node.add(Group("📄 [b magenta]Table", table))
+
+    console = Console()
+
+    console.print(root)
diff --git a/.venv/Scripts/markdown-it.exe b/.venv/Scripts/markdown-it.exe
new file mode 100644 (file)
index 0000000..cb0e1ae
Binary files /dev/null and b/.venv/Scripts/markdown-it.exe differ
diff --git a/.venv/Scripts/pygmentize.exe b/.venv/Scripts/pygmentize.exe
new file mode 100644 (file)
index 0000000..2349588
Binary files /dev/null and b/.venv/Scripts/pygmentize.exe differ
diff --git a/SOP/Handoff-FlaskBenchmarkStall.md b/SOP/Handoff-FlaskBenchmarkStall.md
new file mode 100644 (file)
index 0000000..24138b5
--- /dev/null
@@ -0,0 +1,98 @@
+# Handoff: Flask Benchmark Stalling Issue
+
+---
+
+## 1 · Affected Files
+
+| Path                                 | Purpose                                                                                                    |
+| ------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
+| `SOP/Handoff-FlaskBenchmarkStall.md` | This handoff document                                                                                      |
+| `show_benchmark_table.py`            | Orchestrates server startup/shutdown, runs benchmarks, parses results. Flask test fails under this script. |
+| `benchmark/run_benchmark.py`         | Client script that sends HTTP requests. Flask requests time out when called by `show_benchmark_table.py`.  |
+| `app_flask/flask_application.py`     | The Flask server application that becomes unresponsive.                                                    |
+| `app_fastapi/app.py`                 | FastAPI application (for comparison, works correctly).                                                     |
+
+---
+
+## 2 · Problem Statement
+
+**What's wrong:**
+The Flask server (`app_flask/flask_application.py`), when started and benchmarked automatically by `show_benchmark_table.py`, becomes unresponsive after processing approximately 52-53 requests. The client script (`benchmark/run_benchmark.py`) then experiences `requests.exceptions.ReadTimeout` for all subsequent requests to the Flask server.
+
+**Symptoms / error messages:**
+
+- Benchmark client output (from `benchmark/run_benchmark.py` via `show_benchmark_table.py`):
+  `Request to http://127.0.0.1:3000/ failed: HTTPConnectionPool(host='127.0.0.1', port=3000): Read timed out. (read timeout=5)` for requests ~53 through 100.
+- `show_benchmark_table.py` diagnostic STDOUT lines confirm this:
+  `[DIAG-SBT-STDOUT] Line 111: '[DIAG-BRB-FLASK] Request 52 result: 200'`
+  `[DIAG-SBT-STDOUT] Line 112: '[DIAG-BRB-FLASK] Processing request 53/100'`
+  `[DIAG-SBT-STDOUT] Line 113: 'Request to http://127.0.0.1:3000/ failed: HTTPConnectionPool(host='127.0.0.1', port=3000): Read timed out. (read timeout=5)'`
+  `[DIAG-SBT-STDOUT] Line 114: '[DIAG-BRB-FLASK] Request 53 result: None'`
+- The Flask server itself provides no error messages on its console output when it becomes unresponsive; it simply stops processing new requests.
+
+**Expected vs. actual behaviour:**
+
+- **Expected:** The Flask server should handle all 100 requests successfully when benchmarked by `show_benchmark_table.py`. The script should report approximately 100 successful requests for Flask. This matches the behavior when `benchmark/run_benchmark.py flask` is executed manually against a manually started Flask server (100/100 successful).
+- **Actual:** The Flask server handles ~52 requests then stops responding. `show_benchmark_table.py` reports ~52 successful requests, with the remaining ~48 requests failing due to timeouts.
+
+**Business or user impact (severity & priority):**
+The automated benchmark for Flask is unreliable and does not complete. This prevents an accurate performance comparison with FastAPI using the automated test harness, which is a key goal of the project.
+
+- Severity: High (for the benchmarking task)
+- Priority: High
+
+---
+
+## 3 · Reproduction Steps
+
+1.  Ensure the Flask server (`app_flask/flask_application.py`) and FastAPI server (`app_fastapi/app.py`) are not already running manually.
+2.  Open a terminal in the project root directory (`/c%3A/Users/Sam/Desktop/Side%20Projects/FastAPI%20vs%20Flask/Hacker%20Dojo`).
+3.  Ensure the Python virtual environment (e.g., `(.venv)`) is activated.
+4.  Execute the command: `python show_benchmark_table.py`.
+5.  Observe the console output. The FastAPI benchmark should complete successfully.
+6.  During the Flask benchmark portion, observe that requests are processed normally up to approximately request #52.
+7.  After request #52, the script will begin logging `Read timed out` errors for subsequent requests to the Flask server. The "Flask progress" messages will show that the count of successful requests plateaus around 52.
+
+---
+
+## 4 · Attempted Solutions & Findings
+
+| Attempt                                           | Key Changes Made                                                                                                                                                                          | Outcome / Remaining Issue                                                                                                                                                                                                                |
+| :------------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| #1: Initial Automated Benchmark (Threaded Client) | Flask server started/stopped by `show_benchmark_table.py`. Benchmark client in `benchmark/run_benchmark.py` used `ThreadPoolExecutor` with `max_workers=100`.                             | Flask benchmark hung indefinitely after ~50-52 requests. Client did not initially have explicit timeouts, so it just waited.                                                                                                             |
+| #2: Client-Side Timeout Added                     | Added `timeout=5` to `requests.get()` in `fetch_url_sync` function within `benchmark/run_benchmark.py`.                                                                                   | Revealed that the client was hanging because the Flask server became unresponsive. Requests from ~53 onwards explicitly timed out. This fixed the client hanging but not the server unresponsiveness.                                    |
+| #3: Sequential Client-Side Requests (Diagnosis)   | Modified `run_flask_benchmark` in `benchmark/run_benchmark.py` to use a simple sequential `for` loop for sending requests, instead of `ThreadPoolExecutor`.                               | Confirmed the issue is not primarily client-side threading. The Flask server still became unresponsive after ~52 requests, and subsequent requests (~53+) timed out even with the sequential client.                                     |
+| #4: One-Time Stabilization Pause for Flask Server | Added a `time.sleep(3)` in `show_benchmark_table.py` (within `run_test_scenario`) immediately after the Flask server was confirmed to be started and before the benchmark script was run. | This did not resolve the issue. The Flask server still becomes unresponsive after ~52 requests when managed by `show_benchmark_table.py`. The failure point remained consistent (last successful request is #52, timeout starts at #53). |
+
+**Current blockers / unknowns:**
+
+- The primary unknown is why the Flask development server (single-threaded, `threaded=False`, Werkzeug-based) becomes unresponsive after ~52 requests _only when_ its lifecycle (start/stop) is managed by the `show_benchmark_table.py` script using `subprocess.Popen`. Manual execution of the benchmark against a manually started Flask server completes successfully.
+- Is there a resource leak, an internal connection queue limit, or another issue within the Flask development server (or Werkzeug) that is specifically triggered by the rapid automated start-test-stop cycle or by the interaction with `subprocess.Popen` as configured?
+- The Flask server does not output any error messages or warnings to its console when it hangs/becomes unresponsive.
+
+---
+
+## 5 · Developer Instructions
+
+**Goal:** Identify the root cause of the Flask development server becoming unresponsive after ~52 requests when managed by `show_benchmark_table.py`. Implement a sustainable fix to allow the Flask benchmark to complete all 100 requests successfully under this automated test harness.
+
+1.  **Review Code:** Thoroughly examine the _Affected Files_ listed above, particularly how `show_benchmark_table.py` manages the Flask server process and how `benchmark/run_benchmark.py` interacts with it.
+2.  **Trace Execution:** Understand the full execution path from `show_benchmark_table.py` initiating the Flask server, through `benchmark/run_benchmark.py` making HTTP requests, up to the point of failure.
+3.  **Investigate Potential Causes:**
+    - **Flask/Werkzeug Internals:** Research if Flask's built-in Werkzeug development server has any known limitations on concurrent connections, request queues, or resource handling that might be triggered by ~50 rapid requests, especially when programmatically started/stopped.
+    - **Socket/Resource Issues:** While `threaded=False` is used, investigate if there's any subtle socket exhaustion or OS-level resource issue affecting the Flask process when run via `subprocess`.
+    - **`subprocess.Popen` Interaction:** Analyze if the specific way `show_benchmark_table.py` uses `subprocess.Popen` (including PIPE usage for stdout/stderr) could be affecting the Flask server's stability under load. Consider if different Popen configurations or process group handling might be necessary.
+    - **Enhanced Server Logging:** Attempt to increase the verbosity of logging from Flask and Werkzeug. This might require modifying `app_flask/flask_application.py` or how the app is run to get more detailed internal state or error messages from the server side just before it hangs.
+    - **Alternative WSGI Server (for diagnosis):** As a diagnostic step, temporarily replace Flask's development server with a more production-like WSGI server that is Windows-compatible (e.g., `waitress`). Modify `show_benchmark_table.py` to start Flask with `waitress` and see if the problem persists. This can help isolate if the issue is specific to the Werkzeug dev server.
+    - **Connection Keep-Alive:** Investigate if HTTP connection keep-alive behavior between `requests` (client) and Flask (server) plays a role. Though `requests` typically handles sessions, the rapid succession of individual `requests.get()` calls might interact differently than fewer, longer-lived sessions.
+4.  **Propose and Implement Solution:** Based on findings, implement a robust solution. This could involve:
+    - Adjusting Flask application or Werkzeug server options (if suitable options exist).
+    - Modifying how `show_benchmark_table.py` launches or manages the Flask server process.
+    - Minor, justified changes to the client request pattern if it's found to trigger a specific server bug (less likely, as manual client run works).
+5.  **Verify:** Ensure the solution allows `show_benchmark_table.py` to successfully run both Flask and FastAPI benchmarks to completion (100 requests each) and report accurate results.
+6.  **Document:** Update this handoff document with detailed findings, the rationale for the chosen solution, any trade-offs, and potential side effects.
+7.  **Testing:** Ensure existing tests (if any) pass, and consider if new tests are needed for the fix.
+
+---
+
+_End of Handoff-FlaskBenchmarkStall.md_
index a12b7f3b44a4d26a4f6d0901b775417de03e3922..b0f8d18f21c68828675227d10e6ed8b15d9c6294 100644 (file)
Binary files a/app_fastapi/__pycache__/app.cpython-312.pyc and b/app_fastapi/__pycache__/app.cpython-312.pyc differ
index 8a1936c1ba08a603cce7246916f723f5cde8187c..554881d59d81918558c9ca1e236b538302e60f03 100644 (file)
@@ -6,6 +6,6 @@ app = FastAPI()
 
 @app.get("/")
 async def home():
-    await asyncio.sleep(3)  # simulate slow work (non-blocking)
-    html = "<h1>FastAPI Server: 3-Seconds Artificial Delay Demo</h1>"
+    await asyncio.sleep(0.3)  # simulate slow work (non-blocking, changed from 3s to 0.3s)
+    html = "<h1>FastAPI Server: 0.3-Seconds Artificial Delay Demo</h1>"
     return Response(content=html, media_type="text/html") 
\ No newline at end of file
index 33f48d8604e5651c1b540b9ba06cad5bbc47603d..904643e8beb775e94fdb8639313a25a78fbf1d67 100644 (file)
@@ -16,7 +16,7 @@ def home():
     start_time = datetime.now()
     print(f"[Flask Server] Request {request_id} received at {start_time.strftime('%Y-%m-%d %H:%M:%S.%f')}")
     
-    time.sleep(3)                # simulate slow work
+    time.sleep(0.3)                # simulate slow work
     
     end_time = datetime.now()
     processing_time = (end_time - start_time).total_seconds()
index 3d199817b52c30ff19e3def7ab326a678e437fb4..06508e7b46b1ba708bc3156583e23e429e9cfd30 100644 (file)
@@ -4,7 +4,8 @@ import time
 import asyncio
 import httpx
 import requests
-from concurrent.futures import ThreadPoolExecutor
+from concurrent.futures import ThreadPoolExecutor, as_completed
+import sys # Added for sys.stdout.flush()
 
 # Server URLs (ensure these match your running servers)
 FLASK_URL = "http://127.0.0.1:3000/"
@@ -13,7 +14,7 @@ NUM_REQUESTS = 100
 
 def fetch_url_sync(url):
     try:
-        response = requests.get(url) # REMOVED timeout=10
+        response = requests.get(url, timeout=5) # Added timeout to prevent hanging
         response.raise_for_status() # Raise an exception for bad status codes
         return response.status_code
     except requests.exceptions.RequestException as e:
@@ -22,16 +23,32 @@ def fetch_url_sync(url):
 
 def run_flask_benchmark():
     print(f"Starting Flask benchmark: {NUM_REQUESTS} requests to {FLASK_URL}...")
+    print("[DIAG-BRB-FLASK] Running requests SEQUENTIALLY for diagnosis.", flush=True)
     start_time = time.perf_counter()
     
-    with ThreadPoolExecutor(max_workers=NUM_REQUESTS) as executor:
-        futures = [executor.submit(fetch_url_sync, FLASK_URL) for _ in range(NUM_REQUESTS)]
-        results = [future.result() for future in futures]
+    results_list = []
+    successful_so_far = 0
+
+    for i in range(NUM_REQUESTS):
+        print(f"[DIAG-BRB-FLASK] Processing request {i+1}/{NUM_REQUESTS}", flush=True)
+        try:
+            status_code = fetch_url_sync(FLASK_URL) # Direct call
+            results_list.append(status_code)
+            if status_code == 200:
+                successful_so_far += 1
+            print(f"[DIAG-BRB-FLASK] Request {i+1} result: {status_code}", flush=True)
+        except Exception as e:
+            print(f"[DIAG-BRB-FLASK] Request {i+1} generated an exception: {e}", flush=True)
+            results_list.append(None)
+
+        if (i + 1) % 10 == 0 and (i + 1) < NUM_REQUESTS:
+            print(f"Flask progress: Handled {i+1}/{NUM_REQUESTS} requests... ({successful_so_far} successful so far)")
+            sys.stdout.flush()
     
     end_time = time.perf_counter()
     total_time = end_time - start_time
-    successful_requests = sum(1 for r in results if r == 200)
-    print(f"Flask benchmark: {successful_requests}/{NUM_REQUESTS} successful requests in {total_time:.2f} seconds.")
+    successful_requests = sum(1 for r in results_list if r == 200)
+    print(f"Final Flask benchmark summary: {successful_requests}/{NUM_REQUESTS} successful requests in {total_time:.2f} seconds.")
     return total_time
 
 async def fetch_url_async(client, url):
diff --git a/o3.txt b/o3.txt
new file mode 100644 (file)
index 0000000..4cd7626
--- /dev/null
+++ b/o3.txt
@@ -0,0 +1,221 @@
+### 🔍 Root cause
+
+The Flask server doesn’t “stall” because of Flask itself—it blocks on its own **`stdout`/`stderr` pipe**.
+
+* `show_benchmark_table.py` starts the Flask app with
+
+  ````python
+  subprocess.Popen(..., stdout=subprocess.PIPE, stderr=subprocess.PIPE)  # two pipes
+  ``` :contentReference[oaicite:0]{index=0}  
+  ````
+* `flask_application.py` prints **two lines per request** (request-received / request-finished).&#x20;
+* Because `show_benchmark_table.py` never reads those pipes, the OS-level pipe buffer (≈ 64 kB on Windows) fills after \~50 prints.
+* When the buffer is full the child process blocks on the very next `print`, so from the outside it looks as if the server “hangs” after request ≈ 52.
+
+The same Flask instance runs perfectly when started manually because its `stdout` inherits the console (no pipe, so no blocking).
+
+---
+
+### ✅ Fix
+
+**Don’t pipe the Flask server’s output unless you actively drain it.**
+The quickest / simplest change: replace the two `PIPE`s with `None` (inherit parent console) or `subprocess.DEVNULL`.
+
+```python
+# --- in show_benchmark_table.py ----------------------------------------
+def start_server(command_args, health_check_url, server_name, cwd=None):
+    """Starts a server as a subprocess and waits for it to be ready."""
+    console.print(f"[yellow]Starting {server_name} server...[/yellow]")
+
+    # choose how to launch
+    popen_kwargs = dict(cwd=cwd, text=True)
+
+    # 🚩  STREAM HANDLING – avoid blocking
+    popen_kwargs["stdout"] = subprocess.DEVNULL        # or None
+    popen_kwargs["stderr"] = subprocess.STDOUT         # merge & discard
+
+    # handle “python -m uvicorn …” vs direct exe the same way
+    if "uvicorn" in command_args[0] and not command_args[0].endswith(".exe"):
+        process = subprocess.Popen([PYTHON_EXE, "-m"] + command_args, **popen_kwargs)
+    else:
+        process = subprocess.Popen(command_args, **popen_kwargs)
+```
+
+That’s the only change required—the benchmark then completes 100/100 requests.
+
+---
+
+### 🛠️ Full updated `show_benchmark_table.py`
+
+> One complete file, ready to overwrite the old one.
+
+```python
+import subprocess
+import time
+import re
+import requests  # pip install requests
+from rich.console import Console
+from rich.table import Table
+import sys
+import os
+
+# --- Configuration ------------------------------------------------------
+FLASK_SERVER_URL = "http://127.0.0.1:3000/"
+FASTAPI_SERVER_URL = "http://127.0.0.1:8000/"
+BENCHMARK_SCRIPT_PATH = "benchmark/run_benchmark.py"
+NUM_REQUESTS_EXPECTED = 100
+PYTHON_EXE = sys.executable
+
+# ------------------------------------------------------------------------
+console = Console()
+
+# -------------------------- helpers -------------------------------------
+def start_server(command_args, health_check_url, server_name, cwd=None):
+    """Start server and wait until a 200 health check is returned."""
+    console.print(f"[yellow]Starting {server_name} server…[/yellow]")
+
+    # --- STREAM HANDLING: inherit console so the child can always write
+    popen_kwargs = dict(cwd=cwd, text=True,
+                        stdout=subprocess.DEVNULL,
+                        stderr=subprocess.STDOUT)
+
+    # run either as  “python -m uvicorn …”  or plain exe
+    if "uvicorn" in command_args[0] and not command_args[0].endswith(".exe"):
+        process = subprocess.Popen([PYTHON_EXE, "-m"] + command_args, **popen_kwargs)
+    else:
+        process = subprocess.Popen(command_args, **popen_kwargs)
+
+    max_wait = 30
+    start_t = time.time()
+    while time.time() - start_t < max_wait:
+        try:
+            if requests.get(health_check_url, timeout=3).status_code == 200:
+                console.print(f"[green]{server_name} ready.[/green]")
+                return process
+        except requests.RequestException:
+            time.sleep(0.3)
+    console.print(f"[red]{server_name} failed to start within {max_wait}s.[/red]")
+    process.terminate()
+    return None
+
+def stop_server(proc, name):
+    if not proc:
+        return
+    console.print(f"[yellow]Stopping {name}…[/yellow]")
+    proc.terminate()
+    try:
+        proc.wait(timeout=8)
+    except subprocess.TimeoutExpired:
+        proc.kill()
+    console.print(f"[green]{name} stopped.[/green]")
+
+def run_benchmark_script(framework_arg):
+    console.print(f"Running benchmark for [bold]{framework_arg}[/bold]…")
+    cmd = [PYTHON_EXE, BENCHMARK_SCRIPT_PATH, framework_arg]
+    result = subprocess.run(cmd, text=True, capture_output=True, timeout=600)
+    if result.returncode:
+        console.print(f"[red]{framework_arg} benchmark failed.[/red]")
+        console.print(result.stderr)
+        return None
+    last_line = result.stdout.strip().splitlines()[-1]
+    return last_line
+
+def parse_benchmark(line):
+    m = re.search(r"(\d+)/(\d+) successful requests in ([\d.]+) seconds", line)
+    if not m:
+        return None
+    succ, total, tsec = map(float, m.groups())
+    return {"successful": f"{int(succ)}/{int(total)}", "total_time": tsec}
+
+def display_table(rows):
+    tbl = Table(title="Benchmark Summary", show_lines=True, header_style="bold magenta")
+    tbl.add_column("Framework", style="cyan")
+    tbl.add_column("Server", style="white")
+    tbl.add_column("Delay", style="green")
+    tbl.add_column("#Reqs", justify="right")
+    tbl.add_column("Success", justify="right")
+    tbl.add_column("Total s", justify="right", style="yellow")
+    tbl.add_column("Avg s/req", justify="right", style="blue")
+    for r in rows:
+        avg = r["total_time"] / NUM_REQUESTS_EXPECTED
+        tbl.add_row(r["framework"], r["config"], r["delay"],
+                    str(NUM_REQUESTS_EXPECTED), r["successful"],
+                    f"{r['total_time']:.2f}", f"{avg:.3f}")
+    console.print(tbl)
+
+# --------------------------- scenarios ----------------------------------
+SCENARIOS = [
+    {
+        "name": "FastAPI",
+        "config": "Uvicorn, async",
+        "delay": "0.3 s asyncio.sleep",
+        "cmd": ["uvicorn", "app_fastapi.app:app", "--host", "0.0.0.0",
+                "--port", "8000", "--log-level", "warning"],
+        "url": FASTAPI_SERVER_URL,
+        "bench_arg": "fastapi",
+    },
+    {
+        "name": "Flask",
+        "config": "Single-threaded",
+        "delay": "0.3 s time.sleep",
+        "cmd": [PYTHON_EXE, "app_flask/flask_application.py"],
+        "url": FLASK_SERVER_URL,
+        "bench_arg": "flask",
+    }
+]
+
+# ----------------------------- main -------------------------------------
+if __name__ == "__main__":
+    console.print("[bold underline]Automated Web Framework Benchmark[/bold underline]\n")
+    results = []
+    root = os.getcwd()
+
+    for i, sc in enumerate(SCENARIOS, 1):
+        console.rule(f"[cyan]Scenario {i}/{len(SCENARIOS)} – {sc['name']}[/cyan]")
+        srv = start_server(sc["cmd"], sc["url"], sc["name"], cwd=root)
+        if not srv:
+            continue
+        try:
+            if sc["name"].lower() == "flask":
+                time.sleep(2)  # tiny grace period
+            line = run_benchmark_script(sc["bench_arg"])
+            parsed = parse_benchmark(line) if line else None
+            if parsed:
+                results.append({"framework": sc["name"], "config": sc["config"],
+                                "delay": sc["delay"], **parsed})
+        finally:
+            stop_server(srv, sc["name"])
+        console.print()
+
+    if results:
+        display_table(results)
+    console.print("\n[bold]Benchmark run finished.[/bold]")
+```
+
+---
+
+### 🔄 Verification steps
+
+1. **Activate the venv**
+
+   ```powershell
+   cd "…/Hacker Dojo"
+   .\.venv\Scripts\activate
+   ```
+2. **Overwrite `show_benchmark_table.py` with the file above.**
+3. **Run benchmark again**
+
+   ```bash
+   python show_benchmark_table.py
+   ```
+
+   *Flask now reports 100/100 successful requests; FastAPI remains unchanged.*
+
+---
+
+### ✍️ Notes / future improvements
+
+* If you still want to capture server logs, start a background thread to continuously read `process.stdout` instead of discarding it.
+* To compare “fair” concurrency you might additionally test Flask with `threaded=True` or via `waitress`, but that’s independent of the stall bug we just fixed.
+
+Let me know if anything needs tweaking!
diff --git a/show_benchmark_table.py b/show_benchmark_table.py
new file mode 100644 (file)
index 0000000..e55ab14
--- /dev/null
@@ -0,0 +1,140 @@
+import subprocess
+import time
+import re
+import requests  # pip install requests
+from rich.console import Console
+from rich.table import Table
+import sys
+import os
+
+# --- Configuration ------------------------------------------------------
+FLASK_SERVER_URL = "http://127.0.0.1:3000/"
+FASTAPI_SERVER_URL = "http://127.0.0.1:8000/"
+BENCHMARK_SCRIPT_PATH = "benchmark/run_benchmark.py"
+NUM_REQUESTS_EXPECTED = 100
+PYTHON_EXE = sys.executable
+
+# ------------------------------------------------------------------------
+console = Console()
+
+# -------------------------- helpers -------------------------------------
+def start_server(command_args, health_check_url, server_name, cwd=None):
+    """Start server and wait until a 200 health check is returned."""
+    console.print(f"[yellow]Starting {server_name} server…[/yellow]")
+
+    # --- STREAM HANDLING: inherit console so the child can always write
+    popen_kwargs = dict(cwd=cwd, text=True,
+                        stdout=subprocess.DEVNULL,
+                        stderr=subprocess.STDOUT)
+
+    # run either as  "python -m uvicorn ..."  or plain exe
+    if "uvicorn" in command_args[0] and not command_args[0].endswith(".exe"):
+        process = subprocess.Popen([PYTHON_EXE, "-m"] + command_args, **popen_kwargs)
+    else:
+        process = subprocess.Popen(command_args, **popen_kwargs)
+
+    max_wait = 30
+    start_t = time.time()
+    while time.time() - start_t < max_wait:
+        try:
+            if requests.get(health_check_url, timeout=3).status_code == 200:
+                console.print(f"[green]{server_name} ready.[/green]")
+                return process
+        except requests.RequestException:
+            time.sleep(0.3)
+    console.print(f"[red]{server_name} failed to start within {max_wait}s.[/red]")
+    process.terminate()
+    return None
+
+def stop_server(proc, name):
+    if not proc:
+        return
+    console.print(f"[yellow]Stopping {name}…[/yellow]")
+    proc.terminate()
+    try:
+        proc.wait(timeout=8)
+    except subprocess.TimeoutExpired:
+        proc.kill()
+    console.print(f"[green]{name} stopped.[/green]")
+
+def run_benchmark_script(framework_arg):
+    console.print(f"Running benchmark for [bold]{framework_arg}[/bold]…")
+    cmd = [PYTHON_EXE, BENCHMARK_SCRIPT_PATH, framework_arg]
+    result = subprocess.run(cmd, text=True, capture_output=True, timeout=600)
+    if result.returncode:
+        console.print(f"[red]{framework_arg} benchmark failed.[/red]")
+        console.print(result.stderr)
+        return None
+    last_line = result.stdout.strip().splitlines()[-1]
+    return last_line
+
+def parse_benchmark(line):
+    m = re.search(r"(\d+)/(\d+) successful requests in ([\d.]+) seconds", line)
+    if not m:
+        return None
+    succ, total, tsec = map(float, m.groups())
+    return {"successful": f"{int(succ)}/{int(total)}", "total_time": tsec}
+
+def display_table(rows):
+    tbl = Table(title="Benchmark Summary", show_lines=True, header_style="bold magenta")
+    tbl.add_column("Framework", style="cyan")
+    tbl.add_column("Server", style="white")
+    tbl.add_column("Delay", style="green")
+    tbl.add_column("#Reqs", justify="right")
+    tbl.add_column("Success", justify="right")
+    tbl.add_column("Total s", justify="right", style="yellow")
+    tbl.add_column("Avg s/req", justify="right", style="blue")
+    for r in rows:
+        avg = r["total_time"] / NUM_REQUESTS_EXPECTED
+        tbl.add_row(r["framework"], r["config"], r["delay"],
+                    str(NUM_REQUESTS_EXPECTED), r["successful"],
+                    f"{r['total_time']:.2f}", f"{avg:.3f}")
+    console.print(tbl)
+
+# --------------------------- scenarios ----------------------------------
+SCENARIOS = [
+    {
+        "name": "FastAPI",
+        "config": "Uvicorn, async",
+        "delay": "0.3 s asyncio.sleep",
+        "cmd": ["uvicorn", "app_fastapi.app:app", "--host", "0.0.0.0",
+                "--port", "8000", "--log-level", "warning"],
+        "url": FASTAPI_SERVER_URL,
+        "bench_arg": "fastapi",
+    },
+    {
+        "name": "Flask",
+        "config": "Single-threaded",
+        "delay": "0.3 s time.sleep",
+        "cmd": [PYTHON_EXE, "app_flask/flask_application.py"],
+        "url": FLASK_SERVER_URL,
+        "bench_arg": "flask",
+    }
+]
+
+# ----------------------------- main -------------------------------------
+if __name__ == "__main__":
+    console.print("[bold underline]Automated Web Framework Benchmark[/bold underline]\n")
+    results = []
+    root = os.getcwd()
+
+    for i, sc in enumerate(SCENARIOS, 1):
+        console.rule(f"[cyan]Scenario {i}/{len(SCENARIOS)} – {sc['name']}[/cyan]")
+        srv = start_server(sc["cmd"], sc["url"], sc["name"], cwd=root)
+        if not srv:
+            continue
+        try:
+            if sc["name"].lower() == "flask":
+                time.sleep(2)  # tiny grace period
+            line = run_benchmark_script(sc["bench_arg"])
+            parsed = parse_benchmark(line) if line else None
+            if parsed:
+                results.append({"framework": sc["name"], "config": sc["config"],
+                                "delay": sc["delay"], **parsed})
+        finally:
+            stop_server(srv, sc["name"])
+        console.print()
+
+    if results:
+        display_table(results)
+    console.print("\n[bold]Benchmark run finished.[/bold]") 
\ No newline at end of file