From 425e8fd34780bdff36667a9b3d3488841d41f842 Mon Sep 17 00:00:00 2001 From: elio-Wang Date: Thu, 16 Jul 2026 16:17:34 +0800 Subject: [PATCH] Add terminal screenshot workflow for docs Add a Pillow-based screenshot generator that renders Click help output as annotated terminal-style PNG images for use in the documentation. The renderer supports colored annotation boxes with labels that highlight different sections of CLI output (Usage, Options, Commands, etc.). All dependencies are pip-installable. Images are rendered at 2x scale for crisp display on high-DPI screens. A system monospace font is auto-detected on Linux, macOS, and Windows. Closes #3081. --- .python-version | 1 + docs/_static/cli-help-annotated.png | Bin 0 -> 95138 bytes docs/quickstart.md | 15 + docs/screenshots.py | 513 ++++++++++++++++++++++++++++ pyproject.toml | 1 + uv.lock | 96 ++++++ 6 files changed, 626 insertions(+) create mode 100644 .python-version create mode 100644 docs/_static/cli-help-annotated.png create mode 100644 docs/screenshots.py diff --git a/.python-version b/.python-version new file mode 100644 index 0000000000..455808f8e1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12.4 diff --git a/docs/_static/cli-help-annotated.png b/docs/_static/cli-help-annotated.png new file mode 100644 index 0000000000000000000000000000000000000000..a0e591fd1fff8436888186775bb0ac0b60d5f3a1 GIT binary patch literal 95138 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

3l5>|w&!OP

sU(gwqd0ol@o{J| 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�pDJENiRp3*FDE=^P4qvH4YCA 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

Cn%UU#{d@B$T0=x@vB_hYM2)vJF?l@I4zS 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 literal 0 HcmV?d00001 diff --git a/docs/quickstart.md b/docs/quickstart.md index c48260cfa5..4366dfc6c6 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -36,6 +36,21 @@ Some standalone examples of Click applications are packaged with Click. They are - [termui](https://github.com/pallets/click/tree/main/examples/termui) : A simple example that showcases terminal UI helpers provided by click. +## Understanding the Help Output + +Click automatically generates help pages for all commands. Each help page +contains several sections that describe the command's interface: + +```{image} _static/cli-help-annotated.png +:alt: Annotated Click help output showing Usage, Description, Options, and Commands sections +:width: 720px +:align: center +``` + +The **Usage** line shows how to invoke the command. The **Options** section +lists all available flags and their descriptions. The **Commands** section +lists the subcommands available in a group. + ## Basic Concepts - Creating a Command Click is based on declaring commands through decorators. Internally, there is a non-decorator interface for advanced use diff --git a/docs/screenshots.py b/docs/screenshots.py new file mode 100644 index 0000000000..97ea09dace --- /dev/null +++ b/docs/screenshots.py @@ -0,0 +1,513 @@ +"""Generate annotated terminal screenshots for Click documentation. + +Renders terminal text output as PNG images with colored annotation boxes, +using Pillow. All dependencies are pip-installable. Images are rendered at +2x scale for crisp display on high-DPI screens. + +Usage:: + + # Generate all screenshots (default output: docs/_static/) + python docs/screenshots.py + + # Specify output directory + python docs/screenshots.py --output /path/to/dir + + # List available screenshots + python docs/screenshots.py --list +""" + +from __future__ import annotations + +import argparse +from dataclasses import dataclass +from dataclasses import field +from pathlib import Path + +from PIL import Image +from PIL import ImageDraw +from PIL import ImageFont + +# --------------------------------------------------------------------------- +# Data types +# --------------------------------------------------------------------------- + + +@dataclass(frozen=True) +class Annotation: + """A labeled box highlighting a section of terminal output. + + The box spans from the line that starts with *start_text* to the line + immediately before the next section header (a non-indented, non-empty + line that appears after the start). + """ + + label: str + start_text: str + color: str + end_text: str | None = None + + +@dataclass(frozen=True) +class Screenshot: + """Specification for a single terminal screenshot.""" + + filename: str + text: str + title: str = "" + annotations: list[Annotation] = field(default_factory=list) + + +# --------------------------------------------------------------------------- +# Font detection +# --------------------------------------------------------------------------- + +_MONOSPACE_PATHS = [ + # Linux + "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", + "/usr/share/fonts/truetype/liberation/LiberationMono-Regular.ttf", + "/usr/share/fonts/TTF/DejaVuSansMono.ttf", + "/usr/share/fonts/dejavu/DejaVuSansMono.ttf", + "/usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf", + # macOS + "/System/Library/Frameworks/CoreFoundation.framework" + "/Resources/BundledFonts/Menlo.ttc", + "/Library/Fonts/Menlo.ttc", + # Windows + "C:/Windows/Fonts/consola.ttf", + "C:/Windows/Fonts/cour.ttf", +] + + +def _find_monospace_font(size: int) -> ImageFont.FreeTypeFont | ImageFont.ImageFont: + """Return a monospace font, searching common system paths.""" + for path in _MONOSPACE_PATHS: + try: + return ImageFont.truetype(path, size) + except OSError: + continue + # Pillow >= 10.1 accepts a *size* keyword for the built-in font. + try: + return ImageFont.load_default(size=size) + except TypeError: + return ImageFont.load_default() + + +# --------------------------------------------------------------------------- +# Renderer +# --------------------------------------------------------------------------- + +# Color palette +_BG = "#1e1e2e" +_TITLEBAR = "#313244" +_TITLEBAR_DOT_R = "#f38ba8" +_TITLEBAR_DOT_Y = "#f9e2af" +_TITLEBAR_DOT_G = "#a6e3a1" +_TEXT = "#cdd6f4" +_MUTED = "#6c7086" +_BORDER = "#45475a" + + +def _split_hex(color: str) -> tuple[int, int, int]: + c = color.lstrip("#") + return int(c[0:2], 16), int(c[2:4], 16), int(c[4:6], 16) + + +def render_screenshot( + text: str, + *, + title: str = "", + annotations: list[Annotation] | None = None, + width: int = 720, + scale: int = 2, + font_path: str | None = None, +) -> Image.Image: + """Render *text* as a terminal-style image. + + Parameters + ---------- + text : str + The terminal text to render (trailing newline is stripped). + title : str + Optional title shown in the title bar. + annotations : list[Annotation] | None + Colored boxes to draw over the text. + width : int + Logical (CSS) pixel width of the output image. + scale : int + Scale factor for high-DPI rendering. The actual image width is + ``width * scale``. + font_path : str | None + Explicit path to a TrueType font file. When *None* a system + monospace font is auto-detected. + """ + annotations = annotations or [] + + # -- font --------------------------------------------------------------- + font_size = 13 * scale + if font_path: + font = ImageFont.truetype(font_path, font_size) + else: + font = _find_monospace_font(font_size) + + # -- measure character cell --------------------------------------------- + tmp = Image.new("RGB", (1, 1)) + tmp_draw = ImageDraw.Draw(tmp) + char_w = tmp_draw.textlength("M", font=font) + ascent, descent = font.getmetrics() + line_h = ascent + descent + int(3 * scale) + + # -- layout constants --------------------------------------------------- + pad_x = 16 * scale + pad_y = 12 * scale + titlebar_h = 32 * scale + corner_r = 8 * scale + + lines = text.rstrip("\n").split("\n") + max_line_len = max((len(line) for line in lines), default=0) + text_area_w = max(int(max_line_len * char_w) + pad_x * 2, width * scale - pad_x * 2) + img_w = text_area_w + pad_x * 2 + text_area_h = len(lines) * line_h + pad_y * 2 + img_h = titlebar_h + text_area_h + pad_y * 2 + + # -- create image ------------------------------------------------------- + img = Image.new("RGB", (img_w, img_h), _split_hex(_BG)) + draw = ImageDraw.Draw(img) + + # rounded rectangle background + draw.rounded_rectangle( + [(0, 0), (img_w - 1, img_h - 1)], + radius=corner_r, + fill=_split_hex(_BG), + outline=_split_hex(_BORDER), + width=max(1, scale), + ) + + # title bar + draw.rounded_rectangle( + [(0, 0), (img_w - 1, titlebar_h)], + radius=corner_r, + fill=_split_hex(_TITLEBAR), + ) + # square off bottom corners of title bar + draw.rectangle( + [(0, titlebar_h - corner_r), (img_w - 1, titlebar_h)], + fill=_split_hex(_TITLEBAR), + ) + + # traffic-light dots + dot_y = titlebar_h // 2 + dot_r = int(5 * scale) + dot_spacing = int(18 * scale) + dot_start_x = pad_x + dot_r + for cx, color in [ + (dot_start_x, _TITLEBAR_DOT_R), + (dot_start_x + dot_spacing, _TITLEBAR_DOT_Y), + (dot_start_x + dot_spacing * 2, _TITLEBAR_DOT_G), + ]: + draw.ellipse( + [(cx - dot_r, dot_y - dot_r), (cx + dot_r, dot_y + dot_r)], + fill=_split_hex(color), + ) + + # title text + if title: + title_font_size = int(12 * scale) + try: + title_font = _find_monospace_font(title_font_size) + except Exception: + title_font = font + bbox = draw.textbbox((0, 0), title, font=title_font) + tw = bbox[2] - bbox[0] + draw.text( + ((img_w - tw) / 2, (titlebar_h - (bbox[3] - bbox[1])) / 2), + title, + fill=_split_hex(_MUTED), + font=title_font, + ) + + # -- annotation geometry ------------------------------------------------ + text_origin_x = pad_x + text_origin_y = titlebar_h + pad_y + + # Build line-index lookup for each annotation. + annotation_rects: list[tuple[int, int, int, int, tuple[int, int, int], str]] = [] + for ann in annotations: + start_idx: int | None = None + end_idx: int | None = None + for i, line in enumerate(lines): + if start_idx is None and line.startswith(ann.start_text): + start_idx = i + elif start_idx is not None: + if ann.end_text is not None: + if line.startswith(ann.end_text): + end_idx = i + break + else: + # Section ends at the next non-indented, non-empty line. + if line and not line[0].isspace(): + end_idx = i + break + if start_idx is not None and end_idx is None: + end_idx = len(lines) + if start_idx is not None: + box_x = text_origin_x - int(4 * scale) + box_y = text_origin_y + start_idx * line_h - int(2 * scale) + box_w = text_area_w - pad_x + int(8 * scale) + box_h = (end_idx - start_idx) * line_h + int(4 * scale) + annotation_rects.append( + (box_x, box_y, box_w, box_h, _split_hex(ann.color), ann.label) + ) + + # Draw annotation boxes (behind text). + for bx, by, bw, bh, bcolor, blabel in annotation_rects: + overlay = Image.new("RGBA", img.size, (0, 0, 0, 0)) + overlay_draw = ImageDraw.Draw(overlay) + overlay_draw.rounded_rectangle( + [(bx, by), (bx + bw, by + bh)], + radius=int(4 * scale), + fill=(*bcolor, 40), + outline=(*bcolor, 180), + width=max(1, 2 * scale), + ) + img = Image.alpha_composite(img.convert("RGBA"), overlay).convert("RGB") + draw = ImageDraw.Draw(img) + + # label pill + label_font_size = int(10 * scale) + try: + label_font = _find_monospace_font(label_font_size) + except Exception: + label_font = font + lbbox = draw.textbbox((0, 0), blabel, font=label_font) + lw = lbbox[2] - lbbox[0] + lh = lbbox[3] - lbbox[1] + pill_pad_x = int(6 * scale) + pill_pad_y = int(2 * scale) + pill_x = bx + int(8 * scale) + pill_y = by - lh - pill_pad_y * 2 - int(2 * scale) + if pill_y < titlebar_h: + pill_y = by + bh + int(4 * scale) + draw.rounded_rectangle( + [ + (pill_x - pill_pad_x, pill_y - pill_pad_y), + (pill_x + lw + pill_pad_x, pill_y + lh + pill_pad_y), + ], + radius=int(3 * scale), + fill=(*bcolor, 220), + ) + draw.text((pill_x, pill_y), blabel, fill=(255, 255, 255), font=label_font) + + # -- render text -------------------------------------------------------- + for i, line in enumerate(lines): + y = text_origin_y + i * line_h + draw.text((text_origin_x, y), line, fill=_split_hex(_TEXT), font=font) + + return img + + +# --------------------------------------------------------------------------- +# Example Click applications (used to generate screenshots) +# --------------------------------------------------------------------------- + + +def _build_repo_cli(): + """Build a repo-style CLI matching examples/repo/repo.py.""" + import click + + @click.group() + @click.option( + "--repo-home", + envvar="REPO_HOME", + default=".repo", + metavar="PATH", + help="Changes the repository folder location.", + ) + @click.option( + "--config", + nargs=2, + multiple=True, + metavar="KEY VALUE", + help="Overrides a config key/value pair.", + ) + @click.option("--verbose", "-v", is_flag=True, help="Enables verbose mode.") + @click.version_option("1.0") + @click.pass_context + def cli(ctx, repo_home, config, verbose): + """Repo is a command line tool that showcases how to build complex + command line interfaces with Click. + + This tool is supposed to look like a distributed version control + system to show how something like this can be structured. + """ + pass # pragma: no cover + + @cli.command() + @click.argument("src") + @click.argument("dest", required=False) + @click.option( + "--shallow/--deep", + default=False, + help="Makes a checkout shallow or deep. Deep by default.", + ) + @click.option( + "--rev", "-r", default="HEAD", help="Clone a specific revision instead of HEAD." + ) + def clone(src, dest, shallow, rev): + """Clones a repository. + + This will clone the repository at SRC into the folder DEST. If DEST + is not provided this will automatically use the last path component + of SRC and create that folder. + """ + + @cli.command() + @click.option( + "--message", + "-m", + multiple=True, + help="The commit message. If provided multiple times each" + " argument gets converted into a new line.", + ) + @click.argument("files", nargs=-1, type=click.Path()) + def commit(message, files): + """Commits outstanding changes. + + Commit changes to the given files into the repository. + """ + + @cli.command(short_help="Copies files.") + @click.option( + "--force", is_flag=True, help="forcibly copy over an existing managed file" + ) + @click.argument("src", nargs=-1, type=click.Path()) + @click.argument("dst", type=click.Path()) + def copy(force, src, dst): + """Copies one or multiple files to a new location.""" + + @cli.command() + @click.confirmation_option() + def delete(): + """Deletes a repository. + + This will throw away the current repository. + """ + + @cli.command() + @click.option("--username", prompt=True, help="The developer's shown username.") + @click.option("--email", prompt="E-Mail", help="The developer's email address") + @click.password_option(help="The login password.") + def setuser(username, email, password): + """Sets the user credentials. + + This will override the current user config. + """ + + return cli + + +def _get_help_text(cli, args: list[str] | None = None) -> str: + """Invoke a Click command with --help and return the output.""" + from click.testing import CliRunner + + runner = CliRunner() + result = runner.invoke(cli, args=args or ["--help"]) + return result.output + + +# --------------------------------------------------------------------------- +# Screenshot definitions +# --------------------------------------------------------------------------- + + +def _make_screenshots() -> list[Screenshot]: + """Build the list of screenshots to generate.""" + cli = _build_repo_cli() + help_text = _get_help_text(cli) + + return [ + Screenshot( + filename="cli-help-annotated.png", + text=help_text, + title="repo --help", + annotations=[ + Annotation( + label="Usage", + start_text="Usage:", + color="#89b4fa", + end_text="Repo is", + ), + Annotation( + label="Description", + start_text="Repo is", + color="#a6e3a1", + end_text="Options:", + ), + Annotation( + label="Options", + start_text="Options:", + color="#f9e2af", + end_text="Commands:", + ), + Annotation( + label="Commands", + start_text="Commands:", + color="#f38ba8", + ), + ], + ), + ] + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + + +def main(argv: list[str] | None = None) -> None: + parser = argparse.ArgumentParser( + description="Generate annotated terminal screenshots for Click docs.", + ) + parser.add_argument( + "-o", + "--output", + type=Path, + default=Path(__file__).parent / "_static", + help="Output directory (default: docs/_static/)", + ) + parser.add_argument( + "--list", + action="store_true", + help="List available screenshots and exit.", + ) + parser.add_argument( + "--font", + type=str, + default=None, + help="Path to a TrueType font file.", + ) + args = parser.parse_args(argv) + + screenshots = _make_screenshots() + + if args.list: + for s in screenshots: + ann_count = len(s.annotations) + print(f" {s.filename} ({ann_count} annotation(s))") + return + + args.output.mkdir(parents=True, exist_ok=True) + + for s in screenshots: + img = render_screenshot( + s.text, + title=s.title, + annotations=s.annotations, + font_path=args.font, + ) + out_path = args.output / s.filename + img.save(str(out_path)) + print(f" {out_path} ({img.width}x{img.height})") + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml index 0156d5e8ac..440440b281 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ dev = [ "tox-uv", ] docs = [ + "pillow", "myst-parser", "pallets-sphinx-themes", "sphinx", diff --git a/uv.lock b/uv.lock index 46ae78248a..f9022a16f5 100644 --- a/uv.lock +++ b/uv.lock @@ -186,6 +186,7 @@ docs = [ { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "myst-parser", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "pallets-sphinx-themes" }, + { name = "pillow" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, @@ -228,6 +229,7 @@ dev = [ docs = [ { name = "myst-parser" }, { name = "pallets-sphinx-themes" }, + { name = "pillow" }, { name = "sphinx" }, { name = "sphinx-tabs" }, { name = "sphinxcontrib-log-cabinet" }, @@ -796,6 +798,100 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/c2/669d88644cddb1485bd9534e63e8cf476c8e51cb3c3a1297677023505c0e/pillow-12.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a", size = 5392418, upload-time = "2026-07-01T11:53:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ba/3762f376a2948e3036488d773a146e0ae6ecc2ca03ac20e2615bd0b2ba02/pillow-12.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7", size = 4785287, upload-time = "2026-07-01T11:53:29.761Z" }, + { url = "https://files.pythonhosted.org/packages/07/50/b5d688cc9c52d4482f3d5bcab6ce20bc2a74a85d2343841c907444a3be2c/pillow-12.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f", size = 6253754, upload-time = "2026-07-01T11:53:32.298Z" }, + { url = "https://files.pythonhosted.org/packages/4e/89/36f4cd76cf4baf05c50ababb976249153f18c959171c7f6ba09a6f217260/pillow-12.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec", size = 6925605, upload-time = "2026-07-01T11:53:34.487Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c0/4de58cf6633b9e3a6061ef4be6fb91fc3c90b812ece886f531e3c523d777/pillow-12.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468", size = 6327788, upload-time = "2026-07-01T11:53:36.433Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/14d53682a19550dbbaf3b598f807d5457646c510805a44c7d7891cd1cd1a/pillow-12.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed", size = 7036288, upload-time = "2026-07-01T11:53:38.712Z" }, + { url = "https://files.pythonhosted.org/packages/38/1d/36279e3c77efe034e4cc2b0393ee74ffdb5a62391dacbf9b916154f5f0b8/pillow-12.3.0-cp310-cp310-win32.whl", hash = "sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1", size = 6472396, upload-time = "2026-07-01T11:53:40.781Z" }, + { url = "https://files.pythonhosted.org/packages/48/7c/8fa0039574c476d7c6fa57dd7c32a130436877c6ec1e5ce1cc8ec44878c1/pillow-12.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb", size = 7226887, upload-time = "2026-07-01T11:53:42.764Z" }, + { url = "https://files.pythonhosted.org/packages/fa/17/e324be141d173c1c919428066c3259f21c1b8982e564e01a4a81e96dbdcf/pillow-12.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f", size = 2568039, upload-time = "2026-07-01T11:53:45.372Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c8/0a78b0e02d7ac54bc03e5321c9220da52f0c2ea83b21f7c40e7f3169c502/pillow-12.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756", size = 5392415, upload-time = "2026-07-01T11:53:47.162Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5b/a02d30018abd97ced9f5a6c63d28597694a00d066516b9c1c6de45859fc9/pillow-12.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6", size = 4785266, upload-time = "2026-07-01T11:53:49.079Z" }, + { url = "https://files.pythonhosted.org/packages/c8/98/766667a4be768150a202836acd9fad19c06824ca86c4286d3cf6b274964e/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd", size = 6263814, upload-time = "2026-07-01T11:53:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2d/ede717bc1144f63886c21fd349bb95860b0d1a21149ff16f2bb362b612b6/pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd", size = 6934408, upload-time = "2026-07-01T11:53:53.487Z" }, + { url = "https://files.pythonhosted.org/packages/a3/48/9c58b685e69d49c31af6c8eb9012055fab7e665785165c84796e2c73ce72/pillow-12.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c", size = 6337160, upload-time = "2026-07-01T11:53:55.457Z" }, + { url = "https://files.pythonhosted.org/packages/ff/fa/dc2a5c0ba6df93f67c31d34b808b7ce440b40cdbf96f0b81cde1d1e6fa93/pillow-12.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5", size = 7045172, upload-time = "2026-07-01T11:53:57.736Z" }, + { url = "https://files.pythonhosted.org/packages/86/a5/444817a4d4c4c2417df00513086ca196f388d8f9ef40c2e4ccd1ad1af54b/pillow-12.3.0-cp311-cp311-win32.whl", hash = "sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b", size = 6472232, upload-time = "2026-07-01T11:53:59.767Z" }, + { url = "https://files.pythonhosted.org/packages/63/c6/4bad1b18d132a50b27e1365e1ab163616f7a5bb56d330f66f9d1d9d4f9d4/pillow-12.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a", size = 7233653, upload-time = "2026-07-01T11:54:02.066Z" }, + { url = "https://files.pythonhosted.org/packages/fd/16/00f91ab7760dc842f5aad55217e80fc4a7067a0604535249bc8a2d6d9870/pillow-12.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26", size = 2568195, upload-time = "2026-07-01T11:54:04.622Z" }, + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" }, + { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" }, + { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" }, + { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" }, + { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" }, + { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" }, + { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" }, + { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" }, + { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" }, + { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" }, + { url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" }, + { url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" }, + { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" }, + { url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" }, + { url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" }, + { url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" }, + { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" }, + { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" }, + { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" }, + { url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" }, + { url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" }, + { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" }, + { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" }, + { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" }, + { url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" }, + { url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" }, + { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" }, + { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" }, + { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" }, + { url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" }, + { url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" }, + { url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" }, + { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" }, + { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" }, + { url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" }, + { url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" }, + { url = "https://files.pythonhosted.org/packages/75/18/2e8b40223153ccbc60df07f9e8928dc0c76202aa4e55ae9f53962b6510d6/pillow-12.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468", size = 5302510, upload-time = "2026-07-01T11:56:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/46/3e/51fabf59d5ab801ceab709453d3ab6b180083496579549de4c45ced6528a/pillow-12.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94", size = 4736058, upload-time = "2026-07-01T11:56:28.041Z" }, + { url = "https://files.pythonhosted.org/packages/bf/20/22fe9384b7949e25fb1293bcfc84fb82590ff4ea6b37c95b24d26d793d86/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e", size = 5237776, upload-time = "2026-07-01T11:56:30.263Z" }, + { url = "https://files.pythonhosted.org/packages/08/14/f6ba68107680ffa74b39985f3f30884e41318fbc4250caa423c79b4788bb/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3", size = 5860358, upload-time = "2026-07-01T11:56:32.68Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0169bc772ec491108b62f644f8ecf1fe5d8ae5ebafde2ee2142210166903/pillow-12.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a", size = 7231786, upload-time = "2026-07-01T11:56:35.046Z" }, +] + [[package]] name = "platformdirs" version = "4.9.4"